diff --git a/.vsts-dotnet-ci.yml b/.vsts-dotnet-ci.yml new file mode 100644 index 0000000000..c2e0e2c0d4 --- /dev/null +++ b/.vsts-dotnet-ci.yml @@ -0,0 +1,15 @@ +phases: +- template: /build/ci/phase-template.yml + parameters: + name: Linux + buildScript: ./build.sh + dockerImage: microsoft/dotnet-buildtools-prereqs:centos-7-b46d863-20180719033416 + +- template: /build/ci/phase-template.yml + parameters: + name: Windows_NT + buildScript: build.cmd + queue: + name: Hosted VS2017 + demands: + - agent.os -equals Windows_NT diff --git a/Directory.Build.props b/Directory.Build.props index a37097204f..73144201c7 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,6 +14,7 @@ https://api.nuget.org/v3/index.json; + https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; @@ -21,6 +22,7 @@ $(MSBuildThisFileDirectory) $(RepoRoot)src/ + $(RepoRoot)pkg/ $(RepoRoot)bin/ diff --git a/Directory.Build.targets b/Directory.Build.targets index 1ab549e60a..5e6446add9 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -5,5 +5,33 @@ Text="The tools directory [$(ToolsDir)] does not exist. Please run build in the root of the repo to ensure the tools are installed before attempting to build an individual project." /> + + + + lib + .dll + .so + .dylib + + + + + $(NativeOutputPath)$(LibPrefix)%(NativeAssemblyReference.Identity)$(LibExtension) + + + + + + + + + \ No newline at end of file diff --git a/Microsoft.ML.sln b/Microsoft.ML.sln index 3529c0e5b7..58e24041f1 100644 --- a/Microsoft.ML.sln +++ b/Microsoft.ML.sln @@ -5,6 +5,9 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Core", "src\Microsoft.ML.Core\Microsoft.ML.Core.csproj", "{A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{09EADF06-BE25-4228-AB53-95AE3E15B530}" + ProjectSection(SolutionItems) = preProject + src\Source.ruleset = src\Source.ruleset + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{AED9C836-31E3-4F3F-8ABC-929555D3F3C4}" EndProject @@ -18,7 +21,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.InferenceTesti EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Data", "src\Microsoft.ML.Data\Microsoft.ML.Data.csproj", "{AD92D96B-0E96-4F22-8DCE-892E13B1F282}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.UniversalModelFormat", "src\Microsoft.ML.UniversalModelFormat\Microsoft.ML.UniversalModelFormat.csproj", "{65D0603E-B96C-4DFC-BDD1-705891B88C18}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Onnx", "src\Microsoft.ML.Onnx\Microsoft.ML.Onnx.csproj", "{65D0603E-B96C-4DFC-BDD1-705891B88C18}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.StandardLearners", "src\Microsoft.ML.StandardLearners\Microsoft.ML.StandardLearners.csproj", "{707BB22C-7E5F-497A-8C2F-74578F675705}" EndProject @@ -34,16 +37,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Api", "src\Mic EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Tests", "test\Microsoft.ML.Tests\Microsoft.ML.Tests.csproj", "{64BC22D3-1E76-41EF-94D8-C79E471FF2DD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data", "data", "{FDA2FD2C-A708-43AC-A941-4D941B0853BF}" - ProjectSection(SolutionItems) = preProject - test\data\sentiment_data.tsv = test\data\sentiment_data.tsv - test\data\sentiment_test.tsv = test\data\sentiment_test.tsv - EndProjectSection -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.TestFramework", "test\Microsoft.ML.TestFramework\Microsoft.ML.TestFramework.csproj", "{B5989C06-4FFA-46C1-9D85-9366B34AB0A2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.InternalStreams", "src\Microsoft.ML.InternalStreams\Microsoft.ML.InternalStreams.csproj", "{C4F7938F-7109-43C8-92A5-9BE47C7FF7D9}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Predictor.Tests", "test\Microsoft.ML.Predictor.Tests\Microsoft.ML.Predictor.Tests.csproj", "{6B047E09-39C9-4583-96F3-685D84CA4117}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.ResultProcessor", "src\Microsoft.ML.ResultProcessor\Microsoft.ML.ResultProcessor.csproj", "{3769FCC3-9AFF-4C37-97E9-6854324681DF}" @@ -54,36 +49,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Parquet", "src EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Sweeper", "src\Microsoft.ML.Sweeper\Microsoft.ML.Sweeper.csproj", "{55C8122D-79EA-48AB-85D0-EB551FC1C427}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{E20AF96D-3F66-4065-8A89-BEE479D74536}" - ProjectSection(SolutionItems) = preProject - docs\README.md = docs\README.md - docs\release-notes\0.1\release-0.1.md = docs\release-notes\0.1\release-0.1.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project-docs", "project-docs", "{52794B40-AB8A-41AF-9EF7-799C80D6E0BC}" - ProjectSection(SolutionItems) = preProject - docs\project-docs\contributing.md = docs\project-docs\contributing.md - docs\project-docs\developer-guide.md = docs\project-docs\developer-guide.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{76F579E4-B9D2-4A0C-A511-EEFA4B2B829F}" - ProjectSection(SolutionItems) = preProject - CONTRIBUTING.md = CONTRIBUTING.md - README.md = README.md - ROADMAP.md = ROADMAP.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "building", "building", "{DB751004-5D49-4B88-B78F-29CA9887087D}" - ProjectSection(SolutionItems) = preProject - docs\building\unix-instructions.md = docs\building\unix-instructions.md - docs\building\windows-instructions.md = docs\building\windows-instructions.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "specs", "specs", "{2DEFC784-F2B5-44EA-ABBB-0DCF3E689DAC}" - ProjectSection(SolutionItems) = preProject - docs\specs\mvp.md = docs\specs\mvp.md - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pkg", "pkg", "{D3D38B03-B557-484D-8348-8BADEE4DF592}" ProjectSection(SolutionItems) = preProject pkg\Directory.Build.props = pkg\Directory.Build.props @@ -106,108 +71,264 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Maml", "src\Mi EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Console", "src\Microsoft.ML.Console\Microsoft.ML.Console.csproj", "{362A98CF-FBF7-4EBB-A11B-990BBF845B15}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{487213C9-E8A9-4F94-85D7-28A05DBBFE3A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "netstandard2.0", "netstandard2.0", "{9252A8EB-ABFB-440C-AB4D-1D562753CE0F}" + ProjectSection(SolutionItems) = preProject + pkg\Microsoft.ML\build\netstandard2.0\Microsoft.ML.props = pkg\Microsoft.ML\build\netstandard2.0\Microsoft.ML.props + pkg\Microsoft.ML\build\netstandard2.0\Microsoft.ML.targets = pkg\Microsoft.ML\build\netstandard2.0\Microsoft.ML.targets + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Sweeper.Tests", "test\Microsoft.ML.Sweeper.Tests\Microsoft.ML.Sweeper.Tests.csproj", "{3DEB504D-7A07-48CE-91A2-8047461CB3D4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.LightGBM", "src\Microsoft.ML.LightGBM\Microsoft.ML.LightGBM.csproj", "{001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Ensemble", "src\Microsoft.ML.Ensemble\Microsoft.ML.Ensemble.csproj", "{DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.ML.CpuMath", "Microsoft.ML.CpuMath", "{BF66A305-DF10-47E4-8D81-42049B149D2B}" + ProjectSection(SolutionItems) = preProject + pkg\Microsoft.ML.CpuMath\Microsoft.ML.CpuMath.nupkgproj = pkg\Microsoft.ML.CpuMath\Microsoft.ML.CpuMath.nupkgproj + pkg\Microsoft.ML.CpuMath\Microsoft.ML.CpuMath.symbols.nupkgproj = pkg\Microsoft.ML.CpuMath\Microsoft.ML.CpuMath.symbols.nupkgproj + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools-local", "tools-local", "{7F13E156-3EBA-4021-84A5-CD56BA72F99E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.CodeAnalyzer", "tools-local\Microsoft.ML.CodeAnalyzer\Microsoft.ML.CodeAnalyzer.csproj", "{B4E55B2D-2A92-46E7-B72F-E76D6FD83440}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.CodeAnalyzer.Tests", "test\Microsoft.ML.CodeAnalyzer.Tests\Microsoft.ML.CodeAnalyzer.Tests.csproj", "{3E4ABF07-7970-4BE6-B45B-A13D3C397545}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug-Intrinsics|Any CPU = Debug-Intrinsics|Any CPU Release|Any CPU = Release|Any CPU + Release-Intrinsics|Any CPU = Release-Intrinsics|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Release|Any CPU.ActiveCfg = Release|Any CPU {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Release|Any CPU.Build.0 = Release|Any CPU + {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {A6CA6CC6-5D7C-4D7F-A0F5-35E14B383B0A}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Release|Any CPU.Build.0 = Release|Any CPU + {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {EC743D1D-7691-43B7-B9B0-5F2F7018A8F6}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug-Intrinsics|Any CPU + {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Debug-Intrinsics|Any CPU.Build.0 = Debug-Intrinsics|Any CPU {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Release|Any CPU.ActiveCfg = Release|Any CPU {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Release|Any CPU.Build.0 = Release|Any CPU + {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Release-Intrinsics|Any CPU.ActiveCfg = Release-Intrinsics|Any CPU + {46F2F967-C23F-4076-858D-33F7DA9BD2DA}.Release-Intrinsics|Any CPU.Build.0 = Release-Intrinsics|Any CPU {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Release|Any CPU.Build.0 = Release|Any CPU + {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {2D7391C9-8254-4B8F-BF26-FADAF8F02F44}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Release|Any CPU.ActiveCfg = Release|Any CPU {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Release|Any CPU.Build.0 = Release|Any CPU + {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {E278EC99-E6EE-49FE-92E6-0A309A478D98}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Release|Any CPU.ActiveCfg = Release|Any CPU {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Release|Any CPU.Build.0 = Release|Any CPU + {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {AD92D96B-0E96-4F22-8DCE-892E13B1F282}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Release|Any CPU.ActiveCfg = Release|Any CPU {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Release|Any CPU.Build.0 = Release|Any CPU + {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {65D0603E-B96C-4DFC-BDD1-705891B88C18}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {707BB22C-7E5F-497A-8C2F-74578F675705}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {707BB22C-7E5F-497A-8C2F-74578F675705}.Debug|Any CPU.Build.0 = Debug|Any CPU + {707BB22C-7E5F-497A-8C2F-74578F675705}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {707BB22C-7E5F-497A-8C2F-74578F675705}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {707BB22C-7E5F-497A-8C2F-74578F675705}.Release|Any CPU.ActiveCfg = Release|Any CPU {707BB22C-7E5F-497A-8C2F-74578F675705}.Release|Any CPU.Build.0 = Release|Any CPU + {707BB22C-7E5F-497A-8C2F-74578F675705}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {707BB22C-7E5F-497A-8C2F-74578F675705}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Release|Any CPU.ActiveCfg = Release|Any CPU {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Release|Any CPU.Build.0 = Release|Any CPU + {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {2911A286-ECA4-4730-97A9-DA1FEE2DED97}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Release|Any CPU.ActiveCfg = Release|Any CPU {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Release|Any CPU.Build.0 = Release|Any CPU + {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {7288C084-11C0-43BE-AC7F-45DCFEAEEBF6}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Release|Any CPU.ActiveCfg = Release|Any CPU {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Release|Any CPU.Build.0 = Release|Any CPU + {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {F1CAE3AB-4F86-4BC0-BBA8-C4A58E7E8A4A}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Release|Any CPU.ActiveCfg = Release|Any CPU {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Release|Any CPU.Build.0 = Release|Any CPU + {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {58E06735-1129-4DD5-86E0-6BBFF049AAD9}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Release|Any CPU.ActiveCfg = Release|Any CPU {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Release|Any CPU.Build.0 = Release|Any CPU + {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {2F636A2C-062C-49F4-85F3-60DCADAB6A43}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Release|Any CPU.Build.0 = Release|Any CPU + {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {64BC22D3-1E76-41EF-94D8-C79E471FF2DD}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Release|Any CPU.Build.0 = Release|Any CPU - {C4F7938F-7109-43C8-92A5-9BE47C7FF7D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4F7938F-7109-43C8-92A5-9BE47C7FF7D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4F7938F-7109-43C8-92A5-9BE47C7FF7D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4F7938F-7109-43C8-92A5-9BE47C7FF7D9}.Release|Any CPU.Build.0 = Release|Any CPU + {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {B5989C06-4FFA-46C1-9D85-9366B34AB0A2}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {6B047E09-39C9-4583-96F3-685D84CA4117}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6B047E09-39C9-4583-96F3-685D84CA4117}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B047E09-39C9-4583-96F3-685D84CA4117}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {6B047E09-39C9-4583-96F3-685D84CA4117}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {6B047E09-39C9-4583-96F3-685D84CA4117}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B047E09-39C9-4583-96F3-685D84CA4117}.Release|Any CPU.Build.0 = Release|Any CPU + {6B047E09-39C9-4583-96F3-685D84CA4117}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {6B047E09-39C9-4583-96F3-685D84CA4117}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Release|Any CPU.Build.0 = Release|Any CPU + {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {3769FCC3-9AFF-4C37-97E9-6854324681DF}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Release|Any CPU.ActiveCfg = Release|Any CPU {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Release|Any CPU.Build.0 = Release|Any CPU + {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {B7B593C5-FB8C-4ADA-A638-5B53B47D087E}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {16BB1454-2108-40E5-B3A6-594654005303}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {16BB1454-2108-40E5-B3A6-594654005303}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16BB1454-2108-40E5-B3A6-594654005303}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {16BB1454-2108-40E5-B3A6-594654005303}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {16BB1454-2108-40E5-B3A6-594654005303}.Release|Any CPU.ActiveCfg = Release|Any CPU {16BB1454-2108-40E5-B3A6-594654005303}.Release|Any CPU.Build.0 = Release|Any CPU + {16BB1454-2108-40E5-B3A6-594654005303}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {16BB1454-2108-40E5-B3A6-594654005303}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Release|Any CPU.ActiveCfg = Release|Any CPU {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Release|Any CPU.Build.0 = Release|Any CPU + {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {55C8122D-79EA-48AB-85D0-EB551FC1C427}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Release|Any CPU.ActiveCfg = Release|Any CPU {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Release|Any CPU.Build.0 = Release|Any CPU + {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Release|Any CPU.ActiveCfg = Release|Any CPU {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Release|Any CPU.Build.0 = Release|Any CPU + {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {64F40A0D-D4C2-4AA7-8470-E9CC437827E4}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Release|Any CPU.ActiveCfg = Release|Any CPU {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Release|Any CPU.Build.0 = Release|Any CPU + {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {362A98CF-FBF7-4EBB-A11B-990BBF845B15}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Release|Any CPU.Build.0 = Release|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {3DEB504D-7A07-48CE-91A2-8047461CB3D4}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Release|Any CPU.ActiveCfg = Release|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Release|Any CPU.Build.0 = Release|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Release|Any CPU.Build.0 = Release|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Release|Any CPU.Build.0 = Release|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Debug-Intrinsics|Any CPU.Build.0 = Debug|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Release|Any CPU.Build.0 = Release|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Release-Intrinsics|Any CPU.ActiveCfg = Release|Any CPU + {3E4ABF07-7970-4BE6-B45B-A13D3C397545}.Release-Intrinsics|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -227,22 +348,25 @@ Global {58E06735-1129-4DD5-86E0-6BBFF049AAD9} = {09EADF06-BE25-4228-AB53-95AE3E15B530} {2F636A2C-062C-49F4-85F3-60DCADAB6A43} = {09EADF06-BE25-4228-AB53-95AE3E15B530} {64BC22D3-1E76-41EF-94D8-C79E471FF2DD} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4} - {FDA2FD2C-A708-43AC-A941-4D941B0853BF} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4} {B5989C06-4FFA-46C1-9D85-9366B34AB0A2} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4} - {C4F7938F-7109-43C8-92A5-9BE47C7FF7D9} = {09EADF06-BE25-4228-AB53-95AE3E15B530} {6B047E09-39C9-4583-96F3-685D84CA4117} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4} {3769FCC3-9AFF-4C37-97E9-6854324681DF} = {09EADF06-BE25-4228-AB53-95AE3E15B530} {B7B593C5-FB8C-4ADA-A638-5B53B47D087E} = {09EADF06-BE25-4228-AB53-95AE3E15B530} {16BB1454-2108-40E5-B3A6-594654005303} = {09EADF06-BE25-4228-AB53-95AE3E15B530} {55C8122D-79EA-48AB-85D0-EB551FC1C427} = {09EADF06-BE25-4228-AB53-95AE3E15B530} - {52794B40-AB8A-41AF-9EF7-799C80D6E0BC} = {E20AF96D-3F66-4065-8A89-BEE479D74536} - {DB751004-5D49-4B88-B78F-29CA9887087D} = {E20AF96D-3F66-4065-8A89-BEE479D74536} - {2DEFC784-F2B5-44EA-ABBB-0DCF3E689DAC} = {E20AF96D-3F66-4065-8A89-BEE479D74536} {DEC8F776-49F7-4D87-836C-FE4DC057D08C} = {D3D38B03-B557-484D-8348-8BADEE4DF592} {6C95FC87-F5F2-4EEF-BB97-567F2F5DD141} = {D3D38B03-B557-484D-8348-8BADEE4DF592} {7A9DB75F-2CA5-4184-9EF5-1F17EB39483F} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4} {64F40A0D-D4C2-4AA7-8470-E9CC437827E4} = {09EADF06-BE25-4228-AB53-95AE3E15B530} {362A98CF-FBF7-4EBB-A11B-990BBF845B15} = {09EADF06-BE25-4228-AB53-95AE3E15B530} + {487213C9-E8A9-4F94-85D7-28A05DBBFE3A} = {DEC8F776-49F7-4D87-836C-FE4DC057D08C} + {9252A8EB-ABFB-440C-AB4D-1D562753CE0F} = {487213C9-E8A9-4F94-85D7-28A05DBBFE3A} + {3DEB504D-7A07-48CE-91A2-8047461CB3D4} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4} + {001F3B4E-FBE4-4001-AFD2-A6A989CD1C25} = {09EADF06-BE25-4228-AB53-95AE3E15B530} + {DCF46B79-1FDB-4DBA-A263-D3D64E3AAA27} = {09EADF06-BE25-4228-AB53-95AE3E15B530} + {BF66A305-DF10-47E4-8D81-42049B149D2B} = {D3D38B03-B557-484D-8348-8BADEE4DF592} + {B4E55B2D-2A92-46E7-B72F-E76D6FD83440} = {7F13E156-3EBA-4021-84A5-CD56BA72F99E} + {3E4ABF07-7970-4BE6-B45B-A13D3C397545} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {41165AF1-35BB-4832-A189-73060F82B01D} diff --git a/README.md b/README.md index 4da710cba4..9ccd06c165 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Along with these ML capabilities this first release of ML.NET also brings the fi ML.NET runs on Windows, Linux, and macOS - any platform where 64 bit [.NET Core](https://github.com/dotnet/core) or later is available. -The current release is 0.2. Check out the [release notes](docs/release-notes/0.2/release-0.2.md). +The current release is 0.3. Check out the [release notes](docs/release-notes/0.3/release-0.3.md). First ensure you have installed [.NET Core 2.0](https://www.microsoft.com/net/learn/get-started) or later. ML.NET also works on the .NET Framework. Note that ML.NET currently must run in a 64 bit process. @@ -44,9 +44,9 @@ To build ML.NET from source please visit our [developers guide](docs/project-doc | | x64 Debug | x64 Release | |:---|----------------:|------------------:| -|**Linux**|[![x64-debug](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/linux_debug/badge/icon)](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/linux_debug/lastCompletedBuild)|[![x64-release](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/linux_release/badge/icon)](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/linux_release/lastCompletedBuild)| +|**Linux**|[![x64-debug](https://dotnet.visualstudio.com/public/_apis/build/status/104?branch=master)](https://dotnet.visualstudio.com/DotNet-Public/_build/latest?definitionId=104&branch=master)|[![x64-release](https://dotnet.visualstudio.com/public/_apis/build/status/104?branch=master)](https://dotnet.visualstudio.com/DotNet-Public/_build/latest?definitionId=104&branch=master)| |**macOS**|[![x64-debug](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/osx10.13_debug/badge/icon)](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/osx10.13_debug/lastCompletedBuild)|[![x64-release](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/osx10.13_release/badge/icon)](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/osx10.13_release/lastCompletedBuild)| -|**Windows**|[![x64-debug](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/windows_nt_debug/badge/icon)](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/windows_nt_debug/lastCompletedBuild)|[![x64-release](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/windows_nt_release/badge/icon)](https://ci2.dot.net/job/dotnet_machinelearning/job/master/job/windows_nt_release/lastCompletedBuild)| +|**Windows**|[![x64-debug](https://dotnet.visualstudio.com/public/_apis/build/status/104?branch=master)](https://dotnet.visualstudio.com/DotNet-Public/_build/latest?definitionId=104&branch=master)|[![x64-release](https://dotnet.visualstudio.com/public/_apis/build/status/104?branch=master)](https://dotnet.visualstudio.com/DotNet-Public/_build/latest?definitionId=104&branch=master)| ## Contributing @@ -84,6 +84,9 @@ SentimentPrediction prediction = model.Predict(data); Console.WriteLine("prediction: " + prediction.Sentiment); ``` +## Samples + +We have a [repo of samples](https://github.com/dotnet/machinelearning-samples) that you can look at. ## License diff --git a/build/BranchInfo.props b/build/BranchInfo.props index 00dbd8e318..193aff7d35 100644 --- a/build/BranchInfo.props +++ b/build/BranchInfo.props @@ -1,7 +1,7 @@ 0 - 3 + 4 0 preview diff --git a/build/Dependencies.props b/build/Dependencies.props index 5a528bcaa9..5325011f05 100644 --- a/build/Dependencies.props +++ b/build/Dependencies.props @@ -6,7 +6,7 @@ 4.8.0 4.4.0 4.3.0 - 4.4.0 1.0.0-beta-62824-02 + 2.1.2.2 diff --git a/build/ci/phase-template.yml b/build/ci/phase-template.yml new file mode 100644 index 0000000000..bd326afb69 --- /dev/null +++ b/build/ci/phase-template.yml @@ -0,0 +1,37 @@ +parameters: + name: '' + buildScript: '' + dockerImage: '' + queue: {} + +phases: + - phase: ${{ parameters.name }} + variables: + _buildScript: ${{ parameters.buildScript }} + _phaseName: ${{ parameters.name }} + # if dockerImage is not equal to '' then run under docker container + ${{ if ne(parameters.dockerImage, '') }}: + _PREVIEW_VSTS_DOCKER_IMAGE: ${{ parameters.dockerImage }} + queue: + parallel: 2 + matrix: + Build_Debug: + _configuration: Debug + Build_Release: + _configuration: Release + ${{ insert }}: ${{ parameters.queue }} + steps: + - script: $(_buildScript) -$(_configuration) -runtests + displayName: Build and Test + - task: PublishTestResults@2 + displayName: Publish Test Results + condition: succeededOrFailed() + inputs: + testRunner: 'vSTest' + searchFolder: '$(System.DefaultWorkingDirectory)/bin' + testResultsFiles: '**/*.trx' + testRunTitle: Machinelearning_Tests_$(_phaseName)_$(_configuration)_$(Build.BuildNumber) + configuration: $(_configuration) + mergeTestResults: true + - script: $(_buildScript) -buildPackages + displayName: Build Packages diff --git a/docs/building/unix-instructions.md b/docs/building/unix-instructions.md index 0110ae6b8f..855c6b470f 100644 --- a/docs/building/unix-instructions.md +++ b/docs/building/unix-instructions.md @@ -42,9 +42,11 @@ macOS 10.12 or higher is needed to build dotnet/machinelearning. On macOS a few components are needed which are not provided by a default developer setup: * cmake 3.10.3 +* gcc * All the requirements necessary to run .NET Core 2.0 applications. To view macOS prerequisites click [here](https://docs.microsoft.com/en-us/dotnet/core/macos-prerequisites?tabs=netcore2x). -One way of obtaining CMake is via [Homebrew](http://brew.sh): +One way of obtaining CMake and gcc is via [Homebrew](http://brew.sh): ```sh $ brew install cmake +$ brew install gcc ``` diff --git a/docs/code/EntryPoints.md b/docs/code/EntryPoints.md new file mode 100644 index 0000000000..dbcc4e6bc9 --- /dev/null +++ b/docs/code/EntryPoints.md @@ -0,0 +1,231 @@ +# Entry Points And Helper Classes + +## Overview + +Entry points are a way to interface with ML.NET components, by specifying an execution graph of connected inputs and outputs of those components. +Both the manifest describing available components and their inputs/outputs, and an "experiment" graph description, are expressed in JSON. +The recommended way of interacting with ML.NET through other, non-.NET programming languages, is by composing, and exchanging pipelines or experiment graphs. + +Through the documentation, we also refer to entry points as 'entry points nodes', and that is because they are the nodes of the graph representing the experiment. +The graph 'variables', the various values of the experiment graph JSON properties, serve to describe the relationship between the entry point nodes. +The 'variables' are therefore the edges of the DAG (Directed Acyclic Graph). + +All of ML.NET entry points are described by their manifest. The manifest is another JSON object that documents and describes the structure of an entry points. +Manifests are referenced to understand what an entry point does, and how it should be constructed, in a graph. + +This document briefly describes the structure of the entry points, the structure of an entry point manifest, and mentions the ML.NET classes that help construct an entry point graph. + +## EntryPoint manifest - the definition of an entry point + +The components manifest is build by scanning the ML.NET assemblies through reflection and searching for types having the: `SignatureEntryPointModule` signature in their `LoadableClass` assembly attribute definition. +An example of an entry point manifest object, specifically for the `ColumnTypeConverter` transform, is: + +```javascript +{ + "Name": "Transforms.ColumnTypeConverter", + "Desc": "Converts a column to a different type, using standard conversions.", + "FriendlyName": "Convert Transform", + "ShortName": "Convert", + "Inputs": [ + { "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "ResultType", + "Type": { + "Kind": "Enum", + "Values": [ "I1","I2","U2","I4","U4","I8","U8","R4","Num","R8","TX","Text","TXT","BL","Bool","TimeSpan","TS","DT","DateTime","DZ","DateTimeZone","UG","U16" ] + }, + "Desc": "The result type", + "Aliases": [ "type" ], + "Required": false, + "SortOrder": 150, + "IsNullable": true, + "Default": null + }, + { "Name": "Range", + "Type": "String", + "Desc": "For a key column, this defines the range of values", + "Aliases": [ "key" ], + "Required": false, + "SortOrder": 150, + "IsNullable": false, + "Default": null + }, + { "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ "name" ], + "Required": false, + "SortOrder": 150, + "IsNullable": false, + "Default": null + }, + { "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ "src" ], + "Required": false, + "SortOrder": 150, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:type:src)", + "Aliases": [ "col" ], + "Required": true, + "SortOrder": 1, + "IsNullable": false + }, + { "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 2, + "IsNullable": false + }, + { "Name": "ResultType", + "Type": { + "Kind": "Enum", + "Values": [ "I1","I2","U2","I4","U4","I8","U8","R4","Num","R8","TX","Text","TXT","BL","Bool","TimeSpan","TS","DT","DateTime","DZ","DateTimeZone","UG","U16" ] + }, + "Desc": "The result type", + "Aliases": [ "type" ], + "Required": false, + "SortOrder": 2, + "IsNullable": true, + "Default": null + }, + { "Name": "Range", + "Type": "String", + "Desc": "For a key column, this defines the range of values", + "Aliases": [ "key" ], + "Required": false, + "SortOrder": 150, + "IsNullable": false, + "Default": null + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": ["ITransformInput" ], + "OutputKind": [ "ITransformOutput" ] +} +``` + +The respective entry point, constructed based on this manifest would be: + +```javascript + { + "Name": "Transforms.ColumnTypeConverter", + "Inputs": { + "Column": [{ + "Name": "Features", + "Source": "Features" + }], + "Data": "$data0", + "ResultType": "R4" + }, + "Outputs": { + "OutputData": "$Convert_Output", + "Model": "$Convert_TransformModel" + } + } +``` + +## `EntryPointGraph` + +This class encapsulates the list of nodes (`EntryPointNode`) and edges +(`EntryPointVariable` inside a `RunContext`) of the graph. + +## `EntryPointNode` + +This class represents a node in the graph, and wraps an entry point call. It +has methods for creating and running entry points. It also has a reference to +the `RunContext` to allow it to get and set values from `EntryPointVariable`s. + +To express the inputs that are set through variables, a set of dictionaries +are used. The `InputBindingMap` maps an input parameter name to a list of +`ParameterBinding`s. The `InputMap` maps a `ParameterBinding` to a +`VariableBinding`. For example, if the JSON looks like this: + +```javascript +'foo': '$bar' +``` + +the `InputBindingMap` will have one entry that maps the string "foo" to a list +that has only one element, a `SimpleParameterBinding` with the name "foo" and +the `InputMap` will map the `SimpleParameterBinding` to a +`SimpleVariableBinding` with the name "bar". For a more complicated example, +let's say we have this JSON: + +```javascript +'foo': [ '$bar[3]', '$baz'] +``` + +the `InputBindingMap` will have one entry that maps the string "foo" to a list +that has two elements, an `ArrayIndexParameterBinding` with the name "foo" and +index 0 and another one with index 1. The `InputMap` will map the first +`ArrayIndexParameterBinding` to an `ArrayIndexVariableBinding` with name "bar" +and index 3 and the second `ArrayIndexParameterBinding` to a +`SimpleVariableBinding` with the name "baz". + +For outputs, a node assumes that an output is mapped to a variable, so the +`OutputMap` is a simple dictionary from string to string. + +## `EntryPointVariable` + +This class represents an edge in the entry point graph. It has a name, a type +and a value. Variables can be simple, arrays and/or dictionaries. Currently, +only data views, file handles, predictor models and transform models are +allowed as element types for a variable. + +## `RunContext` + +This class is just a container for all the variables in a graph. + +## `VariableBinding` and Derived Classes + +The abstract base class represents a "pointer to a (part of a) variable". It +is used in conjunction with `ParameterBinding`s to specify inputs to an entry +point node. The `SimpleVariableBinding` is a pointer to an entire variable, +the `ArrayIndexVariableBinding` is a pointer to a specific index in an array +variable, and the `DictionaryKeyVariableBinding` is a pointer to a specific +key in a dictionary variable. + +## `ParameterBinding` and Derived Classes + +The abstract base class represents a "pointer to a (part of a) parameter". It +parallels the `VariableBinding` hierarchy and it is used to specify the inputs +to an entry point node. The `SimpleParameterBinding` is a pointer to a +non-array, non-dictionary parameter, the `ArrayIndexParameterBinding` is a +pointer to a specific index of an array parameter and the +`DictionaryKeyParameterBinding` is a pointer to a specific key of a dictionary +parameter. + +## How to create an entry point for an existing ML.NET component + +The steps to take, to create an entry point for an existing ML.NET component, are: +1. Add the `SignatureEntryPointModule` signature to the `LoadableClass` assembly attribute. +2. Create a public static method, that: + a. Takes as input, among others, an object representing the arguments of the component you want to expose. + b. Initializes and run the components, returning one of the nested classes of `Microsoft.ML.Runtime.EntryPoints.CommonOutputs` + c. Is annotated with the `TlcModule.EntryPoint` attribute + +Based on the type of entry point being created, there are further conventions on the name of the method, for example, the Trainers entry points are typically called: 'TrainMultiClass', 'TrainBinary' etc, based on the task. +Look at [OnlineGradientDescent](../../src/Microsoft.ML.StandardLearners/Standard/Online/OnlineGradientDescent.cs) for an example of a component and its entry point. \ No newline at end of file diff --git a/docs/code/GraphRunner.md b/docs/code/GraphRunner.md new file mode 100644 index 0000000000..b7fddc9476 --- /dev/null +++ b/docs/code/GraphRunner.md @@ -0,0 +1,128 @@ +# Entry Point JSON Graph format + +The entry point graph in ML.NET is an array of _nodes_. More information about the definition of entry points and classes that help construct entry point graphs +can be found in the [EntryPoint.md document](./EntryPoints.md). + +Each node is an object with the following fields: + +- _name_: string. Required. Name of the entry point. +- _inputs_: object. Optional. Specifies non-default inputs to the entry point. +Note that if the entry point has required inputs (which is very common), the _inputs_ field is required. +- _outputs_: object. Optional. Specifies the variables that will hold the node's outputs. + +## Input and output types +The following types are supported in JSON graphs: + +- `string`. Represented as a JSON string, maps to a C# string. +- `float`. Represented as a JSON float, maps to a C# float or double. +- `bool`. Represented as a JSON bool, maps to a C# bool. +- `enum`. Represented as a JSON string, maps to a C# enum. The allowed values are those of the C# enum (they are also listed in the manifest). +- `int`. Represented as a JSON integer, maps to a C# int or long. +- `array` of the above. Represented as a JSON array, maps to a C# array. +- `dictionary`. Currently not implemented. Represented as a JSON object, maps to a C# `Dictionary`. +- `component`. Represented as a JSON object with 2 fields: _name_:string and _settings_:object. + +## Variables +The following input/output types can not be represented as a JSON value: +- `IDataView` +- `IFileHandle` +- `ITransformModel` +- `IPredictorModel` + +These must be passed as _variables_. The variable is represented as a JSON string that begins with `$`. +Note the following rules: + +- A variable can appear in the _outputs_ only once per graph. That is, the variable can be 'assigned' only once. +- If the variable is present in _inputs_ of one node and in the _outputs_ of another node, this signifies a graph 'edge'. +The same variable can participate in many edges. +- If the variable is present only in _inputs_, but never in _outputs_, it is a _graph input_. All graph inputs must be provided before +a graph can be run. +- The variable has a type, which is the type of inputs (and, optionally, output) that it appears in. If the type of the variable is +ambiguous, ML.NET throws an exception. +- Circular references. The experiment graph is expected to be a DAG. If the circular dependency is detected, ML.NET throws an exception. +_Currently, this is done lazily: if we couldn't ever run a node because it's waiting for inputs, we throw._ + +### Variables for arrays and dictionaries. +It is allowed to define variables for arrays and dictionaries, as long as the item types are valid variable types (the four types listed above). +They are treated the same way as regular 'scalar' variables. + +If we want to reference an item of the collection, we can use the `[]` syntax: +- `$var[5]` denotes 5th element of an array variable. +- `$var[foo]` and `$var['foo']` both denote the element with key 'foo' of a dictionary variable. +_This is not yet implemented._ + +Conversely, if we want to build a collection (array or dictionary) of variables, we can do it using JSON arrays and objects: +- `["$v1", "$v2", "$v3"]` denotes an array containing 3 variables. +- `{"foo": "$v1", "bar": "$v2"}` denotes a collection containing 2 key-value pairs. +_This is also not yet implemented._ + +## Example of a JSON entry point manifest object, and the respective entry point graph node +Let's consider the following manifest snippet, describing an entry point _'CVSplit.Split'_: + +```javascript + { + "name": "CVSplit.Split", + "desc": "Split the dataset into the specified number of cross-validation folds (train and test sets)", + "inputs": [ + { + "name": "Data", + "type": "DataView", + "desc": "Input dataset", + "required": true + }, + { + "name": "NumFolds", + "type": "Int", + "desc": "Number of folds to split into", + "required": false, + "default": 2 + }, + { + "name": "StratificationColumn", + "type": "String", + "desc": "Stratification column", + "aliases": [ + "strat" + ], + "required": false, + "default": null + } + ], + "outputs": [ + { + "name": "TrainData", + "type": { + "kind": "Array", + "itemType": "DataView" + }, + "desc": "Training data (one dataset per fold)" + }, + { + "name": "TestData", + "type": { + "kind": "Array", + "itemType": "DataView" + }, + "desc": "Testing data (one dataset per fold)" + } + ] + } +``` + +As we can see, the entry point has 3 inputs (one of them required), and 2 outputs. +The following is a correct graph containing call to this entry point: + +```javascript +{ + "nodes": [ + { + "name": "CVSplit.Split", + "inputs": { + "Data": "$data1" + }, + "outputs": { + "TrainData": "$cv" + } + }] +} +``` \ No newline at end of file diff --git a/docs/code/SchemaComprehension.md b/docs/code/SchemaComprehension.md new file mode 100644 index 0000000000..37238e0c0c --- /dev/null +++ b/docs/code/SchemaComprehension.md @@ -0,0 +1,222 @@ +# Schema comprehension in ML.NET + +This document describes in detail the under-the-hood mechanism that ML.NET uses to automate the creation of `IDataView` schema, with the goal to make it as convenient to the end user as possible, while not incurring extra computational costs. + +For a better understanding of `IDataView` principles and type system please refer to: +* [IDataView Design Principles](IDataViewDesignPrinciples.md) +* [IDataView Type System](IDataViewTypeSystem.md) + +## Introduction + +Every dataset in ML.NET is represented as an `IDataView`, which is, for the purposes of this document, a collection of rows that share the same columns. The set of columns, their names, types and other metadata is known as the *schema* of the `IDataView`, and it's represented as an `ISchema` object. + +In this document, we will be using the terms *data view* and `IDataView` interchangeably, same for *schema* and `ISchema`. + +Before any new data enters ML.NET, the user needs to somehow define how the schema of the data will look like. +To do this, the following questions need to be answered: +- What are the column names? +- What are their types? +- What other metadata is associated with the columns? + +These items above are very similar to the definition of fields in a C# class: names and types of columns correspond to names and types of fields, and metadata can correspond to field attributes. +Because of this similarity, ML.NET offers a common convenient mechanism for creating a schema: it is done via defining a C# class. + +For example, the below class definition can be used to define a data view with 5 float columns: +```C# +public class IrisData +{ + public float Label; + public float SepalLength; + public float SepalWidth; + public float PetalLength; + public float PetalWidth; +} +``` + +## Using schema comprehension to make a data view and to read a data view + +The first obvious benefit of schema comprehension is that we can now create `IDataView`s out of in-memory enumerables of user-defined 'data types', without having to define the schema. +It works in the other direction too: you can take an `IDataView`, and read it as an `IEnumerable` of user-defined 'data type' (which will fail if the user-provided schema does not match the real schema). + +Let's see how we can create a new `IDataView` out of an in-memory array, run some operations on it, and then read it back into the array. + +```C# +public class IrisData +{ + public float Label; + public float SepalLength; + public float SepalWidth; + public float PetalLength; + public float PetalWidth; +} + +public class IrisVectorData +{ + public float Label; + public float[] Features; +} + +static void Main(string[] args) +{ + // Here's a data array that we want to work on. + var dataArray = new[] { + new IrisData{Label=1, PetalLength=1, SepalLength=1, PetalWidth=1, SepalWidth=1}, + new IrisData{Label=0, PetalLength=2, SepalLength=2, PetalWidth=2, SepalWidth=2} + }; + + // Create the ML.NET environment. + var env = new Microsoft.ML.Runtime.Data.TlcEnvironment(); + + // Create the data view. + // This method will use the definition of IrisData to understand what columns there are in the + // data view. + var dv = env.CreateDataView(dataArray); + + // Now let's do something to the data view. For example, concatenate all four non-label columns + // into 'Features' column. + dv = new Microsoft.ML.Runtime.Data.ConcatTransform(env, dv, "Features", + "SepalLength", "SepalWidth", "PetalLength", "PetalWidth"); + + // Read the data into an another array, this time we read the 'Features' and 'Label' columns + // of the data, and ignore the rest. + // This method will use the definition of IrisVectorData to understand which columns and of which types + // are expected to be present in the input data. + var arr = dv.AsEnumerable(env, reuseRowObject: false) + .ToArray(); +} +``` +After this code runs, `arr` will contain two `IrisVectorData` objects, each having `Features` filled with the actual values of the features (the 4 concatenated columns). + +### Streaming data views + +What if the original data doesn't support seeking, like if it's some form of `IEnumerable` instead of `IList`? Well, we can simply use another helper function: +```C# +var streamingDv = env.CreateStreamingDataView(dataEnumerable); +``` +The only subtle difference is, the resulting `streamingDv` will not support shuffling (a property that's useful to some ML application). + +### AsCursorable and reuseRowObject parameter + +When you read a data view as `AsEnumerable`, ML.NET will create and populate an object per row. If you do not need multiple row objects to exist in memory (for example, you are writing them to disk one by one, as you scan through the `IEnumerable`), you may want to set `reuseRowObject` to `true`. This will make ML.NET create *only one row object for the entire data view* when you enumerate it, and just re-populate the values every time. + +Obviously, in the example above this would lead to incorrect behavior, as the `arr` variable will hold two copies of the same `IrisVectorData` object. Please consider carefully whether you want to reuse the row object, because it is more efficient, but can lead to hard to find issues. + +Sometimes, we don't even want to *populate* the row object per row. For example, we only want to see every 100th row of the data, so there's no need to populate the remaining 99% row objects. In this case, you can use `AsCursorable` method: + +```C# +var cursorable = dv.AsCursorable(env); +// You can create as many simultaneous cursors as you like, they are independent. +using (var cursor = cursorable.GetCursor()) +{ + // We are now in charge of creating the row object. + var myRow = new IrisVectorData(); + while (cursor.MoveNext()) + { + if (cursor.Position % 100 == 99) + { + // Populate the values of the row object. + cursor.FillValues(myRow); + // Do something to the row. + } + } +} +``` +Please note that **cursors are not thread-safe**: they have mutable state inside, and they are meant to be used by one thread. If you want to read the data in parallel, use multiple cursors. + +## PredictionEngine and PredictorModel + +ML.NET's `PredictionEngine` is attempting to turn a sequence of data transforms (maybe capped by a predictor, but not necessarily) into a 'black box' that takes strongly typed inputs and returns strongly typed outputs. The name is a little misleading: the `PredictionEngine` object doesn't require a predictor to be present in the pipeline, it can be just a sequence of transforms like in the below example: + +```C# +var engine = env.CreatePredictionEngine(dv); +var output = engine.Predict(new IrisData { Label = 1, PetalLength = 1, SepalLength = 1, PetalWidth = 1, SepalWidth = 1 }); +``` +It is important to note that the `PredictionEngine` actually *validates* that the 'pipeline' conforms to the input and output schema requirements when it is created. + +The same can be said about the `PredictorModel`. This is a somewhat more restricted version of `PredictionEngine` that is created by `LearningPipeline.Train`. + +Please note that **`PredictionEngine` and `PredictorModel` are not thread-safe**: they hold an internal cursor object, and therefore cannot be used in a re-entrant fashion. +If you ever see the error message that says: `An attempt was made to keep iterating after the pipe has been reset`, it most likely means that ML.NET has detected a race condition on the `PredictionEngine`. + +## Type system mapping + +`IDataView` [type system](IDataViewTypeSystem.md) differs slightly from the C# type system, so a 1-1 mapping between column types and C# types is not always feasible. +Below are the most notable examples of the differences: + +* `IDataView` vector columns often have a fixed (and known) size. The C# array type best corresponds to a 'variable size' vector: the one that can have different number of slots on every row. You can use `[VectorType(N)]` attribute to an array field to specify that the column is a vector of fixed size N. This is often necessary: most ML components don't work with variable-size vectors, they require fixed-size ones. +* `IDataView`'s [key types](IDataViewTypeSystem.md#key-types) don't have a natural underlying C# type either. To declare a key-type column, you need to make your field an `uint`, and decorate it with `[KeyType]` to denote that the field is a key, and not a regular unsigned integer. + +### Full list of type mappings +The below table illustrates what C# types are mapped to what `IDataView` types: + +| `IDataView` type | C# type | C# type with extra conversion | +| ---------------- | ----------- | ------------------------------ | +| `I1` | `DvInt1` | `sbyte`, `sbyte?` | +| `I2` | `DvInt2` | `short`, `short?` | +| `I4` | `DvInt4` | `int`, `int?` | +| `I8` | `DvInt8` | `long`, `long?` | +| `U1` | `byte` | `byte?` | +| `U2` | `ushort` | `ushort?` | +| `U4` | `uint` | `uint?` | +| `U8` | `ulong` | `ulong?` | +| `UG` | `UInt128` | | +| `R4` | `float` | `float?` | +| `R8` | `double` | `double?` | +| `TX` | `DvText`, `string` | | +| `BL` | `DvBool` | `bool`, `bool?` | +| `TS` | `DvTimeSpan` | | +| `DT` | `DvDateTime` | | +| `DZ` | `DvDateTimeZone` | | +| Variable-size vector | `VBuffer` | `T[]`, and the vector is always dense | +| Fixed-size vector | `VBuffer` with `[VectorType(N)]` | `T[]` with `VectorType(N)`, and the vector is always dense | +| Key type | `uint` with `[KeyType]` | | + +### Additional attributes to affect type mapping + +There are two more attributes that can affect the way ML.NET conducts schema comprehension: +* `[ColumnName]` lets you choose a different name for the `IDataView` column. By default it is the same as field name. + * This is a way to create or read back an `IDataView` column with a name containing 'invalid' characters (like whitespace). +* `[NoColumn]` is an attribute that denotes that the below field should not be mapped to a column. + +### Using SchemaDefinition for run-time type mapping hints + +As you can see from the table and notes above, certain `IDataView` types can only be denoted with an additional field attribute. If the type parameters are not known at compile time (like the size of the fixed-size vector), this is tricky. + +You can use a `SchemaDefinition` object to re-map a type to an `IDataView` schema programmatically. It gives you the same powers as the attributes, but at runtime. +Please see the below example. +```C# +// Vector size is only known at runtime. +int numberOfFeatures = 4; + +// Create the default schema definition. +var schemaDef = SchemaDefinition.Create(typeof(IrisVectorData)); + +// Specify the right vector size. +schemaDef["Features"].ColumnType = new VectorType(NumberType.R4, numberOfFeatures); + +// Create a data view. +var dataView = env.CreateDataView(arr, schemaDef); + +// Create a prediction engine. You can add custom input and output schema definitions there. +var predictionEngine = env.CreatePredictionEngine(dv, outputSchemaDefinition: schemaDef); +``` + +In addition to the above, you can use `SchemaDefinition` to add per-column metadata: +```C# +// Add column metadata. +schemaDef["Label"].AddMetadata(MetadataUtils.Kinds.HasMissingValues, false); +``` + +## Limitations + +Certain things are not possible to do at all using the schema comprehensions, but are possible via the native `IDataView` programmatic interface. +It was our design decision to not allow these scenarios, thus simplifying the other, more common scenarios. + +Here is the list of things that are only possible via the low-level interface: +* Creating or reading a data view, where even column *types* are not known at compile time (so you cannot create a C# class to define the schema) + * This can happen if you write a general-purpose machine learning tool that can ingest different kinds of datasets. +* Reading a subset of columns that differs from one row to another: the cursor always populates the entire row object. +* Reading column metadata from the data view. +* Accessing the 'hidden' data view columns by index. + * Hidden columns are those that have the same name as other columns and a smaller index. They are not accessible by name. +* Creating 'cursor sets': this is a feature that lets you iterate over data in multiple parallel threads by splitting the data between multiple 'sibling' cursors. diff --git a/docs/release-notes/0.3/release-0.3.md b/docs/release-notes/0.3/release-0.3.md new file mode 100644 index 0000000000..6b88d37f58 --- /dev/null +++ b/docs/release-notes/0.3/release-0.3.md @@ -0,0 +1,114 @@ +# ML.NET 0.3 Release Notes + +Today we are releasing ML.NET 0.3. This release focuses on adding components +to ML.NET from the internal codebase (such as Factorization Machines, +LightGBM, Ensembles, and LightLDA), enabling export to the ONNX model format, +and bug fixes. + +### Installation + +ML.NET supports Windows, MacOS, and Linux. See [supported OS versions of .NET +Core +2.0](https://github.com/dotnet/core/blob/master/release-notes/2.0/2.0-supported-os.md) +for more details. + +You can install ML.NET NuGet from the CLI using: +``` +dotnet add package Microsoft.ML +``` + +From package manager: +``` +Install-Package Microsoft.ML +``` + +### Release Notes + +Below are some of the highlights from this release. + +* Added Field-Aware Factorization Machines (FFM) as a learner for binary + classification (#383) + + * FFM is useful for various large sparse datasets, especially in areas + such as recommendations and click prediction. It has been used to win + various click prediction competitions such as the [Criteo Display + Advertising Challenge on + Kaggle](https://www.kaggle.com/c/criteo-display-ad-challenge). You can + learn more about the winning solution + [here](https://www.csie.ntu.edu.tw/~r01922136/kaggle-2014-criteo.pdf). + * FFM is a streaming learner so it does not require the entire dataset to + fit in memory. + * You can learn more about FFM + [here](http://www.csie.ntu.edu.tw/~cjlin/papers/ffm.pdf) and some of the + speedup approaches that are used in ML.NET + [here](https://github.com/wschin/fast-ffm/blob/master/fast-ffm.pdf). + +* Added [LightGBM](https://github.com/Microsoft/LightGBM) as a learner for + binary classification, multiclass classification, and regression (#392) + + * LightGBM is a tree based gradient boosting machine. It is under the + umbrella of the [DMTK](http://github.com/microsoft/dmtk) project at + Microsoft. + * The LightGBM repository shows various [comparison + experiments](https://github.com/Microsoft/LightGBM/blob/6488f319f243f7ff679a8e388a33e758c5802303/docs/Experiments.rst#comparison-experiment) + that show good accuracy and speed, so it is a great learner to try out. + It has also been used in winning solutions in various [ML + challenges](https://github.com/Microsoft/LightGBM/blob/a6e878e2fc6e7f545921cbe337cc511fbd1f500d/examples/README.md). + * This addition wraps LightGBM and exposes it in ML.NET. + * Note that LightGBM can also be used for ranking, but the ranking + evaluator is not yet exposed in ML.NET. + +* Added Ensemble learners for binary classification, multiclass + classification, and regression (#379) + + * [Ensemble learners](https://en.wikipedia.org/wiki/Ensemble_learning) + enable using multiple learners in one model. As an example, the Ensemble + learner could train both `FastTree` and `AveragedPerceptron` and average + their predictions to get the final prediction. + * Combining multiple models of similar statistical performance may lead to + better performance than each model separately. + +* Added LightLDA transform for topic modeling (#377) + + * LightLDA is an implementation of [Latent Dirichlet + Allocation](https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation) + which infers topical structure from text data. + * The implementation of LightLDA in ML.NET is based on [this + paper](https://arxiv.org/abs/1412.1576). There is a distributed + implementation of LightLDA + [here](https://github.com/Microsoft/lightlda). + +* Added One-Versus-All (OVA) learner for multiclass classification (#363) + + * [OVA](https://en.wikipedia.org/wiki/Multiclass_classification#One-vs.-rest) + (sometimes known as One-Versus-Rest) is an approach to using binary + classifiers in multiclass classification problems. + * While some binary classification learners in ML.NET natively support + multiclass classification (e.g. Logistic Regression), there are others + that do not (e.g. Averaged Perceptron). OVA enables using the latter + group for multiclass classification as well. + +* Enabled export of ML.NET models to the [ONNX](https://onnx.ai/) format + (#248) + + * ONNX is a common format for representing deep learning models (also + supporting certain other types of models) which enables developers to + move models between different ML toolkits. + * ONNX models can be used in [Windows + ML](https://docs.microsoft.com/en-us/windows/uwp/machine-learning/overview) + which enables evaluating models on Windows 10 devices and taking + advantage of capabilities like hardware acceleration. + * Currently, only a subset of ML.NET components can be used in a model + that is converted to ONNX. + +Additional issues closed in this milestone can be found +[here](https://github.com/dotnet/machinelearning/milestone/2?closed=1). + +### Acknowledgements + +Shoutout to [pkulikov](https://github.com/pkulikov), +[veikkoeeva](https://github.com/veikkoeeva), +[ross-p-smith](https://github.com/ross-p-smith), +[jwood803](https://github.com/jwood803), +[Nepomuceno](https://github.com/Nepomuceno), and the ML.NET team for their +contributions as part of this release! diff --git a/netci.groovy b/netci.groovy index eb78c766a5..b955bf669f 100644 --- a/netci.groovy +++ b/netci.groovy @@ -6,46 +6,22 @@ import jobs.generation.Utilities; def project = GithubProject def branch = GithubBranchName -['Windows_NT', 'Linux', 'OSX10.13'].each { os -> +['OSX10.13'].each { os -> ['Debug', 'Release'].each { config -> [true, false].each { isPR -> // Calculate job name def jobName = os.toLowerCase() + '_' + config.toLowerCase() - def buildFile = ''; def machineAffinity = 'latest-or-auto' - // Calculate the build command - if (os == 'Windows_NT') { - buildFile = ".\\build.cmd" - } else { - buildFile = "./build.sh" - } - - def buildCommand = buildFile + " -$config -runtests" - def packCommand = buildFile + " -buildPackages" - def newJob = job(Utilities.getFullJobName(project, jobName, isPR)) { steps { - if (os == 'Windows_NT') { - batchFile(buildCommand) - batchFile(packCommand) - } - else { - // Shell - shell(buildCommand) - shell(packCommand) - } + shell("./build.sh -$config -runtests") + shell("./build.sh -buildPackages") } } - def osImageName = os - if (os == 'Linux') { - // Trigger a portable Linux build that runs on RHEL7.2 - osImageName = "RHEL7.2" - } - - Utilities.setMachineAffinity(newJob, osImageName, machineAffinity) + Utilities.setMachineAffinity(newJob, os, machineAffinity) Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}") if (isPR) { diff --git a/pkg/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.nupkgproj b/pkg/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.nupkgproj new file mode 100644 index 0000000000..918729d99d --- /dev/null +++ b/pkg/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.nupkgproj @@ -0,0 +1,14 @@ + + + + netstandard2.0 + netstandard2.0;netcoreapp3.0 + Microsoft.ML.CpuMath contains optimized math routines for ML.NET. + + + + + + + + diff --git a/pkg/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.symbols.nupkgproj b/pkg/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.symbols.nupkgproj new file mode 100644 index 0000000000..360980c2c3 --- /dev/null +++ b/pkg/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.symbols.nupkgproj @@ -0,0 +1,5 @@ + + + + + diff --git a/pkg/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.nupkgproj b/pkg/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.nupkgproj new file mode 100644 index 0000000000..8cddd1719e --- /dev/null +++ b/pkg/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.nupkgproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + ML.NET component for LightGBM + + + + + + + + diff --git a/pkg/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.symbols.nupkgproj b/pkg/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.symbols.nupkgproj new file mode 100644 index 0000000000..d7710ff60a --- /dev/null +++ b/pkg/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.symbols.nupkgproj @@ -0,0 +1,5 @@ + + + + + diff --git a/pkg/Microsoft.ML.Onnx/Microsoft.ML.Onnx.nupkgproj b/pkg/Microsoft.ML.Onnx/Microsoft.ML.Onnx.nupkgproj new file mode 100644 index 0000000000..bcc86939e2 --- /dev/null +++ b/pkg/Microsoft.ML.Onnx/Microsoft.ML.Onnx.nupkgproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + ML.NET component for exporting ONNX Models + + + + + + + + diff --git a/pkg/Microsoft.ML.Onnx/Microsoft.ML.Onnx.symbols.nupkgproj b/pkg/Microsoft.ML.Onnx/Microsoft.ML.Onnx.symbols.nupkgproj new file mode 100644 index 0000000000..07807bb54b --- /dev/null +++ b/pkg/Microsoft.ML.Onnx/Microsoft.ML.Onnx.symbols.nupkgproj @@ -0,0 +1,5 @@ + + + + + diff --git a/pkg/Microsoft.ML/Microsoft.ML.nupkgproj b/pkg/Microsoft.ML/Microsoft.ML.nupkgproj index b0cedd6ad4..fc409ae21f 100644 --- a/pkg/Microsoft.ML/Microsoft.ML.nupkgproj +++ b/pkg/Microsoft.ML/Microsoft.ML.nupkgproj @@ -6,12 +6,12 @@ - + + - diff --git a/pkg/Microsoft.ML/build/Microsoft.ML.props b/pkg/Microsoft.ML/build/netstandard2.0/Microsoft.ML.props similarity index 87% rename from pkg/Microsoft.ML/build/Microsoft.ML.props rename to pkg/Microsoft.ML/build/netstandard2.0/Microsoft.ML.props index 3970c4d664..fa15d15eb5 100644 --- a/pkg/Microsoft.ML/build/Microsoft.ML.props +++ b/pkg/Microsoft.ML/build/netstandard2.0/Microsoft.ML.props @@ -7,7 +7,7 @@ - PreserveNewest false diff --git a/pkg/Microsoft.ML/build/Microsoft.ML.targets b/pkg/Microsoft.ML/build/netstandard2.0/Microsoft.ML.targets similarity index 100% rename from pkg/Microsoft.ML/build/Microsoft.ML.targets rename to pkg/Microsoft.ML/build/netstandard2.0/Microsoft.ML.targets diff --git a/pkg/_._ b/pkg/_._ new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index cedfa39442..113da3575a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -11,7 +11,18 @@ $(NoWarn);1591 $(WarningsNotAsErrors);1591 - + $(MSBuildThisFileDirectory)\Source.ruleset + + + false + Analyzer + + + + diff --git a/src/Microsoft.ML.Api/ApiUtils.cs b/src/Microsoft.ML.Api/ApiUtils.cs index 5b5936b5a8..8b8cb5871b 100644 --- a/src/Microsoft.ML.Api/ApiUtils.cs +++ b/src/Microsoft.ML.Api/ApiUtils.cs @@ -6,7 +6,6 @@ using System.Reflection; using System.Reflection.Emit; using Microsoft.ML.Runtime.Data; -using Microsoft.ML.Runtime.Internal.Utilities; namespace Microsoft.ML.Runtime.Api { @@ -19,11 +18,12 @@ internal static class ApiUtils private static OpCode GetAssignmentOpCode(Type t) { // REVIEW: This should be a Dictionary based solution. - // DvTexts, strings, arrays, and VBuffers. + // DvTypes, strings, arrays, all nullable types, VBuffers and UInt128. if (t == typeof(DvInt8) || t == typeof(DvInt4) || t == typeof(DvInt2) || t == typeof(DvInt1) || - t == typeof(DvBool) || t==typeof(bool?) || t == typeof(DvText) || t == typeof(string) || t.IsArray || - (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(VBuffer<>)) || t == typeof(DvDateTime) || - t == typeof(DvDateTimeZone) || t == typeof(DvTimeSpan) || t == typeof(UInt128)) + t == typeof(DvBool) || t == typeof(DvText) || t == typeof(string) || t.IsArray || + (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(VBuffer<>)) || + (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) || + t == typeof(DvDateTime) || t == typeof(DvDateTimeZone) || t == typeof(DvTimeSpan) || t == typeof(UInt128)) { return OpCodes.Stobj; } @@ -46,7 +46,7 @@ private static OpCode GetAssignmentOpCode(Type t) /// /// Each of the specialized 'peek' methods copies the appropriate field value of an instance of T - /// into the provided buffer. So, the call is 'peek(userObject, ref destination)' and the logic is + /// into the provided buffer. So, the call is 'peek(userObject, ref destination)' and the logic is /// indentical to 'destination = userObject.##FIELD##', where ##FIELD## is defined per peek method. /// internal static Delegate GeneratePeek(InternalSchemaDefinition.Column column) @@ -83,7 +83,7 @@ private static Delegate GeneratePeek(FieldInfo fieldInfo, Op /// /// Each of the specialized 'poke' methods sets the appropriate field value of an instance of T - /// to the provided value. So, the call is 'peek(userObject, providedValue)' and the logic is + /// to the provided value. So, the call is 'peek(userObject, providedValue)' and the logic is /// indentical to 'userObject.##FIELD## = providedValue', where ##FIELD## is defined per poke method. /// internal static Delegate GeneratePoke(InternalSchemaDefinition.Column column) diff --git a/src/Microsoft.ML.Api/CodeGenerationUtils.cs b/src/Microsoft.ML.Api/CodeGenerationUtils.cs index 74f262c57c..7af0fb85ed 100644 --- a/src/Microsoft.ML.Api/CodeGenerationUtils.cs +++ b/src/Microsoft.ML.Api/CodeGenerationUtils.cs @@ -97,12 +97,12 @@ public static string GetCSharpString(CSharpCodeProvider codeProvider, string val } /// - /// Gets the C# strings representing the type name for a variable corresponding to - /// the column type. - /// - /// If the type is a vector, then controls whether the array field is + /// Gets the C# strings representing the type name for a variable corresponding to + /// the column type. + /// + /// If the type is a vector, then controls whether the array field is /// generated or . - /// + /// /// If additional attributes are required, they are appended to the list. /// private static string GetBackingTypeName(ColumnType colType, bool useVBuffer, List attributes) diff --git a/src/Microsoft.ML.Api/ComponentCreation.cs b/src/Microsoft.ML.Api/ComponentCreation.cs index 73cfbf91a5..3080a8197c 100644 --- a/src/Microsoft.ML.Api/ComponentCreation.cs +++ b/src/Microsoft.ML.Api/ComponentCreation.cs @@ -11,14 +11,14 @@ namespace Microsoft.ML.Runtime.Api { /// - /// This class defines extension methods for an to facilitate creating + /// This class defines extension methods for an to facilitate creating /// components (loaders, transforms, trainers, scorers, evaluators, savers). /// public static class ComponentCreation { /// /// Create a new data view which is obtained by appending all columns of all the source data views. - /// If the data views are of different length, the resulting data view will have the length equal to the + /// If the data views are of different length, the resulting data view will have the length equal to the /// length of the shortest source. /// /// The host environment to use. @@ -52,18 +52,18 @@ public static RoleMappedData CreateExamples(this IHostEnvironment env, IDataView env.CheckValueOrNull(weight); env.CheckValueOrNull(custom); - return TrainUtils.CreateExamples(data, label, features, group, weight, name: null, custom: custom); + return new RoleMappedData(data, label, features, group, weight, name: null, custom: custom); } /// /// Create a new over an in-memory collection of the items of user-defined type. /// The user maintains ownership of the and the resulting data view will /// never alter the contents of the . - /// Since is assumed to be immutable, the user is expected to not + /// Since is assumed to be immutable, the user is expected to not /// modify the contents of while the data view is being actively cursored. - /// + /// /// One typical usage for in-memory data view could be: create the data view, train a predictor. - /// Once the predictor is fully trained, modify the contents of the underlying collection and + /// Once the predictor is fully trained, modify the contents of the underlying collection and /// train another predictor. /// /// The user-defined item type. @@ -88,9 +88,9 @@ public static IDataView CreateDataView(this IHostEnvironment env, IList is assumed to be immutable, the user is expected to support /// multiple enumeration of the that would return the same results, unless /// the user knows that the data will only be cursored once. - /// + /// /// One typical usage for streaming data view could be: create the data view that lazily loads data - /// as needed, then apply pre-trained transformations to it and cursor through it for transformation + /// as needed, then apply pre-trained transformations to it and cursor through it for transformation /// results. This is how is implemented. /// /// The user-defined item type. @@ -191,7 +191,7 @@ public static PredictionEngine CreatePredictionEngine(th /// /// Create a prediction engine. /// This encapsulates the 'classic' prediction problem, where the input is denoted by the float array of features, - /// and the output is a float score. For binary classification predictors that can output probability, there are output + /// and the output is a float score. For binary classification predictors that can output probability, there are output /// fields that report the predicted label and probability. /// /// The host environment to use. @@ -207,7 +207,7 @@ public static SimplePredictionEngine CreateSimplePredictionEngine(this IHostEnvi /// /// Load the transforms (but not loader) from the model steram and apply them to the specified data. - /// It is acceptable to have no transforms in the model stream: in this case the original + /// It is acceptable to have no transforms in the model stream: in this case the original /// will be returned. /// /// The host environment to use. diff --git a/src/Microsoft.ML.Api/DataViewConstructionUtils.cs b/src/Microsoft.ML.Api/DataViewConstructionUtils.cs index f185dc6c0b..e940ea9d4d 100644 --- a/src/Microsoft.ML.Api/DataViewConstructionUtils.cs +++ b/src/Microsoft.ML.Api/DataViewConstructionUtils.cs @@ -119,7 +119,7 @@ private Delegate CreateGetter(int index) var column = DataView._schema.SchemaDefn.Columns[index]; var outputType = column.IsComputed ? column.ReturnType : column.FieldInfo.FieldType; - + var genericType = outputType; Func del; if (outputType.IsArray) @@ -129,11 +129,66 @@ private Delegate CreateGetter(int index) if (outputType.GetElementType() == typeof(string)) { Ch.Assert(colType.ItemType.IsText); - return CreateStringArrayToVBufferGetter(index); + return CreateConvertingArrayGetterDelegate(index, x => x == null ? DvText.NA : new DvText(x)); + } + else if (outputType.GetElementType() == typeof(int)) + { + Ch.Assert(colType.ItemType == NumberType.I4); + return CreateConvertingArrayGetterDelegate(index, x => x); + } + else if (outputType.GetElementType() == typeof(int?)) + { + Ch.Assert(colType.ItemType == NumberType.I4); + return CreateConvertingArrayGetterDelegate(index, x => x ?? DvInt4.NA); + } + else if (outputType.GetElementType() == typeof(long)) + { + Ch.Assert(colType.ItemType == NumberType.I8); + return CreateConvertingArrayGetterDelegate(index, x => x); + } + else if (outputType.GetElementType() == typeof(long?)) + { + Ch.Assert(colType.ItemType == NumberType.I8); + return CreateConvertingArrayGetterDelegate(index, x => x ?? DvInt8.NA); + } + else if (outputType.GetElementType() == typeof(short)) + { + Ch.Assert(colType.ItemType == NumberType.I2); + return CreateConvertingArrayGetterDelegate(index, x => x); + } + else if (outputType.GetElementType() == typeof(short?)) + { + Ch.Assert(colType.ItemType == NumberType.I2); + return CreateConvertingArrayGetterDelegate(index, x => x ?? DvInt2.NA); + } + else if (outputType.GetElementType() == typeof(sbyte)) + { + Ch.Assert(colType.ItemType == NumberType.I1); + return CreateConvertingArrayGetterDelegate(index, x => x); } + else if (outputType.GetElementType() == typeof(sbyte?)) + { + Ch.Assert(colType.ItemType == NumberType.I1); + return CreateConvertingArrayGetterDelegate(index, x => x ?? DvInt1.NA); + } + else if (outputType.GetElementType() == typeof(bool)) + { + Ch.Assert(colType.ItemType.IsBool); + return CreateConvertingArrayGetterDelegate(index, x => x); + } + else if (outputType.GetElementType() == typeof(bool?)) + { + Ch.Assert(colType.ItemType.IsBool); + return CreateConvertingArrayGetterDelegate(index, x => x ?? DvBool.NA); + } + // T[] -> VBuffer - Ch.Assert(outputType.GetElementType() == colType.ItemType.RawType); - del = CreateArrayToVBufferGetter; + if (outputType.GetElementType().IsGenericType && outputType.GetElementType().GetGenericTypeDefinition() == typeof(Nullable<>)) + Ch.Assert(Nullable.GetUnderlyingType(outputType.GetElementType()) == colType.ItemType.RawType); + else + Ch.Assert(outputType.GetElementType() == colType.ItemType.RawType); + del = CreateDirectArrayGetterDelegate; + genericType = outputType.GetElementType(); } else if (colType.IsVector) { @@ -142,7 +197,8 @@ private Delegate CreateGetter(int index) Ch.Assert(outputType.IsGenericType); Ch.Assert(outputType.GetGenericTypeDefinition() == typeof(VBuffer<>)); Ch.Assert(outputType.GetGenericArguments()[0] == colType.ItemType.RawType); - del = CreateVBufferToVBufferDelegate; + del = CreateDirectVBufferGetterDelegate; + genericType = colType.ItemType.RawType; } else if (colType.IsPrimitive) { @@ -150,24 +206,74 @@ private Delegate CreateGetter(int index) { // String -> DvText Ch.Assert(colType.IsText); - return CreateStringToTextGetter(index); + return CreateConvertingGetterDelegate(index, x => x == null ? DvText.NA : new DvText(x)); } else if (outputType == typeof(bool)) { // Bool -> DvBool Ch.Assert(colType.IsBool); - return CreateBooleanToDvBoolGetter(index); + return CreateConvertingGetterDelegate(index, x => x); } else if (outputType == typeof(bool?)) { // Bool? -> DvBool Ch.Assert(colType.IsBool); - return CreateNullableBooleanToDvBoolGetter(index); + return CreateConvertingGetterDelegate(index, x => x ?? DvBool.NA); + } + else if (outputType == typeof(int)) + { + // int -> DvInt4 + Ch.Assert(colType == NumberType.I4); + return CreateConvertingGetterDelegate(index, x => x); + } + else if (outputType == typeof(int?)) + { + // int? -> DvInt4 + Ch.Assert(colType == NumberType.I4); + return CreateConvertingGetterDelegate(index, x => x ?? DvInt4.NA); + } + else if (outputType == typeof(short)) + { + // short -> DvInt2 + Ch.Assert(colType == NumberType.I2); + return CreateConvertingGetterDelegate(index, x => x); + } + else if (outputType == typeof(short?)) + { + // short? -> DvInt2 + Ch.Assert(colType == NumberType.I2); + return CreateConvertingGetterDelegate(index, x => x ?? DvInt2.NA); + } + else if (outputType == typeof(long)) + { + // long -> DvInt8 + Ch.Assert(colType == NumberType.I8); + return CreateConvertingGetterDelegate(index, x => x); + } + else if (outputType == typeof(long?)) + { + // long? -> DvInt8 + Ch.Assert(colType == NumberType.I8); + return CreateConvertingGetterDelegate(index, x => x ?? DvInt8.NA); + } + else if (outputType == typeof(sbyte)) + { + // sbyte -> DvInt1 + Ch.Assert(colType == NumberType.I1); + return CreateConvertingGetterDelegate(index, x => x); + } + else if (outputType == typeof(sbyte?)) + { + // sbyte? -> DvInt1 + Ch.Assert(colType == NumberType.I1); + return CreateConvertingGetterDelegate(index, x => x ?? DvInt1.NA); } - // T -> T - Ch.Assert(colType.RawType == outputType); - del = CreateDirectGetter; + if (outputType.IsGenericType && outputType.GetGenericTypeDefinition() == typeof(Nullable<>)) + Ch.Assert(colType.RawType == Nullable.GetUnderlyingType(outputType)); + else + Ch.Assert(colType.RawType == outputType); + del = CreateDirectGetterDelegate; } else { @@ -175,66 +281,43 @@ private Delegate CreateGetter(int index) throw Ch.ExceptNotImpl("Type '{0}' is not yet supported.", outputType.FullName); } MethodInfo meth = - del.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(colType.ItemType.RawType); + del.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(genericType); return (Delegate)meth.Invoke(this, new object[] { index }); } - private Delegate CreateStringArrayToVBufferGetter(int index) + // REVIEW: The converting getter invokes a type conversion delegate on every call, so it's inherently slower + // than the 'direct' getter. We don't have good indication of this to the user, and the selection + // of affected types is pretty arbitrary (signed integers and bools, but not uints and floats). + private Delegate CreateConvertingArrayGetterDelegate(int index, Func convert) { - var peek = DataView._peeks[index] as Peek; + var peek = DataView._peeks[index] as Peek; Ch.AssertValue(peek); - - string[] buf = null; - - return (ValueGetter>)((ref VBuffer dst) => + TSrc[] buf = default; + return (ValueGetter>)((ref VBuffer dst) => { peek(GetCurrentRowObject(), Position, ref buf); var n = Utils.Size(buf); - dst = new VBuffer(n, Utils.Size(dst.Values) < n - ? new DvText[n] + dst = new VBuffer(n, Utils.Size(dst.Values) < n + ? new TDst[n] : dst.Values, dst.Indices); for (int i = 0; i < n; i++) - dst.Values[i] = new DvText(buf[i]); - }); - } - - private Delegate CreateStringToTextGetter(int index) - { - var peek = DataView._peeks[index] as Peek; - Ch.AssertValue(peek); - string buf = null; - return (ValueGetter)((ref DvText dst) => - { - peek(GetCurrentRowObject(), Position, ref buf); - dst = new DvText(buf); - }); - } - - private Delegate CreateBooleanToDvBoolGetter(int index) - { - var peek = DataView._peeks[index] as Peek; - Ch.AssertValue(peek); - bool buf = false; - return (ValueGetter)((ref DvBool dst) => - { - peek(GetCurrentRowObject(), Position, ref buf); - dst = (DvBool)buf; + dst.Values[i] = convert(buf[i]); }); } - private Delegate CreateNullableBooleanToDvBoolGetter(int index) + private Delegate CreateConvertingGetterDelegate(int index, Func convert) { - var peek = DataView._peeks[index] as Peek; + var peek = DataView._peeks[index] as Peek; Ch.AssertValue(peek); - bool? buf = null; - return (ValueGetter)((ref DvBool dst) => + TSrc buf = default; + return (ValueGetter)((ref TDst dst) => { peek(GetCurrentRowObject(), Position, ref buf); - dst = buf.HasValue ? (DvBool)buf.Value : DvBool.NA; + dst = convert(buf); }); } - private Delegate CreateArrayToVBufferGetter(int index) + private Delegate CreateDirectArrayGetterDelegate(int index) { var peek = DataView._peeks[index] as Peek; Ch.AssertValue(peek); @@ -250,26 +333,29 @@ private Delegate CreateArrayToVBufferGetter(int index) }); } - private Delegate CreateVBufferToVBufferDelegate(int index) + private Delegate CreateDirectVBufferGetterDelegate(int index) { var peek = DataView._peeks[index] as Peek>; Ch.AssertValue(peek); VBuffer buf = default(VBuffer); return (ValueGetter>)((ref VBuffer dst) => - { - // The peek for a VBuffer is just a simple assignment, so there is - // no copy going on in the peek, so we must do that as a second - // step to the destination. - peek(GetCurrentRowObject(), Position, ref buf); - buf.CopyTo(ref dst); - }); + { + // The peek for a VBuffer is just a simple assignment, so there is + // no copy going on in the peek, so we must do that as a second + // step to the destination. + peek(GetCurrentRowObject(), Position, ref buf); + buf.CopyTo(ref dst); + }); } - private Delegate CreateDirectGetter(int index) + private Delegate CreateDirectGetterDelegate(int index) { var peek = DataView._peeks[index] as Peek; Ch.AssertValue(peek); - return (ValueGetter)((ref TDst dst) => { peek(GetCurrentRowObject(), Position, ref dst); }); + return (ValueGetter)((ref TDst dst) => + { + peek(GetCurrentRowObject(), Position, ref dst); + }); } protected abstract TRow GetCurrentRowObject(); @@ -311,7 +397,7 @@ private void CheckColumnInRange(int columnIndex) } /// - /// An in-memory data view based on the IList of data. + /// An in-memory data view based on the IList of data. /// Supports shuffling. /// private sealed class ListDataView : DataViewBase @@ -407,11 +493,11 @@ protected override bool MoveManyCore(long count) } /// - /// An in-memory data view based on the IEnumerable of data. + /// An in-memory data view based on the IEnumerable of data. /// Doesn't support shuffling. - /// + /// /// This class is public because prediction engine wants to call its - /// for performance reasons. + /// for performance reasons. /// public sealed class StreamingDataView : DataViewBase where TRow : class @@ -493,7 +579,7 @@ protected override bool MoveNextCore() /// /// This represents the 'infinite data view' over one (mutable) user-defined object. - /// The 'current row' object can be updated at any time, this will affect all the + /// The 'current row' object can be updated at any time, this will affect all the /// newly created cursors, but not the ones already existing. /// public sealed class SingleRowLoopDataView : DataViewBase @@ -646,7 +732,7 @@ public abstract partial class MetadataInfo /// public ColumnType MetadataType; /// - /// The string identifier of the metadata. Some identifiers have special meaning, + /// The string identifier of the metadata. Some identifiers have special meaning, /// like "SlotNames", but any other identifiers can be used. /// public readonly string Kind; @@ -672,7 +758,7 @@ public sealed class MetadataInfo : MetadataInfo /// /// Constructor for metadata of value type T. /// - /// The string identifier of the metadata. Some identifiers have special meaning, + /// The string identifier of the metadata. Some identifiers have special meaning, /// like "SlotNames", but any other identifiers can be used. /// Metadata value. /// Type of the metadata. diff --git a/src/Microsoft.ML.Api/GenerateCodeCommand.cs b/src/Microsoft.ML.Api/GenerateCodeCommand.cs index 0b45bcc4bb..26136971af 100644 --- a/src/Microsoft.ML.Api/GenerateCodeCommand.cs +++ b/src/Microsoft.ML.Api/GenerateCodeCommand.cs @@ -21,7 +21,7 @@ namespace Microsoft.ML.Runtime.Api { /// /// Generates the sample prediction code for a given model file, with correct input and output classes. - /// + /// /// REVIEW: Consider adding support for generating VBuffers instead of arrays, maybe for high dimensionality vectors. /// public sealed class GenerateCodeCommand : ICommand @@ -45,7 +45,7 @@ public sealed class Arguments ShortName = "sparse", SortOrder = 102)] public bool SparseVectorDeclaration; - // REVIEW: currently, it's only used in unit testing to not generate the paths into the test output folder. + // REVIEW: currently, it's only used in unit testing to not generate the paths into the test output folder. // However, it might be handy for automation scenarios, so I've added this as a hidden option. [Argument(ArgumentType.AtMostOnce, HelpText = "A location of the model file to put into generated file", Hide = true)] public string ModelNameOverride; @@ -108,8 +108,8 @@ public void Run() { var roles = ModelFileUtils.LoadRoleMappingsOrNull(_host, fs); scorer = roles != null - ? _host.CreateDefaultScorer(RoleMappedData.CreateOpt(transformPipe, roles), pred) - : _host.CreateDefaultScorer(_host.CreateExamples(transformPipe, "Features"), pred); + ? _host.CreateDefaultScorer(new RoleMappedData(transformPipe, roles, opt: true), pred) + : _host.CreateDefaultScorer(new RoleMappedData(transformPipe, label: null, "Features"), pred); } var nonScoreSb = new StringBuilder(); diff --git a/src/Microsoft.ML.Api/InternalSchemaDefinition.cs b/src/Microsoft.ML.Api/InternalSchemaDefinition.cs index 2b0f056214..3edf7599a4 100644 --- a/src/Microsoft.ML.Api/InternalSchemaDefinition.cs +++ b/src/Microsoft.ML.Api/InternalSchemaDefinition.cs @@ -76,12 +76,12 @@ private Column(string columnName, ColumnType columnType, FieldInfo fieldInfo = n } /// - /// Function that checks whether the InternalSchemaDefinition.Column is a valid one. + /// Function that checks whether the InternalSchemaDefinition.Column is a valid one. /// To be valid, the Column must: /// 1. Have non-empty values for ColumnName and ColumnType /// 2. Have a non-empty value for FieldInfo iff it is a field column, else /// ReturnParameterInfo and Generator iff it is a computed column - /// 3. Generator must have the method inputs (TRow rowObject, + /// 3. Generator must have the method inputs (TRow rowObject, /// long position, ref TValue outputValue) in that order. /// [Conditional("DEBUG")] @@ -133,7 +133,7 @@ private InternalSchemaDefinition(Column[] columns) /// /// Given a field info on a type, returns whether this appears to be a vector type, /// and also the associated data kind for this type. If a data kind could not - /// be determined, this will throw. + /// be determined, this will throw. /// /// The field info to inspect. /// Whether this appears to be a vector type. @@ -149,7 +149,7 @@ public static void GetVectorAndKind(FieldInfo fieldInfo, out bool isVector, out /// /// Given a parameter info on a type, returns whether this appears to be a vector type, /// and also the associated data kind for this type. If a data kind could not - /// be determined, this will throw. + /// be determined, this will throw. /// /// The parameter info to inspect. /// Whether this appears to be a vector type. @@ -165,7 +165,7 @@ public static void GetVectorAndKind(ParameterInfo parameterInfo, out bool isVect /// /// Given a type and name for a variable, returns whether this appears to be a vector type, /// and also the associated data kind for this type. If a data kind could not - /// be determined, this will throw. + /// be determined, this will throw. /// /// The type of the variable to inspect. /// The name of the variable to inspect. @@ -222,7 +222,7 @@ public static InternalSchemaDefinition Create(Type userType, SchemaDefinition us col.MemberName, userType.FullName); - //Clause to handle the field that may be used to expose the cursor channel. + //Clause to handle the field that may be used to expose the cursor channel. //This field does not need a column. if (fieldInfo.FieldType == typeof(IChannel)) continue; @@ -251,7 +251,7 @@ public static InternalSchemaDefinition Create(Type userType, SchemaDefinition us } else { - // Make sure that the types are compatible with the declared type, including + // Make sure that the types are compatible with the declared type, including // whether it is a vector type. if (isVector != col.ColumnType.IsVector) { diff --git a/src/Microsoft.ML.Api/LambdaTransform.cs b/src/Microsoft.ML.Api/LambdaTransform.cs index 93635c6d7d..506c675524 100644 --- a/src/Microsoft.ML.Api/LambdaTransform.cs +++ b/src/Microsoft.ML.Api/LambdaTransform.cs @@ -37,7 +37,7 @@ public static class LambdaTransform /// different data by calling ), and the transformed data (which can be /// enumerated upon by calling GetRowCursor or AsCursorable{TRow}). If or /// implement the interface, they will be disposed after use. - /// + /// /// This is a 'stateless non-savable' version of the transform. /// /// The host environment to use. @@ -78,7 +78,7 @@ public static ITransformTemplate CreateMap(IHostEnvironment env, IDa /// different data by calling ), and the transformed data (which can be /// enumerated upon by calling GetRowCursor or AsCursorable{TRow}). If or /// implement the interface, they will be disposed after use. - /// + /// /// This is a 'stateless savable' version of the transform: save and load routines must be provided. /// /// The host environment to use. @@ -123,7 +123,7 @@ public static ITransformTemplate CreateMap(IHostEnvironment env, IDa /// /// This is a 'stateful non-savable' version of the map transform: the mapping function is guaranteed to be invoked once per - /// every row of the data set, in sequence; one user-defined state object will be allocated per cursor and passed to the + /// every row of the data set, in sequence; one user-defined state object will be allocated per cursor and passed to the /// map function every time. If , , or /// implement the interface, they will be disposed after use. /// @@ -164,7 +164,7 @@ public static ITransformTemplate CreateMap(IHostEnvironment /// /// This is a 'stateful savable' version of the map transform: the mapping function is guaranteed to be invoked once per - /// every row of the data set, in sequence (non-parallelizable); one user-defined state object will be allocated per cursor and passed to the + /// every row of the data set, in sequence (non-parallelizable); one user-defined state object will be allocated per cursor and passed to the /// map function every time; save and load routines must be provided. If , , /// or implement the interface, they will be disposed after use. /// @@ -217,8 +217,8 @@ public static ITransformTemplate CreateMap(IHostEnvironment /// This creates a filter transform that can 'accept' or 'decline' any row of the data based on the contents of the row /// or state of the cursor. /// This is a 'stateful non-savable' version of the filter: the filter function is guaranteed to be invoked once per - /// every row of the data set, in sequence (non-parallelizable); one user-defined state object will be allocated per cursor and passed to the - /// filter function every time. + /// every row of the data set, in sequence (non-parallelizable); one user-defined state object will be allocated per cursor and passed to the + /// filter function every time. /// If or implement the interface, they will be disposed after use. /// /// The type that describes what 'source' columns are consumed from the @@ -251,7 +251,7 @@ public static ITransformTemplate CreateFilter(IHostEnvironment env /// This creates a filter transform that can 'accept' or 'decline' any row of the data based on the contents of the row /// or state of the cursor. /// This is a 'stateful savable' version of the filter: the filter function is guaranteed to be invoked once per - /// every row of the data set, in sequence (non-parallelizable); one user-defined state object will be allocated per cursor and passed to the + /// every row of the data set, in sequence (non-parallelizable); one user-defined state object will be allocated per cursor and passed to the /// filter function every time; save and load routines must be provided. /// If or implement the interface, they will be disposed after use. /// @@ -294,11 +294,11 @@ public static ITransformTemplate CreateFilter(IHostEnvironment env } /// - /// Defines common ancestor for various flavors of lambda-based user-defined transforms that may or may not be + /// Defines common ancestor for various flavors of lambda-based user-defined transforms that may or may not be /// serializable. - /// + /// /// In order for the transform to be serializable, the user should specify a save and load delegate. - /// Specifically, for this the user has to provide the following things: + /// Specifically, for this the user has to provide the following things: /// * a custom save action that serializes the transform 'state' to the binary writer. /// * a custom load action that de-serializes the transform from the binary reader. This must be a public static method of a public class. /// diff --git a/src/Microsoft.ML.Api/MapTransform.cs b/src/Microsoft.ML.Api/MapTransform.cs index 914bb63c07..4426721620 100644 --- a/src/Microsoft.ML.Api/MapTransform.cs +++ b/src/Microsoft.ML.Api/MapTransform.cs @@ -14,7 +14,7 @@ namespace Microsoft.ML.Runtime.Api /// It doesn't change the number of rows, and can be seen as a result of application of the user's function /// to every row of the input data. /// Similarly to the existing 's, this object can be treated as both the 'transformation' algorithm - /// (which can be then applied to different data by calling ), and the transformed data (which can + /// (which can be then applied to different data by calling ), and the transformed data (which can /// be enumerated upon by calling GetRowCursor or AsCursorable{TRow}). /// /// The type that describes what 'source' columns are consumed from the input . @@ -36,8 +36,8 @@ internal sealed class MapTransform : LambdaTransformBase, ITransform private static string RegistrationName { get { return string.Format(RegistrationNameTemplate, typeof(TSrc).FullName, typeof(TDst).FullName); } } /// - /// Create a a map transform that is savable iff and are - /// not null. + /// Create a a map transform that is savable iff and are + /// not null. /// /// The host environment /// The dataview upon which we construct the transform @@ -47,7 +47,7 @@ internal sealed class MapTransform : LambdaTransformBase, ITransform /// A function that given the serialization stream and a data view, returns /// an . The intent is, this returned object should itself be a /// , but this is not strictly necessary. This delegate should be - /// a static non-lambda method that this assembly can legally call. May be null simultaneously with + /// a static non-lambda method that this assembly can legally call. May be null simultaneously with /// . /// The schema definition overrides for /// The schema definition overrides for diff --git a/src/Microsoft.ML.Api/PredictionEngine.cs b/src/Microsoft.ML.Api/PredictionEngine.cs index eacf8d2218..9410d3b50e 100644 --- a/src/Microsoft.ML.Api/PredictionEngine.cs +++ b/src/Microsoft.ML.Api/PredictionEngine.cs @@ -49,8 +49,8 @@ internal BatchPredictionEngine(IHostEnvironment env, Stream modelStream, bool ig { var roles = ModelFileUtils.LoadRoleMappingsOrNull(env, modelStream); pipe = roles != null - ? env.CreateDefaultScorer(RoleMappedData.CreateOpt(pipe, roles), predictor) - : env.CreateDefaultScorer(env.CreateExamples(pipe, "Features"), predictor); + ? env.CreateDefaultScorer(new RoleMappedData(pipe, roles, opt: true), predictor) + : env.CreateDefaultScorer(new RoleMappedData(pipe, label: null, "Features"), predictor); } _pipeEngine = new PipeEngine(env, pipe, ignoreMissingColumns, outputSchemaDefinition); @@ -72,12 +72,12 @@ internal BatchPredictionEngine(IHostEnvironment env, IDataView dataPipeline, boo } /// - /// Run the prediction pipe. This will enumerate the exactly once, - /// cache all the examples (by reference) into its internal representation and then run + /// Run the prediction pipe. This will enumerate the exactly once, + /// cache all the examples (by reference) into its internal representation and then run /// the transformation pipe. /// /// The examples to run the prediction on. - /// If true, the engine will not allocate memory per output, and + /// If true, the engine will not allocate memory per output, and /// the returned objects will actually always be the same object. The user is /// expected to clone the values himself if needed. /// The that contains all the pipeline results. @@ -141,7 +141,7 @@ public void Reset() /// in-memory data, one example at a time. /// This can also be used with trained pipelines that do not end with a predictor: in this case, the /// 'prediction' will be just the outcome of all the transformations. - /// This is essentially a wrapper for that throws if + /// This is essentially a wrapper for that throws if /// more than one result is returned per call to . /// /// The user-defined type that holds the example. @@ -198,7 +198,7 @@ public TDst Predict(TSrc example) /// /// This class encapsulates the 'classic' prediction problem, where the input is denoted by the float array of features, - /// and the output is a float score. For binary classification predictors that can output probability, there are output + /// and the output is a float score. For binary classification predictors that can output probability, there are output /// fields that report the predicted label and probability. /// public sealed class SimplePredictionEngine diff --git a/src/Microsoft.ML.Api/SchemaDefinition.cs b/src/Microsoft.ML.Api/SchemaDefinition.cs index 5f84712625..e08845a87e 100644 --- a/src/Microsoft.ML.Api/SchemaDefinition.cs +++ b/src/Microsoft.ML.Api/SchemaDefinition.cs @@ -63,7 +63,7 @@ public VectorTypeAttribute(params int[] dims) } /// - /// Describes column information such as name and the source columns indicies that this + /// Describes column information such as name and the source columns indicies that this /// column encapsulates. /// [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] @@ -81,12 +81,12 @@ public ColumnAttribute(string ordinal, string name = null) public string Name { get; } /// - /// Contains positions of indices of source columns in the form - /// of ranges. Examples of range: if we want to include just column - /// with index 1 we can write the range as 1, if we want to include + /// Contains positions of indices of source columns in the form + /// of ranges. Examples of range: if we want to include just column + /// with index 1 we can write the range as 1, if we want to include /// columns 1 to 10 then we can write the range as 1-10 and we want to include all the /// columns from column with index 1 until end then we can write 1-*. - /// + /// /// This takes sequence of ranges that are comma seperated, example: /// 1,2-5,10-* /// @@ -125,7 +125,7 @@ public sealed class NoColumnAttribute : Attribute } /// - /// Mark a member that implements exactly IChannel as being permitted to receive + /// Mark a member that implements exactly IChannel as being permitted to receive /// channel information from an external channel. /// [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] @@ -133,11 +133,11 @@ public sealed class CursorChannelAttribute : Attribute { /// /// When passed some object, and a channel, it attempts to pass the channel to the object. It - /// passes the channel to the object iff the object has exactly one field marked with the - /// CursorChannelAttribute, and that field implements only the IChannel interface. - /// - /// The function returns the modified object, as well as a boolean indicator of whether it was - /// able to pass the channel to the object. + /// passes the channel to the object iff the object has exactly one field marked with the + /// CursorChannelAttribute, and that field implements only the IChannel interface. + /// + /// The function returns the modified object, as well as a boolean indicator of whether it was + /// able to pass the channel to the object. /// /// The object that attempts to acquire the channel. /// The channel to pass to the object. @@ -206,13 +206,13 @@ public sealed class Column public ColumnType ColumnType { get; set; } /// - /// Whether the column is a computed type. + /// Whether the column is a computed type. /// public bool IsComputed { get { return Generator != null; } } /// - /// The generator function. if the column is computed. - /// + /// The generator function. if the column is computed. + /// public Delegate Generator { get; set; } public Type ReturnType => Generator?.GetMethodInfo().GetParameters().LastOrDefault().ParameterType.GetElementType(); @@ -277,7 +277,7 @@ public IEnumerable> GetMetadataTypes } /// - /// Get or set the column definition by column name. + /// Get or set the column definition by column name. /// If there's no such column: /// - get returns null, /// - set adds a new column. @@ -287,9 +287,7 @@ public IEnumerable> GetMetadataTypes /// public Column this[string columnName] { -#pragma warning disable TLC_NoThis // Do not use 'this' keyword for member access get => this.FirstOrDefault(x => x.ColumnName == columnName); -#pragma warning restore TLC_NoThis // Do not use 'this' keyword for member access set { Contracts.CheckValue(value, nameof(value)); @@ -323,12 +321,15 @@ public static SchemaDefinition Create(Type userType) HashSet colNames = new HashSet(); foreach (var fieldInfo in userType.GetFields()) { - // Clause to handle the field that may be used to expose the cursor channel. + // Clause to handle the field that may be used to expose the cursor channel. // This field does not need a column. - // REVIEW: maybe validate the channel attribute now, instead + // REVIEW: maybe validate the channel attribute now, instead // of later at cursor creation. if (fieldInfo.FieldType == typeof(IChannel)) continue; + // Const fields do not need to be mapped. + if (fieldInfo.IsLiteral) + continue; if (fieldInfo.GetCustomAttribute() != null) continue; diff --git a/src/Microsoft.ML.Api/SerializableLambdaTransform.cs b/src/Microsoft.ML.Api/SerializableLambdaTransform.cs index 5f761a042b..7de6e522d8 100644 --- a/src/Microsoft.ML.Api/SerializableLambdaTransform.cs +++ b/src/Microsoft.ML.Api/SerializableLambdaTransform.cs @@ -79,7 +79,7 @@ public static ITransformTemplate Create(IHostEnvironment env, ModelLoadContext c /// that method that should be enough to "recover" it, assuming it is a "recoverable" method (recoverable /// here is a loose definition, meaning that is capable /// of creating it, which includes among other things that it's static, non-lambda, accessible to - /// this assembly, etc.). + /// this assembly, etc.). /// /// The method that should be "recoverable" /// A string array describing the input method diff --git a/src/Microsoft.ML.Api/StatefulFilterTransform.cs b/src/Microsoft.ML.Api/StatefulFilterTransform.cs index b7e0cf473b..f47b8620a8 100644 --- a/src/Microsoft.ML.Api/StatefulFilterTransform.cs +++ b/src/Microsoft.ML.Api/StatefulFilterTransform.cs @@ -9,10 +9,10 @@ namespace Microsoft.ML.Runtime.Api { - // REVIEW: the current interface to 'state' object may be inadequate: instead of insisting on + // REVIEW: the current interface to 'state' object may be inadequate: instead of insisting on // parameterless constructor, we could take a delegate that would create the state per cursor. /// - /// This transform is similar to , but it allows per-cursor state, + /// This transform is similar to , but it allows per-cursor state, /// as well as the ability to 'accept' or 'filter out' some rows of the supplied . /// The downside is that the provided lambda is eagerly called on every row (not lazily when needed), and /// parallel cursors are not allowed. @@ -38,8 +38,8 @@ internal sealed class StatefulFilterTransform : LambdaTransf private static string RegistrationName { get { return string.Format(RegistrationNameTemplate, typeof(TSrc).FullName, typeof(TDst).FullName); } } /// - /// Create a filter transform that is savable iff and are - /// not null. + /// Create a filter transform that is savable iff and are + /// not null. /// /// The host environment /// The dataview upon which we construct the transform @@ -51,7 +51,7 @@ internal sealed class StatefulFilterTransform : LambdaTransf /// A function that given the serialization stream and a data view, returns /// an . The intent is, this returned object should itself be a /// , but this is not strictly necessary. This delegate should be - /// a static non-lambda method that this assembly can legally call. May be null simultaneously with + /// a static non-lambda method that this assembly can legally call. May be null simultaneously with /// . /// The schema definition overrides for /// The schema definition overrides for diff --git a/src/Microsoft.ML.Api/TypedCursor.cs b/src/Microsoft.ML.Api/TypedCursor.cs index 29fee77a02..cd8198e14d 100644 --- a/src/Microsoft.ML.Api/TypedCursor.cs +++ b/src/Microsoft.ML.Api/TypedCursor.cs @@ -57,7 +57,7 @@ public interface ICursorable /// /// Implementation of the strongly typed Cursorable. - /// Similarly to the 'DataView{T}, this class uses IL generation to create the 'poke' methods that + /// Similarly to the 'DataView{T}, this class uses IL generation to create the 'poke' methods that /// write directly into the fields of the user-defined type. /// internal sealed class TypedCursorable : ICursorable @@ -271,7 +271,7 @@ private Action GenerateSetter(IRow input, int index, InternalSchemaDefinit var colType = input.Schema.GetColumnType(index); var fieldInfo = column.FieldInfo; var fieldType = fieldInfo.FieldType; - + var genericType = fieldType; Func> del; if (fieldType.IsArray) { @@ -280,11 +280,66 @@ private Action GenerateSetter(IRow input, int index, InternalSchemaDefinit if (fieldType.GetElementType() == typeof(string)) { Ch.Assert(colType.ItemType.IsText); - return CreateVBufferToStringArraySetter(input, index, poke, peek); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => x.ToString()); + } + else if (fieldType.GetElementType() == typeof(bool)) + { + Ch.Assert(colType.ItemType.IsBool); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (bool)x); + } + else if (fieldType.GetElementType() == typeof(bool?)) + { + Ch.Assert(colType.ItemType.IsBool); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (bool?)x); + } + else if (fieldType.GetElementType() == typeof(int)) + { + Ch.Assert(colType.ItemType == NumberType.I4); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (int)x); + } + else if (fieldType.GetElementType() == typeof(int?)) + { + Ch.Assert(colType.ItemType == NumberType.I4); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (int?)x); + } + else if (fieldType.GetElementType() == typeof(short)) + { + Ch.Assert(colType.ItemType == NumberType.I2); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (short)x); + } + else if (fieldType.GetElementType() == typeof(short?)) + { + Ch.Assert(colType.ItemType == NumberType.I2); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (short?)x); + } + else if (fieldType.GetElementType() == typeof(long)) + { + Ch.Assert(colType.ItemType == NumberType.I8); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (long)x); + } + else if (fieldType.GetElementType() == typeof(long?)) + { + Ch.Assert(colType.ItemType == NumberType.I8); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (long?)x); } + else if (fieldType.GetElementType() == typeof(sbyte)) + { + Ch.Assert(colType.ItemType == NumberType.I1); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (sbyte)x); + } + else if (fieldType.GetElementType() == typeof(sbyte?)) + { + Ch.Assert(colType.ItemType == NumberType.I1); + return CreateConvertingVBufferSetter(input, index, poke, peek, x => (sbyte?)x); + } + // VBuffer -> T[] - Ch.Assert(fieldType.GetElementType() == colType.ItemType.RawType); - del = CreateVBufferToArraySetter; + if (fieldType.GetElementType().IsGenericType && fieldType.GetElementType().GetGenericTypeDefinition() == typeof(Nullable<>)) + Ch.Assert(colType.ItemType.RawType == Nullable.GetUnderlyingType(fieldType.GetElementType())); + else + Ch.Assert(colType.ItemType.RawType == fieldType.GetElementType()); + del = CreateDirectVBufferSetter; + genericType = fieldType.GetElementType(); } else if (colType.IsVector) { @@ -294,6 +349,7 @@ private Action GenerateSetter(IRow input, int index, InternalSchemaDefinit Ch.Assert(fieldType.GetGenericTypeDefinition() == typeof(VBuffer<>)); Ch.Assert(fieldType.GetGenericArguments()[0] == colType.ItemType.RawType); del = CreateVBufferToVBufferSetter; + genericType = colType.ItemType.RawType; } else if (colType.IsPrimitive) { @@ -302,53 +358,111 @@ private Action GenerateSetter(IRow input, int index, InternalSchemaDefinit // DvText -> String Ch.Assert(colType.IsText); Ch.Assert(peek == null); - return CreateTextToStringSetter(input, index, poke); + return CreateConvertingActionSetter(input, index, poke, x => x.ToString()); } else if (fieldType == typeof(bool)) { Ch.Assert(colType.IsBool); Ch.Assert(peek == null); - return CreateDvBoolToBoolSetter(input, index, poke); + return CreateConvertingActionSetter(input, index, poke, x => (bool)x); } - else + else if (fieldType == typeof(bool?)) { - // T -> T - Ch.Assert(colType.RawType == fieldType); - del = CreateDirectSetter; + Ch.Assert(colType.IsBool); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (bool?)x); + } + else if (fieldType == typeof(int)) + { + Ch.Assert(colType == NumberType.I4); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (int)x); } + else if (fieldType == typeof(int?)) + { + Ch.Assert(colType == NumberType.I4); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (int?)x); + } + else if (fieldType == typeof(short)) + { + Ch.Assert(colType == NumberType.I2); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (short)x); + } + else if (fieldType == typeof(short?)) + { + Ch.Assert(colType == NumberType.I2); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (short?)x); + } + else if (fieldType == typeof(long)) + { + Ch.Assert(colType == NumberType.I8); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (long)x); + } + else if (fieldType == typeof(long?)) + { + Ch.Assert(colType == NumberType.I8); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (long?)x); + } + else if (fieldType == typeof(sbyte)) + { + Ch.Assert(colType == NumberType.I1); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (sbyte)x); + } + else if (fieldType == typeof(sbyte?)) + { + Ch.Assert(colType == NumberType.I1); + Ch.Assert(peek == null); + return CreateConvertingActionSetter(input, index, poke, x => (sbyte?)x); + } + // T -> T + if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Nullable<>)) + Ch.Assert(colType.RawType == Nullable.GetUnderlyingType(fieldType)); + else + Ch.Assert(colType.RawType == fieldType); + + del = CreateDirectSetter; } else { // REVIEW: Is this even possible? throw Ch.ExceptNotImpl("Type '{0}' is not yet supported.", fieldInfo.FieldType.FullName); } - MethodInfo meth = del.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(colType.ItemType.RawType); + MethodInfo meth = del.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(genericType); return (Action)meth.Invoke(this, new object[] { input, index, poke, peek }); } - private Action CreateVBufferToStringArraySetter(IRow input, int col, Delegate poke, Delegate peek) + // REVIEW: The converting getter invokes a type conversion delegate on every call, so it's inherently slower + // than the 'direct' getter. We don't have good indication of this to the user, and the selection + // of affected types is pretty arbitrary (signed integers and bools, but not uints and floats). + private Action CreateConvertingVBufferSetter(IRow input, int col, Delegate poke, Delegate peek, Func convert) { - var getter = input.GetGetter>(col); - var typedPoke = poke as Poke; - var typedPeek = peek as Peek; + var getter = input.GetGetter>(col); + var typedPoke = poke as Poke; + var typedPeek = peek as Peek; Contracts.AssertValue(typedPoke); Contracts.AssertValue(typedPeek); - VBuffer value = default(VBuffer); - string[] buf = null; + VBuffer value = default; + TDst[] buf = null; return row => { getter(ref value); typedPeek(row, Position, ref buf); if (Utils.Size(buf) != value.Length) - buf = new string[value.Length]; + buf = new TDst[value.Length]; foreach (var pair in value.Items(true)) - buf[pair.Key] = pair.Value.ToString(); + buf[pair.Key] = convert(pair.Value); typedPoke(row, buf); }; } - private Action CreateVBufferToArraySetter(IRow input, int col, Delegate poke, Delegate peek) + private Action CreateDirectVBufferSetter(IRow input, int col, Delegate poke, Delegate peek) { var getter = input.GetGetter>(col); var typedPoke = poke as Poke; @@ -386,29 +500,17 @@ private Action CreateVBufferToArraySetter(IRow input, int col, Deleg }; } - private static Action CreateTextToStringSetter(IRow input, int col, Delegate poke) - { - var getter = input.GetGetter(col); - var typedPoke = poke as Poke; - Contracts.AssertValue(typedPoke); - DvText value = default(DvText); - return row => - { - getter(ref value); - typedPoke(row, value.ToString()); - }; - } - - private static Action CreateDvBoolToBoolSetter(IRow input, int col, Delegate poke) + private static Action CreateConvertingActionSetter(IRow input, int col, Delegate poke, Func convert) { - var getter = input.GetGetter(col); - var typedPoke = poke as Poke; + var getter = input.GetGetter(col); + var typedPoke = poke as Poke; Contracts.AssertValue(typedPoke); - DvBool value = default(DvBool); + TSrc value = default; return row => { getter(ref value); - typedPoke(row, Convert.ToBoolean(value.RawValue)); + var toPoke = convert(value); + typedPoke(row, toPoke); }; } diff --git a/src/Microsoft.ML.Console/Console.cs b/src/Microsoft.ML.Console/Console.cs index 12e6254cce..152d65951a 100644 --- a/src/Microsoft.ML.Console/Console.cs +++ b/src/Microsoft.ML.Console/Console.cs @@ -8,4 +8,4 @@ public static class Console { public static int Main(string[] args) => Maml.Main(args); } -} +} \ No newline at end of file diff --git a/src/Microsoft.ML.Console/Microsoft.ML.Console.csproj b/src/Microsoft.ML.Console/Microsoft.ML.Console.csproj index 8039371695..ae327a26c2 100644 --- a/src/Microsoft.ML.Console/Microsoft.ML.Console.csproj +++ b/src/Microsoft.ML.Console/Microsoft.ML.Console.csproj @@ -3,18 +3,33 @@ true CORECLR - Microsoft.ML - netcoreapp2.0 - Exe - MML - Microsoft.ML.Runtime.Tools.Console.Console + netcoreapp2.0 + Exe + MML + Microsoft.ML.Runtime.Tools.Console.Console + + + + + + + - + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.Core/CommandLine/CmdParser.cs b/src/Microsoft.ML.Core/CommandLine/CmdParser.cs index b9b9506cf9..eb85fcce12 100644 --- a/src/Microsoft.ML.Core/CommandLine/CmdParser.cs +++ b/src/Microsoft.ML.Core/CommandLine/CmdParser.cs @@ -493,7 +493,7 @@ public static string ArgumentsUsage(IHostEnvironment env, Type type, object defa #if CORECLR /// - /// Fix the window width for the Core build to remove the kernel32.dll dependency. + /// Fix the window width for the Core build to remove the kernel32.dll dependency. /// /// public static int GetConsoleWindowWidth() @@ -620,7 +620,7 @@ private static ArgumentInfo GetArgumentInfo(Type type, object defaults) string[] nicks; // Semantics of ShortName: // The string provided represents an array of names separated by commas and spaces, once empty entries are removed. - // 'null' or a singleton array with containing only the long field name means "use the default short name", + // 'null' or a singleton array with containing only the long field name means "use the default short name", // and is represented by the null 'nicks' array. // 'String.Empty' or a string containing only spaces and commas means "no short name", and is represented by an empty 'nicks' array. if (attr.ShortName == null) @@ -1666,7 +1666,7 @@ public bool Finish(CmdParser owner, ArgValue val, object destination) } else if (IsMultiSubComponent) { - // REVIEW: the kind should not be separated from settings: everything related + // REVIEW: the kind should not be separated from settings: everything related // to one item should go into one value, not multiple values if (IsTaggedCollection) { diff --git a/src/Microsoft.ML.Core/ComponentModel/ComponentCatalog.cs b/src/Microsoft.ML.Core/ComponentModel/ComponentCatalog.cs index 28666e7f44..3b56e8bb36 100644 --- a/src/Microsoft.ML.Core/ComponentModel/ComponentCatalog.cs +++ b/src/Microsoft.ML.Core/ComponentModel/ComponentCatalog.cs @@ -385,7 +385,7 @@ private static void CacheLoadedAssemblies() { if (_assemblyQueue == null) { - // Create the loaded assembly queue and dictionary, set up the AssemblyLoad / AssemblyResolve + // Create the loaded assembly queue and dictionary, set up the AssemblyLoad / AssemblyResolve // event handlers and populate the queue / dictionary with all assemblies that are currently loaded. Contracts.Assert(_assemblyQueue == null); Contracts.Assert(_loadedAssemblies == null); @@ -413,7 +413,7 @@ private static void CacheLoadedAssemblies() // Load all assemblies in our directory. var moduleName = typeof(ComponentCatalog).Module.FullyQualifiedName; - // If were are loaded in the context of SQL CLR then the FullyQualifiedName and Name properties are set to + // If were are loaded in the context of SQL CLR then the FullyQualifiedName and Name properties are set to // string "" and we skip scanning current directory. if (moduleName != "") { @@ -451,7 +451,7 @@ private static void CacheLoadedAssemblies() #if TRACE_ASSEMBLY_LOADING // The "" no-op argument is necessary because WriteLine has multiple overloads, and with two strings - // it will be the one that is message/category, rather than format string with + // it will be the one that is message/category, rather than format string with System.Diagnostics.Debug.WriteLine("*** Caching classes in {0}", assembly.FullName, ""); #endif int added = 0; diff --git a/src/Microsoft.ML.Core/Data/ColumnType.cs b/src/Microsoft.ML.Core/Data/ColumnType.cs index 780ef7a7d7..0cff911e77 100644 --- a/src/Microsoft.ML.Core/Data/ColumnType.cs +++ b/src/Microsoft.ML.Core/Data/ColumnType.cs @@ -325,7 +325,7 @@ public static PrimitiveType FromKind(DataKind kind) /// public sealed class TextType : PrimitiveType { - private volatile static TextType _instance; + private static volatile TextType _instance; public static TextType Instance { get @@ -370,7 +370,7 @@ private NumberType(DataKind kind, string name) Contracts.Assert(IsNumber); } - private volatile static NumberType _instI1; + private static volatile NumberType _instI1; public static NumberType I1 { get @@ -381,7 +381,7 @@ public static NumberType I1 } } - private volatile static NumberType _instU1; + private static volatile NumberType _instU1; public static NumberType U1 { get @@ -392,7 +392,7 @@ public static NumberType U1 } } - private volatile static NumberType _instI2; + private static volatile NumberType _instI2; public static NumberType I2 { get @@ -403,7 +403,7 @@ public static NumberType I2 } } - private volatile static NumberType _instU2; + private static volatile NumberType _instU2; public static NumberType U2 { get @@ -414,7 +414,7 @@ public static NumberType U2 } } - private volatile static NumberType _instI4; + private static volatile NumberType _instI4; public static NumberType I4 { get @@ -425,7 +425,7 @@ public static NumberType I4 } } - private volatile static NumberType _instU4; + private static volatile NumberType _instU4; public static NumberType U4 { get @@ -436,7 +436,7 @@ public static NumberType U4 } } - private volatile static NumberType _instI8; + private static volatile NumberType _instI8; public static NumberType I8 { get @@ -447,7 +447,7 @@ public static NumberType I8 } } - private volatile static NumberType _instU8; + private static volatile NumberType _instU8; public static NumberType U8 { get @@ -458,7 +458,7 @@ public static NumberType U8 } } - private volatile static NumberType _instUG; + private static volatile NumberType _instUG; public static NumberType UG { get @@ -469,7 +469,7 @@ public static NumberType UG } } - private volatile static NumberType _instR4; + private static volatile NumberType _instR4; public static NumberType R4 { get @@ -480,7 +480,7 @@ public static NumberType R4 } } - private volatile static NumberType _instR8; + private static volatile NumberType _instR8; public static NumberType R8 { get @@ -496,7 +496,7 @@ public static NumberType Float get { return R4; } } - public new static NumberType FromKind(DataKind kind) + public static new NumberType FromKind(DataKind kind) { switch (kind) { @@ -557,7 +557,7 @@ public override string ToString() /// public sealed class BoolType : PrimitiveType { - private volatile static BoolType _instance; + private static volatile BoolType _instance; public static BoolType Instance { get @@ -589,7 +589,7 @@ public override string ToString() public sealed class DateTimeType : PrimitiveType { - private volatile static DateTimeType _instance; + private static volatile DateTimeType _instance; public static DateTimeType Instance { get @@ -621,7 +621,7 @@ public override string ToString() public sealed class DateTimeZoneType : PrimitiveType { - private volatile static DateTimeZoneType _instance; + private static volatile DateTimeZoneType _instance; public static DateTimeZoneType Instance { get @@ -656,7 +656,7 @@ public override string ToString() /// public sealed class TimeSpanType : PrimitiveType { - private volatile static TimeSpanType _instance; + private static volatile TimeSpanType _instance; public static TimeSpanType Instance { get @@ -692,11 +692,11 @@ public override string ToString() /// meaningful. Examples are SSNs, phone numbers, auto-generated/incremented key values, /// class numbers, etc. For example, in multi-class classification, the label is typically /// a class number which is naturally a KeyType. - /// + /// /// KeyTypes can be contiguous (the class number example), in which case they can have /// a cardinality/Count. For non-contiguous KeyTypes the Count property returns zero. /// Any KeyType (contiguous or not) can have a Min value. The Min value is always >= 0. - /// + /// /// Note that the representation value does not necessarily match the logical value. /// For example, if a KeyType has range 1000-5000, then it has a Min of 1000, Count /// of 4001, but the representational values are 1-4001. The representation value zero @@ -951,7 +951,7 @@ public bool IsSubtypeOf(VectorType other) if (other == null) return false; - // REVIEW: Perhaps we should allow the case when _itemType is + // REVIEW: Perhaps we should allow the case when _itemType is // a sub-type of other._itemType (in particular for key types) if (!_itemType.Equals(other._itemType)) return false; diff --git a/src/Microsoft.ML.Core/Data/DataKind.cs b/src/Microsoft.ML.Core/Data/DataKind.cs index 5ed5ded1c1..32325f44a1 100644 --- a/src/Microsoft.ML.Core/Data/DataKind.cs +++ b/src/Microsoft.ML.Core/Data/DataKind.cs @@ -30,7 +30,7 @@ public enum DataKind : byte Num = R4, TX = 11, -#pragma warning disable TLC_GeneralName // The data kind enum has its own logic, independnet of C# naming conventions. +#pragma warning disable MSML_GeneralName // The data kind enum has its own logic, independnet of C# naming conventions. TXT = TX, Text = TX, @@ -46,7 +46,7 @@ public enum DataKind : byte UG = 16, // Unsigned 16-byte integer. U16 = UG, -#pragma warning restore TLC_GeneralName +#pragma warning restore MSML_GeneralName } /// @@ -83,22 +83,22 @@ public static ulong ToMaxInt(this DataKind kind) { switch (kind) { - case DataKind.I1: - return (ulong)sbyte.MaxValue; - case DataKind.U1: - return byte.MaxValue; - case DataKind.I2: - return (ulong)short.MaxValue; - case DataKind.U2: - return ushort.MaxValue; - case DataKind.I4: - return int.MaxValue; - case DataKind.U4: - return uint.MaxValue; - case DataKind.I8: - return long.MaxValue; - case DataKind.U8: - return ulong.MaxValue; + case DataKind.I1: + return (ulong)sbyte.MaxValue; + case DataKind.U1: + return byte.MaxValue; + case DataKind.I2: + return (ulong)short.MaxValue; + case DataKind.U2: + return ushort.MaxValue; + case DataKind.I4: + return int.MaxValue; + case DataKind.U4: + return uint.MaxValue; + case DataKind.I8: + return long.MaxValue; + case DataKind.U8: + return ulong.MaxValue; } return 0; @@ -112,22 +112,22 @@ public static long ToMinInt(this DataKind kind) { switch (kind) { - case DataKind.I1: - return sbyte.MinValue; - case DataKind.U1: - return byte.MinValue; - case DataKind.I2: - return short.MinValue; - case DataKind.U2: - return ushort.MinValue; - case DataKind.I4: - return int.MinValue; - case DataKind.U4: - return uint.MinValue; - case DataKind.I8: - return long.MinValue; - case DataKind.U8: - return 0; + case DataKind.I1: + return sbyte.MinValue; + case DataKind.U1: + return byte.MinValue; + case DataKind.I2: + return short.MinValue; + case DataKind.U2: + return ushort.MinValue; + case DataKind.I4: + return int.MinValue; + case DataKind.U4: + return uint.MinValue; + case DataKind.I8: + return long.MinValue; + case DataKind.U8: + return 0; } return 1; @@ -140,38 +140,38 @@ public static Type ToType(this DataKind kind) { switch (kind) { - case DataKind.I1: - return typeof(DvInt1); - case DataKind.U1: - return typeof(byte); - case DataKind.I2: - return typeof(DvInt2); - case DataKind.U2: - return typeof(ushort); - case DataKind.I4: - return typeof(DvInt4); - case DataKind.U4: - return typeof(uint); - case DataKind.I8: - return typeof(DvInt8); - case DataKind.U8: - return typeof(ulong); - case DataKind.R4: - return typeof(Single); - case DataKind.R8: - return typeof(Double); - case DataKind.TX: - return typeof(DvText); - case DataKind.BL: - return typeof(DvBool); - case DataKind.TS: - return typeof(DvTimeSpan); - case DataKind.DT: - return typeof(DvDateTime); - case DataKind.DZ: - return typeof(DvDateTimeZone); - case DataKind.UG: - return typeof(UInt128); + case DataKind.I1: + return typeof(DvInt1); + case DataKind.U1: + return typeof(byte); + case DataKind.I2: + return typeof(DvInt2); + case DataKind.U2: + return typeof(ushort); + case DataKind.I4: + return typeof(DvInt4); + case DataKind.U4: + return typeof(uint); + case DataKind.I8: + return typeof(DvInt8); + case DataKind.U8: + return typeof(ulong); + case DataKind.R4: + return typeof(Single); + case DataKind.R8: + return typeof(Double); + case DataKind.TX: + return typeof(DvText); + case DataKind.BL: + return typeof(DvBool); + case DataKind.TS: + return typeof(DvTimeSpan); + case DataKind.DT: + return typeof(DvDateTime); + case DataKind.DZ: + return typeof(DvDateTimeZone); + case DataKind.UG: + return typeof(UInt128); } return null; @@ -185,29 +185,29 @@ public static bool TryGetDataKind(this Type type, out DataKind kind) Contracts.CheckValueOrNull(type); // REVIEW: Make this more efficient. Should we have a global dictionary? - if (type == typeof(DvInt1)) + if (type == typeof(DvInt1) || type == typeof(sbyte) || type == typeof(sbyte?)) kind = DataKind.I1; - else if (type == typeof(byte)) + else if (type == typeof(byte) || type == typeof(byte?)) kind = DataKind.U1; - else if (type == typeof(DvInt2)) + else if (type == typeof(DvInt2)|| type== typeof(short) || type == typeof(short?)) kind = DataKind.I2; - else if (type == typeof(ushort)) + else if (type == typeof(ushort)|| type == typeof(ushort?)) kind = DataKind.U2; - else if (type == typeof(DvInt4)) + else if (type == typeof(DvInt4) || type == typeof(int)|| type == typeof(int?)) kind = DataKind.I4; - else if (type == typeof(uint)) + else if (type == typeof(uint)|| type == typeof(uint?)) kind = DataKind.U4; - else if (type == typeof(DvInt8)) + else if (type == typeof(DvInt8) || type==typeof(long)|| type == typeof(long?)) kind = DataKind.I8; - else if (type == typeof(ulong)) + else if (type == typeof(ulong)|| type == typeof(ulong?)) kind = DataKind.U8; - else if (type == typeof(Single)) + else if (type == typeof(Single)|| type == typeof(Single?)) kind = DataKind.R4; - else if (type == typeof(Double)) + else if (type == typeof(Double)|| type == typeof(Double?)) kind = DataKind.R8; else if (type == typeof(DvText)) kind = DataKind.TX; - else if (type == typeof(DvBool) || type == typeof(bool) ||type ==typeof(bool?)) + else if (type == typeof(DvBool) || type == typeof(bool) || type == typeof(bool?)) kind = DataKind.BL; else if (type == typeof(DvTimeSpan)) kind = DataKind.TS; @@ -234,38 +234,38 @@ public static string GetString(this DataKind kind) { switch (kind) { - case DataKind.I1: - return "I1"; - case DataKind.I2: - return "I2"; - case DataKind.I4: - return "I4"; - case DataKind.I8: - return "I8"; - case DataKind.U1: - return "U1"; - case DataKind.U2: - return "U2"; - case DataKind.U4: - return "U4"; - case DataKind.U8: - return "U8"; - case DataKind.R4: - return "R4"; - case DataKind.R8: - return "R8"; - case DataKind.BL: - return "BL"; - case DataKind.TX: - return "TX"; - case DataKind.TS: - return "TS"; - case DataKind.DT: - return "DT"; - case DataKind.DZ: - return "DZ"; - case DataKind.UG: - return "UG"; + case DataKind.I1: + return "I1"; + case DataKind.I2: + return "I2"; + case DataKind.I4: + return "I4"; + case DataKind.I8: + return "I8"; + case DataKind.U1: + return "U1"; + case DataKind.U2: + return "U2"; + case DataKind.U4: + return "U4"; + case DataKind.U8: + return "U8"; + case DataKind.R4: + return "R4"; + case DataKind.R8: + return "R8"; + case DataKind.BL: + return "BL"; + case DataKind.TX: + return "TX"; + case DataKind.TS: + return "TS"; + case DataKind.DT: + return "DT"; + case DataKind.DZ: + return "DZ"; + case DataKind.UG: + return "UG"; } return ""; } diff --git a/src/Microsoft.ML.Core/Data/DateTime.cs b/src/Microsoft.ML.Core/Data/DateTime.cs index 52b30b5bb6..d11be2a494 100644 --- a/src/Microsoft.ML.Core/Data/DateTime.cs +++ b/src/Microsoft.ML.Core/Data/DateTime.cs @@ -230,7 +230,7 @@ public DvDateTimeZone(DvDateTime dt, DvTimeSpan offset) /// are within the valid range, and returns a DvDateTime representing the UTC time (dateTime-offset). /// /// The clock time - /// The offset. This value is assumed to be validated as a legal offset: + /// The offset. This value is assumed to be validated as a legal offset: /// a value in whole minutes, between -14 and 14 hours. /// The UTC DvDateTime representing the input clock time minus the offset private static DvDateTime ValidateDate(DvDateTime dateTime, ref DvInt2 offset) diff --git a/src/Microsoft.ML.Core/Data/ICursor.cs b/src/Microsoft.ML.Core/Data/ICursor.cs index 264eaa55bb..e1efc842f4 100644 --- a/src/Microsoft.ML.Core/Data/ICursor.cs +++ b/src/Microsoft.ML.Core/Data/ICursor.cs @@ -18,7 +18,7 @@ public interface ICounted /// This is incremented for ICursor when the underlying contents changes, giving clients a way to detect change. /// Generally it's -1 when the object is in an invalid state. In particular, for an , this is -1 /// when the is or . - /// + /// /// Note that this position is not position within the underlying data, but position of this cursor only. /// If one, for example, opened a set of parallel streaming cursors, or a shuffled cursor, each such cursor's /// first valid entry would always have position 0. @@ -30,7 +30,7 @@ public interface ICounted /// batch numbers should be non-decreasing. Furthermore, any given batch number should only appear in one /// of the streams. Order is determined by batch number. The reconciler ensures that each stream (that is /// still active) has at least one item available, then takes the item with the smallest batch number. - /// + /// /// Note that there is no suggestion that the batches for a particular entry will be consistent from /// cursoring to cursoring, except for the consistency in resulting in the same overall ordering. The same /// entry could have different batch numbers from one cursoring to another. There is also no requirement @@ -45,7 +45,7 @@ public interface ICounted /// will produce the same data as a serial cursor or any other shuffled cursor, only shuffled. The ID /// exists for applications that need to reconcile which entry is actually which. Ideally this ID should /// be unique, but for practical reasons, it suffices if collisions are simply extremely improbable. - /// + /// /// Note that this ID, while it must be consistent for multiple streams according to the semantics /// above, is not considered part of the data per se. So, to take the example of a data view specifically, /// a single data view must render consistent IDs across all cursorings, but there is no suggestion at @@ -77,7 +77,7 @@ public interface ICursor : ICounted, IDisposable /// Returns the state of the cursor. Before the first call to or /// this should be . After /// any call those move functions that returns true, this should return - /// , + /// , /// CursorState State { get; } diff --git a/src/Microsoft.ML.Core/Data/IDataView.cs b/src/Microsoft.ML.Core/Data/IDataView.cs index db83c15fd9..052a07dc9e 100644 --- a/src/Microsoft.ML.Core/Data/IDataView.cs +++ b/src/Microsoft.ML.Core/Data/IDataView.cs @@ -89,7 +89,7 @@ public interface IDataView : ISchematized /// call. This indicates, that the transform does not YET know the number of rows, but /// may in the future. If lazy is false, then this is permitted to do some work (no more /// that it would normally do for cursoring) to determine the number of rows. - /// + /// /// Most components will return the same answer whether lazy is true or false. Some, like /// a cache, might return null until the cache is fully populated (when lazy is true). When /// lazy is false, such a cache would block until the cache was populated. @@ -110,7 +110,7 @@ public interface IDataView : ISchematized /// has no recommendation, and the implementation should have some default behavior to cover /// this case. Note that this is strictly a recommendation: it is entirely possible that /// an implementation can return a different number of cursors. - /// + /// /// The cursors should return the same data as returned through /// , except partitioned: no two cursors /// should return the "same" row as would have been returned through the regular serial cursor, diff --git a/src/Microsoft.ML.Core/Data/IHostEnvironment.cs b/src/Microsoft.ML.Core/Data/IHostEnvironment.cs index 7589ef13ad..b463e52a8e 100644 --- a/src/Microsoft.ML.Core/Data/IHostEnvironment.cs +++ b/src/Microsoft.ML.Core/Data/IHostEnvironment.cs @@ -62,7 +62,7 @@ public interface IHostEnvironment : IChannelProvider, IProgressChannelProvider /// Note that IFileHandle derives from IDisposable. Clients may dispose the IFileHandle when it is /// no longer needed, but they are not required to. The host environment should track all temp file /// handles and ensure that they are disposed properly when the environment is "shut down". - /// + /// /// The suffix and prefix are optional. A common use for suffix is to specify an extension, eg, ".txt". /// The use of suffix and prefix, including whether they have any affect, is up to the host enviroment. /// diff --git a/src/Microsoft.ML.Core/Data/IMlState.cs b/src/Microsoft.ML.Core/Data/IMlState.cs index 98c0e8e5aa..52b0828256 100644 --- a/src/Microsoft.ML.Core/Data/IMlState.cs +++ b/src/Microsoft.ML.Core/Data/IMlState.cs @@ -5,7 +5,7 @@ namespace Microsoft.ML.Runtime.EntryPoints { /// - /// Dummy interface to allow reference to the AutoMlState object in the C# API (since AutoMlState + /// Dummy interface to allow reference to the AutoMlState object in the C# API (since AutoMlState /// has things that reference C# API, leading to circular dependency). Makes state object an opaque /// black box to the graph. The macro itself will then case to the concrete type. /// diff --git a/src/Microsoft.ML.Core/Data/IProgressChannel.cs b/src/Microsoft.ML.Core/Data/IProgressChannel.cs index b5bae12c0b..0f673d9b2a 100644 --- a/src/Microsoft.ML.Core/Data/IProgressChannel.cs +++ b/src/Microsoft.ML.Core/Data/IProgressChannel.cs @@ -10,7 +10,7 @@ namespace Microsoft.ML.Runtime /// This is a factory interface for . /// Both and implement this interface, /// to allow for nested progress reporters. - /// + /// /// REVIEW: make implement this, instead of the environment? /// public interface IProgressChannelProvider @@ -24,10 +24,10 @@ public interface IProgressChannelProvider /// /// A common interface for progress reporting. /// It is expected that the progress channel interface is used from only one thread. - /// + /// /// Supported workflow: /// 1) Create the channel via . - /// 2) Call as many times as desired (including 0). + /// 2) Call as many times as desired (including 0). /// Each call to supersedes the previous one. /// 3) Report checkpoints (0 or more) by calling . /// 4) Repeat steps 2-3 as often as necessary. @@ -39,13 +39,13 @@ public interface IProgressChannel : IProgressChannelProvider, IDisposable /// Set up the reporting structure: /// - Set the 'header' of the progress reports, defining which progress units and metrics are going to be reported. /// - Provide a thread-safe delegate to be invoked whenever anyone needs to know the progress. - /// + /// /// It is acceptable to call multiple times (or none), regardless of whether the calculation is running - /// or not. Because of synchronization, the computation should not deny calls to the 'old' + /// or not. Because of synchronization, the computation should not deny calls to the 'old' /// delegates even after a new one is provided. /// /// The header object. - /// The delegate to provide actual progress. The parameter of + /// The delegate to provide actual progress. The parameter of /// the delegate will correspond to the provided . void SetHeader(ProgressHeader header, Action fillAction); @@ -53,10 +53,10 @@ public interface IProgressChannel : IProgressChannelProvider, IDisposable /// Submit a 'checkpoint' entry. These entries are guaranteed to be delivered to the progress listener, /// if it is interested. Typically, this would contain some intermediate metrics, that are only calculated /// at certain moments ('checkpoints') of the computation. - /// + /// /// For example, SDCA may report a checkpoint every time it computes the loss, or LBFGS may report a checkpoint /// every iteration. - /// + /// /// The only parameter, , is interpreted in the following fashion: /// * First MetricNames.Length items, if present, are metrics. /// * Subsequent ProgressNames.Length items, if present, are progress units. @@ -92,11 +92,11 @@ public sealed class ProgressHeader /// progress or metrics to report, it is always better to report them. /// /// The metrics that the calculation reports. These are completely independent, and there - /// is no contract on whether the metric values should increase or not. As naming convention, + /// is no contract on whether the metric values should increase or not. As naming convention, /// can have multiple words with spaces, and should be title-cased. /// The names of the progress units, listed from least granular to most granular. /// The idea is that the progress should be lexicographically increasing (like [0,0], [0,10], [1,0], [1,15], [2,5] etc.). - /// As naming convention, should be lower-cased and typically plural + /// As naming convention, should be lower-cased and typically plural /// (e.g. iterations, clusters, examples). public ProgressHeader(string[] metricNames, string[] unitNames) { @@ -108,7 +108,7 @@ public ProgressHeader(string[] metricNames, string[] unitNames) } /// - /// A constructor for no metrics, just progress units. As naming convention, should be lower-cased + /// A constructor for no metrics, just progress units. As naming convention, should be lower-cased /// and typically plural (e.g. iterations, clusters, examples). /// public ProgressHeader(params string[] unitNames) @@ -118,7 +118,7 @@ public ProgressHeader(params string[] unitNames) } /// - /// A metric/progress holder item. + /// A metric/progress holder item. /// public interface IProgressEntry { @@ -130,7 +130,7 @@ public interface IProgressEntry /// /// Set the progress value for the index to , - /// and the limit value to . If is a NAN, it is set to null instead. + /// and the limit value to . If is a NAN, it is set to null instead. /// void SetProgress(int index, Double value, Double lim); diff --git a/src/Microsoft.ML.Core/Data/ISchemaBindableMapper.cs b/src/Microsoft.ML.Core/Data/ISchemaBindableMapper.cs index 466611c11a..6adac55f1b 100644 --- a/src/Microsoft.ML.Core/Data/ISchemaBindableMapper.cs +++ b/src/Microsoft.ML.Core/Data/ISchemaBindableMapper.cs @@ -9,15 +9,15 @@ namespace Microsoft.ML.Runtime.Data { /// /// A mapper that can be bound to a (which is an ISchema, with mappings from column kinds - /// to columns). Binding an to a produces an + /// to columns). Binding an to a produces an /// , which is an interface that has methods to return the names and indices of the input columns /// needed by the mapper to compute its output. The is an extention to this interface, that - /// can also produce an output IRow given an input IRow. The IRow produced generally contains only the output columns of the mapper, and not + /// can also produce an output IRow given an input IRow. The IRow produced generally contains only the output columns of the mapper, and not /// the input columns (but there is nothing preventing an from mapping input columns directly to outputs). - /// This interface is implemented by wrappers of IValueMapper based predictors, which are predictors that take a single + /// This interface is implemented by wrappers of IValueMapper based predictors, which are predictors that take a single /// features column. New predictors can implement directly. Implementing /// includes implementing a corresponding (or ) and a corresponding ISchema - /// for the output schema of the . In case the interface is implemented, + /// for the output schema of the . In case the interface is implemented, /// the SimpleRow class can be used in the method. /// public interface ISchemaBindableMapper @@ -54,7 +54,7 @@ public interface ISchemaBoundMapper /// /// This interface extends with an additional method: . This method - /// takes an input IRow and a predicate indicating which output columns are active, and returns a new IRow + /// takes an input IRow and a predicate indicating which output columns are active, and returns a new IRow /// containing the output columns. /// public interface ISchemaBoundRowMapper : ISchemaBoundMapper @@ -67,11 +67,11 @@ public interface ISchemaBoundRowMapper : ISchemaBoundMapper /// /// Get an IRow based on the input IRow with the indicated active columns. The active columns are those for which - /// predicate(col) returns true. The schema of the returned IRow will be the same as the OutputSchema, but getting + /// predicate(col) returns true. The schema of the returned IRow will be the same as the OutputSchema, but getting /// values on inactive columns will throw. Null predicates are disallowed. /// The schema of input should match the InputSchema. /// This method creates a live connection between the input IRow and the output IRow. In particular, when the - /// getters of the output IRow are invoked, they invoke the getters of the input row and base the output values on + /// getters of the output IRow are invoked, they invoke the getters of the input row and base the output values on /// the current values of the input IRow. The output IRow values are re-computed when requested through the getters. /// The optional disposer is invoked by the cursor wrapping, when it no longer needs the IRow. /// If no action is needed when the cursor is Disposed, the override should set disposer to null, @@ -101,7 +101,7 @@ public interface IRowToRowMapper /// predicate(col) returns true. Getting values on inactive columns will throw. Null predicates are disallowed. /// The schema of input should match the InputSchema. /// This method creates a live connection between the input IRow and the output IRow. In particular, when the - /// getters of the output IRow are invoked, they invoke the getters of the input row and base the output values on + /// getters of the output IRow are invoked, they invoke the getters of the input row and base the output values on /// the current values of the input IRow. The output IRow values are re-computed when requested through the getters. /// The optional disposer is invoked by the cursor wrapping, when it no longer needs the IRow. /// If no action is needed when the cursor is Disposed, the override should set disposer to null, diff --git a/src/Microsoft.ML.Core/Data/ITrainerArguments.cs b/src/Microsoft.ML.Core/Data/ITrainerArguments.cs index af74a9abfc..e4fdbbdc59 100644 --- a/src/Microsoft.ML.Core/Data/ITrainerArguments.cs +++ b/src/Microsoft.ML.Core/Data/ITrainerArguments.cs @@ -6,7 +6,7 @@ namespace Microsoft.ML.Runtime { // This is basically a no-op interface put in primarily // for backward binary compat support for AFx. - // REVIEW: This interface was removed in TLC 3.0 as part of the + // REVIEW: This interface was removed in TLC 3.0 as part of the // deprecation of the *Factory interfaces, but added back as a temporary // hack. Remove it asap. public interface ITrainerArguments diff --git a/src/Microsoft.ML.Core/Data/MetadataUtils.cs b/src/Microsoft.ML.Core/Data/MetadataUtils.cs index 04f31d844a..116d521756 100644 --- a/src/Microsoft.ML.Core/Data/MetadataUtils.cs +++ b/src/Microsoft.ML.Core/Data/MetadataUtils.cs @@ -74,9 +74,9 @@ public static class Kinds /// /// Metadata kind that indicates the ranges within a column that are categorical features. - /// The value is a vector type of ints with dimension of two. The first dimension + /// The value is a vector type of ints with dimension of two. The first dimension /// represents the number of categorical features and second dimension represents the range - /// and is of size two. The range has start and end index(both inclusive) of categorical + /// and is of size two. The range has start and end index(both inclusive) of categorical /// slots within that column. /// public const string CategoricalSlotRanges = "CategoricalSlotRanges"; @@ -156,7 +156,7 @@ public static VectorType GetNamesType(int size) } /// - /// Returns a vector type with item type int and the given size. + /// Returns a vector type with item type int and the given size. /// The range count must be a positive integer. /// This is a standard type for metadata consisting of multiple int values that represent /// categorical slot ranges with in a column. @@ -312,7 +312,6 @@ public static bool HasSlotNames(this ISchema schema, int col, int vectorSize) public static void GetSlotNames(RoleMappedSchema schema, RoleMappedSchema.ColumnRole role, int vectorSize, ref VBuffer slotNames) { Contracts.CheckValueOrNull(schema); - Contracts.CheckValue(role.Value, nameof(role)); Contracts.CheckParam(vectorSize >= 0, nameof(vectorSize)); IReadOnlyList list; @@ -335,6 +334,22 @@ public static bool HasKeyNames(this ISchema schema, int col, int keyCount) && type.ItemType.IsText; } + /// + /// Returns whether a column has the metadata set to true. + /// That metadata should be set when the data has undergone transforms that would render it + /// "normalized." + /// + /// The schema to query + /// Which column in the schema to query + /// True if and only if the column has the metadata + /// set to the scalar value + public static bool IsNormalized(this ISchema schema, int col) + { + Contracts.CheckValue(schema, nameof(schema)); + var value = default(DvBool); + return schema.TryGetMetadata(BoolType.Instance, Kinds.IsNormalized, col, ref value) && value.IsTrue; + } + /// /// Tries to get the metadata kind of the specified type for a column. /// @@ -347,6 +362,9 @@ public static bool HasKeyNames(this ISchema schema, int col, int keyCount) /// True if the metadata of the right type exists, false otherwise public static bool TryGetMetadata(this ISchema schema, PrimitiveType type, string kind, int col, ref T value) { + Contracts.CheckValue(schema, nameof(schema)); + Contracts.CheckValue(type, nameof(type)); + var metadataType = schema.GetMetadataTypeOrNull(kind, col); if (!type.Equals(metadataType)) return false; @@ -363,17 +381,17 @@ public static bool IsHidden(this ISchema schema, int col) string name = schema.GetColumnName(col); int top; bool tmp = schema.TryGetColumnIndex(name, out top); - Contracts.Assert(tmp, "Why did TryGetColumnIndex return false?"); + Contracts.Assert(tmp); // This would only be false if the implementation of schema were buggy. return !tmp || top != col; } /// - /// The categoricalFeatures is a vector of the indices of categorical features slots. + /// The categoricalFeatures is a vector of the indices of categorical features slots. /// This vector should always have an even number of elements, and the elements should be parsed in groups of two consecutive numbers. /// So if its value is the range of numbers: 0,2,3,4,8,9 /// look at it as [0,2],[3,4],[8,9]. /// The way to interpret that is: feature with indices 0, 1, and 2 are one categorical - /// Features with indices 3 and 4 are another categorical. Features 5 and 6 don't appear there, so they are not categoricals. + /// Features with indices 3 and 4 are another categorical. Features 5 and 6 don't appear there, so they are not categoricals. /// public static bool TryGetCategoricalFeatureIndices(ISchema schema, int colIndex, out int[] categoricalFeatures) { diff --git a/src/Microsoft.ML.Core/Data/ProgressReporter.cs b/src/Microsoft.ML.Core/Data/ProgressReporter.cs index 384e1bfb61..5f9575cca5 100644 --- a/src/Microsoft.ML.Core/Data/ProgressReporter.cs +++ b/src/Microsoft.ML.Core/Data/ProgressReporter.cs @@ -202,8 +202,8 @@ private ProgressEntry BuildJointEntry(ProgressEntry rootEntry) /// /// This is a 'derived' or 'subordinate' progress channel. - /// - /// The subordinates' Start/Stop events and checkpoints will not be propagated. + /// + /// The subordinates' Start/Stop events and checkpoints will not be propagated. /// When the status is requested, all of the subordinate channels are also invoked, /// and the resulting metrics are then returned in the order of their 'subordinate level'. /// If there's more than one channel with the same level, the order is not defined. @@ -278,7 +278,7 @@ private void Stop() public void Checkpoint(params Double?[] values) { // We are ignoring all checkpoints from subordinates. - // REVIEW: maybe this could be changed in the future. Right now it seems that + // REVIEW: maybe this could be changed in the future. Right now it seems that // this limitation is reasonable. } } @@ -287,7 +287,7 @@ public void Checkpoint(params Double?[] values) /// /// This class listens to the progress reporting channels, caches all checkpoints and /// start/stop events and, on demand, requests current progress on all active calculations. - /// + /// /// The public methods of this class should only be called from one thread. /// public sealed class ProgressTracker @@ -303,7 +303,7 @@ public sealed class ProgressTracker /// /// For each calculation, its properties. /// This list is protected by , and it's updated every time a new calculation starts. - /// The entries are cleaned up when the start and stop events are reported (that is, after the first + /// The entries are cleaned up when the start and stop events are reported (that is, after the first /// pull request after the calculation's 'Stop' event). /// private readonly List _infos; @@ -319,8 +319,8 @@ public sealed class ProgressTracker private readonly HashSet _namesUsed; /// - /// This class is an 'event log' for one calculation. - /// + /// This class is an 'event log' for one calculation. + /// /// Every time a calculation is 'started', it gets its own log, so if there are multiple 'start' calls, /// there will be multiple logs. /// @@ -425,12 +425,12 @@ public void Log(ProgressChannel source, ProgressEvent.EventKind kind, ProgressEn } /// - /// Get progress reports from all current calculations. + /// Get progress reports from all current calculations. /// For every calculation the following events will be returned: /// * A start event. /// * Each checkpoint. - /// * If the calculation is finished, the stop event. - /// + /// * If the calculation is finished, the stop event. + /// /// Each of the above events will be returned exactly once. /// If, for one calculation, there's no events in the above categories, the tracker will /// request ('pull') the current progress and return this as an event. @@ -490,14 +490,14 @@ public sealed class ProgressEntry : IProgressEntry /// /// The actual progress (amount of completed units), in the units that are contained in the header. /// Parallel to the header's . Null value indicates 'not applicable now'. - /// + /// /// The computation should not modify these arrays directly, and instead rely on , /// and . /// public readonly Double?[] Progress; /// - /// The lim values of each progress unit. + /// The lim values of each progress unit. /// Parallel to the header's . Null value indicates unbounded or unknown. /// public readonly Double?[] ProgressLim; diff --git a/src/Microsoft.ML.Core/Data/RoleMappedSchema.cs b/src/Microsoft.ML.Core/Data/RoleMappedSchema.cs index 7d609454bf..2e35be86b7 100644 --- a/src/Microsoft.ML.Core/Data/RoleMappedSchema.cs +++ b/src/Microsoft.ML.Core/Data/RoleMappedSchema.cs @@ -2,15 +2,17 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using System.Collections.Generic; using Microsoft.ML.Runtime.Internal.Utilities; namespace Microsoft.ML.Runtime.Data { /// - /// This contains information about a column in an IDataView. It is essentially a convenience - /// cache containing the name, column index, and column type for the column. + /// This contains information about a column in an . It is essentially a convenience cache + /// containing the name, column index, and column type for the column. The intended usage is that users of + /// will have a convenient method of getting the index and type without having to separately query it through the , + /// since practically the first thing a consumer of a will want to do once they get a mappping is get + /// the type and index of the corresponding column. /// public sealed class ColumnInfo { @@ -31,9 +33,8 @@ private ColumnInfo(string name, int index, ColumnType type) /// public static ColumnInfo CreateFromName(ISchema schema, string name, string descName) { - ColumnInfo colInfo; - if (!TryCreateFromName(schema, name, out colInfo)) - throw Contracts.ExceptParam(nameof(name), "{0} column '{1}' not found", descName, name); + if (!TryCreateFromName(schema, name, out var colInfo)) + throw Contracts.ExceptParam(nameof(name), $"{descName} column '{name}' not found"); return colInfo; } @@ -48,8 +49,7 @@ public static bool TryCreateFromName(ISchema schema, string name, out ColumnInfo Contracts.CheckNonEmpty(name, nameof(name)); colInfo = null; - int index; - if (!schema.TryGetColumnIndex(name, out index)) + if (!schema.TryGetColumnIndex(name, out int index)) return false; colInfo = new ColumnInfo(name, index, schema.GetColumnType(index)); @@ -71,13 +71,34 @@ public static ColumnInfo CreateFromIndex(ISchema schema, int index) } /// - /// Encapsulates an ISchema plus column role mapping information. It has convenience fields for - /// several common column roles, but can hold an arbitrary set of column infos. The convenience - /// fields are non-null iff there is a unique column with the corresponding role. When there are - /// no such columns or more than one such column, the field is null. The Has, HasUnique, and - /// HasMultiple methods provide some cardinality information. - /// Note that all columns assigned roles are guaranteed to be non-hidden in this schema. + /// Encapsulates an plus column role mapping information. The purpose of role mappings is to + /// provide information on what the intended usage is for. That is: while a given data view may have a column named + /// "Features", by itself that is insufficient: the trainer must be fed a role mapping that says that the role + /// mapping for features is filled by that "Features" column. This allows things like columns not named "Features" + /// to actually fill that role (as opposed to insisting on a hard coding, or having every trainer have to be + /// individually configured). Also, by being a one-to-many mapping, it is a way for learners that can consume + /// multiple features columns to consume that information. + /// + /// This class has convenience fields for several common column roles (se.g., , ), but can hold an arbitrary set of column infos. The convenience fields are non-null if and only + /// if there is a unique column with the corresponding role. When there are no such columns or more than one such + /// column, the field is null. The , , and + /// methods provide some cardinality information. Note that all columns assigned roles are guaranteed to be non-hidden + /// in this schema. /// + /// + /// Note that instances of this class are, like instances of , immutable. + /// + /// It is often the case that one wishes to bundle the actual data with the role mappings, not just the schema. For + /// that case, please use the class. + /// + /// Note that there is no need for components consuming a or + /// to make use of every defined mapping. Consuming components are also expected to ignore any + /// they do not handle. They may very well however complain if a mapping they wanted to see is not present, or the column(s) + /// mapped from the role are not of the form they require. + /// + /// + /// public sealed class RoleMappedSchema { private const string FeatureString = "Feature"; @@ -85,21 +106,59 @@ public sealed class RoleMappedSchema private const string GroupString = "Group"; private const string WeightString = "Weight"; private const string NameString = "Name"; - private const string IdString = "Id"; private const string FeatureContributionsString = "FeatureContributions"; + /// + /// Instances of this are the keys of a . This class also holds some important + /// commonly used pre-defined instances available (e.g., , ) that should + /// be used when possible for consistency reasons. However, practitioners should not be afraid to declare custom + /// roles if approppriate for their task. + /// public struct ColumnRole { - public static ColumnRole Feature { get { return new ColumnRole(FeatureString); } } - public static ColumnRole Label { get { return new ColumnRole(LabelString); } } - public static ColumnRole Group { get { return new ColumnRole(GroupString); } } - public static ColumnRole Weight { get { return new ColumnRole(WeightString); } } - public static ColumnRole Name { get { return new ColumnRole(NameString); } } - public static ColumnRole Id { get { return new ColumnRole(IdString); } } - public static ColumnRole FeatureContributions { get { return new ColumnRole(FeatureContributionsString); } } - + /// + /// Role for features. Commonly used as the independent variables given to trainers, and scorers. + /// + public static ColumnRole Feature => FeatureString; + + /// + /// Role for labels. Commonly used as the dependent variables given to trainers, and evaluators. + /// + public static ColumnRole Label => LabelString; + + /// + /// Role for group ID. Commonly used in ranking applications, for defining query boundaries, or + /// sequence classification, for defining the boundaries of an utterance. + /// + public static ColumnRole Group => GroupString; + + /// + /// Role for sample weights. Commonly used to point to a number to make trainers give more weight + /// to a particular example. + /// + public static ColumnRole Weight => WeightString; + + /// + /// Role for sample names. Useful for informational and tracking purposes when scoring, but typically + /// without affecting results. + /// + public static ColumnRole Name => NameString; + + // REVIEW: Does this really belong here? + /// + /// Role for feature contributions. Useful for specific diagnostic functionality. + /// + public static ColumnRole FeatureContributions => FeatureContributionsString; + + /// + /// The string value for the role. Guaranteed to be non-empty. + /// public readonly string Value; + /// + /// Constructor for the column role. + /// + /// The value for the role. Must be non-empty. public ColumnRole(string value) { Contracts.CheckNonEmpty(value, nameof(value)); @@ -107,55 +166,51 @@ public ColumnRole(string value) } public static implicit operator ColumnRole(string value) - { - return new ColumnRole(value); - } - + => new ColumnRole(value); + + /// + /// Convenience method for creating a mapping pair from a role to a column name + /// for giving to constructors of and . + /// + /// The column name to map to. Can be null, in which case when used + /// to construct a role mapping structure this pair will be ignored + /// A key-value pair with this instance as the key and as the value public KeyValuePair Bind(string name) - { - return new KeyValuePair(this, name); - } + => new KeyValuePair(this, name); } public static KeyValuePair CreatePair(ColumnRole role, string name) - { - return new KeyValuePair(role, name); - } - - /// - /// The source ISchema. - /// - public readonly ISchema Schema; + => new KeyValuePair(role, name); /// - /// The Feature column, when there is exactly one (null otherwise). + /// The source . /// - public readonly ColumnInfo Feature; + public ISchema Schema { get; } /// - /// The Label column, when there is exactly one (null otherwise). + /// The column, when there is exactly one (null otherwise). /// - public readonly ColumnInfo Label; + public ColumnInfo Feature { get; } /// - /// The Group column, when there is exactly one (null otherwise). + /// The column, when there is exactly one (null otherwise). /// - public readonly ColumnInfo Group; + public ColumnInfo Label { get; } /// - /// The Weight column, when there is exactly one (null otherwise). + /// The column, when there is exactly one (null otherwise). /// - public readonly ColumnInfo Weight; + public ColumnInfo Group { get; } /// - /// The Name column, when there is exactly one (null otherwise). + /// The column, when there is exactly one (null otherwise). /// - public readonly ColumnInfo Name; + public ColumnInfo Weight { get; } /// - /// The Id column, when there is exactly one (null otherwise). + /// The column, when there is exactly one (null otherwise). /// - public readonly ColumnInfo Id; + public ColumnInfo Name { get; } // Maps from role to the associated column infos. private readonly Dictionary> _map; @@ -179,24 +234,21 @@ private RoleMappedSchema(ISchema schema, Dictionary> map, ColumnRole rol Contracts.AssertNonEmpty(role.Value); Contracts.AssertValue(info); - List list; - if (!map.TryGetValue(role.Value, out list)) + if (!map.TryGetValue(role.Value, out var list)) { list = new List(); map.Add(role.Value, list); @@ -222,36 +273,21 @@ private static void Add(Dictionary> map, ColumnRole rol list.Add(info); } - private static Dictionary> MapFromNames(ISchema schema, IEnumerable> roles) - { - Contracts.AssertValue(schema, "schema"); - Contracts.AssertValue(roles, "roles"); - - var map = new Dictionary>(); - foreach (var kvp in roles) - { - Contracts.CheckNonEmpty(kvp.Key.Value, nameof(roles), "Bad column role"); - if (string.IsNullOrEmpty(kvp.Value)) - continue; - var info = ColumnInfo.CreateFromName(schema, kvp.Value, kvp.Key.Value); - Add(map, kvp.Key.Value, info); - } - return map; - } - - private static Dictionary> MapFromNamesOpt(ISchema schema, IEnumerable> roles) + private static Dictionary> MapFromNames(ISchema schema, IEnumerable> roles, bool opt = false) { - Contracts.AssertValue(schema, "schema"); - Contracts.AssertValue(roles, "roles"); + Contracts.AssertValue(schema); + Contracts.AssertValue(roles); var map = new Dictionary>(); foreach (var kvp in roles) { - Contracts.CheckNonEmpty(kvp.Key.Value, nameof(roles), "Bad column role"); + Contracts.AssertNonEmpty(kvp.Key.Value); if (string.IsNullOrEmpty(kvp.Value)) continue; ColumnInfo info; - if (!ColumnInfo.TryCreateFromName(schema, kvp.Value, out info)) + if (!opt) + info = ColumnInfo.CreateFromName(schema, kvp.Value, kvp.Key.Value); + else if (!ColumnInfo.TryCreateFromName(schema, kvp.Value, out info)) continue; Add(map, kvp.Key.Value, info); } @@ -262,39 +298,26 @@ private static Dictionary> MapFromNamesOpt(ISchema sche /// Returns whether there are any columns with the given column role. /// public bool Has(ColumnRole role) - { - return role.Value != null && _map.ContainsKey(role.Value); - } + => _map.ContainsKey(role.Value); /// /// Returns whether there is exactly one column of the given role. /// public bool HasUnique(ColumnRole role) - { - IReadOnlyList cols; - return role.Value != null && _map.TryGetValue(role.Value, out cols) && cols.Count == 1; - } + => _map.TryGetValue(role.Value, out var cols) && cols.Count == 1; /// /// Returns whether there are two or more columns of the given role. /// public bool HasMultiple(ColumnRole role) - { - IReadOnlyList cols; - return role.Value != null && _map.TryGetValue(role.Value, out cols) && cols.Count > 1; - } + => _map.TryGetValue(role.Value, out var cols) && cols.Count > 1; /// /// If there are columns of the given role, this returns the infos as a readonly list. Otherwise, /// it returns null. /// public IReadOnlyList GetColumns(ColumnRole role) - { - IReadOnlyList list; - if (role.Value != null && _map.TryGetValue(role.Value, out list)) - return list; - return null; - } + => _map.TryGetValue(role.Value, out var list) ? list : null; /// /// An enumerable over all role-column associations within this object. @@ -326,14 +349,20 @@ public IEnumerable> GetColumnRoleNames() /// public IEnumerable> GetColumnRoleNames(ColumnRole role) { - IReadOnlyList list; - if (role.Value != null && _map.TryGetValue(role.Value, out list)) + if (_map.TryGetValue(role.Value, out var list)) { foreach (var info in list) yield return new KeyValuePair(role, info.Name); } } + /// + /// Returns the corresponding to if there is + /// exactly one such mapping, and otherwise throws an exception. + /// + /// The role to look up + /// The info corresponding to that role, assuming there was only one column + /// mapped to that public ColumnInfo GetUniqueColumn(ColumnRole role) { var infos = GetColumns(role); @@ -355,64 +384,102 @@ private static Dictionary> Copy(Dictionary - /// Creates a RoleMappedSchema from the given schema with no column role assignments. + /// Constructor given a schema, and mapping pairs of roles to columns in the schema. + /// This skips null or empty column-names. It will also skip column-names that are not + /// found in the schema if is true. /// - public static RoleMappedSchema Create(ISchema schema) + /// The schema over which roles are defined + /// Whether to consider the column names specified "optional" or not. If false then any non-empty + /// values for the column names that does not appear in will result in an exception being thrown, + /// but if true such values will be ignored + /// The column role to column name mappings + public RoleMappedSchema(ISchema schema, bool opt = false, params KeyValuePair[] roles) + : this(Contracts.CheckRef(schema, nameof(schema)), Contracts.CheckRef(roles, nameof(roles)), opt) { - Contracts.CheckValue(schema, nameof(schema)); - return new RoleMappedSchema(schema, new Dictionary>()); } /// - /// Creates a RoleMappedSchema from the given schema and role/column-name pairs. - /// This skips null or empty column-names. + /// Constructor given a schema, and mapping pairs of roles to columns in the schema. + /// This skips null or empty column names. It will also skip column-names that are not + /// found in the schema if is true. /// - public static RoleMappedSchema Create(ISchema schema, params KeyValuePair[] roles) + /// The schema over which roles are defined + /// The column role to column name mappings + /// Whether to consider the column names specified "optional" or not. If false then any non-empty + /// values for the column names that does not appear in will result in an exception being thrown, + /// but if true such values will be ignored + public RoleMappedSchema(ISchema schema, IEnumerable> roles, bool opt = false) + : this(Contracts.CheckRef(schema, nameof(schema)), + MapFromNames(schema, Contracts.CheckRef(roles, nameof(roles)), opt)) { - Contracts.CheckValue(schema, nameof(schema)); - Contracts.CheckValue(roles, nameof(roles)); - return new RoleMappedSchema(schema, MapFromNames(schema, roles)); } - /// - /// Creates a RoleMappedSchema from the given schema and role/column-name pairs. - /// This skips null or empty column-names. - /// - public static RoleMappedSchema Create(ISchema schema, IEnumerable> roles) + private static IEnumerable> PredefinedRolesHelper( + string label, string feature, string group, string weight, string name, + IEnumerable> custom = null) { - Contracts.CheckValue(schema, nameof(schema)); - Contracts.CheckValue(roles, nameof(roles)); - return new RoleMappedSchema(schema, MapFromNames(schema, roles)); + if (!string.IsNullOrWhiteSpace(label)) + yield return ColumnRole.Label.Bind(label); + if (!string.IsNullOrWhiteSpace(feature)) + yield return ColumnRole.Feature.Bind(feature); + if (!string.IsNullOrWhiteSpace(group)) + yield return ColumnRole.Group.Bind(group); + if (!string.IsNullOrWhiteSpace(weight)) + yield return ColumnRole.Weight.Bind(weight); + if (!string.IsNullOrWhiteSpace(name)) + yield return ColumnRole.Name.Bind(name); + if (custom != null) + { + foreach (var role in custom) + yield return role; + } } /// - /// Creates a RoleMappedSchema from the given schema and role/column-name pairs. - /// This skips null or empty column-names, or column-names that are not found in the schema. + /// Convenience constructor for role-mappings over the commonly used roles. Note that if any column name specified + /// is null or whitespace, it is ignored. /// - public static RoleMappedSchema CreateOpt(ISchema schema, IEnumerable> roles) + /// The schema over which roles are defined + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// Any additional desired custom column role mappings + /// Whether to consider the column names specified "optional" or not. If false then any non-empty + /// values for the column names that does not appear in will result in an exception being thrown, + /// but if true such values will be ignored + public RoleMappedSchema(ISchema schema, string label, string feature, + string group = null, string weight = null, string name = null, + IEnumerable> custom = null, bool opt = false) + : this(Contracts.CheckRef(schema, nameof(schema)), PredefinedRolesHelper(label, feature, group, weight, name, custom), opt) { - Contracts.CheckValue(schema, nameof(schema)); - Contracts.CheckValue(roles, nameof(roles)); - return new RoleMappedSchema(schema, MapFromNamesOpt(schema, roles)); + Contracts.CheckValueOrNull(label); + Contracts.CheckValueOrNull(feature); + Contracts.CheckValueOrNull(group); + Contracts.CheckValueOrNull(weight); + Contracts.CheckValueOrNull(name); + Contracts.CheckValueOrNull(custom); } } /// - /// Encapsulates an IDataView plus a corresponding RoleMappedSchema. Note that the schema of the - /// RoleMappedSchema is guaranteed to be the same schema of the IDataView, that is, - /// Data.Schema == Schema.Schema. + /// Encapsulates an plus a corresponding . + /// Note that the schema of of is + /// guaranteed to equal the the of . /// public sealed class RoleMappedData { /// /// The data. /// - public readonly IDataView Data; + public IDataView Data { get; } /// - /// The role mapped schema. Note that Schema.Schema is guaranteed to be the same as Data.Schema. + /// The role mapped schema. Note that 's is + /// guaranteed to be the same as 's . /// - public readonly RoleMappedSchema Schema; + public RoleMappedSchema Schema { get; } private RoleMappedData(IDataView data, RoleMappedSchema schema) { @@ -424,45 +491,61 @@ private RoleMappedData(IDataView data, RoleMappedSchema schema) } /// - /// Creates a RoleMappedData from the given data with no column role assignments. - /// - public static RoleMappedData Create(IDataView data) - { - Contracts.CheckValue(data, nameof(data)); - return new RoleMappedData(data, RoleMappedSchema.Create(data.Schema)); - } - - /// - /// Creates a RoleMappedData from the given schema and role/column-name pairs. - /// This skips null or empty column-names. + /// Constructor given a data view, and mapping pairs of roles to columns in the data view's schema. + /// This skips null or empty column-names. It will also skip column-names that are not + /// found in the schema if is true. /// - public static RoleMappedData Create(IDataView data, params KeyValuePair[] roles) + /// The data over which roles are defined + /// Whether to consider the column names specified "optional" or not. If false then any non-empty + /// values for the column names that does not appear in 's schema will result in an exception being thrown, + /// but if true such values will be ignored + /// The column role to column name mappings + public RoleMappedData(IDataView data, bool opt = false, params KeyValuePair[] roles) + : this(Contracts.CheckRef(data, nameof(data)), new RoleMappedSchema(data.Schema, Contracts.CheckRef(roles, nameof(roles)), opt)) { - Contracts.CheckValue(data, nameof(data)); - Contracts.CheckValue(roles, nameof(roles)); - return new RoleMappedData(data, RoleMappedSchema.Create(data.Schema, roles)); } /// - /// Creates a RoleMappedData from the given schema and role/column-name pairs. - /// This skips null or empty column-names. + /// Constructor given a data view, and mapping pairs of roles to columns in the data view's schema. + /// This skips null or empty column-names. It will also skip column-names that are not + /// found in the schema if is true. /// - public static RoleMappedData Create(IDataView data, IEnumerable> roles) + /// The schema over which roles are defined + /// The column role to column name mappings + /// Whether to consider the column names specified "optional" or not. If false then any non-empty + /// values for the column names that does not appear in 's schema will result in an exception being thrown, + /// but if true such values will be ignored + public RoleMappedData(IDataView data, IEnumerable> roles, bool opt = false) + : this(Contracts.CheckRef(data, nameof(data)), new RoleMappedSchema(data.Schema, Contracts.CheckRef(roles, nameof(roles)), opt)) { - Contracts.CheckValue(data, nameof(data)); - Contracts.CheckValue(roles, nameof(roles)); - return new RoleMappedData(data, RoleMappedSchema.Create(data.Schema, roles)); } /// - /// Creates a RoleMappedData from the given schema and role/column-name pairs. - /// This skips null or empty column-names, or column-names that are not found in the schema. + /// Convenience constructor for role-mappings over the commonly used roles. Note that if any column name specified + /// is null or whitespace, it is ignored. /// - public static RoleMappedData CreateOpt(IDataView data, IEnumerable> roles) + /// The data over which roles are defined + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// The column name that will be mapped to the role + /// Any additional desired custom column role mappings + /// Whether to consider the column names specified "optional" or not. If false then any non-empty + /// values for the column names that does not appear in 's schema will result in an exception being thrown, + /// but if true such values will be ignored + public RoleMappedData(IDataView data, string label, string feature, + string group = null, string weight = null, string name = null, + IEnumerable> custom = null, bool opt = false) + : this(Contracts.CheckRef(data, nameof(data)), + new RoleMappedSchema(data.Schema, label, feature, group, weight, name, custom, opt)) { - Contracts.CheckValue(data, nameof(data)); - Contracts.CheckValue(roles, nameof(roles)); - return new RoleMappedData(data, RoleMappedSchema.CreateOpt(data.Schema, roles)); + Contracts.CheckValueOrNull(label); + Contracts.CheckValueOrNull(feature); + Contracts.CheckValueOrNull(group); + Contracts.CheckValueOrNull(weight); + Contracts.CheckValueOrNull(name); + Contracts.CheckValueOrNull(custom); } } } \ No newline at end of file diff --git a/src/Microsoft.ML.Core/Data/RootCursorBase.cs b/src/Microsoft.ML.Core/Data/RootCursorBase.cs index d5cc611e1d..1ac3858636 100644 --- a/src/Microsoft.ML.Core/Data/RootCursorBase.cs +++ b/src/Microsoft.ML.Core/Data/RootCursorBase.cs @@ -6,7 +6,7 @@ namespace Microsoft.ML.Runtime.Data { - // REVIEW: Since each cursor will create a channel, it would be great that the RootCursorBase takes + // REVIEW: Since each cursor will create a channel, it would be great that the RootCursorBase takes // ownership of the channel so the derived classes don't have to. /// diff --git a/src/Microsoft.ML.Core/Data/ServerChannel.cs b/src/Microsoft.ML.Core/Data/ServerChannel.cs index 9c75c19937..5cde023e69 100644 --- a/src/Microsoft.ML.Core/Data/ServerChannel.cs +++ b/src/Microsoft.ML.Core/Data/ServerChannel.cs @@ -26,7 +26,7 @@ public sealed class ServerChannel : ServerChannel.IPendingBundleNotification, ID private readonly string _identifier; // This holds the running collection of named delegates, if any. The dictionary itself - // is lazily initialized only when a listener + // is lazily initialized only when a listener private Dictionary _toPublish; private Action _onPublish; private Bundle _published; diff --git a/src/Microsoft.ML.Core/EntryPoints/EntryPointUtils.cs b/src/Microsoft.ML.Core/EntryPoints/EntryPointUtils.cs index b94e25c9e3..ad07ec86a5 100644 --- a/src/Microsoft.ML.Core/EntryPoints/EntryPointUtils.cs +++ b/src/Microsoft.ML.Core/EntryPoints/EntryPointUtils.cs @@ -35,7 +35,7 @@ public static bool IsValueWithinRange(this TlcModule.RangeAttribute range, objec Contracts.AssertValue(val); Func fn = IsValueWithinRange; // Avoid trying to cast double as float. If range - // was specified using floats, but value being checked + // was specified using floats, but value being checked // is double, change range to be of type double if (range.Type == typeof(float) && val is double) range.CastToDouble(); diff --git a/src/Microsoft.ML.Core/EntryPoints/ModuleArgs.cs b/src/Microsoft.ML.Core/EntryPoints/ModuleArgs.cs index 99cfec0dd9..8a4ab8ca43 100644 --- a/src/Microsoft.ML.Core/EntryPoints/ModuleArgs.cs +++ b/src/Microsoft.ML.Core/EntryPoints/ModuleArgs.cs @@ -15,7 +15,7 @@ namespace Microsoft.ML.Runtime.EntryPoints { /// - /// This class defines attributes to annotate module inputs, outputs, entry points etc. when defining + /// This class defines attributes to annotate module inputs, outputs, entry points etc. when defining /// the module interface. /// public static class TlcModule @@ -124,7 +124,7 @@ public sealed class OutputAttribute : Attribute public string Desc { get; set; } /// - /// The rank order of the output. Because .NET reflection returns members in an unspecfied order, this + /// The rank order of the output. Because .NET reflection returns members in an unspecfied order, this /// is the only way to ensure consistency. /// public Double SortOrder { get; set; } @@ -527,6 +527,11 @@ public sealed class EntryPointAttribute : Attribute /// Short name of the Entry Point /// public string ShortName { get; set; } + + /// + /// The path to the XML documentation on the CSharpAPI component + /// + public string[] XmlInclude { get; set; } } /// @@ -539,11 +544,11 @@ public enum DataKind /// Unknown = 0, /// - /// Integer, including long. + /// Integer, including long. /// Int, /// - /// Unsigned integer, including ulong. + /// Unsigned integer, including ulong. /// UInt, /// @@ -583,11 +588,11 @@ public enum DataKind /// Enum, /// - /// An array (0 or more values of the same type, accessible by index). + /// An array (0 or more values of the same type, accessible by index). /// Array, /// - /// A dictionary (0 or more values of the same type, identified by a unique string key). + /// A dictionary (0 or more values of the same type, identified by a unique string key). /// The underlying C# representation is /// Dictionary, @@ -598,7 +603,7 @@ public enum DataKind /// Component, /// - /// An C# object that represents state, such as . + /// An C# object that represents state, such as . /// State } @@ -677,8 +682,8 @@ protected Optional(bool isExplicit) /// This is a 'maybe' class that is able to differentiate the cases when the value is set 'explicitly', or 'implicitly'. /// The idea is that if the default value is specified by the user, in some cases it needs to be treated differently /// than if it's auto-filled. - /// - /// An example is the weight column: the default behavior is to use 'Weight' column if it's present. But if the user explicitly sets + /// + /// An example is the weight column: the default behavior is to use 'Weight' column if it's present. But if the user explicitly sets /// the weight column to be 'Weight', we need to actually enforce the presence of the column. /// /// The type of the value @@ -714,7 +719,7 @@ public static implicit operator T(Optional optional) } /// - /// The implicit conversion from . + /// The implicit conversion from . /// This will assume that the parameter is set 'explicitly'. /// public static implicit operator Optional(T value) diff --git a/src/Microsoft.ML.Core/EntryPoints/ModuleCatalog.cs b/src/Microsoft.ML.Core/EntryPoints/ModuleCatalog.cs index 498a75c9e5..60511bfd39 100644 --- a/src/Microsoft.ML.Core/EntryPoints/ModuleCatalog.cs +++ b/src/Microsoft.ML.Core/EntryPoints/ModuleCatalog.cs @@ -44,6 +44,7 @@ public sealed class EntryPointInfo public readonly string Description; public readonly string ShortName; public readonly string FriendlyName; + public readonly string[] XmlInclude; public readonly MethodInfo Method; public readonly Type InputType; public readonly Type OutputType; @@ -63,6 +64,7 @@ internal EntryPointInfo(IExceptionContext ectx, MethodInfo method, Method = method; ShortName = attribute.ShortName; FriendlyName = attribute.UserName; + XmlInclude = attribute.XmlInclude; ObsoleteAttribute = obsoleteAttribute; // There are supposed to be 2 parameters, env and input for non-macro nodes. @@ -259,7 +261,7 @@ private bool ScanForComponents(IExceptionContext ectx, Type nestedType) } /// - /// The valid names for the components and entry points must consist of letters, digits, underscores and dots, + /// The valid names for the components and entry points must consist of letters, digits, underscores and dots, /// and begin with a letter or digit. /// private static readonly Regex _nameRegex = new Regex(@"^\w[_\.\w]*$", RegexOptions.Compiled); diff --git a/src/Microsoft.ML.Core/Environment/HostEnvironmentBase.cs b/src/Microsoft.ML.Core/Environment/HostEnvironmentBase.cs index 631de3eb77..d4ff5ccd96 100644 --- a/src/Microsoft.ML.Core/Environment/HostEnvironmentBase.cs +++ b/src/Microsoft.ML.Core/Environment/HostEnvironmentBase.cs @@ -87,7 +87,7 @@ public interface IMessageSource /// /// A that is also a channel listener can attach - /// listeners for messages, as sent through . + /// listeners for messages, as sent through . /// public interface IMessageDispatcher : IHostEnvironment { @@ -109,7 +109,7 @@ public interface IMessageDispatcher : IHostEnvironment /// /// A basic host environment suited for many environments. - /// This also supports modifying the concurrency factor, provides the ability to subscribe to pipes via the + /// This also supports modifying the concurrency factor, provides the ability to subscribe to pipes via the /// AddListener/RemoveListener methods, and exposes the to /// query progress. /// @@ -315,7 +315,7 @@ protected sealed class Dispatcher : Dispatcher /// This field is actually used as a , which holds the listener actions /// for all listeners that are currently subscribed. The action itself is an immutable object, so every time /// any listener subscribes or unsubscribes, the field is replaced with a modified version of the delegate. - /// + /// /// The field can be null, if no listener is currently subscribed. /// private volatile Action _listenerAction; @@ -488,10 +488,8 @@ protected virtual IProgressChannel StartProgressChannelCore(HostBase host, strin /// protected virtual IFileHandle OpenInputFileCore(IHostEnvironment env, string path) { -#pragma warning disable TLC_NoThis // Do not use 'this' keyword for member access this.AssertValue(env); this.CheckNonWhiteSpace(path, nameof(path)); -#pragma warning restore TLC_NoThis // Do not use 'this' keyword for member access if (Master != null) return Master.OpenInputFileCore(env, path); return new SimpleFileHandle(env, path, needsWrite: false, autoDelete: false); @@ -511,10 +509,8 @@ public IFileHandle CreateOutputFile(string path) /// protected virtual IFileHandle CreateOutputFileCore(IHostEnvironment env, string path) { -#pragma warning disable TLC_NoThis // Do not use 'this' keyword for member access this.AssertValue(env); this.CheckNonWhiteSpace(path, nameof(path)); -#pragma warning restore TLC_NoThis // Do not use 'this' keyword for member access if (Master != null) return Master.CreateOutputFileCore(env, path); return new SimpleFileHandle(env, path, needsWrite: true, autoDelete: false); @@ -532,9 +528,7 @@ public IFileHandle CreateTempFile(string suffix = null, string prefix = null) /// protected IFileHandle CreateAndRegisterTempFile(IHostEnvironment env, string suffix = null, string prefix = null) { -#pragma warning disable TLC_NoThis // Do not use 'this' keyword for member access this.AssertValue(env); -#pragma warning restore TLC_NoThis // Do not use 'this' keyword for member access if (Master != null) return Master.CreateAndRegisterTempFile(env, suffix, prefix); @@ -556,10 +550,8 @@ protected IFileHandle CreateAndRegisterTempFile(IHostEnvironment env, string suf protected virtual IFileHandle CreateTempFileCore(IHostEnvironment env, string suffix = null, string prefix = null) { -#pragma warning disable TLC_NoThis // Do not use 'this' keyword for member access this.CheckParam(!HasBadFileCharacters(suffix), nameof(suffix)); this.CheckParam(!HasBadFileCharacters(prefix), nameof(prefix)); -#pragma warning restore TLC_NoThis // Do not use 'this' keyword for member access Guid guid = Guid.NewGuid(); string path = Path.GetFullPath(Path.Combine(Path.GetTempPath(), prefix + guid.ToString() + suffix)); diff --git a/src/Microsoft.ML.Core/Environment/TlcEnvironment.cs b/src/Microsoft.ML.Core/Environment/TlcEnvironment.cs index ccf60dc28a..13781c5c11 100644 --- a/src/Microsoft.ML.Core/Environment/TlcEnvironment.cs +++ b/src/Microsoft.ML.Core/Environment/TlcEnvironment.cs @@ -225,7 +225,7 @@ public void GetAndPrintAllProgress(ProgressReporting.ProgressTracker progressTra if (PrintDot()) { - // We need to print an extended status line. At this point, every event should be + // We need to print an extended status line. At this point, every event should be // a non-checkpoint progress event. bool needPrepend = entries.Count > 1; foreach (var ev in entries) @@ -306,7 +306,7 @@ private void EnsureNewLine(bool isError = false) return; // If _err and _out is the same writer, we need to print new line as well. - // If _out and _err writes to Console.Out and Console.Error respectively, + // If _out and _err writes to Console.Out and Console.Error respectively, // in the general user scenario they ends up with writing to the same underlying stream,. // so write a new line to the stream anyways. if (isError && _err != _out && (_out != Console.Out || _err != Console.Error)) diff --git a/src/Microsoft.ML.Core/Prediction/ISweeper.cs b/src/Microsoft.ML.Core/Prediction/ISweeper.cs index a0a1850be0..fe887e0ae2 100644 --- a/src/Microsoft.ML.Core/Prediction/ISweeper.cs +++ b/src/Microsoft.ML.Core/Prediction/ISweeper.cs @@ -174,6 +174,11 @@ public override string ToString() { return string.Join(" ", _parameterValues.Select(kvp => string.Format("{0}={1}", kvp.Value.Name, kvp.Value.ValueText)).ToArray()); } + + public override int GetHashCode() + { + return _hash; + } } /// @@ -205,8 +210,8 @@ public sealed class RunResult : IRunResult private readonly bool _isMetricMaximizing; /// - /// This switch changes the behavior of the CompareTo function, switching the greater than / less than - /// behavior, depending on if it is set to True. + /// This switch changes the behavior of the CompareTo function, switching the greater than / less than + /// behavior, depending on if it is set to True. /// public bool IsMetricMaximizing { get { return _isMetricMaximizing; } } @@ -262,8 +267,8 @@ IComparable IRunResult.MetricValue /// /// The metric class, used by smart sweeping algorithms. - /// Ideally we would like to move towards the new IDataView/ISchematized, this is - /// just a simple view instead, and it is decoupled from RunResult so we can move + /// Ideally we would like to move towards the new IDataView/ISchematized, this is + /// just a simple view instead, and it is decoupled from RunResult so we can move /// in that direction in the future. /// public sealed class RunMetric diff --git a/src/Microsoft.ML.Core/Prediction/ITrainer.cs b/src/Microsoft.ML.Core/Prediction/ITrainer.cs index cd8c6d12c8..b38a742d9a 100644 --- a/src/Microsoft.ML.Core/Prediction/ITrainer.cs +++ b/src/Microsoft.ML.Core/Prediction/ITrainer.cs @@ -2,9 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using System.Collections.Generic; -using System.IO; +using Microsoft.ML.Runtime.Data; namespace Microsoft.ML.Runtime { @@ -27,149 +26,79 @@ namespace Microsoft.ML.Runtime public delegate void SignatureSequenceTrainer(); public delegate void SignatureMatrixRecommendingTrainer(); - /// - /// Interface to provide extra information about a trainer. - /// - public interface ITrainerEx : ITrainer - { - // REVIEW: Ideally trainers should be able to communicate - // something about the type of data they are capable of being trained - // on, e.g., what ColumnKinds they want, how many of each, of what type, - // etc. This interface seems like the most natural conduit for that sort - // of extra information. - - // REVIEW: Can we please have consistent naming here? - // 'Need' vs. 'Want' looks arbitrary to me, and it's grammatically more correct to - // be 'Needs' / 'Wants' anyway. - - /// - /// Whether the trainer needs to see data in normalized form. - /// - bool NeedNormalization { get; } - - /// - /// Whether the trainer needs calibration to produce probabilities. - /// - bool NeedCalibration { get; } - - /// - /// Whether this trainer could benefit from a cached view of the data. - /// - bool WantCaching { get; } - } - - public interface ITrainerHost - { - Random Rand { get; } - int Verbosity { get; } - - TextWriter StdOut { get; } - TextWriter StdErr { get; } - } - - // The Trainer (of Factory) can optionally implement this. - public interface IModelCombiner - where TPredictor : IPredictor - { - TPredictor CombineModels(IEnumerable models); - } + public delegate void SignatureModelCombiner(PredictionKind kind); /// - /// Weakly typed interface for a trainer "session" that produces a predictor. + /// The base interface for a trainers. Implementors should not implement this interface directly, + /// but rather implement the more specific . /// public interface ITrainer { /// - /// Return the type of prediction task for the produced predictor. + /// Auxiliary information about the trainer in terms of its capabilities + /// and requirements. /// - PredictionKind PredictionKind { get; } + TrainerInfo Info { get; } /// - /// Returns the trained predictor. - /// REVIEW: Consider removing this. + /// Return the type of prediction task for the produced predictor. /// - IPredictor CreatePredictor(); - } - - /// - /// Interface implemented by the MetalinearLearners base class. - /// Used to distinguish the MetaLinear Learners from the other learners - /// - public interface IMetaLinearTrainer - { - - } + PredictionKind PredictionKind { get; } - public interface ITrainer : ITrainer - { /// - /// Trains a predictor using the specified dataset. + /// Trains a predictor. /// - /// Training dataset - void Train(TDataSet data); + /// A context containing at least the training data + /// The trained predictor + /// + IPredictor Train(TrainContext context); } /// - /// Strongly typed generic interface for a trainer. A trainer object takes - /// supervision data and produces a predictor. + /// Strongly typed generic interface for a trainer. A trainer object takes training data + /// and produces a predictor. /// - /// Type of the training dataset /// Type of predictor produced - public interface ITrainer : ITrainer + public interface ITrainer : ITrainer where TPredictor : IPredictor { /// - /// Returns the trained predictor. + /// Trains a predictor. /// - /// Trained predictor ready to make predictions - new TPredictor CreatePredictor(); + /// A context containing at least the training data + /// The trained predictor + new TPredictor Train(TrainContext context); } - /// - /// Trainers that want data to do their own validation implement this interface. - /// - public interface IValidatingTrainer : ITrainer + public static class TrainerExtensions { /// - /// Trains a predictor using the specified dataset. + /// Convenience train extension for the case where one has only a training set with no auxiliary information. + /// Equivalent to calling + /// on a constructed with . /// - /// Training dataset - /// Validation dataset - void Train(TDataSet data, TDataSet validData); - } + /// The trainer + /// The training data. + /// The trained predictor + public static IPredictor Train(this ITrainer trainer, RoleMappedData trainData) + => trainer.Train(new TrainContext(trainData)); - public interface IIncrementalTrainer : ITrainer - { - /// - /// Trains a predictor using the specified dataset and a trained predictor. - /// - /// Training dataset - /// A trained predictor - void Train(TDataSet data, TPredictor predictor); - } - - public interface IIncrementalValidatingTrainer : ITrainer - { /// - /// Trains a predictor using the specified dataset and a trained predictor. + /// Convenience train extension for the case where one has only a training set with no auxiliary information. + /// Equivalent to calling + /// on a constructed with . /// - /// Training dataset - /// Validation dataset - /// A trained predictor - void Train(TDataSet data, TDataSet validData, TPredictor predictor); + /// The trainer + /// The training data. + /// The trained predictor + public static TPredictor Train(this ITrainer trainer, RoleMappedData trainData) where TPredictor : IPredictor + => trainer.Train(new TrainContext(trainData)); } -#if FUTURE - public interface IMultiTrainer : - IMultiTrainer - { - } - - public interface IMultiTrainer : - ITrainer + // A trainer can optionally implement this to indicate it can combine multiple models into a single predictor. + public interface IModelCombiner + where TPredictor : IPredictor { - void UpdatePredictor(TDataBatch trainInstance); - IPredictor GetCurrentPredictor(); + TPredictor CombineModels(IEnumerable models); } -#endif } diff --git a/src/Microsoft.ML.Core/Prediction/TrainContext.cs b/src/Microsoft.ML.Core/Prediction/TrainContext.cs new file mode 100644 index 0000000000..be93ce68aa --- /dev/null +++ b/src/Microsoft.ML.Core/Prediction/TrainContext.cs @@ -0,0 +1,56 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Data; + +namespace Microsoft.ML.Runtime +{ + /// + /// Holds information relevant to trainers. Instances of this class are meant to be constructed and passed + /// into or . + /// This holds at least a training set, as well as optioonally a predictor. + /// + public sealed class TrainContext + { + /// + /// The training set. Cannot be null. + /// + public RoleMappedData TrainingSet { get; } + + /// + /// The validation set. Can be null. Note that passing a non-null validation set into + /// a trainer that does not support validation sets should not be considered an error condition. It + /// should simply be ignored in that case. + /// + public RoleMappedData ValidationSet { get; } + + /// + /// The initial predictor, for incremental training. Note that if a implementor + /// does not support incremental training, then it can ignore it similarly to how one would ignore + /// . However, if the trainer does support incremental training and there + /// is something wrong with a non-null value of this, then the trainer ought to throw an exception. + /// + public IPredictor InitialPredictor { get; } + + /// + /// Constructor, given a training set and optional other arguments. + /// + /// Will set to this value. This must be specified + /// Will set to this value if specified + /// Will set to this value if specified + public TrainContext(RoleMappedData trainingSet, RoleMappedData validationSet = null, IPredictor initialPredictor = null) + { + Contracts.CheckValue(trainingSet, nameof(trainingSet)); + Contracts.CheckValueOrNull(validationSet); + Contracts.CheckValueOrNull(initialPredictor); + + // REVIEW: Should there be code here to ensure that the role mappings between the two are compatible? + // That is, all the role mappings are the same and the columns between them have identical types? + + TrainingSet = trainingSet; + ValidationSet = validationSet; + InitialPredictor = initialPredictor; + } + } +} diff --git a/src/Microsoft.ML.Core/Prediction/TrainerInfo.cs b/src/Microsoft.ML.Core/Prediction/TrainerInfo.cs new file mode 100644 index 0000000000..cce728e09a --- /dev/null +++ b/src/Microsoft.ML.Core/Prediction/TrainerInfo.cs @@ -0,0 +1,71 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace Microsoft.ML.Runtime +{ + /// + /// Instances of this class posses information about trainers, in terms of their requirements and capabilities. + /// The intended usage is as the value for . + /// + public sealed class TrainerInfo + { + // REVIEW: Ideally trainers should be able to communicate + // something about the type of data they are capable of being trained + // on, e.g., what ColumnKinds they want, how many of each, of what type, + // etc. This interface seems like the most natural conduit for that sort + // of extra information. + + /// + /// Whether the trainer needs to see data in normalized form. Only non-parametric learners will tend to produce + /// normalization here. + /// + public bool NeedNormalization { get; } + + /// + /// Whether the trainer needs calibration to produce probabilities. As a general rule only trainers that produce + /// binary classifier predictors that also do not have a natural probabilistic interpretation should have a + /// true value here. + /// + public bool NeedCalibration { get; } + + /// + /// Whether this trainer could benefit from a cached view of the data. Trainers that have few passes over the + /// data, or that need to build their own custom data structure over the data, will have a false here. + /// + public bool WantCaching { get; } + + /// + /// Whether the trainer supports validation sets via . Not implementing + /// this interface and returning true from this property is an indication the trainer does not support + /// that. + /// + public bool SupportsValidation { get; } + + /// + /// Whether the trainer can support incremental trainers via . Not + /// implementing this interface and returning true from this property is an indication the trainer does + /// not support that. + /// + public bool SupportsIncrementalTraining { get; } + + /// + /// Initializes with the given parameters. The parameters have default values for the most typical values + /// for most classical trainers. + /// + /// The value for the property + /// The value for the property + /// The value for the property + /// The value for the property + /// The value for the property + public TrainerInfo(bool normalization = true, bool calibration = false, bool caching = true, + bool supportValid = false, bool supportIncrementalTrain = false) + { + NeedNormalization = normalization; + NeedCalibration = calibration; + WantCaching = caching; + SupportsValidation = supportValid; + SupportsIncrementalTraining = supportIncrementalTrain; + } + } +} diff --git a/src/Microsoft.ML.Core/Utilities/BigArray.cs b/src/Microsoft.ML.Core/Utilities/BigArray.cs index d6c6ef7b9b..ba2e67b0d9 100644 --- a/src/Microsoft.ML.Core/Utilities/BigArray.cs +++ b/src/Microsoft.ML.Core/Utilities/BigArray.cs @@ -7,14 +7,14 @@ namespace Microsoft.ML.Runtime.Internal.Utilities { /// - /// An array-like data structure that supports storing more than - /// many entries, up to 0x7FEFFFFF00000L. - /// The entries are indexed by 64-bit integers, and a single entry can be accessed by + /// An array-like data structure that supports storing more than + /// many entries, up to 0x7FEFFFFF00000L. + /// The entries are indexed by 64-bit integers, and a single entry can be accessed by /// the indexer if no modifications to the entries is desired, or the /// method. Efficient looping can be accomplished by calling the method. - /// This data structure employs the "length and capacity" pattern. The logical length + /// This data structure employs the "length and capacity" pattern. The logical length /// can be retrieved from the property, which can possibly be strictly less - /// than the total capacity. + /// than the total capacity. /// /// The type of entries. public sealed class BigArray @@ -38,8 +38,8 @@ public sealed class BigArray // The 2-D jagged array containing the entries. // Its total size is larger than or equal to _length, but // less than Length + BlockSize. - // Each one-dimension subarray has length equal to BlockSize, - // except for the last one, which has a positive length + // Each one-dimension subarray has length equal to BlockSize, + // except for the last one, which has a positive length // less than or equal to BlockSize. private T[][] _entries; @@ -53,13 +53,13 @@ public sealed class BigArray public long Length { get { return _length; } } /// - /// Gets or sets the entry at . + /// Gets or sets the entry at . /// /// - /// This indexer is not efficient for looping. If looping access to entries is desired, + /// This indexer is not efficient for looping. If looping access to entries is desired, /// use the method instead. - /// Note that unlike a normal array, the value returned from this indexer getter cannot be modified - /// (e.g., by ++ operator or passing into a method as a ref parameter). To modify an entry, use + /// Note that unlike a normal array, the value returned from this indexer getter cannot be modified + /// (e.g., by ++ operator or passing into a method as a ref parameter). To modify an entry, use /// the method instead. /// public T this[long index] @@ -113,7 +113,7 @@ public BigArray(long size = 0) public delegate void Visitor(long index, ref T item); /// - /// Applies a method at a given . + /// Applies a method at a given . /// public void ApplyAt(long index, Visitor manip) { @@ -190,16 +190,16 @@ public void FillRange(long min, long lim, T value) } /// - /// Resizes the array so that its logical length equals . This method - /// is more efficient than initialize another array and copy the entries because it preserves + /// Resizes the array so that its logical length equals . This method + /// is more efficient than initialize another array and copy the entries because it preserves /// existing blocks. The actual capacity of the array may become larger than . /// If equals , then no operation is done. /// If is less than , the array shrinks in size /// so that both its length and its capacity equal . /// If is larger than , the array capacity grows - /// to the smallest integral multiple of that is larger than , - /// unless is less than , in which case the capacity - /// grows to double its current capacity or , which ever is larger, + /// to the smallest integral multiple of that is larger than , + /// unless is less than , in which case the capacity + /// grows to double its current capacity or , which ever is larger, /// but up to . /// public void Resize(long newLength) @@ -304,7 +304,7 @@ public void TrimCapacity() } /// - /// Appends the first elements of to the end. + /// Appends the first elements of to the end. /// This method is thread safe related to calls to (assuming those copy operations /// are happening over ranges already added), but concurrent calls to /// should not be attempted. Intended usage is that @@ -373,10 +373,10 @@ public void AddRange(T[] src, int length) } /// - /// Copies the subarray starting from index of length - /// to the destination array . - /// Concurrent calls to this method is valid even with one single concurrent call - /// to . + /// Copies the subarray starting from index of length + /// to the destination array . + /// Concurrent calls to this method is valid even with one single concurrent call + /// to . /// public void CopyTo(long idx, T[] dst, int length) { diff --git a/src/Microsoft.ML.Core/Utilities/CharUtils.cs b/src/Microsoft.ML.Core/Utilities/CharUtils.cs index e459452041..bf7ae4677e 100644 --- a/src/Microsoft.ML.Core/Utilities/CharUtils.cs +++ b/src/Microsoft.ML.Core/Utilities/CharUtils.cs @@ -13,8 +13,8 @@ namespace Microsoft.ML.Runtime.Internal.Utilities public static class CharUtils { private const int CharsCount = 0x10000; - private volatile static char[] _lowerInvariantChars; - private volatile static char[] _upperInvariantChars; + private static volatile char[] _lowerInvariantChars; + private static volatile char[] _upperInvariantChars; private static char[] EnsureLowerInvariant() { diff --git a/src/Microsoft.ML.Core/Utilities/DoubleParser.cs b/src/Microsoft.ML.Core/Utilities/DoubleParser.cs index babc135eb0..f2d5573211 100644 --- a/src/Microsoft.ML.Core/Utilities/DoubleParser.cs +++ b/src/Microsoft.ML.Core/Utilities/DoubleParser.cs @@ -433,12 +433,6 @@ public static bool TryParse(out Double value, string s, int ichMin, int ichLim, if (FloatUtils.GetBits(x) != 0 || FloatUtils.GetBits(value) != TopBit || !neg) { System.Diagnostics.Debug.WriteLine("*** FloatParser disagrees with Double.TryParse on: {0} ({1} vs {2})", str, FloatUtils.GetBits(x), FloatUtils.GetBits(value)); - //if (!_failed) - //{ - // // REVIEW: Double.Parse gets several things wrong, like mapping 148e-325 to 0x2 instead of 0x3. - // _failed = true; - // Contracts.Assert(false, string.Format("FloatParser disagrees with Double.TryParse on: {0} ({1} vs {2})", str, FloatUtils.GetBits(x), FloatUtils.GetBits(value))); - //} } } #endif diff --git a/src/Microsoft.ML.Core/Utilities/HashArray.cs b/src/Microsoft.ML.Core/Utilities/HashArray.cs index c76ceb9482..27f0ec9b5d 100644 --- a/src/Microsoft.ML.Core/Utilities/HashArray.cs +++ b/src/Microsoft.ML.Core/Utilities/HashArray.cs @@ -243,7 +243,7 @@ private static class HashHelpers { // Note: This HashHelpers class was adapted from the BCL code base. - // This is the maximum prime smaller than Array.MaxArrayLength + // This is the maximum prime smaller than Array.MaxArrayLength public const int MaxPrimeArrayLength = 0x7FEFFFFD; // Table of prime numbers to use as hash table sizes. @@ -271,7 +271,7 @@ public static int GetPrime(int min) return min + 1; } - // Returns size of hashtable to grow to. + // Returns size of hashtable to grow to. public static int ExpandPrime(int oldSize) { int newSize = 2 * oldSize; diff --git a/src/Microsoft.ML.Core/Utilities/HybridMemoryStream.cs b/src/Microsoft.ML.Core/Utilities/HybridMemoryStream.cs index 8825369455..73b4c4a828 100644 --- a/src/Microsoft.ML.Core/Utilities/HybridMemoryStream.cs +++ b/src/Microsoft.ML.Core/Utilities/HybridMemoryStream.cs @@ -19,26 +19,24 @@ public sealed class HybridMemoryStream : Stream { private MemoryStream _memStream; private Stream _overflowStream; - private string _overflowPath; private readonly int _overflowBoundary; private const int _defaultMaxLen = 1 << 30; private bool _disposed; - private Stream MyStream { get { return _memStream ?? _overflowStream; } } + private Stream MyStream => _memStream ?? _overflowStream; - private bool IsMemory { get { return _memStream != null; } } + private bool IsMemory => _memStream != null; - public override long Position - { - get { return MyStream.Position; } - set { Seek(value, SeekOrigin.Begin); } + public override long Position { + get => MyStream.Position; + set => Seek(value, SeekOrigin.Begin); } - public override long Length { get { return MyStream.Length; } } - public override bool CanWrite { get { return MyStream.CanWrite; } } - public override bool CanSeek { get { return MyStream.CanSeek; } } - public override bool CanRead { get { return MyStream.CanRead; } } + public override long Length => MyStream.Length; + public override bool CanWrite => MyStream.CanWrite; + public override bool CanSeek => MyStream.CanSeek; + public override bool CanRead => MyStream.CanRead; /// /// Constructs an initially empty read-write stream. Once the number of @@ -123,27 +121,24 @@ protected override void Dispose(bool disposing) var overflow = _overflowStream; _overflowStream = null; overflow.Dispose(); - Contracts.AssertValue(_overflowPath); - File.Delete(_overflowPath); - _overflowPath = null; } _disposed = true; AssertInvariants(); + base.Dispose(disposing); } } public override void Close() { AssertInvariants(); - if (MyStream != null) - MyStream.Close(); + // The base Stream class Close will call Dispose(bool). + base.Close(); } public override void Flush() { AssertInvariants(); - if (MyStream != null) - MyStream.Flush(); + MyStream?.Flush(); AssertInvariants(); } @@ -164,9 +159,9 @@ private void EnsureOverflow() // been closed. Contracts.Check(_memStream.CanRead, "attempt to perform operation on closed stream"); - Contracts.Assert(_overflowPath == null); - _overflowPath = Path.GetTempFileName(); - _overflowStream = new FileStream(_overflowPath, FileMode.Open, FileAccess.ReadWrite); + string overflowPath = Path.GetTempFileName(); + _overflowStream = new FileStream(overflowPath, FileMode.Open, FileAccess.ReadWrite, + FileShare.None, bufferSize: 4096, FileOptions.DeleteOnClose); // The documentation is not clear on this point, but the source code for // memory stream makes clear that this buffer is exposable for a memory diff --git a/src/Microsoft.ML.Core/Utilities/MathUtils.cs b/src/Microsoft.ML.Core/Utilities/MathUtils.cs index 8106ff5a2c..fb68ee82d6 100644 --- a/src/Microsoft.ML.Core/Utilities/MathUtils.cs +++ b/src/Microsoft.ML.Core/Utilities/MathUtils.cs @@ -133,7 +133,7 @@ public static Float Min(Float[] a) /// /// Finds the first index of the max element of the array. - /// NaNs are ignored. If all the elements to consider are NaNs, -1 is + /// NaNs are ignored. If all the elements to consider are NaNs, -1 is /// returned. The caller should distinguish in this case between two /// possibilities: /// 1) The number of the element to consider is zero. @@ -147,8 +147,8 @@ public static int ArgMax(Float[] a) } /// - /// Finds the first index of the max element of the array. - /// NaNs are ignored. If all the elements to consider are NaNs, -1 is + /// Finds the first index of the max element of the array. + /// NaNs are ignored. If all the elements to consider are NaNs, -1 is /// returned. The caller should distinguish in this case between two /// possibilities: /// 1) The number of the element to consider is zero. @@ -179,7 +179,7 @@ public static int ArgMax(Float[] a, int count) /// /// Finds the first index of the minimum element of the array. - /// NaNs are ignored. If all the elements to consider are NaNs, -1 is + /// NaNs are ignored. If all the elements to consider are NaNs, -1 is /// returned. The caller should distinguish in this case between two /// possibilities: /// 1) The number of the element to consider is zero. @@ -194,7 +194,7 @@ public static int ArgMin(Float[] a) /// /// Finds the first index of the minimum element of the array. - /// NaNs are ignored. If all the elements to consider are NaNs, -1 is + /// NaNs are ignored. If all the elements to consider are NaNs, -1 is /// returned. The caller should distinguish in this case between two /// possibilities: /// 1) The number of the element to consider is zero. @@ -258,10 +258,6 @@ public static Float SoftMax(Float[] inputs, int count) if (count == 1) return max; - //else if (leng == 2) { - // return SoftMax(inputs[0], inputs[1]); - //} - double intermediate = 0.0; Float cutoff = max - LogTolerance; @@ -335,9 +331,9 @@ public static bool AlmostEqual(Float a, Float b, Float maxRelErr, Float maxAbsEr return (absDiff / maxAbs) <= maxRelErr; } - private readonly static int[] _possiblePrimeMod30 = new int[] { 1, 7, 11, 13, 17, 19, 23, 29 }; - private readonly static double _constantForLogGamma = 0.5 * Math.Log(2 * Math.PI); - private readonly static double[] _coeffsForLogGamma = { 12.0, -360.0, 1260.0, -1680.0, 1188.0 }; + private static readonly int[] _possiblePrimeMod30 = new int[] { 1, 7, 11, 13, 17, 19, 23, 29 }; + private static readonly double _constantForLogGamma = 0.5 * Math.Log(2 * Math.PI); + private static readonly double[] _coeffsForLogGamma = { 12.0, -360.0, 1260.0, -1680.0, 1188.0 }; /// /// Returns the log of the gamma function, using the Stirling approximation @@ -853,7 +849,7 @@ public static Float LnSum(IEnumerable terms) } /// - /// Math.Sin returns the input value for inputs with large magnitude. We return NaN instead, for consistency + /// Math.Sin returns the input value for inputs with large magnitude. We return NaN instead, for consistency /// with Math.Sin(infinity). /// public static double Sin(double a) @@ -863,7 +859,7 @@ public static double Sin(double a) } /// - /// Math.Cos returns the input value for inputs with large magnitude. We return NaN instead, for consistency + /// Math.Cos returns the input value for inputs with large magnitude. We return NaN instead, for consistency /// with Math.Cos(infinity). /// public static double Cos(double a) diff --git a/src/Microsoft.ML.Core/Utilities/MemUtils.cs b/src/Microsoft.ML.Core/Utilities/MemUtils.cs index 736ae90892..1dba9205e9 100644 --- a/src/Microsoft.ML.Core/Utilities/MemUtils.cs +++ b/src/Microsoft.ML.Core/Utilities/MemUtils.cs @@ -10,7 +10,7 @@ public static class MemUtils // .Net 4.6's Buffer.MemoryCopy. // REVIEW: Remove once we're on a version of .NET which includes // Buffer.MemoryCopy. - public unsafe static void MemoryCopy(void* source, void* destination, long destinationSizeInBytes, long sourceBytesToCopy) + public static unsafe void MemoryCopy(void* source, void* destination, long destinationSizeInBytes, long sourceBytesToCopy) { // MemCpy has undefined behavior when handed overlapping source and // destination buffers. diff --git a/src/Microsoft.ML.Core/Utilities/MinWaiter.cs b/src/Microsoft.ML.Core/Utilities/MinWaiter.cs index d29bfe23c1..8c44315ba6 100644 --- a/src/Microsoft.ML.Core/Utilities/MinWaiter.cs +++ b/src/Microsoft.ML.Core/Utilities/MinWaiter.cs @@ -12,7 +12,7 @@ namespace Microsoft.ML.Runtime.Internal.Utilities /// entities of known count, where you want to iteratively provide critical sections /// for each depending on which comes first, but you do not necessarily know what /// constitutes "first" until all such entities tell you where they stand in line. - /// + /// /// The anticipated usage is that whatever entity is using the /// to synchronize itself, will register itself using /// so as to unblock any "lower" waiters as soon as it knows what value it needs to @@ -65,7 +65,7 @@ public MinWaiter(int waiters) /// point when we actually want to wait. This method itself has the potential to /// signal other events, if by registering ourselves the waiter becomes aware of /// the maximum number of waiters, allowing that waiter to enter its critical state. - /// + /// /// If multiple events are associated with the minimum value, then only one will /// be signaled, and the rest will remain unsignaled. Which is chosen is undefined. /// @@ -75,7 +75,7 @@ public ManualResetEventSlim Register(long position) lock (_waiters) { Contracts.Check(_maxWaiters > 0, "All waiters have been retired, Wait should not be called at this point"); - // We should never reach the state + // We should never reach the state Contracts.Assert(_waiters.Count < _maxWaiters); ev = new WaitStats(position); // REVIEW: Optimize the case where this is the minimum? diff --git a/src/Microsoft.ML.Core/Utilities/ObjectPool.cs b/src/Microsoft.ML.Core/Utilities/ObjectPool.cs index 46486dc937..4a65286551 100644 --- a/src/Microsoft.ML.Core/Utilities/ObjectPool.cs +++ b/src/Microsoft.ML.Core/Utilities/ObjectPool.cs @@ -39,7 +39,7 @@ public abstract class ObjectPoolBase public int Count => _pool.Count; public int NumCreated { get { return _numCreated; } } - protected internal ObjectPoolBase() + private protected ObjectPoolBase() { _pool = new ConcurrentBag(); } diff --git a/src/Microsoft.ML.Core/Utilities/PathUtils.cs b/src/Microsoft.ML.Core/Utilities/PathUtils.cs index 74ccec30c0..6698c11f7f 100644 --- a/src/Microsoft.ML.Core/Utilities/PathUtils.cs +++ b/src/Microsoft.ML.Core/Utilities/PathUtils.cs @@ -36,19 +36,19 @@ private static string DllDir /// Attempts to find a file that is expected to be distributed with a TLC component. Searches /// in the following order: /// 1. In the customSearchDir directory, if it is provided. - /// 2. In the custom search directory specified by the + /// 2. In the custom search directory specified by the /// environment variable. /// 3. In the root folder of the provided assembly. /// 4. In the folder of this assembly. /// In each case it searches the file in the directory provided and combined with folderPrefix. - /// + /// /// If any of these locations contain the file, a full local path will be returned, otherwise this /// method will return null. /// /// File name to find /// folder prefix, relative to the current or customSearchDir /// - /// Custom directory to search for resources. + /// Custom directory to search for resources. /// If null, the path specified in the environment variable /// will be used. /// diff --git a/src/Microsoft.ML.Core/Utilities/ReservoirSampler.cs b/src/Microsoft.ML.Core/Utilities/ReservoirSampler.cs index a755788fb4..69b57fea45 100644 --- a/src/Microsoft.ML.Core/Utilities/ReservoirSampler.cs +++ b/src/Microsoft.ML.Core/Utilities/ReservoirSampler.cs @@ -9,8 +9,8 @@ namespace Microsoft.ML.Runtime.Internal.Utilities { /// - /// This is an interface for creating samples of a requested size from a stream of data of type . - /// The sample is created in one pass by calling for every data point in the stream. Implementations should have + /// This is an interface for creating samples of a requested size from a stream of data of type . + /// The sample is created in one pass by calling for every data point in the stream. Implementations should have /// a delegate for getting the next data point, which is invoked if the current data point should go into the reservoir. /// public interface IReservoirSampler @@ -44,10 +44,10 @@ public interface IReservoirSampler } /// - /// This class produces a sample without replacement from a stream of data of type . - /// It is instantiated with a delegate that gets the next data point, and builds a reservoir in one pass by calling + /// This class produces a sample without replacement from a stream of data of type . + /// It is instantiated with a delegate that gets the next data point, and builds a reservoir in one pass by calling /// for every data point in the stream. In case the next data point does not get 'picked' into the reservoir, the delegate is not invoked. - /// Sampling is done according to the algorithm in this paper: . + /// Sampling is done according to the algorithm in this paper: http://epubs.siam.org/doi/pdf/10.1137/1.9781611972740.53. /// public sealed class ReservoirSamplerWithoutReplacement : IReservoirSampler { @@ -117,10 +117,10 @@ public IEnumerable GetSample() } /// - /// This class produces a sample with replacement from a stream of data of type . - /// It is instantiated with a delegate that gets the next data point, and builds a reservoir in one pass by calling + /// This class produces a sample with replacement from a stream of data of type . + /// It is instantiated with a delegate that gets the next data point, and builds a reservoir in one pass by calling /// for every data point in the stream. In case the next data point does not get 'picked' into the reservoir, the delegate is not invoked. - /// Sampling is done according to the algorithm in this paper: . + /// Sampling is done according to the algorithm in this paper: http://epubs.siam.org/doi/pdf/10.1137/1.9781611972740.53. /// public sealed class ReservoirSamplerWithReplacement : IReservoirSampler { @@ -237,7 +237,7 @@ public void Lock() } /// - /// Gets a reservoir sample with replacement of the elements sampled so far. Users should not change the + /// Gets a reservoir sample with replacement of the elements sampled so far. Users should not change the /// elements returned since multiple elements in the reservoir might be pointing to the same memory. /// public IEnumerable GetSample() diff --git a/src/Microsoft.ML.Core/Utilities/ResourceManagerUtils.cs b/src/Microsoft.ML.Core/Utilities/ResourceManagerUtils.cs index ccb4b0c90c..2cfa8c185a 100644 --- a/src/Microsoft.ML.Core/Utilities/ResourceManagerUtils.cs +++ b/src/Microsoft.ML.Core/Utilities/ResourceManagerUtils.cs @@ -18,7 +18,7 @@ namespace Microsoft.ML.Runtime.Internal.Utilities /// public sealed class ResourceManagerUtils { - private volatile static ResourceManagerUtils _instance; + private static volatile ResourceManagerUtils _instance; public static ResourceManagerUtils Instance { get @@ -91,7 +91,7 @@ public static string GetUrl(string suffix) /// The relative url from which to download. /// This is appended to the url defined in . /// The name of the file to save. - /// The directory where the file should be saved to. The file will be saved in a directory with the specified name inside + /// The directory where the file should be saved to. The file will be saved in a directory with the specified name inside /// a folder called "tlc-resources" in the directory. /// An integer indicating the number of milliseconds to wait before timing out while downloading a resource. /// The download results, containing the file path where the resources was (or should have been) downloaded to, and an error message diff --git a/src/Microsoft.ML.Core/Utilities/Stream.cs b/src/Microsoft.ML.Core/Utilities/Stream.cs index 8b22e46380..41c794e17f 100644 --- a/src/Microsoft.ML.Core/Utilities/Stream.cs +++ b/src/Microsoft.ML.Core/Utilities/Stream.cs @@ -979,7 +979,7 @@ public static BitArray ReadBitArray(this BinaryReader reader) return returnArray; } - public unsafe static void ReadBytes(this BinaryReader reader, void* destination, long destinationSizeInBytes, long bytesToRead, ref byte[] work) + public static unsafe void ReadBytes(this BinaryReader reader, void* destination, long destinationSizeInBytes, long bytesToRead, ref byte[] work) { Contracts.AssertValue(reader); Contracts.Assert(bytesToRead >= 0); @@ -1007,7 +1007,7 @@ public unsafe static void ReadBytes(this BinaryReader reader, void* destination, } } - public unsafe static void ReadBytes(this BinaryReader reader, void* destination, long destinationSizeInBytes, long bytesToRead) + public static unsafe void ReadBytes(this BinaryReader reader, void* destination, long destinationSizeInBytes, long bytesToRead) { byte[] work = null; ReadBytes(reader, destination, destinationSizeInBytes, bytesToRead, ref work); @@ -1097,10 +1097,10 @@ public static bool TryGetBuffer(this MemoryStream mem, out ArraySegment bu // REVIEW: need to plumb IExceptionContext into the method. /// /// Checks that the directory of the file name passed in already exists. - /// This is meant to be called before calling an API that creates the file, + /// This is meant to be called before calling an API that creates the file, /// so the file need not exist. /// - /// An absolute or relative file path, or null to skip the check + /// An absolute or relative file path, or null to skip the check /// (useful for optional user parameters) /// The user level parameter name, as exposed by the command line help public static void CheckOptionalUserDirectory(string file, string userArgument) @@ -1113,7 +1113,7 @@ public static void CheckOptionalUserDirectory(string file, string userArgument) return; string dir; -#pragma warning disable TLC_ContractsNameUsesNameof +#pragma warning disable MSML_ContractsNameUsesNameof try { // Relative paths are interpreted as local. @@ -1134,6 +1134,6 @@ public static void CheckOptionalUserDirectory(string file, string userArgument) if (!Directory.Exists(dir)) throw Contracts.ExceptUserArg(userArgument, "Cannot find directory '{0}'.", dir); } -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof } } \ No newline at end of file diff --git a/src/Microsoft.ML.Core/Utilities/SupervisedBinFinder.cs b/src/Microsoft.ML.Core/Utilities/SupervisedBinFinder.cs index 00dbf68d2c..a96e8df5c2 100644 --- a/src/Microsoft.ML.Core/Utilities/SupervisedBinFinder.cs +++ b/src/Microsoft.ML.Core/Utilities/SupervisedBinFinder.cs @@ -11,12 +11,12 @@ namespace Microsoft.ML.Runtime.Internal.Utilities { /// - /// This class performs discretization of (value, label) pairs into bins in a way that minimizes + /// This class performs discretization of (value, label) pairs into bins in a way that minimizes /// the target function "minimum description length". /// The algorithm is outlineed in an article /// "Multi-Interval Discretization of Continuous-Valued Attributes for Classification Learning" /// [Fayyad, Usama M.; Irani, Keki B. (1993)] http://ijcai.org/Past%20Proceedings/IJCAI-93-VOL2/PDF/022.pdf - /// + /// /// The class can be used several times sequentially, it is stateful and not thread-safe. /// Both Single and Double precision processing is implemented, and is identical. /// @@ -117,7 +117,7 @@ public Single[] FindBins(int maxBins, int minBinSize, int nLabels, IList result[i] = BinFinderBase.GetSplitValue(distinctValues[split - 1], distinctValues[split]); // Even though distinctValues may contain infinities, the boundaries may not be infinite: - // GetSplitValue(a,b) only returns +-inf if a==b==+-inf, + // GetSplitValue(a,b) only returns +-inf if a==b==+-inf, // and distinctValues won't contain more than one +inf or -inf. Contracts.Assert(FloatUtils.IsFinite(result[i])); } @@ -195,7 +195,7 @@ public Double[] FindBins(int maxBins, int minBinSize, int nLabels, IList result[i] = BinFinderBase.GetSplitValue(distinctValues[split - 1], distinctValues[split]); // Even though distinctValues may contain infinities, the boundaries may not be infinite: - // GetSplitValue(a,b) only returns +-inf if a==b==+-inf, + // GetSplitValue(a,b) only returns +-inf if a==b==+-inf, // and distinctValues won't contain more than one +inf or -inf. Contracts.Assert(FloatUtils.IsFinite(result[i])); } @@ -259,7 +259,7 @@ public SplitInterval(SupervisedBinFinder binFinder, int min, int lim, bool skipS Contracts.Assert(leftCount + rightCount == totalCount); // This term corresponds to the 'fixed cost associated with a split' - // It's a simplification of a Delta(A,T;S) term calculated in the paper + // It's a simplification of a Delta(A,T;S) term calculated in the paper var delta = logN - binFinder._labelCardinality * (totalEntropy - leftEntropy - rightEntropy); var curGain = totalCount * totalEntropy // total cost of transmitting non-split content diff --git a/src/Microsoft.ML.Core/Utilities/TextReaderStream.cs b/src/Microsoft.ML.Core/Utilities/TextReaderStream.cs index ab83bf40f0..5c05275ba7 100644 --- a/src/Microsoft.ML.Core/Utilities/TextReaderStream.cs +++ b/src/Microsoft.ML.Core/Utilities/TextReaderStream.cs @@ -14,7 +14,7 @@ namespace Microsoft.ML.Runtime.Internal.Utilities /// compensates by inserting \n line feed characters at the end of every /// input line, including the last one. /// - public class TextReaderStream : Stream + public sealed class TextReaderStream : Stream { private readonly TextReader _baseReader; private readonly Encoding _encoding; @@ -38,19 +38,11 @@ public class TextReaderStream : Stream public override bool CanWrite => false; public override long Length - { - get - { - throw Contracts.ExceptNotSupp("Stream cannot determine length."); - } - } + => throw Contracts.ExceptNotSupp("Stream cannot determine length."); public override long Position { - get - { - return _position; - } + get => _position; set { if (value != Position) @@ -96,6 +88,7 @@ public override void Close() protected override void Dispose(bool disposing) { _baseReader.Dispose(); + base.Dispose(disposing); } public override void Flush() @@ -182,18 +175,12 @@ public override int ReadByte() } public override long Seek(long offset, SeekOrigin origin) - { - throw Contracts.ExceptNotSupp("Stream cannot seek."); - } + => throw Contracts.ExceptNotSupp("Stream cannot seek."); public override void Write(byte[] buffer, int offset, int count) - { - throw Contracts.ExceptNotSupp("Stream is not writable."); - } + => throw Contracts.ExceptNotSupp("Stream is not writable."); public override void SetLength(long value) - { - throw Contracts.ExceptNotSupp("Stream is not writable."); - } + => throw Contracts.ExceptNotSupp("Stream is not writable."); } } \ No newline at end of file diff --git a/src/Microsoft.ML.Core/Utilities/ThreadUtils.cs b/src/Microsoft.ML.Core/Utilities/ThreadUtils.cs index e7bc27235f..859ae7b28d 100644 --- a/src/Microsoft.ML.Core/Utilities/ThreadUtils.cs +++ b/src/Microsoft.ML.Core/Utilities/ThreadUtils.cs @@ -64,7 +64,7 @@ public sealed class ExceptionMarshaller : IDisposable private readonly CancellationTokenSource _ctSource; private readonly object _lock; - // The stored exception + // The stored exception private string _component; private Exception _ex; diff --git a/src/Microsoft.ML.Core/Utilities/Tree.cs b/src/Microsoft.ML.Core/Utilities/Tree.cs index 880afc4083..7d030cf46c 100644 --- a/src/Microsoft.ML.Core/Utilities/Tree.cs +++ b/src/Microsoft.ML.Core/Utilities/Tree.cs @@ -53,7 +53,7 @@ public Tree this[TKey key] /// /// This is the key for this child node in its parent, if any. If this is not - /// a child of any parent, that is, it is the root of its own tree, then + /// a child of any parent, that is, it is the root of its own tree, then /// public TKey Key { get { return _key; } } @@ -129,7 +129,7 @@ public void Add(KeyValuePair> item) } /// - /// Adds a node as a child of this node. This will disconnect the + /// Adds a node as a child of this node. This will disconnect the /// /// /// diff --git a/src/Microsoft.ML.Core/Utilities/Utils.cs b/src/Microsoft.ML.Core/Utilities/Utils.cs index 48993de785..96c23a0fe3 100644 --- a/src/Microsoft.ML.Core/Utilities/Utils.cs +++ b/src/Microsoft.ML.Core/Utilities/Utils.cs @@ -898,7 +898,7 @@ private static MethodInfo MarshalInvokeCheckAndCreate(Type genArg, Delegat /// but whose code depends on some sort of generic type parameter. This utility method exists to make /// this common pattern more convenient, and also safer so that the arguments, if any, can be type /// checked at compile time instead of at runtime. - /// + /// /// Because it is strongly typed, this can only be applied to methods whose return type /// is known at compile time, that is, that do not depend on the type parameter of the method itself. /// diff --git a/src/Microsoft.ML.Core/Utilities/VBufferUtils.cs b/src/Microsoft.ML.Core/Utilities/VBufferUtils.cs index ae2463da0c..1be9c77ee4 100644 --- a/src/Microsoft.ML.Core/Utilities/VBufferUtils.cs +++ b/src/Microsoft.ML.Core/Utilities/VBufferUtils.cs @@ -349,7 +349,7 @@ public static void Apply(ref VBuffer dst, SlotValueManipulator manip) /// The vector to modify /// The slot of the vector to modify /// The manipulation function - /// A predicate that returns true if we should skip insertion of a value into + /// A predicate that returns true if we should skip insertion of a value into /// sparse vector if it was default. If the predicate is null, we insert any non-default. public static void ApplyAt(ref VBuffer dst, int slot, SlotValueManipulator manip, ValuePredicate pred = null) { @@ -489,7 +489,7 @@ public static void DensifyFirst(ref VBuffer dst, int denseCount) } /// - /// Creates a maybe sparse copy of a VBuffer. + /// Creates a maybe sparse copy of a VBuffer. /// Whether the created copy is sparse or not is determined by the proportion of non-default entries compared to the sparsity parameter. /// public static void CreateMaybeSparseCopy(ref VBuffer src, ref VBuffer dst, RefPredicate isDefaultPredicate, float sparsityThreshold = SparsityThreshold) @@ -580,9 +580,9 @@ public static void ApplyWith(ref VBuffer src, ref VBuffer /// Applies the to each pair of elements - /// where is defined, in order of index. It stores the result - /// in another vector. If there is some value at an index in - /// that is not defined in , that slot value is copied to the + /// where is defined, in order of index. It stores the result + /// in another vector. If there is some value at an index in + /// that is not defined in , that slot value is copied to the /// corresponding slot in the result vector without any further modification. /// If either of the vectors are dense, the resulting /// will be dense. Otherwise, if both are sparse, the output will be sparse iff @@ -616,7 +616,7 @@ public static void ApplyWithEitherDefined(ref VBuffer src, ref /// /// Applies the to each pair of elements /// where either or , has an element - /// defined at that index. It stores the result in another vector . + /// defined at that index. It stores the result in another vector . /// If either of the vectors are dense, the resulting /// will be dense. Otherwise, if both are sparse, the output will be sparse iff /// there is any slot that is not explicitly represented in either vector. @@ -1147,11 +1147,11 @@ private static void ApplyWithCoreCopy(ref VBuffer src, ref VBu /// storing the result in , overwriting any of its existing contents. /// The contents of do not affect calculation. If you instead wish /// to calculate a function that reads and writes , see - /// and . Post-operation, + /// and . Post-operation, /// will be dense iff is dense. /// - /// - /// + /// + /// public static void ApplyIntoEitherDefined(ref VBuffer src, ref VBuffer dst, Func func) { Contracts.CheckValue(func, nameof(func)); diff --git a/src/Microsoft.ML.CpuMath/AlignedArray.cs b/src/Microsoft.ML.CpuMath/AlignedArray.cs index 1dc8e3ee46..87583a8ef6 100644 --- a/src/Microsoft.ML.CpuMath/AlignedArray.cs +++ b/src/Microsoft.ML.CpuMath/AlignedArray.cs @@ -13,7 +13,7 @@ namespace Microsoft.ML.Runtime.Internal.CpuMath /// To pin and force alignment, call the GetPin method, typically wrapped in a using (since it /// returns a Pin struct that is IDisposable). From the pin, you can get the IntPtr to pass to /// native code. - /// + /// /// The ctor takes an alignment value, which must be a power of two at least sizeof(Float). /// public sealed class AlignedArray diff --git a/src/Microsoft.ML.CpuMath/AlignedMatrix.cs b/src/Microsoft.ML.CpuMath/AlignedMatrix.cs index 5ec9b53cca..67f05ee7cf 100644 --- a/src/Microsoft.ML.CpuMath/AlignedMatrix.cs +++ b/src/Microsoft.ML.CpuMath/AlignedMatrix.cs @@ -80,7 +80,7 @@ private void AssertValid() } /// - /// The physical AligenedArray items. + /// The physical AligenedArray items. /// public AlignedArray Items { get { return _items; } } @@ -155,7 +155,7 @@ public void CopyTo(Float[] dst, ref int ivDst) } /// - /// Copy the values from this vector starting at slot ivSrc into dst, starting at slot ivDst. + /// Copy the values from this vector starting at slot ivSrc into dst, starting at slot ivDst. /// The number of values that are copied is determined by count. /// /// The staring index in this vector @@ -525,7 +525,7 @@ public CpuAlignedMatrixRow(int crow, int ccol, int cbAlign) public override int ColCountPhy { get { return RunLenPhy; } } /// - /// Copy the values from this matrix, starting from the row into dst, starting at slot ivDst and advancing ivDst. + /// Copy the values from this matrix, starting from the row into dst, starting at slot ivDst and advancing ivDst. /// /// The starting row in this matrix /// The destination array @@ -606,7 +606,7 @@ public void CopyTo(Float[] dst, ref int ivDst) } /// - /// Copy the values from this matrix, starting from the row into dst, starting at slot ivDst and advancing ivDst. + /// Copy the values from this matrix, starting from the row into dst, starting at slot ivDst and advancing ivDst. /// /// The starting row in this matrix /// The destination array diff --git a/src/Microsoft.ML.CpuMath/AssemblyInfo.cs b/src/Microsoft.ML.CpuMath/AssemblyInfo.cs new file mode 100644 index 0000000000..cb45bf5608 --- /dev/null +++ b/src/Microsoft.ML.CpuMath/AssemblyInfo.cs @@ -0,0 +1,9 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: InternalsVisibleTo("Microsoft.ML.StandardLearners, PublicKey=00240000048000009400000006020000002400005253413100040000010001004b86c4cb78549b34bab61a3b1800e23bfeb5b3ec390074041536a7e3cbd97f5f04cf0f857155a8928eaa29ebfd11cfbbad3ba70efea7bda3226c6a8d370a4cd303f714486b6ebc225985a638471e6ef571cc92a4613c00b8fa65d61ccee0cbe5f36330c9a01f4183559f1bef24cc2917c6d913e3a541333a1d05d9bed22b38cb")] \ No newline at end of file diff --git a/src/Microsoft.ML.CpuMath/Avx.cs b/src/Microsoft.ML.CpuMath/Avx.cs index 68e751c86b..6dcf898b6f 100644 --- a/src/Microsoft.ML.CpuMath/Avx.cs +++ b/src/Microsoft.ML.CpuMath/Avx.cs @@ -7,7 +7,7 @@ namespace Microsoft.ML.Runtime.Internal.CpuMath { /// - /// Keep Avx.cs in sync with Sse.cs. When making changes to one, use BeyondCompare or a similar tool + /// Keep Avx.cs in sync with Sse.cs. When making changes to one, use BeyondCompare or a similar tool /// to view diffs and propagate appropriate changes to the other. /// public static class AvxUtils @@ -21,7 +21,7 @@ private static bool Compat(AlignedArray a) return a.CbAlign == CbAlign; } - private unsafe static float* Ptr(AlignedArray a, float* p) + private static unsafe float* Ptr(AlignedArray a, float* p) { Contracts.AssertValue(a); float* q = p + a.GetBase((long)p); diff --git a/src/Microsoft.ML.CpuMath/CpuAligenedMathUtils.cs b/src/Microsoft.ML.CpuMath/CpuAligenedMathUtils.cs index 363c40007b..ad53810ff3 100644 --- a/src/Microsoft.ML.CpuMath/CpuAligenedMathUtils.cs +++ b/src/Microsoft.ML.CpuMath/CpuAligenedMathUtils.cs @@ -115,7 +115,7 @@ public static void MatTranTimesSrc(bool add, ICpuFullMatrix mat, ICpuVector src, public static class GeneralUtils { /// - /// Count the number of zero bits in the lonest string of zero's from the lowest significant bit of the input integer. + /// Count the number of zero bits in the lonest string of zero's from the lowest significant bit of the input integer. /// /// The input integer /// diff --git a/src/Microsoft.ML.CpuMath/ICpuBuffer.cs b/src/Microsoft.ML.CpuMath/ICpuBuffer.cs index e58a453f9f..ad55f5c8c6 100644 --- a/src/Microsoft.ML.CpuMath/ICpuBuffer.cs +++ b/src/Microsoft.ML.CpuMath/ICpuBuffer.cs @@ -77,8 +77,8 @@ public interface ICpuFullMatrix : ICpuMatrix /// /// Zero out the items with the given indices. - /// The indices contain the logical indices to the vectorized representation of the matrix, - /// which can be different depending on whether the matrix is row-major or column-major. + /// The indices contain the logical indices to the vectorized representation of the matrix, + /// which can be different depending on whether the matrix is row-major or column-major. /// void ZeroItems(int[] indices); } diff --git a/src/Microsoft.ML.CpuMath/IntUtils.cs b/src/Microsoft.ML.CpuMath/IntUtils.cs index b0aed315c3..2492dddaff 100644 --- a/src/Microsoft.ML.CpuMath/IntUtils.cs +++ b/src/Microsoft.ML.CpuMath/IntUtils.cs @@ -84,7 +84,7 @@ private static ulong Div64(ulong lo, ulong hi, ulong den, out ulong rem) return Div64Core(lo, hi, den, out rem); } - // REVIEW: on Linux, the hardware divide-by-zero exception is not translated into + // REVIEW: on Linux, the hardware divide-by-zero exception is not translated into // a managed exception properly by CoreCLR so the process will crash. This is a temporary fix // until CoreCLR addresses this issue. [DllImport(Thunk.NativePath, CharSet = CharSet.Unicode, EntryPoint = "Div64"), SuppressUnmanagedCodeSecurity] diff --git a/src/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.csproj b/src/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.csproj index 62ba4f3a6a..bde7ae89f5 100644 --- a/src/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.csproj +++ b/src/Microsoft.ML.CpuMath/Microsoft.ML.CpuMath.csproj @@ -1,14 +1,22 @@ - + - netstandard2.0 - Microsoft.ML + Debug;Release;Debug-Intrinsics;Release-Intrinsics + $(Configuration.EndsWith('-Intrinsics')) + + netstandard2.0 + netstandard2.0;netcoreapp3.0 + Microsoft.ML.CpuMath true - CORECLR + $(DefineConstants);CORECLR;PRIVATE_CONTRACTS - + + + + + diff --git a/src/Microsoft.ML.CpuMath/Sse.cs b/src/Microsoft.ML.CpuMath/Sse.cs index 77be547b69..68e6ee906b 100644 --- a/src/Microsoft.ML.CpuMath/Sse.cs +++ b/src/Microsoft.ML.CpuMath/Sse.cs @@ -7,7 +7,7 @@ namespace Microsoft.ML.Runtime.Internal.CpuMath { /// - /// Keep Sse.cs in sync with Avx.cs. When making changes to one, use BeyondCompare or a similar tool + /// Keep Sse.cs in sync with Avx.cs. When making changes to one, use BeyondCompare or a similar tool /// to view diffs and propagate appropriate changes to the other. /// public static class SseUtils @@ -21,7 +21,7 @@ private static bool Compat(AlignedArray a) return a.CbAlign == CbAlign; } - private unsafe static float* Ptr(AlignedArray a, float* p) + private static unsafe float* Ptr(AlignedArray a, float* p) { Contracts.AssertValue(a); float* q = p + a.GetBase((long)p); diff --git a/src/Microsoft.ML.CpuMath/Thunk.cs b/src/Microsoft.ML.CpuMath/Thunk.cs index bc23963bbe..d7082c8313 100644 --- a/src/Microsoft.ML.CpuMath/Thunk.cs +++ b/src/Microsoft.ML.CpuMath/Thunk.cs @@ -9,7 +9,7 @@ namespace Microsoft.ML.Runtime.Internal.CpuMath { - internal unsafe static class Thunk + internal static unsafe class Thunk { internal const string NativePath = "CpuMathNative"; diff --git a/src/Microsoft.ML.Data/Commands/CrossValidationCommand.cs b/src/Microsoft.ML.Data/Commands/CrossValidationCommand.cs index fc78e72c53..26ec32d3fe 100644 --- a/src/Microsoft.ML.Data/Commands/CrossValidationCommand.cs +++ b/src/Microsoft.ML.Data/Commands/CrossValidationCommand.cs @@ -254,7 +254,7 @@ private RoleMappedData ApplyAllTransformsToData(IHostEnvironment env, IChannel c RoleMappedData srcData, IDataView marker) { var pipe = ApplyTransformUtils.ApplyAllTransformsToData(env, srcData.Data, dstData, marker); - return RoleMappedData.Create(pipe, srcData.Schema.GetColumnRoleNames()); + return new RoleMappedData(pipe, srcData.Schema.GetColumnRoleNames()); } /// @@ -277,7 +277,7 @@ private RoleMappedData CreateRoleMappedData(IHostEnvironment env, IChannel ch, I // Training pipe and examples. var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn); - return TrainUtils.CreateExamples(data, label, features, group, weight, name, customCols); + return new RoleMappedData(data, label, features, group, weight, name, customCols); } private string GetSplitColumn(IChannel ch, IDataView input, ref IDataView output) @@ -538,7 +538,7 @@ private FoldResult RunFold(int fold) if (_getValidationDataView != null) { ch.Assert(_applyTransformsToValidationData != null); - if (!TrainUtils.CanUseValidationData(trainer)) + if (!trainer.Info.SupportsValidation) ch.Warning("Trainer does not accept validation dataset."); else { @@ -568,7 +568,7 @@ private FoldResult RunFold(int fold) { using (var file = host.CreateOutputFile(modelFileName)) { - var rmd = RoleMappedData.Create( + var rmd = new RoleMappedData( CompositeDataLoader.ApplyTransform(host, _loader, null, null, (e, newSource) => ApplyTransformUtils.ApplyAllTransformsToData(e, trainData.Data, newSource)), trainData.Schema.GetColumnRoleNames()); @@ -581,17 +581,17 @@ private FoldResult RunFold(int fold) if (!evalComp.IsGood()) evalComp = EvaluateUtils.GetEvaluatorType(ch, scorePipe.Schema); var eval = evalComp.CreateInstance(host); - // Note that this doesn't require the provided columns to exist (because of "Opt"). + // Note that this doesn't require the provided columns to exist (because of the "opt" parameter). // We don't normally expect the scorer to drop columns, but if it does, we should not require // all the columns in the test pipeline to still be present. - var dataEval = RoleMappedData.CreateOpt(scorePipe, testData.Schema.GetColumnRoleNames()); + var dataEval = new RoleMappedData(scorePipe, testData.Schema.GetColumnRoleNames(), opt: true); var dict = eval.Evaluate(dataEval); RoleMappedData perInstance = null; if (_savePerInstance) { var perInst = eval.GetPerInstanceMetrics(dataEval); - perInstance = RoleMappedData.CreateOpt(perInst, dataEval.Schema.GetColumnRoleNames()); + perInstance = new RoleMappedData(perInst, dataEval.Schema.GetColumnRoleNames(), opt: true); } ch.Done(); return new FoldResult(dict, dataEval.Schema.Schema, perInstance, trainData.Schema); diff --git a/src/Microsoft.ML.Data/Commands/DataCommand.cs b/src/Microsoft.ML.Data/Commands/DataCommand.cs index 435c25bf5b..2a62d78901 100644 --- a/src/Microsoft.ML.Data/Commands/DataCommand.cs +++ b/src/Microsoft.ML.Data/Commands/DataCommand.cs @@ -305,7 +305,7 @@ protected void LoadModelObjects( // can be loaded with no data at all, to get their schemas. if (trainPipe == null) trainPipe = ModelFileUtils.LoadLoader(Host, rep, new MultiFileSource(null), loadTransforms: true); - trainSchema = RoleMappedSchema.Create(trainPipe.Schema, trainRoleMappings); + trainSchema = new RoleMappedSchema(trainPipe.Schema, trainRoleMappings); } // If the role mappings are null, an alternative would be to fail. However the idea // is that the scorer should always still succeed, although perhaps with reduced diff --git a/src/Microsoft.ML.Data/Commands/EvaluateCommand.cs b/src/Microsoft.ML.Data/Commands/EvaluateCommand.cs index d0e066d789..77bdf0e32f 100644 --- a/src/Microsoft.ML.Data/Commands/EvaluateCommand.cs +++ b/src/Microsoft.ML.Data/Commands/EvaluateCommand.cs @@ -19,7 +19,7 @@ namespace Microsoft.ML.Runtime.Data { - // REVIEW: For simplicity (since this is currently the case), + // REVIEW: For simplicity (since this is currently the case), // we assume that all metrics are either numeric, or numeric vectors. /// /// This class contains information about an overall metric, namely its name and whether it is a vector @@ -92,7 +92,7 @@ public string GetNameMatch(string input) public interface IEvaluator { /// - /// Compute the aggregate metrics. Return a dictionary from the metric kind + /// Compute the aggregate metrics. Return a dictionary from the metric kind /// (overal/per-fold/confusion matrix/PR-curves etc.), to a data view containing the metric. /// Dictionary Evaluate(RoleMappedData data); @@ -158,7 +158,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV evalComp = EvaluateUtils.GetEvaluatorType(ch, input.Schema); var eval = evalComp.CreateInstance(env); - var data = TrainUtils.CreateExamples(input, label, null, group, weight, null, customCols); + var data = new RoleMappedData(input, label, null, group, weight, null, customCols); return eval.GetPerInstanceMetrics(data); } } @@ -236,7 +236,7 @@ private void RunCore(IChannel ch) if (!evalComp.IsGood()) evalComp = EvaluateUtils.GetEvaluatorType(ch, view.Schema); var evaluator = evalComp.CreateInstance(Host); - var data = TrainUtils.CreateExamples(view, label, null, group, weight, name, customCols); + var data = new RoleMappedData(view, label, null, group, weight, name, customCols); var metrics = evaluator.Evaluate(data); MetricWriter.PrintWarnings(ch, metrics); evaluator.PrintFoldResults(ch, metrics); @@ -248,7 +248,7 @@ private void RunCore(IChannel ch) if (!string.IsNullOrWhiteSpace(Args.OutputDataFile)) { var perInst = evaluator.GetPerInstanceMetrics(data); - var perInstData = TrainUtils.CreateExamples(perInst, label, null, group, weight, name, customCols); + var perInstData = new RoleMappedData(perInst, label, null, group, weight, name, customCols); var idv = evaluator.GetPerInstanceDataViewToSave(perInstData); MetricWriter.SavePerInstance(Host, ch, Args.OutputDataFile, idv); } diff --git a/src/Microsoft.ML.Data/Commands/SavePredictorCommand.cs b/src/Microsoft.ML.Data/Commands/SavePredictorCommand.cs index 505d3a28e6..e1057d18b4 100644 --- a/src/Microsoft.ML.Data/Commands/SavePredictorCommand.cs +++ b/src/Microsoft.ML.Data/Commands/SavePredictorCommand.cs @@ -219,7 +219,7 @@ public static void LoadModel(IHostEnvironment env, Stream modelStream, bool load if (roles != null) { var emptyView = ModelFileUtils.LoadPipeline(env, rep, new MultiFileSource(null)); - schema = RoleMappedSchema.CreateOpt(emptyView.Schema, roles); + schema = new RoleMappedSchema(emptyView.Schema, roles, opt: true); } else { diff --git a/src/Microsoft.ML.Data/Commands/ScoreCommand.cs b/src/Microsoft.ML.Data/Commands/ScoreCommand.cs index 02d655b48b..607bf119d7 100644 --- a/src/Microsoft.ML.Data/Commands/ScoreCommand.cs +++ b/src/Microsoft.ML.Data/Commands/ScoreCommand.cs @@ -97,10 +97,7 @@ private void RunCore(IChannel ch) ch.Trace("Creating loader"); - IPredictor predictor; - IDataLoader loader; - RoleMappedSchema trainSchema; - LoadModelObjects(ch, true, out predictor, true, out trainSchema, out loader); + LoadModelObjects(ch, true, out var predictor, true, out var trainSchema, out var loader); ch.AssertValue(predictor); ch.AssertValueOrNull(trainSchema); ch.AssertValue(loader); @@ -116,7 +113,7 @@ private void RunCore(IChannel ch) string group = TrainUtils.MatchNameOrDefaultOrNull(ch, loader.Schema, nameof(Args.GroupColumn), Args.GroupColumn, DefaultColumnNames.GroupId); var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn); - var schema = TrainUtils.CreateRoleMappedSchemaOpt(loader.Schema, feat, group, customCols); + var schema = new RoleMappedSchema(loader.Schema, label: null, feature: feat, group: group, custom: customCols, opt: true); var mapper = bindable.Bind(Host, schema); if (!scorer.IsGood()) @@ -153,22 +150,20 @@ private void RunCore(IChannel ch) Args.OutputAllColumns == true || Utils.Size(Args.OutputColumn) == 0; if (Args.OutputAllColumns == true && Utils.Size(Args.OutputColumn) != 0) - ch.Warning("outputAllColumns=+ always writes all columns irrespective of outputColumn specified."); + ch.Warning(nameof(Args.OutputAllColumns) + "=+ always writes all columns irrespective of " + nameof(Args.OutputColumn) + " specified."); if (!outputAllColumns && Utils.Size(Args.OutputColumn) != 0) { foreach (var outCol in Args.OutputColumn) { - int dummyColIndex; - if (!loader.Schema.TryGetColumnIndex(outCol, out dummyColIndex)) + if (!loader.Schema.TryGetColumnIndex(outCol, out int dummyColIndex)) throw ch.ExceptUserArg(nameof(Arguments.OutputColumn), "Column '{0}' not found.", outCol); } } - int colMax; uint maxScoreId = 0; if (!outputAllColumns) - maxScoreId = loader.Schema.GetMaxMetadataKind(out colMax, MetadataUtils.Kinds.ScoreColumnSetId); + maxScoreId = loader.Schema.GetMaxMetadataKind(out int colMax, MetadataUtils.Kinds.ScoreColumnSetId); ch.Assert(outputAllColumns || maxScoreId > 0); // score set IDs are one-based var cols = new List(); for (int i = 0; i < loader.Schema.ColumnCount; i++) @@ -211,12 +206,12 @@ private bool ShouldAddColumn(ISchema schema, int i, uint scoreSet, bool outputNa { switch (schema.GetColumnName(i)) { - case "Label": - case "Name": - case "Names": - return true; - default: - break; + case "Label": + case "Name": + case "Names": + return true; + default: + break; } } if (Args.OutputColumn != null && Array.FindIndex(Args.OutputColumn, schema.GetColumnName(i).Equals) >= 0) @@ -229,8 +224,7 @@ public static class ScoreUtils { public static IDataScorerTransform GetScorer(IPredictor predictor, RoleMappedData data, IHostEnvironment env, RoleMappedSchema trainSchema) { - ISchemaBoundMapper mapper; - var sc = GetScorerComponentAndMapper(predictor, null, data.Schema, env, out mapper); + var sc = GetScorerComponentAndMapper(predictor, null, data.Schema, env, out var mapper); return sc.CreateInstance(env, data.Data, mapper, trainSchema); } @@ -247,9 +241,8 @@ public static IDataScorerTransform GetScorer(SubComponent GetScorerC Contracts.AssertValue(mapper); string loadName = null; - DvText scoreKind = default(DvText); + DvText scoreKind = default; if (mapper.OutputSchema.ColumnCount > 0 && mapper.OutputSchema.TryGetMetadata(TextType.Instance, MetadataUtils.Kinds.ScoreColumnKind, 0, ref scoreKind) && scoreKind.HasChars) @@ -298,9 +291,9 @@ public static SubComponent GetScorerC /// /// Given a predictor and an optional scorer SubComponent, produces a compatible ISchemaBindableMapper. /// First, it tries to instantiate the bindable mapper using the - /// (this will only succeed if there's a registered BindableMapper creation method with load name equal to the one + /// (this will only succeed if there's a registered BindableMapper creation method with load name equal to the one /// of the scorer). - /// If the above fails, it checks whether the predictor implements + /// If the above fails, it checks whether the predictor implements /// directly. /// If this also isn't true, it will create a 'matching' standard mapper. /// @@ -311,10 +304,8 @@ public static ISchemaBindableMapper GetSchemaBindableMapper(IHostEnvironment env env.CheckValue(predictor, nameof(predictor)); env.CheckValueOrNull(scorerSettings); - ISchemaBindableMapper bindable; - // See if we can instantiate a mapper using scorer arguments. - if (scorerSettings.IsGood() && TryCreateBindableFromScorer(env, predictor, scorerSettings, out bindable)) + if (scorerSettings.IsGood() && TryCreateBindableFromScorer(env, predictor, scorerSettings, out var bindable)) return bindable; // The easy case is that the predictor implements the interface. diff --git a/src/Microsoft.ML.Data/Commands/TestCommand.cs b/src/Microsoft.ML.Data/Commands/TestCommand.cs index 79e7bd5458..d0ebbd5a05 100644 --- a/src/Microsoft.ML.Data/Commands/TestCommand.cs +++ b/src/Microsoft.ML.Data/Commands/TestCommand.cs @@ -114,7 +114,7 @@ private void RunCore(IChannel ch) if (!evalComp.IsGood()) evalComp = EvaluateUtils.GetEvaluatorType(ch, scorePipe.Schema); var evaluator = evalComp.CreateInstance(Host); - var data = TrainUtils.CreateExamples(scorePipe, label, null, group, weight, name, customCols); + var data = new RoleMappedData(scorePipe, label, null, group, weight, name, customCols); var metrics = evaluator.Evaluate(data); MetricWriter.PrintWarnings(ch, metrics); evaluator.PrintFoldResults(ch, metrics); @@ -128,7 +128,7 @@ private void RunCore(IChannel ch) if (!string.IsNullOrWhiteSpace(Args.OutputDataFile)) { var perInst = evaluator.GetPerInstanceMetrics(data); - var perInstData = TrainUtils.CreateExamples(perInst, label, null, group, weight, name, customCols); + var perInstData = new RoleMappedData(perInst, label, null, group, weight, name, customCols); var idv = evaluator.GetPerInstanceDataViewToSave(perInstData); MetricWriter.SavePerInstance(Host, ch, Args.OutputDataFile, idv); } diff --git a/src/Microsoft.ML.Data/Commands/TrainCommand.cs b/src/Microsoft.ML.Data/Commands/TrainCommand.cs index e55a5a3992..69370ad3ef 100644 --- a/src/Microsoft.ML.Data/Commands/TrainCommand.cs +++ b/src/Microsoft.ML.Data/Commands/TrainCommand.cs @@ -157,13 +157,13 @@ private void RunCore(IChannel ch, string cmd) ch.Trace("Binding columns"); var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn); - var data = TrainUtils.CreateExamples(view, label, feature, group, weight, name, customCols); + var data = new RoleMappedData(view, label, feature, group, weight, name, customCols); // REVIEW: Unify the code that creates validation examples in Train, TrainTest and CV commands. RoleMappedData validData = null; if (!string.IsNullOrWhiteSpace(Args.ValidationFile)) { - if (!TrainUtils.CanUseValidationData(trainer)) + if (!trainer.Info.SupportsValidation) { ch.Warning("Ignoring validationFile: Trainer does not accept validation dataset."); } @@ -172,7 +172,7 @@ private void RunCore(IChannel ch, string cmd) ch.Trace("Constructing the validation pipeline"); IDataView validPipe = CreateRawLoader(dataFile: Args.ValidationFile); validPipe = ApplyTransformUtils.ApplyAllTransformsToData(Host, view, validPipe); - validData = RoleMappedData.Create(validPipe, data.Schema.GetColumnRoleNames()); + validData = new RoleMappedData(validPipe, data.Schema.GetColumnRoleNames()); } } @@ -222,9 +222,9 @@ public static string MatchNameOrDefaultOrNull(IExceptionContext ectx, ISchema sc return userName; if (userName == defaultName) return null; -#pragma warning disable TLC_ContractsNameUsesNameof +#pragma warning disable MSML_ContractsNameUsesNameof throw ectx.ExceptUserArg(argName, $"Could not find column '{userName}'"); -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof } public static IPredictor Train(IHostEnvironment env, IChannel ch, RoleMappedData data, ITrainer trainer, string name, @@ -235,14 +235,14 @@ public static IPredictor Train(IHostEnvironment env, IChannel ch, RoleMappedData } public static IPredictor Train(IHostEnvironment env, IChannel ch, RoleMappedData data, ITrainer trainer, string name, RoleMappedData validData, - SubComponent calibrator, int maxCalibrationExamples, bool? cacheData, IPredictor inpPredictor = null) + SubComponent calibrator, int maxCalibrationExamples, bool? cacheData, IPredictor inputPredictor = null) { ICalibratorTrainer caliTrainer = !calibrator.IsGood() ? null : calibrator.CreateInstance(env); - return TrainCore(env, ch, data, trainer, name, validData, caliTrainer, maxCalibrationExamples, cacheData, inpPredictor); + return TrainCore(env, ch, data, trainer, name, validData, caliTrainer, maxCalibrationExamples, cacheData, inputPredictor); } private static IPredictor TrainCore(IHostEnvironment env, IChannel ch, RoleMappedData data, ITrainer trainer, string name, RoleMappedData validData, - ICalibratorTrainer calibrator, int maxCalibrationExamples, bool? cacheData, IPredictor inpPredictor = null) + ICalibratorTrainer calibrator, int maxCalibrationExamples, bool? cacheData, IPredictor inputPredictor = null) { Contracts.CheckValue(env, nameof(env)); env.CheckValue(ch, nameof(ch)); @@ -250,79 +250,22 @@ private static IPredictor TrainCore(IHostEnvironment env, IChannel ch, RoleMappe ch.CheckValue(trainer, nameof(trainer)); ch.CheckNonEmpty(name, nameof(name)); ch.CheckValueOrNull(validData); - ch.CheckValueOrNull(inpPredictor); + ch.CheckValueOrNull(inputPredictor); - var trainerRmd = trainer as ITrainer; - if (trainerRmd == null) - throw ch.ExceptUserArg(nameof(TrainCommand.Arguments.Trainer), "Trainer '{0}' does not accept known training data type", name); - - Action, object, object, object> trainCoreAction = TrainCore; - IPredictor predictor; AddCacheIfWanted(env, ch, trainer, ref data, cacheData); ch.Trace("Training"); if (validData != null) AddCacheIfWanted(env, ch, trainer, ref validData, cacheData); - var genericExam = trainCoreAction.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod( - typeof(RoleMappedData), - inpPredictor != null ? inpPredictor.GetType() : typeof(IPredictor)); - Action trainExam = trainerRmd.Train; - genericExam.Invoke(null, new object[] { ch, trainerRmd, trainExam, data, validData, inpPredictor }); - - ch.Trace("Constructing predictor"); - predictor = trainerRmd.CreatePredictor(); - return CalibratorUtils.TrainCalibratorIfNeeded(env, ch, calibrator, maxCalibrationExamples, trainer, predictor, data); - } - - public static bool CanUseValidationData(ITrainer trainer) - { - Contracts.CheckValue(trainer, nameof(trainer)); - - if (trainer is ITrainer) - return trainer is IValidatingTrainer; - - return false; - } - - private static void TrainCore(IChannel ch, ITrainer trainer, Action train, TDataSet data, TDataSet validData = null, TPredictor predictor = null) - where TDataSet : class - where TPredictor : class - { - const string inputModelArg = nameof(TrainCommand.Arguments.InputModelFile); - if (validData != null) - { - if (predictor != null) - { - var incValidTrainer = trainer as IIncrementalValidatingTrainer; - if (incValidTrainer != null) - { - incValidTrainer.Train(data, validData, predictor); - return; - } - - ch.Warning("Ignoring " + inputModelArg + ": Trainer is not an incremental trainer."); - } - - var validTrainer = trainer as IValidatingTrainer; - ch.AssertValue(validTrainer); - validTrainer.Train(data, validData); - } - else + if (inputPredictor != null && !trainer.Info.SupportsIncrementalTraining) { - if (predictor != null) - { - var incTrainer = trainer as IIncrementalTrainer; - if (incTrainer != null) - { - incTrainer.Train(data, predictor); - return; - } - - ch.Warning("Ignoring " + inputModelArg + ": Trainer is not an incremental trainer."); - } - - train(data); + ch.Warning("Ignoring " + nameof(TrainCommand.Arguments.InputModelFile) + + ": Trainer does not support incremental training."); + inputPredictor = null; } + ch.Assert(validData == null || trainer.Info.SupportsValidation); + var predictor = trainer.Train(new TrainContext(data, validData, inputPredictor)); + return CalibratorUtils.TrainCalibratorIfNeeded(env, ch, calibrator, maxCalibrationExamples, trainer, predictor, data); } public static bool TryLoadPredictor(IChannel ch, IHostEnvironment env, string inputModelFile, out IPredictor inputPredictor) @@ -348,7 +291,7 @@ public static bool TryLoadPredictor(IChannel ch, IHostEnvironment env, string in /// /// Save the model to the output path. - /// The method saves the loader and the transformations of dataPipe and saves optionally predictor + /// The method saves the loader and the transformations of dataPipe and saves optionally predictor /// and command. It also uses featureColumn, if provided, to extract feature names. /// /// The host environment to use. @@ -373,7 +316,7 @@ public static void SaveModel(IHostEnvironment env, IChannel ch, IFileHandle outp /// /// Save the model to the stream. - /// The method saves the loader and the transformations of dataPipe and saves optionally predictor + /// The method saves the loader and the transformations of dataPipe and saves optionally predictor /// and command. It also uses featureColumn, if provided, to extract feature names. /// /// The host environment to use. @@ -438,9 +381,8 @@ public static void SaveDataPipe(IHostEnvironment env, RepositoryWriter repositor IDataView pipeStart; var xfs = BacktrackPipe(dataPipe, out pipeStart); - IDataLoader loader; Action saveAction; - if (!blankLoader && (loader = pipeStart as IDataLoader) != null) + if (!blankLoader && pipeStart is IDataLoader loader) saveAction = loader.Save; else { @@ -458,7 +400,7 @@ public static void SaveDataPipe(IHostEnvironment env, RepositoryWriter repositor /// /// Traces back the .Source chain of the transformation pipe up to the moment it no longer can. - /// Returns all the transforms of and the first data view (a non-transform). + /// Returns all the transforms of and the first data view (a non-transform). /// /// The transformation pipe to traverse. /// The beginning data view of the transform chain @@ -468,16 +410,11 @@ private static List BacktrackPipe(IDataView dataPipe, out IDataV Contracts.AssertValue(dataPipe); var transforms = new List(); - while (true) + while (dataPipe is IDataTransform xf) { // REVIEW: a malicious user could construct a loop in the Source chain, that would - // cause this method to iterate forever (and throw something when the list overflows). There's + // cause this method to iterate forever (and throw something when the list overflows). There's // no way to insulate from ALL malicious behavior. - - var xf = dataPipe as IDataTransform; - if (xf == null) - break; - transforms.Add(xf); dataPipe = xf.Source; Contracts.AssertValue(dataPipe); @@ -514,11 +451,8 @@ public static bool AddNormalizerIfNeeded(IHostEnvironment env, IChannel ch, ITra { if (autoNorm != NormalizeOption.Yes) { - var nn = trainer as ITrainerEx; DvBool isNormalized = DvBool.False; - if (nn == null || !nn.NeedNormalization || - (schema.TryGetMetadata(BoolType.Instance, MetadataUtils.Kinds.IsNormalized, featCol, ref isNormalized) && - isNormalized.IsTrue)) + if (!trainer.Info.NeedNormalization || schema.IsNormalized(featCol)) { ch.Info("Not adding a normalizer."); return false; @@ -530,20 +464,13 @@ public static bool AddNormalizerIfNeeded(IHostEnvironment env, IChannel ch, ITra } } ch.Info("Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off."); - // Quote the feature column name - string quotedFeatureColumnName = featureColumn; - StringBuilder sb = new StringBuilder(); - if (CmdQuoter.QuoteValue(quotedFeatureColumnName, sb)) - quotedFeatureColumnName = sb.ToString(); - var component = new SubComponent("MinMax", string.Format("col={{ name={0} source={0} }}", quotedFeatureColumnName)); - var loader = view as IDataLoader; - if (loader != null) - { - view = CompositeDataLoader.Create(env, loader, - new KeyValuePair>(null, component)); - } + IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input) + => NormalizeTransform.CreateMinMaxNormalizer(innerEnv, input, featureColumn); + + if (view is IDataLoader loader) + view = CompositeDataLoader.ApplyTransform(env, loader, tag: null, creationArgs: null, ApplyNormalizer); else - view = component.CreateInstance(env, view); + view = ApplyNormalizer(env, view); return true; } return false; @@ -556,8 +483,7 @@ private static bool AddCacheIfWanted(IHostEnvironment env, IChannel ch, ITrainer ch.AssertValue(trainer, nameof(trainer)); ch.AssertValue(data, nameof(data)); - ITrainerEx trainerEx = trainer as ITrainerEx; - bool shouldCache = cacheData ?? (!(data.Data is BinaryLoader) && (trainerEx == null || trainerEx.WantCaching)); + bool shouldCache = cacheData ?? !(data.Data is BinaryLoader) && trainer.Info.WantCaching; if (shouldCache) { @@ -565,7 +491,7 @@ private static bool AddCacheIfWanted(IHostEnvironment env, IChannel ch, ITrainer var prefetch = data.Schema.GetColumnRoles().Select(kc => kc.Value.Index).ToArray(); var cacheView = new CacheDataView(env, data.Data, prefetch); // Because the prefetching worked, we know that these are valid columns. - data = RoleMappedData.Create(cacheView, data.Schema.GetColumnRoleNames()); + data = new RoleMappedData(cacheView, data.Schema.GetColumnRoleNames()); } else ch.Trace("Not caching"); @@ -586,97 +512,5 @@ public static IEnumerable> CheckAndGenerateCust } return customColumnArg.Select(kindName => new ColumnRole(kindName.Key).Bind(kindName.Value)); } - - /// - /// Given a schema and a bunch of column names, create the BoundSchema object. Any or all of the column - /// names may be null or whitespace, in which case they are ignored. Any columns that are specified but not - /// valid columns of the schema are also ignored. - /// - public static RoleMappedSchema CreateRoleMappedSchemaOpt(ISchema schema, string feature, string group, IEnumerable> custom = null) - { - Contracts.CheckValueOrNull(feature); - Contracts.CheckValueOrNull(custom); - - var list = new List>(); - if (!string.IsNullOrWhiteSpace(feature)) - list.Add(ColumnRole.Feature.Bind(feature)); - if (!string.IsNullOrWhiteSpace(group)) - list.Add(ColumnRole.Group.Bind(group)); - if (custom != null) - list.AddRange(custom); - - return RoleMappedSchema.CreateOpt(schema, list); - } - - /// - /// Given a view and a bunch of column names, create the RoleMappedData object. Any or all of the column - /// names may be null or whitespace, in which case they are ignored. Any columns that are specified must - /// be valid columns of the schema. - /// - public static RoleMappedData CreateExamples(IDataView view, string label, string feature, - string group = null, string weight = null, string name = null, - IEnumerable> custom = null) - { - Contracts.CheckValueOrNull(label); - Contracts.CheckValueOrNull(feature); - Contracts.CheckValueOrNull(group); - Contracts.CheckValueOrNull(weight); - Contracts.CheckValueOrNull(name); - Contracts.CheckValueOrNull(custom); - - var list = new List>(); - if (!string.IsNullOrWhiteSpace(label)) - list.Add(ColumnRole.Label.Bind(label)); - if (!string.IsNullOrWhiteSpace(feature)) - list.Add(ColumnRole.Feature.Bind(feature)); - if (!string.IsNullOrWhiteSpace(group)) - list.Add(ColumnRole.Group.Bind(group)); - if (!string.IsNullOrWhiteSpace(weight)) - list.Add(ColumnRole.Weight.Bind(weight)); - if (!string.IsNullOrWhiteSpace(name)) - list.Add(ColumnRole.Name.Bind(name)); - if (custom != null) - list.AddRange(custom); - - return RoleMappedData.Create(view, list); - } - - /// - /// Given a view and a bunch of column names, create the RoleMappedData object. Any or all of the column - /// names may be null or whitespace, in which case they are ignored. Any columns that are specified but not - /// valid columns of the schema are also ignored. - /// - public static RoleMappedData CreateExamplesOpt(IDataView view, string label, string feature, - string group = null, string weight = null, string name = null, - IEnumerable> custom = null) - { - Contracts.CheckValueOrNull(label); - Contracts.CheckValueOrNull(feature); - Contracts.CheckValueOrNull(group); - Contracts.CheckValueOrNull(weight); - Contracts.CheckValueOrNull(name); - Contracts.CheckValueOrNull(custom); - - var list = new List>(); - if (!string.IsNullOrWhiteSpace(label)) - list.Add(ColumnRole.Label.Bind(label)); - if (!string.IsNullOrWhiteSpace(feature)) - list.Add(ColumnRole.Feature.Bind(feature)); - if (!string.IsNullOrWhiteSpace(group)) - list.Add(ColumnRole.Group.Bind(group)); - if (!string.IsNullOrWhiteSpace(weight)) - list.Add(ColumnRole.Weight.Bind(weight)); - if (!string.IsNullOrWhiteSpace(name)) - list.Add(ColumnRole.Name.Bind(name)); - if (custom != null) - list.AddRange(custom); - - return RoleMappedData.CreateOpt(view, list); - } - - private static KeyValuePair Pair(ColumnRole kind, T value) - { - return new KeyValuePair(kind, value); - } } } diff --git a/src/Microsoft.ML.Data/Commands/TrainTestCommand.cs b/src/Microsoft.ML.Data/Commands/TrainTestCommand.cs index f6ffa772f9..03ee7cdf12 100644 --- a/src/Microsoft.ML.Data/Commands/TrainTestCommand.cs +++ b/src/Microsoft.ML.Data/Commands/TrainTestCommand.cs @@ -147,12 +147,12 @@ private void RunCore(IChannel ch, string cmd) ch.Trace("Binding columns"); var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn); - var data = TrainUtils.CreateExamples(trainPipe, label, features, group, weight, name, customCols); + var data = new RoleMappedData(trainPipe, label, features, group, weight, name, customCols); RoleMappedData validData = null; if (!string.IsNullOrWhiteSpace(Args.ValidationFile)) { - if (!TrainUtils.CanUseValidationData(trainer)) + if (!trainer.Info.SupportsValidation) { ch.Warning("Ignoring validationFile: Trainer does not accept validation dataset."); } @@ -161,7 +161,7 @@ private void RunCore(IChannel ch, string cmd) ch.Trace("Constructing the validation pipeline"); IDataView validPipe = CreateRawLoader(dataFile: Args.ValidationFile); validPipe = ApplyTransformUtils.ApplyAllTransformsToData(Host, trainPipe, validPipe); - validData = RoleMappedData.Create(validPipe, data.Schema.GetColumnRoleNames()); + validData = new RoleMappedData(validPipe, data.Schema.GetColumnRoleNames()); } } @@ -189,8 +189,8 @@ private void RunCore(IChannel ch, string cmd) if (!evalComp.IsGood()) evalComp = EvaluateUtils.GetEvaluatorType(ch, scorePipe.Schema); var evaluator = evalComp.CreateInstance(Host); - var dataEval = TrainUtils.CreateExamplesOpt(scorePipe, label, features, - group, weight, name, customCols); + var dataEval = new RoleMappedData(scorePipe, label, features, + group, weight, name, customCols, opt: true); var metrics = evaluator.Evaluate(dataEval); MetricWriter.PrintWarnings(ch, metrics); evaluator.PrintFoldResults(ch, metrics); @@ -204,7 +204,7 @@ private void RunCore(IChannel ch, string cmd) if (!string.IsNullOrWhiteSpace(Args.OutputDataFile)) { var perInst = evaluator.GetPerInstanceMetrics(dataEval); - var perInstData = TrainUtils.CreateExamples(perInst, label, null, group, weight, name, customCols); + var perInstData = new RoleMappedData(perInst, label, null, group, weight, name, customCols); var idv = evaluator.GetPerInstanceDataViewToSave(perInstData); MetricWriter.SavePerInstance(Host, ch, Args.OutputDataFile, idv); } diff --git a/src/Microsoft.ML.Data/Data/Combiner.cs b/src/Microsoft.ML.Data/Data/Combiner.cs index 9a5de27ff6..ee45aee3e3 100644 --- a/src/Microsoft.ML.Data/Data/Combiner.cs +++ b/src/Microsoft.ML.Data/Data/Combiner.cs @@ -21,7 +21,7 @@ public abstract class Combiner public sealed class TextCombiner : Combiner { - private volatile static TextCombiner _instance; + private static volatile TextCombiner _instance; public static TextCombiner Instance { get @@ -46,7 +46,7 @@ public override void Combine(ref DvText dst, DvText src) public sealed class FloatAdder : Combiner { - private volatile static FloatAdder _instance; + private static volatile FloatAdder _instance; public static FloatAdder Instance { get @@ -67,7 +67,7 @@ private FloatAdder() public sealed class R4Adder : Combiner { - private volatile static R4Adder _instance; + private static volatile R4Adder _instance; public static R4Adder Instance { get @@ -88,7 +88,7 @@ private R4Adder() public sealed class R8Adder : Combiner { - private volatile static R8Adder _instance; + private static volatile R8Adder _instance; public static R8Adder Instance { get @@ -110,7 +110,7 @@ private R8Adder() // REVIEW: Delete this! public sealed class U4Adder : Combiner { - private volatile static U4Adder _instance; + private static volatile U4Adder _instance; public static U4Adder Instance { get diff --git a/src/Microsoft.ML.Data/Data/Conversion.cs b/src/Microsoft.ML.Data/Data/Conversion.cs index 974f40c39d..0a9833064a 100644 --- a/src/Microsoft.ML.Data/Data/Conversion.cs +++ b/src/Microsoft.ML.Data/Data/Conversion.cs @@ -53,7 +53,7 @@ public sealed class Conversions // REVIEW: Reconcile implementations with TypeUtils, and clarify the distinction. // Singleton pattern. - private volatile static Conversions _instance; + private static volatile Conversions _instance; public static Conversions Instance { get diff --git a/src/Microsoft.ML.Data/Data/DataViewUtils.cs b/src/Microsoft.ML.Data/Data/DataViewUtils.cs index 4772228fa0..1db4d5ad0a 100644 --- a/src/Microsoft.ML.Data/Data/DataViewUtils.cs +++ b/src/Microsoft.ML.Data/Data/DataViewUtils.cs @@ -286,9 +286,9 @@ private sealed class Splitter private enum ExtraIndex { Id, -#pragma warning disable TLC_GeneralName // Allow for this private enum. +#pragma warning disable MSML_GeneralName // Allow for this private enum. _Lim -#pragma warning restore TLC_GeneralName +#pragma warning restore MSML_GeneralName } private Splitter(ISchema schema) diff --git a/src/Microsoft.ML.Data/Data/IColumn.cs b/src/Microsoft.ML.Data/Data/IColumn.cs index 28d6ffd057..2f2f496f99 100644 --- a/src/Microsoft.ML.Data/Data/IColumn.cs +++ b/src/Microsoft.ML.Data/Data/IColumn.cs @@ -13,16 +13,16 @@ namespace Microsoft.ML.Runtime.Data /// /// This interface is an analogy to that encapsulates the contents of a single /// column. - /// + /// /// Note that in the same sense that is not thread safe, implementors of this interface /// by similar token must not be considered thread safe by users of the interface, and by the same token /// implementors should feel free to write their implementations with the expectation that only one thread /// will be calling it at a time. - /// + /// /// Similarly, in the same sense that an can have its values "change under it" by having /// the underlying cursor move, so too might this item have its values change under it, and they will if /// they were directly instantiated from a row. - /// + /// /// Generally actual implementors of this interface should not implement this directly, but instead implement /// . /// @@ -495,7 +495,7 @@ public override ValueGetter GetGetter() /// private sealed class RowColumnRow : IRow { - private readonly static DefaultCountedImpl _defCount = new DefaultCountedImpl(); + private static readonly DefaultCountedImpl _defCount = new DefaultCountedImpl(); private readonly ICounted _counted; private readonly IColumn[] _columns; private readonly SchemaImpl _schema; diff --git a/src/Microsoft.ML.Data/Data/IRowSeekable.cs b/src/Microsoft.ML.Data/Data/IRowSeekable.cs index c2fb54bf70..3c0bf0db08 100644 --- a/src/Microsoft.ML.Data/Data/IRowSeekable.cs +++ b/src/Microsoft.ML.Data/Data/IRowSeekable.cs @@ -6,7 +6,7 @@ namespace Microsoft.ML.Runtime.Data { - // REVIEW: Would it be a better apporach to add something akin to CanSeek, + // REVIEW: Would it be a better apporach to add something akin to CanSeek, // as we have a CanShuffle? The idea is trying to make IRowSeekable propagate along certain transforms. /// /// Represents a data view that supports random access to a specific row. @@ -18,14 +18,14 @@ public interface IRowSeekable : ISchematized /// /// Represents a row seeker with random access that can retrieve a specific row by the row index. - /// For IRowSeeker, when the state is valid (that is when MoveTo() returns true), it returns the - /// current row index. Otherwise it's -1. + /// For IRowSeeker, when the state is valid (that is when MoveTo() returns true), it returns the + /// current row index. Otherwise it's -1. /// public interface IRowSeeker : IRow, IDisposable { /// /// Moves the seeker to a row at a specific row index. - /// If the row index specified is out of range (less than zero or not less than the + /// If the row index specified is out of range (less than zero or not less than the /// row count), it returns false and sets its Position property to -1. /// /// The row index to move to. diff --git a/src/Microsoft.ML.Data/Data/ITransposeDataView.cs b/src/Microsoft.ML.Data/Data/ITransposeDataView.cs index 2188c766de..f247bc9859 100644 --- a/src/Microsoft.ML.Data/Data/ITransposeDataView.cs +++ b/src/Microsoft.ML.Data/Data/ITransposeDataView.cs @@ -18,7 +18,7 @@ namespace Microsoft.ML.Runtime.Data /// ). This interface is intended to be implemented by classes that /// want to provide an option for an alternate way of accessing the data stored in a /// . - /// + /// /// The interface only advertises that columns may be accessible in slot-wise fashion. A column /// is accessible in this fashion iff 's /// returns a non-null value. diff --git a/src/Microsoft.ML.Data/Data/RowCursorUtils.cs b/src/Microsoft.ML.Data/Data/RowCursorUtils.cs index 3f57266b0f..091fe26cb2 100644 --- a/src/Microsoft.ML.Data/Data/RowCursorUtils.cs +++ b/src/Microsoft.ML.Data/Data/RowCursorUtils.cs @@ -39,7 +39,7 @@ private static Delegate GetGetterAsDelegateCore(IRow row, int col) /// /// Given a destination type, IRow, and column index, return a ValueGetter for the column - /// with a conversion to typeDst, if needed. This is a weakly typed version of + /// with a conversion to typeDst, if needed. This is a weakly typed version of /// . /// /// @@ -293,7 +293,7 @@ private static ValueGetter> GetVecGetterAsCore(VectorT /// /// This method returns a small helper delegate that returns whether we are at the start - /// of a new group, that is, we have just started, or the key-value at indicated column + /// of a new group, that is, we have just started, or the key-value at indicated column /// is different than it was, in the last call. This is practically useful for determining /// group boundaries. Note that the delegate will return true on the first row. /// diff --git a/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs b/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs index 4a58e097fb..7bc0a8d2ad 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs @@ -79,7 +79,7 @@ private sealed class TableOfContentsEntry public readonly ColumnType Type; /// - /// The compression scheme used on this column's blocks. + /// The compression scheme used on this column's blocks. /// public readonly CompressionKind Compression; @@ -971,7 +971,7 @@ public void Save(ModelSaveContext ctx) } /// - /// Write the parameters of a loader to the save context. Can be called by , where there's no actual + /// Write the parameters of a loader to the save context. Can be called by , where there's no actual /// loader, only default parameters. /// private static void SaveParameters(ModelSaveContext ctx, int threads, string generatedRowIndexName, Double shuffleBlocks) @@ -991,7 +991,7 @@ private static void SaveParameters(ModelSaveContext ctx, int threads, string gen } /// - /// Save a zero-row dataview that will be used to infer schema information, used in the case + /// Save a zero-row dataview that will be used to infer schema information, used in the case /// where the binary loader is instantiated with no input streams. /// private static void SaveSchema(IHostEnvironment env, ModelSaveContext ctx, ISchema schema, out int[] unsavableColIndices) @@ -1017,10 +1017,10 @@ private static void SaveSchema(IHostEnvironment env, ModelSaveContext ctx, ISche } /// - /// Given the schema and a model context, save an imaginary instance of a binary loader with the - /// specified schema. Deserialization from this context should produce a real binary loader that + /// Given the schema and a model context, save an imaginary instance of a binary loader with the + /// specified schema. Deserialization from this context should produce a real binary loader that /// has the specified schema. - /// + /// /// This is used in an API scenario, when the data originates from something other than a loader. /// Since our model file requires a loader at the beginning, we have to construct a bogus 'binary' loader /// to begin the pipe with, with the assumption that the user will bypass the loader at deserialization @@ -1042,9 +1042,9 @@ public static void SaveInstance(IHostEnvironment env, ModelSaveContext ctx, ISch int[] unsavable; SaveSchema(env, ctx, schema, out unsavable); // REVIEW: we silently ignore unsavable columns. - // This method is invoked only in an API scenario, where we need to save a loader but we only have a schema. - // In this case, the API user is likely not subscribed to our environment's channels. Also, in this case, the presence of - // unsavable columns is not necessarily a bad thing: the user typically provides his own data when loading the transforms, + // This method is invoked only in an API scenario, where we need to save a loader but we only have a schema. + // In this case, the API user is likely not subscribed to our environment's channels. Also, in this case, the presence of + // unsavable columns is not necessarily a bad thing: the user typically provides his own data when loading the transforms, // thus bypassing the bogus loader. } diff --git a/src/Microsoft.ML.Data/DataLoadSave/Binary/BinarySaver.cs b/src/Microsoft.ML.Data/DataLoadSave/Binary/BinarySaver.cs index 7fe9fbbf4a..e2f44df2a4 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Binary/BinarySaver.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Binary/BinarySaver.cs @@ -850,7 +850,7 @@ public ColumnType LoadTypeDescriptionOrNull(Stream stream) /// The type of the codec to write and utilize /// The value to encode and write /// The number of bytes written - /// Whether the write was successful or not + /// Whether the write was successful or not public bool TryWriteTypeAndValue(Stream stream, ColumnType type, ref T value, out int bytesWritten) { _host.CheckValue(stream, nameof(stream)); diff --git a/src/Microsoft.ML.Data/DataLoadSave/Binary/IValueCodec.cs b/src/Microsoft.ML.Data/DataLoadSave/Binary/IValueCodec.cs index fd68a34cc9..9c6e607022 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Binary/IValueCodec.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Binary/IValueCodec.cs @@ -13,7 +13,7 @@ namespace Microsoft.ML.Runtime.Data.IO /// on the appropriate ColumnType, then opens multiple writers to write blocks of data /// to some stream. The idea is that each writer or reader is called on some "managable chunk" /// of data. - /// + /// /// Codecs should be thread safe, though the readers and writers they spawn do not need to /// be thread safe. /// @@ -60,7 +60,7 @@ internal interface IValueCodec : IValueCodec /// Stream on which we open reader. /// The number of items expected to be encoded in the block /// starting from the current position of the stream. Implementors should, if - /// possible, throw if it seems if the block contains a different number of + /// possible, throw if it seems if the block contains a different number of /// elements. IValueReader OpenReader(Stream stream, int items); } @@ -89,7 +89,7 @@ internal interface IValueWriter : IDisposable /// be spawned from an , its write methods called some /// number of times to write to the stream, and then Commit will be called when /// all values have been written, the stream now being at the end of the written block. - /// + /// /// The intended usage of the value writers is that blocks are composed of some small /// number of values (perhaps a few thousand), the idea being that a block is something /// that should easily fit in main memory, both for reading and writing. Some writers diff --git a/src/Microsoft.ML.Data/DataLoadSave/Binary/Zlib/Zlib.cs b/src/Microsoft.ML.Data/DataLoadSave/Binary/Zlib/Zlib.cs index 4dcc82ac9b..024eaef4a2 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Binary/Zlib/Zlib.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Binary/Zlib/Zlib.cs @@ -13,20 +13,20 @@ internal static class Zlib public const string DllPath = "zlib.dll"; [DllImport(DllPath), SuppressUnmanagedCodeSecurity] - private static unsafe extern Constants.RetCode deflateInit2_(ZStream* strm, int level, int method, int windowBits, + private static extern unsafe Constants.RetCode deflateInit2_(ZStream* strm, int level, int method, int windowBits, int memLevel, Constants.Strategy strategy, byte* version, int streamSize); [DllImport(DllPath), SuppressUnmanagedCodeSecurity] - private static unsafe extern Constants.RetCode inflateInit2_(ZStream* strm, int windowBits, byte* version, int streamSize); + private static extern unsafe Constants.RetCode inflateInit2_(ZStream* strm, int windowBits, byte* version, int streamSize); [DllImport(DllPath), SuppressUnmanagedCodeSecurity] - private static unsafe extern byte* zlibVersion(); + private static extern unsafe byte* zlibVersion(); [DllImport(DllPath), SuppressUnmanagedCodeSecurity] - public static unsafe extern Constants.RetCode deflateEnd(ZStream* strm); + public static extern unsafe Constants.RetCode deflateEnd(ZStream* strm); [DllImport(DllPath), SuppressUnmanagedCodeSecurity] - public static unsafe extern Constants.RetCode deflate(ZStream* strm, Constants.Flush flush); + public static extern unsafe Constants.RetCode deflate(ZStream* strm, Constants.Flush flush); public static unsafe Constants.RetCode DeflateInit2(ZStream* strm, int level, int method, int windowBits, int memLevel, Constants.Strategy strategy) @@ -40,10 +40,10 @@ public static unsafe Constants.RetCode InflateInit2(ZStream* strm, int windowBit } [DllImport(DllPath), SuppressUnmanagedCodeSecurity] - public static unsafe extern Constants.RetCode inflate(ZStream* strm, Constants.Flush flush); + public static extern unsafe Constants.RetCode inflate(ZStream* strm, Constants.Flush flush); [DllImport(DllPath), SuppressUnmanagedCodeSecurity] - public static unsafe extern Constants.RetCode inflateEnd(ZStream* strm); + public static extern unsafe Constants.RetCode inflateEnd(ZStream* strm); } [StructLayout(LayoutKind.Sequential)] diff --git a/src/Microsoft.ML.Data/DataLoadSave/CompositeDataLoader.cs b/src/Microsoft.ML.Data/DataLoadSave/CompositeDataLoader.cs index 4a7106c2df..a2ab3a7b16 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/CompositeDataLoader.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/CompositeDataLoader.cs @@ -41,7 +41,7 @@ public sealed class Arguments public KeyValuePair>[] Transform; } - internal struct TransformEx + private struct TransformEx { public readonly string Tag; public readonly string ArgsString; @@ -78,16 +78,14 @@ private static VersionInfo GetVersionInfo() // The composition of loader plus transforms in order. private readonly IDataLoader _loader; private readonly TransformEx[] _transforms; - private readonly IDataView _view; private readonly ITransposeDataView _tview; - private readonly ITransposeSchema _tschema; private readonly IHost _host; /// /// Returns the underlying data view of the composite loader. /// This can be used to programmatically explore the chain of transforms that's inside the composite loader. /// - internal IDataView View { get { return _view; } } + public IDataView View { get; } /// /// Creates a loader according to the specified . @@ -200,7 +198,7 @@ private static IDataLoader ApplyTransformsCore(IHost host, IDataLoader srcLoader IDataLoader pipeStart; if (composite != null) { - srcView = composite._view; + srcView = composite.View; exes.AddRange(composite._transforms); pipeStart = composite._loader; } @@ -409,9 +407,9 @@ private CompositeDataLoader(IHost host, TransformEx[] transforms) _host = host; _host.AssertNonEmpty(transforms); - _view = transforms[transforms.Length - 1].Transform; - _tview = _view as ITransposeDataView; - _tschema = _tview == null ? new TransposerUtils.SimpleTransposeSchema(_view.Schema) : _tview.TransposeSchema; + View = transforms[transforms.Length - 1].Transform; + _tview = View as ITransposeDataView; + TransposeSchema = _tview?.TransposeSchema ?? new TransposerUtils.SimpleTransposeSchema(View.Schema); var srcLoader = transforms[0].Transform.Source as IDataLoader; @@ -561,29 +559,20 @@ private static string GenerateTag(int index) public long? GetRowCount(bool lazy = true) { - return _view.GetRowCount(lazy); + return View.GetRowCount(lazy); } - public bool CanShuffle - { - get { return _view.CanShuffle; } - } + public bool CanShuffle => View.CanShuffle; - public ISchema Schema - { - get { return _view.Schema; } - } + public ISchema Schema => View.Schema; - public ITransposeSchema TransposeSchema - { - get { return _tschema; } - } + public ITransposeSchema TransposeSchema { get; } public IRowCursor GetRowCursor(Func predicate, IRandom rand = null) { _host.CheckValue(predicate, nameof(predicate)); _host.CheckValueOrNull(rand); - return _view.GetRowCursor(predicate, rand); + return View.GetRowCursor(predicate, rand); } public IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolidator, @@ -591,13 +580,13 @@ public IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolidator, { _host.CheckValue(predicate, nameof(predicate)); _host.CheckValueOrNull(rand); - return _view.GetRowCursorSet(out consolidator, predicate, n, rand); + return View.GetRowCursorSet(out consolidator, predicate, n, rand); } public ISlotCursor GetSlotCursor(int col) { _host.CheckParam(0 <= col && col < Schema.ColumnCount, nameof(col)); - if (_tschema == null || _tschema.GetSlotType(col) == null) + if (TransposeSchema?.GetSlotType(col) == null) { throw _host.ExceptParam(nameof(col), "Bad call to GetSlotCursor on untransposable column '{0}'", Schema.GetColumnName(col)); diff --git a/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs b/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs index 69eb3bbb3b..10bf816dc1 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs @@ -682,13 +682,12 @@ private bool TryTruncatePath(int dirCount, string path, out string truncPath) Ch.Warning($"Path {path} did not have {dirCount} directories necessary for parsing."); return false; } - + // Rejoin segments to create a valid path. truncPath = String.Join(Path.DirectorySeparatorChar.ToString(), segments); return true; } - /// /// Parse all column values from the directory path. /// diff --git a/src/Microsoft.ML.Data/DataLoadSave/PartitionedPathParser.cs b/src/Microsoft.ML.Data/DataLoadSave/PartitionedPathParser.cs index ca3aa075ab..70d8f898ab 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/PartitionedPathParser.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/PartitionedPathParser.cs @@ -76,7 +76,7 @@ public class Arguments : IPartitionedPathParserFactory { [Argument(ArgumentType.Multiple, HelpText = "Column definitions used to override the Partitioned Path Parser. Expected with the format name:type:numeric-source, e.g. col=MyFeature:R4:1", ShortName = "col", SortOrder = 1)] - public Microsoft.ML.Runtime.Data.PartitionedFileLoader.Column[] Columns; + public PartitionedFileLoader.Column[] Columns; [Argument(ArgumentType.AtMostOnce, HelpText = "Data type of each column.")] public DataKind Type = DataKind.Text; diff --git a/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs b/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs index 3678c749ba..babca545c8 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs @@ -34,7 +34,7 @@ public sealed partial class TextLoader : IDataLoader /// /// Vector column of I4 that contains values from columns 1, 3 to 10 /// col=ColumnName:I4:1,3-10 - /// + /// /// Key range column of KeyType with underlying storage type U4 that contains values from columns 1, 3 to 10, that can go from 1 to 100 (0 reserved for out of range) /// col=ColumnName:U4[1-100]:1,3-10 /// @@ -554,7 +554,7 @@ public Bindings(TextLoader parent, Column[] cols, IMultiStreamSource headerFile) { var range = col.Source[i]; - // Check for remaining range, raise flag. + // Check for remaining range, raise flag. if (range.AllOther) { ch.CheckUserArg(iinfoOther < 0, nameof(Range.AllOther), "At most one all other range can be specified"); @@ -605,7 +605,7 @@ public Bindings(TextLoader parent, Column[] cols, IMultiStreamSource headerFile) NameToInfoIndex[name] = iinfo; } - // Note that segsOther[isegOther] is not a real segment to be included. + // Note that segsOther[isegOther] is not a real segment to be included. // It only persists segment information such as Min, Max, autoEnd, variableEnd for later processing. // Process all other range. if (iinfoOther >= 0) @@ -641,7 +641,7 @@ public Bindings(TextLoader parent, Column[] cols, IMultiStreamSource headerFile) foreach (var seg in segsAll) { - // At this step, all indices less than min is contained in some segment, either in + // At this step, all indices less than min is contained in some segment, either in // segsAll or segsNew. ch.Assert(min < lim); if (min < seg.Min) @@ -1014,7 +1014,7 @@ public TextLoader(IHostEnvironment env, Arguments args, IMultiStreamSource files _host.CheckNonEmpty(args.Separator, nameof(args.Separator), "Must specify a separator"); //Default arg.Separator is tab and default args.SeparatorChars is also a '\t'. - //At a time only one default can be different and whichever is different that will + //At a time only one default can be different and whichever is different that will //be used. if (args.SeparatorChars.Length > 1 || args.SeparatorChars[0] != '\t') { @@ -1110,7 +1110,7 @@ private static bool TryParseSchema(IHost host, IMultiStreamSource files, // Get settings just for core arguments, not everything. string tmp = CmdParser.GetSettings(host, args, new ArgumentsCore()); - // Try to get the schema information from the file. + // Try to get the schema information from the file. string str = Cursor.GetEmbeddedArgs(files); if (string.IsNullOrWhiteSpace(str)) return false; diff --git a/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs b/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs index 48e44b31e7..582d81b546 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs @@ -27,7 +27,7 @@ public sealed partial class TextLoader : IDataLoader /// private sealed class ValueCreatorCache { - private volatile static ValueCreatorCache _instance; + private static volatile ValueCreatorCache _instance; public static ValueCreatorCache Instance { get @@ -137,9 +137,9 @@ private sealed class ParseStats private volatile int _cref; // Total number of rows, number of unparsable values, number of format errors. - private /*volatile*/ long _rowCount; - private /*volatile*/ long _badCount; - private /*volatile*/ long _fmtCount; + private long _rowCount; + private long _badCount; + private long _fmtCount; public ParseStats(IChannelProvider provider, int cref, long maxShow = MaxShow) { diff --git a/src/Microsoft.ML.Data/DataLoadSave/Transpose/TransposeLoader.cs b/src/Microsoft.ML.Data/DataLoadSave/Transpose/TransposeLoader.cs index 173c588607..37cbe23b92 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Transpose/TransposeLoader.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Transpose/TransposeLoader.cs @@ -531,7 +531,7 @@ public void Save(ModelSaveContext ctx) } /// - /// Save a zero-row dataview that will be used to infer schema information, used in the case + /// Save a zero-row dataview that will be used to infer schema information, used in the case /// where the tranpsose loader is instantiated with no input streams. /// private static void SaveSchema(IHostEnvironment env, ModelSaveContext ctx, ISchema schema) diff --git a/src/Microsoft.ML.Data/DataView/AppendRowsDataView.cs b/src/Microsoft.ML.Data/DataView/AppendRowsDataView.cs index 6633e2535f..dc713a82b2 100644 --- a/src/Microsoft.ML.Data/DataView/AppendRowsDataView.cs +++ b/src/Microsoft.ML.Data/DataView/AppendRowsDataView.cs @@ -24,7 +24,7 @@ namespace Microsoft.ML.Runtime.Data /// This class provides the functionality to combine multiple IDataView objects which share the same schema /// All sources must contain the same number of columns and their column names, sizes, and item types must match. /// The row count of the resulting IDataView will be the sum over that of each individual. - /// + /// /// An AppendRowsDataView instance is shuffleable iff all of its sources are shuffleable and their row counts are known. /// public sealed class AppendRowsDataView : IDataView @@ -46,8 +46,8 @@ public sealed class AppendRowsDataView : IDataView /// /// Create a dataview by appending the rows of the sources. - /// - /// All sources must be consistent with the passed-in schema in the number of columns, column names, + /// + /// All sources must be consistent with the passed-in schema in the number of columns, column names, /// and column types. If schema is null, the first source's schema will be used. /// /// The host environment. @@ -203,7 +203,7 @@ public bool IsColumnActive(int col) } /// - /// The deterministic cursor. It will scan through the sources sequentially. + /// The deterministic cursor. It will scan through the sources sequentially. /// private sealed class Cursor : CursorBase { @@ -293,7 +293,7 @@ public override void Dispose() /// /// A RandCursor will ask each subordinate cursor to shuffle itself. - /// Then, at each step, it randomly calls a subordinate to move next with probability (roughly) proportional to + /// Then, at each step, it randomly calls a subordinate to move next with probability (roughly) proportional to /// the number of the subordinate's remaining rows. /// private sealed class RandCursor : CursorBase @@ -383,16 +383,16 @@ public override void Dispose() /// /// Given k classes with counts (N_0, N_2, N_3, ..., N_{k-1}), the goal of this sampler is to select the i-th - /// class with probability N_i/M, where M = N_0 + N_1 + ... + N_{k-1}. + /// class with probability N_i/M, where M = N_0 + N_1 + ... + N_{k-1}. /// Once the i-th class is selected, its count will be updated to N_i - 1. - /// + /// /// For efficiency consideration, the sampling distribution is only an approximation of the desired distribution. /// private sealed class MultinomialWithoutReplacementSampler { // Implementation: generate a batch array of size BatchSize. // Each class will claim a fraction of the batch proportional to its remaining row count. - // Shuffle the array. The sampler reads from the array one at a time until the batch is consumed. + // Shuffle the array. The sampler reads from the array one at a time until the batch is consumed. // The sampler then generates a new batch and repeat the process. private const int BatchSize = 1000; diff --git a/src/Microsoft.ML.Data/DataView/CacheDataView.cs b/src/Microsoft.ML.Data/DataView/CacheDataView.cs index 3bca858d1d..72fb4b18a5 100644 --- a/src/Microsoft.ML.Data/DataView/CacheDataView.cs +++ b/src/Microsoft.ML.Data/DataView/CacheDataView.cs @@ -618,7 +618,7 @@ private interface IWaiter /// is equivalent to also having waited on i-1, i-2, etc. /// Note that this is position within the cache, that is, a row index, /// as opposed to position within the cursor. - /// + /// /// This method should be thread safe because in the parallel cursor /// case it will be used by multiple threads. /// @@ -955,23 +955,23 @@ public Wrapper(RandomIndex index) /// next job ids before they push the completed jobs to the consumer. So the workers are /// then subject to being blocked until their current completed jobs are fully accepted /// (i.e. added to the to-consume queue). - /// + /// /// How it works: /// Suppose we have 7 workers (w0,..,w6) and 14 jobs (j0,..,j13). /// Initially, jobs get assigned to workers using a shared counter. /// Here is an example outcome of using a shared counter: /// w1->j0, w6->j1, w0->j2, w3->j3, w4->j4, w5->j5, w2->j6. - /// + /// /// Suppose workers finished jobs in the following order: /// w5->j5, w0->j2, w6->j1, w4->j4, w3->j3,w1->j0, w2->j6. - /// + /// /// w5 finishes processing j5 first, but will be blocked until the processing of jobs /// j0,..,j4 completes since the consumer can consume jobs in order only. /// Therefore, the next available job (j7) should not be assigned to w5. It should be - /// assigned to the worker whose job *get consumed first* (w1 since it processes j0 - /// which is the first job) *not* to the worker who completes its job first (w5 in + /// assigned to the worker whose job *get consumed first* (w1 since it processes j0 + /// which is the first job) *not* to the worker who completes its job first (w5 in /// this example). - /// + /// /// So, a shared counter can be used to assign jobs to workers initially but should /// not be used onwards. /// diff --git a/src/Microsoft.ML.Data/DataView/CompositeSchema.cs b/src/Microsoft.ML.Data/DataView/CompositeSchema.cs index 4d387de1d5..81aef4b01e 100644 --- a/src/Microsoft.ML.Data/DataView/CompositeSchema.cs +++ b/src/Microsoft.ML.Data/DataView/CompositeSchema.cs @@ -37,7 +37,7 @@ public CompositeSchema(ISchema[] sources) /// /// Returns an array of input predicated for sources, corresponding to the input predicate. - /// The returned array size is equal to the number of sources, but if a given source is not needed at all, + /// The returned array size is equal to the number of sources, but if a given source is not needed at all, /// the corresponding predicate will be null. /// public Func[] GetInputPredicates(Func predicate) diff --git a/src/Microsoft.ML.Data/DataView/RowToRowMapperTransform.cs b/src/Microsoft.ML.Data/DataView/RowToRowMapperTransform.cs index b0fde835d8..d69379d5da 100644 --- a/src/Microsoft.ML.Data/DataView/RowToRowMapperTransform.cs +++ b/src/Microsoft.ML.Data/DataView/RowToRowMapperTransform.cs @@ -30,7 +30,7 @@ public RowMapperColumnInfo(string name, ColumnType type, ColumnMetadataInfo meta } /// - /// This interface is used to create a . + /// This interface is used to create a . /// Implementations should be given an in their constructor, and should have a /// ctor or Create method with , along with a corresponding /// . @@ -44,7 +44,7 @@ public interface IRowMapper : ICanSaveModel /// /// Returns the getters for the output columns given an active set of output columns. The length of the getters - /// array should be equal to the number of columns added by the IRowMapper. It should contain the getter for the + /// array should be equal to the number of columns added by the IRowMapper. It should contain the getter for the /// i'th output column if activeOutput(i) is true, and null otherwise. /// Delegate[] CreateGetters(IRow input, Func activeOutput, out Action disposer); diff --git a/src/Microsoft.ML.Data/DataView/Transposer.cs b/src/Microsoft.ML.Data/DataView/Transposer.cs index 3baf8a7379..91bb9c8b6a 100644 --- a/src/Microsoft.ML.Data/DataView/Transposer.cs +++ b/src/Microsoft.ML.Data/DataView/Transposer.cs @@ -1041,7 +1041,6 @@ private static Splitter CreateCore(IDataView view, int col, int[] ends) } #region ISchema implementation - // Subclasses should implement ColumnCount and GetColumnType. public override bool TryGetColumnIndex(string name, out int col) { @@ -1062,8 +1061,6 @@ public override string GetColumnName(int col) Contracts.CheckParam(0 <= col && col < ColumnCount, nameof(col)); return _view.Schema.GetColumnName(SrcCol); } - - public override abstract ColumnType GetColumnType(int col); #endregion private abstract class RowBase : IRow @@ -1215,7 +1212,7 @@ private sealed class Row : RowBase> private VBuffer _inputValue; // The delegate to get the input value. private readonly ValueGetter> _inputGetter; - // The limit of _inputValue.Indices + // The limit of _inputValue.Indices private readonly int[] _srcIndicesLims; // Convenient accessor since we use this all over the place. private int[] Lims { get { return Parent._lims; } } @@ -1405,7 +1402,7 @@ public static void GetSingleSlotValue(this ITransposeDataView view, int col, } /// - /// The is parameterized by a type that becomes the + /// The is parameterized by a type that becomes the /// type parameter for a , and this is generally preferable and more /// sensible but for various reasons it's often a lot simpler to have a get-getter be over /// the actual type returned by the getter, that is, parameterize this by the actual diff --git a/src/Microsoft.ML.Data/DataView/ZipDataView.cs b/src/Microsoft.ML.Data/DataView/ZipDataView.cs index 9a7e79bab8..a472b48b36 100644 --- a/src/Microsoft.ML.Data/DataView/ZipDataView.cs +++ b/src/Microsoft.ML.Data/DataView/ZipDataView.cs @@ -11,7 +11,7 @@ namespace Microsoft.ML.Runtime.Data { /// /// This is a data view that is a 'zip' of several data views. - /// The length of the zipped data view is equal to the shortest of the lengths of the components. + /// The length of the zipped data view is equal to the shortest of the lengths of the components. /// public sealed class ZipDataView : IDataView { @@ -77,7 +77,7 @@ public IRowCursor GetRowCursor(Func predicate, IRandom rand = null) var srcPredicates = _schema.GetInputPredicates(predicate); - // REVIEW: if we know the row counts, we could only open cursor if it has needed columns, and have the + // REVIEW: if we know the row counts, we could only open cursor if it has needed columns, and have the // outer cursor handle the early stopping. If we don't know row counts, we need to open all the cursors because // we don't know which one will be the shortest. // One reason this is not done currently is because the API has 'somewhat mutable' data views, so potentially this @@ -88,8 +88,8 @@ public IRowCursor GetRowCursor(Func predicate, IRandom rand = null) } /// - /// Create an with no requested columns on a data view. - /// Potentially, this can be optimized by calling GetRowCount(lazy:true) first, and if the count is not known, + /// Create an with no requested columns on a data view. + /// Potentially, this can be optimized by calling GetRowCount(lazy:true) first, and if the count is not known, /// wrapping around GetCursor(). /// private IRowCursor GetMinimumCursor(IDataView dv) diff --git a/src/Microsoft.ML.Data/Depricated/Instances/HeaderSchema.cs b/src/Microsoft.ML.Data/Depricated/Instances/HeaderSchema.cs index 3dd16f141b..f08d52fe85 100644 --- a/src/Microsoft.ML.Data/Depricated/Instances/HeaderSchema.cs +++ b/src/Microsoft.ML.Data/Depricated/Instances/HeaderSchema.cs @@ -364,9 +364,7 @@ private sealed class Dense : FeatureNameCollection private readonly int _count; private readonly string[] _names; - private readonly RoleMappedSchema _schema; - - public override RoleMappedSchema Schema => _schema; + public override RoleMappedSchema Schema { get; } public Dense(int count, string[] names) { @@ -379,8 +377,9 @@ public Dense(int count, string[] names) if (size > 0) Array.Copy(names, _names, size); - _schema = RoleMappedSchema.Create(new FeatureNameCollectionSchema(this), - RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Feature, RoleMappedSchema.ColumnRole.Feature.Value)); + // REVIEW: This seems wrong. The default feature column name is "Features" yet the role is named "Feature". + Schema = new RoleMappedSchema(new FeatureNameCollectionSchema(this), + roles: RoleMappedSchema.ColumnRole.Feature.Bind(RoleMappedSchema.ColumnRole.Feature.Value)); } public override int Count => _count; @@ -470,8 +469,9 @@ public Sparse(int count, string[] names, int cnn) } Contracts.Assert(cv == cnn); - _schema = RoleMappedSchema.Create(new FeatureNameCollectionSchema(this), - RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Feature, RoleMappedSchema.ColumnRole.Feature.Value)); + // REVIEW: This seems wrong. The default feature column name is "Features" yet the role is named "Feature". + _schema = new RoleMappedSchema(new FeatureNameCollectionSchema(this), + roles: RoleMappedSchema.ColumnRole.Feature.Bind(RoleMappedSchema.ColumnRole.Feature.Value)); } /// diff --git a/src/Microsoft.ML.Data/Depricated/TGUIAttribute.cs b/src/Microsoft.ML.Data/Depricated/TGUIAttribute.cs index 7a51e1a5ee..5f09c604bb 100644 --- a/src/Microsoft.ML.Data/Depricated/TGUIAttribute.cs +++ b/src/Microsoft.ML.Data/Depricated/TGUIAttribute.cs @@ -7,12 +7,12 @@ namespace Microsoft.ML.Runtime.Internal.Internallearn { -#pragma warning disable TLC_GeneralName // This structure should be deprecated anyway. +#pragma warning disable MSML_GeneralName // This structure should be deprecated anyway. // REVIEW: Get rid of this. Everything should be in the ArgumentAttribute (or a class // derived from ArgumentAttribute). [AttributeUsage(AttributeTargets.Field)] public class TGUIAttribute : Attribute -#pragma warning restore TLC_GeneralName +#pragma warning restore MSML_GeneralName { // Display parameters public string Label { get; set; } @@ -32,7 +32,7 @@ public class TGUIAttribute : Attribute public bool NoSweep { get; set; } //Settings are automatically populated for fields that are classes. - //The below is an extension of the framework to add settings for + //The below is an extension of the framework to add settings for //boolean type fields. public bool ShowSettingsForCheckbox { get; set; } public object Settings { get; set; } diff --git a/src/Microsoft.ML.Data/Depricated/Vector/VBufferMathUtils.cs b/src/Microsoft.ML.Data/Depricated/Vector/VBufferMathUtils.cs index 0199c30915..045c5d30a1 100644 --- a/src/Microsoft.ML.Data/Depricated/Vector/VBufferMathUtils.cs +++ b/src/Microsoft.ML.Data/Depricated/Vector/VBufferMathUtils.cs @@ -350,7 +350,7 @@ public static void AddMultWithOffset(ref VBuffer src, Float c, ref VBuffe /// Perform in-place scaling of a vector into another vector as /// = * . /// This is more or less equivalent to performing the same operation with - /// except perhaps more efficiently, + /// except perhaps more efficiently, /// with one exception: if is 0 and /// is sparse, will have a count of zero, instead of the /// same count as . diff --git a/src/Microsoft.ML.Data/Depricated/Vector/VectorUtils.cs b/src/Microsoft.ML.Data/Depricated/Vector/VectorUtils.cs index fc335bb52e..5b46aad0b8 100644 --- a/src/Microsoft.ML.Data/Depricated/Vector/VectorUtils.cs +++ b/src/Microsoft.ML.Data/Depricated/Vector/VectorUtils.cs @@ -57,7 +57,7 @@ public static Float DotProduct(ref VBuffer a, ref VBuffer b) } /// - /// Sparsify vector A (keep at most + values) + /// Sparsify vector A (keep at most + values) /// and optionally rescale values to the [-1, 1] range. /// Vector to be sparsified and normalized. /// How many top (positive) elements to preserve after sparsification. diff --git a/src/Microsoft.ML.Data/Dirty/PredictorBase.cs b/src/Microsoft.ML.Data/Dirty/PredictorBase.cs index e9d02db58b..35c9a49133 100644 --- a/src/Microsoft.ML.Data/Dirty/PredictorBase.cs +++ b/src/Microsoft.ML.Data/Dirty/PredictorBase.cs @@ -19,7 +19,7 @@ public abstract class PredictorBase : IPredictorProducing { public const string NormalizerWarningFormat = "Ignoring integrated normalizer while loading a predictor of type {0}.{1}" + - " Please contact tlcsupp for assistance with converting legacy models."; + " Please refer to https://aka.ms/MLNetIssue for assistance with converting legacy models."; protected readonly IHost Host; @@ -41,9 +41,9 @@ protected PredictorBase(IHostEnvironment env, string name, ModelLoadContext ctx) // Verify that the Float type matches. int cbFloat = ctx.Reader.ReadInt32(); -#pragma warning disable TLC_NoMessagesForLoadContext // This one is actually useful. +#pragma warning disable MSML_NoMessagesForLoadContext // This one is actually useful. Host.CheckDecode(cbFloat == sizeof(Float), "This file was saved by an incompatible version"); -#pragma warning restore TLC_NoMessagesForLoadContext +#pragma warning restore MSML_NoMessagesForLoadContext } public virtual void Save(ModelSaveContext ctx) diff --git a/src/Microsoft.ML.Data/EntryPoints/CommonOutputs.cs b/src/Microsoft.ML.Data/EntryPoints/CommonOutputs.cs index 9e99bf8993..37f37f6c64 100644 --- a/src/Microsoft.ML.Data/EntryPoints/CommonOutputs.cs +++ b/src/Microsoft.ML.Data/EntryPoints/CommonOutputs.cs @@ -191,7 +191,7 @@ public interface ITrainerOutput } /// - /// Macro output class base. + /// Macro output class base. /// public abstract class MacroOutput { diff --git a/src/Microsoft.ML.Data/EntryPoints/EntryPointNode.cs b/src/Microsoft.ML.Data/EntryPoints/EntryPointNode.cs index 1ff3daee02..d2d59eb94b 100644 --- a/src/Microsoft.ML.Data/EntryPoints/EntryPointNode.cs +++ b/src/Microsoft.ML.Data/EntryPoints/EntryPointNode.cs @@ -475,7 +475,7 @@ public float Cost private EntryPointNode(IHostEnvironment env, IChannel ch, ModuleCatalog moduleCatalog, RunContext context, string id, string entryPointName, JObject inputs, JObject outputs, bool checkpoint = false, - string stageId = "", float cost = float.NaN, string label = null, string group = null, string weight = null) + string stageId = "", float cost = float.NaN, string label = null, string group = null, string weight = null, string name = null) { Contracts.AssertValue(env); env.AssertNonEmpty(id); @@ -510,49 +510,10 @@ private EntryPointNode(IHostEnvironment env, IChannel ch, ModuleCatalog moduleCa throw _host.Except($"The following required inputs were not provided: {String.Join(", ", missing)}"); var inputInstance = _inputBuilder.GetInstance(); - var warning = "Different {0} column specified in trainer and in macro: '{1}', '{2}'." + - " Using column '{2}'. To column use '{1}' instead, please specify this name in" + - "the trainer node arguments."; - if (!string.IsNullOrEmpty(label) && Utils.Size(_entryPoint.InputKinds) > 0 && - _entryPoint.InputKinds.Contains(typeof(CommonInputs.ITrainerInputWithLabel))) - { - var labelColField = _inputBuilder.GetFieldNameOrNull("LabelColumn"); - ch.AssertNonEmpty(labelColField); - var labelColFieldType = _inputBuilder.GetFieldTypeOrNull(labelColField); - ch.Assert(labelColFieldType == typeof(string)); - var inputLabel = inputInstance.GetType().GetField(labelColField).GetValue(inputInstance); - if (label != (string)inputLabel) - ch.Warning(warning, "label", label, inputLabel); - else - _inputBuilder.TrySetValue(labelColField, label); - } - if (!string.IsNullOrEmpty(group) && Utils.Size(_entryPoint.InputKinds) > 0 && - _entryPoint.InputKinds.Contains(typeof(CommonInputs.ITrainerInputWithGroupId))) - { - var groupColField = _inputBuilder.GetFieldNameOrNull("GroupIdColumn"); - ch.AssertNonEmpty(groupColField); - var groupColFieldType = _inputBuilder.GetFieldTypeOrNull(groupColField); - ch.Assert(groupColFieldType == typeof(string)); - var inputGroup = inputInstance.GetType().GetField(groupColField).GetValue(inputInstance); - if (group != (Optional)inputGroup) - ch.Warning(warning, "group Id", label, inputGroup); - else - _inputBuilder.TrySetValue(groupColField, label); - } - if (!string.IsNullOrEmpty(weight) && Utils.Size(_entryPoint.InputKinds) > 0 && - (_entryPoint.InputKinds.Contains(typeof(CommonInputs.ITrainerInputWithWeight)) || - _entryPoint.InputKinds.Contains(typeof(CommonInputs.IUnsupervisedTrainerWithWeight)))) - { - var weightColField = _inputBuilder.GetFieldNameOrNull("WeightColumn"); - ch.AssertNonEmpty(weightColField); - var weightColFieldType = _inputBuilder.GetFieldTypeOrNull(weightColField); - ch.Assert(weightColFieldType == typeof(string)); - var inputWeight = inputInstance.GetType().GetField(weightColField).GetValue(inputInstance); - if (weight != (Optional)inputWeight) - ch.Warning(warning, "weight", label, inputWeight); - else - _inputBuilder.TrySetValue(weightColField, label); - } + SetColumnArgument(ch, inputInstance, "LabelColumn", label, "label", typeof(CommonInputs.ITrainerInputWithLabel)); + SetColumnArgument(ch, inputInstance, "GroupIdColumn", group, "group Id", typeof(CommonInputs.ITrainerInputWithGroupId)); + SetColumnArgument(ch, inputInstance, "WeightColumn", weight, "weight", typeof(CommonInputs.ITrainerInputWithWeight), typeof(CommonInputs.IUnsupervisedTrainerWithWeight)); + SetColumnArgument(ch, inputInstance, "NameColumn", name, "name"); // Validate outputs. _outputHelper = new OutputHelper(_host, _entryPoint.OutputType); @@ -568,6 +529,38 @@ private EntryPointNode(IHostEnvironment env, IChannel ch, ModuleCatalog moduleCa Cost = cost; } + private void SetColumnArgument(IChannel ch, object inputInstance, string argName, string colName, string columnRole, params Type[] inputKinds) + { + Contracts.AssertValue(ch); + ch.AssertValue(inputInstance); + ch.AssertNonEmpty(argName); + ch.AssertValueOrNull(colName); + ch.AssertNonEmpty(columnRole); + ch.AssertValueOrNull(inputKinds); + + var colField = _inputBuilder.GetFieldNameOrNull(argName); + if (string.IsNullOrEmpty(colField)) + return; + + const string warning = "Different {0} column specified in trainer and in macro: '{1}', '{2}'." + + " Using column '{2}'. To column use '{1}' instead, please specify this name in" + + "the trainer node arguments."; + if (!string.IsNullOrEmpty(colName) && Utils.Size(_entryPoint.InputKinds) > 0 && + (Utils.Size(inputKinds) == 0 || _entryPoint.InputKinds.Intersect(inputKinds).Any())) + { + ch.AssertNonEmpty(colField); + var colFieldType = _inputBuilder.GetFieldTypeOrNull(colField); + ch.Assert(colFieldType == typeof(string)); + var inputColName = inputInstance.GetType().GetField(colField).GetValue(inputInstance); + ch.Assert(inputColName is string || inputColName is Optional); + var str = inputColName is string ? (string)inputColName : ((Optional)inputColName).Value; + if (colName != str) + ch.Warning(warning, columnRole, colName, inputColName); + else + _inputBuilder.TrySetValue(colField, colName); + } + } + public static EntryPointNode Create( IHostEnvironment env, string entryPointName, @@ -639,7 +632,7 @@ public static EntryPointNode Create( /// /// Checks the given JSON object key-value pair is a valid EntryPoint input and /// extracts out any variables that need to be populated. These variables will be - /// added to the EntryPoint context. Input parameters that are not set to variables + /// added to the EntryPoint context. Input parameters that are not set to variables /// will be immediately set using the input builder instance. /// private void CheckAndSetInputValue(KeyValuePair pair) @@ -699,7 +692,7 @@ private void CheckAndSetInputValue(KeyValuePair pair) /// /// Checks the given JSON object key-value pair is a valid EntryPoint output. - /// Extracts out any variables that need to be populated and adds them to the + /// Extracts out any variables that need to be populated and adds them to the /// EntryPoint context. /// private void CheckAndMarkOutputValue(KeyValuePair pair) @@ -902,7 +895,7 @@ private object BuildParameterValue(List bindings) } public static List ValidateNodes(IHostEnvironment env, RunContext context, JArray nodes, - ModuleCatalog moduleCatalog, string label = null, string group = null, string weight = null) + ModuleCatalog moduleCatalog, string label = null, string group = null, string weight = null, string name = null) { Contracts.AssertValue(env); env.AssertValue(context); @@ -918,7 +911,7 @@ public static List ValidateNodes(IHostEnvironment env, RunContex if (node == null) throw env.Except("Unexpected node token: '{0}'", nodes[i]); - string name = node[FieldNames.Name].Value(); + string nodeName = node[FieldNames.Name].Value(); var inputs = node[FieldNames.Inputs] as JObject; if (inputs == null && node[FieldNames.Inputs] != null) throw env.Except("Unexpected {0} token: '{1}'", FieldNames.Inputs, node[FieldNames.Inputs]); @@ -927,7 +920,7 @@ public static List ValidateNodes(IHostEnvironment env, RunContex if (outputs == null && node[FieldNames.Outputs] != null) throw env.Except("Unexpected {0} token: '{1}'", FieldNames.Outputs, node[FieldNames.Outputs]); - var id = context.GenerateId(name); + var id = context.GenerateId(nodeName); var unexpectedFields = node.Properties().Where( x => x.Name != FieldNames.Name && x.Name != FieldNames.Inputs && x.Name != FieldNames.Outputs && x.Name != FieldNames.StageId && x.Name != FieldNames.Checkpoint && x.Name != FieldNames.Cost); @@ -942,7 +935,7 @@ public static List ValidateNodes(IHostEnvironment env, RunContex ch.Warning("Node '{0}' has unexpected fields that are ignored: {1}", id, string.Join(", ", unexpectedFields.Select(x => x.Name))); } - result.Add(new EntryPointNode(env, ch, moduleCatalog, context, id, name, inputs, outputs, checkpoint, stageId, cost, label, group, weight)); + result.Add(new EntryPointNode(env, ch, moduleCatalog, context, id, nodeName, inputs, outputs, checkpoint, stageId, cost, label, group, weight, name)); } ch.Done(); @@ -1080,8 +1073,8 @@ protected VariableBinding(string varName) VariableName = varName; } - // A regex to validate an EntryPoint variable value accessor string. Valid EntryPoint variable names - // can be any sequence of alphanumeric characters and underscores. They must start with a letter or underscore. + // A regex to validate an EntryPoint variable value accessor string. Valid EntryPoint variable names + // can be any sequence of alphanumeric characters and underscores. They must start with a letter or underscore. // An EntryPoint variable can be followed with an array or dictionary specifier, which begins // with '[', contains either an integer or alphanumeric string, optionally wrapped in single-quotes, // followed with ']'. diff --git a/src/Microsoft.ML.Data/EntryPoints/InputBase.cs b/src/Microsoft.ML.Data/EntryPoints/InputBase.cs index 5583c66df0..94b67af670 100644 --- a/src/Microsoft.ML.Data/EntryPoints/InputBase.cs +++ b/src/Microsoft.ML.Data/EntryPoints/InputBase.cs @@ -146,7 +146,7 @@ public static TOut Train(IHost host, TArg input, TrainUtils.AddNormalizerIfNeeded(host, ch, trainer, ref view, feature, input.NormalizeFeatures); ch.Trace("Binding columns"); - var roleMappedData = TrainUtils.CreateExamples(view, label, feature, group, weight, name, custom); + var roleMappedData = new RoleMappedData(view, label, feature, group, weight, name, custom); RoleMappedData cachedRoleMappedData = roleMappedData; Cache.CachingType? cachingType = null; @@ -164,9 +164,8 @@ public static TOut Train(IHost host, TArg input, } case CachingOptions.Auto: { - ITrainerEx trainerEx = trainer as ITrainerEx; // REVIEW: we should switch to hybrid caching in future. - if (!(input.TrainingData is BinaryLoader) && (trainerEx == null || trainerEx.WantCaching)) + if (!(input.TrainingData is BinaryLoader) && trainer.Info.WantCaching) // default to Memory so mml is on par with maml cachingType = Cache.CachingType.Memory; break; @@ -184,7 +183,7 @@ public static TOut Train(IHost host, TArg input, Data = roleMappedData.Data, Caching = cachingType.Value }).OutputData; - cachedRoleMappedData = RoleMappedData.Create(cacheView, roleMappedData.Schema.GetColumnRoleNames()); + cachedRoleMappedData = new RoleMappedData(cacheView, roleMappedData.Schema.GetColumnRoleNames()); } var predictor = TrainUtils.Train(host, ch, cachedRoleMappedData, trainer, "Train", calibrator, maxCalibrationExamples); diff --git a/src/Microsoft.ML.Data/EntryPoints/InputBuilder.cs b/src/Microsoft.ML.Data/EntryPoints/InputBuilder.cs index e5afd8dbb5..4d3b765114 100644 --- a/src/Microsoft.ML.Data/EntryPoints/InputBuilder.cs +++ b/src/Microsoft.ML.Data/EntryPoints/InputBuilder.cs @@ -14,8 +14,8 @@ namespace Microsoft.ML.Runtime.EntryPoints.JsonUtils { /// - /// The class that creates and wraps around an instance of an input object and gradually populates all fields, keeping track of missing - /// required values. The values can be set from their JSON representation (during the graph parsing stage), as well as directly + /// The class that creates and wraps around an instance of an input object and gradually populates all fields, keeping track of missing + /// required values. The values can be set from their JSON representation (during the graph parsing stage), as well as directly /// (in the process of graph execution). /// public sealed class InputBuilder @@ -515,7 +515,7 @@ private static object ParseJsonValue(IExceptionContext ectx, Type type, Attribut } /// - /// Ensures that the given value can be assigned to an entry point field with + /// Ensures that the given value can be assigned to an entry point field with /// type . This method will wrap the value in the option /// type if needed and throw an exception if the value isn't assignable. /// @@ -791,7 +791,7 @@ public static class Range /// public static class Deprecated { - public new static string ToString() => "Deprecated"; + public static new string ToString() => "Deprecated"; public const string Message = "Message"; } @@ -800,7 +800,7 @@ public static class Deprecated /// public static class SweepableLongParam { - public new static string ToString() => "SweepRange"; + public static new string ToString() => "SweepRange"; public const string RangeType = "RangeType"; public const string Max = "Max"; public const string Min = "Min"; @@ -814,7 +814,7 @@ public static class SweepableLongParam /// public static class SweepableFloatParam { - public new static string ToString() => "SweepRange"; + public static new string ToString() => "SweepRange"; public const string RangeType = "RangeType"; public const string Max = "Max"; public const string Min = "Min"; @@ -828,14 +828,14 @@ public static class SweepableFloatParam /// public static class SweepableDiscreteParam { - public new static string ToString() => "SweepRange"; + public static new string ToString() => "SweepRange"; public const string RangeType = "RangeType"; public const string Options = "Values"; } public static class PipelineSweeperSupportedMetrics { - public new static string ToString() => "SupportedMetric"; + public static new string ToString() => "SupportedMetric"; public const string Auc = BinaryClassifierEvaluator.Auc; public const string AccuracyMicro = Data.MultiClassClassifierEvaluator.AccuracyMicro; public const string AccuracyMacro = MultiClassClassifierEvaluator.AccuracyMacro; diff --git a/src/Microsoft.ML.Data/EntryPoints/PredictorModel.cs b/src/Microsoft.ML.Data/EntryPoints/PredictorModel.cs index af726fa758..055b2fa299 100644 --- a/src/Microsoft.ML.Data/EntryPoints/PredictorModel.cs +++ b/src/Microsoft.ML.Data/EntryPoints/PredictorModel.cs @@ -74,13 +74,13 @@ public void Save(IHostEnvironment env, Stream stream) { // REVIEW: address the asymmetry in the way we're loading and saving the model. // Effectively, we have methods to load the transform model from a model.zip, but don't have - // methods to compose the model.zip out of transform model, predictor and role mappings + // methods to compose the model.zip out of transform model, predictor and role mappings // (we use the TrainUtils.SaveModel that does all three). // Create the chain of transforms for saving. IDataView data = new EmptyDataView(env, _transformModel.InputSchema); data = _transformModel.Apply(env, data); - var roleMappedData = RoleMappedData.CreateOpt(data, _roleMappings); + var roleMappedData = new RoleMappedData(data, _roleMappings, opt: true); TrainUtils.SaveModel(env, ch, stream, _predictor, roleMappedData); ch.Done(); @@ -102,7 +102,7 @@ public void PrepareData(IHostEnvironment env, IDataView input, out RoleMappedDat env.CheckValue(input, nameof(input)); input = _transformModel.Apply(env, input); - roleMappedData = RoleMappedData.CreateOpt(input, _roleMappings); + roleMappedData = new RoleMappedData(input, _roleMappings, opt: true); predictor = _predictor; } @@ -141,7 +141,7 @@ public RoleMappedSchema GetTrainingSchema(IHostEnvironment env) { Contracts.CheckValue(env, nameof(env)); var predInput = _transformModel.Apply(env, new EmptyDataView(env, _transformModel.InputSchema)); - var trainRms = RoleMappedSchema.CreateOpt(predInput.Schema, _roleMappings); + var trainRms = new RoleMappedSchema(predInput.Schema, _roleMappings, opt: true); return trainRms; } } diff --git a/src/Microsoft.ML.Data/EntryPoints/ScoreModel.cs b/src/Microsoft.ML.Data/EntryPoints/ScoreModel.cs index 96ce0acac9..312a92bccc 100644 --- a/src/Microsoft.ML.Data/EntryPoints/ScoreModel.cs +++ b/src/Microsoft.ML.Data/EntryPoints/ScoreModel.cs @@ -15,9 +15,9 @@ namespace Microsoft.ML.Runtime.EntryPoints /// /// This module handles scoring a against a new dataset. /// As a result, we return both the scored data and the scoring transform as a . - /// - /// REVIEW: This module does not support 'exotic' scoring scenarios, like recommendation and quantile regression - /// (those where the user-defined scorer settings are necessary to identify the scorer). We could resolve this by + /// + /// REVIEW: This module does not support 'exotic' scoring scenarios, like recommendation and quantile regression + /// (those where the user-defined scorer settings are necessary to identify the scorer). We could resolve this by /// adding a sub-component for extra scorer args, or by creating specialized EPs for these scenarios. /// public static partial class ScoreModel diff --git a/src/Microsoft.ML.Data/EntryPoints/TransformModel.cs b/src/Microsoft.ML.Data/EntryPoints/TransformModel.cs index 9edc87df6d..ed8e7d56e2 100644 --- a/src/Microsoft.ML.Data/EntryPoints/TransformModel.cs +++ b/src/Microsoft.ML.Data/EntryPoints/TransformModel.cs @@ -43,7 +43,7 @@ public sealed class TransformModel : ITransformModel /// /// The resulting schema once applied to this model. The might have - /// columns that are not needed by this transform and these columns will be seen in the + /// columns that are not needed by this transform and these columns will be seen in the /// produced by this transform. /// public ISchema OutputSchema => _chain.Schema; diff --git a/src/Microsoft.ML.Data/Evaluators/AnomalyDetectionEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/AnomalyDetectionEvaluator.cs index 39a5f31c38..8e4f3be56c 100644 --- a/src/Microsoft.ML.Data/Evaluators/AnomalyDetectionEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/AnomalyDetectionEvaluator.cs @@ -57,7 +57,7 @@ public static class OverallMetrics } /// - /// The anomaly detection evaluator outputs a data view by this name, which contains the the examples + /// The anomaly detection evaluator outputs a data view by this name, which contains the the examples /// with the top scores in the test set. It contains the three columns listed below, with each row corresponding /// to one test example. /// @@ -796,7 +796,7 @@ public static CommonOutputs.CommonEvaluateOutput AnomalyDetection(IHostEnvironme string name; MatchColumns(host, input, out label, out weight, out name); var evaluator = new AnomalyDetectionMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, null, null, weight, name); + var data = new RoleMappedData(input.Data, label, null, null, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Evaluators/AucAggregator.cs b/src/Microsoft.ML.Data/Evaluators/AucAggregator.cs index f45aacd58e..342e1d3529 100644 --- a/src/Microsoft.ML.Data/Evaluators/AucAggregator.cs +++ b/src/Microsoft.ML.Data/Evaluators/AucAggregator.cs @@ -408,7 +408,7 @@ public UnweightedAuPrcAggregator(IRandom rand, int reservoirSize) /// /// Compute the AUPRC using the "lower trapesoid" estimator, as described in the paper - /// . + /// http://www.ecmlpkdd2013.org/wp-content/uploads/2013/07/aucpr_2013ecml_corrected.pdf. /// protected override Double ComputeWeightedAuPrcCore(out Double unweighted) { @@ -482,7 +482,7 @@ public WeightedAuPrcAggregator(IRandom rand, int reservoirSize) /// /// Compute the AUPRC using the "lower trapesoid" estimator, as described in the paper - /// . + /// http://www.ecmlpkdd2013.org/wp-content/uploads/2013/07/aucpr_2013ecml_corrected.pdf. /// protected override Double ComputeWeightedAuPrcCore(out Double unweighted) { diff --git a/src/Microsoft.ML.Data/Evaluators/BinaryClassifierEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/BinaryClassifierEvaluator.cs index 90078da9ee..71c08eecd0 100644 --- a/src/Microsoft.ML.Data/Evaluators/BinaryClassifierEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/BinaryClassifierEvaluator.cs @@ -88,7 +88,7 @@ public enum Metrics /// /// Binary classification evaluator outputs a data view with this name, which contains the p/r data. - /// It contains the columns listed below, and in case data also contains a weight column, it contains + /// It contains the columns listed below, and in case data also contains a weight column, it contains /// also columns for the weighted values. /// and false positive rate. /// @@ -1211,7 +1211,7 @@ public override IEnumerable GetOverallMetricColumns() } // This method saves the p/r plots, and returns the p/r metrics data view. - // In case there are results from multiple folds, they are averaged using + // In case there are results from multiple folds, they are averaged using // vertical averaging for the p/r plot, and appended using AppendRowsDataView for // the p/r data view. private bool TryGetPrMetrics(Dictionary[] metrics, out IDataView pr) @@ -1455,7 +1455,7 @@ public static CommonOutputs.ClassificationEvaluateOutput Binary(IHostEnvironment string name; MatchColumns(host, input, out label, out weight, out name); var evaluator = new BinaryClassifierMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, null, null, weight, name); + var data = new RoleMappedData(input.Data, label, null, null, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Evaluators/ClusteringEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/ClusteringEvaluator.cs index 907760649f..bec1ac144a 100644 --- a/src/Microsoft.ML.Data/Evaluators/ClusteringEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/ClusteringEvaluator.cs @@ -776,7 +776,7 @@ public ClusteringMamlEvaluator(IHostEnvironment env, Arguments args) string feat = EvaluateUtils.GetColName(_featureCol, schema.Feature, DefaultColumnNames.Features); if (!schema.Schema.TryGetColumnIndex(feat, out int featCol)) throw Host.ExceptUserArg(nameof(Arguments.FeatureColumn), "Features column '{0}' not found", feat); - yield return RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Feature, feat); + yield return RoleMappedSchema.ColumnRole.Feature.Bind(feat); } } @@ -867,7 +867,7 @@ public static CommonOutputs.CommonEvaluateOutput Clustering(IHostEnvironment env nameof(ClusteringMamlEvaluator.Arguments.FeatureColumn), input.FeatureColumn, DefaultColumnNames.Features); var evaluator = new ClusteringMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, features, null, weight, name); + var data = new RoleMappedData(input.Data, label, features, null, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Evaluators/EvaluatorBase.cs b/src/Microsoft.ML.Data/Evaluators/EvaluatorBase.cs index ef7183c2fa..c628cff1e4 100644 --- a/src/Microsoft.ML.Data/Evaluators/EvaluatorBase.cs +++ b/src/Microsoft.ML.Data/Evaluators/EvaluatorBase.cs @@ -217,7 +217,7 @@ protected ValueGetter> GetKeyValueGetter(AggregatorDictionaryBas /// /// This is a helper class for evaluators deriving from EvaluatorBase, used for computing aggregate metrics. /// Aggregators should keep track of the number of passes done. The method should get - /// the input getters of the given IRow that are needed for the current pass, assuming that all the needed column + /// the input getters of the given IRow that are needed for the current pass, assuming that all the needed column /// information is stored in the given . /// In the aggregator should call the getters once, and process the input as needed. /// increments the pass count after each pass. @@ -251,7 +251,7 @@ public bool Start() return IsActive(); } - /// + /// /// This method should get the getters of the new IRow that are needed for the next pass. /// public abstract void InitializeNextPass(IRow row, RoleMappedSchema schema); @@ -370,7 +370,7 @@ private static AggregatorDictionaryBase CreateDictionary(RoleMappedSchem } /// - /// This method calls the getter of the stratification column, and returns the aggregator corresponding to + /// This method calls the getter of the stratification column, and returns the aggregator corresponding to /// the stratification value. /// /// diff --git a/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs b/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs index 0e2de21530..942d139425 100644 --- a/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs +++ b/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs @@ -115,10 +115,10 @@ public static ColumnInfo GetScoreColumnInfo(IExceptionContext ectx, ISchema sche ColumnInfo info; if (!string.IsNullOrWhiteSpace(name)) { -#pragma warning disable TLC_ContractsNameUsesNameof +#pragma warning disable MSML_ContractsNameUsesNameof if (!ColumnInfo.TryCreateFromName(schema, name, out info)) throw ectx.ExceptUserArg(argName, "Score column is missing"); -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof return info; } @@ -145,9 +145,9 @@ public static ColumnInfo GetScoreColumnInfo(IExceptionContext ectx, ISchema sche if (!string.IsNullOrWhiteSpace(defName) && ColumnInfo.TryCreateFromName(schema, defName, out info)) return info; -#pragma warning disable TLC_ContractsNameUsesNameof +#pragma warning disable MSML_ContractsNameUsesNameof throw ectx.ExceptUserArg(argName, "Score column is missing"); -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof } /// @@ -168,12 +168,12 @@ public static ColumnInfo GetOptAuxScoreColumnInfo(IExceptionContext ectx, ISchem if (!string.IsNullOrWhiteSpace(name)) { ColumnInfo info; -#pragma warning disable TLC_ContractsNameUsesNameof +#pragma warning disable MSML_ContractsNameUsesNameof if (!ColumnInfo.TryCreateFromName(schema, name, out info)) throw ectx.ExceptUserArg(argName, "{0} column is missing", valueKind); if (!testType(info.Type)) throw ectx.ExceptUserArg(argName, "{0} column has incompatible type", valueKind); -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof return info; } @@ -332,15 +332,15 @@ public static IEnumerable> GetMetrics(IDataView met if (getters[i] != null) { getters[i](ref metricVal); - // For R8 valued columns the metric name is the column name. + // For R8 valued columns the metric name is the column name. yield return new KeyValuePair(schema.GetColumnName(i), metricVal); } else if (getVectorMetrics && vBufferGetters[i] != null) { vBufferGetters[i](ref metricVals); - // For R8 vector valued columns the names of the metrics are the column name, - // followed by the slot name if it exists, or "Label_i" if it doesn't. + // For R8 vector valued columns the names of the metrics are the column name, + // followed by the slot name if it exists, or "Label_i" if it doesn't. VBuffer names = default(VBuffer); var size = schema.GetColumnType(i).VectorSize; var slotNamesType = schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.SlotNames, i); @@ -386,7 +386,7 @@ public static IDataView AddFoldIndex(IHostEnvironment env, IDataView input, int env.CheckValue(input, nameof(input)); env.CheckParam(curFold >= 0, nameof(curFold)); - // We use the first column in the data view as an input column to the LambdaColumnMapper, + // We use the first column in the data view as an input column to the LambdaColumnMapper, // because it must have an input. int inputCol = 0; while (inputCol < input.Schema.ColumnCount && input.Schema.IsHidden(inputCol)) @@ -428,7 +428,7 @@ public static IDataView AddFoldIndex(IHostEnvironment env, IDataView input, int env.CheckParam(curFold >= 0, nameof(curFold)); env.CheckParam(numFolds > 0, nameof(numFolds)); - // We use the first column in the data view as an input column to the LambdaColumnMapper, + // We use the first column in the data view as an input column to the LambdaColumnMapper, // because it must have an input. int inputCol = 0; while (inputCol < input.Schema.ColumnCount && input.Schema.IsHidden(inputCol)) @@ -444,7 +444,7 @@ public static IDataView AddFoldIndex(IHostEnvironment env, IDataView input, int /// /// This method takes an array of data views and a specified input vector column, and adds a new output column to each of the data views. - /// First, we find the union set of the slot names in the different data views. Next we define a new vector column for each + /// First, we find the union set of the slot names in the different data views. Next we define a new vector column for each /// data view, indexed by the union of the slot names. For each data view, every slot value is the value in the slot corresponding /// to its slot name in the original column. If a reconciled slot name does not exist in an input column, the value in the output /// column is def. @@ -552,14 +552,15 @@ public static IDataView AddFoldIndex(IHostEnvironment env, IDataView input, int } } - private static int[][] MapKeys(ISchema[] schemas, string columnName, bool isVec, - out int[] indices, out Dictionary reconciledKeyNames) + private static int[][] MapKeys(ISchema[] schemas, string columnName, bool isVec, + int[] indices, Dictionary reconciledKeyNames) { + Contracts.AssertValue(indices); + Contracts.AssertValue(reconciledKeyNames); + var dvCount = schemas.Length; var keyValueMappers = new int[dvCount][]; - var keyNamesCur = default(VBuffer); - indices = new int[dvCount]; - reconciledKeyNames = new Dictionary(); + var keyNamesCur = default(VBuffer); for (int i = 0; i < dvCount; i++) { var schema = schemas[i]; @@ -567,10 +568,11 @@ private static int[][] MapKeys(ISchema[] schemas, string columnName, bool isVec, throw Contracts.Except($"Schema number {i} does not contain column '{columnName}'"); var type = schema.GetColumnType(indices[i]); + var keyValueType = schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.KeyValues, indices[i]); if (type.IsVector != isVec) throw Contracts.Except($"Column '{columnName}' in schema number {i} does not have the correct type"); - if (!schema.HasKeyNames(indices[i], type.ItemType.KeyCount)) - throw Contracts.Except($"Column '{columnName}' in schema number {i} does not have text key values"); + if (keyValueType == null || keyValueType.ItemType.RawType != typeof(T)) + throw Contracts.Except($"Column '{columnName}' in schema number {i} does not have the correct type of key values"); if (!type.ItemType.IsKey || type.ItemType.RawKind != DataKind.U4) throw Contracts.Except($"Column '{columnName}' must be a U4 key type, but is '{type.ItemType}'"); @@ -580,7 +582,7 @@ private static int[][] MapKeys(ISchema[] schemas, string columnName, bool isVec, foreach (var kvp in keyNamesCur.Items(true)) { var key = kvp.Key; - var name = kvp.Value; + var name = new DvText(kvp.Value.ToString()); if (!reconciledKeyNames.ContainsKey(name)) reconciledKeyNames[name] = reconciledKeyNames.Count; keyValueMappers[i][key] = reconciledKeyNames[name]; @@ -591,21 +593,22 @@ private static int[][] MapKeys(ISchema[] schemas, string columnName, bool isVec, /// /// This method takes an array of data views and a specified input key column, and adds a new output column to each of the data views. - /// First, we find the union set of the key values in the different data views. Next we define a new key column for each + /// First, we find the union set of the key values in the different data views. Next we define a new key column for each /// data view, with the union of the key values as the new key values. For each data view, the value in the output column is the value /// corresponding to the key value in the original column. /// - public static void ReconcileKeyValues(IHostEnvironment env, IDataView[] views, string columnName) + public static void ReconcileKeyValues(IHostEnvironment env, IDataView[] views, string columnName, ColumnType keyValueType) { Contracts.CheckNonEmpty(views, nameof(views)); Contracts.CheckNonEmpty(columnName, nameof(columnName)); var dvCount = views.Length; - Dictionary keyNames; - int[] indices; // Create mappings from the original key types to the reconciled key type. - var keyValueMappers = MapKeys(views.Select(view => view.Schema).ToArray(), columnName, false, out indices, out keyNames); + var indices = new int[dvCount]; + var keyNames = new Dictionary(); + // We use MarshalInvoke so that we can call MapKeys with the correct generic: keyValueType.RawType. + var keyValueMappers = Utils.MarshalInvoke(MapKeys, keyValueType.RawType, views.Select(view => view.Schema).ToArray(), columnName, false, indices, keyNames); var keyType = new KeyType(DataKind.U4, 0, keyNames.Count); var keyNamesVBuffer = new VBuffer(keyNames.Count, keyNames.Keys.ToArray()); ValueGetter> keyValueGetter = @@ -629,20 +632,51 @@ public static void ReconcileKeyValues(IHostEnvironment env, IDataView[] views, s } } + /// + /// This method takes an array of data views and a specified input key column, and adds a new output column to each of the data views. + /// First, we find the union set of the key values in the different data views. Next we define a new key column for each + /// data view, with the union of the key values as the new key values. For each data view, the value in the output column is the value + /// corresponding to the key value in the original column. + /// + public static void ReconcileKeyValuesWithNoNames(IHostEnvironment env, IDataView[] views, string columnName, int keyCount) + { + Contracts.CheckNonEmpty(views, nameof(views)); + Contracts.CheckNonEmpty(columnName, nameof(columnName)); + + var keyType = new KeyType(DataKind.U4, 0, keyCount); + + // For each input data view, create the reconciled key column by wrapping it in a LambdaColumnMapper. + for (int i = 0; i < views.Length; i++) + { + if (!views[i].Schema.TryGetColumnIndex(columnName, out var index)) + throw env.Except($"Data view {i} doesn't contain a column '{columnName}'"); + ValueMapper mapper = + (ref uint src, ref uint dst) => + { + if (src > keyCount) + dst = 0; + else + dst = src; + }; + views[i] = LambdaColumnMapper.Create(env, "ReconcileKeyValues", views[i], columnName, columnName, + views[i].Schema.GetColumnType(index), keyType, mapper); + } + } + /// /// This method is similar to , but it reconciles the key values over vector /// input columns. /// - public static void ReconcileVectorKeyValues(IHostEnvironment env, IDataView[] views, string columnName) + public static void ReconcileVectorKeyValues(IHostEnvironment env, IDataView[] views, string columnName, ColumnType keyValueType) { Contracts.CheckNonEmpty(views, nameof(views)); Contracts.CheckNonEmpty(columnName, nameof(columnName)); var dvCount = views.Length; - Dictionary keyNames; - int[] columnIndices; - var keyValueMappers = MapKeys(views.Select(view => view.Schema).ToArray(), columnName, true, out columnIndices, out keyNames); + var keyNames = new Dictionary(); + var columnIndices = new int[dvCount]; + var keyValueMappers = Utils.MarshalInvoke(MapKeys, keyValueType.RawType, views.Select(view => view.Schema).ToArray(), columnName, true, columnIndices, keyNames); var keyType = new KeyType(DataKind.U4, 0, keyNames.Count); var keyNamesVBuffer = new VBuffer(keyNames.Count, keyNames.Keys.ToArray()); ValueGetter> keyValueGetter = @@ -736,7 +770,7 @@ public static IDataView[] ConcatenatePerInstanceDataViews(IHostEnvironment env, var foldDataViews = perInstance.Select(getPerInstance).ToArray(); if (collate) { - var combined = AppendPerInstanceDataViews(env, foldDataViews, out variableSizeVectorColumnNames); + var combined = AppendPerInstanceDataViews(env, perInstance[0].Schema.Label?.Name, foldDataViews, out variableSizeVectorColumnNames); return new[] { combined }; } else @@ -767,7 +801,8 @@ public static IDataView ConcatenateOverallMetrics(IHostEnvironment env, IDataVie return AppendRowsDataView.Create(env, overallList[0].Schema, overallList.ToArray()); } - private static IDataView AppendPerInstanceDataViews(IHostEnvironment env, IEnumerable foldDataViews, out string[] variableSizeVectorColumnNames) + private static IDataView AppendPerInstanceDataViews(IHostEnvironment env, string labelColName, + IEnumerable foldDataViews, out string[] variableSizeVectorColumnNames) { Contracts.AssertValue(env); env.AssertValue(foldDataViews); @@ -776,7 +811,9 @@ private static IDataView AppendPerInstanceDataViews(IHostEnvironment env, IEnume // This is a dictionary from the column name to its vector size. var vectorSizes = new Dictionary(); var firstDvSlotNames = new Dictionary>(); - var firstDvKeyColumns = new List(); + ColumnType labelColKeyValuesType = null; + var firstDvKeyWithNamesColumns = new List(); + var firstDvKeyNoNamesColumns = new Dictionary(); var firstDvVectorKeyColumns = new List(); var variableSizeVectorColumnNamesList = new List(); var list = new List(); @@ -822,10 +859,20 @@ private static IDataView AppendPerInstanceDataViews(IHostEnvironment env, IEnume else vectorSizes.Add(name, type.VectorSize); } - else if (dvNumber == 0 && dv.Schema.HasKeyNames(i, type.KeyCount)) + else if (dvNumber == 0 && name == labelColName) { // The label column can be a key. Reconcile the key values, and wrap with a KeyToValue transform. - firstDvKeyColumns.Add(name); + labelColKeyValuesType = dv.Schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.KeyValues, i); + } + else if (dvNumber == 0 && dv.Schema.HasKeyNames(i, type.KeyCount)) + firstDvKeyWithNamesColumns.Add(name); + else if (type.KeyCount > 0 && name != labelColName && !dv.Schema.HasKeyNames(i, type.KeyCount)) + { + // For any other key column (such as GroupId) we do not reconcile the key values, we only convert to U4. + if (!firstDvKeyNoNamesColumns.ContainsKey(name)) + firstDvKeyNoNamesColumns[name] = type.KeyCount; + if (firstDvKeyNoNamesColumns[name] < type.KeyCount) + firstDvKeyNoNamesColumns[name] = type.KeyCount; } } var idv = dv; @@ -839,26 +886,34 @@ private static IDataView AppendPerInstanceDataViews(IHostEnvironment env, IEnume list.Add(idv); dvNumber++; } - variableSizeVectorColumnNames = variableSizeVectorColumnNamesList.ToArray(); - if (variableSizeVectorColumnNamesList.Count == 0 && firstDvKeyColumns.Count == 0) - return AppendRowsDataView.Create(env, null, list.ToArray()); var views = list.ToArray(); - foreach (var keyCol in firstDvKeyColumns) - ReconcileKeyValues(env, views, keyCol); + foreach (var keyCol in firstDvKeyWithNamesColumns) + ReconcileKeyValues(env, views, keyCol, TextType.Instance); + if (labelColKeyValuesType != null) + ReconcileKeyValues(env, views, labelColName, labelColKeyValuesType.ItemType); + foreach (var keyCol in firstDvKeyNoNamesColumns) + ReconcileKeyValuesWithNoNames(env, views, keyCol.Key, keyCol.Value); foreach (var vectorKeyCol in firstDvVectorKeyColumns) - ReconcileVectorKeyValues(env, views, vectorKeyCol); + ReconcileVectorKeyValues(env, views, vectorKeyCol, TextType.Instance); Func keyToValue = (idv, i) => { - foreach (var keyCol in firstDvKeyColumns.Concat(firstDvVectorKeyColumns)) + foreach (var keyCol in firstDvVectorKeyColumns.Concat(firstDvKeyWithNamesColumns).Prepend(labelColName)) { + if (keyCol == labelColName && labelColKeyValuesType == null) + continue; idv = new KeyToValueTransform(env, new KeyToValueTransform.Arguments() { Column = new[] { new KeyToValueTransform.Column() { Name = keyCol }, } }, idv); var hidden = FindHiddenColumns(idv.Schema, keyCol); idv = new ChooseColumnsByIndexTransform(env, new ChooseColumnsByIndexTransform.Arguments() { Drop = true, Index = hidden.ToArray() }, idv); } + foreach (var keyCol in firstDvKeyNoNamesColumns) + { + var hidden = FindHiddenColumns(idv.Schema, keyCol.Key); + idv = new ChooseColumnsByIndexTransform(env, new ChooseColumnsByIndexTransform.Arguments() { Drop = true, Index = hidden.ToArray() }, idv); + } return idv; }; @@ -938,7 +993,7 @@ private static List GetMetricNames(IChannel ch, ISchema schema, IRow row ch.Assert(Utils.Size(vBufferGetters) == schema.ColumnCount); // Get the names of the metrics. For R8 valued columns the metric name is the column name. For R8 vector valued columns - // the names of the metrics are the column name, followed by the slot name if it exists, or "Label_i" if it doesn't. + // the names of the metrics are the column name, followed by the slot name if it exists, or "Label_i" if it doesn't. VBuffer names = default(VBuffer); int metricCount = 0; var metricNames = new List(); @@ -1271,7 +1326,7 @@ private static void AddScalarColumn(this ArrayDataViewBuilder dvBldr, ISchema sc } /// - /// Takes a data view containing one or more rows of metrics, and returns a data view containing additional + /// Takes a data view containing one or more rows of metrics, and returns a data view containing additional /// rows with the average and the standard deviation of the metrics in the input data view. /// public static IDataView CombineFoldMetricsDataViews(IHostEnvironment env, IDataView data, int numFolds) @@ -1454,8 +1509,8 @@ private static string GetOverallMetricsAsString(double[] sumMetrics, double[] su } // This method returns a string representation of a set of metrics. If there are stratification columns, it looks for columns named - // StratCol and StratVal, and outputs the metrics in the rows with NA in the StratCol column. If weighted is true, it looks - // for a DvBool column named "IsWeighted" and outputs the metrics in the rows with a value of true in that column. + // StratCol and StratVal, and outputs the metrics in the rows with NA in the StratCol column. If weighted is true, it looks + // for a DvBool column named "IsWeighted" and outputs the metrics in the rows with a value of true in that column. // If nonAveragedCols is non-null, it computes the average and standard deviation over all the relevant rows and populates // nonAveragedCols with columns that are either hidden, or are not of a type that we can display (i.e., either a numeric column, // or a known length vector of doubles). @@ -1694,7 +1749,7 @@ public static class MetricKinds { /// /// This data view contains the confusion matrix for N-class classification. It has N rows, and each row has - /// the following columns: + /// the following columns: /// * Count (vector indicating how many examples of this class were predicted as each one of the classes). This column /// should have metadata containing the class names. /// * (Optional) Weight (vector with the total weight of the examples of this class that were predicted as each one of the classes). diff --git a/src/Microsoft.ML.Data/Evaluators/MamlEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/MamlEvaluator.cs index bbb53ba631..2af1b54d92 100644 --- a/src/Microsoft.ML.Data/Evaluators/MamlEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/MamlEvaluator.cs @@ -10,10 +10,10 @@ namespace Microsoft.ML.Runtime.Data { /// - /// This interface is used by Maml components (the , the + /// This interface is used by Maml components (the , the /// and the to evaluate, print and save the results. - /// The input to the and the methods - /// should be assumed to contain only the following column roles: label, group, weight and name. Any other columns needed for + /// The input to the and the methods + /// should be assumed to contain only the following column roles: label, group, weight and name. Any other columns needed for /// evaluation should be searched for by name in the . /// public interface IMamlEvaluator : IEvaluator @@ -95,7 +95,7 @@ protected MamlEvaluatorBase(ArgumentsBase args, IHostEnvironment env, string sco public Dictionary Evaluate(RoleMappedData data) { - data = RoleMappedData.Create(data.Data, GetInputColumnRoles(data.Schema, needStrat: true)); + data = new RoleMappedData(data.Data, GetInputColumnRoles(data.Schema, needStrat: true)); return Evaluator.Evaluate(data); } @@ -108,7 +108,7 @@ public Dictionary Evaluate(RoleMappedData data) : StratCols.Select(col => RoleMappedSchema.CreatePair(Strat, col)); if (needName && schema.Name != null) - roles = roles.Prepend(RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Name, schema.Name.Name)); + roles = roles.Prepend(RoleMappedSchema.ColumnRole.Name.Bind(schema.Name.Name)); return roles.Concat(GetInputColumnRolesCore(schema)); } @@ -126,12 +126,12 @@ public Dictionary Evaluate(RoleMappedData data) yield return RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.Score, scoreInfo.Name); // Get the label column information. - string lab = EvaluateUtils.GetColName(LabelCol, schema.Label, DefaultColumnNames.Label); - yield return RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Label, lab); + string label = EvaluateUtils.GetColName(LabelCol, schema.Label, DefaultColumnNames.Label); + yield return RoleMappedSchema.ColumnRole.Label.Bind(label); - var weight = EvaluateUtils.GetColName(WeightCol, schema.Weight, null); + string weight = EvaluateUtils.GetColName(WeightCol, schema.Weight, null); if (!string.IsNullOrEmpty(weight)) - yield return RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Weight, weight); + yield return RoleMappedSchema.ColumnRole.Weight.Bind(weight); } public virtual IEnumerable GetOverallMetricColumns() @@ -203,7 +203,7 @@ public IDataTransform GetPerInstanceMetrics(RoleMappedData scoredData) Host.AssertValue(scoredData); var schema = scoredData.Schema; - var dataEval = RoleMappedData.Create(scoredData.Data, GetInputColumnRoles(schema)); + var dataEval = new RoleMappedData(scoredData.Data, GetInputColumnRoles(schema)); return Evaluator.GetPerInstanceMetrics(dataEval); } @@ -260,7 +260,7 @@ protected virtual IDataView GetPerInstanceMetricsCore(IDataView perInst, RoleMap public IDataView GetPerInstanceDataViewToSave(RoleMappedData perInstance) { Host.CheckValue(perInstance, nameof(perInstance)); - var data = RoleMappedData.Create(perInstance.Data, GetInputColumnRoles(perInstance.Schema, needName: true)); + var data = new RoleMappedData(perInstance.Data, GetInputColumnRoles(perInstance.Schema, needName: true)); return WrapPerInstance(data); } diff --git a/src/Microsoft.ML.Data/Evaluators/MultiOutputRegressionEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/MultiOutputRegressionEvaluator.cs index 3b5e5fc910..d57835b168 100644 --- a/src/Microsoft.ML.Data/Evaluators/MultiOutputRegressionEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/MultiOutputRegressionEvaluator.cs @@ -784,7 +784,7 @@ public static CommonOutputs.CommonEvaluateOutput MultiOutputRegression(IHostEnvi string name; MatchColumns(host, input, out label, out weight, out name); var evaluator = new MultiOutputRegressionMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, null, null, weight, name); + var data = new RoleMappedData(input.Data, label, null, null, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs index 5507176fb4..fd23e7c3b0 100644 --- a/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs @@ -256,6 +256,8 @@ public Double MacroAvgAccuracy { get { + if (_numInstances == 0) + return 0; Double macroAvgAccuracy = 0; int countOfNonEmptyClasses = 0; for (int i = 0; i < _numClasses; ++i) @@ -267,8 +269,7 @@ public Double MacroAvgAccuracy } } - Contracts.Assert(countOfNonEmptyClasses > 0); - return macroAvgAccuracy / countOfNonEmptyClasses; + return countOfNonEmptyClasses > 0 ? macroAvgAccuracy / countOfNonEmptyClasses : 0; } } @@ -1069,7 +1070,7 @@ public static CommonOutputs.ClassificationEvaluateOutput MultiClass(IHostEnviron MatchColumns(host, input, out string label, out string weight, out string name); var evaluator = new MultiClassMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, null, null, weight, name); + var data = new RoleMappedData(input.Data, label, null, null, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs index 6d61f6b965..fb8d9c1249 100644 --- a/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs @@ -556,7 +556,7 @@ public static CommonOutputs.CommonEvaluateOutput QuantileRegression(IHostEnviron string name; MatchColumns(host, input, out label, out weight, out name); var evaluator = new QuantileRegressionMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, null, null, weight, name); + var data = new RoleMappedData(input.Data, label, null, null, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Evaluators/RankerEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/RankerEvaluator.cs index ae9c2a8594..616cff8394 100644 --- a/src/Microsoft.ML.Data/Evaluators/RankerEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/RankerEvaluator.cs @@ -48,7 +48,7 @@ public sealed class Arguments public const string MaxDcg = "MaxDCG"; /// - /// The ranking evaluator outputs a data view by this name, which contains metrics aggregated per group. + /// The ranking evaluator outputs a data view by this name, which contains metrics aggregated per group. /// It contains four columns: GroupId, NDCG, DCG and MaxDCG. Each row in the data view corresponds to one /// group in the scored data. /// @@ -851,7 +851,7 @@ public RankerMamlEvaluator(IHostEnvironment env, Arguments args) { var cols = base.GetInputColumnRolesCore(schema); var groupIdCol = EvaluateUtils.GetColName(_groupIdCol, schema.Group, DefaultColumnNames.GroupId); - return cols.Prepend(RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Group, groupIdCol)); + return cols.Prepend(RoleMappedSchema.ColumnRole.Group.Bind(groupIdCol)); } protected override void PrintAdditionalMetricsCore(IChannel ch, Dictionary[] metrics) @@ -1039,7 +1039,7 @@ public static CommonOutputs.CommonEvaluateOutput Ranking(IHostEnvironment env, R nameof(RankerMamlEvaluator.Arguments.GroupIdColumn), input.GroupIdColumn, DefaultColumnNames.GroupId); var evaluator = new RankerMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, null, groupId, weight, name); + var data = new RoleMappedData(input.Data, label, null, groupId, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Evaluators/RegressionEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/RegressionEvaluator.cs index 4292e13b8d..1804ce429f 100644 --- a/src/Microsoft.ML.Data/Evaluators/RegressionEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/RegressionEvaluator.cs @@ -354,7 +354,7 @@ public static CommonOutputs.CommonEvaluateOutput Regression(IHostEnvironment env string name; MatchColumns(host, input, out label, out weight, out name); var evaluator = new RegressionMamlEvaluator(host, input); - var data = TrainUtils.CreateExamples(input.Data, label, null, null, weight, name); + var data = new RoleMappedData(input.Data, label, null, null, weight, name); var metrics = evaluator.Evaluate(data); var warnings = ExtractWarnings(host, metrics); diff --git a/src/Microsoft.ML.Data/Microsoft.ML.Data.csproj b/src/Microsoft.ML.Data/Microsoft.ML.Data.csproj index 38fb6075ce..8d5b0fd2d0 100644 --- a/src/Microsoft.ML.Data/Microsoft.ML.Data.csproj +++ b/src/Microsoft.ML.Data/Microsoft.ML.Data.csproj @@ -15,7 +15,6 @@ - diff --git a/src/Microsoft.ML.Data/Model/Onnx/ICanSaveOnnx.cs b/src/Microsoft.ML.Data/Model/Onnx/ICanSaveOnnx.cs index 0e25840c3b..36d839b93d 100644 --- a/src/Microsoft.ML.Data/Model/Onnx/ICanSaveOnnx.cs +++ b/src/Microsoft.ML.Data/Model/Onnx/ICanSaveOnnx.cs @@ -19,7 +19,7 @@ public interface ICanSaveOnnx } /// - /// This data model component is savable as Onnx. + /// This data model component is savable as ONNX. /// public interface ITransformCanSaveOnnx: ICanSaveOnnx, IDataTransform { diff --git a/src/Microsoft.ML.Data/Model/Onnx/OnnxContext.cs b/src/Microsoft.ML.Data/Model/Onnx/OnnxContext.cs index 9759ce0c6c..230f2600a3 100644 --- a/src/Microsoft.ML.Data/Model/Onnx/OnnxContext.cs +++ b/src/Microsoft.ML.Data/Model/Onnx/OnnxContext.cs @@ -2,245 +2,101 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using System.Collections.Generic; -using System.Linq; -using Microsoft.ML.Runtime.UniversalModelFormat.Onnx; using Microsoft.ML.Runtime.Data; namespace Microsoft.ML.Runtime.Model.Onnx { /// - /// A context for defining a ONNX output. + /// A context for defining a ONNX output. The context internally contains the model-in-progress being built. This + /// same context object is iteratively given to exportable components via the interface + /// and subinterfaces, that attempt to express their operations as ONNX nodes, if they can. At the point that it is + /// given to a component, all other components up to that component have already attempted to express themselves in + /// this context, with their outputs possibly available in the ONNX graph. /// - public sealed class OnnxContext + public abstract class OnnxContext { - private readonly List _nodes; - private readonly List _inputs; - private readonly List _intermediateValues; - private readonly List _outputs; - private readonly Dictionary _columnNameMap; - private readonly HashSet _variableMap; - private readonly HashSet _nodeNames; - private readonly string _name; - private readonly string _producerName; - private readonly IHost _host; - private readonly string _domain; - private readonly string _producerVersion; - private readonly long _modelVersion; - - public OnnxContext(IHostEnvironment env, string name, string producerName, - string producerVersion, long modelVersion, string domain) - { - Contracts.CheckValue(env, nameof(env)); - Contracts.CheckValue(name, nameof(name)); - Contracts.CheckValue(name, nameof(domain)); - - _host = env.Register(nameof(OnnxContext)); - _nodes = new List(); - _intermediateValues = new List(); - _inputs = new List(); - _outputs = new List(); - _columnNameMap = new Dictionary(); - _variableMap = new HashSet(); - _nodeNames = new HashSet(); - _name = name; - _producerName = producerName; - _producerVersion = producerVersion; - _modelVersion = modelVersion; - _domain = domain; - } - - public bool ContainsColumn(string colName) => _columnNameMap.ContainsKey(colName); - - /// - /// Stops tracking a column. If removeVariable is true then it also removes the - /// variable associated with it, this is useful in the event where an output variable is - /// created before realizing the transform cannot actually save as ONNX. - /// - /// IDataView column name to stop tracking - /// Remove associated ONNX variable at the time. - public void RemoveColumn(string colName, bool removeVariable) - { - - if (removeVariable) - { - foreach (var val in _intermediateValues) - { - if (val.Name == _columnNameMap[colName]) - { - _intermediateValues.Remove(val); - break; - } - } - } - - if (_columnNameMap.ContainsKey(colName)) - _columnNameMap.Remove(colName); - } - - /// - /// Removes an ONNX variable. If removeColumn is true then it also removes the - /// IDataView column associated with it. - /// - /// ONNX variable to remove. - /// IDataView column to stop tracking - public void RemoveVariable(string variableName, bool removeColumn) - { - _host.Assert(_columnNameMap.ContainsValue(variableName)); - if (removeColumn) - { - foreach (var val in _intermediateValues) - { - if (val.Name == variableName) - { - _intermediateValues.Remove(val); - break; - } - } - } - - string columnName = _columnNameMap.Single(kvp => string.Compare(kvp.Value, variableName) == 0).Key; - - Contracts.Assert(_variableMap.Contains(columnName)); - - _columnNameMap.Remove(columnName); - _variableMap.Remove(columnName); - } - /// /// Generates a unique name for the node based on a prefix. /// - public string GetNodeName(string prefix) - { - _host.CheckValue(prefix, nameof(prefix)); - return GetUniqueName(prefix, c => _nodeNames.Contains(c)); - } + /// The prefix for the node + /// A name that has not yet been returned from this function, starting with + public abstract string GetNodeName(string prefix); /// - /// Adds a node to the node list of the graph. + /// Looks up whether a given data view column has a mapping in the ONNX context. Once confirmed, callers can + /// safely call . /// - /// - public void AddNode(NodeProto node) - { - _host.CheckValue(node, nameof(node)); - _host.Assert(!_nodeNames.Contains(node.Name)); - - _nodeNames.Add(node.Name); - _nodes.Add(node); - } + /// The data view column name + /// Whether the column is mapped in this context + public abstract bool ContainsColumn(string colName); /// - /// Generates a unique name based on a prefix. + /// Stops tracking a column. /// - private string GetUniqueName(string prefix, Func pred) - { - _host.CheckValue(prefix, nameof(prefix)); - _host.CheckValue(pred, nameof(pred)); - - if (!pred(prefix)) - return prefix; - - int count = 0; - while (pred(prefix + count++)) ; - return prefix + --count; - } + /// Column name to stop tracking + /// Remove associated ONNX variable. This is useful in the event where an output + /// variable is created through before realizing + /// the transform cannot actually save as ONNX. + public abstract void RemoveColumn(string colName, bool removeVariable = false); /// - /// Retrieves the variable name that maps to the IDataView column name at a - /// given point in the pipeline execution. + /// Removes an ONNX variable. If removeColumn is true then it also removes the tracking for the column associated with it. /// - /// Column Name mapping. - public string GetVariableName(string colName) - { - _host.CheckValue(colName, nameof(colName)); - _host.Assert(_columnNameMap.ContainsKey(colName)); - - return _columnNameMap[colName]; - } - - /// - /// Retrieves the variable name that maps to the IDataView column name at a - /// given point in the pipeline execution. - /// - /// Column Name mapping. - public string TryGetVariableName(string colName) - { - if (_columnNameMap.ContainsKey(colName)) - return GetVariableName(colName); - - return null; - } - - /// - /// Generates a unique column name based on the IDataView column name if - /// there is a collision between names in the pipeline at any point. - /// - /// IDataView column name. - /// Unique variable name. - private string AddVariable(string colName) - { - _host.CheckValue(colName, nameof(colName)); - - if (!_columnNameMap.ContainsKey(colName)) - _columnNameMap.Add(colName, colName); - else - _columnNameMap[colName] = GetUniqueName(colName, s => _variableMap.Contains(s)); - - _variableMap.Add(_columnNameMap[colName]); - return _columnNameMap[colName]; - } + /// ONNX variable to remove. Note that this is an ONNX variable name, not an column name + /// IDataView column to stop tracking + public abstract void RemoveVariable(string variableName, bool removeColumn); /// - /// Adds an intermediate column to the list. + /// ONNX variables are referred to by name. At each stage of a ML.NET pipeline, the corresponding + /// 's column names will map to a variable in the ONNX graph if the intermediate steps + /// used to calculate that value are things we knew how to save as ONNX. Retrieves the variable name that maps + /// to the column name at a given point in the pipeline execution. Callers should + /// probably confirm with whether a mapping for that data view column + /// already exists. /// - public string AddIntermediateVariable(ColumnType type, string colName, bool skip = false) - { - - colName = AddVariable(colName); - - //Let the runtime figure the shape. - if (!skip) - { - _host.CheckValue(type, nameof(type)); - - _intermediateValues.Add(OnnxUtils.GetModelArgs(type, colName)); - } - - return colName; - } + /// The data view column name + /// The ONNX variable name corresponding to that data view column + public abstract string GetVariableName(string colName); /// - /// Adds an output variable to the list. + /// Establishes a new mapping from an data view column in the context, if necessary generates a unique name, and + /// returns that newly allocated name. /// - public string AddOutputVariable(ColumnType type, string colName, List dim = null) - { - _host.CheckValue(type, nameof(type)); - - if (!ContainsColumn(colName)) - AddVariable(colName); - - colName = GetVariableName(colName); - _outputs.Add(OnnxUtils.GetModelArgs(type, colName, dim)); - return colName; - } + /// The data view type associated with this column name + /// The data view column name + /// Whether we should skip the process of establishing the mapping from data view column to + /// ONNX variable name. + /// The returned value is the name of the variable corresponding + public abstract string AddIntermediateVariable(ColumnType type, string colName, bool skip = false); /// - /// Adds an input variable to the list. + /// Creates an ONNX node /// - public void AddInputVariable(ColumnType type, string colName) - { - _host.CheckValue(type, nameof(type)); - _host.CheckValue(colName, nameof(colName)); - - colName = AddVariable(colName); - _inputs.Add(OnnxUtils.GetModelArgs(type, colName)); - } + /// The name of the ONNX operator to apply + /// The names of the variables as inputs + /// The names of the variables to create as outputs, + /// which ought to have been something returned from + /// The name of the operator, which ought to be something returned from + /// The domain of the ONNX operator, if non-default + /// A node added to the in-progress ONNX graph, that attributes can be set on + public abstract OnnxNode CreateNode(string opType, IEnumerable inputs, + IEnumerable outputs, string name, string domain = null); /// - /// Makes the ONNX model based on the context. + /// Convenience alternative to + /// for the case where there is exactly one input and output. /// - public ModelProto MakeModel() - => OnnxUtils.MakeModel(_nodes, _producerName, _name, _domain, _producerVersion, _modelVersion, _inputs, _outputs, _intermediateValues); + /// The name of the ONNX operator to apply + /// The name of the variable as input + /// The name of the variable as output, + /// which ought to have been something returned from + /// The name of the operator, which ought to be something returned from + /// The domain of the ONNX operator, if non-default + /// A node added to the in-progress ONNX graph, that attributes can be set on + public OnnxNode CreateNode(string opType, string input, string output, string name, string domain = null) + => CreateNode(opType, new[] { input }, new[] { output }, name, domain); } } diff --git a/src/Microsoft.ML.Data/Model/Onnx/OnnxNode.cs b/src/Microsoft.ML.Data/Model/Onnx/OnnxNode.cs new file mode 100644 index 0000000000..259a6d27d4 --- /dev/null +++ b/src/Microsoft.ML.Data/Model/Onnx/OnnxNode.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using Microsoft.ML.Runtime.Data; + +namespace Microsoft.ML.Runtime.Model.Onnx +{ + /// + /// An abstraction for an ONNX node as created by + /// . + /// That method creates a with inputs and outputs, but this object can modify the node further + /// by adding attributes (in ONNX parlance, attributes are more or less constant parameterizations). + /// + public abstract class OnnxNode + { + public abstract void AddAttribute(string argName, double value); + public abstract void AddAttribute(string argName, long value); + public abstract void AddAttribute(string argName, DvText value); + public abstract void AddAttribute(string argName, string value); + public abstract void AddAttribute(string argName, bool value); + + public abstract void AddAttribute(string argName, IEnumerable value); + public abstract void AddAttribute(string argName, IEnumerable value); + public abstract void AddAttribute(string argName, IEnumerable value); + public abstract void AddAttribute(string argName, IEnumerable value); + public abstract void AddAttribute(string argName, string[] value); + public abstract void AddAttribute(string argName, IEnumerable value); + public abstract void AddAttribute(string argName, IEnumerable value); + } +} diff --git a/src/Microsoft.ML.Data/Model/Pfa/BoundPfaContext.cs b/src/Microsoft.ML.Data/Model/Pfa/BoundPfaContext.cs index d0923a9962..dfd5ef55fb 100644 --- a/src/Microsoft.ML.Data/Model/Pfa/BoundPfaContext.cs +++ b/src/Microsoft.ML.Data/Model/Pfa/BoundPfaContext.cs @@ -33,7 +33,7 @@ public sealed class BoundPfaContext /// private readonly Dictionary _nameToVarName; /// - /// This contains a map of those names in + /// This contains a map of those names in /// private readonly HashSet _unavailable; diff --git a/src/Microsoft.ML.Data/Model/Pfa/PfaContext.cs b/src/Microsoft.ML.Data/Model/Pfa/PfaContext.cs index 55122535d4..c0996beea1 100644 --- a/src/Microsoft.ML.Data/Model/Pfa/PfaContext.cs +++ b/src/Microsoft.ML.Data/Model/Pfa/PfaContext.cs @@ -215,7 +215,7 @@ public static JObject CreateFuncBlock(JArray prms, JToken returnType, JToken doB /// declaration. So, if you use a record type three times, that means one of the three usages must be /// accompanied by a full type declaration, whereas the other two can just then identify it by name. /// This is extremely silly, but there you go. - /// + /// /// Anyway: this will attempt to add a type to the list of registered types. If it returns true /// then the caller is responsible, then, for ensuring that their PFA code they are generating contains /// not only a reference of the type, but a declaration of the type. If however this returns false diff --git a/src/Microsoft.ML.Data/Model/Pfa/SavePfaCommand.cs b/src/Microsoft.ML.Data/Model/Pfa/SavePfaCommand.cs index 6c28dac997..dfec0913ca 100644 --- a/src/Microsoft.ML.Data/Model/Pfa/SavePfaCommand.cs +++ b/src/Microsoft.ML.Data/Model/Pfa/SavePfaCommand.cs @@ -147,13 +147,13 @@ private void Run(IChannel ch) { RoleMappedData data; if (trainSchema != null) - data = RoleMappedData.Create(end, trainSchema.GetColumnRoleNames()); + data = new RoleMappedData(end, trainSchema.GetColumnRoleNames()); else { // We had a predictor, but no roles stored in the model. Just suppose // default column names are OK, if present. - data = TrainUtils.CreateExamplesOpt(end, DefaultColumnNames.Label, - DefaultColumnNames.Features, DefaultColumnNames.GroupId, DefaultColumnNames.Weight, DefaultColumnNames.Name); + data = new RoleMappedData(end, DefaultColumnNames.Label, + DefaultColumnNames.Features, DefaultColumnNames.GroupId, DefaultColumnNames.Weight, DefaultColumnNames.Name, opt: true); } var scorePipe = ScoreUtils.GetScorer(rawPred, data, Host, trainSchema); diff --git a/src/Microsoft.ML.Data/Model/Repository.cs b/src/Microsoft.ML.Data/Model/Repository.cs index 7556cc970e..eb665f1bfc 100644 --- a/src/Microsoft.ML.Data/Model/Repository.cs +++ b/src/Microsoft.ML.Data/Model/Repository.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.IO; using System.IO.Compression; -using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.Internal.Utilities; namespace Microsoft.ML.Runtime.Model @@ -73,7 +72,7 @@ public void Dispose() } } - // These are the open entries that may contain streams into our _dirTemp. + // These are the open entries that may contain streams into our DirTemp. private List _open; private bool _disposed; @@ -108,19 +107,37 @@ internal Repository(bool needDir, IExceptionContext ectx) PathMap = new Dictionary(); _open = new List(); if (needDir) - { - DirTemp = GetTempPath(); - Directory.CreateDirectory(DirTemp); - } + DirTemp = GetShortTempDir(); else GC.SuppressFinalize(this); } - // REVIEW: This should use host environment functionality. - private static string GetTempPath() + private static string GetShortTempDir() + { + var rnd = RandomUtils.Create(); + string path; + do + { + path = Path.Combine(Path.GetTempPath(), "TLC_" + rnd.Next().ToString("X")); + path = Path.GetFullPath(path); + Directory.CreateDirectory(path); + } + while (!EnsureDirectory(path)); + return path; + } + + private static bool EnsureDirectory(string path) { - Guid guid = Guid.NewGuid(); - return Path.GetFullPath(Path.Combine(Path.GetTempPath(), "TLC_" + guid.ToString())); + path = Path.GetFullPath(Path.Combine(path, ".lock")); + try + { + using (var stream = new FileStream(path, FileMode.CreateNew)) + return true; + } + catch + { + return false; + } } ~Repository() @@ -214,7 +231,7 @@ protected void RemoveEntry(Entry ent) /// /// When building paths to our local file system, we want to force both forward and backward slashes /// to the system directory separator character. We do this for cases where we either used Windows-specific - /// path building logic, or concatenated filesystem paths with zip archive entries on Linux. + /// path building logic, or concatenated filesystem paths with zip archive entries on Linux. /// private static string NormalizeForFileSystem(string path) => path?.Replace('/', Path.DirectorySeparatorChar).Replace('\\', Path.DirectorySeparatorChar); @@ -232,7 +249,7 @@ protected void GetPath(out string pathEnt, out string pathTemp, string dir, stri _ectx.CheckParam(!name.Contains(".."), nameof(name)); // The gymnastics below are meant to deal with bad invocations including absolute paths, etc. - // That's why we go through it even if _dirTemp is null. + // That's why we go through it even if DirTemp is null. string root = Path.GetFullPath(DirTemp ?? @"x:\dummy"); string entityPath = Path.Combine(root, dir ?? "", name); entityPath = Path.GetFullPath(entityPath); diff --git a/src/Microsoft.ML.Data/Prediction/Calibrator.cs b/src/Microsoft.ML.Data/Prediction/Calibrator.cs index efa52d2ff6..237afb400e 100644 --- a/src/Microsoft.ML.Data/Prediction/Calibrator.cs +++ b/src/Microsoft.ML.Data/Prediction/Calibrator.cs @@ -111,7 +111,7 @@ public interface ICalibratorTrainer /// public interface ICalibrator { - /// Given a classifier output, produce the probability + /// Given a classifier output, produce the probability Float PredictProbability(Float output); /// Get the summary of current calibrator settings @@ -687,8 +687,7 @@ public static class CalibratorUtils private static bool NeedCalibration(IHostEnvironment env, IChannel ch, ICalibratorTrainer calibrator, ITrainer trainer, IPredictor predictor, RoleMappedSchema schema) { - var trainerEx = trainer as ITrainerEx; - if (trainerEx == null || !trainerEx.NeedCalibration) + if (!trainer.Info.NeedCalibration) { ch.Info("Not training a calibrator because it is not needed."); return false; @@ -746,13 +745,10 @@ private static bool NeedCalibration(IHostEnvironment env, IChannel ch, ICalibrat /// The trainer used to train the predictor. /// The predictor that needs calibration. /// The examples to used for calibrator training. - /// Indicates whether the predictor returned needs to be an . - /// This parameter is needed for OVA that uses the predictors as s. If it is false, - /// The predictor returned is an an . - /// The original predictor, if no calibration is needed, + /// The original predictor, if no calibration is needed, /// or a metapredictor that wraps the original predictor and the newly trained calibrator. public static IPredictor TrainCalibratorIfNeeded(IHostEnvironment env, IChannel ch, ICalibratorTrainer calibrator, - int maxRows, ITrainer trainer, IPredictor predictor, RoleMappedData data, bool needValueMapper = false) + int maxRows, ITrainer trainer, IPredictor predictor, RoleMappedData data) { Contracts.CheckValue(env, nameof(env)); env.CheckValue(ch, nameof(ch)); @@ -763,7 +759,7 @@ public static IPredictor TrainCalibratorIfNeeded(IHostEnvironment env, IChannel if (!NeedCalibration(env, ch, calibrator, trainer, predictor, data.Schema)) return predictor; - return TrainCalibrator(env, ch, calibrator, maxRows, predictor, data, needValueMapper); + return TrainCalibrator(env, ch, calibrator, maxRows, predictor, data); } /// @@ -775,13 +771,10 @@ public static IPredictor TrainCalibratorIfNeeded(IHostEnvironment env, IChannel /// The maximum rows to use for calibrator training. /// The predictor that needs calibration. /// The examples to used for calibrator training. - /// Indicates whether the predictor returned needs to be an . - /// This parameter is needed for OVA that uses the predictors as s. If it is false, - /// The predictor returned is an an . - /// The original predictor, if no calibration is needed, + /// The original predictor, if no calibration is needed, /// or a metapredictor that wraps the original predictor and the newly trained calibrator. public static IPredictor TrainCalibrator(IHostEnvironment env, IChannel ch, ICalibratorTrainer caliTrainer, - int maxRows, IPredictor predictor, RoleMappedData data, bool needValueMapper = false) + int maxRows, IPredictor predictor, RoleMappedData data) { Contracts.CheckValue(env, nameof(env)); env.CheckValue(ch, nameof(ch)); @@ -834,10 +827,10 @@ public static IPredictor TrainCalibrator(IHostEnvironment env, IChannel ch, ICal } } var cali = caliTrainer.FinishTraining(ch); - return CreateCalibratedPredictor(env, (IPredictorProducing)predictor, cali, needValueMapper); + return CreateCalibratedPredictor(env, (IPredictorProducing)predictor, cali); } - public static IPredictorProducing CreateCalibratedPredictor(IHostEnvironment env, IPredictorProducing predictor, ICalibrator cali, bool needValueMapper = false) + public static IPredictorProducing CreateCalibratedPredictor(IHostEnvironment env, IPredictorProducing predictor, ICalibrator cali) { Contracts.Assert(predictor != null); if (cali == null) @@ -853,7 +846,7 @@ public static IPredictorProducing CreateCalibratedPredictor(IHostEnvironm var predWithFeatureScores = predictor as IPredictorWithFeatureWeights; if (predWithFeatureScores != null && predictor is IParameterMixer && cali is IParameterMixer) return new ParameterMixingCalibratedPredictor(env, predWithFeatureScores, cali); - if (needValueMapper) + if (predictor is IValueMapper) return new CalibratedPredictor(env, predictor, cali); return new SchemaBindableCalibratedPredictor(env, predictor, cali); } @@ -1443,19 +1436,14 @@ public bool SaveAsOnnx(OnnxContext ctx, string[] scoreProbablityColumnNames, str string opType = "Affine"; string linearOutput = ctx.AddIntermediateVariable(null, "linearOutput", true); - var node = OnnxUtils.MakeNode(opType, new List { scoreProbablityColumnNames[0] }, - new List { linearOutput }, ctx.GetNodeName(opType), "ai.onnx"); - - OnnxUtils.NodeAddAttributes(node, "alpha", ParamA * -1); - OnnxUtils.NodeAddAttributes(node, "beta", -0.0000001); - - ctx.AddNode(node); + var node = ctx.CreateNode(opType, new[] { scoreProbablityColumnNames[0] }, + new[] { linearOutput }, ctx.GetNodeName(opType), ""); + node.AddAttribute("alpha", ParamA * -1); + node.AddAttribute("beta", -0.0000001); opType = "Sigmoid"; - node = OnnxUtils.MakeNode(opType, new List { linearOutput }, - new List { scoreProbablityColumnNames[1] }, ctx.GetNodeName(opType), "ai.onnx"); - - ctx.AddNode(node); + node = ctx.CreateNode(opType, new[] { linearOutput }, + new[] { scoreProbablityColumnNames[1] }, ctx.GetNodeName(opType), ""); return true; } diff --git a/src/Microsoft.ML.Data/Scorers/BinaryClassifierScorer.cs b/src/Microsoft.ML.Data/Scorers/BinaryClassifierScorer.cs index 6fde9a5815..6da402431d 100644 --- a/src/Microsoft.ML.Data/Scorers/BinaryClassifierScorer.cs +++ b/src/Microsoft.ML.Data/Scorers/BinaryClassifierScorer.cs @@ -82,7 +82,7 @@ private static ISchemaBoundMapper WrapIfNeeded(IHostEnvironment env, ISchemaBoun /// The type of the label names from the metadata (either /// originating from the key value metadata of the training label column, or deserialized /// from the model of a bindable mapper) - /// Whether we can call with + /// Whether we can call with /// this mapper and expect it to succeed private static bool CanWrap(ISchemaBoundMapper mapper, ColumnType labelNameType) { @@ -201,16 +201,14 @@ public override void SaveAsOnnx(OnnxContext ctx) for (int iinfo = 0; iinfo < Bindings.InfoCount; ++iinfo) outColumnNames[iinfo] = Bindings.GetColumnName(Bindings.MapIinfoToCol(iinfo)); - //Check if "Probability" column was generated by the base class, only then + //Check if "Probability" column was generated by the base class, only then //label can be predicted. if (Bindings.InfoCount >= 3 && ctx.ContainsColumn(outColumnNames[2])) { string opType = "Binarizer"; - var node = OnnxUtils.MakeNode(opType, new List { ctx.GetVariableName(outColumnNames[2]) }, - new List { ctx.GetVariableName(outColumnNames[0]) }, ctx.GetNodeName(opType)); - - OnnxUtils.NodeAddAttributes(node, "threshold", 0.5); - ctx.AddNode(node); + var node = ctx.CreateNode(opType, new[] { ctx.GetVariableName(outColumnNames[2]) }, + new[] { ctx.GetVariableName(outColumnNames[0]) }, ctx.GetNodeName(opType)); + node.AddAttribute("threshold", 0.5); } } diff --git a/src/Microsoft.ML.Data/Scorers/GenericScorer.cs b/src/Microsoft.ML.Data/Scorers/GenericScorer.cs index 91c84a0734..41c12e94ed 100644 --- a/src/Microsoft.ML.Data/Scorers/GenericScorer.cs +++ b/src/Microsoft.ML.Data/Scorers/GenericScorer.cs @@ -20,7 +20,7 @@ namespace Microsoft.ML.Runtime.Data { /// /// This class is a scorer that passes through all the ISchemaBound columns without adding any "derived columns". - /// It also passes through all metadata (except for possibly changing the score column kind), and adds the + /// It also passes through all metadata (except for possibly changing the score column kind), and adds the /// score set id metadata. /// @@ -70,7 +70,7 @@ private static Bindings Create(IHostEnvironment env, ISchemaBindableMapper binda Contracts.AssertValue(roles); Contracts.AssertValueOrNull(suffix); - var mapper = bindable.Bind(env, RoleMappedSchema.Create(input, roles)); + var mapper = bindable.Bind(env, new RoleMappedSchema(input, roles)); // We don't actually depend on this invariant, but if this assert fires it means the bindable // did the wrong thing. Contracts.Assert(mapper.InputSchema.Schema == input); diff --git a/src/Microsoft.ML.Data/Scorers/MultiClassClassifierScorer.cs b/src/Microsoft.ML.Data/Scorers/MultiClassClassifierScorer.cs index 4832f92cd4..c12fd9b4d1 100644 --- a/src/Microsoft.ML.Data/Scorers/MultiClassClassifierScorer.cs +++ b/src/Microsoft.ML.Data/Scorers/MultiClassClassifierScorer.cs @@ -452,7 +452,7 @@ private static ISchemaBoundMapper WrapIfNeeded(IHostEnvironment env, ISchemaBoun /// The type of the label names from the metadata (either /// originating from the key value metadata of the training label column, or deserialized /// from the model of a bindable mapper) - /// Whether we can call with + /// Whether we can call with /// this mapper and expect it to succeed public static bool CanWrap(ISchemaBoundMapper mapper, ColumnType labelNameType) { diff --git a/src/Microsoft.ML.Data/Scorers/PredictedLabelScorerBase.cs b/src/Microsoft.ML.Data/Scorers/PredictedLabelScorerBase.cs index fe69585b78..2fd039897a 100644 --- a/src/Microsoft.ML.Data/Scorers/PredictedLabelScorerBase.cs +++ b/src/Microsoft.ML.Data/Scorers/PredictedLabelScorerBase.cs @@ -117,7 +117,7 @@ public BindingsImpl ApplyToSchema(ISchema input, ISchemaBindableMapper bindable, env.AssertValue(bindable); string scoreCol = RowMapper.OutputSchema.GetColumnName(ScoreColumnIndex); - var schema = RoleMappedSchema.Create(input, RowMapper.GetInputColumnRoles()); + var schema = new RoleMappedSchema(input, RowMapper.GetInputColumnRoles()); // Checks compatibility of the predictor input types. var mapper = bindable.Bind(env, schema); @@ -148,7 +148,7 @@ public static BindingsImpl Create(ModelLoadContext ctx, ISchema input, string scoreKind = ctx.LoadNonEmptyString(); string scoreCol = ctx.LoadNonEmptyString(); - var mapper = bindable.Bind(env, RoleMappedSchema.Create(input, roles)); + var mapper = bindable.Bind(env, new RoleMappedSchema(input, roles)); var rowMapper = mapper as ISchemaBoundRowMapper; env.CheckParam(rowMapper != null, nameof(bindable), "Bindable expected to be an " + nameof(ISchemaBindableMapper) + "!"); diff --git a/src/Microsoft.ML.Data/Scorers/ScoreMapperSchema.cs b/src/Microsoft.ML.Data/Scorers/ScoreMapperSchema.cs index ddb05e3686..0f115bb2f0 100644 --- a/src/Microsoft.ML.Data/Scorers/ScoreMapperSchema.cs +++ b/src/Microsoft.ML.Data/Scorers/ScoreMapperSchema.cs @@ -251,7 +251,7 @@ public SequencePredictorSchema(ColumnType type, ref VBuffer keyNames, st Contracts.CheckParam(keyNames.Length == type.ItemType.KeyCount, nameof(keyNames), "keyNames length must match type's key count"); // REVIEW: Assuming the caller takes some care, it seems - // like we can get away with + // like we can get away with _keyNames = keyNames; _keyNamesType = new VectorType(TextType.Instance, keyNames.Length); _getKeyNames = GetKeyNames; diff --git a/src/Microsoft.ML.Data/Training/EarlyStoppingCriteria.cs b/src/Microsoft.ML.Data/Training/EarlyStoppingCriteria.cs index 13cdb126ee..1da5a5562a 100644 --- a/src/Microsoft.ML.Data/Training/EarlyStoppingCriteria.cs +++ b/src/Microsoft.ML.Data/Training/EarlyStoppingCriteria.cs @@ -123,7 +123,7 @@ public override bool CheckScore(Float validationScore, Float trainingScore, out } // For the detail of the following rules, see the following paper. - // Lodwich, Aleksander, Yves Rangoni, and Thomas Breuel. "Evaluation of robustness and performance of early stopping rules with multi layer perceptrons." + // Lodwich, Aleksander, Yves Rangoni, and Thomas Breuel. "Evaluation of robustness and performance of early stopping rules with multi layer perceptrons." // Neural Networks, 2009. IJCNN 2009. International Joint Conference on. IEEE, 2009. public abstract class MovingWindowEarlyStoppingCriterion : EarlyStoppingCriterion @@ -139,9 +139,9 @@ public class Arguments : ArgumentsBase public int WindowSize = 5; } - protected internal Queue PastScores; + protected Queue PastScores; - internal MovingWindowEarlyStoppingCriterion(Arguments args, bool lowerIsBetter) + private protected MovingWindowEarlyStoppingCriterion(Arguments args, bool lowerIsBetter) : base(args, lowerIsBetter) { Contracts.CheckUserArg(0 <= Args.Threshold && args.Threshold <= 1, nameof(args.Threshold), "Must be in range [0,1]."); diff --git a/src/Microsoft.ML.Data/Training/TrainerBase.cs b/src/Microsoft.ML.Data/Training/TrainerBase.cs index 90f8b64a7c..ca2f2c7b64 100644 --- a/src/Microsoft.ML.Data/Training/TrainerBase.cs +++ b/src/Microsoft.ML.Data/Training/TrainerBase.cs @@ -4,59 +4,32 @@ namespace Microsoft.ML.Runtime.Training { - public abstract class TrainerBase : ITrainer, ITrainerEx + public abstract class TrainerBase : ITrainer + where TPredictor : IPredictor { - public const string NoTrainingInstancesMessage = "No valid training instances found, all instances have missing features."; + /// + /// A standard string to use in errors or warnings by subclasses, to communicate the idea that no valid + /// instances were able to be found. + /// + protected const string NoTrainingInstancesMessage = "No valid training instances found, all instances have missing features."; - protected readonly IHost Host; + protected IHost Host { get; } public string Name { get; } public abstract PredictionKind PredictionKind { get; } - public abstract bool NeedNormalization { get; } - public abstract bool NeedCalibration { get; } - public abstract bool WantCaching { get; } + public abstract TrainerInfo Info { get; } protected TrainerBase(IHostEnvironment env, string name) { Contracts.CheckValue(env, nameof(env)); - Contracts.CheckNonEmpty(name, nameof(name)); + env.CheckNonEmpty(name, nameof(name)); Name = name; Host = env.Register(name); } - IPredictor ITrainer.CreatePredictor() - { - return CreatePredictorCore(); - } - - protected abstract IPredictor CreatePredictorCore(); - } - - public abstract class TrainerBase : TrainerBase - where TPredictor : IPredictor - { - protected TrainerBase(IHostEnvironment env, string name) - : base(env, name) - { - } - - public abstract TPredictor CreatePredictor(); - - protected sealed override IPredictor CreatePredictorCore() - { - return CreatePredictor(); - } - } - - public abstract class TrainerBase : TrainerBase, ITrainer - where TPredictor : IPredictor - { - protected TrainerBase(IHostEnvironment env, string name) - : base(env, name) - { - } + IPredictor ITrainer.Train(TrainContext context) => Train(context); - public abstract void Train(TDataSet data); + public abstract TPredictor Train(TrainContext context); } } diff --git a/src/Microsoft.ML.Data/Training/TrainerUtils.cs b/src/Microsoft.ML.Data/Training/TrainerUtils.cs index b2032bfc38..33d3d1490d 100644 --- a/src/Microsoft.ML.Data/Training/TrainerUtils.cs +++ b/src/Microsoft.ML.Data/Training/TrainerUtils.cs @@ -400,10 +400,10 @@ protected static IRowCursor CreateCursor(RoleMappedData data, CursOpt opt, IRand /// delegate of the cursor, indicating what additional options should be specified on subsequent /// passes over the data. The base implementation checks if any rows were skipped, and if none were /// skipped, it signals the context that it needn't bother with any filtering checks. - /// + /// /// Because the result will be "or"-red, a perfectly acceptable implementation is that this /// return the default , in which case the flags will not ever change. - /// + /// /// If the cursor was created with a signal delegate, the return value of this method will be sent /// to that delegate. /// diff --git a/src/Microsoft.ML.Data/Transforms/ChooseColumnsTransform.cs b/src/Microsoft.ML.Data/Transforms/ChooseColumnsTransform.cs index 5efc9264f1..1459f55cab 100644 --- a/src/Microsoft.ML.Data/Transforms/ChooseColumnsTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/ChooseColumnsTransform.cs @@ -58,6 +58,20 @@ public bool TryUnparse(StringBuilder sb) public sealed class Arguments { + public Arguments() + { + + } + + internal Arguments(params string[] columns) + { + Column = new Column[columns.Length]; + for (int i = 0; i < columns.Length; i++) + { + Column[i] = new Column() { Source = columns[i], Name = columns[i] }; + } + } + [Argument(ArgumentType.Multiple, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)] public Column[] Column; @@ -442,6 +456,17 @@ private static VersionInfo GetVersionInfo() private const string RegistrationName = "ChooseColumns"; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Names of the columns to choose. + public ChooseColumnsTransform(IHostEnvironment env, IDataView input, params string[] columns) + : this(env, new Arguments(columns), input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Data/Transforms/ColumnBindingsBase.cs b/src/Microsoft.ML.Data/Transforms/ColumnBindingsBase.cs index 58eee5430b..2347d2c679 100644 --- a/src/Microsoft.ML.Data/Transforms/ColumnBindingsBase.cs +++ b/src/Microsoft.ML.Data/Transforms/ColumnBindingsBase.cs @@ -324,17 +324,17 @@ protected ColumnBindingsBase(ISchema input, bool user, params string[] names) if (string.IsNullOrWhiteSpace(name)) { throw user ? -#pragma warning disable TLC_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. +#pragma warning disable MSML_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. Contracts.ExceptUserArg(standardColumnArgName, "New column needs a name") : -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof Contracts.ExceptDecode("New column needs a name"); } if (_nameToInfoIndex.ContainsKey(name)) { throw user ? -#pragma warning disable TLC_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. +#pragma warning disable MSML_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. Contracts.ExceptUserArg(standardColumnArgName, "New column '{0}' specified multiple times", name) : -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof Contracts.ExceptDecode("New column '{0}' specified multiple times", name); } _nameToInfoIndex.Add(name, iinfo); @@ -686,10 +686,10 @@ protected ManyToOneColumnBindingsBase(ManyToOneColumn[] column, ISchema input, F for (int j = 0; j < src.Length; j++) { Contracts.CheckUserArg(!string.IsNullOrWhiteSpace(src[j]), nameof(ManyToOneColumn.Source)); -#pragma warning disable TLC_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. +#pragma warning disable MSML_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. if (!input.TryGetColumnIndex(src[j], out srcIndices[j])) throw Contracts.ExceptUserArg(standardColumnArgName, "Source column '{0}' not found", src[j]); -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof srcTypes[j] = input.GetColumnType(srcIndices[j]); var size = srcTypes[j].ValueCount; srcSize = size == 0 ? null : checked(srcSize + size); @@ -700,10 +700,10 @@ protected ManyToOneColumnBindingsBase(ManyToOneColumn[] column, ISchema input, F string reason = testTypes(srcTypes); if (reason != null) { -#pragma warning disable TLC_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. +#pragma warning disable MSML_ContractsNameUsesNameof // Unfortunately, there is no base class for the columns bindings. throw Contracts.ExceptUserArg(standardColumnArgName, "Column '{0}' has invalid source types: {1}. Source types: '{2}'.", item.Name, reason, string.Join(", ", srcTypes.Select(type => type.ToString()))); -#pragma warning restore TLC_ContractsNameUsesNameof +#pragma warning restore MSML_ContractsNameUsesNameof } } Infos[i] = new ColInfo(srcSize.GetValueOrDefault(), srcIndices, srcTypes); @@ -861,7 +861,7 @@ public Func GetDependencies(Func predicate) } /// - /// Parsing utilities for converting between transform column argument objects and + /// Parsing utilities for converting between transform column argument objects and /// command line representations. /// public static class ColumnParsingUtils diff --git a/src/Microsoft.ML.Data/Transforms/ConcatTransform.cs b/src/Microsoft.ML.Data/Transforms/ConcatTransform.cs index 544bce0aeb..b2024cc18c 100644 --- a/src/Microsoft.ML.Data/Transforms/ConcatTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/ConcatTransform.cs @@ -55,7 +55,7 @@ public sealed class TaggedColumn public string Name; // The tag here (the key of the KeyValuePair) is the string that will be the prefix of the slot name - // in the output column. For non-vector columns, the slot name will be either the column name or the + // in the output column. For non-vector columns, the slot name will be either the column name or the // tag if it is non empty. For vector columns, the slot names will be 'ColumnName.SlotName' if the // tag is empty, 'Tag.SlotName' if tag is non empty, and simply the slot name if tag is non empty // and equal to the column name. @@ -90,6 +90,19 @@ public bool TryUnparse(StringBuilder sb) public sealed class Arguments : TransformInputBase { + public Arguments() + { + } + + public Arguments(string name, params string[] source) + { + Column = new[] { new Column() + { + Name = name, + Source = source + }}; + } + [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:srcs)", ShortName = "col", SortOrder = 1)] public Column[] Column; } @@ -232,11 +245,8 @@ private void CacheTypes(out ColumnType[] types, out ColumnType[] typesSlotNames, { // All meta-data is passed through in this case, so don't need the slot names type. echoSrc[i] = true; - DvBool b = DvBool.False; isNormalized[i] = - info.SrcTypes[0].ItemType.IsNumber && - Input.TryGetMetadata(BoolType.Instance, MetadataUtils.Kinds.IsNormalized, info.SrcIndices[0], ref b) && - b.IsTrue; + info.SrcTypes[0].ItemType.IsNumber && Input.IsNormalized(info.SrcIndices[0]); types[i] = info.SrcTypes[0]; continue; } @@ -247,9 +257,7 @@ private void CacheTypes(out ColumnType[] types, out ColumnType[] typesSlotNames, { foreach (var srcCol in info.SrcIndices) { - DvBool b = DvBool.False; - if (!Input.TryGetMetadata(BoolType.Instance, MetadataUtils.Kinds.IsNormalized, srcCol, ref b) || - !b.IsTrue) + if (!Input.IsNormalized(srcCol)) { isNormalized[i] = false; break; @@ -497,7 +505,7 @@ private void GetSlotNames(int iinfo, ref VBuffer dst) } } - public const string Summary = "Concatenates two columns of the same item type."; + public const string Summary = "Concatenates one or more columns of the same item type."; public const string UserName = "Concat Transform"; public const string LoadName = "Concat"; @@ -527,6 +535,18 @@ private static VersionInfo GetVersionInfo() public override ISchema Schema => _bindings; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Input columns to concatenate. + public ConcatTransform(IHostEnvironment env, IDataView input, string name, params string[] source) + : this(env, new Arguments(name, source), input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -700,13 +720,10 @@ public void SaveAsOnnx(OnnxContext ctx) Source.Schema.GetColumnType(srcIndex).ValueCount)); } - var node = OnnxUtils.MakeNode(opType, new List(inputList.Select(t => t.Key)), - new List { ctx.AddIntermediateVariable(outColType, outName) }, ctx.GetNodeName(opType)); - - ctx.AddNode(node); + var node = ctx.CreateNode(opType, inputList.Select(t => t.Key), + new[] { ctx.AddIntermediateVariable(outColType, outName) }, ctx.GetNodeName(opType)); - OnnxUtils.NodeAddAttributes(node, "inputList", inputList.Select(x => x.Key)); - OnnxUtils.NodeAddAttributes(node, "inputdimensions", inputList.Select(x => x.Value)); + node.AddAttribute("inputdimensions", inputList.Select(x => x.Value)); } } diff --git a/src/Microsoft.ML.Data/Transforms/ConvertTransform.cs b/src/Microsoft.ML.Data/Transforms/ConvertTransform.cs index c37f0a6983..52005c7558 100644 --- a/src/Microsoft.ML.Data/Transforms/ConvertTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/ConvertTransform.cs @@ -169,6 +169,23 @@ private static VersionInfo GetVersionInfo() // This is parallel to Infos. private readonly ColInfoEx[] _exes; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// The expected type of the converted column. + /// Name of the output column. + /// Name of the column to be converted. If this is null '' will be used. + public ConvertTransform(IHostEnvironment env, + IDataView input, + DataKind resultType, + string name, + string source = null) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, ResultType = resultType }, input) + { + } + public ConvertTransform(IHostEnvironment env, Arguments args, IDataView input) : base(env, RegistrationName, env.CheckRef(args, nameof(args)).Column, input, null) diff --git a/src/Microsoft.ML.Data/Transforms/CopyColumnsTransform.cs b/src/Microsoft.ML.Data/Transforms/CopyColumnsTransform.cs index f365dd9e98..2729a48e3e 100644 --- a/src/Microsoft.ML.Data/Transforms/CopyColumnsTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/CopyColumnsTransform.cs @@ -64,6 +64,18 @@ private static VersionInfo GetVersionInfo() private const string RegistrationName = "CopyColumns"; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be copied. + public CopyColumnsTransform(IHostEnvironment env, IDataView input, string name, string source) + : this(env, new Arguments(){ Column = new[] { new Column() { Source = source, Name = name }}}, input) + { + } + public CopyColumnsTransform(IHostEnvironment env, Arguments args, IDataView input) : base(env, RegistrationName, env.CheckRef(args, nameof(args)).Column, input, null) { diff --git a/src/Microsoft.ML.Data/Transforms/DropColumnsTransform.cs b/src/Microsoft.ML.Data/Transforms/DropColumnsTransform.cs index 502e6f395d..3e15199ff7 100644 --- a/src/Microsoft.ML.Data/Transforms/DropColumnsTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/DropColumnsTransform.cs @@ -237,6 +237,17 @@ private static VersionInfo GetVersionInfo() private const string DropRegistrationName = "DropColumns"; private const string KeepRegistrationName = "KeepColumns"; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the columns to be dropped. + public DropColumnsTransform(IHostEnvironment env, IDataView input, params string[] columnsToDrop) + :this(env, new Arguments() { Column = columnsToDrop }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -383,4 +394,17 @@ public ValueGetter GetGetter(int col) } } } + + public class KeepColumnsTransform + { + /// + /// A helper method to create for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the columns to be kept. All other columns will be removed. + /// + public static IDataTransform Create(IHostEnvironment env, IDataView input, params string[] columnsToKeep) + => new DropColumnsTransform(env, new DropColumnsTransform.KeepArguments() { Column = columnsToKeep }, input); + } } diff --git a/src/Microsoft.ML.Data/Transforms/DropSlotsTransform.cs b/src/Microsoft.ML.Data/Transforms/DropSlotsTransform.cs index 9a40f404ea..230cfbe680 100644 --- a/src/Microsoft.ML.Data/Transforms/DropSlotsTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/DropSlotsTransform.cs @@ -313,7 +313,7 @@ private void GetSlotsMinMax(Column col, out int[] slotsMin, out int[] slotsMax) slotsMin[j] = range.Min; // There are two reasons for setting the max to int.MaxValue - 1: // 1. max is an index, so it has to be strictly less than int.MaxValue. - // 2. to prevent overflows when adding 1 to it. + // 2. to prevent overflows when adding 1 to it. slotsMax[j] = range.Max ?? int.MaxValue - 1; } Array.Sort(slotsMin, slotsMax); @@ -473,7 +473,7 @@ private void GetCategoricalSlotRangesCore(int iinfo, int[] slotsMin, int[] slots // Six possible ways a drop slot range interacts with categorical slots range. // - // +--------------Drop-------------+ + // +--------------Drop-------------+ // | | // // +---Drop---+ +---Drop---+ +---Drop---+ diff --git a/src/Microsoft.ML.Data/Transforms/GenerateNumberTransform.cs b/src/Microsoft.ML.Data/Transforms/GenerateNumberTransform.cs index f80589bdab..cacd681141 100644 --- a/src/Microsoft.ML.Data/Transforms/GenerateNumberTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/GenerateNumberTransform.cs @@ -24,9 +24,9 @@ namespace Microsoft.ML.Runtime.Data { /// - /// This transform adds columns containing either random numbers distributed + /// This transform adds columns containing either random numbers distributed /// uniformly between 0 and 1 or an auto-incremented integer starting at zero. - /// It will be used in conjunction with a filter transform to create random + /// It will be used in conjunction with a filter transform to create random /// partitions of the data, used in cross validation. /// public sealed class GenerateNumberTransform : RowToRowTransformBase @@ -77,16 +77,22 @@ private bool TryParse(string str) } } + private static class Defaults + { + public const bool UseCounter = false; + public const uint Seed = 42; + } + public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:seed)", ShortName = "col", SortOrder = 1)] public Column[] Column; [Argument(ArgumentType.AtMostOnce, HelpText = "Use an auto-incremented integer starting at zero instead of a random number", ShortName = "cnt")] - public bool UseCounter; + public bool UseCounter = Defaults.UseCounter; [Argument(ArgumentType.AtMostOnce, HelpText = "The random seed")] - public uint Seed = 42; + public uint Seed = Defaults.Seed; } private sealed class Bindings : ColumnBindingsBase @@ -250,6 +256,18 @@ private static VersionInfo GetVersionInfo() private const string RegistrationName = "GenerateNumber"; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Use an auto-incremented integer starting at zero instead of a random number. + public GenerateNumberTransform(IHostEnvironment env, IDataView input, string name, bool useCounter = Defaults.UseCounter) + : this(env, new Arguments() { Column = new[] { new Column() { Name = name } }, UseCounter = useCounter }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Data/Transforms/HashTransform.cs b/src/Microsoft.ML.Data/Transforms/HashTransform.cs index ca959069f7..0519428284 100644 --- a/src/Microsoft.ML.Data/Transforms/HashTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/HashTransform.cs @@ -25,7 +25,7 @@ namespace Microsoft.ML.Runtime.Data /// /// This transform can hash either single valued columns or vector columns. For vector columns, - /// it hashes each slot separately. + /// it hashes each slot separately. /// It can hash either text values or key values. /// public sealed class HashTransform : OneToOneTransformBase, ITransformTemplate @@ -33,6 +33,14 @@ public sealed class HashTransform : OneToOneTransformBase, ITransformTemplate public const int NumBitsMin = 1; public const int NumBitsLim = 32; + private static class Defaults + { + public const int HashBits = NumBitsLim - 1; + public const uint Seed = 314489979; + public const bool Ordered = false; + public const int InvertHash = 0; + } + public sealed class Arguments { [Argument(ArgumentType.Multiple, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", @@ -41,18 +49,18 @@ public sealed class Arguments [Argument(ArgumentType.AtMostOnce, HelpText = "Number of bits to hash into. Must be between 1 and 31, inclusive", ShortName = "bits", SortOrder = 2)] - public int HashBits = NumBitsLim - 1; + public int HashBits = Defaults.HashBits; [Argument(ArgumentType.AtMostOnce, HelpText = "Hashing seed")] - public uint Seed = 314489979; + public uint Seed = Defaults.Seed; [Argument(ArgumentType.AtMostOnce, HelpText = "Whether the position of each term should be included in the hash", ShortName = "ord")] - public bool Ordered; + public bool Ordered = Defaults.Ordered; [Argument(ArgumentType.AtMostOnce, HelpText = "Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit.", ShortName = "ih")] - public int InvertHash; + public int InvertHash = Defaults.InvertHash; } public sealed class Column : OneToOneColumn @@ -234,6 +242,27 @@ public override void Save(ModelSaveContext ctx) TextModelHelper.SaveAll(Host, ctx, Infos.Length, _keyValues); } + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// Number of bits to hash into. Must be between 1 and 31, inclusive. + /// Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit. + public HashTransform(IHostEnvironment env, + IDataView input, + string name, + string source = null, + int hashBits = Defaults.HashBits, + int invertHash = Defaults.InvertHash) + : this(env, new Arguments() { + Column = new[] { new Column() { Source = source ?? name, Name = name } }, + HashBits = hashBits, InvertHash = invertHash }, input) + { + } + public HashTransform(IHostEnvironment env, Arguments args, IDataView input) : base(Contracts.CheckRef(env, nameof(env)), RegistrationName, env.CheckRef(args, nameof(args)).Column, input, TestType) diff --git a/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs b/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs index 7a7e8fafda..d615b96894 100644 --- a/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs +++ b/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs @@ -265,7 +265,7 @@ public VBuffer GetMetadata() public void Add(int dstSlot, ValueGetter getter, ref T key) { - // REVIEW: I only call the getter if I determine I have to, but + // REVIEW: I only call the getter if I determine I have to, but // at the cost of passing along this getter and ref argument (as opposed // to just the argument). Is this really appropriate or helpful? Contracts.Assert(0 <= dstSlot && dstSlot < _slots); diff --git a/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs b/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs index 165ab7e0df..997fa22d03 100644 --- a/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs @@ -73,6 +73,18 @@ private static VersionInfo GetVersionInfo() private readonly ColumnType[] _types; private KeyToValueMap[] _kvMaps; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the input column. If this is null '' will be used. + public KeyToValueTransform(IHostEnvironment env, IDataView input, string name, string source = null) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } } }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Data/Transforms/KeyToVectorTransform.cs b/src/Microsoft.ML.Data/Transforms/KeyToVectorTransform.cs index bffbaa881c..0f4b616a49 100644 --- a/src/Microsoft.ML.Data/Transforms/KeyToVectorTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/KeyToVectorTransform.cs @@ -70,6 +70,11 @@ public bool TryUnparse(StringBuilder sb) } } + private static class Defaults + { + public const bool Bag = false; + } + public sealed class Arguments { [Argument(ArgumentType.Multiple, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)] @@ -77,7 +82,7 @@ public sealed class Arguments [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to combine multiple indicator vectors into a single bag vector instead of concatenating them. This is only relevant when the input is a vector.")] - public bool Bag; + public bool Bag = Defaults.Bag; } internal const string Summary = "Converts a key column to an indicator vector."; @@ -112,6 +117,23 @@ private static VersionInfo GetVersionInfo() private readonly bool[] _concat; private readonly VectorType[] _types; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the input column. If this is null '' will be used. + /// Whether to combine multiple indicator vectors into a single bag vector instead of concatenating them. This is only relevant when the input is a vector. + public KeyToVectorTransform(IHostEnvironment env, + IDataView input, + string name, + string source = null, + bool bag = Defaults.Bag) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, Bag = bag }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -244,10 +266,9 @@ protected override JToken SaveAsPfaCore(BoundPfaContext ctx, int iinfo, ColInfo protected override bool SaveAsOnnxCore(OnnxContext ctx, int iinfo, ColInfo info, string srcVariableName, string dstVariableName) { string opType = "OneHotEncoder"; - var node = OnnxUtils.MakeNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); - OnnxUtils.NodeAddAttributes(node, "cats_int64s", Enumerable.Range(1, info.TypeSrc.ItemType.KeyCount).Select(x => (long)x)); - OnnxUtils.NodeAddAttributes(node, "zeros", true); - ctx.AddNode(node); + var node = ctx.CreateNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); + node.AddAttribute("cats_int64s", Enumerable.Range(1, info.TypeSrc.ItemType.KeyCount).Select(x => (long)x)); + node.AddAttribute("zeros", true); return true; } diff --git a/src/Microsoft.ML.Data/Transforms/LabelConvertTransform.cs b/src/Microsoft.ML.Data/Transforms/LabelConvertTransform.cs index 5329d89a57..8817833f40 100644 --- a/src/Microsoft.ML.Data/Transforms/LabelConvertTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/LabelConvertTransform.cs @@ -64,6 +64,18 @@ private static VersionInfo GetVersionInfo() private const string RegistrationName = "LabelConvert"; private VectorType _slotType; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the input column. If this is null '' will be used. + public LabelConvertTransform(IHostEnvironment env, IDataView input, string name, string source = null) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } } }, input) + { + } + public LabelConvertTransform(IHostEnvironment env, Arguments args, IDataView input) : base(env, RegistrationName, Contracts.CheckRef(args, nameof(args)).Column, input, RowCursorUtils.TestGetLabelGetter) { diff --git a/src/Microsoft.ML.Data/Transforms/LabelIndicatorTransform.cs b/src/Microsoft.ML.Data/Transforms/LabelIndicatorTransform.cs index 81a91b5f17..a7672b5a1c 100644 --- a/src/Microsoft.ML.Data/Transforms/LabelIndicatorTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/LabelIndicatorTransform.cs @@ -111,6 +111,23 @@ private static string TestIsMulticlassLabel(ColumnType type) return $"Label column type is not supported for binary remapping: {type}. Supported types: key, float, double."; } + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Label of the positive class. + /// Name of the output column. + /// Name of the input column. If this is null '' will be used. + public LabelIndicatorTransform(IHostEnvironment env, + IDataView input, + int classIndex, + string name, + string source = null) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, ClassIndex = classIndex }, input) + { + } + public LabelIndicatorTransform(IHostEnvironment env, Arguments args, IDataView input) : base(env, LoadName, Contracts.CheckRef(args, nameof(args)).Column, input, TestIsMulticlassLabel) diff --git a/src/Microsoft.ML.Data/Transforms/NAFilter.cs b/src/Microsoft.ML.Data/Transforms/NAFilter.cs index 96c2111366..c8515291f3 100644 --- a/src/Microsoft.ML.Data/Transforms/NAFilter.cs +++ b/src/Microsoft.ML.Data/Transforms/NAFilter.cs @@ -26,15 +26,21 @@ namespace Microsoft.ML.Runtime.Data { + /// public sealed class NAFilter : FilterBase { + private static class Defaults + { + public const bool Complement = false; + } + public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "Column", ShortName = "col", SortOrder = 1)] public string[] Column; [Argument(ArgumentType.Multiple, HelpText = "If true, keep only rows that contain NA values, and filter the rest.")] - public bool Complement; + public bool Complement = Defaults.Complement; } private sealed class ColInfo @@ -72,6 +78,18 @@ private static VersionInfo GetVersionInfo() private readonly bool _complement; private const string RegistrationName = "MissingValueFilter"; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// If true, keep only rows that contain NA values, and filter the rest. + /// Name of the columns. Only these columns will be used to filter rows having 'NA' values. + public NAFilter(IHostEnvironment env, IDataView input, bool complement = Defaults.Complement, params string[] columns) + : this(env, new Arguments() { Column = columns, Complement = complement }, input) + { + } + public NAFilter(IHostEnvironment env, Arguments args, IDataView input) : base(env, RegistrationName, input) { diff --git a/src/Microsoft.ML.Transforms/NormalizeColumn.cs b/src/Microsoft.ML.Data/Transforms/NormalizeColumn.cs similarity index 88% rename from src/Microsoft.ML.Transforms/NormalizeColumn.cs rename to src/Microsoft.ML.Data/Transforms/NormalizeColumn.cs index a5769ec90a..a01b584a97 100644 --- a/src/Microsoft.ML.Transforms/NormalizeColumn.cs +++ b/src/Microsoft.ML.Data/Transforms/NormalizeColumn.cs @@ -135,12 +135,21 @@ public bool TryUnparse(StringBuilder sb) } } + private static class Defaults + { + public const bool FixZero = true; + public const bool MeanVarCdf = false; + public const bool LogMeanVarCdf = true; + public const int NumBins = 1024; + public const int MinBinSize = 10; + } + public abstract class FixZeroArgumentsBase : ArgumentsBase { // REVIEW: This only allows mapping either zero or min to zero. It might make sense to allow also max, midpoint and mean to be mapped to zero. // REVIEW: Convert this to bool? or even an enum{Auto, No, Yes}, and automatically map zero to zero when it is null/Auto. [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to map zero to zero, preserving sparsity", ShortName = "zero")] - public bool FixZero = true; + public bool FixZero = Defaults.FixZero; } public abstract class AffineArgumentsBase : FixZeroArgumentsBase @@ -158,13 +167,13 @@ public sealed class MinMaxArguments : AffineArgumentsBase public sealed class MeanVarArguments : AffineArgumentsBase { [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to use CDF as the output", ShortName = "cdf")] - public bool UseCdf; + public bool UseCdf = Defaults.MeanVarCdf; } public sealed class LogMeanVarArguments : ArgumentsBase { [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to use CDF as the output", ShortName = "cdf")] - public bool UseCdf = true; + public bool UseCdf = Defaults.LogMeanVarCdf; [Argument(ArgumentType.Multiple, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)] public LogNormalColumn[] Column; @@ -179,7 +188,7 @@ public abstract class BinArgumentsBase : FixZeroArgumentsBase [Argument(ArgumentType.AtMostOnce, HelpText = "Max number of bins, power of 2 recommended", ShortName = "bins")] [TGUI(Label = "Max number of bins")] - public int NumBins = 1024; + public int NumBins = Defaults.NumBins; public override OneToOneColumn[] GetColumns() => Column; } @@ -196,7 +205,7 @@ public sealed class SupervisedBinArguments : BinArgumentsBase public string LabelColumn; [Argument(ArgumentType.AtMostOnce, HelpText = "Minimum number of examples per bin")] - public int MinBinSize = 10; + public int MinBinSize = Defaults.MinBinSize; } public const string MinMaxNormalizerSummary = "Normalizes the data based on the observed minimum and maximum values of the data."; @@ -218,6 +227,26 @@ public sealed class SupervisedBinArguments : BinArgumentsBase public const string BinNormalizerShortName = "Bin"; public const string SupervisedBinNormalizerShortName = "SupBin"; + /// + /// A helper method to create MinMaxNormalizer transform for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + public static NormalizeTransform CreateMinMaxNormalizer(IHostEnvironment env, IDataView input, string name, string source = null) + { + var args = new MinMaxArguments() + { + Column = new[] { new AffineColumn(){ + Source = source ?? name, + Name = name + } + } + }; + return Create(env, args, input); + } + /// /// Public create method corresponding to SignatureDataTransform. /// @@ -234,6 +263,32 @@ public static NormalizeTransform Create(IHostEnvironment env, MinMaxArguments ar return func; } + /// + /// A helper method to create MeanVarNormalizer transform for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// /// Whether to use CDF as the output. + public static NormalizeTransform CreateMeanVarNormalizer(IHostEnvironment env, + IDataView input, + string name, + string source = null, + bool useCdf = Defaults.MeanVarCdf) + { + var args = new MeanVarArguments() + { + Column = new[] { new AffineColumn(){ + Source = source ?? name, + Name = name + } + }, + UseCdf = useCdf + }; + return Create(env, args, input); + } + /// /// Public create method corresponding to SignatureDataTransform. /// @@ -250,6 +305,32 @@ public static NormalizeTransform Create(IHostEnvironment env, MeanVarArguments a return func; } + /// + /// A helper method to create LogMeanVarNormalizer transform for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// /// Whether to use CDF as the output. + public static NormalizeTransform CreateLogMeanVarNormalizer(IHostEnvironment env, + IDataView input, + string name, + string source = null, + bool useCdf = Defaults.LogMeanVarCdf) + { + var args = new LogMeanVarArguments() + { + Column = new[] { new LogNormalColumn(){ + Source = source ?? name, + Name = name + } + }, + UseCdf = useCdf + }; + return Create(env, args, input); + } + /// /// Public create method corresponding to SignatureDataTransform. /// @@ -266,6 +347,24 @@ public static NormalizeTransform Create(IHostEnvironment env, LogMeanVarArgument return func; } + public static NormalizeTransform CreateBinningNormalizer(IHostEnvironment env, + IDataView input, + string name, + string source = null, + int numBins = Defaults.NumBins) + { + var args = new BinArguments() + { + Column = new[] { new BinColumn(){ + Source = source ?? name, + Name = name + } + }, + NumBins = numBins + }; + return Create(env, args, input); + } + /// /// Public create method corresponding to SignatureDataTransform. /// @@ -282,6 +381,28 @@ public static NormalizeTransform Create(IHostEnvironment env, BinArguments args, return func; } + public static NormalizeTransform CreateSupervisedBinningNormalizer(IHostEnvironment env, + IDataView input, + string labelColumn, + string name, + string source = null, + int numBins = Defaults.NumBins, + int minBinSize = Defaults.MinBinSize) + { + var args = new SupervisedBinArguments() + { + Column = new[] { new BinColumn(){ + Source = source ?? name, + Name = name + } + }, + LabelColumn = labelColumn, + NumBins = numBins, + MinBinSize = minBinSize + }; + return Create(env, args, input); + } + /// /// Public create method corresponding to SignatureDataTransform. /// @@ -313,8 +434,8 @@ private AffineColumnFunction(IHost host) public abstract void Save(ModelSaveContext ctx); public abstract JToken PfaInfo(BoundPfaContext ctx, JToken srcToken); - - public abstract bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount); + public bool CanSaveOnnx => true; + public abstract bool OnnxInfo(OnnxContext ctx, OnnxNode nodeProtoWrapper, int featureCount); public abstract Delegate GetGetter(IRow input, int icol); @@ -425,10 +546,10 @@ public JToken PfaInfo(BoundPfaContext ctx, JToken srcToken) return null; } - public bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount) - { - return false; - } + public bool CanSaveOnnx => false; + + public bool OnnxInfo(OnnxContext ctx, OnnxNode nodeProtoWrapper, int featureCount) + => throw Host.ExceptNotSupp(); public abstract Delegate GetGetter(IRow input, int icol); @@ -550,10 +671,10 @@ public JToken PfaInfo(BoundPfaContext ctx, JToken srcToken) return null; } - public bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount) - { - return false; - } + public bool CanSaveOnnx => false; + + public bool OnnxInfo(OnnxContext ctx, OnnxNode nodeProtoWrapper, int featureCount) + => throw Host.ExceptNotSupp(); public abstract Delegate GetGetter(IRow input, int icol); diff --git a/src/Microsoft.ML.Transforms/NormalizeColumnDbl.cs b/src/Microsoft.ML.Data/Transforms/NormalizeColumnDbl.cs similarity index 98% rename from src/Microsoft.ML.Transforms/NormalizeColumnDbl.cs rename to src/Microsoft.ML.Data/Transforms/NormalizeColumnDbl.cs index 41e55ee338..6cad82c127 100644 --- a/src/Microsoft.ML.Transforms/NormalizeColumnDbl.cs +++ b/src/Microsoft.ML.Data/Transforms/NormalizeColumnDbl.cs @@ -542,7 +542,7 @@ public ImplOne(IHost host, TFloat scale, TFloat offset) { } - public new static ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.RawType == typeof(TFloat), "The column type must be R8."); List nz = null; @@ -577,10 +577,10 @@ public override void Save(ModelSaveContext ctx) public override JToken PfaInfo(BoundPfaContext ctx, JToken srcToken) => PfaUtils.Call("*", PfaUtils.Call("-", srcToken, Offset), Scale); - public override bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount) + public override bool OnnxInfo(OnnxContext ctx, OnnxNode nodeProtoWrapper, int featureCount) { - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "offset", Enumerable.Repeat(Offset, featureCount)); - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "scale", Enumerable.Repeat(Scale, featureCount)); + nodeProtoWrapper.AddAttribute("offset", Enumerable.Repeat(Offset, featureCount)); + nodeProtoWrapper.AddAttribute("scale", Enumerable.Repeat(Scale, featureCount)); return true; } @@ -605,7 +605,7 @@ public ImplVec(IHost host, TFloat[] scale, TFloat[] offset, int[] indicesNonZero { } - public new static ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.ItemType.RawType == typeof(TFloat), "The column type must be vector of R8."); int cv = Math.Max(1, typeSrc.VectorSize); @@ -648,12 +648,12 @@ public override JToken PfaInfo(BoundPfaContext ctx, JToken srcToken) return PfaUtils.Call("a.zipmap", srcToken, scaleCell, PfaUtils.FuncRef(ctx.Pfa.EnsureMul(itemType))); } - public override bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount) + public override bool OnnxInfo(OnnxContext ctx, OnnxNode node, int featureCount) { - if (Offset != null) - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "offset", Offset); - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "scale", Scale); + if (Offset != null) + node.AddAttribute("offset", Offset); + node.AddAttribute("scale", Scale); return true; } @@ -867,7 +867,7 @@ public ImplOne(IHost host, TFloat mean, TFloat stddev, bool useLog) { } - public new static ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.RawType == typeof(TFloat), "The column type must be R8."); host.CheckValue(ctx, nameof(ctx)); @@ -932,7 +932,7 @@ public ImplVec(IHost host, TFloat[] mean, TFloat[] stddev, bool useLog) { } - public new static ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.ItemType.RawType == typeof(TFloat), "The column type must be vector of R8."); int cv = Math.Max(1, typeSrc.VectorSize); @@ -1051,7 +1051,7 @@ public ImplOne(IHost host, TFloat[] binUpperBounds, bool fixZero) Host.Assert(0 <= _offset & _offset <= 1); } - public new static ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.RawType == typeof(TFloat), "The column type must be R8."); host.CheckValue(ctx, nameof(ctx)); @@ -1133,7 +1133,7 @@ public ImplVec(IHost host, TFloat[][] binUpperBounds, bool fixZero) } } - public new static ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.ItemType.RawType == typeof(TFloat), "The column type must be vector of R8."); int cv = Math.Max(1, typeSrc.VectorSize); @@ -1280,7 +1280,7 @@ private static void ComputeScaleAndOffset(TFloat max, TFloat min, out TFloat sca // but infinities and NaN to NaN. // REVIEW: If min <= 0 and max >= 0, then why not fix zero for this slot and simply scale by 1 / max(abs(..))? // We could even be more aggressive about it, and fix zero if 0 < min < max <= 2 * min. - // Then the common case where features are in the range [1, N] (and integer valued) wouldn't subtract 1 every time.... + // Then the common case where features are in the range [1, N] (and integer valued) wouldn't subtract 1 every time.... if (!(max > min)) scale = offset = 0; else if ((scale = 1 / (max - min)) == 0) @@ -1302,7 +1302,7 @@ private static void ComputeScaleAndOffsetFixZero(TFloat max, TFloat min, out TFl // In the case where max <= min, the slot contains no useful information (since it is either constant, or // is all NaNs, or has no rows), so we force it to zero. // Note that setting scale to zero effectively maps finite values to zero, - // but infinities and NaN to NaN. + // but infinities and NaN to NaN. offset = 0; if (!(max > min)) scale = 0; @@ -1321,7 +1321,7 @@ public static void ComputeScaleAndOffset(Double mean, Double stddev, out TFloat // In the case where stdev==0, the slot contains no useful information (since it is constant), // so we force it to zero. Note that setting scale to zero effectively maps finite values to zero, - // but infinities and NaN to NaN. + // but infinities and NaN to NaN. if (stddev == 0) scale = offset = 0; else if ((scale = 1 / (TFloat)stddev) == 0) @@ -1338,7 +1338,7 @@ public static void ComputeScaleAndOffsetFixZero(Double mean, Double meanSquaredE // In the case where stdev==0, the slot contains no useful information (since it is constant), // so we force it to zero. Note that setting scale to zero effectively maps finite values to zero, - // but infinities and NaN to NaN. + // but infinities and NaN to NaN. offset = 0; if (meanSquaredError == 0) scale = 0; diff --git a/src/Microsoft.ML.Transforms/NormalizeColumnSng.cs b/src/Microsoft.ML.Data/Transforms/NormalizeColumnSng.cs similarity index 98% rename from src/Microsoft.ML.Transforms/NormalizeColumnSng.cs rename to src/Microsoft.ML.Data/Transforms/NormalizeColumnSng.cs index ef5eef8551..af94f31454 100644 --- a/src/Microsoft.ML.Transforms/NormalizeColumnSng.cs +++ b/src/Microsoft.ML.Data/Transforms/NormalizeColumnSng.cs @@ -542,7 +542,7 @@ public ImplOne(IHost host, TFloat scale, TFloat offset) { } - public new static ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.RawType == typeof(TFloat), "The column type must be R4."); List nz = null; @@ -577,10 +577,10 @@ public override void Save(ModelSaveContext ctx) public override JToken PfaInfo(BoundPfaContext ctx, JToken srcToken) => PfaUtils.Call("*", PfaUtils.Call("-", srcToken, Offset), Scale); - public override bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount) + public override bool OnnxInfo(OnnxContext ctx, OnnxNode node, int featureCount) { - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "offset", Enumerable.Repeat(Offset, featureCount)); - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "scale", Enumerable.Repeat(Scale, featureCount)); + node.AddAttribute("offset", Enumerable.Repeat(Offset, featureCount)); + node.AddAttribute("scale", Enumerable.Repeat(Scale, featureCount)); return true; } @@ -605,7 +605,7 @@ public ImplVec(IHost host, TFloat[] scale, TFloat[] offset, int[] indicesNonZero { } - public new static ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.ItemType.RawType == typeof(TFloat), "The column type must be vector of R4."); int cv = Math.Max(1, typeSrc.VectorSize); @@ -648,14 +648,14 @@ public override JToken PfaInfo(BoundPfaContext ctx, JToken srcToken) return PfaUtils.Call("a.zipmap", srcToken, scaleCell, PfaUtils.FuncRef(ctx.Pfa.EnsureMul(itemType))); } - public override bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount) + public override bool OnnxInfo(OnnxContext ctx, OnnxNode node, int featureCount) { if (Offset != null) - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "offset", Offset); + node.AddAttribute("offset", Offset); else - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "offset", Enumerable.Repeat(0, featureCount)); + node.AddAttribute("offset", Enumerable.Repeat(0, featureCount)); - OnnxUtils.NodeAddAttributes(nodeProtoWrapper.Node, "scale", Scale); + node.AddAttribute("scale", Scale); return true; } @@ -869,7 +869,7 @@ public ImplOne(IHost host, TFloat mean, TFloat stddev, bool useLog) { } - public new static ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.RawType == typeof(TFloat), "The column type must be R4."); host.CheckValue(ctx, nameof(ctx)); @@ -934,7 +934,7 @@ public ImplVec(IHost host, TFloat[] mean, TFloat[] stddev, bool useLog) { } - public new static ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.ItemType.RawType == typeof(TFloat), "The column type must be vector of R4."); int cv = Math.Max(1, typeSrc.VectorSize); @@ -1053,7 +1053,7 @@ public ImplOne(IHost host, TFloat[] binUpperBounds, bool fixZero) Host.Assert(0 <= _offset & _offset <= 1); } - public new static ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplOne Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.RawType == typeof(TFloat), "The column type must be R4."); host.CheckValue(ctx, nameof(ctx)); @@ -1135,7 +1135,7 @@ public ImplVec(IHost host, TFloat[][] binUpperBounds, bool fixZero) } } - public new static ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) + public static new ImplVec Create(ModelLoadContext ctx, IHost host, ColumnType typeSrc) { host.Check(typeSrc.ItemType.RawType == typeof(TFloat), "The column type must be vector of R4."); int cv = Math.Max(1, typeSrc.VectorSize); @@ -1282,7 +1282,7 @@ private static void ComputeScaleAndOffset(TFloat max, TFloat min, out TFloat sca // but infinities and NaN to NaN. // REVIEW: If min <= 0 and max >= 0, then why not fix zero for this slot and simply scale by 1 / max(abs(..))? // We could even be more aggressive about it, and fix zero if 0 < min < max <= 2 * min. - // Then the common case where features are in the range [1, N] (and integer valued) wouldn't subtract 1 every time.... + // Then the common case where features are in the range [1, N] (and integer valued) wouldn't subtract 1 every time.... if (!(max > min)) scale = offset = 0; else if ((scale = 1 / (max - min)) == 0) @@ -1304,7 +1304,7 @@ private static void ComputeScaleAndOffsetFixZero(TFloat max, TFloat min, out TFl // In the case where max <= min, the slot contains no useful information (since it is either constant, or // is all NaNs, or has no rows), so we force it to zero. // Note that setting scale to zero effectively maps finite values to zero, - // but infinities and NaN to NaN. + // but infinities and NaN to NaN. offset = 0; if (!(max > min)) scale = 0; @@ -1323,7 +1323,7 @@ public static void ComputeScaleAndOffset(Double mean, Double stddev, out TFloat // In the case where stdev==0, the slot contains no useful information (since it is constant), // so we force it to zero. Note that setting scale to zero effectively maps finite values to zero, - // but infinities and NaN to NaN. + // but infinities and NaN to NaN. if (stddev == 0) scale = offset = 0; else if ((scale = 1 / (TFloat)stddev) == 0) @@ -1340,7 +1340,7 @@ public static void ComputeScaleAndOffsetFixZero(Double mean, Double meanSquaredE // In the case where stdev==0, the slot contains no useful information (since it is constant), // so we force it to zero. Note that setting scale to zero effectively maps finite values to zero, - // but infinities and NaN to NaN. + // but infinities and NaN to NaN. offset = 0; if (meanSquaredError == 0) scale = 0; diff --git a/src/Microsoft.ML.Transforms/NormalizeTransform.cs b/src/Microsoft.ML.Data/Transforms/NormalizeTransform.cs similarity index 84% rename from src/Microsoft.ML.Transforms/NormalizeTransform.cs rename to src/Microsoft.ML.Data/Transforms/NormalizeTransform.cs index e5602918b6..bf9d77ed49 100644 --- a/src/Microsoft.ML.Transforms/NormalizeTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/NormalizeTransform.cs @@ -66,7 +66,9 @@ public interface IColumnFunction : ICanSaveModel JToken PfaInfo(BoundPfaContext ctx, JToken srcToken); - bool OnnxInfo(OnnxContext ctx, OnnxUtils.NodeProtoWrapper nodeProtoWrapper, int featureCount); + bool CanSaveOnnx { get; } + + bool OnnxInfo(OnnxContext ctx, OnnxNode nodeProtoWrapper, int featureCount); } public sealed partial class NormalizeTransform : OneToOneTransformBase @@ -168,7 +170,7 @@ private NormalizeTransform(IHost host, ArgumentsBase args, IDataView input, while (cursor.MoveNext()) { // If the row has bad values, the good values are still being used for training. - // The comparisons in the code below are arranged so that NaNs in the input are not recorded. + // The comparisons in the code below are arranged so that NaNs in the input are not recorded. // REVIEW: Should infinities and/or NaNs be filtered before the normalization? Should we not record infinities for min/max? // Currently, infinities are recorded and will result in zero scale which in turn will result in NaN output for infinity input. bool any = false; @@ -197,6 +199,33 @@ private NormalizeTransform(IHost host, ArgumentsBase args, IDataView input, SetMetadata(); } + /// + /// Potentially apply a min-max normalizer to the data's feature column, keeping all existing role + /// mappings except for the feature role mapping. + /// + /// The host environment to use to potentially instantiate the transform + /// The role-mapped data that is potentially going to be modified by this method. + /// The trainer to query as to whether it wants normalization. If the + /// 's is true + /// True if the normalizer was applied and was modified + public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(data, nameof(data)); + env.CheckValue(trainer, nameof(trainer)); + + // If the trainer does not need normalization, or if the features either don't exist + // or are not normalized, return false. + if (!trainer.Info.NeedNormalization || data.Schema.FeaturesAreNormalized() != false) + return false; + var featInfo = data.Schema.Feature; + env.AssertValue(featInfo); // Should be defined, if FeaturesAreNormalized returned a definite value. + + var view = CreateMinMaxNormalizer(env, data.Data, name: featInfo.Name); + data = new RoleMappedData(view, data.Schema.GetColumnRoleNames()); + return true; + } + private NormalizeTransform(IHost host, ModelLoadContext ctx, IDataView input) : base(host, ctx, input, null) { @@ -212,7 +241,7 @@ private NormalizeTransform(IHost host, ModelLoadContext ctx, IDataView input) for (int iinfo = 0; iinfo < Infos.Length; iinfo++) { var typeSrc = Infos[iinfo].TypeSrc; - // REVIEW: this check (was even an assert) here is too late. Apparently, no-one tests compatibility + // REVIEW: this check (was even an assert) here is too late. Apparently, no-one tests compatibility // of the types at deserialization (aka re-application), which is a bug. if (typeSrc.ValueCount == 0) throw Host.Except("Column '{0}' is a vector of variable size, which is not supported for normalizers", Infos[iinfo].Name); @@ -286,11 +315,11 @@ protected override bool SaveAsOnnxCore(OnnxContext ctx, int iinfo, ColInfo info, if (info.TypeSrc.ValueCount == 0) return false; - string opType = "Scaler"; - var node = OnnxUtils.MakeNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); - if (_functions[iinfo].OnnxInfo(ctx, new OnnxUtils.NodeProtoWrapper(node), info.TypeSrc.ValueCount)) + if (_functions[iinfo].CanSaveOnnx) { - ctx.AddNode(node); + string opType = "Scaler"; + var node = ctx.CreateNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); + _functions[iinfo].OnnxInfo(ctx, node, info.TypeSrc.ValueCount); return true; } @@ -329,6 +358,30 @@ protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, ou } } + public static class NormalizeUtils + { + /// + /// Returns whether the feature column in the schema is indicated to be normalized. If the features column is not + /// specified on the schema, then this will return null. + /// + /// The role-mapped schema to query + /// Returns null if does not have + /// defined, and otherwise returns a Boolean value as returned from + /// on that feature column + /// + public static bool? FeaturesAreNormalized(this RoleMappedSchema schema) + { + // REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is + // useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization. + Contracts.CheckValue(schema, nameof(schema)); + var featInfo = schema.Feature; + return featInfo == null ? default(bool?) : schema.Schema.IsNormalized(featInfo.Index); + } + } + + /// + /// This contains entry-point definitions related to . + /// public static class Normalize { [TlcModule.EntryPoint(Name = "Transforms.MinMaxNormalizer", Desc = NormalizeTransform.MinMaxNormalizerSummary, UserName = NormalizeTransform.MinMaxNormalizerUserName, ShortName = NormalizeTransform.MinMaxNormalizerShortName)] @@ -402,14 +455,10 @@ public static CommonOutputs.TransformOutput SupervisedBin(IHostEnvironment env, var columnsToNormalize = new List(); foreach (var column in input.Column) { - int col; - if (!schema.TryGetColumnIndex(column.Source, out col)) + if (!schema.TryGetColumnIndex(column.Source, out int col)) throw env.ExceptUserArg(nameof(input.Column), $"Column '{column.Source}' does not exist."); - if (!schema.TryGetMetadata(BoolType.Instance, MetadataUtils.Kinds.IsNormalized, col, ref isNormalized) || - isNormalized.IsFalse) - { + if (!schema.IsNormalized(col)) columnsToNormalize.Add(column); - } } var entryPoints = new List(); diff --git a/src/Microsoft.ML.Data/Transforms/PerGroupTransformBase.cs b/src/Microsoft.ML.Data/Transforms/PerGroupTransformBase.cs index 35f37d39a8..7b42008b15 100644 --- a/src/Microsoft.ML.Data/Transforms/PerGroupTransformBase.cs +++ b/src/Microsoft.ML.Data/Transforms/PerGroupTransformBase.cs @@ -308,7 +308,7 @@ protected override bool MoveNextCore() if (!_newGroupInInputCursorDel()) return true; - // If this is the first step, we need to move next on _groupCursor. Otherwise, the position of _groupCursor is + // If this is the first step, we need to move next on _groupCursor. Otherwise, the position of _groupCursor is // at the start of the next group. if (_groupCursor.State == CursorState.NotStarted) { diff --git a/src/Microsoft.ML.Data/Transforms/RangeFilter.cs b/src/Microsoft.ML.Data/Transforms/RangeFilter.cs index b9ab10f4c1..142779dee2 100644 --- a/src/Microsoft.ML.Data/Transforms/RangeFilter.cs +++ b/src/Microsoft.ML.Data/Transforms/RangeFilter.cs @@ -77,6 +77,19 @@ private static VersionInfo GetVersionInfo() private readonly bool _includeMin; private readonly bool _includeMax; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the input column. + /// Minimum value (0 to 1 for key types). + /// Maximum value (0 to 1 for key types). + public RangeFilter(IHostEnvironment env, IDataView input, string column, Double? minimum = null, Double? maximum = null) + : this(env, new Arguments() { Column = column, Min = minimum, Max = maximum }, input) + { + } + public RangeFilter(IHostEnvironment env, Arguments args, IDataView input) : base(env, RegistrationName, input) { @@ -171,9 +184,9 @@ public override void Save(ModelSaveContext ctx) // int: id of column name // double: min // double: max - // byte: complement - // byte: includeMin - // byte: includeMax + // byte: complement + // byte: includeMin + // byte: includeMax ctx.Writer.Write(sizeof(Float)); ctx.SaveNonEmptyString(Source.Schema.GetColumnName(_index)); Host.Assert(_min < _max); diff --git a/src/Microsoft.ML.Data/Transforms/ShuffleTransform.cs b/src/Microsoft.ML.Data/Transforms/ShuffleTransform.cs index 37e52ee2da..3940bbe979 100644 --- a/src/Microsoft.ML.Data/Transforms/ShuffleTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/ShuffleTransform.cs @@ -33,18 +33,25 @@ namespace Microsoft.ML.Runtime.Data /// public sealed class ShuffleTransform : RowToRowTransformBase { + private static class Defaults + { + public const int PoolRows = 1000; + public const bool PoolOnly = false; + public const bool ForceShuffle = false; + } + public sealed class Arguments { // REVIEW: A more intelligent heuristic, based on the expected size of the inputs, perhaps? [Argument(ArgumentType.LastOccurenceWins, HelpText = "The pool will have this many rows", ShortName = "rows")] - public int PoolRows = 1000; + public int PoolRows = Defaults.PoolRows; // REVIEW: Come up with a better way to specify the desired set of functionality. [Argument(ArgumentType.LastOccurenceWins, HelpText = "If true, the transform will not attempt to shuffle the input cursor but only shuffle based on the pool. This parameter has no effect if the input data was not itself shufflable.", ShortName = "po")] - public bool PoolOnly; + public bool PoolOnly = Defaults.PoolOnly; [Argument(ArgumentType.LastOccurenceWins, HelpText = "If true, the transform will always provide a shuffled view.", ShortName = "force")] - public bool ForceShuffle; + public bool ForceShuffle = Defaults.ForceShuffle; [Argument(ArgumentType.LastOccurenceWins, HelpText = "If true, the transform will always shuffle the input. The default value is the same as forceShuffle.", ShortName = "forceSource")] public bool? ForceShuffleSource; @@ -79,6 +86,23 @@ private static VersionInfo GetVersionInfo() // know how to copy other types of values. private readonly IDataView _subsetInput; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// The pool will have this many rows + /// If true, the transform will not attempt to shuffle the input cursor but only shuffle based on the pool. This parameter has no effect if the input data was not itself shufflable. + /// If true, the transform will always provide a shuffled view. + public ShuffleTransform(IHostEnvironment env, + IDataView input, + int poolRows = Defaults.PoolRows, + bool poolOnly = Defaults.PoolOnly, + bool forceShuffle = Defaults.ForceShuffle) + : this(env, new Arguments() { PoolRows = poolRows, PoolOnly = poolOnly, ForceShuffle = forceShuffle }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -236,7 +260,7 @@ protected override IRowCursor GetRowCursorCore(Func predicate, IRando // The desired functionality is to support some permutations of whether we allow // shuffling at the source level, or not. - // + // // Pool | Source | Options // -----------+----------+-------- // Randonly | Never | poolOnly+ @@ -277,14 +301,14 @@ public override IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolid /// over a pool of size P. Logically, externally, the cursor acts as if you have this pool /// P and whenever you randomly sample and yield a row from it, that row is then discarded /// and replaced with the next row from the input source cursor. - /// + /// /// It would also be possible to implement in a way that cleaves closely to this logical /// interpretation, but this would be inefficient. We instead have a buffer of larger size /// P+B. A consumer (running presumably in the main thread) sampling and fetching items and a /// producer (running in a task, which may be running in a different thread) filling the buffer /// with items to sample, utilizing this extra space to enable an efficient possibly /// multithreaded scheme. - /// + /// /// The consumer, for its part, at any given time "owns" a contiguous portion of this buffer. /// (A contiguous portion of this buffer we consider to be able to wrap around, from the end /// to the beginning. The buffer is accessed in a "circular" fashion.) Consider that this portion @@ -295,18 +319,18 @@ public override IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolid /// rows ready to be sampled in future iterations, but that we are not sampling yet (in order /// to behave equivalently to the simple logical model of at any given time sampling P items). /// The producer owns the complement of the portion owned by the consumer. - /// + /// /// As the cursor progresses, the producer fills in successive items in its portion of the /// buffer it owns, and passes them off to the consumer (not one item at a time, but rather in /// batches, to keep down the amount of intertask communication). The consumer in addition to /// taking ownership of these items, will also periodically pass dead items back to the producer /// (again, not one dead item at a time, but in batches when the number of dead items reaches /// a certain threshold). - /// + /// /// This communication is accomplished using a pair of BufferBlock instances, through which /// the producer and consumer are notified how many additional items they can take ownership /// of. - /// + /// /// As the consumer "selects" a row from the pool of selectable rows each time it moves to /// the next row, this randomly selected row is considered to be the "first" index, since this /// makes its subsequent transition to being a dead row much simpler. It would be inefficient to @@ -314,7 +338,7 @@ public override IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolid /// first, of course, so one rather swaps an index, so that these nicely behavior contiguous /// circular indices, get mapped in an index within the buffers, through a permutation maintained /// in the pipeIndices array. - /// + /// /// The result is something functionally equivalent to but but considerably faster than the /// simple implementation described in the first paragraph. /// diff --git a/src/Microsoft.ML.Data/Transforms/SkipTakeFilter.cs b/src/Microsoft.ML.Data/Transforms/SkipTakeFilter.cs index 278f3ee418..2adb17258e 100644 --- a/src/Microsoft.ML.Data/Transforms/SkipTakeFilter.cs +++ b/src/Microsoft.ML.Data/Transforms/SkipTakeFilter.cs @@ -60,13 +60,13 @@ public sealed class Arguments : TransformInputBase public sealed class TakeArguments : TransformInputBase { [Argument(ArgumentType.Required, HelpText = Arguments.TakeHelp, ShortName = "c,n,t", SortOrder = 1)] - public long Count = long.MaxValue; + public long Count = Arguments.DefaultTake; } public sealed class SkipArguments : TransformInputBase { [Argument(ArgumentType.Required, HelpText = Arguments.SkipHelp, ShortName = "c,n,s", SortOrder = 1)] - public long Count = 0; + public long Count = Arguments.DefaultSkip; } private static VersionInfo GetVersionInfo() @@ -164,7 +164,7 @@ public override void Save(ModelSaveContext ctx) public override bool CanShuffle { get { return false; } } /// - /// Returns the computed count of rows remaining after skip and take operation. + /// Returns the computed count of rows remaining after skip and take operation. /// Returns null if count is unknown. /// public override long? GetRowCount(bool lazy = true) @@ -270,4 +270,30 @@ protected override bool MoveManyCore(long count) } } } + + public static class SkipFilter + { + /// + /// A helper method to create transform for skipping the number of rows defined by the parameter. + /// when created with behaves as 'SkipFilter'. + /// + /// Host Environment. + /// >Input . This is the output from previous transform or loader. + /// Number of rows to skip + public static IDataTransform Create(IHostEnvironment env, IDataView input, long count = SkipTakeFilter.Arguments.DefaultSkip) + => SkipTakeFilter.Create(env, new SkipTakeFilter.SkipArguments() { Count = count }, input); + } + + public static class TakeFilter + { + /// + /// A helper method to create transform by taking the top rows defined by the parameter. + /// when created with behaves as 'TakeFilter'. + /// + /// Host Environment. + /// >Input . This is the output from previous transform or loader. + /// Number of rows to take + public static IDataTransform Create(IHostEnvironment env, IDataView input, long count = SkipTakeFilter.Arguments.DefaultTake) + => SkipTakeFilter.Create(env, new SkipTakeFilter.TakeArguments() { Count = count }, input); + } } \ No newline at end of file diff --git a/src/Microsoft.ML.Data/Transforms/TermTransform.cs b/src/Microsoft.ML.Data/Transforms/TermTransform.cs index da7442f90e..6eaf48e995 100644 --- a/src/Microsoft.ML.Data/Transforms/TermTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/TermTransform.cs @@ -29,14 +29,14 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// TermTransform builds up term vocabularies (dictionaries). - /// Notes: - /// * Each column builds/uses exactly one "vocabulary" (dictionary). - /// * Output columns are KeyType-valued. - /// * The Key value is the one-based index of the item in the dictionary. - /// * Not found is assigned the value zero. - /// + + // TermTransform builds up term vocabularies (dictionaries). + // Notes: + // * Each column builds/uses exactly one "vocabulary" (dictionary). + // * Output columns are KeyType-valued. + // * The Key value is the one-based index of the item in the dictionary. + // * Not found is assigned the value zero. + /// public sealed partial class TermTransform : OneToOneTransformBase, ITransformTemplate { public abstract class ColumnBase : OneToOneColumn @@ -97,10 +97,16 @@ public enum SortOrder : byte // other things, like case insensitive (where appropriate), culturally aware, etc.? } + private static class Defaults + { + public const int MaxNumTerms = 1000000; + public const SortOrder Sort = SortOrder.Occurrence; + } + public abstract class ArgumentsBase : TransformInputBase { [Argument(ArgumentType.AtMostOnce, HelpText = "Maximum number of terms to keep per column when auto-training", ShortName = "max", SortOrder = 5)] - public int MaxNumTerms = 1000000; + public int MaxNumTerms = Defaults.MaxNumTerms; [Argument(ArgumentType.AtMostOnce, HelpText = "Comma separated list of terms", SortOrder = 105, Visibility = ArgumentAttribute.VisibilityType.CmdLineOnly)] public string Terms; @@ -124,7 +130,7 @@ public abstract class ArgumentsBase : TransformInputBase // REVIEW: Should we always sort? Opinions are mixed. See work item 7797429. [Argument(ArgumentType.AtMostOnce, HelpText = "How items should be ordered when vectorized. By default, they will be in the order encountered. " + "If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", SortOrder = 113)] - public SortOrder Sort = SortOrder.Occurrence; + public SortOrder Sort = Defaults.Sort; // REVIEW: Should we do this here, or correct the various pieces of code here and in MRS etc. that // assume key-values will be string? Once we correct these things perhaps we can see about removing it. @@ -196,6 +202,26 @@ private CodecFactory CodecFactory public override bool CanSavePfa => true; public override bool CanSaveOnnx => true; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// Maximum number of terms to keep per column when auto-training. + /// How items should be ordered when vectorized. By default, they will be in the order encountered. + /// If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). + public TermTransform(IHostEnvironment env, + IDataView input, + string name, + string source = null, + int maxNumTerms = Defaults.MaxNumTerms, + SortOrder sort = Defaults.Sort) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, MaxNumTerms = maxNumTerms, Sort = sort }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -586,10 +612,10 @@ private TermTransform(IHost host, ModelLoadContext ctx, IDataView input) termMap[i] = TermMap.TextImpl.Create(c, host); } }); -#pragma warning disable TLC_NoMessagesForLoadContext // Vaguely useful. +#pragma warning disable MSML_NoMessagesForLoadContext // Vaguely useful. if (!b) throw Host.ExceptDecode("Missing {0} model", dir); -#pragma warning restore TLC_NoMessagesForLoadContext +#pragma warning restore MSML_NoMessagesForLoadContext _termMap = new BoundTermMap[cinfo]; for (int i = 0; i < cinfo; ++i) _termMap[i] = termMap[i].Bind(this, i); @@ -690,11 +716,13 @@ protected override bool SaveAsOnnxCore(OnnxContext ctx, int iinfo, ColInfo info, TermMap map = (TermMap)_termMap[iinfo].Map; map.GetTerms(ref terms); string opType = "LabelEncoder"; - var node = OnnxUtils.MakeNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); - OnnxUtils.NodeAddAttributes(node, "classes_strings", terms.DenseValues()); - OnnxUtils.NodeAddAttributes(node, "default_int64", -1); - OnnxUtils.NodeAddAttributes(node, "default_string", DvText.Empty); - ctx.AddNode(node); + var node = ctx.CreateNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); + node.AddAttribute("classes_strings", terms.DenseValues()); + node.AddAttribute("default_int64", -1); + //default_string needs to be an empty string but there is a BUG in Lotus that + //throws a validation error when default_string is empty. As a work around, set + //default_string to a space. + node.AddAttribute("default_string", " "); return true; } diff --git a/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs b/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs index a81575b9c9..9a43dc5517 100644 --- a/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs +++ b/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs @@ -447,10 +447,10 @@ private enum MapType : byte /// type. The input type, whatever it is, must have as its input item /// type, and will produce either , or a vector type with that output /// type if the input was a vector. - /// + /// /// Note that instances of this class can be shared among multiple /// instances. To associate this with a particular transform, use the method. - /// + /// /// These are the immutable and serializable analogs to the used in /// training. /// diff --git a/src/Microsoft.ML.Data/Transforms/TrainAndScoreTransform.cs b/src/Microsoft.ML.Data/Transforms/TrainAndScoreTransform.cs index bdf1a36d41..bba2f58256 100644 --- a/src/Microsoft.ML.Data/Transforms/TrainAndScoreTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/TrainAndScoreTransform.cs @@ -181,7 +181,7 @@ private static RoleMappedData CreateDataFromArgs(IExceptionContext var name = TrainUtils.MatchNameOrDefaultOrNull(ectx, schema, nameof(args.NameColumn), args.NameColumn, DefaultColumnNames.Name); var customCols = TrainUtils.CheckAndGenerateCustomColumns(ectx, args.CustomColumn); - return TrainUtils.CreateExamples(input, label, feat, group, weight, name, customCols); + return new RoleMappedData(input, label, feat, group, weight, name, customCols); } } } diff --git a/src/Microsoft.ML.Data/Transforms/TransformBase.cs b/src/Microsoft.ML.Data/Transforms/TransformBase.cs index 263a3cf4ca..2d9cedb17b 100644 --- a/src/Microsoft.ML.Data/Transforms/TransformBase.cs +++ b/src/Microsoft.ML.Data/Transforms/TransformBase.cs @@ -596,7 +596,7 @@ public void SaveAsOnnx(OnnxContext ctx) /// /// Called by . Should be implemented by subclasses that return - /// true from . Will be called + /// true from . Will be called /// /// The context. Can be used to declare cells, access other information, /// and whatnot. This method should not actually, however, declare the variable corresponding diff --git a/src/Microsoft.ML.Data/Transforms/doc.xml b/src/Microsoft.ML.Data/Transforms/doc.xml new file mode 100644 index 0000000000..13f108a107 --- /dev/null +++ b/src/Microsoft.ML.Data/Transforms/doc.xml @@ -0,0 +1,100 @@ + + + + + + Removes missing values from vector type columns. + + + This transform removes the entire row if any of the input columns have a missing value in that row. + This preprocessing is required for many ML algorithms that cannot work with missing values. + Useful if any missing entry invalidates the entire row. + If the is set to true, this transform would do the exact opposite, + it will keep only the rows that have missing values. + + + + + + + pipeline.Add(new MissingValuesRowDropper("Column1")); + + + + + + + Converts input values (words, numbers, etc.) to index in a dictionary. + + + The TextToKeyConverter transform builds up term vocabularies (dictionaries). + The TextToKeyConverter and the are the two one primary mechanisms by which raw input is transformed into keys. + If multiple columns are used, each column builds/uses exactly one vocabulary. + The output columns are KeyType-valued. + The Key value is the one-based index of the item in the dictionary. + If the key is not found in the dictionary, it is assigned the missing value indicator. + This dictionary mapping values to keys is most commonly learnt from the unique values in input data, + but can be defined through other means: either with the mapping defined directly on the command line, or as loaded from an external file. + + + + + + + + pipeline.Add(new TextToKeyConverter(("Column", "OutColumn")) + { + Sort = TermTransformSortOrder.Occurrence + }); + + + + + + + Handle missing values by replacing them with either the default value or the indicated value. + + + This transform handles missing values in the input columns. For each input column, it creates an output column + where the missing values are replaced by one of these specified values: + + + The default value of the appropriate type. + + + The mean value of the appropriate type. + + + The max value of the appropriate type. + + + The min value of the appropriate type. + + + The last three work only for numeric/TimeSpan/DateTime kind columns. + + The output column can also optionally include an indicator vector for which slots were missing in the input column. + This can be done only when the indicator vector type can be converted to the input column type, i.e. only for numeric columns. + + + When computing the mean/max/min value, there is also an option to compute it over the whole column instead of per slot. + This option has a default value of true for variable length vectors, and false for known length vectors. + It can be changed to true for known length vectors, but it results in an error if changed to false for variable length vectors. + + + + + + + + + pipeline.Add(new MissingValueHandler("FeatureCol", "CleanFeatureCol") + { + ReplaceWith = NAHandleTransformReplacementKind.Mean + }); + + + + + + diff --git a/src/Microsoft.ML.Data/Utilities/ApplyTransformUtils.cs b/src/Microsoft.ML.Data/Utilities/ApplyTransformUtils.cs index e0a138fc91..7d0695083b 100644 --- a/src/Microsoft.ML.Data/Utilities/ApplyTransformUtils.cs +++ b/src/Microsoft.ML.Data/Utilities/ApplyTransformUtils.cs @@ -73,7 +73,7 @@ public static IDataView ApplyAllTransformsToData(IHostEnvironment env, IDataView // Backtrack the chain until we reach a chain start or a non-transform. // REVIEW: we 'unwrap' the composite data loader here and step through its pipeline. - // It's probably more robust to make CompositeDataLoader not even be an IDataView, this + // It's probably more robust to make CompositeDataLoader not even be an IDataView, this // would force the user to do the right thing and unwrap on his end. var cdl = chain as CompositeDataLoader; if (cdl != null) diff --git a/src/Microsoft.ML.Data/Utilities/ModelFileUtils.cs b/src/Microsoft.ML.Data/Utilities/ModelFileUtils.cs index 3e39a0008a..5b99b173fa 100644 --- a/src/Microsoft.ML.Data/Utilities/ModelFileUtils.cs +++ b/src/Microsoft.ML.Data/Utilities/ModelFileUtils.cs @@ -79,7 +79,7 @@ public static IDataView LoadPipeline(IHostEnvironment env, RepositoryReader rep, } /// - /// Loads all transforms from the model stream, applies them sequentially to the provided data, and returns + /// Loads all transforms from the model stream, applies them sequentially to the provided data, and returns /// the resulting data. If there are no transforms in the stream, or if there's no DataLoader stream at all /// (this can happen if the model is produced by old TL), returns the source data. /// If the DataLoader stream is invalid, throws. @@ -101,7 +101,7 @@ public static IDataView LoadTransforms(IHostEnvironment env, IDataView data, Str } /// - /// Loads all transforms from the model stream, applies them sequentially to the provided data, and returns + /// Loads all transforms from the model stream, applies them sequentially to the provided data, and returns /// the resulting data. If there are no transforms in the stream, or if there's no DataLoader stream at all /// (this can happen if the model is produced by old TL), returns the source data. /// If the DataLoader stream is invalid, throws. @@ -157,8 +157,8 @@ public static ModelSaveContext GetDataModelSavingContext(RepositoryWriter rep) } /// - /// Loads data view (loader and transforms) from if is set to true, - /// otherwise loads loader only. + /// Loads data view (loader and transforms) from if is set to true, + /// otherwise loads loader only. /// public static IDataLoader LoadLoader(IHostEnvironment env, RepositoryReader rep, IMultiStreamSource files, bool loadTransforms) { @@ -188,7 +188,7 @@ public static IDataLoader LoadLoader(IHostEnvironment env, RepositoryReader rep, } /// - /// REVIEW: consider adding an overload that returns + /// REVIEW: consider adding an overload that returns /// Loads optionally feature names from the repository directory. /// Returns false iff no stream was found for feature names, iff result is set to null. /// @@ -338,11 +338,11 @@ public static RoleMappedSchema LoadRoleMappedSchemaOrNull(IHostEnvironment env, if (roleMappings == null) return null; var pipe = ModelFileUtils.LoadLoader(h, rep, new MultiFileSource(null), loadTransforms: true); - return RoleMappedSchema.Create(pipe.Schema, roleMappings); + return new RoleMappedSchema(pipe.Schema, roleMappings); } /// - /// The RepositoryStreamWrapper is a IMultiStreamSource wrapper of a Stream object in a repository. + /// The RepositoryStreamWrapper is a IMultiStreamSource wrapper of a Stream object in a repository. /// It is used to deserialize RoleMappings.txt from a model zip file. /// private sealed class RepositoryStreamWrapper : IMultiStreamSource @@ -382,7 +382,7 @@ public Stream Open(int index) public TextReader OpenTextReader(int index) { return new StreamReader(Open(index)); } /// - /// A custom entry stream wrapper that includes custom dispose logic for disposing the entry + /// A custom entry stream wrapper that includes custom dispose logic for disposing the entry /// when the stream is disposed. /// private sealed class EntryStream : Stream diff --git a/src/Microsoft.ML.Data/Utilities/SlotDropper.cs b/src/Microsoft.ML.Data/Utilities/SlotDropper.cs index cd74463291..64b510a655 100644 --- a/src/Microsoft.ML.Data/Utilities/SlotDropper.cs +++ b/src/Microsoft.ML.Data/Utilities/SlotDropper.cs @@ -91,7 +91,7 @@ public ValueGetter> SubsetGetter(ValueGetter> getter) } /// - /// Drops slots from src and populates the dst with the resulting vector. Slots are + /// Drops slots from src and populates the dst with the resulting vector. Slots are /// dropped based on min and max slots that were passed at the constructor. /// public void DropSlots(ref VBuffer src, ref VBuffer dst) diff --git a/src/Microsoft.ML.Data/Utils/IntSequencePool.cs b/src/Microsoft.ML.Data/Utils/IntSequencePool.cs index 3efb038e6e..e27b297025 100644 --- a/src/Microsoft.ML.Data/Utils/IntSequencePool.cs +++ b/src/Microsoft.ML.Data/Utils/IntSequencePool.cs @@ -173,7 +173,7 @@ private int GetCore(uint[] sequence, int min, int lim, out uint hash) Contracts.Assert(ibCur <= ibLim); if (i >= lim) { - // Need to make sure that we have reached the end of the sequence in the pool at the + // Need to make sure that we have reached the end of the sequence in the pool at the // same time that we reached the end of sequence. if (ibCur == ibLim) return idCur; diff --git a/src/Microsoft.ML.Data/Utils/LossFunctions.cs b/src/Microsoft.ML.Data/Utils/LossFunctions.cs index 7ff47a4f9e..7df431c3d1 100644 --- a/src/Microsoft.ML.Data/Utils/LossFunctions.cs +++ b/src/Microsoft.ML.Data/Utils/LossFunctions.cs @@ -124,9 +124,9 @@ public Float ComputeDualUpdateInvariant(Float scaledFeaturesNormSquared) return 1 / Math.Max(1, (Float)0.25 + scaledFeaturesNormSquared); } - // REVIEW: this dual update uses a different log loss formulation, + // REVIEW: this dual update uses a different log loss formulation, //although the two are equivalents if the labels are restricted to 0 and 1 - //Need to update so that it can handle probability label and true to the + //Need to update so that it can handle probability label and true to the //definition, which is a smooth loss function public Float DualUpdate(Float output, Float label, Float dual, Float invariant, int maxNumThreads) { diff --git a/src/Microsoft.ML.Ensemble/Batch.cs b/src/Microsoft.ML.Ensemble/Batch.cs new file mode 100644 index 0000000000..e9c8fcf179 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Batch.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Data; + +namespace Microsoft.ML.Runtime.Ensemble +{ + public sealed class Batch + { + public readonly RoleMappedData TrainInstances; + public readonly RoleMappedData TestInstances; + + public Batch(RoleMappedData trainData, RoleMappedData testData) + { + Contracts.CheckValue(trainData, nameof(trainData)); + Contracts.CheckValue(testData, nameof(testData)); + TrainInstances = trainData; + TestInstances = testData; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/EnsembleUtils.cs b/src/Microsoft.ML.Ensemble/EnsembleUtils.cs new file mode 100644 index 0000000000..ae6c2adac6 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EnsembleUtils.cs @@ -0,0 +1,114 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Internal.Utilities; + +namespace Microsoft.ML.Runtime.Ensemble +{ + internal static class EnsembleUtils + { + /// + /// Return a dataset with non-selected features zeroed out. + /// + public static RoleMappedData SelectFeatures(IHost host, RoleMappedData data, BitArray features) + { + Contracts.AssertValue(host); + Contracts.AssertValue(data); + Contracts.Assert(data.Schema.Feature != null); + Contracts.AssertValue(features); + + var type = data.Schema.Feature.Type; + Contracts.Assert(features.Length == type.VectorSize); + int card = Utils.GetCardinality(features); + if (card == type.VectorSize) + return data; + + // REVIEW: This doesn't preserve metadata on the features column. Should it? + var name = data.Schema.Feature.Name; + var view = LambdaColumnMapper.Create( + host, "FeatureSelector", data.Data, name, name, type, type, + (ref VBuffer src, ref VBuffer dst) => SelectFeatures(ref src, features, card, ref dst)); + + var res = new RoleMappedData(view, data.Schema.GetColumnRoleNames()); + return res; + } + + /// + /// Fill dst with values selected from src if the indices of the src values are set in includedIndices, + /// otherwise assign default(T). The length of dst will be equal to src.Length. + /// + public static void SelectFeatures(ref VBuffer src, BitArray includedIndices, int cardinality, ref VBuffer dst) + { + Contracts.Assert(Utils.Size(includedIndices) == src.Length); + Contracts.Assert(cardinality == Utils.GetCardinality(includedIndices)); + Contracts.Assert(cardinality < src.Length); + + var values = dst.Values; + var indices = dst.Indices; + + if (src.IsDense) + { + if (cardinality >= src.Length / 2) + { + T defaultValue = default; + if (Utils.Size(values) < src.Length) + values = new T[src.Length]; + for (int i = 0; i < src.Length; i++) + values[i] = !includedIndices[i] ? defaultValue : src.Values[i]; + dst = new VBuffer(src.Length, values, indices); + } + else + { + if (Utils.Size(values) < cardinality) + values = new T[cardinality]; + if (Utils.Size(indices) < cardinality) + indices = new int[cardinality]; + + int count = 0; + for (int i = 0; i < src.Length; i++) + { + if (includedIndices[i]) + { + Contracts.Assert(count < cardinality); + values[count] = src.Values[i]; + indices[count] = i; + count++; + } + } + + Contracts.Assert(count == cardinality); + dst = new VBuffer(src.Length, count, values, indices); + } + } + else + { + int valuesSize = Utils.Size(values); + int indicesSize = Utils.Size(indices); + if (valuesSize < src.Count || indicesSize < src.Count) + { + if (valuesSize < cardinality) + values = new T[cardinality]; + if (indicesSize < cardinality) + indices = new int[cardinality]; + } + + int count = 0; + for (int i = 0; i < src.Count; i++) + { + if (includedIndices[src.Indices[i]]) + { + values[count] = src.Values[i]; + indices[count] = src.Indices[i]; + count++; + } + } + + dst = new VBuffer(src.Length, count, values, indices); + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/EntryPoints/CreateEnsemble.cs b/src/Microsoft.ML.Ensemble/EntryPoints/CreateEnsemble.cs new file mode 100644 index 0000000000..a9d7983adf --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EntryPoints/CreateEnsemble.cs @@ -0,0 +1,406 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Utilities; + +[assembly: LoadableClass(typeof(void), typeof(EnsembleCreator), null, typeof(SignatureEntryPointModule), "CreateEnsemble")] + +namespace Microsoft.ML.Runtime.EntryPoints +{ + /// + /// A component to combine given models into an ensemble model. + /// + public static class EnsembleCreator + { + /// + /// These are the combiner options for binary and multi class classifiers. + /// + public enum ClassifierCombiner + { + Median, + Average, + Vote, + } + + /// + /// These are the combiner options for regression and anomaly detection. + /// + public enum ScoreCombiner + { + Median, + Average, + } + + public abstract class PipelineInputBase + { + [Argument(ArgumentType.Required, ShortName = "models", HelpText = "The models to combine into an ensemble", SortOrder = 1)] + public IPredictorModel[] Models; + } + + public abstract class InputBase + { + [Argument(ArgumentType.Required, ShortName = "models", HelpText = "The models to combine into an ensemble", SortOrder = 1)] + public IPredictorModel[] Models; + + [Argument(ArgumentType.AtMostOnce, ShortName = "validate", HelpText = "Whether to validate that all the pipelines are identical", SortOrder = 5)] + public bool ValidatePipelines = true; + } + + public sealed class ClassifierInput : InputBase + { + [Argument(ArgumentType.AtMostOnce, ShortName = "combiner", HelpText = "The combiner used to combine the scores", SortOrder = 2)] + public ClassifierCombiner ModelCombiner = ClassifierCombiner.Median; + } + + public sealed class PipelineClassifierInput : PipelineInputBase + { + [Argument(ArgumentType.AtMostOnce, ShortName = "combiner", HelpText = "The combiner used to combine the scores", SortOrder = 2)] + public ClassifierCombiner ModelCombiner = ClassifierCombiner.Median; + } + + public sealed class RegressionInput : InputBase + { + [Argument(ArgumentType.AtMostOnce, ShortName = "combiner", HelpText = "The combiner used to combine the scores", SortOrder = 2)] + public ScoreCombiner ModelCombiner = ScoreCombiner.Median; + } + + public sealed class PipelineRegressionInput : PipelineInputBase + { + [Argument(ArgumentType.AtMostOnce, ShortName = "combiner", HelpText = "The combiner used to combine the scores", SortOrder = 2)] + public ScoreCombiner ModelCombiner = ScoreCombiner.Median; + } + + public sealed class PipelineAnomalyInput : PipelineInputBase + { + [Argument(ArgumentType.AtMostOnce, ShortName = "combiner", HelpText = "The combiner used to combine the scores", SortOrder = 2)] + public ScoreCombiner ModelCombiner = ScoreCombiner.Average; + } + + private static void GetPipeline(IHostEnvironment env, InputBase input, out IDataView startingData, out RoleMappedData transformedData) + { + Contracts.AssertValue(env); + env.AssertValue(input); + env.AssertNonEmpty(input.Models); + + ISchema inputSchema = null; + startingData = null; + transformedData = null; + byte[][] transformedDataSerialized = null; + string[] transformedDataZipEntryNames = null; + for (int i = 0; i < input.Models.Length; i++) + { + var model = input.Models[i]; + + var inputData = new EmptyDataView(env, model.TransformModel.InputSchema); + model.PrepareData(env, inputData, out RoleMappedData transformedDataCur, out IPredictor pred); + + if (inputSchema == null) + { + env.Assert(i == 0); + inputSchema = model.TransformModel.InputSchema; + startingData = inputData; + transformedData = transformedDataCur; + } + else if (input.ValidatePipelines) + { + using (var ch = env.Start("Validating pipeline")) + { + if (transformedDataSerialized == null) + { + ch.Assert(transformedDataZipEntryNames == null); + SerializeRoleMappedData(env, ch, transformedData, out transformedDataSerialized, + out transformedDataZipEntryNames); + } + CheckSamePipeline(env, ch, transformedDataCur, transformedDataSerialized, transformedDataZipEntryNames); + ch.Done(); + } + } + } + } + + [TlcModule.EntryPoint(Name = "Models.BinaryEnsemble", Desc = "Combine binary classifiers into an ensemble", UserName = EnsembleTrainer.UserNameValue)] + public static CommonOutputs.BinaryClassificationOutput CreateBinaryEnsemble(IHostEnvironment env, ClassifierInput input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("CombineModels"); + host.CheckValue(input, nameof(input)); + host.CheckNonEmpty(input.Models, nameof(input.Models)); + + GetPipeline(host, input, out IDataView startingData, out RoleMappedData transformedData); + + var args = new EnsembleTrainer.Arguments(); + switch (input.ModelCombiner) + { + case ClassifierCombiner.Median: + args.OutputCombiner = new MedianFactory(); + break; + case ClassifierCombiner.Average: + args.OutputCombiner = new AverageFactory(); + break; + case ClassifierCombiner.Vote: + args.OutputCombiner = new VotingFactory(); + break; + default: + throw host.Except("Unknown combiner kind"); + } + + var trainer = new EnsembleTrainer(host, args); + var ensemble = trainer.CombineModels(input.Models.Select(pm => pm.Predictor as IPredictorProducing)); + + var predictorModel = new PredictorModel(host, transformedData, startingData, ensemble); + + var output = new CommonOutputs.BinaryClassificationOutput { PredictorModel = predictorModel }; + return output; + } + + [TlcModule.EntryPoint(Name = "Models.RegressionEnsemble", Desc = "Combine regression models into an ensemble", UserName = RegressionEnsembleTrainer.UserNameValue)] + public static CommonOutputs.RegressionOutput CreateRegressionEnsemble(IHostEnvironment env, RegressionInput input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("CombineModels"); + host.CheckValue(input, nameof(input)); + host.CheckNonEmpty(input.Models, nameof(input.Models)); + + GetPipeline(host, input, out IDataView startingData, out RoleMappedData transformedData); + + var args = new RegressionEnsembleTrainer.Arguments(); + switch (input.ModelCombiner) + { + case ScoreCombiner.Median: + args.OutputCombiner = new MedianFactory(); + break; + case ScoreCombiner.Average: + args.OutputCombiner = new AverageFactory(); + break; + default: + throw host.Except("Unknown combiner kind"); + } + + var trainer = new RegressionEnsembleTrainer(host, args); + var ensemble = trainer.CombineModels(input.Models.Select(pm => pm.Predictor as IPredictorProducing)); + + var predictorModel = new PredictorModel(host, transformedData, startingData, ensemble); + + var output = new CommonOutputs.RegressionOutput { PredictorModel = predictorModel }; + return output; + } + + [TlcModule.EntryPoint(Name = "Models.BinaryPipelineEnsemble", Desc = "Combine binary classification models into an ensemble")] + public static CommonOutputs.BinaryClassificationOutput CreateBinaryPipelineEnsemble(IHostEnvironment env, PipelineClassifierInput input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("CombineModels"); + host.CheckValue(input, nameof(input)); + host.CheckNonEmpty(input.Models, nameof(input.Models)); + + IBinaryOutputCombiner combiner; + switch (input.ModelCombiner) + { + case ClassifierCombiner.Median: + combiner = new Median(host); + break; + case ClassifierCombiner.Average: + combiner = new Average(host); + break; + case ClassifierCombiner.Vote: + combiner = new Voting(host); + break; + default: + throw host.Except("Unknown combiner kind"); + } + var ensemble = SchemaBindablePipelineEnsembleBase.Create(host, input.Models, combiner, MetadataUtils.Const.ScoreColumnKind.BinaryClassification); + return CreatePipelineEnsemble(host, input.Models, ensemble); + } + + [TlcModule.EntryPoint(Name = "Models.RegressionPipelineEnsemble", Desc = "Combine regression models into an ensemble")] + public static CommonOutputs.RegressionOutput CreateRegressionPipelineEnsemble(IHostEnvironment env, PipelineRegressionInput input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("CombineModels"); + host.CheckValue(input, nameof(input)); + host.CheckNonEmpty(input.Models, nameof(input.Models)); + + IRegressionOutputCombiner combiner; + switch (input.ModelCombiner) + { + case ScoreCombiner.Median: + combiner = new Median(host); + break; + case ScoreCombiner.Average: + combiner = new Average(host); + break; + default: + throw host.Except("Unknown combiner kind"); + } + var ensemble = SchemaBindablePipelineEnsembleBase.Create(host, input.Models, combiner, MetadataUtils.Const.ScoreColumnKind.Regression); + return CreatePipelineEnsemble(host, input.Models, ensemble); + } + + [TlcModule.EntryPoint(Name = "Models.MultiClassPipelineEnsemble", Desc = "Combine multiclass classifiers into an ensemble")] + public static CommonOutputs.MulticlassClassificationOutput CreateMultiClassPipelineEnsemble(IHostEnvironment env, PipelineClassifierInput input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("CombineModels"); + host.CheckValue(input, nameof(input)); + host.CheckNonEmpty(input.Models, nameof(input.Models)); + + IOutputCombiner> combiner; + switch (input.ModelCombiner) + { + case ClassifierCombiner.Median: + combiner = new MultiMedian(host, new MultiMedian.Arguments() { Normalize = true }); + break; + case ClassifierCombiner.Average: + combiner = new MultiAverage(host, new MultiAverage.Arguments() { Normalize = true }); + break; + case ClassifierCombiner.Vote: + combiner = new MultiVoting(host); + break; + default: + throw host.Except("Unknown combiner kind"); + } + var ensemble = SchemaBindablePipelineEnsembleBase.Create(host, input.Models, combiner, MetadataUtils.Const.ScoreColumnKind.MultiClassClassification); + return CreatePipelineEnsemble(host, input.Models, ensemble); + } + + [TlcModule.EntryPoint(Name = "Models.AnomalyPipelineEnsemble", Desc = "Combine anomaly detection models into an ensemble")] + public static CommonOutputs.AnomalyDetectionOutput CreateAnomalyPipelineEnsemble(IHostEnvironment env, PipelineAnomalyInput input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("CombineModels"); + host.CheckValue(input, nameof(input)); + host.CheckNonEmpty(input.Models, nameof(input.Models)); + + IRegressionOutputCombiner combiner; + switch (input.ModelCombiner) + { + case ScoreCombiner.Median: + combiner = new Median(host); + break; + case ScoreCombiner.Average: + combiner = new Average(host); + break; + default: + throw host.Except("Unknown combiner kind"); + } + var ensemble = SchemaBindablePipelineEnsembleBase.Create(host, input.Models, combiner, MetadataUtils.Const.ScoreColumnKind.AnomalyDetection); + return CreatePipelineEnsemble(host, input.Models, ensemble); + } + + private static TOut CreatePipelineEnsemble(IHostEnvironment env, IPredictorModel[] predictors, SchemaBindablePipelineEnsembleBase ensemble) + where TOut : CommonOutputs.TrainerOutput, new() + { + var inputSchema = predictors[0].TransformModel.InputSchema; + var dv = new EmptyDataView(env, inputSchema); + + // The role mappings are specific to the individual predictors. + var rmd = new RoleMappedData(dv); + var predictorModel = new PredictorModel(env, rmd, dv, ensemble); + + var output = new TOut { PredictorModel = predictorModel }; + return output; + } + + /// + /// This method takes a as input, saves it as an in-memory + /// and returns two arrays indexed by the entries in the zip: + /// 1. An array of byte arrays, containing the byte sequences of each entry. + /// 2. An array of strings, containing the name of each entry. + /// + /// This method is used for comparing pipelines. Its outputs can be passed to + /// to check if this pipeline is identical to another pipeline. + /// + public static void SerializeRoleMappedData(IHostEnvironment env, IChannel ch, RoleMappedData data, + out byte[][] dataSerialized, out string[] dataZipEntryNames) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ch, nameof(ch)); + ch.CheckValue(data, nameof(data)); + + using (var ms = new MemoryStream()) + { + TrainUtils.SaveModel(env, ch, ms, null, data); + var zip = new ZipArchive(ms); + var entries = zip.Entries.OrderBy(e => e.FullName).ToArray(); + dataSerialized = new byte[Utils.Size(entries)][]; + dataZipEntryNames = new string[Utils.Size(entries)]; + for (int i = 0; i < Utils.Size(entries); i++) + { + dataZipEntryNames[i] = entries[i].FullName; + dataSerialized[i] = new byte[entries[i].Length]; + using (var s = entries[i].Open()) + s.Read(dataSerialized[i], 0, (int)entries[i].Length); + } + } + } + + /// + /// This method compares two pipelines to make sure they are identical. The first pipeline is passed + /// as a , and the second as a double byte array and a string array. The double + /// byte array and the string array are obtained by calling on the + /// second pipeline. + /// The comparison is done by saving as an in-memory , + /// and for each entry in it, comparing its name, and the byte sequence to the corresponding entries in + /// and . + /// This method throws if for any of the entries the name/byte sequence are not identical. + /// + public static void CheckSamePipeline(IHostEnvironment env, IChannel ch, + RoleMappedData dataToCompare, byte[][] dataSerialized, string[] dataZipEntryNames) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ch, nameof(ch)); + ch.CheckValue(dataToCompare, nameof(dataToCompare)); + ch.CheckValue(dataSerialized, nameof(dataSerialized)); + ch.CheckValue(dataZipEntryNames, nameof(dataZipEntryNames)); + if (dataZipEntryNames.Length != dataSerialized.Length) + { + throw ch.ExceptParam(nameof(dataSerialized), + $"The length of {nameof(dataSerialized)} must be equal to the length of {nameof(dataZipEntryNames)}"); + } + + using (var ms = new MemoryStream()) + { + // REVIEW: This can be done more efficiently by adding a custom type of repository that + // doesn't actually save the data, but upon stream closure compares the results to the given repository + // and then discards it. Currently, however, this cannot be done because ModelSaveContext does not use + // an abstract class/interface, but rather the RepositoryWriter class. + TrainUtils.SaveModel(env, ch, ms, null, dataToCompare); + + string errorMsg = "Models contain different pipelines, cannot ensemble them."; + var zip = new ZipArchive(ms); + var entries = zip.Entries.OrderBy(e => e.FullName).ToArray(); + ch.Check(dataSerialized.Length == Utils.Size(entries)); + byte[] buffer = null; + for (int i = 0; i < dataSerialized.Length; i++) + { + ch.Check(dataZipEntryNames[i] == entries[i].FullName, errorMsg); + int len = dataSerialized[i].Length; + if (Utils.Size(buffer) < len) + buffer = new byte[len]; + using (var s = entries[i].Open()) + { + int bytesRead = s.Read(buffer, 0, len); + ch.Check(bytesRead == len, errorMsg); + for (int j = 0; j < len; j++) + ch.Check(buffer[j] == dataSerialized[i][j], errorMsg); + if (s.Read(buffer, 0, 1) > 0) + throw env.Except(errorMsg); + } + } + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/EntryPoints/DiversityMeasure.cs b/src/Microsoft.ML.Ensemble/EntryPoints/DiversityMeasure.cs new file mode 100644 index 0000000000..b13cff3b35 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EntryPoints/DiversityMeasure.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: EntryPointModule(typeof(DisagreementDiversityFactory))] +[assembly: EntryPointModule(typeof(RegressionDisagreementDiversityFactory))] +[assembly: EntryPointModule(typeof(MultiDisagreementDiversityFactory))] + +namespace Microsoft.ML.Ensemble.EntryPoints +{ + [TlcModule.Component(Name = DisagreementDiversityMeasure.LoadName, FriendlyName = DisagreementDiversityMeasure.UserName)] + public sealed class DisagreementDiversityFactory : ISupportBinaryDiversityMeasureFactory + { + public IBinaryDiversityMeasure CreateComponent(IHostEnvironment env) => new DisagreementDiversityMeasure(); + } + + [TlcModule.Component(Name = RegressionDisagreementDiversityMeasure.LoadName, FriendlyName = DisagreementDiversityMeasure.UserName)] + public sealed class RegressionDisagreementDiversityFactory : ISupportRegressionDiversityMeasureFactory + { + public IRegressionDiversityMeasure CreateComponent(IHostEnvironment env) => new RegressionDisagreementDiversityMeasure(); + } + + [TlcModule.Component(Name = MultiDisagreementDiversityMeasure.LoadName, FriendlyName = DisagreementDiversityMeasure.UserName)] + public sealed class MultiDisagreementDiversityFactory : ISupportMulticlassDiversityMeasureFactory + { + public IMulticlassDiversityMeasure CreateComponent(IHostEnvironment env) => new MultiDisagreementDiversityMeasure(); + } + +} diff --git a/src/Microsoft.ML.Ensemble/EntryPoints/Ensemble.cs b/src/Microsoft.ML.Ensemble/EntryPoints/Ensemble.cs new file mode 100644 index 0000000000..728cccb1f6 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EntryPoints/Ensemble.cs @@ -0,0 +1,55 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: LoadableClass(typeof(void), typeof(Ensemble), null, typeof(SignatureEntryPointModule), "TrainEnsemble")] + +namespace Microsoft.ML.Ensemble.EntryPoints +{ + public static class Ensemble + { + [TlcModule.EntryPoint(Name = "Trainers.EnsembleBinaryClassifier", Desc = "Train binary ensemble.", UserName = EnsembleTrainer.UserNameValue)] + public static CommonOutputs.BinaryClassificationOutput CreateBinaryEnsemble(IHostEnvironment env, EnsembleTrainer.Arguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("TrainBinaryEnsemble"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + return LearnerEntryPointsUtils.Train(host, input, + () => new EnsembleTrainer(host, input), + () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn)); + } + + [TlcModule.EntryPoint(Name = "Trainers.EnsembleClassification", Desc = "Train multiclass ensemble.", UserName = EnsembleTrainer.UserNameValue)] + public static CommonOutputs.MulticlassClassificationOutput CreateMultiClassEnsemble(IHostEnvironment env, MulticlassDataPartitionEnsembleTrainer.Arguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("TrainMultiClassEnsemble"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + return LearnerEntryPointsUtils.Train(host, input, + () => new MulticlassDataPartitionEnsembleTrainer(host, input), + () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn)); + } + + [TlcModule.EntryPoint(Name = "Trainers.EnsembleRegression", Desc = "Train regression ensemble.", UserName = EnsembleTrainer.UserNameValue)] + public static CommonOutputs.RegressionOutput CreateRegressionEnsemble(IHostEnvironment env, RegressionEnsembleTrainer.Arguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("TrainRegressionEnsemble"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + return LearnerEntryPointsUtils.Train(host, input, + () => new RegressionEnsembleTrainer(host, input), + () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn)); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/EntryPoints/FeatureSelector.cs b/src/Microsoft.ML.Ensemble/EntryPoints/FeatureSelector.cs new file mode 100644 index 0000000000..65ca5e9d06 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EntryPoints/FeatureSelector.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.FeatureSelector; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: EntryPointModule(typeof(AllFeatureSelectorFactory))] +[assembly: EntryPointModule(typeof(RandomFeatureSelector))] + +namespace Microsoft.ML.Ensemble.EntryPoints +{ + [TlcModule.Component(Name = AllFeatureSelector.LoadName, FriendlyName = AllFeatureSelector.UserName)] + public sealed class AllFeatureSelectorFactory : ISupportFeatureSelectorFactory + { + IFeatureSelector IComponentFactory.CreateComponent(IHostEnvironment env) => new AllFeatureSelector(env); + } + +} diff --git a/src/Microsoft.ML.Ensemble/EntryPoints/OutputCombiner.cs b/src/Microsoft.ML.Ensemble/EntryPoints/OutputCombiner.cs new file mode 100644 index 0000000000..537b35f47b --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EntryPoints/OutputCombiner.cs @@ -0,0 +1,51 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: EntryPointModule(typeof(AverageFactory))] +[assembly: EntryPointModule(typeof(MedianFactory))] +[assembly: EntryPointModule(typeof(MultiAverage))] +[assembly: EntryPointModule(typeof(MultiMedian))] +[assembly: EntryPointModule(typeof(MultiStacking))] +[assembly: EntryPointModule(typeof(MultiVotingFactory))] +[assembly: EntryPointModule(typeof(MultiWeightedAverage))] +[assembly: EntryPointModule(typeof(RegressionStacking))] +[assembly: EntryPointModule(typeof(Stacking))] +[assembly: EntryPointModule(typeof(VotingFactory))] +[assembly: EntryPointModule(typeof(WeightedAverage))] + +namespace Microsoft.ML.Ensemble.EntryPoints +{ + [TlcModule.Component(Name = Average.LoadName, FriendlyName = Average.UserName)] + public sealed class AverageFactory : ISupportBinaryOutputCombinerFactory, ISupportRegressionOutputCombinerFactory + { + public IRegressionOutputCombiner CreateComponent(IHostEnvironment env) => new Average(env); + + IBinaryOutputCombiner IComponentFactory.CreateComponent(IHostEnvironment env) => new Average(env); + } + + [TlcModule.Component(Name = Median.LoadName, FriendlyName = Median.UserName)] + public sealed class MedianFactory : ISupportBinaryOutputCombinerFactory, ISupportRegressionOutputCombinerFactory + { + public IRegressionOutputCombiner CreateComponent(IHostEnvironment env) => new Median(env); + + IBinaryOutputCombiner IComponentFactory.CreateComponent(IHostEnvironment env) => new Median(env); + } + + [TlcModule.Component(Name = Voting.LoadName, FriendlyName = Voting.UserName)] + public sealed class VotingFactory : ISupportBinaryOutputCombinerFactory + { + IBinaryOutputCombiner IComponentFactory.CreateComponent(IHostEnvironment env) => new Voting(env); + } + + [TlcModule.Component(Name = MultiVoting.LoadName, FriendlyName = Voting.UserName)] + public sealed class MultiVotingFactory : ISupportMulticlassOutputCombinerFactory + { + public IMultiClassOutputCombiner CreateComponent(IHostEnvironment env) => new MultiVoting(env); + } +} diff --git a/src/Microsoft.ML.Ensemble/EntryPoints/PipelineEnsemble.cs b/src/Microsoft.ML.Ensemble/EntryPoints/PipelineEnsemble.cs new file mode 100644 index 0000000000..bcfaaefb89 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EntryPoints/PipelineEnsemble.cs @@ -0,0 +1,59 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.EntryPoints; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Calibration; + +[assembly: EntryPointModule(typeof(PipelineEnsemble))] + +namespace Microsoft.ML.Runtime.Ensemble.EntryPoints +{ + public static class PipelineEnsemble + { + public sealed class SummaryOutput + { + [TlcModule.Output(Desc = "The summaries of the individual predictors")] + public IDataView[] Summaries; + + [TlcModule.Output(Desc = "The model statistics of the individual predictors")] + public IDataView[] Stats; + } + + [TlcModule.EntryPoint(Name = "Models.EnsembleSummary", Desc = "Summarize a pipeline ensemble predictor.")] + public static SummaryOutput Summarize(IHostEnvironment env, SummarizePredictor.Input input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("PipelineEnsemblePredictor"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + input.PredictorModel.PrepareData(host, + new EmptyDataView(host, input.PredictorModel.TransformModel.InputSchema), + out RoleMappedData rmd, out IPredictor predictor +); + + var calibrated = predictor as CalibratedPredictorBase; + while (calibrated != null) + { + predictor = calibrated.SubPredictor; + calibrated = predictor as CalibratedPredictorBase; + } + var ensemble = predictor as SchemaBindablePipelineEnsembleBase; + host.CheckUserArg(ensemble != null, nameof(input.PredictorModel.Predictor), "Predictor is not a pipeline ensemble predictor"); + + var summaries = new IDataView[ensemble.PredictorModels.Length]; + var stats = new IDataView[ensemble.PredictorModels.Length]; + for (int i = 0; i < ensemble.PredictorModels.Length; i++) + { + var pm = ensemble.PredictorModels[i]; + + pm.PrepareData(host, new EmptyDataView(host, pm.TransformModel.InputSchema), out rmd, out IPredictor pred); + summaries[i] = SummarizePredictor.GetSummaryAndStats(host, pred, rmd.Schema, out stats[i]); + } + return new SummaryOutput() { Summaries = summaries, Stats = stats }; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/EntryPoints/SubModelSelector.cs b/src/Microsoft.ML.Ensemble/EntryPoints/SubModelSelector.cs new file mode 100644 index 0000000000..57001190ac --- /dev/null +++ b/src/Microsoft.ML.Ensemble/EntryPoints/SubModelSelector.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: EntryPointModule(typeof(AllSelectorFactory))] +[assembly: EntryPointModule(typeof(AllSelectorMultiClassFactory))] +[assembly: EntryPointModule(typeof(BestDiverseSelectorBinary))] +[assembly: EntryPointModule(typeof(BestDiverseSelectorMultiClass))] +[assembly: EntryPointModule(typeof(BestDiverseSelectorRegression))] +[assembly: EntryPointModule(typeof(BestPerformanceRegressionSelector))] +[assembly: EntryPointModule(typeof(BestPerformanceSelector))] +[assembly: EntryPointModule(typeof(BestPerformanceSelectorMultiClass))] + +namespace Microsoft.ML.Ensemble.EntryPoints +{ + [TlcModule.Component(Name = AllSelector.LoadName, FriendlyName = AllSelector.UserName)] + public sealed class AllSelectorFactory : ISupportBinarySubModelSelectorFactory, ISupportRegressionSubModelSelectorFactory + { + IBinarySubModelSelector IComponentFactory.CreateComponent(IHostEnvironment env) => new AllSelector(env); + + IRegressionSubModelSelector IComponentFactory.CreateComponent(IHostEnvironment env) => new AllSelector(env); + } + + [TlcModule.Component(Name = AllSelectorMultiClass.LoadName, FriendlyName = AllSelectorMultiClass.UserName)] + public sealed class AllSelectorMultiClassFactory : ISupportMulticlassSubModelSelectorFactory + { + IMulticlassSubModelSelector IComponentFactory.CreateComponent(IHostEnvironment env) => new AllSelectorMultiClass(env); + } +} diff --git a/src/Microsoft.ML.Ensemble/FeatureSubsetModel.cs b/src/Microsoft.ML.Ensemble/FeatureSubsetModel.cs new file mode 100644 index 0000000000..4518666d34 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/FeatureSubsetModel.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections; +using System.Collections.Generic; +using Microsoft.ML.Runtime.Internal.Utilities; + +namespace Microsoft.ML.Runtime.Ensemble +{ + public sealed class FeatureSubsetModel where TPredictor : IPredictor + { + public readonly TPredictor Predictor; + public readonly BitArray SelectedFeatures; + public readonly int Cardinality; + + public KeyValuePair[] Metrics { get; set; } + + public FeatureSubsetModel(TPredictor predictor, BitArray features = null, + KeyValuePair[] metrics = null) + { + Predictor = predictor; + int card; + if (features != null && (card = Utils.GetCardinality(features)) < features.Count) + { + SelectedFeatures = features; + Cardinality = card; + } + Metrics = metrics; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Microsoft.ML.Ensemble.csproj b/src/Microsoft.ML.Ensemble/Microsoft.ML.Ensemble.csproj new file mode 100644 index 0000000000..ddd4557788 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Microsoft.ML.Ensemble.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.0 + Microsoft.ML.Ensemble + CORECLR + + + + + + + + + diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/Average.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/Average.cs new file mode 100644 index 0000000000..45cd764d13 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/Average.cs @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(Average), null, typeof(SignatureCombiner), Average.UserName)] +[assembly: LoadableClass(typeof(Average), null, typeof(SignatureLoadModel), Average.UserName, Average.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public sealed class Average : BaseAverager, ICanSaveModel, IRegressionOutputCombiner + { + public const string UserName = "Average"; + public const string LoadName = "Average"; + public const string LoaderSignature = "AverageCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "AVG COMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + public Average(IHostEnvironment env) + : base(env, LoaderSignature) + { + } + + private Average(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + } + + public static Average Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new Average(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public override Combiner GetCombiner() + { + // Force the weights to null. + return(ref Single dst, Single[] src, Single[] weights) => + CombineCore(ref dst, src, null); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/BaseAverager.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseAverager.cs new file mode 100644 index 0000000000..824300e594 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseAverager.cs @@ -0,0 +1,78 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime.Model; + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public abstract class BaseAverager : IBinaryOutputCombiner + { + protected readonly IHost Host; + public BaseAverager(IHostEnvironment env, string name) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckNonWhiteSpace(name, nameof(name)); + Host = env.Register(name); + } + + protected BaseAverager(IHostEnvironment env, string name, ModelLoadContext ctx) + { + Contracts.AssertValue(env); + env.AssertNonWhiteSpace(name); + Host = env.Register(name); + Host.CheckValue(ctx, nameof(ctx)); + + // *** Binary format *** + // int: sizeof(Single) + int cbFloat = ctx.Reader.ReadInt32(); + Host.CheckDecode(cbFloat == sizeof(Single)); + } + + public void Save(ModelSaveContext ctx) + { + Host.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(); + SaveCore(ctx); + } + + protected virtual void SaveCore(ModelSaveContext ctx) + { + // *** Binary format *** + // int: sizeof(Single) + ctx.Writer.Write(sizeof(Single)); + } + + public abstract Combiner GetCombiner(); + + protected void CombineCore(ref Single dst, Single[] src, Single[] weights = null) + { + Single sum = 0; + Single weightTotal = 0; + if (weights == null) + { + for (int i = 0; i < src.Length; i++) + { + if (!Single.IsNaN(src[i])) + { + sum += src[i]; + weightTotal++; + } + } + } + else + { + for (int i = 0; i < src.Length; i++) + { + if (!Single.IsNaN(src[i])) + { + sum += weights[i] * src[i]; + weightTotal += weights[i]; + } + } + } + dst = sum / weightTotal; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/BaseMultiAverager.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseMultiAverager.cs new file mode 100644 index 0000000000..64ec41d613 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseMultiAverager.cs @@ -0,0 +1,68 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Runtime.Numeric; + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public abstract class BaseMultiAverager : BaseMultiCombiner + { + internal BaseMultiAverager(IHostEnvironment env, string name, ArgumentsBase args) + : base(env, name, args) + { + } + + internal BaseMultiAverager(IHostEnvironment env, string name, ModelLoadContext ctx) + : base(env, name, ctx) + { + } + + protected void CombineCore(ref VBuffer dst, VBuffer[] src, Single[] weights = null) + { + Host.AssertNonEmpty(src); + Host.Assert(weights == null || Utils.Size(weights) == Utils.Size(src)); + + // REVIEW: Should this be tolerant of NaNs? + int len = GetClassCount(src); + if (!TryNormalize(src)) + { + GetNaNOutput(ref dst, len); + return; + } + + var values = dst.Values; + if (Utils.Size(values) < len) + values = new Single[len]; + else + Array.Clear(values, 0, len); + + // Set the output to values. + dst = new VBuffer(len, values, dst.Indices); + + Single weightTotal; + if (weights == null) + { + weightTotal = src.Length; + for (int i = 0; i < src.Length; i++) + VectorUtils.Add(ref src[i], ref dst); + } + else + { + weightTotal = 0; + for (int i = 0; i < src.Length; i++) + { + var w = weights[i]; + weightTotal += w; + VectorUtils.AddMult(ref src[i], w, ref dst); + } + } + + VectorUtils.ScaleBy(ref dst, 1 / weightTotal); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/BaseMultiCombiner.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseMultiCombiner.cs new file mode 100644 index 0000000000..1258313df1 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseMultiCombiner.cs @@ -0,0 +1,109 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Runtime.Numeric; + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public abstract class BaseMultiCombiner : IMultiClassOutputCombiner + { + protected readonly IHost Host; + + public abstract class ArgumentsBase + { + [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to normalize the output of base models before combining them", + ShortName = "norm", SortOrder = 50)] + public bool Normalize = true; + } + + protected readonly bool Normalize; + + internal BaseMultiCombiner(IHostEnvironment env, string name, ArgumentsBase args) + { + Contracts.AssertValue(env); + env.AssertNonWhiteSpace(name); + Host = env.Register(name); + Host.CheckValue(args, nameof(args)); + + Normalize = args.Normalize; + } + + internal BaseMultiCombiner(IHostEnvironment env, string name, ModelLoadContext ctx) + { + Contracts.AssertValue(env); + env.AssertNonWhiteSpace(name); + Host = env.Register(name); + Host.AssertValue(ctx); + + // *** Binary format *** + // int: sizeof(Single) + // bool: _normalize + int cbFloat = ctx.Reader.ReadInt32(); + Host.CheckDecode(cbFloat == sizeof(Single)); + Normalize = ctx.Reader.ReadBoolByte(); + } + + public void Save(ModelSaveContext ctx) + { + Host.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(); + SaveCore(ctx); + } + + protected virtual void SaveCore(ModelSaveContext ctx) + { + // *** Binary format *** + // int: sizeof(Single) + // bool: _normalize + ctx.Writer.Write(sizeof(Single)); + ctx.Writer.WriteBoolByte(Normalize); + } + + public abstract Combiner> GetCombiner(); + + protected int GetClassCount(VBuffer[] values) + { + int len = 0; + foreach (var item in values) + { + if (len < item.Length) + len = item.Length; + } + return len; + } + + protected bool TryNormalize(VBuffer[] values) + { + if (!Normalize) + return true; + + for (int i = 0; i < values.Length; i++) + { + // Leave a zero vector as all zeros. Otherwise, make the L1 norm equal to 1. + var sum = VectorUtils.L1Norm(ref values[i]); + if (!FloatUtils.IsFinite(sum)) + return false; + if (sum > 0) + VectorUtils.ScaleBy(ref values[i], 1 / sum); + } + return true; + } + + protected void GetNaNOutput(ref VBuffer dst, int len) + { + Contracts.Assert(len >= 0); + var values = dst.Values; + if (Utils.Size(values) < len) + values = new Single[len]; + for (int i = 0; i < len; i++) + values[i] = Single.NaN; + dst = new VBuffer(len, values, dst.Indices); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/BaseScalarStacking.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseScalarStacking.cs new file mode 100644 index 0000000000..a5c9c757a4 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseScalarStacking.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public abstract class BaseScalarStacking : BaseStacking + { + internal BaseScalarStacking(IHostEnvironment env, string name, ArgumentsBase args) + : base(env, name, args) + { + } + + internal BaseScalarStacking(IHostEnvironment env, string name, ModelLoadContext ctx) + : base(env, name, ctx) + { + } + + protected override void FillFeatureBuffer(Single[] src, ref VBuffer dst) + { + Contracts.AssertNonEmpty(src); + int len = src.Length; + var values = dst.Values; + if (Utils.Size(values) < len) + values = new Single[len]; + Array.Copy(src, values, len); + dst = new VBuffer(len, values, dst.Indices); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/BaseStacking.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseStacking.cs new file mode 100644 index 0000000000..f30174a31d --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseStacking.cs @@ -0,0 +1,200 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Runtime.Training; + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + using ColumnRole = RoleMappedSchema.ColumnRole; + public abstract class BaseStacking : IStackingTrainer + { + public abstract class ArgumentsBase + { + [Argument(ArgumentType.AtMostOnce, ShortName = "vp", SortOrder = 50, + HelpText = "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set")] + [TGUI(Label = "Validation Dataset Proportion")] + public Single ValidationDatasetProportion = 0.3f; + + [Argument(ArgumentType.Multiple, HelpText = "Base predictor for meta learning", ShortName = "bp", SortOrder = 50, + Visibility = ArgumentAttribute.VisibilityType.CmdLineOnly)] + [TGUI(Label = "Base predictor")] + public SubComponent>, TSigBase> BasePredictorType; + } + + protected readonly SubComponent>, TSigBase> BasePredictorType; + protected readonly IHost Host; + protected IPredictorProducing Meta; + + public Single ValidationDatasetProportion { get; } + + internal BaseStacking(IHostEnvironment env, string name, ArgumentsBase args) + { + Contracts.AssertValue(env); + env.AssertNonWhiteSpace(name); + Host = env.Register(name); + Host.AssertValue(args, "args"); + Host.CheckUserArg(0 <= args.ValidationDatasetProportion && args.ValidationDatasetProportion < 1, + nameof(args.ValidationDatasetProportion), + "The validation proportion for stacking should be greater than or equal to 0 and less than 1"); + Host.CheckUserArg(args.BasePredictorType.IsGood(), nameof(args.BasePredictorType)); + + ValidationDatasetProportion = args.ValidationDatasetProportion; + BasePredictorType = args.BasePredictorType; + } + + internal BaseStacking(IHostEnvironment env, string name, ModelLoadContext ctx) + { + Contracts.AssertValue(env); + env.AssertNonWhiteSpace(name); + Host = env.Register(name); + Host.AssertValue(ctx); + + // *** Binary format *** + // int: sizeof(Single) + // Float: _validationDatasetProportion + int cbFloat = ctx.Reader.ReadInt32(); + env.CheckDecode(cbFloat == sizeof(Single)); + ValidationDatasetProportion = ctx.Reader.ReadFloat(); + env.CheckDecode(0 <= ValidationDatasetProportion && ValidationDatasetProportion < 1); + + ctx.LoadModel, SignatureLoadModel>(env, out Meta, "MetaPredictor"); + CheckMeta(); + } + + public void Save(ModelSaveContext ctx) + { + Host.Check(Meta != null, "Can't save an untrained Stacking combiner"); + Host.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(); + SaveCore(ctx); + } + + protected virtual void SaveCore(ModelSaveContext ctx) + { + Host.Assert(Meta != null); + + // *** Binary format *** + // int: sizeof(Single) + // Float: _validationDatasetProportion + ctx.Writer.Write(sizeof(Single)); + ctx.Writer.Write(ValidationDatasetProportion); + + ctx.SaveModel(Meta, "MetaPredictor"); + } + + public Combiner GetCombiner() + { + Contracts.Check(Meta != null, "Training of stacking combiner not complete"); + + // Subtle point: We shouldn't get the ValueMapper delegate and cache it in a field + // since generally ValueMappers cannot be assumed to be thread safe - they often + // capture buffers needed for efficient operation. + var mapper = (IValueMapper)Meta; + var map = mapper.GetMapper, TOutput>(); + + var feat = default(VBuffer); + Combiner res = + (ref TOutput dst, TOutput[] src, Single[] weights) => + { + FillFeatureBuffer(src, ref feat); + map(ref feat, ref dst); + }; + return res; + } + + protected abstract void FillFeatureBuffer(TOutput[] src, ref VBuffer dst); + + private void CheckMeta() + { + Contracts.Assert(Meta != null); + + var ivm = Meta as IValueMapper; + Contracts.Check(ivm != null, "Stacking predictor doesn't implement the expected interface"); + if (!ivm.InputType.IsVector || ivm.InputType.ItemType != NumberType.Float) + throw Contracts.Except("Stacking predictor input type is unsupported: {0}", ivm.InputType); + if (ivm.OutputType.RawType != typeof(TOutput)) + throw Contracts.Except("Stacking predictor output type is unsupported: {0}", ivm.OutputType); + } + + public void Train(List>> models, RoleMappedData data, IHostEnvironment env) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register(Stacking.LoadName); + host.CheckValue(models, nameof(models)); + host.CheckValue(data, nameof(data)); + + using (var ch = host.Start("Training stacked model")) + { + ch.Check(Meta == null, "Train called multiple times"); + ch.Check(BasePredictorType != null); + + var maps = new ValueMapper, TOutput>[models.Count]; + for (int i = 0; i < maps.Length; i++) + { + Contracts.Assert(models[i].Predictor is IValueMapper); + var m = (IValueMapper)models[i].Predictor; + maps[i] = m.GetMapper, TOutput>(); + } + + // REVIEW: Should implement this better.... + var labels = new Single[100]; + var features = new VBuffer[100]; + int count = 0; + // REVIEW: Should this include bad values or filter them? + using (var cursor = new FloatLabelCursor(data, CursOpt.AllFeatures | CursOpt.AllLabels)) + { + TOutput[] predictions = new TOutput[maps.Length]; + var vBuffers = new VBuffer[maps.Length]; + while (cursor.MoveNext()) + { + Parallel.For(0, maps.Length, i => + { + var model = models[i]; + if (model.SelectedFeatures != null) + { + EnsembleUtils.SelectFeatures(ref cursor.Features, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); + maps[i](ref vBuffers[i], ref predictions[i]); + } + else + maps[i](ref cursor.Features, ref predictions[i]); + }); + + Utils.EnsureSize(ref labels, count + 1); + Utils.EnsureSize(ref features, count + 1); + labels[count] = cursor.Label; + FillFeatureBuffer(predictions, ref features[count]); + count++; + } + } + + ch.Info("The number of instances used for stacking trainer is {0}", count); + + var bldr = new ArrayDataViewBuilder(host); + Array.Resize(ref labels, count); + Array.Resize(ref features, count); + bldr.AddColumn(DefaultColumnNames.Label, NumberType.Float, labels); + bldr.AddColumn(DefaultColumnNames.Features, NumberType.Float, features); + + var view = bldr.GetDataView(); + var rmd = new RoleMappedData(view, DefaultColumnNames.Label, DefaultColumnNames.Features); + + var trainer = BasePredictorType.CreateInstance(host); + if (trainer.Info.NeedNormalization) + ch.Warning("The trainer specified for stacking wants normalization, but we do not currently allow this."); + Meta = trainer.Train(rmd); + CheckMeta(); + + ch.Done(); + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/IOutputCombiner.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/IOutputCombiner.cs new file mode 100644 index 0000000000..512974b717 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/IOutputCombiner.cs @@ -0,0 +1,71 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + /// + /// Signature for combiners. + /// + public delegate void SignatureCombiner(); + + public delegate void Combiner(ref TOutput dst, TOutput[] src, Single[] weights); + + public interface IOutputCombiner + { + } + + /// + /// Generic interface for combining outputs of multiple models + /// + public interface IOutputCombiner : IOutputCombiner + { + Combiner GetCombiner(); + } + + public interface IStackingTrainer + { + void Train(List>> models, RoleMappedData data, IHostEnvironment env); + Single ValidationDatasetProportion { get; } + } + + public interface IRegressionOutputCombiner : IOutputCombiner + { + } + + public interface IBinaryOutputCombiner : IOutputCombiner + { + } + + public interface IMultiClassOutputCombiner : IOutputCombiner> + { + } + + [TlcModule.ComponentKind("EnsembleMulticlassOutputCombiner")] + public interface ISupportMulticlassOutputCombinerFactory : IComponentFactory + { + } + + [TlcModule.ComponentKind("EnsembleBinaryOutputCombiner")] + public interface ISupportBinaryOutputCombinerFactory : IComponentFactory + { + + } + + [TlcModule.ComponentKind("EnsembleRegressionOutputCombiner")] + public interface ISupportRegressionOutputCombinerFactory : IComponentFactory + { + + } + + public interface IWeightedAverager + { + string WeightageMetricName { get; } + } + +} \ No newline at end of file diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/Median.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/Median.cs new file mode 100644 index 0000000000..de8d950de4 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/Median.cs @@ -0,0 +1,87 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(Median), null, typeof(SignatureCombiner), Median.UserName, Median.LoadName)] +[assembly: LoadableClass(typeof(Median), null, typeof(SignatureLoadModel), Median.UserName, Median.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + /// + /// Generic interface for combining outputs of multiple models + /// + public sealed class Median : IRegressionOutputCombiner, IBinaryOutputCombiner, ICanSaveModel + { + private readonly IHost _host; + public const string UserName = "Median"; + public const string LoadName = "Median"; + public const string LoaderSignature = "MedianCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "MEDICOMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + public Median(IHostEnvironment env) + { + Contracts.CheckValue(env, nameof(env)); + _host = env.Register(LoaderSignature); + } + + private Median(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.AssertValue(env); + _host = env.Register(LoaderSignature); + + // *** Binary format *** + // int: sizeof(Single) + int cbFloat = ctx.Reader.ReadInt32(); + _host.CheckDecode(cbFloat == sizeof(Single)); + } + + public static Median Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new Median(env, ctx); + } + + public void Save(ModelSaveContext ctx) + { + _host.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // int: sizeof(Float) + ctx.Writer.Write(sizeof(Single)); + } + + public Combiner GetCombiner() + { + return CombineCore; + } + + private void CombineCore(ref Single dst, Single[] src, Single[] weights) + { + // REVIEW: This mutates "src". We need to ensure that the documentation of + // combiners makes it clear that combiners are allowed to do this. Note that "normalization" + // in the multi-class case also mutates. + _host.AssertNonEmpty(src); + _host.Assert(weights == null || Utils.Size(weights) == Utils.Size(src)); + dst = MathUtils.GetMedianInPlace(src, src.Length); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/MultiAverage.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiAverage.cs new file mode 100644 index 0000000000..c147f932f3 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiAverage.cs @@ -0,0 +1,72 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(MultiAverage), typeof(MultiAverage.Arguments), typeof(SignatureCombiner), + Average.UserName, MultiAverage.LoadName)] +[assembly: LoadableClass(typeof(MultiAverage), null, typeof(SignatureLoadModel), Average.UserName, + MultiAverage.LoadName, MultiAverage.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public sealed class MultiAverage : BaseMultiAverager, ICanSaveModel + { + public const string LoadName = "MultiAverage"; + public const string LoaderSignature = "MultiAverageCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "MAVGCOMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + [TlcModule.Component(Name = LoadName, FriendlyName = Average.UserName)] + public sealed class Arguments : ArgumentsBase, ISupportMulticlassOutputCombinerFactory + { + public IMultiClassOutputCombiner CreateComponent(IHostEnvironment env) => new MultiAverage(env, this); + } + + public MultiAverage(IHostEnvironment env, Arguments args) + : base(env, LoaderSignature, args) + { + } + + private MultiAverage(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + } + + public static MultiAverage Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new MultiAverage(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public override Combiner> GetCombiner() + { + // Force the weights to null. + return + (ref VBuffer dst, VBuffer[] src, Single[] weights) => + CombineCore(ref dst, src, null); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/MultiMedian.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiMedian.cs new file mode 100644 index 0000000000..c3e6869d69 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiMedian.cs @@ -0,0 +1,102 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(MultiMedian), typeof(MultiMedian.Arguments), typeof(SignatureCombiner), + Median.UserName, MultiMedian.LoadName)] +[assembly: LoadableClass(typeof(MultiMedian), null, typeof(SignatureLoadModel), Median.UserName, MultiMedian.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + /// + /// Generic interface for combining outputs of multiple models + /// + public sealed class MultiMedian : BaseMultiCombiner, ICanSaveModel + { + public const string LoadName = "MultiMedian"; + public const string LoaderSignature = "MultiMedianCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "MMEDCOMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + [TlcModule.Component(Name = LoadName, FriendlyName = Median.UserName)] + public sealed class Arguments : ArgumentsBase, ISupportMulticlassOutputCombinerFactory + { + public IMultiClassOutputCombiner CreateComponent(IHostEnvironment env) => new MultiMedian(env, this); + } + + public MultiMedian(IHostEnvironment env, Arguments args) + : base(env, LoaderSignature, args) + { + } + + private MultiMedian(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + } + + public static MultiMedian Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new MultiMedian(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public override Combiner> GetCombiner() + { + Single[] raw = null; + return + (ref VBuffer dst, VBuffer[] src, Single[] weights) => + { + Host.AssertNonEmpty(src); + Host.Assert(weights == null || Utils.Size(weights) == Utils.Size(src)); + + int len = GetClassCount(src); + if (!TryNormalize(src)) + { + GetNaNOutput(ref dst, len); + return; + } + + var values = dst.Values; + if (Utils.Size(values) < len) + values = new Single[len]; + + int count = src.Length; + if (Utils.Size(raw) < count) + raw = new Single[count]; + for (int i = 0; i < len; i++) + { + for (int j = 0; j < count; j++) + raw[j] = i < src[j].Length ? src[j].GetItemOrDefault(i) : 0; + values[i] = MathUtils.GetMedianInPlace(raw, count); + } + + // Set the output to values. + dst = new VBuffer(len, values, dst.Indices); + }; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/MultiStacking.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiStacking.cs new file mode 100644 index 0000000000..2ef74c8169 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiStacking.cs @@ -0,0 +1,99 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(MultiStacking), typeof(MultiStacking.Arguments), typeof(SignatureCombiner), + Stacking.UserName, MultiStacking.LoadName)] + +[assembly: LoadableClass(typeof(MultiStacking), null, typeof(SignatureLoadModel), + Stacking.UserName, MultiStacking.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + using TVectorPredictor = IPredictorProducing>; + public sealed class MultiStacking : BaseStacking, SignatureMultiClassClassifierTrainer>, ICanSaveModel, IMultiClassOutputCombiner + { + public const string LoadName = "MultiStacking"; + public const string LoaderSignature = "MultiStackingCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "MSTACK C", + verWrittenCur: 0x00010001, // Initial + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + [TlcModule.Component(Name = LoadName, FriendlyName = Stacking.UserName)] + public sealed class Arguments : ArgumentsBase, ISupportMulticlassOutputCombinerFactory + { + public IMultiClassOutputCombiner CreateComponent(IHostEnvironment env) => new MultiStacking(env, this); + + public Arguments() + { + // REVIEW: Perhaps we can have a better non-parametetric learner. + BasePredictorType = new SubComponent, SignatureMultiClassClassifierTrainer>( + "OVA", "p=FastTreeBinaryClassification"); + } + } + + public MultiStacking(IHostEnvironment env, Arguments args) + : base(env, LoaderSignature, args) + { + } + + private MultiStacking(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + } + + public static MultiStacking Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new MultiStacking(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + protected override void FillFeatureBuffer(VBuffer[] src, ref VBuffer dst) + { + Contracts.AssertNonEmpty(src); + + // REVIEW: Would there be any value in ever making dst sparse? + int len = 0; + for (int i = 0; i < src.Length; i++) + len += src[i].Length; + + var values = dst.Values; + if (Utils.Size(values) < len) + values = new Single[len]; + dst = new VBuffer(len, values, dst.Indices); + + int iv = 0; + for (int i = 0; i < src.Length; i++) + { + src[i].CopyTo(values, iv); + iv += src[i].Length; + Contracts.Assert(iv <= len); + } + Contracts.Assert(iv == len); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/MultiVoting.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiVoting.cs new file mode 100644 index 0000000000..ee55b94c77 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiVoting.cs @@ -0,0 +1,109 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Runtime.Numeric; + +[assembly: LoadableClass(typeof(MultiVoting), null, typeof(SignatureCombiner), Voting.UserName, MultiVoting.LoadName)] +[assembly: LoadableClass(typeof(MultiVoting), null, typeof(SignatureLoadModel), Voting.UserName, MultiVoting.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + // REVIEW: Why is MultiVoting based on BaseMultiCombiner? Normalizing the model outputs + // is senseless, so the base adds no real functionality. + public sealed class MultiVoting : BaseMultiCombiner, ICanSaveModel + { + public const string LoadName = "MultiVoting"; + public const string LoaderSignature = "MultiVotingCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "MVOTCOMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + private sealed class Arguments : ArgumentsBase + { + } + + public MultiVoting(IHostEnvironment env) + : base(env, LoaderSignature, new Arguments() { Normalize = false }) + { + Host.Assert(!Normalize); + } + + private MultiVoting(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + Host.CheckDecode(!Normalize); + } + + public static MultiVoting Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new MultiVoting(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + Contracts.Assert(!Normalize); + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public override Combiner> GetCombiner() + { + return CombineCore; + } + + private void CombineCore(ref VBuffer dst, VBuffer[] src, Single[] weights = null) + { + Host.AssertNonEmpty(src); + Host.Assert(weights == null || Utils.Size(weights) == Utils.Size(src)); + + int count = Utils.Size(src); + if (count == 0) + { + dst = new VBuffer(0, dst.Values, dst.Indices); + return; + } + + int len = GetClassCount(src); + var values = dst.Values; + if (Utils.Size(values) < len) + values = new Single[len]; + else + Array.Clear(values, 0, len); + + int voteCount = 0; + for (int i = 0; i < count; i++) + { + int index = VectorUtils.ArgMax(ref src[i]); + if (index >= 0) + { + values[index]++; + voteCount++; + } + } + + // Normalize by dividing by the number of votes. + for (int i = 0; i < len; i++) + values[i] /= voteCount; + + // Set the output to values. + dst = new VBuffer(len, values, dst.Indices); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/MultiWeightedAverage.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiWeightedAverage.cs new file mode 100644 index 0000000000..9bda1d151a --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/MultiWeightedAverage.cs @@ -0,0 +1,104 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(MultiWeightedAverage), typeof(MultiWeightedAverage.Arguments), typeof(SignatureCombiner), + MultiWeightedAverage.UserName, MultiWeightedAverage.LoadName)] + +[assembly: LoadableClass(typeof(MultiWeightedAverage), null, typeof(SignatureLoadModel), + MultiWeightedAverage.UserName, MultiWeightedAverage.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + /// + /// Generic interface for combining outputs of multiple models + /// + public sealed class MultiWeightedAverage : BaseMultiAverager, IWeightedAverager, ICanSaveModel + { + public const string UserName = "Multi Weighted Average"; + public const string LoadName = "MultiWeightedAverage"; + public const string LoaderSignature = "MultiWeightedAverageComb"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "MWAVCOMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportMulticlassOutputCombinerFactory + { + IMultiClassOutputCombiner IComponentFactory.CreateComponent(IHostEnvironment env) => new MultiWeightedAverage(env, this); + + [Argument(ArgumentType.AtMostOnce, HelpText = "The metric type to be used to find the weights for each model", ShortName = "wn", SortOrder = 50)] + [TGUI(Label = "Metric Name", Description = "The weights are calculated according to the selected metric")] + public MultiWeightageKind WeightageName = MultiWeightageKind.AccuracyMicroAvg; + } + + private readonly MultiWeightageKind _weightageKind; + public string WeightageMetricName { get { return _weightageKind.ToString(); } } + + public MultiWeightedAverage(IHostEnvironment env, Arguments args) + : base(env, LoaderSignature, args) + { + _weightageKind = args.WeightageName; + Host.CheckUserArg(Enum.IsDefined(typeof(MultiWeightageKind), _weightageKind), nameof(args.WeightageName)); + } + + private MultiWeightedAverage(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + // *** Binary format *** + // int: _weightageKind + + _weightageKind = (MultiWeightageKind)ctx.Reader.ReadInt32(); + Host.CheckDecode(Enum.IsDefined(typeof(MultiWeightageKind), _weightageKind)); + } + + public static MultiWeightedAverage Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new MultiWeightedAverage(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + // *** Binary format *** + // int: _weightageKind + + Host.Assert(Enum.IsDefined(typeof(MultiWeightageKind), _weightageKind)); + ctx.Writer.Write((int)_weightageKind); + } + + public override Combiner> GetCombiner() + { + return CombineCore; + } + } + + // These values are serialized, so should not be changed. + public enum MultiWeightageKind + { + [TGUI(Label = MultiClassClassifierEvaluator.AccuracyMicro)] + AccuracyMicroAvg = 0, + [TGUI(Label = MultiClassClassifierEvaluator.AccuracyMacro)] + AccuracyMacroAvg = 1 + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/RegressionStacking.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/RegressionStacking.cs new file mode 100644 index 0000000000..0b5f8e6057 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/RegressionStacking.cs @@ -0,0 +1,72 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(RegressionStacking), typeof(RegressionStacking.Arguments), typeof(SignatureCombiner), + Stacking.UserName, RegressionStacking.LoadName)] + +[assembly: LoadableClass(typeof(RegressionStacking), null, typeof(SignatureLoadModel), + Stacking.UserName, RegressionStacking.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + using TScalarPredictor = IPredictorProducing; + + public sealed class RegressionStacking : BaseScalarStacking, IRegressionOutputCombiner, ICanSaveModel + { + public const string LoadName = "RegressionStacking"; + public const string LoaderSignature = "RegressionStacking"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "RSTACK C", + verWrittenCur: 0x00010001, // Initial + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + [TlcModule.Component(Name = LoadName, FriendlyName = Stacking.UserName)] + public sealed class Arguments : ArgumentsBase, ISupportRegressionOutputCombinerFactory + { + public Arguments() + { + BasePredictorType = new SubComponent, SignatureRegressorTrainer>("FastTreeRegression"); + } + + public IRegressionOutputCombiner CreateComponent(IHostEnvironment env) => new RegressionStacking(env, this); + } + + public RegressionStacking(IHostEnvironment env, Arguments args) + : base(env, LoaderSignature, args) + { + } + + private RegressionStacking(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + } + + public static RegressionStacking Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new RegressionStacking(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/Stacking.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/Stacking.cs new file mode 100644 index 0000000000..f3481e9936 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/Stacking.cs @@ -0,0 +1,70 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(Stacking), typeof(Stacking.Arguments), typeof(SignatureCombiner), Stacking.UserName, Stacking.LoadName)] +[assembly: LoadableClass(typeof(Stacking), null, typeof(SignatureLoadModel), Stacking.UserName, Stacking.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + using TScalarPredictor = IPredictorProducing; + public sealed class Stacking : BaseScalarStacking, IBinaryOutputCombiner, ICanSaveModel + { + public const string UserName = "Stacking"; + public const string LoadName = "Stacking"; + public const string LoaderSignature = "StackingCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: " STACK C", + verWrittenCur: 0x00010001, // Initial + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportBinaryOutputCombinerFactory + { + public Arguments() + { + BasePredictorType = new SubComponent, SignatureBinaryClassifierTrainer>("FastTreeBinaryClassification"); + } + + public IBinaryOutputCombiner CreateComponent(IHostEnvironment env) => new Stacking(env, this); + } + + public Stacking(IHostEnvironment env, Arguments args) + : base(env, LoaderSignature, args) + { + } + + private Stacking(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + } + + public static Stacking Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new Stacking(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/Voting.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/Voting.cs new file mode 100644 index 0000000000..932f99d93a --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/Voting.cs @@ -0,0 +1,94 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(Voting), null, typeof(SignatureCombiner), Voting.UserName, Voting.LoadName)] +[assembly: LoadableClass(typeof(Voting), null, typeof(SignatureLoadModel), Voting.UserName, Voting.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public sealed class Voting : IBinaryOutputCombiner, ICanSaveModel + { + private readonly IHost _host; + public const string UserName = "Voting"; + public const string LoadName = "Voting"; + public const string LoaderSignature = "VotingCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "VOT COMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + public Voting(IHostEnvironment env) + { + Contracts.CheckValue(env, nameof(env)); + _host = env.Register(LoaderSignature); + } + + private Voting(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.AssertValue(env); + _host = env.Register(LoaderSignature); + _host.AssertValue(ctx); + + // *** Binary format *** + // int: sizeof(Single) + int cbFloat = ctx.Reader.ReadInt32(); + _host.CheckDecode(cbFloat == sizeof(Single)); + } + + public static Voting Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new Voting(env, ctx); + } + + public void Save(ModelSaveContext ctx) + { + _host.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // int: sizeof(Single) + ctx.Writer.Write(sizeof(Single)); + } + + public Combiner GetCombiner() + { + return CombineCore; + } + + private void CombineCore(ref Single dst, Single[] src, Single[] weights) + { + _host.AssertNonEmpty(src); + _host.Assert(weights == null || Utils.Size(weights) == Utils.Size(src)); + + int len = Utils.Size(src); + int pos = 0; + int neg = 0; + for (int i = 0; i < src.Length; i++) + { + var v = src[i]; + if (v > 0) + pos++; + else if (v <= 0) + neg++; + } + dst = (Single)(pos - neg) / (pos + neg); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/WeightedAverage.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/WeightedAverage.cs new file mode 100644 index 0000000000..8b16ffd0a2 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/WeightedAverage.cs @@ -0,0 +1,111 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(WeightedAverage), typeof(WeightedAverage.Arguments), typeof(SignatureCombiner), + WeightedAverage.UserName, WeightedAverage.LoadName)] + +[assembly: LoadableClass(typeof(WeightedAverage), null, typeof(SignatureLoadModel), + WeightedAverage.UserName, WeightedAverage.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble.OutputCombiners +{ + public sealed class WeightedAverage : BaseAverager, IWeightedAverager, ICanSaveModel + { + public const string UserName = "Weighted Average"; + public const string LoadName = "WeightedAverage"; + public const string LoaderSignature = "WeightedAverageCombiner"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "WAVGCOMB", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments: ISupportBinaryOutputCombinerFactory + { + [Argument(ArgumentType.AtMostOnce, HelpText = "The metric type to be used to find the weights for each model", ShortName = "wn", SortOrder = 50)] + [TGUI(Label = "Weightage Name", Description = "The weights are calculated according to the selected metric")] + public WeightageKind WeightageName = WeightageKind.Auc; + + public IBinaryOutputCombiner CreateComponent(IHostEnvironment env) => new WeightedAverage(env, this); + } + + private WeightageKind _weightageKind; + + public string WeightageMetricName { get { return _weightageKind.ToString(); } } + + public WeightedAverage(IHostEnvironment env, Arguments args) + : base(env, LoaderSignature) + { + _weightageKind = args.WeightageName; + Host.CheckUserArg(Enum.IsDefined(typeof(WeightageKind), _weightageKind), nameof(args.WeightageName)); + } + + private WeightedAverage(IHostEnvironment env, ModelLoadContext ctx) + : base(env, LoaderSignature, ctx) + { + // *** Binary format *** + // int: _weightageKind + _weightageKind = (WeightageKind)ctx.Reader.ReadInt32(); + Host.CheckDecode(Enum.IsDefined(typeof(WeightageKind), _weightageKind)); + } + + public static WeightedAverage Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new WeightedAverage(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // int: _weightageKind + + Contracts.Assert(Enum.IsDefined(typeof(WeightageKind), _weightageKind)); + ctx.Writer.Write((int)_weightageKind); + } + + public override Combiner GetCombiner() + { + return CombineCore; + } + } + + // These values are serialized, so should not be changed. + public enum WeightageKind + { + [TGUI(Label = BinaryClassifierEvaluator.Accuracy)] + Accuracy = 0, + [TGUI(Label = BinaryClassifierEvaluator.Auc)] + Auc = 1, + [TGUI(Label = BinaryClassifierEvaluator.PosPrecName)] + PosPrecision = 2, + [TGUI(Label = BinaryClassifierEvaluator.PosRecallName)] + PosRecall = 3, + [TGUI(Label = BinaryClassifierEvaluator.NegPrecName)] + NegPrecision = 4, + [TGUI(Label = BinaryClassifierEvaluator.NegRecallName)] + NegRecall = 5, + } + +} diff --git a/src/Microsoft.ML.Ensemble/PipelineEnsemble.cs b/src/Microsoft.ML.Ensemble/PipelineEnsemble.cs new file mode 100644 index 0000000000..3ac78ed91e --- /dev/null +++ b/src/Microsoft.ML.Ensemble/PipelineEnsemble.cs @@ -0,0 +1,749 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Calibration; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(SchemaBindablePipelineEnsembleBase), null, typeof(SignatureLoadModel), + SchemaBindablePipelineEnsembleBase.UserName, SchemaBindablePipelineEnsembleBase.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble +{ + /// + /// This class represents an ensemble predictor, where each predictor has its own featurization pipeline. It is + /// useful for the distributed training scenario, where the featurization includes trainable transforms (for example, + /// categorical transform, or normalization). + /// + public abstract class SchemaBindablePipelineEnsembleBase : ICanGetTrainingLabelNames, ICanSaveModel, + ISchemaBindableMapper, ICanSaveSummary, ICanGetSummaryInKeyValuePairs + { + private abstract class BoundBase : ISchemaBoundRowMapper + { + protected readonly SchemaBindablePipelineEnsembleBase Parent; + private readonly HashSet _inputColIndices; + + protected readonly ISchemaBoundRowMapper[] Mappers; + protected readonly IRowToRowMapper[] BoundPipelines; + protected readonly int[] ScoreCols; + + public ISchemaBindableMapper Bindable => Parent; + public RoleMappedSchema InputSchema { get; } + public ISchema OutputSchema { get; } + + public BoundBase(SchemaBindablePipelineEnsembleBase parent, RoleMappedSchema schema) + { + Parent = parent; + InputSchema = schema; + OutputSchema = new ScoreMapperSchema(Parent.ScoreType, Parent._scoreColumnKind); + _inputColIndices = new HashSet(); + for (int i = 0; i < Parent._inputCols.Length; i++) + { + var name = Parent._inputCols[i]; + if (!InputSchema.Schema.TryGetColumnIndex(name, out int col)) + throw Parent.Host.Except("Schema does not contain required input column '{0}'", name); + _inputColIndices.Add(col); + } + + Mappers = new ISchemaBoundRowMapper[Parent.PredictorModels.Length]; + BoundPipelines = new IRowToRowMapper[Parent.PredictorModels.Length]; + ScoreCols = new int[Parent.PredictorModels.Length]; + for (int i = 0; i < Mappers.Length; i++) + { + // Get the RoleMappedSchema to pass to the predictor. + var emptyDv = new EmptyDataView(Parent.Host, schema.Schema); + Parent.PredictorModels[i].PrepareData(Parent.Host, emptyDv, out RoleMappedData rmd, out IPredictor predictor); + + // Get the predictor as a bindable mapper, and bind it to the RoleMappedSchema found above. + var bindable = ScoreUtils.GetSchemaBindableMapper(Parent.Host, Parent.PredictorModels[i].Predictor, null); + Mappers[i] = bindable.Bind(Parent.Host, rmd.Schema) as ISchemaBoundRowMapper; + if (Mappers[i] == null) + throw Parent.Host.Except("Predictor {0} is not a row to row mapper", i); + + // Make sure there is a score column, and remember its index. + if (!Mappers[i].OutputSchema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out ScoreCols[i])) + throw Parent.Host.Except("Predictor {0} does not contain a score column", i); + + // Get the pipeline. + var dv = new EmptyDataView(Parent.Host, schema.Schema); + var tm = new TransformModel(Parent.Host, dv, dv); + var pipeline = Parent.PredictorModels[i].TransformModel.Apply(Parent.Host, tm); + BoundPipelines[i] = pipeline.AsRowToRowMapper(Parent.Host); + if (BoundPipelines[i] == null) + throw Parent.Host.Except("Transform pipeline {0} contains transforms that do not implement IRowToRowMapper", i); + } + } + + public Func GetDependencies(Func predicate) + { + for (int i = 0; i < OutputSchema.ColumnCount; i++) + { + if (predicate(i)) + return col => _inputColIndices.Contains(col); + } + return col => false; + } + + public IEnumerable> GetInputColumnRoles() + { + yield break; + } + + public IRow GetOutputRow(IRow input, Func predicate, out Action disposer) + { + return new SimpleRow(OutputSchema, input, new[] { CreateScoreGetter(input, predicate, out disposer) }); + } + + public abstract Delegate CreateScoreGetter(IRow input, Func mapperPredicate, out Action disposer); + } + + // A generic base class for pipeline ensembles. This class contains the combiner. + private abstract class SchemaBindablePipelineEnsemble : SchemaBindablePipelineEnsembleBase, IPredictorProducing + { + protected sealed class Bound : BoundBase + { + private readonly IOutputCombiner _combiner; + + public Bound(SchemaBindablePipelineEnsemble parent, RoleMappedSchema schema) + : base(parent, schema) + { + _combiner = parent.Combiner; + } + + public override Delegate CreateScoreGetter(IRow input, Func mapperPredicate, out Action disposer) + { + disposer = null; + + if (!mapperPredicate(0)) + return null; + + var getters = new ValueGetter[Mappers.Length]; + for (int i = 0; i < Mappers.Length; i++) + { + // First get the output row from the pipelines. The input predicate of the predictor + // is the output predicate of the pipeline. + var inputPredicate = Mappers[i].GetDependencies(mapperPredicate); + var pipelineRow = BoundPipelines[i].GetRow(input, inputPredicate, out Action disp); + disposer += disp; + + // Next we get the output row from the predictors. We activate the score column as output predicate. + var predictorRow = Mappers[i].GetOutputRow(pipelineRow, col => col == ScoreCols[i], out disp); + disposer += disp; + getters[i] = predictorRow.GetGetter(ScoreCols[i]); + } + + var comb = _combiner.GetCombiner(); + var buffer = new T[Mappers.Length]; + ValueGetter scoreGetter = + (ref T dst) => + { + for (int i = 0; i < Mappers.Length; i++) + getters[i](ref buffer[i]); + comb(ref dst, buffer, null); + }; + return scoreGetter; + } + + public ValueGetter GetLabelGetter(IRow input, int i, out Action disposer) + { + Parent.Host.Assert(0 <= i && i < Mappers.Length); + Parent.Host.Check(Mappers[i].InputSchema.Label != null, "Mapper was not trained using a label column"); + + // The label should be in the output row of the i'th pipeline + var pipelineRow = BoundPipelines[i].GetRow(input, col => col == Mappers[i].InputSchema.Label.Index, out disposer); + return RowCursorUtils.GetLabelGetter(pipelineRow, Mappers[i].InputSchema.Label.Index); + } + + public ValueGetter GetWeightGetter(IRow input, int i, out Action disposer) + { + Parent.Host.Assert(0 <= i && i < Mappers.Length); + + if (Mappers[i].InputSchema.Weight == null) + { + ValueGetter weight = (ref Single dst) => dst = 1; + disposer = null; + return weight; + } + // The weight should be in the output row of the i'th pipeline if it exists. + var inputPredicate = Mappers[i].GetDependencies(col => col == Mappers[i].InputSchema.Weight.Index); + var pipelineRow = BoundPipelines[i].GetRow(input, inputPredicate, out disposer); + return pipelineRow.GetGetter(Mappers[i].InputSchema.Weight.Index); + } + } + + protected readonly IOutputCombiner Combiner; + + protected SchemaBindablePipelineEnsemble(IHostEnvironment env, IPredictorModel[] predictors, + IOutputCombiner combiner, string registrationName, string scoreColumnKind) + : base(env, predictors, registrationName, scoreColumnKind) + { + Combiner = combiner; + } + + protected SchemaBindablePipelineEnsemble(IHostEnvironment env, ModelLoadContext ctx, string scoreColumnKind) + : base(env, ctx, scoreColumnKind) + { + // *** Binary format *** + // + // The combiner + + ctx.LoadModel, SignatureLoadModel>(Host, out Combiner, "Combiner"); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + Host.AssertValue(ctx); + + // *** Binary format *** + // + // The combiner + + ctx.SaveModel(Combiner, "Combiner"); + } + + public override ISchemaBoundMapper Bind(IHostEnvironment env, RoleMappedSchema schema) + { + return new Bound(this, schema); + } + } + + // This is an implementation of pipeline ensembles that combines scores of type float (regression and anomaly detection). + private sealed class ImplOne : SchemaBindablePipelineEnsemble + { + protected override ColumnType ScoreType => NumberType.R4; + + public override PredictionKind PredictionKind + { + get + { + if (_scoreColumnKind == MetadataUtils.Const.ScoreColumnKind.Regression) + return PredictionKind.Regression; + if (_scoreColumnKind == MetadataUtils.Const.ScoreColumnKind.AnomalyDetection) + return PredictionKind.AnomalyDetection; + throw Host.Except("Unknown prediction kind"); + } + } + + public ImplOne(IHostEnvironment env, IPredictorModel[] predictors, IRegressionOutputCombiner combiner, string scoreColumnKind) + : base(env, predictors, combiner, LoaderSignature, scoreColumnKind) + { + } + + public ImplOne(IHostEnvironment env, ModelLoadContext ctx, string scoreColumnKind) + : base(env, ctx, scoreColumnKind) + { + } + } + + // This is an implementation of pipeline ensemble that combines scores of type vectors of float (multi-class). + private sealed class ImplVec : SchemaBindablePipelineEnsemble> + { + protected override ColumnType ScoreType { get { return _scoreType; } } + + public override PredictionKind PredictionKind + { + get + { + if (_scoreColumnKind == MetadataUtils.Const.ScoreColumnKind.MultiClassClassification) + return PredictionKind.MultiClassClassification; + throw Host.Except("Unknown prediction kind"); + } + } + + private readonly VectorType _scoreType; + + public ImplVec(IHostEnvironment env, IPredictorModel[] predictors, IMultiClassOutputCombiner combiner) + : base(env, predictors, combiner, LoaderSignature, MetadataUtils.Const.ScoreColumnKind.MultiClassClassification) + { + int classCount = CheckLabelColumn(Host, predictors, false); + _scoreType = new VectorType(NumberType.R4, classCount); + } + + public ImplVec(IHostEnvironment env, ModelLoadContext ctx, string scoreColumnKind) + : base(env, ctx, scoreColumnKind) + { + int classCount = CheckLabelColumn(Host, PredictorModels, false); + _scoreType = new VectorType(NumberType.R4, classCount); + } + } + + // This is an implementation of pipeline ensembles that combines scores of type float, and also provides calibration (for binary classification). + private sealed class ImplOneWithCalibrator : SchemaBindablePipelineEnsemble, ISelfCalibratingPredictor + { + protected override ColumnType ScoreType { get { return NumberType.R4; } } + + public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } + + public ImplOneWithCalibrator(IHostEnvironment env, IPredictorModel[] predictors, IBinaryOutputCombiner combiner) + : base(env, predictors, combiner, LoaderSignature, MetadataUtils.Const.ScoreColumnKind.BinaryClassification) + { + Host.Assert(_scoreColumnKind == MetadataUtils.Const.ScoreColumnKind.BinaryClassification); + CheckBinaryLabel(true, Host, PredictorModels); + } + + public ImplOneWithCalibrator(IHostEnvironment env, ModelLoadContext ctx, string scoreColumnKind) + : base(env, ctx, scoreColumnKind) + { + Host.Assert(_scoreColumnKind == MetadataUtils.Const.ScoreColumnKind.BinaryClassification); + CheckBinaryLabel(false, Host, PredictorModels); + } + + private static void CheckBinaryLabel(bool user, IHostEnvironment env, IPredictorModel[] predictors) + { + int classCount = CheckLabelColumn(env, predictors, true); + if (classCount != 2) + { + var error = string.Format("Expected label to have exactly 2 classes, instead has {0}", classCount); + throw user ? env.ExceptParam(nameof(predictors), error) : env.ExceptDecode(error); + } + } + + public IPredictor Calibrate(IChannel ch, IDataView data, ICalibratorTrainer caliTrainer, int maxRows) + { + Host.CheckValue(ch, nameof(ch)); + ch.CheckValue(data, nameof(data)); + ch.CheckValue(caliTrainer, nameof(caliTrainer)); + + if (caliTrainer.NeedsTraining) + { + var bound = new Bound(this, new RoleMappedSchema(data.Schema)); + using (var curs = data.GetRowCursor(col => true)) + { + var scoreGetter = (ValueGetter)bound.CreateScoreGetter(curs, col => true, out Action disposer); + + // We assume that we can use the label column of the first predictor, since if the labels are not identical + // then the whole model is garbage anyway. + var labelGetter = bound.GetLabelGetter(curs, 0, out Action disp); + disposer += disp; + var weightGetter = bound.GetWeightGetter(curs, 0, out disp); + disposer += disp; + try + { + int num = 0; + while (curs.MoveNext()) + { + Single label = 0; + labelGetter(ref label); + if (!FloatUtils.IsFinite(label)) + continue; + Single score = 0; + scoreGetter(ref score); + if (!FloatUtils.IsFinite(score)) + continue; + Single weight = 0; + weightGetter(ref weight); + if (!FloatUtils.IsFinite(weight)) + continue; + + caliTrainer.ProcessTrainingExample(score, label > 0, weight); + + if (maxRows > 0 && ++num >= maxRows) + break; + } + } + finally + { + disposer?.Invoke(); + } + } + } + + var calibrator = caliTrainer.FinishTraining(ch); + return CalibratorUtils.CreateCalibratedPredictor(Host, this, calibrator); + } + } + + private readonly string[] _inputCols; + + protected readonly IHost Host; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "PIPELNEN", + //verWrittenCur: 0x00010001, // Initial + verWrittenCur: 0x00010002, // Save predictor models in a subdirectory + verReadableCur: 0x00010002, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + public const string UserName = "Pipeline Ensemble"; + public const string LoaderSignature = "PipelineEnsemble"; + + private readonly string _scoreColumnKind; + + protected abstract ColumnType ScoreType { get; } + + public abstract PredictionKind PredictionKind { get; } + + internal IPredictorModel[] PredictorModels { get; } + + private SchemaBindablePipelineEnsembleBase(IHostEnvironment env, IPredictorModel[] predictors, string registrationName, string scoreColumnKind) + { + Contracts.CheckValue(env, nameof(env)); + Host = env.Register(registrationName); + Host.CheckNonEmpty(predictors, nameof(predictors)); + Host.CheckNonWhiteSpace(scoreColumnKind, nameof(scoreColumnKind)); + + PredictorModels = predictors; + _scoreColumnKind = scoreColumnKind; + + HashSet inputCols = null; + for (int i = 0; i < predictors.Length; i++) + { + var predModel = predictors[i]; + + // Get the input column names. + var inputSchema = predModel.TransformModel.InputSchema; + if (inputCols == null) + { + inputCols = new HashSet(); + for (int j = 0; j < inputSchema.ColumnCount; j++) + { + if (inputSchema.IsHidden(j)) + continue; + inputCols.Add(inputSchema.GetColumnName(j)); + } + _inputCols = inputCols.ToArray(); + } + else + { + int nonHiddenCols = 0; + for (int j = 0; j < inputSchema.ColumnCount; j++) + { + if (inputSchema.IsHidden(j)) + continue; + var name = inputSchema.GetColumnName(j); + if (!inputCols.Contains(name)) + throw Host.Except("Inconsistent schemas: Some schemas do not contain the column '{0}'", name); + nonHiddenCols++; + } + Host.Check(nonHiddenCols == _inputCols.Length, + "Inconsistent schemas: not all schemas have the same number of columns"); + } + } + } + + protected SchemaBindablePipelineEnsembleBase(IHostEnvironment env, ModelLoadContext ctx, string scoreColumnKind) + { + Host = env.Register(LoaderSignature); + Host.AssertNonEmpty(scoreColumnKind); + + _scoreColumnKind = scoreColumnKind; + + // *** Binary format *** + // int: id of _scoreColumnKind (loaded in the Create method) + // int: number of predictors + // The predictor models + // int: the number of input columns + // for each input column: + // int: id of the column name + + var length = ctx.Reader.ReadInt32(); + Host.CheckDecode(length > 0); + PredictorModels = new IPredictorModel[length]; + for (int i = 0; i < PredictorModels.Length; i++) + { + string dir = + ctx.Header.ModelVerWritten == 0x00010001 + ? "PredictorModels" + : Path.Combine(ctx.Directory, "PredictorModels"); + using (var ent = ctx.Repository.OpenEntry(dir, $"PredictorModel_{i:000}")) + PredictorModels[i] = new PredictorModel(Host, ent.Stream); + } + + length = ctx.Reader.ReadInt32(); + Host.CheckDecode(length >= 0); + _inputCols = new string[length]; + for (int i = 0; i < length; i++) + _inputCols[i] = ctx.LoadNonEmptyString(); + } + + public void Save(ModelSaveContext ctx) + { + Host.AssertValue(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // int: id of _scoreColumnKind (loaded in the Create method) + // int: number of predictors + // The predictor models + // int: the number of input columns + // for each input column: + // int: id of the column name + + ctx.SaveNonEmptyString(_scoreColumnKind); + + Host.AssertNonEmpty(PredictorModels); + ctx.Writer.Write(PredictorModels.Length); + + for (int i = 0; i < PredictorModels.Length; i++) + { + var dir = Path.Combine(ctx.Directory, "PredictorModels"); + using (var ent = ctx.Repository.CreateEntry(dir, $"PredictorModel_{i:000}")) + PredictorModels[i].Save(Host, ent.Stream); + } + + Contracts.AssertValue(_inputCols); + ctx.Writer.Write(_inputCols.Length); + foreach (var name in _inputCols) + ctx.SaveNonEmptyString(name); + + SaveCore(ctx); + } + + protected abstract void SaveCore(ModelSaveContext ctx); + + public static SchemaBindablePipelineEnsembleBase Create(IHostEnvironment env, IPredictorModel[] predictors, IOutputCombiner combiner, string scoreColumnKind) + { + switch (scoreColumnKind) + { + case MetadataUtils.Const.ScoreColumnKind.BinaryClassification: + var binaryCombiner = combiner as IBinaryOutputCombiner; + if (binaryCombiner == null) + throw env.Except("Combiner type incompatible with score column kind"); + return new ImplOneWithCalibrator(env, predictors, binaryCombiner); + case MetadataUtils.Const.ScoreColumnKind.Regression: + case MetadataUtils.Const.ScoreColumnKind.AnomalyDetection: + var regressionCombiner = combiner as IRegressionOutputCombiner; + if (regressionCombiner == null) + throw env.Except("Combiner type incompatible with score column kind"); + return new ImplOne(env, predictors, regressionCombiner, scoreColumnKind); + case MetadataUtils.Const.ScoreColumnKind.MultiClassClassification: + var vectorCombiner = combiner as IMultiClassOutputCombiner; + if (vectorCombiner == null) + throw env.Except("Combiner type incompatible with score column kind"); + return new ImplVec(env, predictors, vectorCombiner); + default: + throw env.Except("Unknown score kind"); + } + } + + public static SchemaBindablePipelineEnsembleBase Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + + var scoreColumnKind = ctx.LoadNonEmptyString(); + switch (scoreColumnKind) + { + case MetadataUtils.Const.ScoreColumnKind.BinaryClassification: + return new ImplOneWithCalibrator(env, ctx, scoreColumnKind); + case MetadataUtils.Const.ScoreColumnKind.Regression: + case MetadataUtils.Const.ScoreColumnKind.AnomalyDetection: + return new ImplOne(env, ctx, scoreColumnKind); + case MetadataUtils.Const.ScoreColumnKind.MultiClassClassification: + return new ImplVec(env, ctx, scoreColumnKind); + default: + throw env.Except("Unknown score kind"); + } + } + + public abstract ISchemaBoundMapper Bind(IHostEnvironment env, RoleMappedSchema schema); + + public void SaveSummary(TextWriter writer, RoleMappedSchema schema) + { + for (int i = 0; i < PredictorModels.Length; i++) + { + writer.WriteLine("Partition model {0} summary:", i); + + if (!(PredictorModels[i].Predictor is ICanSaveSummary summaryModel)) + { + writer.WriteLine("Model of type {0}", PredictorModels[i].Predictor.GetType().Name); + continue; + } + + // Load the feature names for the i'th model. + var dv = new EmptyDataView(Host, PredictorModels[i].TransformModel.InputSchema); + PredictorModels[i].PrepareData(Host, dv, out RoleMappedData rmd, out IPredictor pred); + summaryModel.SaveSummary(writer, rmd.Schema); + } + } + + // Checks that the predictors have matching label columns, and returns the number of classes in all predictors. + protected static int CheckLabelColumn(IHostEnvironment env, IPredictorModel[] models, bool isBinary) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckNonEmpty(models, nameof(models)); + + var model = models[0]; + var edv = new EmptyDataView(env, model.TransformModel.InputSchema); + model.PrepareData(env, edv, out RoleMappedData rmd, out IPredictor pred); + var labelInfo = rmd.Schema.Label; + if (labelInfo == null) + throw env.Except("Training schema for model 0 does not have a label column"); + + var labelType = rmd.Schema.Schema.GetColumnType(rmd.Schema.Label.Index); + if (!labelType.IsKey) + return CheckNonKeyLabelColumnCore(env, pred, models, isBinary, labelType); + + if (isBinary && labelType.KeyCount != 2) + throw env.Except("Label is not binary"); + var schema = rmd.Schema.Schema; + var mdType = schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.KeyValues, labelInfo.Index); + if (mdType == null || !mdType.IsKnownSizeVector) + throw env.Except("Label column of type key must have a vector of key values metadata"); + + return Utils.MarshalInvoke(CheckKeyLabelColumnCore, mdType.ItemType.RawType, env, models, labelType.AsKey, schema, labelInfo.Index, mdType); + } + + // When the label column is not a key, we check that the number of classes is the same for all the predictors, by checking the + // OutputType property of the IValueMapper. + // If any of the predictors do not implement IValueMapper we throw an exception. Returns the class count. + private static int CheckNonKeyLabelColumnCore(IHostEnvironment env, IPredictor pred, IPredictorModel[] models, bool isBinary, ColumnType labelType) + { + env.Assert(!labelType.IsKey); + env.AssertNonEmpty(models); + + if (isBinary) + return 2; + + // The label is numeric, we just have to check that the number of classes is the same. + if (!(pred is IValueMapper vm)) + throw env.Except("Cannot determine the number of classes the predictor outputs"); + var classCount = vm.OutputType.VectorSize; + + for (int i = 1; i < models.Length; i++) + { + var model = models[i]; + var edv = new EmptyDataView(env, model.TransformModel.InputSchema); + model.PrepareData(env, edv, out RoleMappedData rmd, out pred); + vm = pred as IValueMapper; + if (vm.OutputType.VectorSize != classCount) + throw env.Except("Label of model {0} has different number of classes than model 0", i); + } + return classCount; + } + + // Checks that all the label columns of the model have the same key type as their label column - including the same + // cardinality and the same key values, and returns the cardinality of the label column key. + private static int CheckKeyLabelColumnCore(IHostEnvironment env, IPredictorModel[] models, KeyType labelType, ISchema schema, int labelIndex, ColumnType keyValuesType) + where T : IEquatable + { + env.Assert(keyValuesType.ItemType.RawType == typeof(T)); + env.AssertNonEmpty(models); + var labelNames = default(VBuffer); + schema.GetMetadata(MetadataUtils.Kinds.KeyValues, labelIndex, ref labelNames); + var classCount = labelNames.Length; + + var curLabelNames = default(VBuffer); + for (int i = 1; i < models.Length; i++) + { + var model = models[i]; + var edv = new EmptyDataView(env, model.TransformModel.InputSchema); + model.PrepareData(env, edv, out RoleMappedData rmd, out IPredictor pred); + var labelInfo = rmd.Schema.Label; + if (labelInfo == null) + throw env.Except("Training schema for model {0} does not have a label column", i); + + var curLabelType = rmd.Schema.Schema.GetColumnType(rmd.Schema.Label.Index); + if (!labelType.Equals(curLabelType.AsKey)) + throw env.Except("Label column of model {0} has different type than model 0", i); + + var mdType = rmd.Schema.Schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.KeyValues, labelInfo.Index); + if (!mdType.Equals(keyValuesType)) + throw env.Except("Label column of model {0} has different key value type than model 0", i); + rmd.Schema.Schema.GetMetadata(MetadataUtils.Kinds.KeyValues, labelInfo.Index, ref curLabelNames); + if (!AreEqual(ref labelNames, ref curLabelNames)) + throw env.Except("Label of model {0} has different values than model 0", i); + } + return classCount; + } + + private static bool AreEqual(ref VBuffer v1, ref VBuffer v2) + where T : IEquatable + { + if (v1.Length != v2.Length) + return false; + return v1.DenseValues().Zip(v2.DenseValues(), (x1, x2) => x1.Equals(x2)).All(b => b); + } + + /// + /// This method outputs a Key-Value Pair (kvp) per model in the ensemble. + /// * The key is the model number such as "Partition model 0 summary". If the model implements + /// then this string is followed by the first line of the model summary (the first line contains a description specific to the + /// model kind, such as "Feature gains" for FastTree or "Feature weights" for linear). + /// * The value: + /// - If the model implements then the value is the list of Key-Value pairs + /// containing the detailed summary for that model (for example, linear models have a list containing kvps where the keys + /// are the feature names and the values are the weights. FastTree has a similar list with the feature gains as values). + /// - If the model does not implement but does implement , + /// the value is a string containing the summary of that model. + /// - If neither of those interfaces are implemented then the value is a string containing the name of the type of model. + /// + /// + public IList> GetSummaryInKeyValuePairs(RoleMappedSchema schema) + { + Host.CheckValueOrNull(schema); + + var list = new List>(); + + var sb = new StringBuilder(); + for (int i = 0; i < PredictorModels.Length; i++) + { + var key = string.Format("Partition model {0} summary:", i); + var summaryKvps = PredictorModels[i].Predictor as ICanGetSummaryInKeyValuePairs; + var summaryModel = PredictorModels[i].Predictor as ICanSaveSummary; + if (summaryKvps == null && summaryModel == null) + { + list.Add(new KeyValuePair(key, PredictorModels[i].Predictor.GetType().Name)); + continue; + } + + // Load the feature names for the i'th model. + var dv = new EmptyDataView(Host, PredictorModels[i].TransformModel.InputSchema); + PredictorModels[i].PrepareData(Host, dv, out RoleMappedData rmd, out IPredictor pred); + + if (summaryModel != null) + { + sb.Clear(); + using (StringWriter sw = new StringWriter(sb)) + summaryModel.SaveSummary(sw, rmd.Schema); + } + + if (summaryKvps != null) + { + var listCur = summaryKvps.GetSummaryInKeyValuePairs(rmd.Schema); + if (summaryModel != null) + { + using (var reader = new StringReader(sb.ToString())) + { + string firstLine = null; + while (string.IsNullOrEmpty(firstLine)) + firstLine = reader.ReadLine(); + if (!string.IsNullOrEmpty(firstLine)) + key += ("\r\n" + firstLine); + } + } + list.Add(new KeyValuePair(key, listCur)); + } + else + { + Host.AssertValue(summaryModel); + list.Add(new KeyValuePair(key, sb.ToString())); + } + + } + return list; + } + + public string[] GetLabelNamesOrNull(out ColumnType labelType) + { + Host.AssertNonEmpty(PredictorModels); + return PredictorModels[0].GetLabelInfo(Host, out labelType); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/BaseDisagreementDiversityMeasure.cs b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/BaseDisagreementDiversityMeasure.cs new file mode 100644 index 0000000000..6a34da757a --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/BaseDisagreementDiversityMeasure.cs @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; + +namespace Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure +{ + public abstract class BaseDisagreementDiversityMeasure : IDiversityMeasure + { + public List> CalculateDiversityMeasure(IList>> models, + ConcurrentDictionary>, TOutput[]> predictions) + { + Contracts.Assert(models.Count > 1); + Contracts.Assert(predictions.Count == models.Count); + + var diversityValues = new List>(); + + for (int i = 0; i < (models.Count - 1); i++) + { + for (int j = i + 1; j < models.Count; j++) + { + Single differencesCount = 0; + var modelXOutputs = predictions[models[i]]; + var modelYOutputs = predictions[models[j]]; + for (int k = 0; k < modelXOutputs.Length; k++) + { + differencesCount += GetDifference(ref modelXOutputs[k], ref modelYOutputs[k]); + } + diversityValues.Add(new ModelDiversityMetric() + { + DiversityNumber = differencesCount, + ModelX = models[i], + ModelY = models[j] + }); + } + } + return diversityValues; + } + + protected abstract Single GetDifference(ref TOutput tOutput1, ref TOutput tOutput2); + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/DisagreementDiversityMeasure.cs b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/DisagreementDiversityMeasure.cs new file mode 100644 index 0000000000..7a19237974 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/DisagreementDiversityMeasure.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; + +[assembly: LoadableClass(typeof(DisagreementDiversityMeasure), null, typeof(SignatureEnsembleDiversityMeasure), + DisagreementDiversityMeasure.UserName, DisagreementDiversityMeasure.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure +{ + public class DisagreementDiversityMeasure : BaseDisagreementDiversityMeasure, IBinaryDiversityMeasure + { + public const string UserName = "Disagreement Diversity Measure"; + public const string LoadName = "DisagreementDiversityMeasure"; + + protected override Single GetDifference(ref Single valueX, ref Single valueY) + { + return (valueX > 0 && valueY < 0 || valueX < 0 && valueY > 0) ? 1 : 0; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/ModelDiversityMetric.cs b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/ModelDiversityMetric.cs new file mode 100644 index 0000000000..1ee03a9489 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/ModelDiversityMetric.cs @@ -0,0 +1,15 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +namespace Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure +{ + public class ModelDiversityMetric + { + public FeatureSubsetModel> ModelX { get; set; } + public FeatureSubsetModel> ModelY { get; set; } + public Single DiversityNumber { get; set; } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/MultiDisagreementDiversityMeasure.cs b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/MultiDisagreementDiversityMeasure.cs new file mode 100644 index 0000000000..fe4632791d --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/MultiDisagreementDiversityMeasure.cs @@ -0,0 +1,26 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; +using Microsoft.ML.Runtime.Numeric; + +[assembly: LoadableClass(typeof(MultiDisagreementDiversityMeasure), null, typeof(SignatureEnsembleDiversityMeasure), + DisagreementDiversityMeasure.UserName, MultiDisagreementDiversityMeasure.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure +{ + public class MultiDisagreementDiversityMeasure : BaseDisagreementDiversityMeasure>, IMulticlassDiversityMeasure + { + public const string LoadName = "MultiDisagreementDiversityMeasure"; + + protected override Single GetDifference(ref VBuffer valueX, ref VBuffer valueY) + { + return (VectorUtils.ArgMax(ref valueX) != VectorUtils.ArgMax(ref valueY)) ? 1 : 0; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/RegressionDisagreementDiversityMeasure.cs b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/RegressionDisagreementDiversityMeasure.cs new file mode 100644 index 0000000000..62724d387e --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/DiversityMeasure/RegressionDisagreementDiversityMeasure.cs @@ -0,0 +1,24 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; + +[assembly: LoadableClass(typeof(RegressionDisagreementDiversityMeasure), null, typeof(SignatureEnsembleDiversityMeasure), + DisagreementDiversityMeasure.UserName, RegressionDisagreementDiversityMeasure.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure +{ + public class RegressionDisagreementDiversityMeasure : BaseDisagreementDiversityMeasure, IRegressionDiversityMeasure + { + public const string LoadName = "RegressionDisagreementDiversityMeasure"; + + protected override Single GetDifference(ref Single valueX, ref Single valueY) + { + return Math.Abs(valueX - valueY); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/FeatureSelector/AllFeatureSelector.cs b/src/Microsoft.ML.Ensemble/Selector/FeatureSelector/AllFeatureSelector.cs new file mode 100644 index 0000000000..84a70a6ee4 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/FeatureSelector/AllFeatureSelector.cs @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.FeatureSelector; + +[assembly: LoadableClass(typeof(AllFeatureSelector), null, typeof(SignatureEnsembleFeatureSelector), + AllFeatureSelector.UserName, AllFeatureSelector.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.FeatureSelector +{ + public sealed class AllFeatureSelector : IFeatureSelector + { + public const string UserName = "All Feature Selector"; + public const string LoadName = "AllFeatureSelector"; + + public AllFeatureSelector(IHostEnvironment env) + { + } + + public Subset SelectFeatures(RoleMappedData data, IRandom rand) + { + return new Subset(data); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/FeatureSelector/RandomFeatureSelector.cs b/src/Microsoft.ML.Ensemble/Selector/FeatureSelector/RandomFeatureSelector.cs new file mode 100644 index 0000000000..c0c9b8968f --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/FeatureSelector/RandomFeatureSelector.cs @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.FeatureSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Training; + +[assembly: LoadableClass(typeof(RandomFeatureSelector), typeof(RandomFeatureSelector.Arguments), + typeof(SignatureEnsembleFeatureSelector), RandomFeatureSelector.UserName, RandomFeatureSelector.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.FeatureSelector +{ + public class RandomFeatureSelector : IFeatureSelector + { + public const string UserName = "Random Feature Selector"; + public const string LoadName = "RandomFeatureSelector"; + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments: ISupportFeatureSelectorFactory + { + [Argument(ArgumentType.AtMostOnce, HelpText = "The proportion of features to be selected. The range is 0.0-1.0", ShortName = "fp", SortOrder = 50)] + public Single FeaturesSelectionProportion = 0.8f; + + public IFeatureSelector CreateComponent(IHostEnvironment env) => new RandomFeatureSelector(env, this); + } + + private readonly Arguments _args; + private readonly IHost _host; + + public RandomFeatureSelector(IHostEnvironment env, Arguments args) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(args, nameof(args)); + + _host = env.Register(LoadName); + _args = args; + _host.Check(0 < _args.FeaturesSelectionProportion && _args.FeaturesSelectionProportion < 1, + "The feature proportion for RandomFeatureSelector should be greater than 0 and lesser than 1"); + } + + public Subset SelectFeatures(RoleMappedData data, IRandom rand) + { + _host.CheckValue(data, nameof(data)); + data.CheckFeatureFloatVector(); + + var type = data.Schema.Feature.Type; + int len = type.VectorSize; + var features = new BitArray(len); + for (int j = 0; j < len; j++) + features[j] = rand.NextDouble() < _args.FeaturesSelectionProportion; + var dataNew = EnsembleUtils.SelectFeatures(_host, data, features); + return new Subset(dataNew, features); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/IDiversityMeasure.cs b/src/Microsoft.ML.Ensemble/Selector/IDiversityMeasure.cs new file mode 100644 index 0000000000..01589c4714 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/IDiversityMeasure.cs @@ -0,0 +1,43 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; +using Microsoft.ML.Runtime.EntryPoints; + +namespace Microsoft.ML.Runtime.Ensemble.Selector +{ + public interface IDiversityMeasure + { + List> CalculateDiversityMeasure(IList>> models, + ConcurrentDictionary>, TOutput[]> predictions); + } + + public delegate void SignatureEnsembleDiversityMeasure(); + + public interface IBinaryDiversityMeasure : IDiversityMeasure + { } + public interface IRegressionDiversityMeasure : IDiversityMeasure + { } + public interface IMulticlassDiversityMeasure : IDiversityMeasure> + { } + + [TlcModule.ComponentKind("EnsembleBinaryDiversityMeasure")] + public interface ISupportBinaryDiversityMeasureFactory : IComponentFactory + { + } + + [TlcModule.ComponentKind("EnsembleRegressionDiversityMeasure")] + public interface ISupportRegressionDiversityMeasureFactory : IComponentFactory + { + } + + [TlcModule.ComponentKind("EnsembleMulticlassDiversityMeasure")] + public interface ISupportMulticlassDiversityMeasureFactory : IComponentFactory + { + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/IFeatureSelector.cs b/src/Microsoft.ML.Ensemble/Selector/IFeatureSelector.cs new file mode 100644 index 0000000000..99e90c5c01 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/IFeatureSelector.cs @@ -0,0 +1,21 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; + +namespace Microsoft.ML.Runtime.Ensemble.Selector +{ + public interface IFeatureSelector + { + Subset SelectFeatures(RoleMappedData data, IRandom rand); + } + + public delegate void SignatureEnsembleFeatureSelector(); + + [TlcModule.ComponentKind("EnsembleFeatureSelector")] + public interface ISupportFeatureSelectorFactory : IComponentFactory + { + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/ISubModelSelector.cs b/src/Microsoft.ML.Ensemble/Selector/ISubModelSelector.cs new file mode 100644 index 0000000000..96e9f5b886 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/ISubModelSelector.cs @@ -0,0 +1,52 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using System; +using System.Collections.Generic; + +namespace Microsoft.ML.Runtime.Ensemble.Selector +{ + public interface ISubModelSelector + { + IList>> Prune(IList>> models); + + void CalculateMetrics(FeatureSubsetModel> model, ISubsetSelector subsetSelector, Subset subset, + Batch batch, bool needMetrics); + + Single ValidationDatasetProportion { get; } + } + + public interface IRegressionSubModelSelector : ISubModelSelector + { + } + + public interface IBinarySubModelSelector : ISubModelSelector + { + } + + public interface IMulticlassSubModelSelector : ISubModelSelector> + { + } + + public delegate void SignatureEnsembleSubModelSelector(); + + [TlcModule.ComponentKind("EnsembleMulticlassSubModelSelector")] + public interface ISupportMulticlassSubModelSelectorFactory : IComponentFactory + { + } + + [TlcModule.ComponentKind("EnsembleBinarySubModelSelector")] + public interface ISupportBinarySubModelSelectorFactory: IComponentFactory + { + + } + + [TlcModule.ComponentKind("EnsembleRegressionSubModelSelector")] + public interface ISupportRegressionSubModelSelectorFactory : IComponentFactory + { + + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/ISubsetSelector.cs b/src/Microsoft.ML.Ensemble/Selector/ISubsetSelector.cs new file mode 100644 index 0000000000..2a0f088219 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/ISubsetSelector.cs @@ -0,0 +1,26 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; + +namespace Microsoft.ML.Runtime.Ensemble.Selector +{ + public interface ISubsetSelector + { + void Initialize(RoleMappedData data, int size, int batchSize, Single validationDatasetProportion); + IEnumerable GetBatches(IRandom rand); + IEnumerable GetSubsets(Batch batch, IRandom rand); + RoleMappedData GetTestData(Subset subset, Batch batch); + } + + public delegate void SignatureEnsembleDataSelector(); + + [TlcModule.ComponentKind("EnsembleSubsetSelector")] + public interface ISupportSubsetSelectorFactory : IComponentFactory + { + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/AllSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/AllSelector.cs new file mode 100644 index 0000000000..4196ab3558 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/AllSelector.cs @@ -0,0 +1,28 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; + +[assembly: LoadableClass(typeof(AllSelector), null, typeof(SignatureEnsembleSubModelSelector), AllSelector.UserName, AllSelector.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public class AllSelector : BaseSubModelSelector, IBinarySubModelSelector, IRegressionSubModelSelector + { + public const string UserName = "All Selector"; + public const string LoadName = "AllSelector"; + + public override Single ValidationDatasetProportion => 0; + + protected override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + + public AllSelector(IHostEnvironment env) + : base(env, LoadName) + { + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/AllSelectorMultiClass.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/AllSelectorMultiClass.cs new file mode 100644 index 0000000000..6c82fc25f5 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/AllSelectorMultiClass.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; + +[assembly: LoadableClass(typeof(AllSelectorMultiClass), null, typeof(SignatureEnsembleSubModelSelector), + AllSelectorMultiClass.UserName, AllSelectorMultiClass.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public class AllSelectorMultiClass : BaseSubModelSelector>, IMulticlassSubModelSelector + { + public const string UserName = "All Selector"; + public const string LoadName = "AllSelectorMultiClass"; + + public override Single ValidationDatasetProportion => 0; + + protected override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; + + public AllSelectorMultiClass(IHostEnvironment env) + : base(env, LoadName) + { + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseBestPerformanceSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseBestPerformanceSelector.cs new file mode 100644 index 0000000000..8701e2833c --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseBestPerformanceSelector.cs @@ -0,0 +1,121 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Microsoft.ML.Runtime.CommandLine; + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public abstract class BaseBestPerformanceSelector : SubModelDataSelector + { + protected abstract string MetricName { get; } + + protected virtual bool IsAscMetric => true; + + protected BaseBestPerformanceSelector(ArgumentsBase args, IHostEnvironment env, string name) + : base(args, env, name) + { + } + + public override void CalculateMetrics(FeatureSubsetModel> model, + ISubsetSelector subsetSelector, Subset subset, Batch batch, bool needMetrics) + { + base.CalculateMetrics(model, subsetSelector, subset, batch, true); + } + + public override IList>> Prune(IList>> models) + { + using (var ch = Host.Start("Pruning")) + { + var sortedModels = models.ToArray(); + Array.Sort(sortedModels, new ModelPerformanceComparer(MetricName, IsAscMetric)); + Print(ch, sortedModels, MetricName); + int modelCountToBeSelected = (int)(models.Count * LearnersSelectionProportion); + if (modelCountToBeSelected == 0) + modelCountToBeSelected = 1; + + var retval = sortedModels.Where(m => m != null).Take(modelCountToBeSelected).ToList(); + ch.Done(); + return retval; + } + } + + protected static string FindMetricName(Type type, object value) + { + Contracts.Assert(type.IsEnum); + Contracts.Assert(value.GetType() == type); + + foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly)) + { + if (field.FieldType != type) + continue; + if (field.GetCustomAttribute() != null) + continue; + var displayAttr = field.GetCustomAttribute(); + if (displayAttr != null) + { + var valCur = field.GetValue(null); + if (value.Equals(valCur)) + return displayAttr.Name; + } + } + Contracts.Assert(false); + return null; + } + + private sealed class ModelPerformanceComparer : IComparer>> + { + private readonly string _metricName; + private readonly bool _isAscMetric; + + public ModelPerformanceComparer(string metricName, bool isAscMetric) + { + Contracts.AssertValue(metricName); + + _metricName = metricName; + _isAscMetric = isAscMetric; + } + + public int Compare(FeatureSubsetModel> x, FeatureSubsetModel> y) + { + if (x == null || y == null) + return (x == null ? 0 : 1) - (y == null ? 0 : 1); + double xValue = 0; + var found = false; + foreach (var kvp in x.Metrics) + { + if (_metricName == kvp.Key) + { + xValue = kvp.Value; + found = true; + break; + } + } + if (!found) + throw Contracts.Except("Metrics did not contain the requested metric '{0}'", _metricName); + double yValue = 0; + found = false; + foreach (var kvp in y.Metrics) + { + if (_metricName == kvp.Key) + { + yValue = kvp.Value; + found = true; + break; + } + } + if (!found) + throw Contracts.Except("Metrics did not contain the requested metric '{0}'", _metricName); + if (xValue > yValue) + return _isAscMetric ? -1 : 1; + if (yValue > xValue) + return _isAscMetric ? 1 : -1; + return 0; + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseDiverseSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseDiverseSelector.cs new file mode 100644 index 0000000000..5e31b2c8f5 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseDiverseSelector.cs @@ -0,0 +1,134 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Training; + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public abstract class BaseDiverseSelector : SubModelDataSelector + where TDiversityMetric : class, IDiversityMeasure + { + public abstract class DiverseSelectorArguments : ArgumentsBase + { + } + + private readonly IComponentFactory> _diversityMetricType; + private ConcurrentDictionary>, TOutput[]> _predictions; + + private protected BaseDiverseSelector(IHostEnvironment env, DiverseSelectorArguments args, string name, + IComponentFactory> diversityMetricType) + : base(args, env, name) + { + _diversityMetricType = diversityMetricType; + _predictions = new ConcurrentDictionary>, TOutput[]>(); + } + + protected IDiversityMeasure CreateDiversityMetric() + { + return _diversityMetricType.CreateComponent(Host); + } + + public override void CalculateMetrics(FeatureSubsetModel> model, + ISubsetSelector subsetSelector, Subset subset, Batch batch, bool needMetrics) + { + base.CalculateMetrics(model, subsetSelector, subset, batch, needMetrics); + + var vm = model.Predictor as IValueMapper; + Host.Check(vm != null, "Predictor doesn't implement the expected interface"); + var map = vm.GetMapper, TOutput>(); + + TOutput[] preds = new TOutput[100]; + int count = 0; + var data = subsetSelector.GetTestData(subset, batch); + using (var cursor = new FeatureFloatVectorCursor(data, CursOpt.AllFeatures)) + { + while (cursor.MoveNext()) + { + Utils.EnsureSize(ref preds, count + 1); + map(ref cursor.Features, ref preds[count]); + count++; + } + } + Array.Resize(ref preds, count); + _predictions[model] = preds; + } + + /// + /// This calculates the diversity by calculating the disagreement measure which is defined as the sum of number of instances correctly(incorrectly) + /// classified by first classifier and incorrectly(correctly) classified by the second classifier over the total number of instances. + /// All the pairwise classifiers are sorted out to take the most divers classifiers. + /// + /// + /// + public override IList>> Prune(IList>> models) + { + if (models.Count <= 1) + return models; + + // 1. Find the disagreement number + List> diversityValues = CalculateDiversityMeasure(models, _predictions); + _predictions.Clear(); + + // 2. Sort all the pairwise classifiers + var sortedModels = diversityValues.ToArray(); + Array.Sort(sortedModels, new ModelDiversityComparer()); + var modelCountToBeSelected = (int)(models.Count * LearnersSelectionProportion); + + if (modelCountToBeSelected == 0) + modelCountToBeSelected++; + + // 3. Take the most diverse classifiers + var selectedModels = new List>>(); + foreach (var item in sortedModels) + { + if (selectedModels.Count < modelCountToBeSelected) + { + if (!selectedModels.Contains(item.ModelX)) + { + selectedModels.Add(item.ModelX); + } + } + + if (selectedModels.Count < modelCountToBeSelected) + { + if (!selectedModels.Contains(item.ModelY)) + { + selectedModels.Add(item.ModelY); + continue; + } + } + else + { + break; + } + } + + return selectedModels; + } + + public abstract List> CalculateDiversityMeasure(IList>> models, + ConcurrentDictionary>, TOutput[]> predictions); + + public class ModelDiversityComparer : IComparer> + { + public int Compare(ModelDiversityMetric x, ModelDiversityMetric y) + { + if (x == null || y == null) + return 0; + if (x.DiversityNumber > y.DiversityNumber) + return -1; + if (y.DiversityNumber > x.DiversityNumber) + return 1; + return 0; + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseSubModelSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseSubModelSelector.cs new file mode 100644 index 0000000000..8465e1a5e8 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseSubModelSelector.cs @@ -0,0 +1,137 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public abstract class BaseSubModelSelector : ISubModelSelector + { + protected readonly IHost Host; + + public abstract Single ValidationDatasetProportion { get; } + + protected abstract PredictionKind PredictionKind { get; } + + protected BaseSubModelSelector(IHostEnvironment env, string name) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckNonWhiteSpace(name, nameof(name)); + Host = env.Register(name); + } + + protected void Print(IChannel ch, IList>> models, string metricName) + { + // REVIEW: The output format was faithfully reproduced from the original format, but it's unclear + // to me that this is right. Why have two bars in the header line, but only one bar in the results? + ch.Info("List of models and the metrics after sorted"); + ch.Info("| {0}(Sorted) || Name of Model |", metricName); + foreach (var model in models) + { + var metric = 0.0; + var found = false; + foreach (var kvp in model.Metrics) + { + if (kvp.Key == metricName) + { + metric = kvp.Value; + found = true; + } + } + if (!found) + throw ch.Except("Metrics did not contain the requested metric '{0}'", metricName); + ch.Info("| {0} |{1}", metric, model.Predictor.GetType().Name); + } + } + + public virtual IList>> Prune(IList>> models) + { + return models; + } + + private SubComponent GetEvaluatorSubComponent() + { + switch (PredictionKind) + { + case PredictionKind.BinaryClassification: + return new SubComponent(BinaryClassifierEvaluator.LoadName); + case PredictionKind.Regression: + return new SubComponent(RegressionEvaluator.LoadName); + case PredictionKind.MultiClassClassification: + return new SubComponent(MultiClassClassifierEvaluator.LoadName); + default: + throw Host.Except("Unrecognized prediction kind '{0}'", PredictionKind); + } + } + + public virtual void CalculateMetrics(FeatureSubsetModel> model, + ISubsetSelector subsetSelector, Subset subset, Batch batch, bool needMetrics) + { + if (!needMetrics || model == null || model.Metrics != null) + return; + + using (var ch = Host.Start("Calculate metrics")) + { + RoleMappedData testData = subsetSelector.GetTestData(subset, batch); + // Because the training and test datasets are drawn from the same base dataset, the test data role mappings + // are the same as for the train data. + IDataScorerTransform scorePipe = ScoreUtils.GetScorer(model.Predictor, testData, Host, testData.Schema); + // REVIEW: Should we somehow allow the user to customize the evaluator? + // By what mechanism should we allow that? + var evalComp = GetEvaluatorSubComponent(); + RoleMappedData scoredTestData = new RoleMappedData(scorePipe, + GetColumnRoles(testData.Schema, scorePipe.Schema)); + IEvaluator evaluator = evalComp.CreateInstance(Host); + // REVIEW: with the new evaluators, metrics of individual models are no longer + // printed to the Console. Consider adding an option on the combiner to print them. + // REVIEW: Consider adding an option to the combiner to save a data view + // containing all the results of the individual models. + var metricsDict = evaluator.Evaluate(scoredTestData); + if (!metricsDict.TryGetValue(MetricKinds.OverallMetrics, out IDataView metricsView)) + throw Host.Except("Evaluator did not produce any overall metrics"); + // REVIEW: We're assuming that the metrics of interest are always doubles here. + var metrics = EvaluateUtils.GetMetrics(metricsView, getVectorMetrics: false); + model.Metrics = metrics.ToArray(); + ch.Done(); + } + } + + private IEnumerable> GetColumnRoles( + RoleMappedSchema testSchema, ISchema scoredSchema) + { + switch (PredictionKind) + { + case PredictionKind.BinaryClassification: + yield return RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Label, testSchema.Label.Name); + var scoreInfo = EvaluateUtils.GetScoreColumnInfo(Host, scoredSchema, null, nameof(BinaryClassifierMamlEvaluator.ArgumentsBase.ScoreColumn), + MetadataUtils.Const.ScoreColumnKind.BinaryClassification); + yield return RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.Score, scoreInfo.Name); + // Get the optional probability column. + var probInfo = EvaluateUtils.GetOptAuxScoreColumnInfo(Host, scoredSchema, null, nameof(BinaryClassifierMamlEvaluator.Arguments.ProbabilityColumn), + scoreInfo.Index, MetadataUtils.Const.ScoreValueKind.Probability, t => t == NumberType.Float); + if (probInfo != null) + yield return RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.Probability, probInfo.Name); + yield break; + case PredictionKind.Regression: + yield return RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Label, testSchema.Label.Name); + scoreInfo = EvaluateUtils.GetScoreColumnInfo(Host, scoredSchema, null, nameof(RegressionMamlEvaluator.Arguments.ScoreColumn), + MetadataUtils.Const.ScoreColumnKind.Regression); + yield return RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.Score, scoreInfo.Name); + yield break; + case PredictionKind.MultiClassClassification: + yield return RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Label, testSchema.Label.Name); + scoreInfo = EvaluateUtils.GetScoreColumnInfo(Host, scoredSchema, null, nameof(MultiClassMamlEvaluator.Arguments.ScoreColumn), + MetadataUtils.Const.ScoreColumnKind.MultiClassClassification); + yield return RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.Score, scoreInfo.Name); + yield break; + default: + throw Host.Except("Unrecognized prediction kind '{0}'", PredictionKind); + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorBinary.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorBinary.cs new file mode 100644 index 0000000000..75d25df9d6 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorBinary.cs @@ -0,0 +1,54 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(typeof(BestDiverseSelectorBinary), typeof(BestDiverseSelectorBinary.Arguments), + typeof(SignatureEnsembleSubModelSelector), BestDiverseSelectorBinary.UserName, BestDiverseSelectorBinary.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + using TScalarPredictor = IPredictorProducing; + + public sealed class BestDiverseSelectorBinary : BaseDiverseSelector, IBinarySubModelSelector + { + public const string UserName = "Best Diverse Selector"; + public const string LoadName = "BestDiverseSelector"; + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : DiverseSelectorArguments, ISupportBinarySubModelSelectorFactory + { + [Argument(ArgumentType.Multiple, HelpText = "The metric type to be used to find the diversity among base learners", ShortName = "dm", SortOrder = 50)] + [TGUI(Label = "Diversity Measure Type")] + public ISupportBinaryDiversityMeasureFactory DiversityMetricType = new DisagreementDiversityFactory(); + + public IBinarySubModelSelector CreateComponent(IHostEnvironment env) => new BestDiverseSelectorBinary(env, this); + } + + public BestDiverseSelectorBinary(IHostEnvironment env, Arguments args) + : base(env, args, LoadName, args.DiversityMetricType) + { + + } + + public override List> CalculateDiversityMeasure(IList> models, + ConcurrentDictionary, Single[]> predictions) + { + var diversityMetric = CreateDiversityMetric(); + return diversityMetric.CalculateDiversityMeasure(models, predictions); + } + + protected override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorMultiClass.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorMultiClass.cs new file mode 100644 index 0000000000..8856982f00 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorMultiClass.cs @@ -0,0 +1,56 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(typeof(BestDiverseSelectorMultiClass), typeof(BestDiverseSelectorMultiClass.Arguments), + typeof(SignatureEnsembleSubModelSelector), BestDiverseSelectorMultiClass.UserName, BestDiverseSelectorMultiClass.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + using TVectorPredictor = IPredictorProducing>; + + public sealed class BestDiverseSelectorMultiClass : BaseDiverseSelector, IDiversityMeasure>>, IMulticlassSubModelSelector + { + public const string UserName = "Best Diverse Selector"; + public const string LoadName = "BestDiverseSelectorMultiClass"; + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : DiverseSelectorArguments, ISupportMulticlassSubModelSelectorFactory + { + [Argument(ArgumentType.Multiple, HelpText = "The metric type to be used to find the diversity among base learners", ShortName = "dm", SortOrder = 50)] + [TGUI(Label = "Diversity Measure Type")] + public ISupportMulticlassDiversityMeasureFactory DiversityMetricType = new MultiDisagreementDiversityFactory(); + public IMulticlassSubModelSelector CreateComponent(IHostEnvironment env) => new BestDiverseSelectorMultiClass(env, this); + } + + public BestDiverseSelectorMultiClass(IHostEnvironment env, Arguments args) + : base(env, args, LoadName, args.DiversityMetricType) + { + } + + protected override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; + + public override List>> CalculateDiversityMeasure(IList> models, + ConcurrentDictionary, VBuffer[]> predictions) + { + Host.Assert(models.Count > 1); + Host.Assert(predictions.Count == models.Count); + + var diversityMetric = CreateDiversityMetric(); + return diversityMetric.CalculateDiversityMeasure(models, predictions); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorRegression.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorRegression.cs new file mode 100644 index 0000000000..cbd2d47330 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestDiverseSelectorRegression.cs @@ -0,0 +1,52 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.DiversityMeasure; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(typeof(BestDiverseSelectorRegression), typeof(BestDiverseSelectorRegression.Arguments), + typeof(SignatureEnsembleSubModelSelector), BestDiverseSelectorRegression.UserName, BestDiverseSelectorRegression.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + using TScalarPredictor = IPredictorProducing; + + public sealed class BestDiverseSelectorRegression : BaseDiverseSelector, IRegressionSubModelSelector + { + public const string UserName = "Best Diverse Selector"; + public const string LoadName = "BestDiverseSelectorRegression"; + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : DiverseSelectorArguments, ISupportRegressionSubModelSelectorFactory + { + [Argument(ArgumentType.Multiple, HelpText = "The metric type to be used to find the diversity among base learners", ShortName = "dm", SortOrder = 50)] + [TGUI(Label = "Diversity Measure Type")] + public ISupportRegressionDiversityMeasureFactory DiversityMetricType = new RegressionDisagreementDiversityFactory(); + public IRegressionSubModelSelector CreateComponent(IHostEnvironment env) => new BestDiverseSelectorRegression(env, this); + } + + public BestDiverseSelectorRegression(IHostEnvironment env, Arguments args) + : base(env, args, LoadName, args.DiversityMetricType) + { + } + + public override List> CalculateDiversityMeasure(IList> models, + ConcurrentDictionary, Single[]> predictions) + { + var diversityMetric = CreateDiversityMetric(); + return diversityMetric.CalculateDiversityMeasure(models, predictions); + } + + protected override PredictionKind PredictionKind => PredictionKind.Regression; + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceRegressionSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceRegressionSelector.cs new file mode 100644 index 0000000000..46f13e9cd1 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceRegressionSelector.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(typeof(BestPerformanceRegressionSelector), typeof(BestPerformanceRegressionSelector.Arguments), + typeof(SignatureEnsembleSubModelSelector), BestPerformanceRegressionSelector.UserName, BestPerformanceRegressionSelector.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public sealed class BestPerformanceRegressionSelector : BaseBestPerformanceSelector, IRegressionSubModelSelector + { + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportRegressionSubModelSelectorFactory + { + [Argument(ArgumentType.AtMostOnce, HelpText = "The metric type to be used to find the best performance", ShortName = "mn", SortOrder = 50)] + [TGUI(Label = "Metric Name")] + public RegressionEvaluator.Metrics MetricName = RegressionEvaluator.Metrics.L1; + + public IRegressionSubModelSelector CreateComponent(IHostEnvironment env) => new BestPerformanceRegressionSelector(env, this); + } + + public const string UserName = "Best Performance Selector"; + public const string LoadName = "BestPerformanceRegressionSelector"; + + private readonly RegressionEvaluator.Metrics _metric; + + private readonly string _metricName; + + public BestPerformanceRegressionSelector(IHostEnvironment env, Arguments args) + : base(args, env, LoadName) + { + Host.CheckUserArg(Enum.IsDefined(typeof(RegressionEvaluator.Metrics), args.MetricName), nameof(args.MetricName), "Undefined metric name"); + _metric = args.MetricName; + _metricName = FindMetricName(typeof(RegressionEvaluator.Metrics), _metric); + Host.Assert(!string.IsNullOrEmpty(_metricName)); + } + + protected override string MetricName => _metricName; + + protected override bool IsAscMetric => false; + + protected override PredictionKind PredictionKind => PredictionKind.Regression; + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceSelector.cs new file mode 100644 index 0000000000..76742ad0ec --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceSelector.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(typeof(BestPerformanceSelector), typeof(BestPerformanceSelector.Arguments), + typeof(SignatureEnsembleSubModelSelector), BestPerformanceSelector.UserName, BestPerformanceSelector.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public sealed class BestPerformanceSelector : BaseBestPerformanceSelector, IBinarySubModelSelector + { + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportBinarySubModelSelectorFactory + { + [Argument(ArgumentType.AtMostOnce, HelpText = "The metric type to be used to find the best performance", ShortName = "mn", SortOrder = 50)] + [TGUI(Label = "Metric Name")] + public BinaryClassifierEvaluator.Metrics MetricName = BinaryClassifierEvaluator.Metrics.Auc; + + public IBinarySubModelSelector CreateComponent(IHostEnvironment env) => new BestPerformanceSelector(env, this); + } + + public const string UserName = "Best Performance Selector"; + public const string LoadName = "BestPerformanceSelector"; + + private readonly BinaryClassifierEvaluator.Metrics _metric; + private readonly string _metricName; + + public BestPerformanceSelector(IHostEnvironment env, Arguments args) + : base(args, env, LoadName) + { + Host.CheckUserArg(Enum.IsDefined(typeof(BinaryClassifierEvaluator.Metrics), args.MetricName), + nameof(args.MetricName), "Undefined metric name"); + _metric = args.MetricName; + _metricName = FindMetricName(typeof(BinaryClassifierEvaluator.Metrics), _metric); + Host.Assert(!string.IsNullOrEmpty(_metricName)); + } + + protected override string MetricName => _metricName; + + protected override bool IsAscMetric => _metric != BinaryClassifierEvaluator.Metrics.LogLoss; + + protected override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceSelectorMultiClass.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceSelectorMultiClass.cs new file mode 100644 index 0000000000..0a9b9ac497 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BestPerformanceSelectorMultiClass.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(typeof(BestPerformanceSelectorMultiClass), typeof(BestPerformanceSelectorMultiClass.Arguments), + typeof(SignatureEnsembleSubModelSelector), BestPerformanceSelectorMultiClass.UserName, BestPerformanceSelectorMultiClass.LoadName)] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public class BestPerformanceSelectorMultiClass : BaseBestPerformanceSelector>, IMulticlassSubModelSelector + { + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportMulticlassSubModelSelectorFactory + { + [Argument(ArgumentType.AtMostOnce, HelpText = "The metric type to be used to find the best performance", ShortName = "mn", SortOrder = 50)] + [TGUI(Label = "Metric Name")] + public MultiClassClassifierEvaluator.Metrics MetricName = MultiClassClassifierEvaluator.Metrics.AccuracyMicro; + + IMulticlassSubModelSelector IComponentFactory.CreateComponent(IHostEnvironment env) => new BestPerformanceSelectorMultiClass(env, this); + } + + public const string UserName = "Best Performance Selector"; + public const string LoadName = "BestPerformanceSelectorMultiClass"; + + private readonly MultiClassClassifierEvaluator.Metrics _metric; + private readonly string _metricName; + + public BestPerformanceSelectorMultiClass(IHostEnvironment env, Arguments args) + : base(args, env, LoadName) + { + Host.CheckUserArg(Enum.IsDefined(typeof(MultiClassClassifierEvaluator.Metrics), args.MetricName), + nameof(args.MetricName), "Undefined metric name"); + _metric = args.MetricName; + _metricName = FindMetricName(typeof(MultiClassClassifierEvaluator.Metrics), _metric); + Host.Assert(!string.IsNullOrEmpty(_metricName)); + } + + protected override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; + + protected override bool IsAscMetric => _metric != MultiClassClassifierEvaluator.Metrics.LogLoss; + + protected override string MetricName => _metricName; + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/SubModelDataSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/SubModelDataSelector.cs new file mode 100644 index 0000000000..5953b30d97 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/SubModelDataSelector.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Internal.Internallearn; + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubModelSelector +{ + public abstract class SubModelDataSelector : BaseSubModelSelector + { + public abstract class ArgumentsBase + { + [Argument(ArgumentType.AtMostOnce, ShortName = "lp", SortOrder = 50, + HelpText = "The proportion of best base learners to be selected. The range is 0.0-1.0")] + [TGUI(Label = "Learners Selection Proportion")] + public Single LearnersSelectionProportion = 0.5f; + + [Argument(ArgumentType.AtMostOnce, ShortName = "vp", SortOrder = 50, + HelpText = "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set")] + [TGUI(Label = "Validation Dataset Proportion")] + public Single ValidationDatasetProportion = 0.3f; + } + + public Single LearnersSelectionProportion { get; } + + public override Single ValidationDatasetProportion { get; } + + protected SubModelDataSelector(ArgumentsBase args, IHostEnvironment env, string name) + : base(env, name) + { + Host.CheckValue(args, nameof(args)); + Host.CheckParam(0 <= args.ValidationDatasetProportion && args.ValidationDatasetProportion < 1, + nameof(args.ValidationDatasetProportion), + "Should be greater than or equal to 0 and less than 1"); + Host.CheckParam(0 < args.LearnersSelectionProportion && args.LearnersSelectionProportion < 1, + nameof(args.LearnersSelectionProportion), + "Should be greater than 0 and less than 1"); + LearnersSelectionProportion = args.LearnersSelectionProportion; + ValidationDatasetProportion = args.ValidationDatasetProportion; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/AllInstanceSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/AllInstanceSelector.cs new file mode 100644 index 0000000000..98e6eeb8eb --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/AllInstanceSelector.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: LoadableClass(typeof(AllInstanceSelector), typeof(AllInstanceSelector.Arguments), + typeof(SignatureEnsembleDataSelector), AllInstanceSelector.UserName, AllInstanceSelector.LoadName)] + +[assembly: EntryPointModule(typeof(AllInstanceSelector))] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector +{ + public sealed class AllInstanceSelector : BaseSubsetSelector + { + public const string UserName = "All Instance Selector"; + public const string LoadName = "AllInstanceSelector"; + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportSubsetSelectorFactory + { + public ISubsetSelector CreateComponent(IHostEnvironment env) => new AllInstanceSelector(env, this); + } + + public AllInstanceSelector(IHostEnvironment env, Arguments args) + : base(args, env, LoadName) + { + } + + public override IEnumerable GetSubsets(Batch batch, IRandom rand) + { + for (int i = 0; i < Size; i++) + yield return FeatureSelector.SelectFeatures(batch.TrainInstances, rand); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/BaseSubsetSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/BaseSubsetSelector.cs new file mode 100644 index 0000000000..66e7d38af2 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/BaseSubsetSelector.cs @@ -0,0 +1,104 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector +{ + public abstract class BaseSubsetSelector : ISubsetSelector + where TArgs : BaseSubsetSelector.ArgumentsBase + { + public abstract class ArgumentsBase + { + [Argument(ArgumentType.Multiple, HelpText = "The Feature selector", ShortName = "fs", SortOrder = 1)] + public ISupportFeatureSelectorFactory FeatureSelector = new AllFeatureSelectorFactory(); + } + + protected readonly IHost Host; + protected readonly TArgs Args; + protected readonly IFeatureSelector FeatureSelector; + + protected int Size; + protected RoleMappedData Data; + protected int BatchSize; + protected Single ValidationDatasetProportion; + + protected BaseSubsetSelector(TArgs args, IHostEnvironment env, string name) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(args, nameof(args)); + env.CheckNonWhiteSpace(name, nameof(name)); + + Host = env.Register(name); + Args = args; + FeatureSelector = Args.FeatureSelector.CreateComponent(Host); + } + + public void Initialize(RoleMappedData data, int size, int batchSize, Single validationDatasetProportion) + { + Host.CheckValue(data, nameof(data)); + Host.CheckParam(size > 0, nameof(size)); + Host.CheckParam(0 <= validationDatasetProportion && validationDatasetProportion < 1, + nameof(validationDatasetProportion), "Should be greater than or equal to 0 and less than 1"); + Data = data; + Size = size; + BatchSize = batchSize; + ValidationDatasetProportion = validationDatasetProportion; + } + + public abstract IEnumerable GetSubsets(Batch batch, IRandom rand); + + public IEnumerable GetBatches(IRandom rand) + { + Host.Assert(Data != null, "Must call Initialize first!"); + Host.AssertValue(rand); + + using (var ch = Host.Start("Getting batches")) + { + RoleMappedData dataTest; + RoleMappedData dataTrain; + + // Split the data, if needed. + if (!(ValidationDatasetProportion > 0)) + dataTest = dataTrain = Data; + else + { + // Split the data into train and test sets. + string name = Data.Data.Schema.GetTempColumnName(); + var args = new GenerateNumberTransform.Arguments(); + args.Column = new[] { new GenerateNumberTransform.Column() { Name = name } }; + args.Seed = (uint)rand.Next(); + var view = new GenerateNumberTransform(Host, args, Data.Data); + var viewTest = new RangeFilter(Host, new RangeFilter.Arguments() { Column = name, Max = ValidationDatasetProportion }, view); + var viewTrain = new RangeFilter(Host, new RangeFilter.Arguments() { Column = name, Max = ValidationDatasetProportion, Complement = true }, view); + dataTest = new RoleMappedData(viewTest, Data.Schema.GetColumnRoleNames()); + dataTrain = new RoleMappedData(viewTrain, Data.Schema.GetColumnRoleNames()); + } + + if (BatchSize > 0) + { + // REVIEW: How should we carve the data into batches? + ch.Warning("Batch support is temporarily disabled"); + } + + yield return new Batch(dataTrain, dataTest); + ch.Done(); + } + } + + public virtual RoleMappedData GetTestData(Subset subset, Batch batch) + { + Host.CheckValueOrNull(subset); + Host.CheckValue(batch.TestInstances, nameof(batch), "Batch does not have test data"); + + if (subset == null || subset.SelectedFeatures == null) + return batch.TestInstances; + return EnsembleUtils.SelectFeatures(Host, batch.TestInstances, subset.SelectedFeatures); + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/BootstrapSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/BootstrapSelector.cs new file mode 100644 index 0000000000..97dda8aeba --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/BootstrapSelector.cs @@ -0,0 +1,54 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: LoadableClass(typeof(BootstrapSelector), typeof(BootstrapSelector.Arguments), + typeof(SignatureEnsembleDataSelector), BootstrapSelector.UserName, BootstrapSelector.LoadName)] + +[assembly: EntryPointModule(typeof(BootstrapSelector))] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector +{ + public sealed class BootstrapSelector : BaseSubsetSelector + { + public const string UserName = "Bootstrap Selector"; + public const string LoadName = "BootstrapSelector"; + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportSubsetSelectorFactory + { + // REVIEW: This could be reintroduced by having the transform counting the + // proportions of each label, then adjusting the lambdas accordingly. However, at + // the current point in time supporting this non-default action is not considered + // a priority. +#if OLD_ENSEMBLE + [Argument(ArgumentType.AtMostOnce, HelpText = "If checked, the classes will be balanced by over sampling of minority classes", ShortName = "cb", SortOrder = 50)] + public bool balanced = false; +#endif + public ISubsetSelector CreateComponent(IHostEnvironment env) => new BootstrapSelector(env, this); + } + + public BootstrapSelector(IHostEnvironment env, Arguments args) + : base(args, env, LoadName) + { + } + + public override IEnumerable GetSubsets(Batch batch, IRandom rand) + { + for (int i = 0; i < Size; i++) + { + // REVIEW: Consider ways to reintroduce "balanced" samples. + var viewTrain = new BootstrapSampleTransform(Host, new BootstrapSampleTransform.Arguments(), Data.Data); + var dataTrain = new RoleMappedData(viewTrain, Data.Schema.GetColumnRoleNames()); + yield return FeatureSelector.SelectFeatures(dataTrain, rand); + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/RandomPartitionSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/RandomPartitionSelector.cs new file mode 100644 index 0000000000..0fca7ac55b --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Selector/SubsetSelector/RandomPartitionSelector.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: LoadableClass(typeof(RandomPartitionSelector),typeof(RandomPartitionSelector.Arguments), + typeof(SignatureEnsembleDataSelector),RandomPartitionSelector.UserName, RandomPartitionSelector.LoadName)] + +[assembly: EntryPointModule(typeof(RandomPartitionSelector))] + +namespace Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector +{ + public sealed class RandomPartitionSelector : BaseSubsetSelector + { + public const string UserName = "Random Partition Selector"; + public const string LoadName = "RandomPartitionSelector"; + + [TlcModule.Component(Name = LoadName, FriendlyName = UserName)] + public sealed class Arguments : ArgumentsBase, ISupportSubsetSelectorFactory + { + public ISubsetSelector CreateComponent(IHostEnvironment env) => new RandomPartitionSelector(env, this); + } + + public RandomPartitionSelector(IHostEnvironment env, Arguments args) + : base(args, env, LoadName) + { + } + + public override IEnumerable GetSubsets(Batch batch, IRandom rand) + { + string name = Data.Data.Schema.GetTempColumnName(); + var args = new GenerateNumberTransform.Arguments(); + args.Column = new[] { new GenerateNumberTransform.Column() { Name = name } }; + args.Seed = (uint)rand.Next(); + IDataTransform view = new GenerateNumberTransform(Host, args, Data.Data); + + // REVIEW: This won't be very efficient when Size is large. + for (int i = 0; i < Size; i++) + { + var viewTrain = new RangeFilter(Host, new RangeFilter.Arguments() { Column = name, Min = (Double)i / Size, Max = (Double)(i + 1) / Size }, view); + var dataTrain = new RoleMappedData(viewTrain, Data.Schema.GetColumnRoleNames()); + yield return FeatureSelector.SelectFeatures(dataTrain, rand); + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Subset.cs b/src/Microsoft.ML.Ensemble/Subset.cs new file mode 100644 index 0000000000..77183de6f3 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Subset.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections; +using Microsoft.ML.Runtime.Data; + +namespace Microsoft.ML.Runtime.Ensemble +{ + public sealed class Subset + { + public readonly RoleMappedData Data; + public readonly BitArray SelectedFeatures; + + public Subset(RoleMappedData data, BitArray features = null) + { + Contracts.AssertValue(data); + Data = data; + SelectedFeatures = features; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.ML.Ensemble/Trainer/Binary/EnsembleTrainer.cs b/src/Microsoft.ML.Ensemble/Trainer/Binary/EnsembleTrainer.cs new file mode 100644 index 0000000000..ab2dff5045 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/Binary/EnsembleTrainer.cs @@ -0,0 +1,86 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(EnsembleTrainer.Summary, typeof(EnsembleTrainer), typeof(EnsembleTrainer.Arguments), + new[] { typeof(SignatureBinaryClassifierTrainer), typeof(SignatureTrainer) }, + EnsembleTrainer.UserNameValue, EnsembleTrainer.LoadNameValue, "pe", "ParallelEnsemble")] + +namespace Microsoft.ML.Runtime.Ensemble +{ + using TDistPredictor = IDistPredictorProducing; + using TScalarPredictor = IPredictorProducing; + /// + /// A generic ensemble trainer for binary classification. + /// + public sealed class EnsembleTrainer : EnsembleTrainerBase, + IModelCombiner + { + public const string LoadNameValue = "WeightedEnsemble"; + public const string UserNameValue = "Parallel Ensemble (bagging, stacking, etc)"; + public const string Summary = "A generic ensemble classifier for binary classification."; + + public sealed class Arguments : ArgumentsBase + { + [Argument(ArgumentType.Multiple, HelpText = "Algorithm to prune the base learners for selective Ensemble", ShortName = "pt", SortOrder = 4)] + [TGUI(Label = "Sub-Model Selector(pruning) Type", + Description = "Algorithm to prune the base learners for selective Ensemble")] + public ISupportBinarySubModelSelectorFactory SubModelSelectorType = new AllSelectorFactory(); + + [Argument(ArgumentType.Multiple, HelpText = "Output combiner", ShortName = "oc", SortOrder = 5)] + [TGUI(Label = "Output combiner", Description = "Output combiner type")] + public ISupportBinaryOutputCombinerFactory OutputCombiner = new MedianFactory(); + + public Arguments() + { + BasePredictors = new[] { new SubComponent, SignatureBinaryClassifierTrainer>("LinearSVM") }; + } + } + + private readonly ISupportBinaryOutputCombinerFactory _outputCombiner; + + public EnsembleTrainer(IHostEnvironment env, Arguments args) + : base(args, env, LoadNameValue) + { + SubModelSelector = args.SubModelSelectorType.CreateComponent(Host); + _outputCombiner = args.OutputCombiner; + Combiner = args.OutputCombiner.CreateComponent(Host); + } + + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + + private protected override TScalarPredictor CreatePredictor(List> models) + { + if (models.All(m => m.Predictor is TDistPredictor)) + return new EnsembleDistributionPredictor(Host, PredictionKind, CreateModels(models), Combiner); + return new EnsemblePredictor(Host, PredictionKind, CreateModels(models), Combiner); + } + + public TScalarPredictor CombineModels(IEnumerable models) + { + var combiner = _outputCombiner.CreateComponent(Host); + var p = models.First(); + + if (p is TDistPredictor) + { + return new EnsembleDistributionPredictor(Host, p.PredictionKind, + models.Select(k => new FeatureSubsetModel((TDistPredictor)k)).ToArray(), combiner); + } + return new EnsemblePredictor(Host, p.PredictionKind, + models.Select(k => new FeatureSubsetModel(k)).ToArray(), combiner); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.ML.Ensemble/Trainer/EnsembleDistributionPredictor.cs b/src/Microsoft.ML.Ensemble/Trainer/EnsembleDistributionPredictor.cs new file mode 100644 index 0000000000..547800c152 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/EnsembleDistributionPredictor.cs @@ -0,0 +1,226 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +// These are for deserialization from a model repository. +[assembly: LoadableClass(typeof(EnsembleDistributionPredictor), null, typeof(SignatureLoadModel), + EnsembleDistributionPredictor.UserName, EnsembleDistributionPredictor.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble +{ + using TDistPredictor = IDistPredictorProducing; + + public sealed class EnsembleDistributionPredictor : EnsemblePredictorBase, + TDistPredictor, IValueMapperDist + { + public const string UserName = "Ensemble Distribution Executor"; + public const string LoaderSignature = "EnsemDbExec"; + public const string RegistrationName = "EnsembleDistributionPredictor"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "ENSEM DB", + // verWrittenCur: 0x00010001, // Initial + //verWrittenCur: 0x00010002, // Metrics and subset info into main stream, after each predictor + verWrittenCur: 0x00010003, // Don't serialize the "IsAveraged" property of the metrics + verReadableCur: 0x00010003, + verWeCanReadBack: 0x00010002, + loaderSignature: LoaderSignature); + } + + private readonly Single[] _averagedWeights; + private readonly Median _probabilityCombiner; + private readonly IValueMapperDist[] _mappers; + + public ColumnType InputType { get; } + public ColumnType OutputType => NumberType.Float; + public ColumnType DistType => NumberType.Float; + + public override PredictionKind PredictionKind { get; } + + internal EnsembleDistributionPredictor(IHostEnvironment env, PredictionKind kind, + FeatureSubsetModel[] models, IOutputCombiner combiner, Single[] weights = null) + : base(env, RegistrationName, models, combiner, weights) + { + PredictionKind = kind; + _probabilityCombiner = new Median(env); + InputType = InitializeMappers(out _mappers); + ComputeAveragedWeights(out _averagedWeights); + } + + private EnsembleDistributionPredictor(IHostEnvironment env, ModelLoadContext ctx) + : base(env, RegistrationName, ctx) + { + PredictionKind = (PredictionKind)ctx.Reader.ReadInt32(); + _probabilityCombiner = new Median(env); + InputType = InitializeMappers(out _mappers); + ComputeAveragedWeights(out _averagedWeights); + } + + private ColumnType InitializeMappers(out IValueMapperDist[] mappers) + { + Host.AssertNonEmpty(Models); + + mappers = new IValueMapperDist[Models.Length]; + ColumnType inputType = null; + for (int i = 0; i < Models.Length; i++) + { + var vmd = Models[i].Predictor as IValueMapperDist; + if (!IsValid(vmd)) + throw Host.Except("Predictor does not implement expected interface"); + if (vmd.InputType.VectorSize > 0) + { + if (inputType == null) + inputType = vmd.InputType; + else if (vmd.InputType.VectorSize != inputType.VectorSize) + throw Host.Except("Predictor input type mismatch"); + } + mappers[i] = vmd; + } + return inputType ?? new VectorType(NumberType.Float); + } + + private bool IsValid(IValueMapperDist mapper) + { + return mapper != null + && mapper.InputType.IsVector && mapper.InputType.ItemType == NumberType.Float + && mapper.OutputType == NumberType.Float + && mapper.DistType == NumberType.Float; + } + + public static EnsembleDistributionPredictor Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new EnsembleDistributionPredictor(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // int: PredictionKind + ctx.Writer.Write((int)PredictionKind); + } + + public ValueMapper GetMapper() + { + Host.Check(typeof(TIn) == typeof(VBuffer)); + Host.Check(typeof(TOut) == typeof(Single)); + + var combine = Combiner.GetCombiner(); + var maps = GetMaps(); + var predictions = new Single[_mappers.Length]; + var probabilities = new Single[_mappers.Length]; + var vBuffers = new VBuffer[_mappers.Length]; + ValueMapper, Single> del = + (ref VBuffer src, ref Single dst) => + { + if (InputType.VectorSize > 0) + Host.Check(src.Length == InputType.VectorSize); + + var tmp = src; + Parallel.For(0, maps.Length, i => + { + var model = Models[i]; + if (model.SelectedFeatures != null) + { + EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); + maps[i](ref vBuffers[i], ref predictions[i], ref probabilities[i]); + } + else + maps[i](ref tmp, ref predictions[i], ref probabilities[i]); + }); + + // REVIEW: DistributionEnsemble - AveragedWeights are used only in one of the two PredictDistributions overloads + combine(ref dst, predictions, Weights); + }; + + return (ValueMapper)(Delegate)del; + } + + public ValueMapper GetMapper() + { + Host.Check(typeof(TIn) == typeof(VBuffer)); + Host.Check(typeof(TOut) == typeof(Single)); + Host.Check(typeof(TDist) == typeof(Single)); + + var combine = Combiner.GetCombiner(); + var combineProb = _probabilityCombiner.GetCombiner(); + var maps = GetMaps(); + var predictions = new Single[_mappers.Length]; + var probabilities = new Single[_mappers.Length]; + var vBuffers = new VBuffer[_mappers.Length]; + ValueMapper, Single, Single> del = + (ref VBuffer src, ref Single score, ref Single prob) => + { + if (InputType.VectorSize > 0) + Host.Check(src.Length == InputType.VectorSize); + + var tmp = src; + Parallel.For(0, maps.Length, i => + { + var model = Models[i]; + if (model.SelectedFeatures != null) + { + EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); + maps[i](ref vBuffers[i], ref predictions[i], ref probabilities[i]); + } + else + maps[i](ref tmp, ref predictions[i], ref probabilities[i]); + }); + + combine(ref score, predictions, _averagedWeights); + combineProb(ref prob, probabilities, _averagedWeights); + }; + + return (ValueMapper)(Delegate)del; + } + + private ValueMapper, Single, Single>[] GetMaps() + { + Host.AssertValue(_mappers); + + var maps = new ValueMapper, Single, Single>[_mappers.Length]; + for (int i = 0; i < _mappers.Length; i++) + maps[i] = _mappers[i].GetMapper, Single, Single>(); + return maps; + } + + private void ComputeAveragedWeights(out Single[] averagedWeights) + { + averagedWeights = Weights; + if (Combiner is IWeightedAverager weightedAverager && averagedWeights == null && Models[0].Metrics != null) + { + var metric = default(KeyValuePair); + bool found = false; + foreach (var m in Models[0].Metrics) + { + metric = m; + if (Utils.ExtractLettersAndNumbers(m.Key).ToLower().Equals(weightedAverager.WeightageMetricName.ToLower())) + { + found = true; + break; + } + } + if (found) + averagedWeights = Models.SelectMany(model => model.Metrics).Where(m => m.Key == metric.Key).Select(m => (Single)m.Value).ToArray(); + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictor.cs b/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictor.cs new file mode 100644 index 0000000000..08c8f0dd8d --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictor.cs @@ -0,0 +1,148 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Threading.Tasks; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: LoadableClass(typeof(EnsemblePredictor), null, typeof(SignatureLoadModel), EnsemblePredictor.UserName, + EnsemblePredictor.LoaderSignature)] + +[assembly: EntryPointModule(typeof(EnsemblePredictor))] + +namespace Microsoft.ML.Runtime.Ensemble +{ + using TScalarPredictor = IPredictorProducing; + + public sealed class EnsemblePredictor : EnsemblePredictorBase, IValueMapper + { + public const string UserName = "Ensemble Executor"; + public const string LoaderSignature = "EnsembleFloatExec"; + public const string RegistrationName = "EnsemblePredictor"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "ENSEM XX", + // verWrittenCur: 0x00010001, // Initial + //verWrittenCur: 0x00010002, // Metrics and subset info into main stream, after each predictor + verWrittenCur: 0x00010003, // Don't serialize the "IsAveraged" property of the metrics + verReadableCur: 0x00010003, + verWeCanReadBack: 0x00010002, + loaderSignature: LoaderSignature); + } + + private readonly IValueMapper[] _mappers; + + public ColumnType InputType { get; } + public ColumnType OutputType => NumberType.Float; + public override PredictionKind PredictionKind { get; } + + internal EnsemblePredictor(IHostEnvironment env, PredictionKind kind, + FeatureSubsetModel[] models, IOutputCombiner combiner, Single[] weights = null) + : base(env, LoaderSignature, models, combiner, weights) + { + PredictionKind = kind; + InputType = InitializeMappers(out _mappers); + } + + private EnsemblePredictor(IHostEnvironment env, ModelLoadContext ctx) + : base(env, RegistrationName, ctx) + { + PredictionKind = (PredictionKind)ctx.Reader.ReadInt32(); + InputType = InitializeMappers(out _mappers); + } + + private ColumnType InitializeMappers(out IValueMapper[] mappers) + { + Host.AssertNonEmpty(Models); + + mappers = new IValueMapper[Models.Length]; + ColumnType inputType = null; + for (int i = 0; i < Models.Length; i++) + { + var vm = Models[i].Predictor as IValueMapper; + if (!IsValid(vm)) + throw Host.Except("Predictor does not implement expected interface"); + if (vm.InputType.VectorSize > 0) + { + if (inputType == null) + inputType = vm.InputType; + else if (vm.InputType.VectorSize != inputType.VectorSize) + throw Host.Except("Predictor input type mismatch"); + } + mappers[i] = vm; + } + + return inputType ?? new VectorType(NumberType.Float); + } + + private bool IsValid(IValueMapper mapper) + { + return mapper != null + && mapper.InputType.IsVector && mapper.InputType.ItemType == NumberType.Float + && mapper.OutputType == NumberType.Float; + } + + public static EnsemblePredictor Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new EnsemblePredictor(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // int: _kind + ctx.Writer.Write((int)PredictionKind); + } + + public ValueMapper GetMapper() + { + Host.Check(typeof(TIn) == typeof(VBuffer)); + Host.Check(typeof(TOut) == typeof(Single)); + + var combine = Combiner.GetCombiner(); + var predictions = new Single[_mappers.Length]; + var buffers = new VBuffer[_mappers.Length]; + var maps = new ValueMapper, Single>[_mappers.Length]; + for (int i = 0; i < _mappers.Length; i++) + maps[i] = _mappers[i].GetMapper, Single>(); + + ValueMapper, Single> del = + (ref VBuffer src, ref Single dst) => + { + if (InputType.VectorSize > 0) + Host.Check(src.Length == InputType.VectorSize); + + var tmp = src; + Parallel.For(0, maps.Length, i => + { + var model = Models[i]; + if (model.SelectedFeatures != null) + { + EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref buffers[i]); + maps[i](ref buffers[i], ref predictions[i]); + } + else + maps[i](ref tmp, ref predictions[i]); + }); + + combine(ref dst, predictions, Weights); + }; + + return (ValueMapper)(Delegate)del; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictorBase.cs b/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictorBase.cs new file mode 100644 index 0000000000..3d5c871117 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictorBase.cs @@ -0,0 +1,164 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +namespace Microsoft.ML.Runtime.Ensemble +{ + public abstract class EnsemblePredictorBase : PredictorBase, + IPredictorProducing, ICanSaveInTextFormat, ICanSaveModel, ICanSaveSummary + where TPredictor : class, IPredictorProducing + { + private const string SubPredictorFmt = "SubPredictor_{0:000}"; + + protected readonly FeatureSubsetModel[] Models; + protected readonly IOutputCombiner Combiner; + protected readonly Single[] Weights; + + private const uint VerOld = 0x00010002; + + protected EnsemblePredictorBase(IHostEnvironment env, string name, FeatureSubsetModel[] models, + IOutputCombiner combiner, Single[] weights) + : base(env, name) + { + + Host.Check(Utils.Size(models) > 0, "Ensemble was created with no models."); + Host.Check(weights == null || weights.Length == models.Length); + + Models = models; + Combiner = combiner; + Weights = weights; + } + + protected EnsemblePredictorBase(IHostEnvironment env, string name, ModelLoadContext ctx) + : base(env, name, ctx) + { + // *** Binary format *** + // int: model count + // int: weight count (0 or model count) + // Float[]: weights + // for each model: + // int: number of SelectedFeatures (in bits) + // byte[]: selected features (as many as needed for number of bits == (numSelectedFeatures + 7) / 8) + // int: number of Metric values + // for each Metric: + // Float: metric value + // int: metric name (id of the metric name in the string table) + // in version 0x0001x0002: + // bool: is the metric averaged + + int count = ctx.Reader.ReadInt32(); + Host.CheckDecode(count > 0); + + int weightCount = ctx.Reader.ReadInt32(); + Host.CheckDecode(weightCount == 0 || weightCount == count); + Weights = ctx.Reader.ReadFloatArray(weightCount); + + Models = new FeatureSubsetModel[count]; + var ver = ctx.Header.ModelVerWritten; + for (int i = 0; i < count; i++) + { + ctx.LoadModel(Host, out IPredictor p, string.Format(SubPredictorFmt, i)); + var predictor = p as TPredictor; + Host.Check(p != null, "Inner predictor type not compatible with the ensemble type."); + var features = ctx.Reader.ReadBitArray(); + int numMetrics = ctx.Reader.ReadInt32(); + Host.CheckDecode(numMetrics >= 0); + var metrics = new KeyValuePair[numMetrics]; + for (int j = 0; j < numMetrics; j++) + { + var metricValue = ctx.Reader.ReadFloat(); + var metricName = ctx.LoadStringOrNull(); + if (ver == VerOld) + ctx.Reader.ReadBoolByte(); + metrics[j] = new KeyValuePair(metricName, metricValue); + } + Models[i] = new FeatureSubsetModel(predictor, features, metrics); + } + ctx.LoadModel, SignatureLoadModel>(Host, out Combiner, @"Combiner"); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + + // *** Binary format *** + // int: model count + // int: weight count (0 or model count) + // Single[]: weights + // for each model: + // int: number of SelectedFeatures (in bits) + // byte[]: selected features (as many as needed for number of bits == (numSelectedFeatures + 7) / 8) + // int: number of Metric values + // for each Metric: + // Single: metric value + // int: metric name (id of the metric name in the string table) + + ctx.Writer.Write(Models.Length); + ctx.Writer.WriteFloatArray(Weights); + + // Save other streams. + for (int i = 0; i < Models.Length; i++) + { + var model = Models[i]; + ctx.SaveModel(model.Predictor, string.Format(SubPredictorFmt, i)); + Host.AssertValueOrNull(model.SelectedFeatures); + ctx.Writer.WriteBitArray(model.SelectedFeatures); + Host.AssertValueOrNull(model.Metrics); + int numMetrics = Utils.Size(model.Metrics); + ctx.Writer.Write(numMetrics); + for (int j = 0; j < numMetrics; j++) + { + var metric = model.Metrics[j]; + ctx.Writer.Write((Single)metric.Value); + ctx.SaveStringOrNull(metric.Key); + } + } + ctx.SaveModel(Combiner, @"Combiner"); + } + + /// + /// Output the INI model to a given writer + /// + public void SaveAsText(TextWriter writer, RoleMappedSchema schema) + { + using (var ch = Host.Start("SaveAsText")) + { + for (int i = 0; i < Models.Length; i++) + { + writer.WriteLine(";; Partition model {0}", i); + writer.WriteLine(";; Weight={0}", (Weights != null ? Weights[i] : 1)); + PredictorUtils.SaveText(ch, Models[i].Predictor, schema, writer); + } + ch.Done(); + } + } + + /// + /// Saves the model summary + /// + public void SaveSummary(TextWriter writer, RoleMappedSchema schema) + { + for (int i = 0; i < Models.Length; i++) + { + writer.WriteLine(";; Partition model {0}", i); + writer.WriteLine(";; Weight={0}", (Weights != null ? Weights[i] : 1)); + + // REVIEW: The featureName Collection names may vary for different base learners. + // How do we get the right collection for the base learners? + if (Models[i].Predictor is ICanSaveSummary summaryModel) + summaryModel.SaveSummary(writer, schema); + else + writer.WriteLine("The Model {0} does not support saving summaries", Models[i].GetType().Name); + } + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Trainer/EnsembleTrainerBase.cs b/src/Microsoft.ML.Ensemble/Trainer/EnsembleTrainerBase.cs new file mode 100644 index 0000000000..0a350ef8ee --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/EnsembleTrainerBase.cs @@ -0,0 +1,229 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Ensemble.Selector.SubsetSelector; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Training; + +namespace Microsoft.ML.Runtime.Ensemble +{ + using Stopwatch = System.Diagnostics.Stopwatch; + + public abstract class EnsembleTrainerBase : TrainerBase + where TPredictor : class, IPredictorProducing + where TSelector : class, ISubModelSelector + where TCombiner : class, IOutputCombiner + { + public abstract class ArgumentsBase : LearnerInputBaseWithLabel + { + [Argument(ArgumentType.AtMostOnce, + HelpText = "Number of models per batch. If not specified, will default to 50 if there is only one base predictor, " + + "or the number of base predictors otherwise.", ShortName = "nm", SortOrder = 3)] + [TGUI(Label = "Number of Models per batch")] + public int? NumModels; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Batch size", ShortName = "bs", SortOrder = 107)] + [TGUI(Label = "Batch Size", + Description = + "Number of instances to be loaded in memory to create an ensemble out of it. All the instances will be loaded if the value is -1.")] + public int BatchSize = -1; + + [Argument(ArgumentType.Multiple, HelpText = "Sampling Type", ShortName = "st", SortOrder = 2)] + [TGUI(Label = "Sampling Type", Description = "Subset Selection Algorithm to induce the base learner.Sub-settings can be used to select the features")] + public ISupportSubsetSelectorFactory SamplingType = new BootstrapSelector.Arguments(); + + [Argument(ArgumentType.AtMostOnce, HelpText = "All the base learners will run asynchronously if the value is true", ShortName = "tp", SortOrder = 106)] + [TGUI(Label = "Train parallel", Description = "All the base learners will run asynchronously if the value is true")] + public bool TrainParallel; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "True, if metrics for each model need to be evaluated and shown in comparison table. This is done by using validation set if available or the training set", + ShortName = "sm", SortOrder = 108)] + [TGUI(Label = "Show Sub-Model Metrics")] + public bool ShowMetrics; + + [Argument(ArgumentType.Multiple, HelpText = "Base predictor type", ShortName = "bp,basePredictorTypes", SortOrder = 1, Visibility = ArgumentAttribute.VisibilityType.CmdLineOnly)] + public SubComponent>, TSig>[] BasePredictors; + } + + private const int DefaultNumModels = 50; + /// Command-line arguments + private protected readonly ArgumentsBase Args; + private protected readonly int NumModels; + + /// Ensemble members + private protected readonly ITrainer>[] Trainers; + + private readonly ISubsetSelector _subsetSelector; + private protected ISubModelSelector SubModelSelector; + private protected IOutputCombiner Combiner; + + public override TrainerInfo Info { get; } + + private protected EnsembleTrainerBase(ArgumentsBase args, IHostEnvironment env, string name) + : base(env, name) + { + Args = args; + + using (var ch = Host.Start("Init")) + { + ch.CheckUserArg(Utils.Size(Args.BasePredictors) > 0, nameof(Args.BasePredictors), "This should have at-least one value"); + + NumModels = Args.NumModels ?? + (Args.BasePredictors.Length == 1 ? DefaultNumModels : Args.BasePredictors.Length); + + ch.CheckUserArg(NumModels > 0, nameof(Args.NumModels), "Must be positive, or null to indicate numModels is the number of base predictors"); + + if (Utils.Size(Args.BasePredictors) > NumModels) + ch.Warning("The base predictor count is greater than models count. Some of the base predictors will be ignored."); + + _subsetSelector = Args.SamplingType.CreateComponent(Host); + + Trainers = new ITrainer>[NumModels]; + for (int i = 0; i < Trainers.Length; i++) + Trainers[i] = Args.BasePredictors[i % Args.BasePredictors.Length].CreateInstance(Host); + // We infer normalization and calibration preferences from the trainers. However, even if the internal trainers + // don't need caching we are performing multiple passes over the data, so it is probably appropriate to always cache. + Info = new TrainerInfo( + normalization: Trainers.Any(t => t.Info.NeedNormalization), + calibration: Trainers.Any(t => t.Info.NeedCalibration)); + ch.Done(); + } + } + + public sealed override TPredictor Train(TrainContext context) + { + Host.CheckValue(context, nameof(context)); + + using (var ch = Host.Start("Training")) + { + var pred = TrainCore(ch, context.TrainingSet); + ch.Done(); + return pred; + } + } + + private TPredictor TrainCore(IChannel ch, RoleMappedData data) + { + Host.AssertValue(ch); + ch.AssertValue(data); + + // 1. Subset Selection + var stackingTrainer = Combiner as IStackingTrainer; + + //REVIEW: Implement stacking for Batch mode. + ch.CheckUserArg(stackingTrainer == null || Args.BatchSize <= 0, nameof(Args.BatchSize), "Stacking works only with Non-batch mode"); + + var validationDataSetProportion = SubModelSelector.ValidationDatasetProportion; + if (stackingTrainer != null) + validationDataSetProportion = Math.Max(validationDataSetProportion, stackingTrainer.ValidationDatasetProportion); + + var needMetrics = Args.ShowMetrics || Combiner is IWeightedAverager; + var models = new List>>(); + + _subsetSelector.Initialize(data, NumModels, Args.BatchSize, validationDataSetProportion); + int batchNumber = 1; + foreach (var batch in _subsetSelector.GetBatches(Host.Rand)) + { + // 2. Core train + ch.Info("Training {0} learners for the batch {1}", Trainers.Length, batchNumber++); + var batchModels = new FeatureSubsetModel>[Trainers.Length]; + + Parallel.ForEach(_subsetSelector.GetSubsets(batch, Host.Rand), + new ParallelOptions() { MaxDegreeOfParallelism = Args.TrainParallel ? -1 : 1 }, + (subset, state, index) => + { + ch.Info("Beginning training model {0} of {1}", index + 1, Trainers.Length); + Stopwatch sw = Stopwatch.StartNew(); + try + { + if (EnsureMinimumFeaturesSelected(subset)) + { + var model = new FeatureSubsetModel>( + Trainers[(int)index].Train(subset.Data), + subset.SelectedFeatures, + null); + SubModelSelector.CalculateMetrics(model, _subsetSelector, subset, batch, needMetrics); + batchModels[(int)index] = model; + } + } + catch (Exception ex) + { + ch.Assert(batchModels[(int)index] == null); + ch.Warning(ex.Sensitivity(), "Trainer {0} of {1} was not learned properly due to the exception '{2}' and will not be added to models.", + index + 1, Trainers.Length, ex.Message); + } + ch.Info("Trainer {0} of {1} finished in {2}", index + 1, Trainers.Length, sw.Elapsed); + }); + + var modelsList = batchModels.Where(m => m != null).ToList(); + if (Args.ShowMetrics) + PrintMetrics(ch, modelsList); + + modelsList = SubModelSelector.Prune(modelsList).ToList(); + + if (stackingTrainer != null) + stackingTrainer.Train(modelsList, _subsetSelector.GetTestData(null, batch), Host); + + models.AddRange(modelsList); + int modelSize = Utils.Size(models); + if (modelSize < Utils.Size(Trainers)) + ch.Warning("{0} of {1} trainings failed.", Utils.Size(Trainers) - modelSize, Utils.Size(Trainers)); + ch.Check(modelSize > 0, "Ensemble training resulted in no valid models."); + } + return CreatePredictor(models); + } + + private protected abstract TPredictor CreatePredictor(List>> models); + + private bool EnsureMinimumFeaturesSelected(Subset subset) + { + if (subset.SelectedFeatures == null) + return true; + for (int i = 0; i < subset.SelectedFeatures.Count; i++) + { + if (subset.SelectedFeatures[i]) + return true; + } + + return false; + } + + private protected virtual void PrintMetrics(IChannel ch, List>> models) + { + // REVIEW: The formatting of this method is bizarre and seemingly not even self-consistent + // w.r.t. its usage of |. Is this intentional? + if (models.Count == 0 || models[0].Metrics == null) + return; + + ch.Info("{0}| Name of Model |", string.Join("", models[0].Metrics.Select(m => string.Format("| {0} |", m.Key)))); + + foreach (var model in models) + ch.Info("{0}{1}", string.Join("", model.Metrics.Select(m => string.Format("| {0} |", m.Value))), model.Predictor.GetType().Name); + } + + private protected static FeatureSubsetModel[] CreateModels(List>> models) where T : IPredictor + { + var subsetModels = new FeatureSubsetModel[models.Count]; + for (int i = 0; i < models.Count; i++) + { + subsetModels[i] = new FeatureSubsetModel( + (T)models[i].Predictor, + models[i].SelectedFeatures, + models[i].Metrics); + } + return subsetModels; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Trainer/Multiclass/EnsembleMultiClassPredictor.cs b/src/Microsoft.ML.Ensemble/Trainer/Multiclass/EnsembleMultiClassPredictor.cs new file mode 100644 index 0000000000..558d0afd6e --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/Multiclass/EnsembleMultiClassPredictor.cs @@ -0,0 +1,157 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Threading.Tasks; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(EnsembleMultiClassPredictor), null, typeof(SignatureLoadModel), + EnsembleMultiClassPredictor.UserName, EnsembleMultiClassPredictor.LoaderSignature)] + +namespace Microsoft.ML.Runtime.Ensemble +{ + using TVectorPredictor = IPredictorProducing>; + + public sealed class EnsembleMultiClassPredictor : EnsemblePredictorBase>, IValueMapper + { + public const string UserName = "Ensemble Multiclass Executor"; + public const string LoaderSignature = "EnsemMcExec"; + public const string RegistrationName = "EnsembleMultiClassPredictor"; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "ENSEM MC", + // verWrittenCur: 0x00010001, // Initial + //verWrittenCur: 0x00010002, // Metrics and subset info into main stream, after each predictor + verWrittenCur: 0x00010003, // Don't serialize the "IsAveraged" property of the metrics + verReadableCur: 0x00010003, + verWeCanReadBack: 0x00010002, + loaderSignature: LoaderSignature); + } + + private readonly ColumnType _inputType; + private readonly ColumnType _outputType; + private readonly IValueMapper[] _mappers; + + public ColumnType InputType { get { return _inputType; } } + public ColumnType OutputType { get { return _outputType; } } + + internal EnsembleMultiClassPredictor(IHostEnvironment env, FeatureSubsetModel[] models, + IMultiClassOutputCombiner combiner, Single[] weights = null) + : base(env, RegistrationName, models, combiner, weights) + { + InitializeMappers(out _mappers, out _inputType, out _outputType); + } + + private EnsembleMultiClassPredictor(IHostEnvironment env, ModelLoadContext ctx) + : base(env, RegistrationName, ctx) + { + InitializeMappers(out _mappers, out _inputType, out _outputType); + } + + private void InitializeMappers(out IValueMapper[] mappers, out ColumnType inputType, out ColumnType outputType) + { + Host.AssertNonEmpty(Models); + + mappers = new IValueMapper[Models.Length]; + inputType = null; + outputType = null; + for (int i = 0; i < Models.Length; i++) + { + var vm = Models[i].Predictor as IValueMapper; + if (!IsValid(vm)) + throw Host.Except("Predictor does not implement expected interface"); + if (vm.InputType.VectorSize > 0) + { + if (inputType == null) + inputType = vm.InputType; + else if (vm.InputType.VectorSize != inputType.VectorSize) + throw Host.Except("Predictor input type mismatch"); + } + + if (outputType == null || vm.OutputType.VectorSize > outputType.VectorSize) + outputType = vm.OutputType; + + mappers[i] = vm; + } + Host.AssertValue(outputType); + + if (inputType == null) + inputType = new VectorType(NumberType.Float); + } + + public static EnsembleMultiClassPredictor Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new EnsembleMultiClassPredictor(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public override PredictionKind PredictionKind { get { return PredictionKind.MultiClassClassification; } } + + public ValueMapper GetMapper() + { + Host.Check(typeof(TIn) == typeof(VBuffer)); + Host.Check(typeof(TOut) == typeof(VBuffer)); + + var combine = Combiner.GetCombiner(); + var features = new VBuffer[_mappers.Length]; + var predictions = new VBuffer[_mappers.Length]; + var maps = new ValueMapper, VBuffer>[_mappers.Length]; + for (int i = 0; i < _mappers.Length; i++) + { + // IsValid method ensures we go this else path only if the OutputType.VectorSize of + // all _mappers is greater than zero + Host.Assert(_mappers[i].OutputType.VectorSize > 0); + maps[i] = _mappers[i].GetMapper, VBuffer>(); + } + + ValueMapper, VBuffer> del = + (ref VBuffer src, ref VBuffer dst) => + { + if (_inputType.VectorSize > 0) + Host.Check(src.Length == _inputType.VectorSize); + + var tmp = src; + Parallel.For(0, maps.Length, i => + { + var model = Models[i]; + if (model.SelectedFeatures != null) + { + EnsembleUtils.SelectFeatures(ref tmp, model.SelectedFeatures, model.Cardinality, ref features[i]); + maps[i](ref features[i], ref predictions[i]); + } + else + maps[i](ref tmp, ref predictions[i]); + + // individual maps delegates will return always the same VBuffer length + Host.Check(predictions[i].Length == _mappers[i].OutputType.VectorSize); + }); + + combine(ref dst, predictions, Weights); + }; + + return (ValueMapper)(Delegate)del; + } + + private bool IsValid(IValueMapper mapper) + { + return mapper != null + && mapper.InputType.IsVector && mapper.InputType.ItemType == NumberType.Float + && mapper.OutputType.VectorSize > 0 && mapper.OutputType.ItemType == NumberType.Float; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Trainer/Multiclass/MulticlassDataPartitionEnsembleTrainer.cs b/src/Microsoft.ML.Ensemble/Trainer/Multiclass/MulticlassDataPartitionEnsembleTrainer.cs new file mode 100644 index 0000000000..4421cd5838 --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/Multiclass/MulticlassDataPartitionEnsembleTrainer.cs @@ -0,0 +1,80 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(MulticlassDataPartitionEnsembleTrainer.Summary, typeof(MulticlassDataPartitionEnsembleTrainer), + typeof(MulticlassDataPartitionEnsembleTrainer.Arguments), + new[] { typeof(SignatureMultiClassClassifierTrainer), typeof(SignatureTrainer) }, + MulticlassDataPartitionEnsembleTrainer.UserNameValue, + MulticlassDataPartitionEnsembleTrainer.LoadNameValue)] + +namespace Microsoft.ML.Runtime.Ensemble +{ + using TVectorPredictor = IPredictorProducing>; + /// + /// A generic ensemble classifier for multi-class classification + /// + public sealed class MulticlassDataPartitionEnsembleTrainer : + EnsembleTrainerBase, EnsembleMultiClassPredictor, + IMulticlassSubModelSelector, IMultiClassOutputCombiner, SignatureMultiClassClassifierTrainer>, + IModelCombiner + { + public const string LoadNameValue = "WeightedEnsembleMulticlass"; + public const string UserNameValue = "Multi-class Parallel Ensemble (bagging, stacking, etc)"; + public const string Summary = "A generic ensemble classifier for multi-class classification."; + + public sealed class Arguments : ArgumentsBase + { + [Argument(ArgumentType.Multiple, HelpText = "Algorithm to prune the base learners for selective Ensemble", ShortName = "pt", SortOrder = 4)] + [TGUI(Label = "Sub-Model Selector(pruning) Type", Description = "Algorithm to prune the base learners for selective Ensemble")] + public ISupportMulticlassSubModelSelectorFactory SubModelSelectorType = new AllSelectorMultiClassFactory(); + + [Argument(ArgumentType.Multiple, HelpText = "Output combiner", ShortName = "oc", SortOrder = 5)] + [TGUI(Label = "Output combiner", Description = "Output combiner type")] + public ISupportMulticlassOutputCombinerFactory OutputCombiner = new MultiMedian.Arguments(); + + public Arguments() + { + BasePredictors = new[] { new SubComponent, SignatureMultiClassClassifierTrainer>("MultiClassLogisticRegression") }; + } + } + + private readonly ISupportMulticlassOutputCombinerFactory _outputCombiner; + + public MulticlassDataPartitionEnsembleTrainer(IHostEnvironment env, Arguments args) + : base(args, env, LoadNameValue) + { + SubModelSelector = args.SubModelSelectorType.CreateComponent(Host); + _outputCombiner = args.OutputCombiner; + Combiner = args.OutputCombiner.CreateComponent(Host); + } + + public override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; + + private protected override EnsembleMultiClassPredictor CreatePredictor(List> models) + { + return new EnsembleMultiClassPredictor(Host, CreateModels(models), Combiner as IMultiClassOutputCombiner); + } + + public TVectorPredictor CombineModels(IEnumerable models) + { + var predictor = new EnsembleMultiClassPredictor(Host, + models.Select(k => new FeatureSubsetModel(k)).ToArray(), + _outputCombiner.CreateComponent(Host)); + + return predictor; + } + } +} diff --git a/src/Microsoft.ML.Ensemble/Trainer/Regression/RegressionEnsembleTrainer.cs b/src/Microsoft.ML.Ensemble/Trainer/Regression/RegressionEnsembleTrainer.cs new file mode 100644 index 0000000000..1cc36f20cd --- /dev/null +++ b/src/Microsoft.ML.Ensemble/Trainer/Regression/RegressionEnsembleTrainer.cs @@ -0,0 +1,76 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Ensemble.EntryPoints; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Ensemble; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; +using Microsoft.ML.Runtime.Ensemble.Selector; +using Microsoft.ML.Runtime.Internal.Internallearn; + +[assembly: LoadableClass(typeof(RegressionEnsembleTrainer), typeof(RegressionEnsembleTrainer.Arguments), + new[] { typeof(SignatureRegressorTrainer), typeof(SignatureTrainer) }, + RegressionEnsembleTrainer.UserNameValue, + RegressionEnsembleTrainer.LoadNameValue)] + +namespace Microsoft.ML.Runtime.Ensemble +{ + using TScalarPredictor = IPredictorProducing; + public sealed class RegressionEnsembleTrainer : EnsembleTrainerBase, + IModelCombiner + { + public const string LoadNameValue = "EnsembleRegression"; + public const string UserNameValue = "Regression Ensemble (bagging, stacking, etc)"; + + public sealed class Arguments : ArgumentsBase + { + [Argument(ArgumentType.Multiple, HelpText = "Algorithm to prune the base learners for selective Ensemble", ShortName = "pt", SortOrder = 4)] + [TGUI(Label = "Sub-Model Selector(pruning) Type", Description = "Algorithm to prune the base learners for selective Ensemble")] + public ISupportRegressionSubModelSelectorFactory SubModelSelectorType = new AllSelectorFactory(); + + [Argument(ArgumentType.Multiple, HelpText = "Output combiner", ShortName = "oc", SortOrder = 5)] + [TGUI(Label = "Output combiner", Description = "Output combiner type")] + public ISupportRegressionOutputCombinerFactory OutputCombiner = new MedianFactory(); + + public Arguments() + { + BasePredictors = new[] { new SubComponent, SignatureRegressorTrainer>("OnlineGradientDescent") }; + } + } + + private readonly ISupportRegressionOutputCombinerFactory _outputCombiner; + + public RegressionEnsembleTrainer(IHostEnvironment env, Arguments args) + : base(args, env, LoadNameValue) + { + SubModelSelector = args.SubModelSelectorType.CreateComponent(Host); + _outputCombiner = args.OutputCombiner; + Combiner = args.OutputCombiner.CreateComponent(Host); + } + + public override PredictionKind PredictionKind => PredictionKind.Regression; + + private protected override TScalarPredictor CreatePredictor(List> models) + { + return new EnsemblePredictor(Host, PredictionKind, CreateModels(models), Combiner); + } + + public TScalarPredictor CombineModels(IEnumerable models) + { + var combiner = _outputCombiner.CreateComponent(Host); + var p = models.First(); + + var predictor = new EnsemblePredictor(Host, p.PredictionKind, + models.Select(k => new FeatureSubsetModel(k)).ToArray(), combiner); + + return predictor; + } + } +} diff --git a/src/Microsoft.ML.FastTree/Application/LogLossApplication.cs b/src/Microsoft.ML.FastTree/Application/LogLossApplication.cs index b629cbdbba..15d449ea72 100644 --- a/src/Microsoft.ML.FastTree/Application/LogLossApplication.cs +++ b/src/Microsoft.ML.FastTree/Application/LogLossApplication.cs @@ -107,15 +107,6 @@ protected override void GetGradientInOneQuery(int query, int threadIndex) _gradient[d1] += delta; _gradient[d2] -= delta; - /* - double labelDiff = (labels[d1] - labels[d2]); - double margin = labelDiff * (_scores[d1] - _scores[d2]); - if (_coef - margin > 0) - { - _gradient[d1] += 0.01 * labelDiff; - _gradient[d2] -= 0.01 * labelDiff; - } - */ } } } diff --git a/src/Microsoft.ML.FastTree/Application/WinLossSurplusApplication.cs b/src/Microsoft.ML.FastTree/Application/WinLossSurplusApplication.cs index a36f9ccb76..5e73aae00c 100644 --- a/src/Microsoft.ML.FastTree/Application/WinLossSurplusApplication.cs +++ b/src/Microsoft.ML.FastTree/Application/WinLossSurplusApplication.cs @@ -120,7 +120,6 @@ protected override void GetGradientInOneQuery(int query, int threadIndex) double inverseMaxDCG = _inverseMaxDCGT[query]; - //int[] permutation = (threadIndex < 0 ? new int[numDocuments] : _permutationBuffers[threadIndex]); int[] permutation = _permutationBuffers[threadIndex]; short[] labels = Labels; diff --git a/src/Microsoft.ML.FastTree/BinFile/IniFileParserInterface.cs b/src/Microsoft.ML.FastTree/BinFile/IniFileParserInterface.cs index c4b1af9a7c..994b711510 100644 --- a/src/Microsoft.ML.FastTree/BinFile/IniFileParserInterface.cs +++ b/src/Microsoft.ML.FastTree/BinFile/IniFileParserInterface.cs @@ -42,15 +42,15 @@ private static class Native [DllImport(DllName, CharSet = CharSet.Ansi, EntryPoint = "FeatureMapGetFeatureName")] [return: MarshalAs(UnmanagedType.U1)] - public unsafe static extern bool GetFeatureName(IntPtr pObject, UInt32 featureIndex, byte[] buffer, UInt32 sizeOfBuffer, IntPtr resultLength); + public static extern unsafe bool GetFeatureName(IntPtr pObject, UInt32 featureIndex, byte[] buffer, UInt32 sizeOfBuffer, IntPtr resultLength); [DllImport(DllName, CharSet = CharSet.Ansi, EntryPoint = "InputExtractorGetInputName")] [return: MarshalAs(UnmanagedType.U1)] - public unsafe static extern bool GetInputName(IntPtr pObject, UInt32 featureIndex, byte[] buffer, UInt32 sizeOfBuffer, IntPtr resultLength); + public static extern unsafe bool GetInputName(IntPtr pObject, UInt32 featureIndex, byte[] buffer, UInt32 sizeOfBuffer, IntPtr resultLength); [DllImport(DllName, CharSet = CharSet.Ansi)] [return: MarshalAs(UnmanagedType.U1)] - public unsafe static extern bool GetSectionContent(IntPtr pObject, string sectionName, byte[] buffer, UInt32 sizeOfBuffer, IntPtr resultLength); + public static extern unsafe bool GetSectionContent(IntPtr pObject, string sectionName, byte[] buffer, UInt32 sizeOfBuffer, IntPtr resultLength); [DllImport(DllName, EntryPoint = "InputExtractorGetInputCount")] public static extern UInt32 GetInputCount(IntPtr pObject); @@ -59,17 +59,17 @@ private static class Native public static extern IntPtr GetInput(IntPtr pObject, UInt32 index); [DllImport(DllName, EntryPoint = "InputGetFeatures")] - public static unsafe extern void GetInputFeatures(IntPtr pInput, UInt32[] features, UInt32 sizeOfFeatures, out UInt32 featureCount); + public static extern unsafe void GetInputFeatures(IntPtr pInput, UInt32[] features, UInt32 sizeOfFeatures, out UInt32 featureCount); [DllImport(DllName, EntryPoint = "InputIsCopy")] [return: MarshalAs(UnmanagedType.U1)] - public unsafe static extern bool IsCopyInput(IntPtr pInput); + public static extern unsafe bool IsCopyInput(IntPtr pInput); [DllImport(DllName, EntryPoint = "InputEvaluate")] - public static unsafe extern double EvaluateInput(IntPtr pInput, UInt32* input); + public static extern unsafe double EvaluateInput(IntPtr pInput, UInt32* input); [DllImport(DllName, EntryPoint = "InputEvaluateMany")] - public static unsafe extern void EvaluateMany(IntPtr pInput, UInt32*[] inputs, double* outputs, UInt32 count); + public static extern unsafe void EvaluateMany(IntPtr pInput, UInt32*[] inputs, double* outputs, UInt32 count); [DllImport(DllName, EntryPoint = "InputExtractorGetFeatureMap")] public static extern IntPtr GetFeatureMap(IntPtr pExtractor); diff --git a/src/Microsoft.ML.FastTree/Dataset/DenseIntArray.cs b/src/Microsoft.ML.FastTree/Dataset/DenseIntArray.cs index 508a6a5229..ca98c91d2d 100644 --- a/src/Microsoft.ML.FastTree/Dataset/DenseIntArray.cs +++ b/src/Microsoft.ML.FastTree/Dataset/DenseIntArray.cs @@ -70,18 +70,18 @@ public override IntArray[] Split(int[][] assignment) #if USE_FASTTREENATIVE [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall)] - private unsafe static extern int C_Sumup_float( + private static extern unsafe int C_Sumup_float( int numBits, byte* pData, int* pIndices, float* pSampleOutputs, double* pSampleOutputWeights, FloatType* pSumTargetsByBin, double* pSumTargets2ByBin, int* pCountByBin, int totalCount, double totalSampleOutputs, double totalSampleOutputWeights); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall)] - private unsafe static extern int C_Sumup_double( + private static extern unsafe int C_Sumup_double( int numBits, byte* pData, int* pIndices, double* pSampleOutputs, double* pSampleOutputWeights, FloatType* pSumTargetsByBin, double* pSumTargets2ByBin, int* pCountByBin, int totalCount, double totalSampleOutputs, double totalSampleOutputWeights); - protected unsafe static void SumupCPlusPlusDense(SumupInputData input, FeatureHistogram histogram, + protected static unsafe void SumupCPlusPlusDense(SumupInputData input, FeatureHistogram histogram, byte* data, int numBits) { using (Timer.Time(TimerEvent.SumupCppDense)) diff --git a/src/Microsoft.ML.FastTree/Dataset/FeatureFlock.cs b/src/Microsoft.ML.FastTree/Dataset/FeatureFlock.cs index 2c58f55603..642c2349e8 100644 --- a/src/Microsoft.ML.FastTree/Dataset/FeatureFlock.cs +++ b/src/Microsoft.ML.FastTree/Dataset/FeatureFlock.cs @@ -47,7 +47,7 @@ public PerBinStats(Double sumTargets, Double sumWeights, int count) /// These objects are stateful, reusable objects that enable the collection of sufficient /// stats per feature flock, per node or leaf of a tree, to enable it to find the "best" /// splits. - /// + /// /// Each instance of this corresponds to a single flock, but multiple of these will be created /// per flock. Note that feature indices, whenever present, refer to the feature within the /// particular flock the same as they do with . @@ -176,7 +176,7 @@ public void Subtract(SufficientStatsBase other) protected abstract double GetBinGradient(int featureIndex, double bias); /// - /// Get a fullcopy of histogram for one sub feature. + /// Get a fullcopy of histogram for one sub feature. /// public void CopyFeatureHistogram(int subfeatureIndex, ref PerBinStats[] hist) { @@ -698,20 +698,6 @@ public void FillSplitCandidatesCategoricalLowPopulation(LeastSquaresRegressionTr var binStats = virtualBins[i]; catFeatureCount += 1 + binStats.SubFeatures.Length; - /*int feature = features[i]; - int subfeature = feature - featureMin; - Contracts.Assert(0 <= subfeature && subfeature < Flock.Count); - Contracts.Assert(subfeature <= feature); - Contracts.Assert(learner.TrainData.FlockToFirstFeature(flock) == feature - subfeature); - Contracts.Assert(featureUseCount[feature] >= 0); - Contracts.Assert(Flock.BinCount(subfeature) == 2); - Contracts.Assert(GetMaxBorder(subfeature) == GetMinBorder(subfeature)); - - var binStats = GetBinStats(GetMinBorder(subfeature)); - sumGTTargets += binStats.SumTargets; - if (hasWeights) - sumGTWeights += binStats.SumWeights;*/ - sumGTTargets += binStats.SumTargets; gtCount += binStats.Count; docsInCurrentGroup += binStats.Count; @@ -934,20 +920,6 @@ public void FillSplitCandidatesCategoricalNeighborBundling(LeastSquaresRegressio var binStats = virtualBins[i]; catFeatureCount += 1 + binStats.SubFeatures.Length; - /*int feature = features[i]; - int subfeature = feature - featureMin; - Contracts.Assert(0 <= subfeature && subfeature < Flock.Count); - Contracts.Assert(subfeature <= feature); - Contracts.Assert(learner.TrainData.FlockToFirstFeature(flock) == feature - subfeature); - Contracts.Assert(featureUseCount[feature] >= 0); - Contracts.Assert(Flock.BinCount(subfeature) == 2); - Contracts.Assert(GetMaxBorder(subfeature) == GetMinBorder(subfeature)); - - var binStats = GetBinStats(GetMinBorder(subfeature)); - sumGTTargets += binStats.SumTargets; - if (hasWeights) - sumGTWeights += binStats.SumWeights;*/ - sumGTTargets += binStats.SumTargets; gtCount += binStats.Count; docsInCurrentGroup += binStats.Count; @@ -1067,7 +1039,7 @@ protected sealed override void SubtractCore(SufficientStatsBase other) /// A feature flock is a collection of features, grouped together because storing the /// features and performing the key operations on them in a collection can be done /// more efficiently than if they were stored as separate features. - /// + /// /// Since this is a collection of features, feature specific quantities and methods /// will have a feature index parameter. Note that this index is always, for every /// flock, from 0 up to but not including . Now, @@ -1160,7 +1132,7 @@ public virtual IIntArrayForwardIndexer GetIndexer(int featureIndex) public abstract double[] BinUpperBounds(int featureIndex); /// - /// If you need to implement you can use + /// If you need to implement you can use /// . This will be slower than a /// specialized implementation but is at least a useful shim. /// @@ -1244,10 +1216,10 @@ internal abstract class SinglePartitionedIntArrayFlockBase : FeatureF /// /// Imagine we have a six row dataset, with two features, which if stored separately in, /// say, a , would have bin values as follows. - /// + /// /// f0 = { 0, 1, 0, 0, 2, 0} /// f1 = { 0, 0, 1, 0, 0, 1} - /// + /// /// These two are a candidate for a , because they never both /// have a non-zero bin value for any row. Then, in order to represent this in this feature, /// we would pass in this value for the : @@ -1259,18 +1231,18 @@ internal abstract class SinglePartitionedIntArrayFlockBase : FeatureF /// what feature is which can be reconstructed from , which /// for each feature specifies the range in corresponding to the /// "logical" bin value for that feature starting from 1. - /// + /// /// Note that it would also have been legal for to be /// larger than the actual observed range, e.g., it could have been: /// = { 1, 5, 8} /// or something. This could happen if binning happened over a different dataset from the data /// being represented right now, for example, but this is a more complex case. - /// + /// /// The would contain the upper bounds for both of these features, /// which would be arrays large enough so that the maximum value of the logical bin for each feature /// in the flock could index it. (So in this example, the first bin upper bound would be at least /// length 3, and the second at least length 2.) - /// + /// /// The indicates if the flock is a categorical feature. /// protected SinglePartitionedIntArrayFlockBase(TIntArray bins, int[] hotFeatureStarts, double[][] binUpperBounds, bool categorical = false) @@ -1292,19 +1264,19 @@ protected SinglePartitionedIntArrayFlockBase(TIntArray bins, int[] hotFeatureSta Contracts.Assert(AllBinUpperBounds.Select((b, f) => HotFeatureStarts[f + 1] - HotFeatureStarts[f] + 1 == b.Length).All(i => i)); } - public override sealed double[] BinUpperBounds(int featureIndex) + public sealed override double[] BinUpperBounds(int featureIndex) { Contracts.Assert(0 <= featureIndex && featureIndex < Count); return AllBinUpperBounds[featureIndex]; } - public override sealed double Trust(int featureIndex) + public sealed override double Trust(int featureIndex) { Contracts.Assert(0 <= featureIndex && featureIndex < Count); return 1; } - public override sealed int BinCount(int featureIndex) + public sealed override int BinCount(int featureIndex) { Contracts.Assert(0 <= featureIndex && featureIndex < Count); return AllBinUpperBounds[featureIndex].Length; diff --git a/src/Microsoft.ML.FastTree/Dataset/SegmentIntArray.cs b/src/Microsoft.ML.FastTree/Dataset/SegmentIntArray.cs index 3bbd33407b..1c29e4582d 100644 --- a/src/Microsoft.ML.FastTree/Dataset/SegmentIntArray.cs +++ b/src/Microsoft.ML.FastTree/Dataset/SegmentIntArray.cs @@ -168,11 +168,8 @@ public static void StatsOfBestEncoding(uint[] ivalues, int bitsForMaxItem, bool max = 0; bits = TransitionCost; - //IEnumerator ienum = ivalues.GetEnumerator(); - //while (ienum.MoveNext()) for (int i = 0; i < ivalues.Length; ++i) { - //uint val = (uint)ienum.Current; uint val = (uint)ivalues[i]; if (val > max) max = val; @@ -431,7 +428,7 @@ public static void SegmentFindOptimalCost(uint[] array, int len, int bitsNeeded, } } - public unsafe static void SegmentFindOptimalPath7(uint[] array, int len, out long bits, out int transitions) + public static unsafe void SegmentFindOptimalPath7(uint[] array, int len, out long bits, out int transitions) { long b = 0; int t = 0; @@ -444,7 +441,7 @@ public unsafe static void SegmentFindOptimalPath7(uint[] array, int len, out lon transitions = t; } - public unsafe static void SegmentFindOptimalPath15(uint[] array, int len, out long bits, out int transitions) + public static unsafe void SegmentFindOptimalPath15(uint[] array, int len, out long bits, out int transitions) { long b = 0; int t = 0; @@ -457,7 +454,7 @@ public unsafe static void SegmentFindOptimalPath15(uint[] array, int len, out lo transitions = t; } - public unsafe static void SegmentFindOptimalPath21(uint[] array, int len, out long bits, out int transitions) + public static unsafe void SegmentFindOptimalPath21(uint[] array, int len, out long bits, out int transitions) { long b = 0; int t = 0; @@ -470,7 +467,7 @@ public unsafe static void SegmentFindOptimalPath21(uint[] array, int len, out lo transitions = t; } - public unsafe static void SegmentFindOptimalCost15(uint[] array, int len, out long bits) + public static unsafe void SegmentFindOptimalCost15(uint[] array, int len, out long bits) { long b = 0; fixed (uint* pArray = array) @@ -481,7 +478,7 @@ public unsafe static void SegmentFindOptimalCost15(uint[] array, int len, out lo bits = b; } - public unsafe static void SegmentFindOptimalCost31(uint[] array, int len, out long bits) + public static unsafe void SegmentFindOptimalCost31(uint[] array, int len, out long bits) { long b = 0; fixed (uint* pArray = array) @@ -494,29 +491,29 @@ public unsafe static void SegmentFindOptimalCost31(uint[] array, int len, out lo #pragma warning disable TLC_GeneralName // Externs follow their own rules. [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] - private unsafe static extern void C_SegmentFindOptimalPath21(uint* valv, int valc, long* pBits, int* pTransitions); + private static extern unsafe void C_SegmentFindOptimalPath21(uint* valv, int valc, long* pBits, int* pTransitions); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] - private unsafe static extern void C_SegmentFindOptimalPath15(uint* valv, int valc, long* pBits, int* pTransitions); + private static extern unsafe void C_SegmentFindOptimalPath15(uint* valv, int valc, long* pBits, int* pTransitions); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] - private unsafe static extern void C_SegmentFindOptimalPath7(uint* valv, int valc, long* pBits, int* pTransitions); + private static extern unsafe void C_SegmentFindOptimalPath7(uint* valv, int valc, long* pBits, int* pTransitions); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] - private unsafe static extern void C_SegmentFindOptimalCost15(uint* valv, int valc, long* pBits); + private static extern unsafe void C_SegmentFindOptimalCost15(uint* valv, int valc, long* pBits); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] - private unsafe static extern void C_SegmentFindOptimalCost31(uint* valv, int valc, long* pBits); + private static extern unsafe void C_SegmentFindOptimalCost31(uint* valv, int valc, long* pBits); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall)] - private unsafe static extern int C_SumupSegment_float( + private static extern unsafe int C_SumupSegment_float( uint* pData, byte* pSegType, int* pSegLength, int* pIndices, float* pSampleOutputs, double* pSampleOutputWeights, float* pSumTargetsByBin, double* pSumWeightsByBin, int* pCountByBin, int totalCount, double totalSampleOutputs); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall)] - private unsafe static extern int C_SumupSegment_double( + private static extern unsafe int C_SumupSegment_double( uint* pData, byte* pSegType, int* pSegLength, int* pIndices, double* pSampleOutputs, double* pSampleOutputWeights, double* pSumTargetsByBin, double* pSumWeightsByBin, diff --git a/src/Microsoft.ML.FastTree/Dataset/SparseIntArray.cs b/src/Microsoft.ML.FastTree/Dataset/SparseIntArray.cs index 133d35936b..5ca048647e 100644 --- a/src/Microsoft.ML.FastTree/Dataset/SparseIntArray.cs +++ b/src/Microsoft.ML.FastTree/Dataset/SparseIntArray.cs @@ -18,7 +18,7 @@ namespace Microsoft.ML.Runtime.FastTree.Internal /// This implementation represents a sequence of values using parallel /// arrays of both values, as well as deltas indicating the number of values to the next /// explicit value. Values "between" these deltas are implicitly zero. - /// + /// /// Note that it is possible to misuse the deltas by making some of them themselves 0, allowing /// us to represent multiple values per row. In this case, /// and will not have sensible values, but @@ -490,12 +490,12 @@ public override void Sumup(SumupInputData input, FeatureHistogram histogram) #if USE_FASTTREENATIVE [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall)] - private unsafe static extern int C_SumupDeltaSparse_float(int numBits, byte* pValues, byte* pDeltas, int numDeltas, int* pIndices, float* pSampleOutputs, double* pSampleOutputWeights, + private static extern unsafe int C_SumupDeltaSparse_float(int numBits, byte* pValues, byte* pDeltas, int numDeltas, int* pIndices, float* pSampleOutputs, double* pSampleOutputWeights, float* pSumTargetsByBin, double* pSumTargets2ByBin, int* pCountByBin, int totalCount, double totalSampleOutputs, double totalSampleOutputWeights); [DllImport("FastTreeNative", CallingConvention = CallingConvention.StdCall)] - private unsafe static extern int C_SumupDeltaSparse_double(int numBits, byte* pValues, byte* pDeltas, int numDeltas, int* pIndices, double* pSampleOutputs, double* pSampleOutputWeights, + private static extern unsafe int C_SumupDeltaSparse_double(int numBits, byte* pValues, byte* pDeltas, int numDeltas, int* pIndices, double* pSampleOutputs, double* pSampleOutputWeights, double* pSumTargetsByBin, double* pSumTargets2ByBin, int* pCountByBin, int totalCount, double totalSampleOutputs, double totalSampleOutputWeights); @@ -546,13 +546,9 @@ public unsafe int this[int virtualIndex] { get { - //if (virtualIndex < _index) throw new Exception("Index must move forward"); - if (virtualIndex < _nextIndex) return 0; - //if (virtualIndex >= _array._length) throw new IndexOutOfRangeException(); - if (virtualIndex == _nextIndex) return _array._values[_pos]; @@ -561,7 +557,6 @@ public unsafe int this[int virtualIndex] { while (_pos < _array._values.Length) { - //_index = _nextIndex; _nextIndex += pDeltas[_pos]; if (virtualIndex < _nextIndex) return 0; diff --git a/src/Microsoft.ML.FastTree/FastTree.cs b/src/Microsoft.ML.FastTree/FastTree.cs index 654735c4b6..fad40495f4 100644 --- a/src/Microsoft.ML.FastTree/FastTree.cs +++ b/src/Microsoft.ML.FastTree/FastTree.cs @@ -44,8 +44,7 @@ internal static class FastTreeShared } public abstract class FastTreeTrainerBase : - TrainerBase, - IValidatingTrainer + TrainerBase where TArgs : TreeArgs, new() where TPredictor : IPredictorProducing { @@ -82,17 +81,21 @@ public abstract class FastTreeTrainerBase : protected string InnerArgs => CmdParser.GetSettings(Host, Args, new TArgs()); - public override bool NeedNormalization => false; - - public override bool WantCaching => false; + public override TrainerInfo Info { get; } public bool HasCategoricalFeatures => Utils.Size(CategoricalFeatures) > 0; - protected internal FastTreeTrainerBase(IHostEnvironment env, TArgs args) + private protected virtual bool NeedCalibration => false; + + private protected FastTreeTrainerBase(IHostEnvironment env, TArgs args) : base(env, RegisterName) { Host.CheckValue(args, nameof(args)); Args = args; + // The discretization step renders this trainer non-parametric, and therefore it does not need normalization. + // Also since it builds its own internal discretized columnar structures, it cannot benefit from caching. + // Finally, even the binary classifiers, being logitboost, tend to not benefit from external calibration. + Info = new TrainerInfo(normalization: false, caching: false, calibration: NeedCalibration); int numThreads = Args.NumThreads ?? Environment.ProcessorCount; if (Host.ConcurrencyFactor > 0 && numThreads > Host.ConcurrencyFactor) { @@ -125,14 +128,6 @@ protected internal FastTreeTrainerBase(IHostEnvironment env, TArgs args) protected abstract ObjectiveFunctionBase ConstructObjFunc(IChannel ch); - public void Train(RoleMappedData trainData, RoleMappedData validationData) - { - // REVIEW: Idiotic. This should be reversed... the other train method should - // be put in here, rather than having this "hidden argument" through an instance field. - ValidData = validationData; - Train(trainData); - } - protected virtual Float GetMaxLabel() { return Float.PositiveInfinity; @@ -1148,7 +1143,7 @@ private FeatureFlockBase CreateOneHotFlockCategorical(IChannel ch, #endif Double[] bub = BinUpperBounds[fi]; ch.Assert(bub.Length == 2); - //REVIEW: leaving out check for the value to reduced memory consuption and going with + //REVIEW: leaving out check for the value to reduced memory consuption and going with //leap of faith based on what the user told. binnedValues[i] = hotFeatureStarts[subfeature] + 1; hotCount++; @@ -1338,33 +1333,30 @@ private Dataset Construct(RoleMappedData examples, ref int numExamples, int maxB IDataView data = examples.Data; // Convert the label column, if one exists. - var labelInfo = examples.Schema.Label; - if (labelInfo != null) + var labelName = examples.Schema.Label?.Name; + if (labelName != null) { var convArgs = new LabelConvertTransform.Arguments(); - var convCol = new LabelConvertTransform.Column() { Name = labelInfo.Name, Source = labelInfo.Name }; + var convCol = new LabelConvertTransform.Column() { Name = labelName, Source = labelName }; convArgs.Column = new LabelConvertTransform.Column[] { convCol }; data = new LabelConvertTransform(Host, convArgs, data); - labelInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted label"); } // Convert the group column, if one exists. - var groupInfo = examples.Schema.Group; - if (groupInfo != null) + if (examples.Schema.Group != null) { var convArgs = new ConvertTransform.Arguments(); var convCol = new ConvertTransform.Column { ResultType = DataKind.U8 }; - convCol.Name = convCol.Source = groupInfo.Name; + convCol.Name = convCol.Source = examples.Schema.Group.Name; convArgs.Column = new ConvertTransform.Column[] { convCol }; data = new ConvertTransform(Host, convArgs, data); - groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id"); } // Since we've passed it through a few transforms, reconstitute the mapping on the // newly transformed data. - examples = RoleMappedData.Create(data, examples.Schema.GetColumnRoleNames()); + examples = new RoleMappedData(data, examples.Schema.GetColumnRoleNames()); // Get the index of the columns in the transposed view, while we're at it composing // the list of the columns we want to transpose. @@ -1388,7 +1380,7 @@ private Dataset Construct(RoleMappedData examples, ref int numExamples, int maxB // There is no good mechanism to filter out rows with missing feature values on transposed data. // So, we instead perform one featurization pass which, if successful, will remain one pass but, // if we ever encounter missing values will become a "detect missing features" pass, which will - // in turn inform a necessary featurization pass secondary + // in turn inform a necessary featurization pass secondary SlotDropper slotDropper = null; bool[] localConstructBinFeatures = Utils.CreateArray(NumFeatures, true); @@ -1669,7 +1661,7 @@ private static ValueGetter> SubsetGetter(ValueGetter> g } /// - /// Returns a slot dropper object that has ranges of slots to be dropped, + /// Returns a slot dropper object that has ranges of slots to be dropped, /// based on an examination of the feature values. /// private static SlotDropper ConstructDropSlotRanges(ISlotCursor cursor, @@ -1890,7 +1882,7 @@ private void MakeBoundariesAndCheckLabels(out long missingInstances, out long to missingInstances = cursor.BadFeaturesRowCount; } - ch.Check(totalInstances > 0, TrainerBase.NoTrainingInstancesMessage); + ch.Check(totalInstances > 0, "All instances skipped due to missing features."); if (missingInstances > 0) ch.Warning("Skipped {0} instances with missing features during training", missingInstances); @@ -2206,7 +2198,7 @@ private IEnumerable CreateFlocksCore(IChannel ch, IProgressCha int limMade = startFeatureIndex; int countBins = 1; // Count of bins we'll need to represent. Starts at 1, accumulates "hot" features. // Tracking for n-hot flocks. - long countHotRows = 0; // The count of hot "rows" + long countHotRows = 0; // The count of hot "rows" long hotNThreshold = (long)(0.1 * NumExamples); bool canBeOneHot = true; @@ -2625,7 +2617,7 @@ public sealed class ForwardIndexer // Parallel to the subsequence of _values in min to lim, indicates the index where // we should start to look for the next value, if the corresponding value list in // _values is sparse. If the corresponding value list is dense the entry at this - // position is not used. + // position is not used. private readonly int[] _perFeaturePosition; private readonly int[] _featureIndices; #if DEBUG @@ -2798,7 +2790,7 @@ public abstract class FastTreePredictionWrapper : // Inner args is used only for documentation purposes when saving comments to INI files. protected readonly string InnerArgs; - // The total number of features used in training (takes the value of zero if the + // The total number of features used in training (takes the value of zero if the // written version of the loaded model is less than VerNumFeaturesSerialized) protected readonly int NumFeatures; @@ -2816,7 +2808,7 @@ public abstract class FastTreePredictionWrapper : public bool CanSavePfa => true; public bool CanSaveOnnx => true; - protected internal FastTreePredictionWrapper(IHostEnvironment env, string name, Ensemble trainedEnsemble, int numFeatures, string innerArgs) + protected FastTreePredictionWrapper(IHostEnvironment env, string name, Ensemble trainedEnsemble, int numFeatures, string innerArgs) : base(env, name) { Host.CheckValue(trainedEnsemble, nameof(trainedEnsemble)); @@ -3008,13 +3000,13 @@ private enum NodeMode [Description("BRANCH_LT")] BranchLT, [Description("BRANCH_GTE")] - BranchGTE, + BranchGte, [Description("BRANCH_GT")] BranchGT, [Description("BRANCH_EQ")] - BranchEQ, + BranchEq, [Description("BRANCH_LT")] - BranchNEQ, + BranchNeq, [Description("LEAF")] Leaf }; @@ -3078,7 +3070,7 @@ public virtual bool SaveAsOnnx(OnnxContext ctx, string[] outputNames, string fea nodesValues.Add(tree.RawThresholds[nodeIndex]); nodesTrueNodeIds.Add(tree.LteChild[nodeIndex] < 0 ? ~tree.LteChild[nodeIndex] + tree.NumNodes : tree.LteChild[nodeIndex]); nodesFalseNodeIds.Add(tree.GtChild[nodeIndex] < 0 ? ~tree.GtChild[nodeIndex] + tree.NumNodes : tree.GtChild[nodeIndex]); - if (tree._defaultValueForMissing?[nodeIndex] <= tree.RawThresholds[nodeIndex]) + if (tree.DefaultValueForMissing?[nodeIndex] <= tree.RawThresholds[nodeIndex]) missingValueTracksTrue.Add(true); else missingValueTracksTrue.Add(false); @@ -3108,26 +3100,24 @@ public virtual bool SaveAsOnnx(OnnxContext ctx, string[] outputNames, string fea } string opType = "TreeEnsembleRegressor"; - var node = OnnxUtils.MakeNode(opType, new List { featureColumn }, - new List(outputNames), ctx.GetNodeName(opType)); - - OnnxUtils.NodeAddAttributes(node, "post_transform", PostTransform.None.GetDescription()); - OnnxUtils.NodeAddAttributes(node, "n_targets", 1); - OnnxUtils.NodeAddAttributes(node, "base_values", new List() { 0 }); - OnnxUtils.NodeAddAttributes(node, "aggregate_function", AggregateFunction.Sum.GetDescription()); - OnnxUtils.NodeAddAttributes(node, "nodes_treeids", nodesTreeids); - OnnxUtils.NodeAddAttributes(node, "nodes_nodeids", nodesIds); - OnnxUtils.NodeAddAttributes(node, "nodes_featureids", nodesFeatureIds); - OnnxUtils.NodeAddAttributes(node, "nodes_modes", nodeModes); - OnnxUtils.NodeAddAttributes(node, "nodes_values", nodesValues); - OnnxUtils.NodeAddAttributes(node, "nodes_truenodeids", nodesTrueNodeIds); - OnnxUtils.NodeAddAttributes(node, "nodes_falsenodeids", nodesFalseNodeIds); - OnnxUtils.NodeAddAttributes(node, "nodes_missing_value_tracks_true", missingValueTracksTrue); - OnnxUtils.NodeAddAttributes(node, "target_treeids", classTreeIds); - OnnxUtils.NodeAddAttributes(node, "target_nodeids", classNodeIds); - OnnxUtils.NodeAddAttributes(node, "target_ids", classIds); - OnnxUtils.NodeAddAttributes(node, "target_weights", classWeights); - ctx.AddNode(node); + var node = ctx.CreateNode(opType, new[] { featureColumn }, outputNames, ctx.GetNodeName(opType)); + + node.AddAttribute("post_transform", PostTransform.None.GetDescription()); + node.AddAttribute("n_targets", 1); + node.AddAttribute("base_values", new List() { 0 }); + node.AddAttribute("aggregate_function", AggregateFunction.Sum.GetDescription()); + node.AddAttribute("nodes_treeids", nodesTreeids); + node.AddAttribute("nodes_nodeids", nodesIds); + node.AddAttribute("nodes_featureids", nodesFeatureIds); + node.AddAttribute("nodes_modes", nodeModes); + node.AddAttribute("nodes_values", nodesValues); + node.AddAttribute("nodes_truenodeids", nodesTrueNodeIds); + node.AddAttribute("nodes_falsenodeids", nodesFalseNodeIds); + node.AddAttribute("nodes_missing_value_tracks_true", missingValueTracksTrue); + node.AddAttribute("target_treeids", classTreeIds); + node.AddAttribute("target_nodeids", classNodeIds); + node.AddAttribute("target_ids", classIds); + node.AddAttribute("target_weights", classWeights); return true; } @@ -3276,8 +3266,8 @@ public Float GetLeafValue(int treeId, int leafId) } /// - /// Returns the leaf node in the requested tree for the given feature vector, and populates 'path' with the list of - /// internal nodes in the path from the root to that leaf. If 'path' is null a new list is initialized. All elements + /// Returns the leaf node in the requested tree for the given feature vector, and populates 'path' with the list of + /// internal nodes in the path from the root to that leaf. If 'path' is null a new list is initialized. All elements /// in 'path' are cleared before filling in the current path nodes. /// public int GetLeaf(int treeId, ref VBuffer features, ref List path) diff --git a/src/Microsoft.ML.FastTree/FastTreeArguments.cs b/src/Microsoft.ML.FastTree/FastTreeArguments.cs index e6420153f4..2c6fc02745 100644 --- a/src/Microsoft.ML.FastTree/FastTreeArguments.cs +++ b/src/Microsoft.ML.FastTree/FastTreeArguments.cs @@ -20,6 +20,7 @@ public interface IFastTreeTrainerFactory : IComponentFactory { } + /// public sealed partial class FastTreeBinaryClassificationTrainer { [TlcModule.Component(Name = LoadNameValue, FriendlyName = UserNameValue, Desc = Summary)] @@ -238,7 +239,7 @@ public abstract class TreeArgs : LearnerInputBaseWithGroupId public int MinDocumentsInLeafs = 10; // REVIEW: Different shortname than FastRank module. Same as the TLC FRWrapper. - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Number of weak hypotheses in the ensemble", ShortName = "iter", SortOrder = 1)] + [Argument(ArgumentType.LastOccurenceWins, HelpText = "Total number of decision trees to create in the ensemble", ShortName = "iter", SortOrder = 1)] [TGUI(Description = "Total number of trees constructed", SuggestedSweeps = "20,100,500")] [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[] { 20, 100, 500 })] public int NumTrees = 100; diff --git a/src/Microsoft.ML.FastTree/FastTreeClassification.cs b/src/Microsoft.ML.FastTree/FastTreeClassification.cs index 43409dadd3..6796dd6c79 100644 --- a/src/Microsoft.ML.FastTree/FastTreeClassification.cs +++ b/src/Microsoft.ML.FastTree/FastTreeClassification.cs @@ -62,11 +62,11 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } - protected override uint VerNumFeaturesSerialized { get { return 0x00010002; } } + protected override uint VerNumFeaturesSerialized => 0x00010002; - protected override uint VerDefaultValueSerialized { get { return 0x00010004; } } + protected override uint VerDefaultValueSerialized => 0x00010004; - protected override uint VerCategoricalSplitSerialized { get { return 0x00010005; } } + protected override uint VerCategoricalSplitSerialized => 0x00010005; internal FastTreeBinaryPredictor(IHostEnvironment env, Ensemble trainedEnsemble, int featureCount, string innerArgs) : base(env, RegistrationName, trainedEnsemble, featureCount, innerArgs) @@ -97,9 +97,10 @@ public static IPredictorProducing Create(IHostEnvironment env, ModelLoadC return new SchemaBindableCalibratedPredictor(env, predictor, calibrator); } - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; } + /// public sealed partial class FastTreeBinaryClassificationTrainer : BoostingFastTreeTrainerBase> { @@ -115,12 +116,14 @@ public FastTreeBinaryClassificationTrainer(IHostEnvironment env, Arguments args) { } - public override bool NeedCalibration => false; + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } - - public override void Train(RoleMappedData trainData) + public override IPredictorWithFeatureWeights Train(TrainContext context) { + Host.CheckValue(context, nameof(context)); + var trainData = context.TrainingSet; + ValidData = context.ValidationSet; + using (var ch = Host.Start("Training")) { ch.CheckValue(trainData, nameof(trainData)); @@ -132,12 +135,6 @@ public override void Train(RoleMappedData trainData) TrainCore(ch); ch.Done(); } - } - - public override IPredictorWithFeatureWeights CreatePredictor() - { - Host.Check(TrainedEnsemble != null, - "The predictor cannot be created before training is complete"); // The FastTree binary classification boosting is naturally calibrated to // output probabilities when transformed using a scaled logistic function, @@ -336,9 +333,17 @@ public void AdjustTreeOutputs(IChannel ch, RegressionTree tree, } } + /// + /// The Entry Point for the FastTree Binary Classifier. + /// public static partial class FastTree { - [TlcModule.EntryPoint(Name = "Trainers.FastTreeBinaryClassifier", Desc = FastTreeBinaryClassificationTrainer.Summary, UserName = FastTreeBinaryClassificationTrainer.UserNameValue, ShortName = FastTreeBinaryClassificationTrainer.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.FastTreeBinaryClassifier", + Desc = FastTreeBinaryClassificationTrainer.Summary, + UserName = FastTreeBinaryClassificationTrainer.UserNameValue, + ShortName = FastTreeBinaryClassificationTrainer.ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironment env, FastTreeBinaryClassificationTrainer.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.FastTree/FastTreeRanking.cs b/src/Microsoft.ML.FastTree/FastTreeRanking.cs index d2ab1d6db8..7173a9f6a3 100644 --- a/src/Microsoft.ML.FastTree/FastTreeRanking.cs +++ b/src/Microsoft.ML.FastTree/FastTreeRanking.cs @@ -38,6 +38,7 @@ namespace Microsoft.ML.Runtime.FastTree { + /// public sealed partial class FastTreeRankingTrainer : BoostingFastTreeTrainerBase, IHasLabelGains { @@ -50,8 +51,6 @@ public sealed partial class FastTreeRankingTrainer : BoostingFastTreeTrainerBase private Test _specialTrainSetTest; private TestHistory _firstTestSetHistory; - public override bool NeedCalibration => false; - public override PredictionKind PredictionKind => PredictionKind.Ranking; public FastTreeRankingTrainer(IHostEnvironment env, Arguments args) @@ -64,8 +63,12 @@ protected override float GetMaxLabel() return GetLabelGains().Length - 1; } - public override void Train(RoleMappedData trainData) + public override FastTreeRankingPredictor Train(TrainContext context) { + Host.CheckValue(context, nameof(context)); + var trainData = context.TrainingSet; + ValidData = context.ValidationSet; + using (var ch = Host.Start("Training")) { var maxLabel = GetLabelGains().Length - 1; @@ -74,11 +77,6 @@ public override void Train(RoleMappedData trainData) FeatureCount = trainData.Schema.Feature.Type.ValueCount; ch.Done(); } - } - - public override FastTreeRankingPredictor CreatePredictor() - { - Host.Check(TrainedEnsemble != null, "The predictor cannot be created before training is complete"); return new FastTreeRankingPredictor(Host, TrainedEnsemble, FeatureCount, InnerArgs); } @@ -579,7 +577,6 @@ private void SetupSecondaryGains(Arguments args) _secondaryMetricShare = 0.0; return; } - //for (int i = 0; i < _secondaryGains.Length; ++i) _secondaryGains[i] *= cmd.secondaryMetricShare; _secondaryInverseMaxDCGT = DCGCalculator.MaxDCG(_secondaryGains, Dataset.Boundaries, new int[] { args.lambdaMartMaxTruncation })[0].Select(d => 1.0 / d).ToArray(); } @@ -726,7 +723,6 @@ protected override void GetGradientInOneQuery(int query, int threadIndex) double inverseMaxDcg = _inverseMaxDcgt[query]; double secondaryInverseMaxDcg = _secondaryMetricShare == 0 ? 0.0 : _secondaryInverseMaxDcgt[query]; - //int[] permutation = (threadIndex < 0 ? new int[numDocuments] : _permutationBuffers[threadIndex]); int[] permutation = _permutationBuffers[threadIndex]; short[] labels = _labels; @@ -767,7 +763,7 @@ protected override void GetGradientInOneQuery(int query, int threadIndex) { // calculates the permutation that orders "scores" in descending order, without modifying "scores" Array.Copy(_oneTwoThree, permutation, numDocuments); -#if USE_FASTTREENATIVE2 +#if USE_FASTTREENATIVE PermutationSort(permutation, scoresToUse, labels, numDocuments, begin); // Get how far about baseline our current @@ -818,12 +814,14 @@ protected override void GetGradientInOneQuery(int query, int threadIndex) if (!_trainDcg && (_costFunctionParam == 'c' || _useShiftedNdcg)) { PermutationSort(permutation, scoresToUse, labels, numDocuments, begin); - inverseMaxDcg = 1.0 / DCGCalculator.MaxDCGQuery(labels, begin, numDocuments, numDocuments, _labelCounts[query]); + inverseMaxDcg = 1.0 / DcgCalculator.MaxDcgQuery(labels, begin, numDocuments, numDocuments, _labelCounts[query]); } - C_GetDerivatives(numDocuments, begin, pPermutation, pLabels, + // A constant related to secondary labels, which does not exist in the current codebase. + const bool secondaryIsolabelExclusive = false; + GetDerivatives(numDocuments, begin, pPermutation, pLabels, pScores, pLambdas, pWeights, pDiscount, inverseMaxDcg, pGainLabels, - _secondaryMetricShare, _secondaryIsolabelExclusive, secondaryInverseMaxDcg, pSecondaryGains, + _secondaryMetricShare, secondaryIsolabelExclusive, secondaryInverseMaxDcg, pSecondaryGains, pSigmoidTable, _minScore, _maxScore, _sigmoidTable.Length, _scoreToSigmoidTableFactor, _costFunctionParam, _distanceWeight2, numActualResults, &lambdaSum, double.MinValue, _baselineAlphaCurrent, baselineDcgGap); @@ -831,11 +829,11 @@ protected override void GetGradientInOneQuery(int query, int threadIndex) // For computing the "ideal" case of the DCGs. if (_baselineDcg != null) { - if (scoresToUse == _scores) - Array.Copy(_scores, begin, _scoresCopy, begin, numDocuments); + if (scoresToUse == Scores) + Array.Copy(Scores, begin, _scoresCopy, begin, numDocuments); for (int i = begin; i < begin + numDocuments; ++i) { - _scoresCopy[i] += _gradient[i] / _weights[i]; + _scoresCopy[i] += Gradient[i] / Weights[i]; } Array.Copy(_oneTwoThree, permutation, numDocuments); PermutationSort(permutation, _scoresCopy, labels, numDocuments, begin); @@ -1030,7 +1028,7 @@ private static void PermutationSort(int[] permutation, double[] scores, short[] } [DllImport("FastTreeNative", EntryPoint = "C_GetDerivatives", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] - private unsafe static extern void GetDerivatives( + private static extern unsafe void GetDerivatives( int numDocuments, int begin, int* pPermutation, short* pLabels, double* pScores, double* pLambdas, double* pWeights, double* pDiscount, double inverseMaxDcg, double* pGainLabels, @@ -1062,11 +1060,11 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } - protected override uint VerNumFeaturesSerialized { get { return 0x00010002; } } + protected override uint VerNumFeaturesSerialized => 0x00010002; - protected override uint VerDefaultValueSerialized { get { return 0x00010004; } } + protected override uint VerDefaultValueSerialized => 0x00010004; - protected override uint VerCategoricalSplitSerialized { get { return 0x00010005; } } + protected override uint VerCategoricalSplitSerialized => 0x00010005; internal FastTreeRankingPredictor(IHostEnvironment env, Ensemble trainedEnsemble, int featureCount, string innerArgs) : base(env, RegistrationName, trainedEnsemble, featureCount, innerArgs) @@ -1089,12 +1087,17 @@ public static FastTreeRankingPredictor Create(IHostEnvironment env, ModelLoadCon return new FastTreeRankingPredictor(env, ctx); } - public override PredictionKind PredictionKind { get { return PredictionKind.Ranking; } } + public override PredictionKind PredictionKind => PredictionKind.Ranking; } public static partial class FastTree { - [TlcModule.EntryPoint(Name = "Trainers.FastTreeRanker", Desc = FastTreeRankingTrainer.Summary, UserName = FastTreeRankingTrainer.UserNameValue, ShortName = FastTreeRankingTrainer.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.FastTreeRanker", + Desc = FastTreeRankingTrainer.Summary, + UserName = FastTreeRankingTrainer.UserNameValue, + ShortName = FastTreeRankingTrainer.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.RankingOutput TrainRanking(IHostEnvironment env, FastTreeRankingTrainer.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.FastTree/FastTreeRegression.cs b/src/Microsoft.ML.FastTree/FastTreeRegression.cs index ae7f4cfdbd..287cfe9e1c 100644 --- a/src/Microsoft.ML.FastTree/FastTreeRegression.cs +++ b/src/Microsoft.ML.FastTree/FastTreeRegression.cs @@ -31,6 +31,7 @@ namespace Microsoft.ML.Runtime.FastTree { + /// public sealed partial class FastTreeRegressionTrainer : BoostingFastTreeTrainerBase { public const string LoadNameValue = "FastTreeRegression"; @@ -42,23 +43,21 @@ public sealed partial class FastTreeRegressionTrainer : BoostingFastTreeTrainerB private Test _trainRegressionTest; private Test _testRegressionTest; + public override PredictionKind PredictionKind => PredictionKind.Regression; + public FastTreeRegressionTrainer(IHostEnvironment env, Arguments args) : base(env, args) { } - public override bool NeedCalibration + public override FastTreeRegressionPredictor Train(TrainContext context) { - get { return false; } - } + Host.CheckValue(context, nameof(context)); + var trainData = context.TrainingSet; + ValidData = context.ValidationSet; - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } - - public override void Train(RoleMappedData trainData) - { using (var ch = Host.Start("Training")) { - ch.CheckValue(trainData, nameof(trainData)); trainData.CheckRegressionLabel(); trainData.CheckFeatureFloatVector(); trainData.CheckOptFloatWeight(); @@ -67,12 +66,6 @@ public override void Train(RoleMappedData trainData) TrainCore(ch); ch.Done(); } - } - - public override FastTreeRegressionPredictor CreatePredictor() - { - Host.Check(TrainedEnsemble != null, - "The predictor cannot be created before training is complete"); return new FastTreeRegressionPredictor(Host, TrainedEnsemble, FeatureCount, InnerArgs); } @@ -413,11 +406,11 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } - protected override uint VerNumFeaturesSerialized { get { return 0x00010002; } } + protected override uint VerNumFeaturesSerialized => 0x00010002; - protected override uint VerDefaultValueSerialized { get { return 0x00010004; } } + protected override uint VerDefaultValueSerialized => 0x00010004; - protected override uint VerCategoricalSplitSerialized { get { return 0x00010005; } } + protected override uint VerCategoricalSplitSerialized => 0x00010005; internal FastTreeRegressionPredictor(IHostEnvironment env, Ensemble trainedEnsemble, int featureCount, string innerArgs) : base(env, RegistrationName, trainedEnsemble, featureCount, innerArgs) @@ -443,12 +436,17 @@ public static FastTreeRegressionPredictor Create(IHostEnvironment env, ModelLoad return new FastTreeRegressionPredictor(env, ctx); } - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } + public override PredictionKind PredictionKind => PredictionKind.Regression; } public static partial class FastTree { - [TlcModule.EntryPoint(Name = "Trainers.FastTreeRegressor", Desc = FastTreeRegressionTrainer.Summary, UserName = FastTreeRegressionTrainer.UserNameValue, ShortName = FastTreeRegressionTrainer.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.FastTreeRegressor", + Desc = FastTreeRegressionTrainer.Summary, + UserName = FastTreeRegressionTrainer.UserNameValue, + ShortName = FastTreeRegressionTrainer.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.RegressionOutput TrainRegression(IHostEnvironment env, FastTreeRegressionTrainer.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.FastTree/FastTreeTweedie.cs b/src/Microsoft.ML.FastTree/FastTreeTweedie.cs index 19a026df20..d02928884f 100644 --- a/src/Microsoft.ML.FastTree/FastTreeTweedie.cs +++ b/src/Microsoft.ML.FastTree/FastTreeTweedie.cs @@ -27,30 +27,22 @@ namespace Microsoft.ML.Runtime.FastTree { - /// - /// The Tweedie boosting model follows the mathematics established in: - /// Yang, Quan, and Zou. "Insurance Premium Prediction via Gradient Tree-Boosted Tweedie Compound Poisson Models." - /// https://arxiv.org/pdf/1508.06378.pdf - /// + // The Tweedie boosting model follows the mathematics established in: + // Yang, Quan, and Zou. "Insurance Premium Prediction via Gradient Tree-Boosted Tweedie Compound Poisson Models." + // https://arxiv.org/pdf/1508.06378.pdf + /// public sealed partial class FastTreeTweedieTrainer : BoostingFastTreeTrainerBase { public const string LoadNameValue = "FastTreeTweedieRegression"; public const string UserNameValue = "FastTree (Boosted Trees) Tweedie Regression"; - public const string Summary = "Trains gradient boosted decision trees to fit target values using a Tweedie loss function. This learner " + - "is a generalization of Poisson, compound Poisson, and gamma regression."; - + public const string Summary = "Trains gradient boosted decision trees to fit target values using a Tweedie loss function. This learner is a generalization of Poisson, compound Poisson, and gamma regression."; public const string ShortName = "fttweedie"; private TestHistory _firstTestSetHistory; private Test _trainRegressionTest; private Test _testRegressionTest; - public override bool NeedCalibration - { - get { return false; } - } - - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } + public override PredictionKind PredictionKind => PredictionKind.Regression; public FastTreeTweedieTrainer(IHostEnvironment env, Arguments args) : base(env, args) @@ -58,8 +50,12 @@ public FastTreeTweedieTrainer(IHostEnvironment env, Arguments args) Host.CheckUserArg(1 <= Args.Index && Args.Index <= 2, nameof(Args.Index), "Must be in the range [1, 2]"); } - public override void Train(RoleMappedData trainData) + public override FastTreeTweediePredictor Train(TrainContext context) { + Host.CheckValue(context, nameof(context)); + var trainData = context.TrainingSet; + ValidData = context.ValidationSet; + using (var ch = Host.Start("Training")) { ch.CheckValue(trainData, nameof(trainData)); @@ -71,12 +67,6 @@ public override void Train(RoleMappedData trainData) TrainCore(ch); ch.Done(); } - } - - public override FastTreeTweediePredictor CreatePredictor() - { - Host.Check(TrainedEnsemble != null, - "The predictor cannot be created before training is complete"); return new FastTreeTweediePredictor(Host, TrainedEnsemble, FeatureCount, InnerArgs); } @@ -412,11 +402,11 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } - protected override uint VerNumFeaturesSerialized { get { return 0x00010001; } } + protected override uint VerNumFeaturesSerialized => 0x00010001; - protected override uint VerDefaultValueSerialized { get { return 0x00010002; } } + protected override uint VerDefaultValueSerialized => 0x00010002; - protected override uint VerCategoricalSplitSerialized { get { return 0x00010003; } } + protected override uint VerCategoricalSplitSerialized => 0x00010003; internal FastTreeTweediePredictor(IHostEnvironment env, Ensemble trainedEnsemble, int featureCount, string innerArgs) : base(env, RegistrationName, trainedEnsemble, featureCount, innerArgs) @@ -455,12 +445,16 @@ protected override void Map(ref VBuffer src, ref float dst) dst = MathUtils.ExpSlow(dst); } - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } + public override PredictionKind PredictionKind => PredictionKind.Regression; } public static partial class FastTree { - [TlcModule.EntryPoint(Name = "Trainers.FastTreeTweedieRegressor", Desc = FastTreeTweedieTrainer.Summary, UserName = FastTreeTweedieTrainer.UserNameValue, ShortName = FastTreeTweedieTrainer.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.FastTreeTweedieRegressor", + Desc = FastTreeTweedieTrainer.Summary, + UserName = FastTreeTweedieTrainer.UserNameValue, + ShortName = FastTreeTweedieTrainer.ShortName, + XmlInclude = new [] { @"" })] public static CommonOutputs.RegressionOutput TrainTweedieRegression(IHostEnvironment env, FastTreeTweedieTrainer.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.FastTree/GamTrainer.cs b/src/Microsoft.ML.FastTree/GamTrainer.cs index bc16a07338..51d2d809bb 100644 --- a/src/Microsoft.ML.FastTree/GamTrainer.cs +++ b/src/Microsoft.ML.FastTree/GamTrainer.cs @@ -75,7 +75,7 @@ internal override void CheckLabel(RoleMappedData data) data.CheckRegressionLabel(); } - public override RegressionGamPredictor CreatePredictor() + private protected override RegressionGamPredictor CreatePredictor() { return new RegressionGamPredictor(Host, InputLength, TrainSet, BinEffects, FeatureMap); } @@ -107,7 +107,7 @@ public sealed class Arguments : ArgumentsBase internal const string ShortName = "gam"; public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; - public override bool NeedCalibration => true; + private protected override bool NeedCalibration => true; public BinaryClassificationGamTrainer(IHostEnvironment env, Arguments args) : base(env, args) { } @@ -137,7 +137,7 @@ private bool[] ConvertTargetsToBool(double[] targets) return boolArray; } - public override BinaryClassGamPredictor CreatePredictor() + private protected override BinaryClassGamPredictor CreatePredictor() { return new BinaryClassGamPredictor(Host, InputLength, TrainSet, BinEffects, FeatureMap); } @@ -152,9 +152,7 @@ protected override ObjectiveFunctionBase CreateObjectiveFunction() /// /// Generalized Additive Model Learner. /// - public abstract partial class GamTrainerBase : - TrainerBase, - ITrainer + public abstract partial class GamTrainerBase : TrainerBase where TArgs : GamTrainerBase.ArgumentsBase, new() where TPredictor : GamPredictorBase { @@ -227,13 +225,10 @@ public abstract class ArgumentsBase : LearnerInputBaseWithWeight protected double[][] BinEffects; protected int[] FeatureMap; - public override bool NeedCalibration => false; + public override TrainerInfo Info { get; } + private protected virtual bool NeedCalibration => false; - public override bool NeedNormalization => false; - - public override bool WantCaching => false; - - public GamTrainerBase(IHostEnvironment env, TArgs args) + private protected GamTrainerBase(IHostEnvironment env, TArgs args) : base(env, RegisterName) { Contracts.CheckValue(env, nameof(env)); @@ -247,6 +242,7 @@ public GamTrainerBase(IHostEnvironment env, TArgs args) Host.CheckParam(0 < args.NumIterations, nameof(args.NumIterations), "Must be positive."); Args = args; + Info = new TrainerInfo(normalization: false, calibration: NeedCalibration, caching: false); _gainConfidenceInSquaredStandardDeviations = Math.Pow(ProbabilityFunctions.Probit(1 - (1 - Args.GainConfidenceLevel) * 0.5), 2); _entropyCoefficient = Args.EntropyCoefficient * 1e-6; int numThreads = args.NumThreads ?? Environment.ProcessorCount; @@ -264,18 +260,22 @@ public GamTrainerBase(IHostEnvironment env, TArgs args) InitializeThreads(numThreads); } - public override void Train(RoleMappedData trainData) + public sealed override TPredictor Train(TrainContext context) { using (var ch = Host.Start("Training")) { - ch.CheckValue(trainData, nameof(trainData)); - ConvertData(trainData); - InputLength = trainData.Schema.Feature.Type.ValueCount; + ch.CheckValue(context, nameof(context)); + ConvertData(context.TrainingSet); + InputLength = context.TrainingSet.Schema.Feature.Type.ValueCount; TrainCore(ch); + var pred = CreatePredictor(); ch.Done(); + return pred; } } + private protected abstract TPredictor CreatePredictor(); + internal abstract void CheckLabel(RoleMappedData data); private void ConvertData(RoleMappedData trainData) @@ -569,7 +569,7 @@ public abstract class GamPredictorBase : PredictorBase, public ColumnType OutputType => NumberType.Float; - protected internal GamPredictorBase(IHostEnvironment env, string name, int inputLength, Dataset trainSet, double[][] binEffects, int[] featureMap) + private protected GamPredictorBase(IHostEnvironment env, string name, int inputLength, Dataset trainSet, double[][] binEffects, int[] featureMap) : base(env, name) { Host.CheckValue(trainSet, nameof(trainSet)); @@ -748,7 +748,7 @@ private void Map(ref VBuffer src, ref Float dst) /// /// Returns a vector of feature contributions for a given example. - /// is used as a buffer to accumulate the contributions across trees. + /// is used as a buffer to accumulate the contributions across trees. /// If is null, it will be created, otherwise it will be reused. /// internal void GetFeatureContributions(ref VBuffer features, ref VBuffer contribs, ref BufferBuilder builder) @@ -791,7 +791,7 @@ internal double GetFeatureBinsAndScore(ref VBuffer features, int[] bins) for (int i = 0; i < features.Count; ++i) { int j; - // Where we have a sparse output, + // Where we have a sparse output, if (_inputFeatureToDatasetFeatureMap.TryGetValue(features.Indices[i], out j)) { int index = Algorithms.FindFirstGE(_binUpperBounds[j], features.Values[i]); @@ -990,10 +990,11 @@ public Context(IChannel ch, GamPredictorBase pred, RoleMappedData data, IEvaluat { _eval = eval; var builder = new ArrayDataViewBuilder(pred.Host); - builder.AddColumn("Label", NumberType.Float, _labels); - builder.AddColumn("Score", NumberType.Float, _scores); - _dataForEvaluator = RoleMappedData.Create(builder.GetDataView(), RoleMappedSchema.ColumnRole.Label.Bind("Label"), - RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.Score, "Score")); + builder.AddColumn(DefaultColumnNames.Label, NumberType.Float, _labels); + builder.AddColumn(DefaultColumnNames.Score, NumberType.Float, _scores); + _dataForEvaluator = new RoleMappedData(builder.GetDataView(), opt: false, + RoleMappedSchema.ColumnRole.Label.Bind(DefaultColumnNames.Label), + new RoleMappedSchema.ColumnRole(MetadataUtils.Const.ScoreValueKind.Score).Bind(DefaultColumnNames.Score)); } _data.Schema.Schema.TryGetColumnIndex(DefaultColumnNames.Features, out int featureIndex); @@ -1115,7 +1116,7 @@ public sealed class FeatureInfo public long Version { get; } /// - /// For features belonging to the same categorical, this value will be the same, + /// For features belonging to the same categorical, this value will be the same, /// Set to -1 for non-categoricals. /// public int CategoricalFeatureIndex { get; } @@ -1196,7 +1197,7 @@ private Context Init(IChannel ch) } var pred = rawPred as GamPredictorBase; ch.CheckUserArg(pred != null, nameof(Args.InputModelFile), "Predictor was not a " + nameof(GamPredictorBase)); - var data = RoleMappedData.CreateOpt(loader, schema.GetColumnRoleNames()); + var data = new RoleMappedData(loader, schema.GetColumnRoleNames(), opt: true); if (hadCalibrator && !string.IsNullOrWhiteSpace(Args.OutputModelFile)) ch.Warning("If you save the GAM model, only the GAM model, not the wrapping calibrator, will be saved."); diff --git a/src/Microsoft.ML.FastTree/Microsoft.ML.FastTree.csproj b/src/Microsoft.ML.FastTree/Microsoft.ML.FastTree.csproj index 0441b77e48..425ae1bf7d 100644 --- a/src/Microsoft.ML.FastTree/Microsoft.ML.FastTree.csproj +++ b/src/Microsoft.ML.FastTree/Microsoft.ML.FastTree.csproj @@ -12,7 +12,6 @@ - @@ -57,6 +56,7 @@ + diff --git a/src/Microsoft.ML.FastTree/RandomForestClassification.cs b/src/Microsoft.ML.FastTree/RandomForestClassification.cs index 54a05d5b11..ae79c991d3 100644 --- a/src/Microsoft.ML.FastTree/RandomForestClassification.cs +++ b/src/Microsoft.ML.FastTree/RandomForestClassification.cs @@ -67,13 +67,13 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } - protected override uint VerNumFeaturesSerialized { get { return 0x00010003; } } + protected override uint VerNumFeaturesSerialized => 0x00010003; - protected override uint VerDefaultValueSerialized { get { return 0x00010005; } } + protected override uint VerDefaultValueSerialized => 0x00010005; - protected override uint VerCategoricalSplitSerialized { get { return 0x00010006; } } + protected override uint VerCategoricalSplitSerialized => 0x00010006; - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; internal FastForestClassificationPredictor(IHostEnvironment env, Ensemble trainedEnsemble, int featureCount, string innerArgs) @@ -106,6 +106,7 @@ public static IPredictorProducing Create(IHostEnvironment env, ModelLoadC } } + /// public sealed partial class FastForestClassification : RandomForestTrainerBase> { @@ -128,20 +129,20 @@ public sealed class Arguments : FastForestArgumentsBase private bool[] _trainSetLabels; + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + private protected override bool NeedCalibration => true; + public FastForestClassification(IHostEnvironment env, Arguments args) : base(env, args) { } - public override bool NeedCalibration + public override IPredictorWithFeatureWeights Train(TrainContext context) { - get { return true; } - } + Host.CheckValue(context, nameof(context)); + var trainData = context.TrainingSet; + ValidData = context.ValidationSet; - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } - - public override void Train(RoleMappedData trainData) - { using (var ch = Host.Start("Training")) { ch.CheckValue(trainData, nameof(trainData)); @@ -153,16 +154,9 @@ public override void Train(RoleMappedData trainData) TrainCore(ch); ch.Done(); } - } - - public override IPredictorWithFeatureWeights CreatePredictor() - { - Host.Check(TrainedEnsemble != null, - "The predictor cannot be created before training is complete"); - // LogitBoost is naturally calibrated to // output probabilities when transformed using - // the logistic function, so if we have trained no + // the logistic function, so if we have trained no // calibrator, transform the scores using that. // REVIEW: Need a way to signal the outside world that we prefer simple sigmoid? @@ -208,7 +202,12 @@ protected override void GetGradientInOneQuery(int query, int threadIndex) public static partial class FastForest { - [TlcModule.EntryPoint(Name = "Trainers.FastForestBinaryClassifier", Desc = FastForestClassification.Summary, UserName = FastForestClassification.UserNameValue, ShortName = FastForestClassification.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.FastForestBinaryClassifier", + Desc = FastForestClassification.Summary, + UserName = FastForestClassification.UserNameValue, + ShortName = FastForestClassification.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironment env, FastForestClassification.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.FastTree/RandomForestRegression.cs b/src/Microsoft.ML.FastTree/RandomForestRegression.cs index 3fd97afb32..c580851534 100644 --- a/src/Microsoft.ML.FastTree/RandomForestRegression.cs +++ b/src/Microsoft.ML.FastTree/RandomForestRegression.cs @@ -53,11 +53,11 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } - protected override uint VerNumFeaturesSerialized { get { return 0x00010003; } } + protected override uint VerNumFeaturesSerialized => 0x00010003; - protected override uint VerDefaultValueSerialized { get { return 0x00010005; } } + protected override uint VerDefaultValueSerialized => 0x00010005; - protected override uint VerCategoricalSplitSerialized { get { return 0x00010006; } } + protected override uint VerCategoricalSplitSerialized => 0x00010006; internal FastForestRegressionPredictor(IHostEnvironment env, Ensemble trainedEnsemble, int featureCount, string innerArgs, int samplesCount) @@ -99,7 +99,7 @@ public static FastForestRegressionPredictor Create(IHostEnvironment env, ModelLo return new FastForestRegressionPredictor(env, ctx); } - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } + public override PredictionKind PredictionKind => PredictionKind.Regression; protected override void Map(ref VBuffer src, ref Float dst) { @@ -137,6 +137,7 @@ public ISchemaBindableMapper CreateMapper(Double[] quantiles) } } + /// public sealed partial class FastForestRegression : RandomForestTrainerBase { public sealed class Arguments : FastForestArgumentsBase @@ -157,15 +158,14 @@ public FastForestRegression(IHostEnvironment env, Arguments args) { } - public override bool NeedCalibration - { - get { return false; } - } + public override PredictionKind PredictionKind => PredictionKind.Regression; - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } - - public override void Train(RoleMappedData trainData) + public override FastForestRegressionPredictor Train(TrainContext context) { + Host.CheckValue(context, nameof(context)); + var trainData = context.TrainingSet; + ValidData = context.ValidationSet; + using (var ch = Host.Start("Training")) { ch.CheckValue(trainData, nameof(trainData)); @@ -177,13 +177,6 @@ public override void Train(RoleMappedData trainData) TrainCore(ch); ch.Done(); } - } - - public override FastForestRegressionPredictor CreatePredictor() - { - Host.Check(TrainedEnsemble != null, - "The predictor cannot be created before training is complete"); - return new FastForestRegressionPredictor(Host, TrainedEnsemble, FeatureCount, InnerArgs, Args.QuantileSampleCount); } @@ -280,7 +273,12 @@ public BasicImpl(Dataset trainData, Arguments args) public static partial class FastForest { - [TlcModule.EntryPoint(Name = "Trainers.FastForestRegressor", Desc = FastForestRegression.Summary, UserName = FastForestRegression.LoadNameValue, ShortName = FastForestRegression.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.FastForestRegressor", + Desc = FastForestRegression.Summary, + UserName = FastForestRegression.LoadNameValue, + ShortName = FastForestRegression.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.RegressionOutput TrainRegression(IHostEnvironment env, FastForestRegression.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.FastTree/SumupPerformanceCommand.cs b/src/Microsoft.ML.FastTree/SumupPerformanceCommand.cs index efe52c1f26..f1db3fae2c 100644 --- a/src/Microsoft.ML.FastTree/SumupPerformanceCommand.cs +++ b/src/Microsoft.ML.FastTree/SumupPerformanceCommand.cs @@ -110,7 +110,7 @@ private IEnumerable CreateDense(IChannel ch, Random rgen) private IEnumerable CreateSparse(IChannel ch, Random rgen) { ch.CheckUserArg(0 <= _param && _param < 1, nameof(Arguments.Parameter), "For sparse ararys"); - // The parameter is the level of sparsity. Use the geometric distribution to determine the number of + // The parameter is the level of sparsity. Use the geometric distribution to determine the number of // Geometric distribution (with 0 support) would be Math. double denom = Math.Log(1 - _param); if (double.IsNegativeInfinity(denom)) diff --git a/src/Microsoft.ML.FastTree/Training/DcgPermutationComparer.cs b/src/Microsoft.ML.FastTree/Training/DcgPermutationComparer.cs index be449598a3..1421abb589 100644 --- a/src/Microsoft.ML.FastTree/Training/DcgPermutationComparer.cs +++ b/src/Microsoft.ML.FastTree/Training/DcgPermutationComparer.cs @@ -44,10 +44,10 @@ public static DcgPermutationComparer GetDcgPermutationFactory(string name) /// public class DescendingStablePessimisticPermutationComparer : DescendingStablePermutationComparer { -#pragma warning disable TLC_GeneralName // The naming is the least of this class's problems. A setter with no getter?? +#pragma warning disable MSML_GeneralName // The naming is the least of this class's problems. A setter with no getter?? protected short[] _labels; protected int _labelsOffset; -#pragma warning restore TLC_GeneralName +#pragma warning restore MSML_GeneralName public override short[] Labels { set { _labels = value; } @@ -76,10 +76,10 @@ public override int Compare(int i, int j) /// public class DescendingStablePermutationComparer : DcgPermutationComparer { -#pragma warning disable TLC_GeneralName // The naming is the least of this class's problems. A setter with no getter?? +#pragma warning disable MSML_GeneralName // The naming is the least of this class's problems. A setter with no getter?? protected double[] _scores; protected int _scoresOffset; -#pragma warning restore TLC_GeneralName +#pragma warning restore MSML_GeneralName public override double[] Scores { set { _scores = value; } } diff --git a/src/Microsoft.ML.FastTree/Training/DocumentPartitioning.cs b/src/Microsoft.ML.FastTree/Training/DocumentPartitioning.cs index 2518fc839e..1aec08271e 100644 --- a/src/Microsoft.ML.FastTree/Training/DocumentPartitioning.cs +++ b/src/Microsoft.ML.FastTree/Training/DocumentPartitioning.cs @@ -195,7 +195,7 @@ public double[] GetDistribution(double[] targets, double[] weights, int quantile /// the leaf being split /// /// the threshold - /// Index of child node that contains documents whose split + /// Index of child node that contains documents whose split /// feature value is greater than the split threshold public unsafe void Split(int leaf, IIntArrayForwardIndexer indexer, UInt32 threshold, int gtChildIndex) { @@ -239,7 +239,7 @@ public unsafe void Split(int leaf, IIntArrayForwardIndexer indexer, UInt32 thres /// the leaf being split /// Split feature flock's bin /// Catgeorical feature indices - /// Index of child node that contains documents whose split + /// Index of child node that contains documents whose split /// feature value is greater than the split threshold public unsafe void Split(int leaf, IntArray bins, HashSet categoricalIndices, int gtChildIndex) { diff --git a/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/GradientDescent.cs b/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/GradientDescent.cs index 8b2b345508..a749158b2f 100644 --- a/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/GradientDescent.cs +++ b/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/GradientDescent.cs @@ -51,7 +51,7 @@ protected virtual double[] GetGradient(IChannel ch) if ((_numberOfDroppedTrees == 0) && (numberOfTrees > 0)) { droppedTrees = new int[] { DropoutRng.Next(numberOfTrees) }; - // force at least a single tree to be dropped + // force at least a single tree to be dropped _numberOfDroppedTrees = droppedTrees.Length; } ch.Trace("dropout: Dropping {0} trees of {1} for rate {2}", @@ -104,7 +104,7 @@ public override RegressionTree TrainingIteration(IChannel ch, bool[] activeFeatu using (Timer.Time(TimerEvent.TreeLearnerAdjustTreeOutputs)) { double[] backupScores = null; - // when doing dropouts we need to replace the TrainingScores with the scores without the dropped trees + // when doing dropouts we need to replace the TrainingScores with the scores without the dropped trees if (DropoutRate > 0) { backupScores = TrainingScores.Scores; diff --git a/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/NoOptimizationAlgorithm.cs b/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/NoOptimizationAlgorithm.cs index 563a7891fd..dbc1f04147 100644 --- a/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/NoOptimizationAlgorithm.cs +++ b/src/Microsoft.ML.FastTree/Training/OptimizationAlgorithms/NoOptimizationAlgorithm.cs @@ -7,7 +7,7 @@ namespace Microsoft.ML.Runtime.FastTree.Internal /// /// This is dummy optimizer. As Random forest does not have any boosting based optimization, this is place holder to be consistent /// with other fast tree based applications - /// + /// public class RandomForestOptimizer : GradientDescent { private IGradientAdjuster _gradientWrapper; diff --git a/src/Microsoft.ML.FastTree/Training/Parallel/IParallelTraining.cs b/src/Microsoft.ML.FastTree/Training/Parallel/IParallelTraining.cs index 525e60947b..c968804708 100644 --- a/src/Microsoft.ML.FastTree/Training/Parallel/IParallelTraining.cs +++ b/src/Microsoft.ML.FastTree/Training/Parallel/IParallelTraining.cs @@ -33,20 +33,20 @@ public delegate void FindBestThresholdFromRawArrayFun(LeafSplitCandidates leafSp /// /// Interface used for parallel training. /// Mainly contains three parts: - /// 1. interactive with IO: , . + /// 1. interactive with IO: , . /// Data will be partitioned by rows in Data parallel and Voting Parallel. /// To speed up the find bin process, it let different workers to find bins for different features. /// Then perform global sync up. /// In Feature parallel, every machines holds all data, so this is unneeded. - /// 2. interactive with TreeLearner: , , , - /// , , , . + /// 2. interactive with TreeLearner: , , , + /// , , , . /// A full process is: - /// Use to alter local active features. - /// Use to check smaller leaf and larger leaf. - /// Use , and to interactive with Feature histograms. - /// Use to sync up global best split - /// Use to record global num_data in leaves. - /// 3. interactive with Application : . + /// Use to alter local active features. + /// Use to check smaller leaf and larger leaf. + /// Use , and to interactive with Feature histograms. + /// Use to sync up global best split + /// Use to record global num_data in leaves. + /// 3. interactive with Application : . /// Output of leaves is calculated by newton step ( - sum(first_order_gradients) / sum(second_order_gradients)). /// If data is partitioned by row, it needs to a sync up for these sum result. /// So It needs to call this to get the real output of leaves. @@ -75,7 +75,7 @@ public interface IParallelTraining /// /// Initialize every time before training a tree. - /// will alter activeFeatures in Feature parallel. + /// will alter activeFeatures in Feature parallel. /// Because it only need to find threshold for part of features in feature parallel. /// void InitIteration(ref bool[] activeFeatures); @@ -98,10 +98,10 @@ public interface IParallelTraining bool IsNeedFindLocalBestSplit(); /// - /// True if need to skip non-splittable histogram. - /// Only will return False in Voting parallel. + /// True if need to skip non-splittable histogram. + /// Only will return False in Voting parallel. /// That is because local doesn't have global histograms in Voting parallel, - /// So the information about NonSplittable is not correct, and we cannot skip it. + /// So the information about NonSplittable is not correct, and we cannot skip it. /// bool IsSkipNonSplittableHistogram(); @@ -133,7 +133,7 @@ void FindGlobalBestSplit(LeafSplitCandidates smallerChildSplitCandidates, /// /// Get indices of features that should be find bin in local. - /// After construct local boundary, should call + /// After construct local boundary, should call /// to get boundaries for all features. /// bool[] GetLocalBinConstructionFeatures(int numFeatures); @@ -141,8 +141,8 @@ void FindGlobalBestSplit(LeafSplitCandidates smallerChildSplitCandidates, /// /// Sync Global feature bucket. /// used in Data parallel and Voting parallel. - /// Data are partitioned by row. To speed up the Global find bin process, - /// we can let different workers construct Bin Boundary for different features, + /// Data are partitioned by row. To speed up the Global find bin process, + /// we can let different workers construct Bin Boundary for different features, /// then perform a global sync up. /// void SyncGlobalBoundary(int numFeatures, int maxBin, Double[][] binUpperBounds); diff --git a/src/Microsoft.ML.FastTree/Training/ScoreTracker.cs b/src/Microsoft.ML.FastTree/Training/ScoreTracker.cs index cc83c05cf5..c65aace383 100644 --- a/src/Microsoft.ML.FastTree/Training/ScoreTracker.cs +++ b/src/Microsoft.ML.FastTree/Training/ScoreTracker.cs @@ -53,7 +53,7 @@ public void Initialize(ScoreTracker scores1, RegressionTree tree, DocumentPartit } //InitScores -initScores can be null in such case the scores are reinitialized to Zero - private void InitializeScores(double[] initScores /* = null */) + private void InitializeScores(double[] initScores) { if (initScores == null) { diff --git a/src/Microsoft.ML.FastTree/Training/StepSearch.cs b/src/Microsoft.ML.FastTree/Training/StepSearch.cs index db6f61ada2..e3d14aeb8e 100644 --- a/src/Microsoft.ML.FastTree/Training/StepSearch.cs +++ b/src/Microsoft.ML.FastTree/Training/StepSearch.cs @@ -30,7 +30,7 @@ public LineSearch(Test lossCalculator, int lossIndex) _historicStepSize = Math.Max(1.0, _minStepSize); } - private readonly static double _phi = (1.0 + Math.Sqrt(5)) / 2; + private static readonly double _phi = (1.0 + Math.Sqrt(5)) / 2; private static void Swap(ref T a, ref T b) { diff --git a/src/Microsoft.ML.FastTree/Training/Test.cs b/src/Microsoft.ML.FastTree/Training/Test.cs index f000a1fa32..4e72f46372 100644 --- a/src/Microsoft.ML.FastTree/Training/Test.cs +++ b/src/Microsoft.ML.FastTree/Training/Test.cs @@ -10,10 +10,8 @@ namespace Microsoft.ML.Runtime.FastTree.Internal { - public class TestResult : IComparable + public sealed class TestResult : IComparable { - private double _finalValue; - public enum ValueOperator : int { None = 0, // the final value will be the raw value, @@ -36,33 +34,31 @@ public enum ValueOperator : int // the raw value should be the same constant for all test results. } - public string LossFunctionName { get; private set; } + public string LossFunctionName { get; } /// /// Raw value used for calculating final test result value. /// - public double RawValue { get; private set; } + public double RawValue { get; } /// /// The factor used for calculating final test result value. /// - public double Factor { get; private set; } + public double Factor { get; } /// /// The operator used for calculating final test result value. /// Final value = Operator(RawValue, Factor) /// - public ValueOperator Operator { get; private set; } + public ValueOperator Operator { get; } /// /// Indicates that the lower value of this metric is better /// This is used for early stopping (with TestHistory and TestWindowWithTolerance) /// - public bool LowerIsBetter { get; private set; } + public bool LowerIsBetter { get; } - public double FinalValue { - get { return _finalValue; } - } + public double FinalValue { get; } public TestResult(string lossFunctionName, double rawValue, double factor, bool lowerIsBetter, ValueOperator valueOperator) { @@ -72,7 +68,7 @@ public TestResult(string lossFunctionName, double rawValue, double factor, bool Operator = valueOperator; LowerIsBetter = lowerIsBetter; - CalculateFinalValue(); + FinalValue = CalculateFinalValue(); } public int CompareTo(TestResult o) @@ -124,7 +120,7 @@ public static TestResult FromByteArray(byte[] buffer, ref int offset) (ValueOperator)valueOperator); } - private void CalculateFinalValue() + private double CalculateFinalValue() { switch (Operator) { @@ -133,14 +129,11 @@ private void CalculateFinalValue() case ValueOperator.Min: case ValueOperator.None: case ValueOperator.Sum: - _finalValue = RawValue; - break; + return RawValue; case ValueOperator.Average: - _finalValue = RawValue / Factor; - break; + return RawValue / Factor; case ValueOperator.SqrtAverage: - _finalValue = Math.Sqrt(RawValue / Factor); - break; + return Math.Sqrt(RawValue / Factor); default: throw Contracts.Except("Unsupported value operator: {0}", Operator); } @@ -157,7 +150,7 @@ public abstract class Test //The method returns one or more losses on a given Dataset public abstract IEnumerable ComputeTests(double[] scores); - public Test(ScoreTracker scoreTracker) + private protected Test(ScoreTracker scoreTracker) { ScoreTracker = scoreTracker; if (ScoreTracker != null) @@ -207,13 +200,13 @@ public class TestHistory : Test protected IList History; protected int Iteration { get; private set; } - public TestResult BestResult { get; protected internal set; } - public int BestIteration { get; protected internal set; } + public TestResult BestResult { get; private protected set; } + public int BestIteration { get; private protected set; } // scenarioWithoutHistory - simple test scenario we want to track the history and look for best iteration // lossIndex - index of lossFunction in case Test returns more than one loss (default should be 0) // lower is better: are we looking for minimum or maximum of loss function? - public TestHistory(Test scenarioWithoutHistory, int lossIndex) + internal TestHistory(Test scenarioWithoutHistory, int lossIndex) : base(null) { History = new List(); diff --git a/src/Microsoft.ML.FastTree/Training/TreeLearners/LeastSquaresRegressionTreeLearner.cs b/src/Microsoft.ML.FastTree/Training/TreeLearners/LeastSquaresRegressionTreeLearner.cs index cb902fad2b..fd1fb548da 100644 --- a/src/Microsoft.ML.FastTree/Training/TreeLearners/LeastSquaresRegressionTreeLearner.cs +++ b/src/Microsoft.ML.FastTree/Training/TreeLearners/LeastSquaresRegressionTreeLearner.cs @@ -103,7 +103,7 @@ public class LeastSquaresRegressionTreeLearner : TreeLearner /// Only consider a gain if its likelihood versus a random /// choice gain is above a certain value (so 0.95 would mean restricting to gains that have less /// than a 0.05 change of being generated randomly through choice of a random split). - /// Maximum categorical split points to consider when splitting on a + /// Maximum categorical split points to consider when splitting on a /// categorical feature. /// /// -1 if best step ranking is to be disabled, otherwise it diff --git a/src/Microsoft.ML.FastTree/TreeEnsemble/Ensemble.cs b/src/Microsoft.ML.FastTree/TreeEnsemble/Ensemble.cs index 0c75b2dd18..0d48bb8123 100644 --- a/src/Microsoft.ML.FastTree/TreeEnsemble/Ensemble.cs +++ b/src/Microsoft.ML.FastTree/TreeEnsemble/Ensemble.cs @@ -336,7 +336,7 @@ public string ToGainSummary(FeaturesToContentMap fmap, Dictionary feat /// /// Returns a vector of feature contributions for a given example. - /// is used as a buffer to accumulate the contributions across trees. + /// is used as a buffer to accumulate the contributions across trees. /// If is null, it will be created, otherwise it will be reused. /// internal void GetFeatureContributions(ref VBuffer features, ref VBuffer contribs, ref BufferBuilder builder) diff --git a/src/Microsoft.ML.FastTree/TreeEnsemble/QuantileRegressionTree.cs b/src/Microsoft.ML.FastTree/TreeEnsemble/QuantileRegressionTree.cs index 642d82ede1..bcec5ac082 100644 --- a/src/Microsoft.ML.FastTree/TreeEnsemble/QuantileRegressionTree.cs +++ b/src/Microsoft.ML.FastTree/TreeEnsemble/QuantileRegressionTree.cs @@ -58,9 +58,9 @@ public override void Save(ModelSaveContext ctx) } /// - /// Loads the sampled labels of this tree to the distribution array for the sparse instance type. + /// Loads the sampled labels of this tree to the distribution array for the sparse instance type. /// By calling for all the trees, the distribution array will have all the samples from all the trees - /// + /// public void LoadSampledLabels(ref VBuffer feat, Float[] distribution, Float[] weights, int sampleCount, int destinationIndex) { int leaf = GetLeaf(ref feat); diff --git a/src/Microsoft.ML.FastTree/TreeEnsemble/RegressionTree.cs b/src/Microsoft.ML.FastTree/TreeEnsemble/RegressionTree.cs index 8e4a9ed7b8..65701f0d03 100644 --- a/src/Microsoft.ML.FastTree/TreeEnsemble/RegressionTree.cs +++ b/src/Microsoft.ML.FastTree/TreeEnsemble/RegressionTree.cs @@ -26,7 +26,7 @@ public class RegressionTree // Weight of this tree in the ensemble // for each non-leaf, we keep the following data - public Float[] _defaultValueForMissing; + public Float[] DefaultValueForMissing; private double[] _splitGain; private double[] _gainPValue; // The value of this non-leaf node, prior to split when it was a leaf. @@ -42,12 +42,12 @@ public class RegressionTree /// public bool[] CategoricalSplit { get; } /// - /// Array of categorical values for the categorical feature that might be chosen as + /// Array of categorical values for the categorical feature that might be chosen as /// a split feature for a node. /// public int[][] CategoricalSplitFeatures; /// - /// For a given categorical feature that is chosen as a split feature for a node, this + /// For a given categorical feature that is chosen as a split feature for a node, this /// array contains it's start and end range in the input feature vector at prediction time. /// public int[][] CategoricalSplitFeatureRanges; @@ -89,7 +89,7 @@ public RegressionTree(int maxLeaves) _gainPValue = new double[maxLeaves - 1]; _previousLeafValue = new double[maxLeaves - 1]; Thresholds = new UInt32[maxLeaves - 1]; - _defaultValueForMissing = null; + DefaultValueForMissing = null; LteChild = new int[maxLeaves - 1]; GtChild = new int[maxLeaves - 1]; LeafValues = new double[maxLeaves]; @@ -105,22 +105,21 @@ public RegressionTree(byte[] buffer, ref int position) LteChild = buffer.ToIntArray(ref position); GtChild = buffer.ToIntArray(ref position); SplitFeatures = buffer.ToIntArray(ref position); - int[] categoricalNodeIndices = buffer.ToIntArray(ref position); - CategoricalSplit = GetCategoricalSplitFromIndices(categoricalNodeIndices); - if (categoricalNodeIndices?.Length > 0) + byte[] categoricalSplitAsBytes = buffer.ToByteArray(ref position); + CategoricalSplit = categoricalSplitAsBytes.Select(b => b > 0).ToArray(); + if (CategoricalSplit.Any(b => b)) { CategoricalSplitFeatures = new int[NumNodes][]; CategoricalSplitFeatureRanges = new int[NumNodes][]; - foreach (var index in categoricalNodeIndices) + for (int index = 0; index < NumNodes; index++) { - Contracts.Assert(CategoricalSplit[index]); - CategoricalSplitFeatures[index] = buffer.ToIntArray(ref position); - CategoricalSplitFeatureRanges[index] = buffer.ToIntArray(ref position, 2); + CategoricalSplitFeatureRanges[index] = buffer.ToIntArray(ref position); } } Thresholds = buffer.ToUIntArray(ref position); + RawThresholds = buffer.ToFloatArray(ref position); _splitGain = buffer.ToDoubleArray(ref position); _gainPValue = buffer.ToDoubleArray(ref position); _previousLeafValue = buffer.ToDoubleArray(ref position); @@ -144,6 +143,23 @@ private bool[] GetCategoricalSplitFromIndices(int[] indices) return categoricalSplit; } + private bool[] GetCategoricalSplitFromBytes(byte[] indices) + { + bool[] categoricalSplit = new bool[NumNodes]; + if (indices == null) + return categoricalSplit; + + Contracts.Assert(indices.Length <= NumNodes); + + foreach (int index in indices) + { + Contracts.Assert(index >= 0 && index < NumNodes); + categoricalSplit[index] = true; + } + + return categoricalSplit; + } + /// /// Create a Regression Tree object from raw tree contents. /// @@ -186,13 +202,13 @@ internal RegressionTree(int[] splitFeatures, Double[] splitGain, Double[] gainPV _splitGain = splitGain; _gainPValue = gainPValue; RawThresholds = rawThresholds; - _defaultValueForMissing = defaultValueForMissing; + DefaultValueForMissing = defaultValueForMissing; LteChild = lteChild; GtChild = gtChild; LeafValues = leafValues; CategoricalSplitFeatures = categoricalSplitFeatures; CategoricalSplitFeatureRanges = new int[CategoricalSplitFeatures.Length][]; - for(int i= 0; i < CategoricalSplitFeatures.Length; ++i) + for (int i = 0; i < CategoricalSplitFeatures.Length; ++i) { if (CategoricalSplitFeatures[i] != null && CategoricalSplitFeatures[i].Length > 0) { @@ -206,10 +222,10 @@ internal RegressionTree(int[] splitFeatures, Double[] splitGain, Double[] gainPV CheckValid(Contracts.Check); - if (_defaultValueForMissing != null) + if (DefaultValueForMissing != null) { bool allZero = true; - foreach (var val in _defaultValueForMissing) + foreach (var val in DefaultValueForMissing) { if (val != 0.0f) { @@ -218,7 +234,7 @@ internal RegressionTree(int[] splitFeatures, Double[] splitGain, Double[] gainPV } } if (allZero) - _defaultValueForMissing = null; + DefaultValueForMissing = null; } } @@ -284,9 +300,9 @@ internal RegressionTree(ModelLoadContext ctx, bool usingDefaultValue, bool categ Thresholds = reader.ReadUIntArray(); RawThresholds = reader.ReadFloatArray(); - _defaultValueForMissing = null; + DefaultValueForMissing = null; if (usingDefaultValue) - _defaultValueForMissing = reader.ReadFloatArray(); + DefaultValueForMissing = reader.ReadFloatArray(); LeafValues = reader.ReadDoubleArray(); // Informational... @@ -297,10 +313,10 @@ internal RegressionTree(ModelLoadContext ctx, bool usingDefaultValue, bool categ CheckValid(Contracts.CheckDecode); // Check the need of _defaultValueForMissing - if (_defaultValueForMissing != null) + if (DefaultValueForMissing != null) { bool allZero = true; - foreach (var val in _defaultValueForMissing) + foreach (var val in DefaultValueForMissing) { if (val != 0.0f) { @@ -309,7 +325,7 @@ internal RegressionTree(ModelLoadContext ctx, bool usingDefaultValue, bool categ } } if (allZero) - _defaultValueForMissing = null; + DefaultValueForMissing = null; } } @@ -386,7 +402,7 @@ protected void Save(ModelSaveContext ctx, TreeType code) writer.WriteUIntArray(Thresholds); writer.WriteFloatArray(RawThresholds); - writer.WriteFloatArray(_defaultValueForMissing); + writer.WriteFloatArray(DefaultValueForMissing); writer.WriteDoubleArray(LeafValues); writer.WriteDoubleArray(_splitGain); @@ -500,6 +516,7 @@ public virtual int SizeInBytes() NumNodes * sizeof(int) + CategoricalSplit.Length * sizeof(bool) + Thresholds.SizeInBytes() + + RawThresholds.SizeInBytes() + _splitGain.SizeInBytes() + _gainPValue.SizeInBytes() + _previousLeafValue.SizeInBytes() + @@ -514,22 +531,22 @@ public virtual void ToByteArray(byte[] buffer, ref int position) LteChild.ToByteArray(buffer, ref position); GtChild.ToByteArray(buffer, ref position); SplitFeatures.ToByteArray(buffer, ref position); + CategoricalSplit.Length.ToByteArray(buffer, ref position); foreach (var split in CategoricalSplit) Convert.ToByte(split).ToByteArray(buffer, ref position); if (CategoricalSplitFeatures != null) { - foreach (var splits in CategoricalSplitFeatures) - splits.ToByteArray(buffer, ref position); - } - - if (CategoricalSplitFeatureRanges != null) - { - foreach (var ranges in CategoricalSplitFeatureRanges) - ranges.ToByteArray(buffer, ref position); + Contracts.AssertValue(CategoricalSplitFeatureRanges); + for (int i = 0; i < CategoricalSplitFeatures.Length; i++) + { + CategoricalSplitFeatures[i].ToByteArray(buffer, ref position); + CategoricalSplitFeatureRanges[i].ToByteArray(buffer, ref position); + } } Thresholds.ToByteArray(buffer, ref position); + RawThresholds.ToByteArray(buffer, ref position); _splitGain.ToByteArray(buffer, ref position); _gainPValue.ToByteArray(buffer, ref position); _previousLeafValue.ToByteArray(buffer, ref position); @@ -787,12 +804,12 @@ public int GetLeaf(ref VBuffer feat, ref List path) private Float GetFeatureValue(Float x, int node) { // Not need to convert missing vaules. - if (_defaultValueForMissing == null) + if (DefaultValueForMissing == null) return x; if (Double.IsNaN(x)) { - return _defaultValueForMissing[node]; + return DefaultValueForMissing[node]; } else { @@ -1181,7 +1198,7 @@ public void ToTreeEnsembleFormat(StringBuilder sbEvaluator, StringBuilder sbInpu private void ToTreeEnsembleFormatForCategoricalSplit(StringBuilder sbEvaluator, StringBuilder sbInput, FeaturesToContentMap featureContents, ref int evaluatorCounter, Dictionary featureToId, Dictionary categoricalSplitNodeToId) { - //REVIEW: Can all these conditions even be true? + //REVIEW: Can all these conditions even be true? if (CategoricalSplitFeatures == null || CategoricalSplitFeatures.Length == 0 || CategoricalSplitFeatures.All(val => val == null)) @@ -1501,7 +1518,7 @@ public void AppendFeatureContributions(ref VBuffer src, BufferBuilder, IPredictorProducing> + { + private readonly IHost _host; + private readonly PredictionKind _kind; + + public TreeEnsembleCombiner(IHostEnvironment env, PredictionKind kind) + { + _host = env.Register("TreeEnsembleCombiner"); + switch (kind) + { + case PredictionKind.BinaryClassification: + case PredictionKind.Regression: + case PredictionKind.Ranking: + _kind = kind; + break; + default: + throw _host.ExceptUserArg(nameof(kind), $"Tree ensembles can be either of type {nameof(PredictionKind.BinaryClassification)}, " + + $"{nameof(PredictionKind.Regression)} or {nameof(PredictionKind.Ranking)}"); + } + } + + public IPredictorProducing CombineModels(IEnumerable> models) + { + _host.CheckValue(models, nameof(models)); + + var ensemble = new Ensemble(); + int modelCount = 0; + int featureCount = -1; + bool binaryClassifier = false; + foreach (var model in models) + { + modelCount++; + + var predictor = model; + _host.CheckValue(predictor, nameof(models), "One of the models is null"); + + var calibrated = predictor as CalibratedPredictorBase; + double paramA = 1; + if (calibrated != null) + { + _host.Check(calibrated.Calibrator is PlattCalibrator, + "Combining FastTree models can only be done when the models are calibrated with Platt calibrator"); + predictor = calibrated.SubPredictor; + paramA = -(calibrated.Calibrator as PlattCalibrator).ParamA; + } + var tree = predictor as FastTreePredictionWrapper; + if (tree == null) + throw _host.Except("Model is not a tree ensemble"); + foreach (var t in tree.TrainedEnsemble.Trees) + { + var bytes = new byte[t.SizeInBytes()]; + int position = -1; + t.ToByteArray(bytes, ref position); + position = -1; + var tNew = new RegressionTree(bytes, ref position); + if (paramA != 1) + { + for (int i = 0; i < tNew.NumLeaves; i++) + tNew.SetOutput(i, tNew.LeafValues[i] * paramA); + } + ensemble.AddTree(tNew); + } + + if (modelCount == 1) + { + binaryClassifier = calibrated != null; + featureCount = tree.InputType.ValueCount; + } + else + { + _host.Check((calibrated != null) == binaryClassifier, "Ensemble contains both calibrated and uncalibrated models"); + _host.Check(featureCount == tree.InputType.ValueCount, "Found models with different number of features"); + } + } + + var scale = 1 / (double)modelCount; + + foreach (var t in ensemble.Trees) + { + for (int i = 0; i < t.NumLeaves; i++) + t.SetOutput(i, t.LeafValues[i] * scale); + } + + switch (_kind) + { + case PredictionKind.BinaryClassification: + if (!binaryClassifier) + return new FastTreeBinaryPredictor(_host, ensemble, featureCount, null); + + var cali = new PlattCalibrator(_host, -1, 0); + return new FeatureWeightsCalibratedPredictor(_host, new FastTreeBinaryPredictor(_host, ensemble, featureCount, null), cali); + case PredictionKind.Regression: + return new FastTreeRegressionPredictor(_host, ensemble, featureCount, null); + case PredictionKind.Ranking: + return new FastTreeRankingPredictor(_host, ensemble, featureCount, null); + default: + _host.Assert(false); + throw _host.ExceptNotSupp(); + } + } + } +} diff --git a/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs b/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs index 253d76d654..f404f3ae95 100644 --- a/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs +++ b/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs @@ -34,7 +34,7 @@ namespace Microsoft.ML.Runtime.Data { /// /// A bindable mapper wrapper for tree ensembles, that creates a bound mapper with three outputs: - /// 1. A vector containing the individual tree outputs of the tree ensemble. + /// 1. A vector containing the individual tree outputs of the tree ensemble. /// 2. An indicator vector for the leaves that the feature vector falls on in the tree ensemble. /// 3. An indicator vector for the internal nodes on the paths that the feature vector falls on in the tree ensemble. /// @@ -192,15 +192,15 @@ public BoundMapper(IExceptionContext ectx, TreeEnsembleFeaturizerBindableMapper // A vector containing the output of each tree on a given example. var treeValueType = new VectorType(NumberType.Float, _owner._ensemble.NumTrees); - // An indicator vector with length = the total number of leaves in the ensemble, indicating which leaf the example + // An indicator vector with length = the total number of leaves in the ensemble, indicating which leaf the example // ends up in all the trees in the ensemble. var leafIdType = new VectorType(NumberType.Float, _owner._totalLeafCount); - // An indicator vector with length = the total number of nodes in the ensemble, indicating the nodes on + // An indicator vector with length = the total number of nodes in the ensemble, indicating the nodes on // the paths of the example in all the trees in the ensemble. // The total number of nodes in a binary tree is equal to the number of internal nodes + the number of leaf nodes, // and it is also equal to the number of children of internal nodes (which is 2 * the number of internal nodes) - // plus one (since the root node is not a child of any node). So we have #internal + #leaf = 2*(#internal) + 1, - // which means that #internal = #leaf - 1. + // plus one (since the root node is not a child of any node). So we have #internal + #leaf = 2*(#internal) + 1, + // which means that #internal = #leaf - 1. // Therefore, the number of internal nodes in the ensemble is #leaf - #trees. var pathIdType = new VectorType(NumberType.Float, _owner._totalLeafCount - _owner._ensemble.NumTrees); _outputSchema = new Schema(ectx, owner, treeValueType, leafIdType, pathIdType); @@ -393,8 +393,7 @@ private void EnsureCachedPosition() public IEnumerable> GetInputColumnRoles() { - yield return new KeyValuePair( - RoleMappedSchema.ColumnRole.Feature, _inputSchema.Feature.Name); + yield return RoleMappedSchema.ColumnRole.Feature.Bind(_inputSchema.Feature.Name); } public Func GetDependencies(Func predicate) @@ -545,6 +544,7 @@ public ISchemaBoundMapper Bind(IHostEnvironment env, RoleMappedSchema schema) } } + /// public static class TreeEnsembleFeaturizerTransform { public sealed class Arguments : TrainAndScoreTransform.ArgumentsBase @@ -563,8 +563,8 @@ public sealed class Arguments : TrainAndScoreTransform.ArgumentsBase - /// REVIEW: Ideally we should have only one arguments class by using IComponentFactory for the model. - /// For now it probably warrants a REVIEW comment here in case we'd like to merge these two arguments in the future. + /// REVIEW: Ideally we should have only one arguments class by using IComponentFactory for the model. + /// For now it probably warrants a REVIEW comment here in case we'd like to merge these two arguments in the future. /// Also, it might be worthwhile to extract the common arguments to a base class. /// [TlcModule.EntryPointKind(typeof(CommonInputs.IFeaturizerInput))] @@ -803,7 +803,11 @@ private static IDataView AppendLabelTransform(IHostEnvironment env, IChannel ch, public static partial class TreeFeaturize { - [TlcModule.EntryPoint(Name = "Transforms.TreeLeafFeaturizer", Desc = TreeEnsembleFeaturizerTransform.TreeEnsembleSummary, UserName = TreeEnsembleFeaturizerTransform.UserName, ShortName = TreeEnsembleFeaturizerBindableMapper.LoadNameShort)] + [TlcModule.EntryPoint(Name = "Transforms.TreeLeafFeaturizer", + Desc = TreeEnsembleFeaturizerTransform.TreeEnsembleSummary, + UserName = TreeEnsembleFeaturizerTransform.UserName, + ShortName = TreeEnsembleFeaturizerBindableMapper.LoadNameShort, + XmlInclude = new[] { @"" })] public static CommonOutputs.TransformOutput Featurizer(IHostEnvironment env, TreeEnsembleFeaturizerTransform.ArgumentsForEntryPoint input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.FastTree/Utils/ToByteArrayExtensions.cs b/src/Microsoft.ML.FastTree/Utils/ToByteArrayExtensions.cs index e3aa3cce83..d4bc6e1962 100644 --- a/src/Microsoft.ML.FastTree/Utils/ToByteArrayExtensions.cs +++ b/src/Microsoft.ML.FastTree/Utils/ToByteArrayExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Linq; using System.Text; +using Microsoft.ML.Runtime.Internal.Utilities; namespace Microsoft.ML.Runtime.FastTree.Internal { @@ -46,7 +47,7 @@ public static int SizeInBytes(this short a) return sizeof(short); } - public unsafe static void ToByteArray(this short a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this short a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -70,7 +71,7 @@ public static int SizeInBytes(this ushort a) return sizeof(ushort); } - public unsafe static void ToByteArray(this ushort a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this ushort a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -94,7 +95,7 @@ public static int SizeInBytes(this int a) return sizeof(int); } - public unsafe static void ToByteArray(this int a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this int a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -104,7 +105,7 @@ public unsafe static void ToByteArray(this int a, byte[] buffer, ref int positio position += sizeof(int); } - public unsafe static int ToInt(this byte[] buffer, ref int position) + public static unsafe int ToInt(this byte[] buffer, ref int position) { int a; fixed (byte* pBuffer = buffer) @@ -123,7 +124,7 @@ public static int SizeInBytes(this uint a) return sizeof(uint); } - public unsafe static void ToByteArray(this uint a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this uint a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -133,7 +134,7 @@ public unsafe static void ToByteArray(this uint a, byte[] buffer, ref int positi position += sizeof(uint); } - public unsafe static uint ToUInt(this byte[] buffer, ref int position) + public static unsafe uint ToUInt(this byte[] buffer, ref int position) { uint a; fixed (byte* pBuffer = buffer) @@ -152,7 +153,7 @@ public static int SizeInBytes(this long a) return sizeof(long); } - public unsafe static void ToByteArray(this long a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this long a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -176,7 +177,7 @@ public static int SizeInBytes(this ulong a) return sizeof(ulong); } - public unsafe static void ToByteArray(this ulong a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this ulong a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -212,7 +213,7 @@ public static int SizeInBytes(this float a) return sizeof(float); } - public unsafe static void ToByteArray(this float a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this float a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -236,7 +237,7 @@ public static int SizeInBytes(this double a) return sizeof(double); } - public unsafe static void ToByteArray(this double a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this double a, byte[] buffer, ref int position) { fixed (byte* pBuffer = buffer) { @@ -290,7 +291,7 @@ public static string ToString(this byte[] buffer, ref int position) public static int SizeInBytes(this byte[] a) { - return sizeof(int) + a.Length * sizeof(byte); + return sizeof(int) + Utils.Size(a) * sizeof(byte); } public static void ToByteArray(this byte[] a, byte[] buffer, ref int position) @@ -314,10 +315,10 @@ public static byte[] ToByteArray(this byte[] buffer, ref int position) public static int SizeInBytes(this short[] a) { - return sizeof(int) + a.Length * sizeof(short); + return sizeof(int) + Utils.Size(a) * sizeof(short); } - public unsafe static void ToByteArray(this short[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this short[] a, byte[] buffer, ref int position) { int length = a.Length; length.ToByteArray(buffer, ref position); @@ -332,7 +333,7 @@ public unsafe static void ToByteArray(this short[] a, byte[] buffer, ref int pos position += length * sizeof(short); } - public unsafe static short[] ToShortArray(this byte[] buffer, ref int position) + public static unsafe short[] ToShortArray(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); short[] a = new short[length]; @@ -353,10 +354,10 @@ public unsafe static short[] ToShortArray(this byte[] buffer, ref int position) public static int SizeInBytes(this ushort[] a) { - return sizeof(int) + a.Length * sizeof(ushort); + return sizeof(int) + Utils.Size(a) * sizeof(ushort); } - public unsafe static void ToByteArray(this ushort[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this ushort[] a, byte[] buffer, ref int position) { int length = a.Length; length.ToByteArray(buffer, ref position); @@ -371,7 +372,7 @@ public unsafe static void ToByteArray(this ushort[] a, byte[] buffer, ref int po position += length * sizeof(ushort); } - public unsafe static ushort[] ToUShortArray(this byte[] buffer, ref int position) + public static unsafe ushort[] ToUShortArray(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); ushort[] a = new ushort[length]; @@ -392,12 +393,12 @@ public unsafe static ushort[] ToUShortArray(this byte[] buffer, ref int position public static int SizeInBytes(this int[] array) { - return sizeof(int) + array.Length * sizeof(int); + return sizeof(int) + Utils.Size(array) * sizeof(int); } - public unsafe static void ToByteArray(this int[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this int[] a, byte[] buffer, ref int position) { - int length = a.Length; + int length = Utils.Size(a); length.ToByteArray(buffer, ref position); fixed (byte* tmpBuffer = buffer) @@ -410,11 +411,14 @@ public unsafe static void ToByteArray(this int[] a, byte[] buffer, ref int posit position += length * sizeof(int); } - public unsafe static int[] ToIntArray(this byte[] buffer, ref int position) + public static unsafe int[] ToIntArray(this byte[] buffer, ref int position) => buffer.ToIntArray(ref position, buffer.ToInt(ref position)); - public unsafe static int[] ToIntArray(this byte[] buffer, ref int position, int length) + public static unsafe int[] ToIntArray(this byte[] buffer, ref int position, int length) { + if (length == 0) + return null; + int[] a = new int[length]; fixed (byte* tmpBuffer = buffer) @@ -433,10 +437,10 @@ public unsafe static int[] ToIntArray(this byte[] buffer, ref int position, int public static int SizeInBytes(this uint[] array) { - return sizeof(int) + array.Length * sizeof(uint); + return sizeof(int) + Utils.Size(array) * sizeof(uint); } - public unsafe static void ToByteArray(this uint[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this uint[] a, byte[] buffer, ref int position) { int length = a.Length; length.ToByteArray(buffer, ref position); @@ -451,7 +455,7 @@ public unsafe static void ToByteArray(this uint[] a, byte[] buffer, ref int posi position += length * sizeof(uint); } - public unsafe static uint[] ToUIntArray(this byte[] buffer, ref int position) + public static unsafe uint[] ToUIntArray(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); uint[] a = new uint[length]; @@ -472,10 +476,10 @@ public unsafe static uint[] ToUIntArray(this byte[] buffer, ref int position) public static int SizeInBytes(this long[] array) { - return sizeof(int) + array.Length * sizeof(long); + return sizeof(int) + Utils.Size(array) * sizeof(long); } - public unsafe static void ToByteArray(this long[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this long[] a, byte[] buffer, ref int position) { int length = a.Length; length.ToByteArray(buffer, ref position); @@ -490,7 +494,7 @@ public unsafe static void ToByteArray(this long[] a, byte[] buffer, ref int posi position += length * sizeof(long); } - public unsafe static long[] ToLongArray(this byte[] buffer, ref int position) + public static unsafe long[] ToLongArray(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); long[] a = new long[length]; @@ -511,10 +515,10 @@ public unsafe static long[] ToLongArray(this byte[] buffer, ref int position) public static int SizeInBytes(this ulong[] array) { - return sizeof(int) + array.Length * sizeof(ulong); + return sizeof(int) + Utils.Size(array) * sizeof(ulong); } - public unsafe static void ToByteArray(this ulong[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this ulong[] a, byte[] buffer, ref int position) { int length = a.Length; length.ToByteArray(buffer, ref position); @@ -529,7 +533,7 @@ public unsafe static void ToByteArray(this ulong[] a, byte[] buffer, ref int pos position += length * sizeof(ulong); } - public unsafe static ulong[] ToULongArray(this byte[] buffer, ref int position) + public static unsafe ulong[] ToULongArray(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); ulong[] a = new ulong[length]; @@ -550,7 +554,7 @@ public unsafe static ulong[] ToULongArray(this byte[] buffer, ref int position) public static int SizeInBytes(this MD5Hash[] array) { - return sizeof(int) + array.Length * MD5Hash.SizeInBytes(); + return sizeof(int) + Utils.Size(array) * MD5Hash.SizeInBytes(); } public static void ToByteArray(this MD5Hash[] a, byte[] buffer, ref int position) @@ -562,7 +566,7 @@ public static void ToByteArray(this MD5Hash[] a, byte[] buffer, ref int position } } - public unsafe static MD5Hash[] ToUInt128Array(this byte[] buffer, ref int position) + public static unsafe MD5Hash[] ToUInt128Array(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); MD5Hash[] a = new MD5Hash[length]; @@ -577,10 +581,10 @@ public unsafe static MD5Hash[] ToUInt128Array(this byte[] buffer, ref int positi public static int SizeInBytes(this float[] array) { - return sizeof(int) + array.Length * sizeof(float); + return sizeof(int) + Utils.Size(array) * sizeof(float); } - public unsafe static void ToByteArray(this float[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this float[] a, byte[] buffer, ref int position) { int length = a.Length; length.ToByteArray(buffer, ref position); @@ -595,7 +599,7 @@ public unsafe static void ToByteArray(this float[] a, byte[] buffer, ref int pos position += length * sizeof(float); } - public unsafe static float[] ToFloatArray(this byte[] buffer, ref int position) + public static unsafe float[] ToFloatArray(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); float[] a = new float[length]; @@ -616,10 +620,10 @@ public unsafe static float[] ToFloatArray(this byte[] buffer, ref int position) public static int SizeInBytes(this double[] array) { - return sizeof(int) + array.Length * sizeof(double); + return sizeof(int) + Utils.Size(array) * sizeof(double); } - public unsafe static void ToByteArray(this double[] a, byte[] buffer, ref int position) + public static unsafe void ToByteArray(this double[] a, byte[] buffer, ref int position) { int length = a.Length; length.ToByteArray(buffer, ref position); @@ -634,7 +638,7 @@ public unsafe static void ToByteArray(this double[] a, byte[] buffer, ref int po position += length * sizeof(double); } - public unsafe static double[] ToDoubleArray(this byte[] buffer, ref int position) + public static unsafe double[] ToDoubleArray(this byte[] buffer, ref int position) { int length = buffer.ToInt(ref position); double[] a = new double[length]; @@ -655,6 +659,8 @@ public unsafe static double[] ToDoubleArray(this byte[] buffer, ref int position public static int SizeInBytes(this double[][] array) { + if (Utils.Size(array) == 0) + return sizeof(int); return sizeof(int) + array.Sum(x => x.SizeInBytes()); } @@ -683,7 +689,7 @@ public static double[][] ToDoubleJaggedArray(this byte[] buffer, ref int positio public static long SizeInBytes(this string[] array) { long length = sizeof(int); - for (int i = 0; i < array.Length; ++i) + for (int i = 0; i < Utils.Size(array); ++i) { length += array[i].SizeInBytes(); } @@ -692,8 +698,8 @@ public static long SizeInBytes(this string[] array) public static void ToByteArray(this string[] a, byte[] buffer, ref int position) { - a.Length.ToByteArray(buffer, ref position); - for (int i = 0; i < a.Length; ++i) + Utils.Size(a).ToByteArray(buffer, ref position); + for (int i = 0; i < Utils.Size(a); ++i) { a[i].ToByteArray(buffer, ref position); } diff --git a/src/Microsoft.ML.FastTree/Utils/VectorUtils.cs b/src/Microsoft.ML.FastTree/Utils/VectorUtils.cs index fdf695b174..b804523cc1 100644 --- a/src/Microsoft.ML.FastTree/Utils/VectorUtils.cs +++ b/src/Microsoft.ML.FastTree/Utils/VectorUtils.cs @@ -17,7 +17,7 @@ public static double GetVectorSize(double[] vector) } // Normalizes the vector to have size of 1 - public unsafe static void NormalizeVectorSize(double[] vector) + public static unsafe void NormalizeVectorSize(double[] vector) { double size = GetVectorSize(vector); int length = vector.Length; @@ -34,7 +34,7 @@ public unsafe static void NormalizeVectorSize(double[] vector) } // Center vector to have mean = 0 - public unsafe static void CenterVector(double[] vector) + public static unsafe void CenterVector(double[] vector) { double mean = GetMean(vector); int length = vector.Length; @@ -51,7 +51,7 @@ public unsafe static void CenterVector(double[] vector) } // Normalizes the vector to have mean = 0 and std = 1 - public unsafe static void NormalizeVector(double[] vector) + public static unsafe void NormalizeVector(double[] vector) { double mean = GetMean(vector); double std = GetStandardDeviation(vector, mean); @@ -59,7 +59,7 @@ public unsafe static void NormalizeVector(double[] vector) } // Normalizes the vector to have mean = 0 and std = 1 - public unsafe static void NormalizeVector(double[] vector, double mean, double std) + public static unsafe void NormalizeVector(double[] vector, double mean, double std) { int length = vector.Length; unsafe @@ -74,17 +74,17 @@ public unsafe static void NormalizeVector(double[] vector, double mean, double s } } - public unsafe static double GetDotProduct(double[] vector1, double[] vector2) + public static unsafe double GetDotProduct(double[] vector1, double[] vector2) { return GetDotProduct(vector1, vector2, vector1.Length); } - public unsafe static double GetDotProduct(float[] vector1, float[] vector2) + public static unsafe double GetDotProduct(float[] vector1, float[] vector2) { return GetDotProduct(vector1, vector2, vector1.Length); } - public unsafe static double GetDotProduct(double[] vector1, double[] vector2, int length) + public static unsafe double GetDotProduct(double[] vector1, double[] vector2, int length) { double product = 0; unsafe @@ -101,7 +101,7 @@ public unsafe static double GetDotProduct(double[] vector1, double[] vector2, in return product; } - public unsafe static double GetDotProduct(float[] vector1, float[] vector2, int length) + public static unsafe double GetDotProduct(float[] vector1, float[] vector2, int length) { double product = 0; unsafe @@ -118,7 +118,7 @@ public unsafe static double GetDotProduct(float[] vector1, float[] vector2, int return product; } - public unsafe static double GetMean(double[] vector) + public static unsafe double GetMean(double[] vector) { double sum = 0; int length = vector.Length; @@ -135,7 +135,7 @@ public unsafe static double GetMean(double[] vector) return sum / length; } - public unsafe static double GetMean(float[] vector) + public static unsafe double GetMean(float[] vector) { double sum = 0; int length = vector.Length; @@ -157,7 +157,7 @@ public static double GetStandardDeviation(double[] vector) return GetStandardDeviation(vector, GetMean(vector)); } - public unsafe static double GetStandardDeviation(double[] vector, double mean) + public static unsafe double GetStandardDeviation(double[] vector, double mean) { double sum = 0; int length = vector.Length; @@ -176,7 +176,7 @@ public unsafe static double GetStandardDeviation(double[] vector, double mean) return Math.Sqrt(sum / length); } - public unsafe static int GetIndexOfMax(double[] vector) + public static unsafe int GetIndexOfMax(double[] vector) { int length = vector.Length; double max = vector[0]; @@ -199,7 +199,7 @@ public unsafe static int GetIndexOfMax(double[] vector) } // Subtracts the second vector from the first one (vector1[i] -= vector2[i]) - public unsafe static void SubtractInPlace(double[] vector1, double[] vector2) + public static unsafe void SubtractInPlace(double[] vector1, double[] vector2) { int length = vector1.Length; unsafe @@ -215,7 +215,7 @@ public unsafe static void SubtractInPlace(double[] vector1, double[] vector2) } } - public unsafe static double[] Subtract(double[] vector1, double[] vector2) + public static unsafe double[] Subtract(double[] vector1, double[] vector2) { int length = vector1.Length; double[] result = new double[length]; @@ -235,7 +235,7 @@ public unsafe static double[] Subtract(double[] vector1, double[] vector2) } // Subtracts the second vector from the first one (vector1[i] += vector2[i]) - public unsafe static void AddInPlace(double[] vector1, double[] vector2) + public static unsafe void AddInPlace(double[] vector1, double[] vector2) { int length = vector1.Length; unsafe @@ -252,7 +252,7 @@ public unsafe static void AddInPlace(double[] vector1, double[] vector2) } // Mutiplies the second vector from the first one (vector1[i] /= val) - public unsafe static void MutiplyInPlace(double[] vector, double val) + public static unsafe void MutiplyInPlace(double[] vector, double val) { int length = vector.Length; unsafe @@ -268,7 +268,7 @@ public unsafe static void MutiplyInPlace(double[] vector, double val) } // Divides the second vector from the first one (vector1[i] /= val) - public unsafe static void DivideInPlace(double[] vector, double val) + public static unsafe void DivideInPlace(double[] vector, double val) { int length = vector.Length; unsafe @@ -284,7 +284,7 @@ public unsafe static void DivideInPlace(double[] vector, double val) } // Divides the second vector from the first one (vector1[i] /= val) - public unsafe static void DivideInPlace(float[] vector, float val) + public static unsafe void DivideInPlace(float[] vector, float val) { int length = vector.Length; unsafe @@ -299,7 +299,7 @@ public unsafe static void DivideInPlace(float[] vector, float val) } } - public unsafe static double GetEuclideanDistance(double[] vector1, double[] vector2) + public static unsafe double GetEuclideanDistance(double[] vector1, double[] vector2) { double sum = 0; double diff; diff --git a/src/Microsoft.ML.FastTree/doc.xml b/src/Microsoft.ML.FastTree/doc.xml new file mode 100644 index 0000000000..26d3c8c129 --- /dev/null +++ b/src/Microsoft.ML.FastTree/doc.xml @@ -0,0 +1,192 @@ + + + + + + + Trains gradient boosted decision trees to the LambdaRank quasi-gradient. + + + + FastTree is an efficient implementation of the MART gradient boosting algorithm. + Gradient boosting is a machine learning technique for regression problems. + It builds each regression tree in a step-wise fashion, using a predefined loss function to measure the error for each step and corrects for it in the next. + So this prediction model is actually an ensemble of weaker prediction models. In regression problems, boosting builds a series of of such trees in a step-wise fashion and then selects the optimal tree using an arbitrary differentiable loss function. + + + MART learns an ensemble of regression trees, which is a decision tree with scalar values in its leaves. + A decision (or regression) tree is a binary tree-like flow chart, where at each interior node one decides which of the two child nodes to continue to based on one of the feature values from the input. + At each leaf node, a value is returned. In the interior nodes, the decision is based on the test 'x <= v' where x is the value of the feature in the input sample and v is one of the possible values of this feature. + The functions that can be produced by a regression tree are all the piece-wise constant functions. + + + The ensemble of trees is produced by computing, in each step, a regression tree that approximates the gradient of the loss function, and adding it to the previous tree with coefficients that minimize the loss of the new tree. + The output of the ensemble produced by MART on a given instance is the sum of the tree outputs. + + + In case of a binary classification problem, the output is converted to a probability by using some form of calibration. + In case of a regression problem, the output is the predicted value of the function. + In case of a ranking problem, the instances are ordered by the output value of the ensemble. + + For more information see: + + Wikipedia: Gradient boosting (Gradient tree boosting). + Greedy function approximation: A gradient boosting machine. + + + + + + + new FastTreeRanker + { + SortingAlgorithm = "DescendingReverse", + OptimizationAlgorithm = BoostedTreeArgsOptimizationAlgorithmType.AcceleratedGradientDescent + } + + + + + + + new FastTreeRegressor + { + NumTrees = 200, + EarlyStoppingRule = new GLEarlyStoppingCriterion(), + LearningRates = 0.4f, + DropoutRate = 0.05f + } + + + + + + + new FastTreeBinaryClassifier + { + NumTrees = 100, + EarlyStoppingRule = new PQEarlyStoppingCriterion(), + LearningRates = 0.4f, + DropoutRate = 0.05f + } + + + + + + + Trains a random forest to fit target values using least-squares. + + + Decision trees are non-parametric models that perform a sequence of simple tests on inputs. + This decision procedure maps them to outputs found in the training dataset whose inputs were similar to the instance being processed. + A decision is made at each node of the binary tree data structure based on a measure of similarity that maps each instance recursively through the branches of the tree until the appropriate leaf node is reached and the output decision returned. + Decision trees have several advantages: + + They are efficient in both computation and memory usage during training and prediction. + They can represent non-linear decision boundaries. + They perform integrated feature selection and classification. + They are resilient in the presence of noisy features. + + Fast forest is a random forest implementation. + The model consists of an ensemble of decision trees. Each tree in a decision forest outputs a Gaussian distribution by way of prediction. + An aggregation is performed over the ensemble of trees to find a Gaussian distribution closest to the combined distribution for all trees in the model. + This decision forest classifier consists of an ensemble of decision trees. + Generally, ensemble models provide better coverage and accuracy than single decision trees. + Each tree in a decision forest outputs a Gaussian distribution. + For more see: + + Wikipedia: Random forest + Quantile regression forest + From Stumps to Trees to Forests + + + + + + + new FastForestBinaryClassifier + { + NumTrees = 100, + NumLeaves = 50, + Calibrator = new FixedPlattCalibratorCalibratorTrainer() + } + + + + + + + new FastForestRegressor + { + NumTrees = 100, + NumLeaves = 50, + NumThreads = 5, + EntropyCoefficient = 0.3 + } + + + + + + + Trains gradient boosted decision trees to fit target values using a Tweedie loss function. + This learner is a generalization of Poisson, compound Poisson, and gamma regression. + + + The Tweedie boosting model follows the mathematics established in + Insurance Premium Prediction via Gradient Tree-Boosted Tweedie Compound Poisson Models. from Yang, Quan, and Zou. + For an introduction to Gradient Boosting, and more information, see: + Wikipedia: Gradient boosting (Gradient tree boosting) + Greedy function approximation: A gradient boosting machine + + + + + + Trains a tree ensemble, or loads it from a file, then maps a numeric feature vector + to three outputs: + + A vector containing the individual tree outputs of the tree ensemble. + A vector indicating the leaves that the feature vector falls on in the tree ensemble. + A vector indicating the paths that the feature vector falls on in the tree ensemble. + + If a both a model file and a trainer are specified - will use the model file. If neither are specified, + will train a default FastTree model. + This can handle key labels by training a regression model towards their optionally permuted indices. + + + In machine learning​ it is a pretty common and powerful approach to utilize the already trained model in the process of defining features. + One such example would be the use of model's scores as features to downstream models. For example, we might run clustering on the original features, + and use the cluster distances as the new feature set. + Instead of consuming the model's output, we could go deeper, and extract the 'intermediate outputs' that are used to produce the final score. + There are a number of famous or popular examples of this technique: + + A deep neural net trained on the ImageNet dataset, with the last layer removed, is commonly used to compute the 'projection' of the image into the 'semantic feature space'. + It is observed that the Euclidean distance in this space often correlates with the 'semantic similarity': that is, all pictures of pizza are located close together, + and far away from pictures of kittens. + A matrix factorization and/or LDA model is also often used to extract the 'latent topics' or 'latent features' associated with users and items. + The weights of the linear model are often used as a crude indicator of 'feature importance'. At the very minimum, the 0-weight features are not needed by the model, + and there's no reason to compute them. + + Tree featurizer uses the decision tree ensembles for feature engineering in the same fashion as above. + Let's assume that we've built a tree ensemble of 100 trees with 100 leaves each (it doesn't matter whether boosting was used or not in training). + If we associate each leaf of each tree with a sequential integer, we can, for every incoming example x, + produce an indicator vector L(x), where Li(x) = 1 if the example x 'falls' into the leaf #i, and 0 otherwise. + Thus, for every example x, we produce a 10000-valued vector L, with exactly 100 1s and the rest zeroes. + This 'leaf indicator' vector can be considered the ensemble-induced 'footprint' of the example. + The 'distance' between two examples in the L-space is actually a Hamming distance, and is equal to the number of trees that do not distinguish the two examples. + We could repeat the same thought process for the non-leaf, or internal, nodes of the trees (we know that each tree has exactly 99 of them in our 100-leaf example), + and produce another indicator vector, N (size 9900), for each example, indicating the 'trajectory' of each example through each of the trees. + The distance in the combined 19900-dimensional LN-space will be equal to the number of 'decisions' in all trees that 'agree' on the given pair of examples. + The TreeLeafFeaturizer is also producing the third vector, T, which is defined as Ti(x) = output of tree #i on example x. + + + + pipeline.Add(new TreeLeafFeaturizer()) + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.InternalStreams/InternalStreams.cs b/src/Microsoft.ML.InternalStreams/InternalStreams.cs deleted file mode 100644 index 76cd8413f6..0000000000 --- a/src/Microsoft.ML.InternalStreams/InternalStreams.cs +++ /dev/null @@ -1,13376 +0,0 @@ -// owner: rragno - -#define LZMA_PLAIN -#define UNBUFFERED -//#define GZIP_UNBUFFERED - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading; -using Microsoft.ML.Runtime; -using Microsoft.ML.Runtime.Internal.Utilities; - -// TODO: -// * Unbuffered writing -// * temporary file support (~ prefix?) -// * Store end emit Cosmos tools -// * Copy compression utils from a share -// * convert local UNC path to local path -// * reset and restart internal gzip as 4GB occurs -// * check encoding -// * Concatenation support for copy, wildcards -// * support compressed extensions in wildcard expansion -// * command piping support -// * C# execution support -// * XPRESS? (LZO / UCL?) -// * QuickLZ -// -// * make MultiStream RAID-like -// * parchive-like parity -// * IFilter -// * Compression support in Cosmos, HTTP -// * Positioned StreamReader fixes -// * Allow "_" as capital " " -// * filter stream -// * detect encoding for HTTP -// * Unicode for console -// * Fix zip support (possibly add zip.exe and unzip.exe as tools) -// * Complete archive directory support -// - Directory listings (especially for directories) -// - wildcard pattern integration -// - Directory removal -// - Directory moving -// * Pluggable decompression -// * built-in zip and gzip handling with J# -// * convert named streams to compressed archives -// * clipboard binary support -// * symbolic streams (temporaries?) -// * Support single file/URL for Cosmos config -// * Support programatic cosmos defaults -// * Support default cosmos path from settings or ini -// * I/O completion ports? -// * Examples - -// * T, Y, Concat stream composition (+ streamnames?) -// * Generalize provider interface! -// * shares, shortcuts, hardlinks -// * sparse files, NTFS compression, encryption -// * named pipes -// * shared memory -// * SharedDictionary support for shared memory or such -// * make TextReaders Enumerable -// * (check gzip size hack) -// * (defragmentation) - -//// GZip/Compression TODO: *** -//// - Support LN tag at the beginning -//// - Enable easy adding of tag to end of existing 4GB+ gzip files -//// - Enable seekable gzip files -//// - Enable opening the file and piping (potentially with the same Stream used to get the length) -//// - Enable appending by adding a new gzip file - -//// Unbuffered I/O TODO: *** -//// - investigate using FileStream with undocumented NoBuffering flag - -//// Other TODO: *** -//// - Make BoundedStream avoid using .Position! - -namespace Microsoft.ML.Runtime.Internal.IO -{ - #region IOUtil - /// - /// Utility functionality for handling paths and other I/O issues. - /// - public static class IOUtil - { - #region DLLimport - /// - /// Imports the Win32 APIs used by the library. - /// - internal class Win32 - { - #region Constants - - public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); - public static readonly IntPtr NULL_HANDLE = IntPtr.Zero; - - [Flags] - public enum FileAccess : uint - { - QUERY = 0x00000000, - GENERIC_READ = 0x80000000, - GENERIC_WRITE = 0x40000000, - GENERIC_EXECUTE = 0x10000000, - GENERIC_ALL = 0x10000000, - } - - [Flags] - public enum FileShare : uint - { - FILE_SHARE_READ = 1, - FILE_SHARE_WRITE = 2, - FILE_SHARE_DELETE = 4, - FILE_SHARE_READ_AND_WRITE = 1 | 2, - } - - public enum CreationDisposition : uint - { - CREATE_NEW = 1, - CREATE_ALWAYS = 2, - OPEN_EXISTING = 3, - OPEN_ALWAYS = 4, - TRUNCATE_EXISTING = 5, - } - - [Flags] - public enum FileFlag : uint - { - FILE_FLAG_WRITE_THROUGH = 0x80000000, - FILE_FLAG_OVERLAPPED = 0x40000000, - FILE_FLAG_NO_BUFFERING = 0x20000000, - FILE_FLAG_RANDOM_ACCESS = 0x10000000, - FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000, - FILE_FLAG_DELETE_ON_CLOSE = 0x04000000, - FILE_FLAG_BACKUP_SEMANTICS = 0x02000000, - FILE_FLAG_POSIX_SEMANTICS = 0x01000000, - FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000, - FILE_FLAG_OPEN_NO_RECALL = 0x00100000, - FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000, - } - - [Flags] - public enum FileAttributes : uint - { - FILE_ATTRIBUTE_READONLY = 0x00000001, - FILE_ATTRIBUTE_HIDDEN = 0x00000002, - FILE_ATTRIBUTE_SYSTEM = 0x00000004, - FILE_ATTRIBUTE_DIRECTORY = 0x00000010, - FILE_ATTRIBUTE_ARCHIVE = 0x00000020, - FILE_ATTRIBUTE_DEVICE = 0x00000040, - FILE_ATTRIBUTE_NORMAL = 0x00000080, - FILE_ATTRIBUTE_TEMPORARY = 0x00000100, - FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200, - FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400, - FILE_ATTRIBUTE_COMPRESSED = 0x00000800, - FILE_ATTRIBUTE_OFFLINE = 0x00001000, - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000, - FILE_ATTRIBUTE_ENCRYPTED = 0x00004000, - } - - [Flags] - public enum FileFlagsAndAttributes : uint - { - FILE_FLAG_WRITE_THROUGH = 0x80000000, - FILE_FLAG_OVERLAPPED = 0x40000000, - FILE_FLAG_NO_BUFFERING = 0x20000000, - FILE_FLAG_RANDOM_ACCESS = 0x10000000, - FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000, - FILE_FLAG_DELETE_ON_CLOSE = 0x04000000, - FILE_FLAG_BACKUP_SEMANTICS = 0x02000000, - FILE_FLAG_POSIX_SEMANTICS = 0x01000000, - FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000, - FILE_FLAG_OPEN_NO_RECALL = 0x00100000, - FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000, - - FILE_ATTRIBUTE_READONLY = 0x00000001, - FILE_ATTRIBUTE_HIDDEN = 0x00000002, - FILE_ATTRIBUTE_SYSTEM = 0x00000004, - FILE_ATTRIBUTE_DIRECTORY = 0x00000010, - FILE_ATTRIBUTE_ARCHIVE = 0x00000020, - FILE_ATTRIBUTE_DEVICE = 0x00000040, - FILE_ATTRIBUTE_NORMAL = 0x00000080, - FILE_ATTRIBUTE_TEMPORARY = 0x00000100, - FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200, - FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400, - FILE_ATTRIBUTE_COMPRESSED = 0x00000800, - FILE_ATTRIBUTE_OFFLINE = 0x00001000, - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000, - FILE_ATTRIBUTE_ENCRYPTED = 0x00004000, - } - - public enum SeekOrigin : uint - { - FILE_BEGIN = 0, - FILE_CURRENT = 1, - FILE_END = 2, - } - - [Flags] - public enum AllocationType : uint - { - MEM_COMMIT = 0x1000, - MEM_RESERVE = 0x2000, - MEM_RESET = 0x80000, - - //MEM_PRIVATE = 0x20000, - //MEM_MAPPED = 0x40000, - - /// Can be combined with the types above: - /// - /// This can be combined with the allocation type. - /// - MEM_TOP_DOWN = 0x100000, - /// - /// This can be combined with the allocation type. - /// - MEM_LARGE_PAGES = 0x20000000, - //MEM_WRITE_WATCH = 0x200000, - //MEM_PHYSICAL = 0x400000, - //MEM_4MB_PAGES = 0x80000000, - } - - public enum FreeType : uint - { - MEM_DECOMMIT = 0x4000, - MEM_RELEASE = 0x8000, - MEM_FREE = 0x10000, - } - - [Flags] - public enum Protect : uint - { - PAGE_NONE = 0x00000000, - PAGE_NOACCESS = 0x00000001, - PAGE_READONLY = 0x00000002, - PAGE_READWRITE = 0x00000004, - PAGE_WRITECOPY = 0x00000008, - PAGE_EXECUTE = 0x00000010, - PAGE_EXECUTE_READ = 0x00000020, - PAGE_EXECUTE_READWRITE = 0x00000040, - PAGE_EXECUTE_WRITECOPY = 0x00000080, - PAGE_GUARD = 0x00000100, - PAGE_NOCACHE = 0x00000200, - PAGE_WRITECOMBINE = 0x00000400, - } - - /// - /// Access for the mapped file. - /// - public enum MapAccess : uint - { - FILE_MAP_COPY = 0x00000001, - FILE_MAP_WRITE = 0x00000002, - FILE_MAP_READ = 0x00000004, - FILE_MAP_ALL_ACCESS = 0x0000001f, - } - - #endregion - - #region Structures - - public struct IO_STATUS_BLOCK - { - public static readonly IO_STATUS_BLOCK NullBlock = new IO_STATUS_BLOCK(true); - - // are these still uint on x64? *** - // If this is the wrong size, the results are disastrous... - public uint /*ulong*/ /*IntPtr*/ /*NTSTATUS*/ Status; - public uint /*ulong*/ /*IntPtr*/ /*ULONG_PTR*/ Information; - - private IO_STATUS_BLOCK(bool d) - { - Status = 0; //IntPtr.Zero; - Information = 0; //IntPtr.Zero; - } - } - - public enum FILE_INFORMATION_CLASS : int - { - FileDirectoryInformation = 1, - FileFullDirectoryInformation, - FileBothDirectoryInformation, - FileBasicInformation, - FileStandardInformation, - FileInternalInformation, - FileEaInformation, - FileAccessInformation, - FileNameInformation, - FileRenameInformation, - FileLinkInformation, - FileNamesInformation, - FileDispositionInformation, - FilePositionInformation, - FileFullEaInformation, - FileModeInformation, - FileAlignmentInformation, - FileAllInformation, - FileAllocationInformation, - FileEndOfFileInformation, - FileAlternateNameInformation, - FileStreamInformation, - FilePipeInformation, - FilePipeLocalInformation, - FilePipeRemoteInformation, - FileMailslotQueryInformation, - FileMailslotSetInformation, - FileCompressionInformation, - FileCopyOnWriteInformation, - FileCompletionInformation, - FileMoveClusterInformation, - FileQuotaInformation, - FileReparsePointInformation, - FileNetworkOpenInformation, - FileObjectIdInformation, - FileTrackingInformation, - FileOleDirectoryInformation, - FileContentIndexInformation, - FileInheritContentIndexInformation, - FileOleInformation, - FileMaximumInformation - }; - - private struct FILE_ALLOCATION_INFORMATION - { - // is this too fragile?? *** - public long /*LARGE_INTEGER*/ AllocationSize; - public FILE_ALLOCATION_INFORMATION(long length) - { - AllocationSize = length; - } - } - - #endregion - - public static bool NT_SUCCESS(uint status) - { - return (status <= 0x3FFFFFFF); - } - - [DllImport("NTDLL", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern uint NtQueryInformationFile( - IntPtr handle, - ref IO_STATUS_BLOCK ioStatusBlock, - byte[] fileInformation, - uint length, - FILE_INFORMATION_CLASS fileInformationClass); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr GetStdHandle( - int nStdHandle); - - // this seems rather fragile. - [DllImport("NTDLL", ExactSpelling = true, SetLastError = true)] - public static extern int NtSetInformationFile( - IntPtr /*HANDLE*/ fileHandle, - ref IO_STATUS_BLOCK /*PIO_STATUS_BLOCK*/ ioStatusBlock, - ref long /*FILE_ALLOCATION_INFORMATION*/ /*IntPtr*/ /*PVOID*/ fileInformation, - uint /*ULONG*/ length, - FILE_INFORMATION_CLASS fileInformationClass); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern IntPtr CreateFile( - string fileName, - FileAccess desiredAccess, - FileShare shareMode, - IntPtr securityAttributes, - CreationDisposition creationDisposition, - FileFlagsAndAttributes flagsAndAttributes, - IntPtr templateFile); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool CloseHandle( - IntPtr hObject); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool SetFilePointerEx( - IntPtr handle, - long offset, - out long /*IntPtr*/ newPosition, - SeekOrigin seekOrigin); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool GetFileSizeEx( - IntPtr handle, - out long newPosition); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool DeleteFile( - string fileName); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern IntPtr VirtualAlloc( - IntPtr lpAddress, - IntPtr dwSize, - AllocationType flAllocationType, - Protect flProtect); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool VirtualFree( - IntPtr lpAddress, - IntPtr dwSize, - FreeType dwFreeType); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool FlushFileBuffers( - IntPtr handle); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool SetEndOfFile( - IntPtr handle); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool ReadFile( - IntPtr hFile, - byte[] /*IntPtr*/ lpBuffer, - int nNumberOfBytesToRead, - out int nNumberOfBytesRead, - // ref OVERLAPPED lpOverlapped); - IntPtr lpOverlapped); - public static bool ReadFile( - IntPtr hFile, - byte[] /*IntPtr*/ lpBuffer, - int nNumberOfBytesToRead, - out int nNumberOfBytesRead) - { - return ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, out nNumberOfBytesRead, IntPtr.Zero); - } - - // there is likely a better way to do this... - public class Raw - { - private Raw() - { - } - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool ReadFile( - IntPtr hFile, - IntPtr lpBuffer, - int nNumberOfBytesToRead, - out int nNumberOfBytesRead, - // ref OVERLAPPED lpOverlapped); - IntPtr lpOverlapped); - public static bool ReadFile( - IntPtr hFile, - IntPtr lpBuffer, - int nNumberOfBytesToRead, - out int nNumberOfBytesRead) - { - return ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, out nNumberOfBytesRead, IntPtr.Zero); - } - } - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool WriteFile( - IntPtr hFile, - byte[] /*IntPtr*/ lpBuffer, - int nNumberOfBytesToWrite, - out int nNumberOfBytesWritten, - // ref OVERLAPPED lpOverlapped); - IntPtr lpOverlapped); - public static bool WriteFile( - IntPtr hFile, - byte[] /*IntPtr*/ lpBuffer, - int nNumberOfBytesToWrite, - out int nNumberOfBytesWritten) - { - return WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, out nNumberOfBytesWritten, IntPtr.Zero); - } - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - public static extern bool GetDiskFreeSpace( - string path, - out uint sectorsPerCluster, - out uint bytesPerSector, - out uint numberOfFreeClusters, - out uint totalNumberOfClusters); - - [DllImport("KERNEL32")] - public static extern bool GetDiskFreeSpaceEx( - string lpDirectoryName, - out UInt64 lpFreeBytesAvailable, - out UInt64 lpTotalNumberOfBytes, - out UInt64 lpTotalNumberOfFreeBytes); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto)] - public static extern IntPtr CreateFileMapping( - IntPtr hFile, - IntPtr lpAttributes, - Protect flProtect, - int dwMaximumSizeLow, - int dwMaximumSizeHigh, - string lpName); - - [DllImport("KERNEL32", SetLastError = true)] - public static extern bool FlushViewOfFile( - IntPtr lpBaseAddress, - int dwNumBytesToFlush); - - [DllImport("KERNEL32", SetLastError = true)] - public static extern IntPtr MapViewOfFile( - IntPtr hFileMappingObject, - int dwDesiredAccess, - int dwFileOffsetHigh, - int dwFileOffsetLow, - int dwNumBytesToMap); - - [DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto)] - public static extern IntPtr OpenFileMapping( - int dwDesiredAccess, - bool bInheritHandle, - string lpName); - - [DllImport("KERNEL32", SetLastError = true)] - public static extern bool UnmapViewOfFile( - IntPtr lpBaseAddress); - - #region Unused - private Win32() - { - } - - //[DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] - //static extern bool GetOverlappedResult( - // IntPtr hFile, - // IntPtr lpBuffer, - // ref OVERLAPPED lpOverlapped, - // out int lpNumberOfBytesTransferred, - // bool bWait); - - //[StructLayout(LayoutKind.Explicit)] - //struct OVERLAPPED - //{ - // //public ULONG_PTR Internal; - // //public ULONG_PTR InternalHigh; - // //public DWORD Offset; - // //public DWORD OffsetHigh; - // //public HANDLE hEvent; - // [FieldOffset(0)] - // public IntPtr Internal; - // [FieldOffset(4)] - // public IntPtr InternalHigh; - // [FieldOffset(8)] - // public uint Offset; - // [FieldOffset(12)] - // public uint OffsetHigh; - // [FieldOffset(16)] - // public IntPtr hEvent; - //} - - // [StructLayout(Packing = 4)] - // private struct FILE_STREAM_INFORMATION - // { - // ULONG NextEntry; - // ULONG NameLength; - // LARGE_INTEGER Size; - // LARGE_INTEGER AllocationSize; - // USHORT Name[1]; - // } - - #endregion - } - #endregion DLLimport - -#if TLCFULLBUILD - #region Disk Info - - /// - /// Get the amount of space free on a volume. - /// - /// The drive, share, directory, or file located on the volume - /// the free space on the given volume - public static long DiskFree(string path) - { - // Could support cosmos... *** - if (path == null || path.Length == 0) - return 0; - path = Directory.GetDirectoryRoot(path); - ulong freeBytesAvailable; - ulong totalNumberOfBytes; - ulong totalNumberOfFreeBytes; - if (!Win32.GetDiskFreeSpaceEx(path, out freeBytesAvailable, out totalNumberOfBytes, out totalNumberOfFreeBytes)) - { - freeBytesAvailable = 0; - } - return (long)freeBytesAvailable; - } - - #endregion - - #region Path Manipulation - - internal static readonly char[] pathSeparators = new char[] { '/', '\\' }; - - /// - /// Combine a base path with another partial path - /// - /// the base path to start in - /// the path to combine with the base path - /// the combined path - /// - /// If subPath is an absolute path, it will be returned. If either path is - /// empty or null, the other path will be returned. - /// - public static string PathCombine(string basePath, string subPath) - { - if (basePath == null) - return subPath; - if (subPath == null) - return basePath; - if (basePath.Length == 0) - return subPath; - if (subPath.Length == 0) - return basePath; - - string nameLower = subPath.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(subPath)) - { - return subPath; - } - if (ZStreamIn.IsConsoleStream(subPath)) - { - return subPath; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(subPath)) - { - return subPath; - } - - // check for cosmos: - if (nameLower.StartsWith("cosmos:")) - { - return subPath; - } - - // check for Cockpit: - if (nameLower.StartsWith("cockpit:")) - { - return subPath; - } - - // check for Multistream: - if (nameLower.StartsWith("multi:")) - { - return subPath; - } - if (nameLower.StartsWith("filelist:")) - { - return subPath; - } - - // check for HTTP: - if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - return subPath; - } - - if (subPath[0] == '/' || subPath[0] == '\\') - { - if (subPath.Length == 1 || (subPath.Length == 2 && subPath[1] == '.')) - { - return PathRoot(basePath); - } - if (subPath[1] == '/' || subPath[1] == '\\') - { - return subPath; - } - basePath = PathRoot(basePath); - subPath = subPath.Substring(1); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(subPath)) - { - return subPath; - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(subPath)) - { - return subPath; - } - - // examine basePath - - if (InternalStoreUtility.IsInternalStore(basePath)) - { - // is this best? - return basePath.Substring(0, basePath.IndexOf(':') + 1) + - PathCombine(InternalStoreUtility.StorePath(basePath), subPath); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(basePath)) - { - // is this best? *** - if (!basePath.EndsWith("/")) - basePath = basePath + "/"; - return basePath + subPath; - } - - // check for Multistream: - if (string.Compare(basePath, 0, "multi:", 0, "multi:".Length, true) == 0) - { - // is this best? *** - return basePath.Substring(0, "multi:".Length) + - PathCombine(basePath.Substring("multi:".Length), subPath); - } - if (string.Compare(basePath, 0, "filelist:", 0, "filelist:".Length, true) == 0) - { - // is this best? *** - return basePath.Substring(0, "filelist:".Length) + - PathCombine(basePath.Substring("filelist:".Length), subPath); - } - - return ReducePath(Path.Combine(basePath, subPath)); - } - - /// - /// Find the root element of a path. - /// - /// the path to analyze - /// the root element of the path, or the empty string if none exists - /// - ///

- /// This is only based on the text of the path string. - ///

- ///

- /// The path returned will be canonical, so it can be compared for equality with - /// other roots. - ///

- ///
- public static string PathRoot(string path) - { - if (path == null || path.Length == 0) - return ""; - string nameLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - //return ""; - // should it be this? The length then won't match... *** - return ZStreamIn.NullStreamName; - } - if (ZStreamIn.IsConsoleStream(path)) - { - //return ""; - // should it be this? The length then won't match... *** - return ZStreamIn.ConsoleStreamName; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - // should this be empty, or "clip:" ? - return "clip:"; - } - - // check for cosmos: - if (nameLower.StartsWith("cosmos:")) - { - if (nameLower.Length < "cosmos://".Length) - return "cosmos:"; - int s = nameLower.IndexOfAny(pathSeparators, "cosmos://".Length); - if (s < 0) - { - return nameLower; - } - s = nameLower.IndexOfAny(pathSeparators, s + 1); - if (s < 0) - { - return nameLower; - } - return nameLower.Substring(0, s); - } - - // check for Cockpit: - if (nameLower.StartsWith("cockpit:")) - { - // what is right here? - if (path.Length < "cockpit://aa".Length) - return path; - int s = path.IndexOfAny(pathSeparators, "cockpit://a".Length); - if (s < 0) - { - return path; - } - return path.Substring(0, s); - } - - // check for Multistream: - if (nameLower.StartsWith("multi:") || nameLower.StartsWith("filelist:")) - { - // what is right here? *** - if (nameLower.Length < "multi:a".Length) - return path; - int s = path.IndexOfAny(pathSeparators, "multi:a".Length); - if (s < 0) - { - return path; - } - return path.Substring(0, s); - } - if (nameLower.StartsWith("filelist:")) - { - // what is right here? *** - if (nameLower.Length < "filelist:a".Length) - return path; - int s = path.IndexOfAny(pathSeparators, "filelist:a".Length); - if (s < 0) - { - return path; - } - return path.Substring(0, s); - } - - // check for HTTP: - if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - // what is right here? - int s = path.IndexOfAny(pathSeparators, "http://a".Length); - if (s < 0) - { - return path; - } - return path.Substring(0, s); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(path)) - { - return SqlTextReader.PathRoot(path); - } - - // InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - return InternalStoreUtility.PathRoot(path); - //return "store:" + PathRoot(InternalStoreUtility.StorePath(path)); - } - - if (nameLower.IndexOfAny(pathSeparators) < 0) - { - if (nameLower.Length == 2 && nameLower[1] == ':') - { - //return nameLower + "\\"; - return nameLower + "/"; - } - return ""; - } - - if (path[0] == ':') - return ""; - try - { - return Path.GetPathRoot(path).ToLower().Replace('\\', '/'); - } - catch - { - return ""; - } - } - - /// - /// Find the parent of a given file or directory, based on the path. - /// - /// the original path to start from - /// the path to the parent directory, or null if none exists - /// - /// The parent is determined based only on the given path information. - /// Additionally, a file in the current directory will return ".", but - /// this may be misleading if the path is misinterpretted. The current - /// directory, ".", will return "..", but that might not be a valid directory. - /// - public static string PathParent(string path) - { - if (path == null || path.Length == 0) - return null; - - string nameLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - return path.IndexOfAny(pathSeparators) < 0 ? null : ZStreamIn.NullStreamName; - } - if (ZStreamIn.IsConsoleStream(path)) - { - return path.IndexOfAny(pathSeparators) < 0 ? null : ZStreamIn.ConsoleStreamName; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - return path.IndexOfAny(pathSeparators) < 0 || string.Compare(path, "clip://", true) == 0 ? - null : "clip:"; - } - - // check for Cosmos: - if (nameLower.StartsWith("cosmos://")) - { - if (nameLower.Length < "cosmos://a/b/c".Length) - return null; - int s = nameLower.IndexOfAny(pathSeparators, "cosmos://".Length); - if (s < 0) - { - return null; - } - s = nameLower.IndexOfAny(pathSeparators, s + 1); - if (s < 0) - { - return null; - } - int e = nameLower.Length - 1; - if (nameLower[e] == '/' || nameLower[e] == '\\') - e--; - if (e <= s) - return null; - e = nameLower.LastIndexOfAny(pathSeparators, e); - return path.Substring(0, e + 1); - } - - // check for Cockpit: - if (nameLower.StartsWith("cockpit:")) - { - if (nameLower.Length < "cockpit://a/b".Length) - return null; - int s = nameLower.IndexOfAny(pathSeparators, "cockpit://a".Length); - if (s < 0) - { - return null; - } - int e = nameLower.Length - 1; - if (nameLower[e] == '/' || nameLower[e] == '\\') - e--; - if (e <= s) - return null; - e = nameLower.LastIndexOfAny(pathSeparators, e); - return path.Substring(0, e + 1); - } - - // check for Multistream: - if (nameLower.StartsWith("multi:")) - { - // what is right here? *** - if (nameLower.Length < "multi:a/b".Length) - return null; - int s = nameLower.IndexOfAny(pathSeparators, "multi:a/b".Length); - if (s < 0) - { - return null; - } - int e = nameLower.Length - 1; - if (nameLower[e] == '/' || nameLower[e] == '\\') - e--; - if (e <= s) - return null; - e = nameLower.LastIndexOfAny(pathSeparators, e); - return path.Substring(0, e + 1); - } - if (nameLower.StartsWith("filelist:")) - { - // what is right here? *** - if (nameLower.Length < "filelist:a/b".Length) - return null; - int s = nameLower.IndexOfAny(pathSeparators, "filelist:a/b".Length); - if (s < 0) - { - return null; - } - int e = nameLower.Length - 1; - if (nameLower[e] == '/' || nameLower[e] == '\\') - e--; - if (e <= s) - return null; - e = nameLower.LastIndexOfAny(pathSeparators, e); - return path.Substring(0, e + 1); - } - - // check for HTTP: - if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - if (nameLower.Length < "http://a/b".Length) - return null; - int s = nameLower.IndexOfAny(pathSeparators, "http://a".Length); - if (s < 0) - { - return null; - } - int e = nameLower.Length - 1; - if (nameLower[e] == '/' || nameLower[e] == '\\') - e--; - if (e <= s) - return null; - e = nameLower.LastIndexOfAny(pathSeparators, e); - return path.Substring(0, e + 1); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(path)) - { - string s = SqlTextReader.PathRoot(path); - if (s == null || s.Length == 0 || s.Length <= path.Length - 1) - return null; - return s; - } - - // InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - // should this just always return null? - //return null; - return path.Substring(0, path.IndexOf(':') + 1) + PathParent(InternalStoreUtility.StorePath(path)); - } - - if (nameLower == "." || nameLower == "./" || nameLower == ".\\") - return ".."; - - // filename with no path separators: - if (nameLower.IndexOfAny(pathSeparators) < 0) - { - // check for a drive specification: - if (nameLower.Length == 2 && nameLower[1] == ':') - { - return null; - } - // a simple filename, in the current directory? - return "."; - } - // drive root: - if (nameLower.Length == 1) - return null; - - // path with separators: - // UNC: - if ((nameLower[0] == '/' || nameLower[0] == '\\') && - (nameLower[1] == '/' || nameLower[1] == '\\')) - { - if (nameLower.Length <= 3) - return null; - // machine names do not count as directories!! - // \\machine\share\path - int s = nameLower.IndexOfAny(pathSeparators, 2); - if (s < 0 || s == nameLower.Length - 1) - return null; - s = nameLower.IndexOfAny(pathSeparators, s + 1); - if (s < 0 || s == nameLower.Length - 1) - return null; - int e = nameLower.Length - 1; - if (nameLower[e] == '/' || nameLower[e] == '\\') - e--; - if (e <= s) - return null; - e = nameLower.LastIndexOfAny(pathSeparators, e); - return path.Substring(0, e + 1); - } - - // simple file path: - { - int e = nameLower.Length - 1; - if (nameLower[e] == '/' || nameLower[e] == '\\') - e--; - e = nameLower.LastIndexOfAny(pathSeparators, e); - if (e < 0) - return "."; - return path.Substring(0, e + 1); - } - } - - /// - /// Gets the full path of the file or directory in a standard form. - /// - /// the original path - /// the full path, with a standard casing and presentation - /// - ///

- /// A trailing slash will be preserved. In general, the canonical path for a directory - /// includes the trailing slash, but it would be expensive to check for existance - /// and insert the slash when it is omitted (and incorrect, in the case of directory - /// paths for directories that do not yet exist). - ///

- ///

- /// ignores a trailing slash, to account for this effect. - ///

- ///
- public static string GetCanonicalPath(string path) - { - if (path == null || path.Length == 0) - return ""; - path = path.Trim(); - if (path.Length == 0) - return ""; - path = path.Replace('\\', '/'); - // remove repeated slashes? - string nameLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - return ZStreamIn.NullStreamName; - } - if (ZStreamIn.IsConsoleStream(path)) - { - return ZStreamIn.ConsoleStreamName; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - return "clip:"; - } - - // check for cosmos: - if (string.Compare(path, 0, "cosmos://", 0, "cosmos://".Length, true) == 0) - { - string root = IOUtil.PathRoot(path); - path = root.ToLower() + - path.Substring(root.Length).Replace("//", "/"); - - return ReducePath(path); - } - - // check for Cockpit: - if (string.Compare(path, 0, "cockpit:", 0, "cockpit:".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - string root = IOUtil.PathRoot(path); - path = "cockpit:" + root.Substring("cockpit:".Length).Replace('\\', '/').ToUpper() + - path.Substring(root.Length).Replace('\\', '/').ToLower(); - return ReducePath(path); - } - - // check for Multistream: - if (string.Compare(path, 0, "multi:", 0, "multi:".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - string root = IOUtil.PathRoot(path); - path = "multi:" + root.Substring("multi:".Length).Replace('\\', '/').ToUpper() + - path.Substring(root.Length).Replace('\\', '/').ToLower(); - return ReducePath(path); - } - if (string.Compare(path, 0, "filelist:", 0, "filelist:".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - string root = IOUtil.PathRoot(path); - path = "multi:" + root.Substring("filelist:".Length).Replace('\\', '/').ToUpper() + - path.Substring(root.Length).Replace('\\', '/').ToLower(); - return ReducePath(path); - } - - // check for HTTP: - if (string.Compare(path, 0, "http://", 0, "http://".Length, true) == 0 || - string.Compare(path, 0, "https://", 0, "https://".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - string root = IOUtil.PathRoot(path); - if (root.EndsWith(":80")) - { - path = root.Substring(0, root.Length - 3).ToLower() + - path.Substring(root.Length); - } - else - { - path = root.ToLower() + - path.Substring(root.Length); - } - return ReducePath(path); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(path)) - { - return SqlTextReader.GetCanonicalPath(path); - } - - // InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - return InternalStoreUtility.GetCanonicalPath(path); - } - - try - { - return ReducePath(Path.GetFullPath(path).Replace('\\', '/').ToLower()); - } - catch - { - path = path.ToLower(); - if (path.StartsWith("//")) - { - path = "/" + path.Substring(1).Replace("//", "/"); - } - else - { - path = path.Replace("//", "/"); - } - return ReducePath(path); - } - } - - private static string ReducePath(string path) - { - try - { - if (path == null) - return null; - if (path.Length == 0 || path == ".") - return path; - bool noBack = (path.IndexOf('/') < 0) && (path.IndexOf('\\') >= 0); - path = path.Replace('\\', '/'); - path = path.Replace("/./", "/"); - if (path.StartsWith("./")) - path = path.Substring(2); - if (path.EndsWith("/.")) - path = path.Substring(0, path.Length - 1); - if (path.Length == 0 || path == ".") - return path; - int i = 0; - while ((i = path.IndexOf("/../", i)) >= 0) - { - if (i == 0) - { - // malformed... skip. - i += 4; - } - else - { - int s = path.LastIndexOf('/', i - 1); - if (s < 0) - s = -1; - path = path.Substring(0, s + 1) + path.Substring(i + 4); - i = s; - } - if (i < 0 || i >= path.Length) - break; - } - if (path.Length > 3 && path.EndsWith("/..")) - { - int s = path.LastIndexOf('/', path.Length - 4); - if (s < 0) - { - path = "."; - } - else - { - path = path.Substring(0, s + 1); - } - } - if (path.Length == 0) - path = "."; - if (noBack) - path = path.Replace('/', '\\'); - return path; - } - catch - { - return path; - } - } - - /// - /// Determine whether two paths refer to the same location. - /// - /// the first path to compare - /// the second path to compare - /// true if the paths refer to the same entity; false otherwise - /// - /// This is equivalent to the expression - /// (GetCanonicalPath(path1).TrimEnd('/').Equals(GetCanonicalPath(path2).TrimEnd('/'))). - /// It will not find all paths that lead to the same location (for example, a - /// UNC share path may refer to a local file system path, or a hardlink or junction - /// may exist). - /// - public static bool PathsEqual(string path1, string path2) - { - if (path1 == null || path2 == null) - return path1 == path2; - string path1C = GetCanonicalPath(path1); - string path2C = GetCanonicalPath(path2); - if (path1C.Length != path2C.Length) - { - if (path2C.Length < path1C.Length) - { - string tmp = path1C; - path1C = path2C; - path2C = tmp; - } - if (path2C.Length - path1C.Length == 1 && - (path2C[path2C.Length - 1] == '/' || path2C[path2C.Length - 1] == '\\')) - { - return string.CompareOrdinal(path2C, 0, path1C, 0, path1C.Length) == 0; - } - return false; - } - return (path1C.Equals(path2C)); - - //if (path1 == null || path1.Length == 0 || path2 == null || path2.Length == 0) - //{ - // return path1 == path2; - //} - //path1 = path1.TrimEnd(pathSeparators); - //path2 = path2.TrimEnd(pathSeparators); - //if (path1.Length != path2.Length) return false; - //path1 = path1.Replace('\\', '/'); - //path2 = path2.Replace('\\', '/'); - //return string.Compare(path1, path2, !path1.StartsWith("cosmos:")) == 0; - } - - /// - /// Gets the given path with the correct case. - /// - /// the original path - /// the path with the recorded casing - /// - ///

- /// For case-sensitive file systems, such as Cosmos, this will fall back - /// to a case-insensitive match. - ///

- ///
- public static string PathCorrectCase(string path) - { - if (path == null || path.Length == 0) - return path; - path = path.Trim(); - if (path.Length == 0) - return ""; - string pathOrig = path; - path = path.Replace('\\', '/'); - // remove repeated slashes? - string nameLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - return nameLower; - } - if (ZStreamIn.IsConsoleStream(path)) - { - return nameLower; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - return nameLower; - } - - string root = IOUtil.PathRoot(path); - - // check for Cockpit: - if (string.Compare(path, 0, "cockpit:", 0, "cockpit:".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - path = "cockpit:" + root.Substring("cockpit:".Length).Replace('\\', '/').ToUpper() + - path.Substring(root.Length).Replace('\\', '/'); - return path; - } - - // check for MultiStream: - if (string.Compare(path, 0, "multi:", 0, "multi:".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - path = "multi:" + root.Substring("multi:".Length).Replace('\\', '/').ToUpper() + - path.Substring(root.Length).Replace('\\', '/'); - return path; - } - if (string.Compare(path, 0, "filelist:", 0, "filelist:".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - path = "multi:" + root.Substring("filelist:".Length).Replace('\\', '/').ToUpper() + - path.Substring(root.Length).Replace('\\', '/'); - return path; - } - - // check for HTTP: - if (string.Compare(path, 0, "http://", 0, "http://".Length, true) == 0 || - string.Compare(path, 0, "https://", 0, "https://".Length, true) == 0) - { - // should we trim a trailing slash in this case?? - if (root.EndsWith(":80")) - { - path = root.Substring(0, root.Length - 3).ToLower() + - path.Substring(root.Length); - } - else - { - path = root.ToLower() + - path.Substring(root.Length); - } - return path; - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(path)) - { - return SqlTextReader.GetCanonicalPath(path); - } - - StringBuilder res = new StringBuilder(path.Length); - int pos = 0; - - // cosmos and normal file system: - res.Append(root.ToLower()); - if ((root.EndsWith("\\") || root.EndsWith("/")) && - pathOrig.Length >= root.Length) - { - res[root.Length - 1] = pathOrig[root.Length - 1]; - } - pos = root.Length; - while (pos < path.Length) - { - int next = path.IndexOf('/', pos); - if (next < 0) - next = path.Length; - if (next == pos) - { - res.Append(pathOrig[pos]); - pos++; - continue; - } - string[] dirs = DirectoryEntries(pathOrig.Substring(0, pos)); - if (dirs == null || dirs.Length == 0) - { - //Console.WriteLine("No entries found: " + res.ToString()); - res.Append(pathOrig.Substring(pos)); - break; - } - string found = null; - for (int i = 0; i < dirs.Length; i++) - { - int len = dirs[i].Length; - if (dirs[i][dirs[i].Length - 1] == '/') - len--; - int dstart = dirs[i].LastIndexOfAny(pathSeparators, len - 1); - if (dstart < 0) - { - dstart = 0; - } - else - { - dstart++; - len = len - dstart; - } - if (len == next - pos && - string.Compare(path, pos, dirs[i], dstart, next - pos, true) == 0) - { - found = dirs[i].Substring(dstart, next - pos); - if (string.Compare(path, pos, dirs[i], dstart, next - pos, false) == 0) - { - break; - } - } - else - { - //Console.WriteLine(" non-match: " + dirs[i] + " : " + - // dirs[i].Substring(dstart, next - pos) + - // " != " + path.Substring(pos, next - pos)); - } - } - if (found == null) - { - //Console.WriteLine("No matching entries found: " + res.ToString() + " " + path.Substring(pos, next - pos)); - res.Append(pathOrig.Substring(pos)); - break; - } - - res.Append(found); - if (next < pathOrig.Length) - { - res.Append(pathOrig[next]); - } - pos = next + 1; - } - - if (IsFileSystemPath(res.ToString())) - { - res.Replace('/', '\\'); - } - return res.ToString(); - } - - /// - /// Get the filename, without any path or protocol information. - /// - /// the path or stream name - /// the name of the file, or null if the name does not exist, or the empty - /// string if the path is a directory - /// - /// This may fail if the path is a directory, since it operates only on the string. In - /// that case, it could return the name of the last directory, if the path does not end on a - /// directory seperator character. However, it will attempt to - /// return an empty string in the case of directories. - /// - public static string GetFileName(string path) - { - if (path == null || path.Length == 0) - return null; - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - //return null; - //return path; - return ZStreamIn.NullStreamName; - } - if (ZStreamIn.IsConsoleStream(path)) - { - //return path; - return ZStreamIn.ConsoleStreamName; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - //return null; - //return path; - return "clip:"; - } - - string pathLower = path.ToLower(); - // check for Cosmos: - if (pathLower.StartsWith("cosmos:")) - { - if (path[path.Length - 1] == '/' || path[path.Length - 1] == '\\') - { - // a directory... - return ""; - } - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "cosmos://a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for Cockpit: - if (pathLower.StartsWith("cockpit:")) - { - if (path[path.Length - 1] == '/' || path[path.Length - 1] == '\\') - { - // a directory... - return ""; - } - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "cockpit://a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for Multistream: - if (pathLower.StartsWith("multi:")) - { - if (path[path.Length - 1] == '/' || path[path.Length - 1] == '\\') - { - // a directory... - return ""; - } - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "multi:a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - if (pathLower.StartsWith("filelist:")) - { - if (path[path.Length - 1] == '/' || path[path.Length - 1] == '\\') - { - // a directory... - return ""; - } - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "filelist:a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for HTTP: - if (pathLower.StartsWith("http:") || pathLower.StartsWith("https:")) - { - if (path[path.Length - 1] == '/' || path[path.Length - 1] == '\\') - { - // a directory... - return ""; - } - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "http://a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(path)) - { - return SqlTextReader.GetFileName(path); - } - - // InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - // maybe not right? *** - // return: - // - whole path? - // - inner path of directory? - // - directory name alone? < - // only return it here if explicitly repeated?? - path = path.TrimEnd(pathSeparators); - int e = path.LastIndexOfAny(pathSeparators); - if (e < 0) - { - e = path.IndexOf(':'); - } - if (e < 0) - return null; - return path.Substring(e + 1).TrimEnd(pathSeparators); - } - - // plain file: - try - { - return Path.GetFileName(path); - } - catch - { - return null; - } - } - - /// - /// Get the filename or directory name, without any path or protocol information. - /// - /// the file or directory name - /// the name of the file or directory, or null if the name does not exist - /// - /// Unlike , this method attempts to return the name - /// for directories as well. This still operates only on the path string. - /// - public static string GetName(string path) - { - if (path == null || path.Length == 0) - return null; - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - //return null; - //return path; - return ZStreamIn.NullStreamName; - } - if (ZStreamIn.IsConsoleStream(path)) - { - //return path; - return ZStreamIn.ConsoleStreamName; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - //return null; - //return path; - return "clip:"; - } - - path = path.TrimEnd(pathSeparators); - string pathLower = path.ToLower(); - // check for Cosmos: - if (pathLower.StartsWith("cosmos:")) - { - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "cosmos://a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for Cockpit: - if (pathLower.StartsWith("cockpit:")) - { - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "cockpit://a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for Multistream: - if (pathLower.StartsWith("multi:")) - { - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "multi:a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - if (pathLower.StartsWith("filelist:")) - { - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "filelist:a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for HTTP: - if (pathLower.StartsWith("http:") || pathLower.StartsWith("https:")) - { - int lastSep = path.LastIndexOfAny(pathSeparators); - if (lastSep < "http://a".Length) - { - return ""; - } - return path.Substring(lastSep + 1); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(path)) - { - return SqlTextReader.GetName(path); - } - - // InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - // maybe not right? *** - // return: - // - whole path? - // - inner path of directory? - // - directory name alone? < - int e = path.LastIndexOfAny(pathSeparators); - if (e < 0) - { - e = path.IndexOf(':'); - } - if (e < 0) - return null; - return path.Substring(e + 1).TrimEnd(pathSeparators); - } - - // plain file: - try - { - return Path.GetFileName(path); - } - catch - { - return null; - } - } - - private static bool PathAncestor(string ancestor, string path2) - { - if (ancestor == null || ancestor.Length == 0 || path2 == null || path2.Length == 0) - { - return false; - } - ancestor = ancestor.TrimEnd(pathSeparators); - path2 = path2.TrimEnd(pathSeparators); - if (ancestor.Length > path2.Length) - return false; - ancestor = ancestor.Replace('\\', '/'); - path2 = path2.Replace('\\', '/'); - if (string.Compare(ancestor, 0, path2, 0, ancestor.Length, !ancestor.StartsWith("cosmos:")) != 0) - { - return false; - } - if (ancestor.Length == path2.Length || path2[ancestor.Length] == '/') - { - return true; - } - return false; - } - - /// - /// Determine if a path refers to a true file system path, rather than - /// a stream name. - /// - /// the path to test - /// true if path is a file system file or directory, false otherwise - /// - ///

- /// The result is based on the path string alone; it does not reflect whether the - /// given item actually exists. - ///

- ///

- /// For compressed files, a result of true merely means that the path refers - /// to a compressed file on a file system. Reading or writing the file without - /// InternalStreams will still reslt in different behavior, since the raw file will be - /// read. Similarly, a named stream will not work with standard .NET file - /// operations. - ///

- ///
- private static bool IsFileSystemPath(string path) - { - if (path == null || path.Length == 0) - return false; - if (path[path.Length - 1] == '$') - return false; - if (path[0] == '/' || path[0] == '\\') - return true; - if (path.Length == 2 && path[1] == ':') - return true; - if (path.Length > 2 && path[1] == ':' && - (path[2] == '/' || path[2] == '\\')) - return true; - - string nameLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - return false; - } - if (ZStreamIn.IsConsoleStream(path)) - { - return false; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - return false; - } - - // check for cosmos: - if (nameLower.StartsWith("cosmos:")) - { - return false; - } - - // check for Cockpit: - if (nameLower.StartsWith("cockpit:")) - { - return false; - } - - // check for Multistream: - if (nameLower.StartsWith("multi:")) - { - return false; - } - if (nameLower.StartsWith("filelist:")) - { - return false; - } - - // check for HTTP: - if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - return false; - } - - // check for SqlStream: - if (SqlTextReader.IsSqlTextReader(path)) - { - return false; - } - - // InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - return false; - } - - return true; - } - - private static readonly char[] _wildChars = new char[] { '*', '?' }; - private static readonly char[] _wildPlusChars = new char[] { '*', '?', '+' }; - - /// - /// Expand an extended wildcard pattern into a set of file paths. - /// - /// the pattern to expand - /// the set of file paths matching the pattern - /// - /// The wildcard pattern accepts the standard "*" and "?" placeholders. - /// "..." also refers to a recursive search over subdirectories. - /// "+" can also be used to make a union of several filenames or patterns. - /// In addition to filenames, HTTP URLs, nul, null, $, - /// -, and Cosmos stream names are all recognized as elements. - /// Names of files that do not exist will be excluded. - /// - public static string[] ExpandWildcards(string pattern) - { - if (pattern == null || (pattern.IndexOfAny(_wildPlusChars) < 0 && pattern.IndexOf("...") < 0)) - { - if (FileExists(pattern)) - { - return new string[] { pattern }; - } - else - { - return new string[0]; - } - } - List matchList = new List(); - bool disjoint = false; - int filePatternCount = 0; - string[] patterns; - // try to avoid bad splitting? - if (string.Compare(pattern, 0, "http:", 0, 5, true) == 0 || - string.Compare(pattern, 0, "https:", 0, 6, true) == 0) - { - patterns = new string[] { pattern }; - } - else - { - patterns = pattern.Split('+'); - } - foreach (string pat in patterns) - { - // hard-code in special types?? - if (pat.Length == 0) - continue; - string patLower = pat.ToLower(); - if (pat == "$" || pat == "-" || - patLower.StartsWith("cosmos:") || - patLower.StartsWith("cockpit:") || - patLower.StartsWith("http:") || patLower.StartsWith("https:") || - InternalStoreUtility.IsInternalStore(pat) || - SqlTextReader.IsSqlTextReader(pat) || - patLower == "nul" || patLower == "null") - { - // hack for at least some wildcards in cosmos, cockpit: - if (patLower.StartsWith("cosmos:") && - (pat.IndexOfAny(_wildChars) >= 0 || pat.IndexOf("...") >= 0)) - { - matchList.AddRange(Cosmos.DirectoryEntries(pat, true, false, false)); - } - else if (patLower.StartsWith("cockpit:") && - (pat.EndsWith("/*") || pat.EndsWith("\\*"))) - { - matchList.AddRange(DirectoryFiles(pat.Substring(0, pat.Length - 1))); - } - else if ((patLower.StartsWith("http:") || patLower.StartsWith("https:")) && - pat.IndexOf("*") > pat.LastIndexOf("/")) - { - //Is this a wildcard blob path? get all the blobs under this directory - int index = pat.LastIndexOf("/"); - string filter = pat.Substring(index + 1); - AzureStorageIO azureIO = new AzureStorageIO(); - List blobsInPath = azureIO.ListBlobsInPath(pat.Remove(index), filter); - matchList.AddRange(blobsInPath); - } - else - { - if (FileExists(pat)) - matchList.Add(pat); - } - } - else if (patLower.StartsWith("multi:") || patLower.StartsWith("filelist:")) - { - // add in multistream completions?? - if (patLower.StartsWith("multi:")) - { - patLower = patLower.Substring("multi:".Length); - } - else - { - patLower = patLower.Substring("filelist:".Length); - } - string[] mList = ExpandWildcards(patLower); - for (int i = 0; i < mList.Length; i++) - { - if (mList[i].Length == 0) - continue; - matchList.Add("multi:" + mList[i]); - } - } - else - { - filePatternCount++; - int prepatternCount = matchList.Count; - if (pat.IndexOfAny(_wildChars) >= 0 || pat.IndexOf("...") >= 0) - { - // compressed extensions are not automatically used! *** - int recursiveIndex = pat.IndexOf("..."); - if (recursiveIndex >= 0) - { - string left = pat.Substring(0, recursiveIndex); - string right = pat.Substring(recursiveIndex + 3); - right = right.TrimStart('\\', '/'); - if (right.Length == 0) - right = "*"; - string path = left; - bool pathEmpty = (path == null || path.Length == 0); - if (pathEmpty) - path = "."; - Stack dirsLeft = new Stack(); - dirsLeft.Push(path); - while (dirsLeft.Count != 0) - { - string dir = (string)dirsLeft.Pop(); - - // watch for lack of access: - try - { - // this is actually incorrect, for 3-char extensions: *** - string[] files = Directory.GetFiles(dir, right); - if (pathEmpty) - { - for (int i = 0; i < files.Length; i++) - { - if (files[i].StartsWith("./") || files[i].StartsWith(".\\")) - files[i] = files[i].Substring(2); - } - } - matchList.AddRange(files); - - string[] subs = Directory.GetDirectories(dir); - for (int s = subs.Length - 1; s >= 0; s--) - { - dirsLeft.Push(subs[s]); - } - } - catch - { - // ignore - } - } - } - else - { - try - { - string path = Path.GetDirectoryName(pat); - bool pathEmpty = !(pat.StartsWith("./") || pat.StartsWith(".\\")); - if (path == null || path.Length == 0) - path = "."; - // watch for lack of access: - try - { - string[] files = Directory.GetFiles(path, Path.GetFileName(pat)); - if (pathEmpty) - { - for (int i = 0; i < files.Length; i++) - { - if (files[i].StartsWith("./") || files[i].StartsWith(".\\")) - files[i] = files[i].Substring(2); - } - } - matchList.AddRange(files); - } - catch - { - // ignore - } - } - catch - { - // ignore bad path? - } - } - } - else - { - // what to do?? Filter to only those that exist?? *** - if (!FileExists(pat)) - continue; - matchList.Add(pat); - } - if (filePatternCount > 1 && matchList.Count != prepatternCount) - { - disjoint = true; - } - } - } - if (disjoint || true) - { - // remove duplicates, very inefficiently - but it is simple, preserves - // the order, uses no additional memory, and is case-insensitive...: - for (int i = 0; i < matchList.Count - 1; i++) - { - for (int j = i + 1; j < matchList.Count; j++) - { - bool caseInsensitive = !(string.Compare((string)matchList[i], 0, "cosmos:", 0, "cosmos:".Length, true) == 0); - { - if (string.Compare((string)matchList[i], (string)matchList[j], caseInsensitive) == 0) - { - matchList.RemoveAt(j); - j--; - } - } - } - } - } - return matchList.ToArray(); - } - - #endregion - - #region Directory Operations - - /// - /// Determine if a directory or archive exists. - /// - /// the directory to look for - /// true if the directory exists, false otherwise - /// - /// This will only detect directories on file paths, Cosmos, and - /// compressed archives. - /// - public static bool DirectoryExists(string path) - { - if (path == null || path.Length == 0) - return false; - string nameLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - // allow self-directory: - return path.IndexOfAny(pathSeparators) < 0; - } - if (ZStreamIn.IsConsoleStream(path)) - { - // allow self-directory: - return path.IndexOfAny(pathSeparators) < 0; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - return path.IndexOfAny(pathSeparators) < 0 || - string.Compare(path, "clip://", true) == 0; - } - - // check for cosmos: - if (nameLower.StartsWith("cosmos:")) - { - return Cosmos.DirectoryExists(path); - } - - // check for Cockpit: - if (nameLower.StartsWith("cockpit:")) - { - // what is right here? - string parent = PathParent(path); - if (parent == null) - { - // assume it exists?? - return true; - } - string name = GetName(path); - string[] dirs = DirectoryEntries(parent, false, true); - for (int i = 0; i < dirs.Length; i++) - { - string dir = GetName(dirs[i]).Trim(pathSeparators); - if (string.Compare(name, dir, true) == 0) - { - return true; - } - } - return false; - } - - // check for Multistream: - if (nameLower.StartsWith("multi:")) - { - return false; - } - if (nameLower.StartsWith("filelist:")) - { - return false; - } - - // check for HTTP: - if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - // what is right here? - return false; //HttpStream.Exists(path); - } - - // check for SqlStream: - if (SqlTextReader.IsSqlTextReader(path)) - { - return SqlTextReader.ExistsDatabase(path); - } - - // InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - // return true if path is the main directory of a store: - //return false; - return DirectoryExists(InternalStoreUtility.StorePath(path)); - } - - if (Directory.Exists(path)) - return true; - - if ((path.StartsWith("\\\\") || path.StartsWith("//")) && - !Directory.Exists(Path.GetPathRoot(path))) - { - return false; - } - - // check for compressed archive: - for (int i = 0; i < ZStreamIn.decompressionArchiveExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionArchiveExtensions[i]; - //for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - //{ - // string ext = ZStreamIn.decompressionExtensions[i]; - if ((nameLower.EndsWith(ext) && File.Exists(path)) || - File.Exists(path + ext)) - { - return true; - } - } - - // check for compressed archives in path: - // only one path segment is allowed to be an archive... - // normalize path: - if (path[path.Length - 1] != '\\') - path = path + "\\"; - path = path.Replace('/', '\\'); - bool isUnc = path.StartsWith("\\\\"); - while (path.IndexOf("\\\\") >= 0) - { - path = path.Replace("\\\\", "\\"); - } - if (isUnc) - path = "\\" + path; - nameLower = path.ToLower(); - - string archPath = null; - string inArch = null; - // should non-archives be considered as one-file directories?? - for (int i = 0; i < ZStreamIn.decompressionArchiveExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionArchiveExtensions[i]; - int seg = nameLower.IndexOf(ext + "\\"); - if (seg > 0) - { - archPath = path.Substring(0, seg + ext.Length); - if (File.Exists(archPath)) - { - inArch = path.Substring(seg + ext.Length); - break; - } - archPath = null; - } - } - if (archPath == null) - { -#if !QUICK_ARCHIVE_SEARCH - // add in extension to each segment... - string[] segs = path.Split('\\'); - for (int i = 0; i < segs.Length; i++) - { - if (segs[i].Length == 0) - continue; - string partial = string.Join("\\", segs, 0, i + 1); - if (partial.Length == 2 && partial[1] == ':') - continue; - if (Directory.Exists(partial)) - continue; - for (int c = 0; c < ZStreamIn.decompressionArchiveExtensions.Length; c++) - { - string ext = ZStreamIn.decompressionArchiveExtensions[c]; - if (File.Exists(partial + ext)) - { - archPath = partial + ext; - inArch = string.Join("\\", segs, i + 1, segs.Length - i - 1); - break; - } - } - // quit when parent will not exist - break; -#else - // add in extension to last segment... - string[] segs = path.TrimEnd('\\').Split('\\'); - for (int i = 0; i < segs.Length; i++) - { - if (segs[i].Length == 0) continue; - string partial = string.Join("\\", segs, 0, segs.Length - 1); - for (int c = 0; c < ZStreamIn.decompressionArchiveExtensions.Length; c++) - { - string ext = ZStreamIn.decompressionArchiveExtensions[c]; - if (File.Exists(partial + ext)) - { - archPath = partial + ext; - inArch = segs[segs.Length - 1]; - break; - } - } - if (archPath != null) break; - // quit when parent will not exist - if (!Directory.Exists(partial)) break; -#endif - } - } - if (archPath != null) - { - // check for path in archive. - inArch = inArch.Trim('\\'); - if (inArch.Length == 0) - return true; - // Must check directories... - if (Z7zDecodeStream.Exists(archPath, inArch + "/*")) - return true; - if (!Z7zDecodeStream.Exists7z && Path.GetExtension(archPath).ToLower() == ".rar") - { - if (RarDecodeStream.Exists(archPath, inArch + "/*")) - return true; - } - } - - return false; - } - - /// - /// Create a directory or archive. - /// - /// the directory or archive name to create - /// - ///

- /// Archives will be created empty. - ///

- ///

- /// When a directory already exists, this method will silently do nothing. - ///

- ///
- /// The directory cannot be created. - public static void CreateDirectory(string path) - { - if (path == null || path.Length == 0) - throw new IOException("Cannot create directory for empty path"); - string nameLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - //throw new IOException("Cannot create directory for null stream"); - return; - } - if (ZStreamIn.IsConsoleStream(path)) - { - //throw new IOException("Cannot create directory for console stream"); - return; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - //throw new IOException("Cannot create directory for clipboard"); - return; - } - - // check for cosmos: - if (nameLower.StartsWith("cosmos:")) - { - Cosmos.CreateDirectory(path); - return; - } - - // check for Cockpit: - if (nameLower.StartsWith("cockpit:")) - { - throw new IOException("Cannot create directory for Cockpit"); - } - - // check for Multistream: - if (nameLower.StartsWith("multi:") || nameLower.StartsWith("filelist:")) - { - throw new IOException("Cannot create directory for Multistream"); - } - - // check for HTTP: - if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - throw new IOException("Cannot create directory for HTTP"); - } - - // check for SqlStream: - if (SqlTextReader.IsSqlTextReader(path)) - { - throw new IOException("Cannot create directory for SQL"); - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - throw new IOException("Cannot create directory for InternalStore"); - } - - if (Directory.Exists(path)) - return; - - // check for compressed archive: - for (int i = 0; i < ZStreamOut.compressionArchiveExtensions.Length; i++) - { - string ext = ZStreamOut.compressionArchiveExtensions[i]; - if ((nameLower.EndsWith(ext))) - { - if (!File.Exists(path)) - { - try - { - //Console.WriteLine("Opening: " + path); - using (Stream s = ZStreamOut.Open(path)) - { - //Console.WriteLine("Trying to create: " + path); - s.Close(); - //Console.WriteLine("Closed: " + path); - if (s is CmdStream && ((CmdStream)s).ExitCode != 0) - { - //Console.WriteLine("ExitCode: " + ((CmdStream)s).ExitCode); - throw new IOException("Failed to create archive"); - } - //else - //{ - // Console.WriteLine("Stream type: " + s.GetType().Name); - //} - } - try - { - Delete(path + "/" + Path.GetFileNameWithoutExtension(path)); - } - catch - { - // ignore - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - throw new IOException("Failed to create archive"); - } - } - return; - } - } - - try - { - Directory.CreateDirectory(path); - } - catch - { - throw new IOException("Failed to create directory"); - } - } - - /// - /// Get the paths to files within a directory. - /// - /// the directory to look in - /// the set of paths for the files in that directory - /// - /// This will silently return the empty list if there are any problems. - /// - public static string[] DirectoryFiles(string path) - { - return DirectoryEntries(path, true, false); - } - - /// - /// Get the paths to directories within a directory. - /// - /// the directory to look in - /// the set of paths for the directories in that directory - /// - /// This will silently return the empty list if there are any problems. - /// - public static string[] DirectoryDirectories(string path) - { - return DirectoryEntries(path, false, true); - } - - /// - /// Get the paths to files and directories within a directory. - /// - /// the directory to look in - /// the set of paths for the files and directories in that directory - /// - ///

- /// Directories will be distinguished by ending with "/". - ///

- ///

- /// This will silently return the empty list if there are any problems. - ///

- ///
- public static string[] DirectoryEntries(string path) - { - return DirectoryEntries(path, true, true); - } - - private static string[] DirectoryEntries(string path, bool allowFile, bool allowDirectory) - { - //return ExpandWildcards(path + "*"); - - if (path == null || path.Length == 0) - return new string[0]; - if (!allowFile && !allowDirectory) - return new string[0]; - if (path[path.Length - 1] != '\\' && path[path.Length - 1] != '/') - { - path = path + "/"; - } - - string pathLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - //return new string[0]; - //return allowFile ? new string[] { ZStreamIn.nullStreamNames[0] } : new string[0]; - return path.IndexOfAny(pathSeparators) < 0 ? - new string[] { ZStreamIn.NullStreamName } : new string[0]; - } - if (ZStreamIn.IsConsoleStream(path)) - { - //return new string[0]; - //return allowFile ? new string[] { ZStreamIn.consoleStreamNames[0] } : new string[0]; - return path.IndexOfAny(pathSeparators) < 0 ? - new string[] { ZStreamIn.ConsoleStreamName } : new string[0]; - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - //return new string[0]; - //return allowFile ? new string[] { "clip:" } : new string[0]; - return path.IndexOfAny(pathSeparators) < 0 || - string.Compare(path.TrimEnd(pathSeparators), "clip:", true) == 0 ? - new string[] { "clip:" } : new string[0]; - } - - // check for cosmos: - if (pathLower.StartsWith("cosmos:")) - { - return Cosmos.DirectoryEntries(path, allowFile, allowDirectory, false); - } - - // check for Cockpit: - if (pathLower.StartsWith("cockpit:")) - { - StreamInfo[] entries = DirectoryEntriesInfo(path, allowFile, allowDirectory); - if (entries == null) - return null; - string[] res = new string[entries.Length]; - for (int i = 0; i < res.Length; i++) - { - res[i] = entries[i].Path; - } - return res; - } - - // check for Multistream: - if (pathLower.StartsWith("multi:") || pathLower.StartsWith("filelist:")) - { - return new string[0]; - } - - // check for HTTP: - if (pathLower.StartsWith("http://") || pathLower.StartsWith("https://")) - { - return new string[0]; - } - - // check for SqlStream: - if (SqlTextReader.IsSqlTextReader(path)) - { - return SqlTextReader.DatabaseTablePaths(path); - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - return InternalStoreUtility.DirectoryEntries(path); - } - - if (Directory.Exists(path)) - { - try - { - if (!allowDirectory) - { - return Directory.GetFiles(path); - } - else if (!allowFile) - { - string[] resDirs = Directory.GetDirectories(path); - for (int i = 0; i < resDirs.Length; i++) - { - resDirs[i] = resDirs[i] + "/"; - } - return resDirs; - } - else - { - string[] res = Directory.GetFiles(path); - string[] resDirs = Directory.GetDirectories(path); - if (resDirs.Length != 0) - { - string[] resFiles = res; - res = new string[res.Length + resDirs.Length]; - for (int i = 0; i < resDirs.Length; i++) - { - res[i] = resDirs[i] + "/"; - } - if (resFiles.Length != 0) - { - Array.Copy(resFiles, 0, res, resDirs.Length, resFiles.Length); - } - } - return res; - } - } - catch - { - return new string[0]; - } - } - - if ((path.StartsWith("\\\\") || path.StartsWith("//")) && - !Directory.Exists(Path.GetPathRoot(path))) - { - return new string[0]; - } - - // check for compressed forms: - string pathBase = pathLower.Substring(0, path.Length - 1); - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionExtensions[i]; - if (pathBase.EndsWith(ext) && File.Exists(pathBase)) - { - string[] res = Z7zDecodeStream.DirectoryEntries(pathBase, null, allowFile, allowDirectory); - if (res.Length == 0 && !Z7zDecodeStream.Exists7z && ext == ".rar") - { - res = RarDecodeStream.DirectoryEntries(pathBase, null, allowFile, allowDirectory); - } - return res; - } - else - { - string pathBaseExt = pathBase + ext; - if (File.Exists(pathBaseExt)) - { - string[] res = Z7zDecodeStream.DirectoryEntries(pathBaseExt, null, allowFile, allowDirectory); - if (res.Length == 0 && !Z7zDecodeStream.Exists7z && ext == ".rar") - { - res = RarDecodeStream.DirectoryEntries(pathBaseExt, null, allowFile, allowDirectory); - } - return res; - } - } - } - - // check for compressed archive as directory segment: - // check for compressed archives in path: - // only one path segment is allowed to be an archive... - // normalize path: - //if (fileName[fileName.Length - 1] != '\\') fileName = fileName + "\\"; - string zfileName = path.Replace('/', '\\'); - bool isUnc = zfileName.StartsWith("\\\\"); - while (zfileName.IndexOf("\\\\") >= 0) - { - zfileName = zfileName.Replace("\\\\", "\\"); - } - if (isUnc) - zfileName = "\\" + zfileName; - string znameLower = zfileName.ToLower(); - - string archPath = null; - string inArch = null; - //for (int i = 0; i < ZStreamIn.decompressionArchiveExtensions.Length; i++) - //{ - // string ext = ZStreamIn.decompressionArchiveExtensions[i]; - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionExtensions[i]; - int seg = znameLower.IndexOf(ext + "\\"); - if (seg > 0) - { - archPath = zfileName.Substring(0, seg + ext.Length); - if (File.Exists(archPath)) - { - inArch = zfileName.Substring(seg + ext.Length).Trim('/', '\\'); - break; - } - archPath = null; - } - } - if (archPath == null) - { - // add in extension to each segment... - string[] segs = zfileName.Split('\\'); - for (int i = 0; i < segs.Length; i++) - { - if (segs[i].Length == 0) - continue; - string partial = string.Join("\\", segs, 0, i + 1); - if (partial.Length == 2 && partial[1] == ':') - continue; - if (Directory.Exists(partial)) - continue; - //for (int c = 0; c < ZStreamIn.decompressionArchiveExtensions.Length; c++) - //{ - // string ext = ZStreamIn.decompressionArchiveExtensions[c]; - for (int c = 0; c < ZStreamIn.decompressionExtensions.Length; c++) - { - string ext = ZStreamIn.decompressionExtensions[c]; - if (File.Exists(partial + ext)) - { - archPath = partial + ext; - inArch = string.Join("\\", segs, i + 1, segs.Length - i - 1).Trim('/', '\\'); - break; - } - } - // quit when parent will not exist - break; - } - } - if (archPath != null) - { - //Console.WriteLine(archPath + " :: " + inArch); - // check for path in archive. - inArch = inArch.Trim('\\'); - if (inArch.Length == 0) - return new string[0]; - string[] res = Z7zDecodeStream.DirectoryEntries(archPath, inArch + "\\*", allowFile, allowDirectory); - if (res.Length == 0 && !Z7zDecodeStream.Exists7z && Path.GetExtension(archPath).ToLower() == ".rar") - { - res = RarDecodeStream.DirectoryEntries(archPath, inArch + "\\*", allowFile, allowDirectory); - } - return res; - } - - return new string[0]; - } - - /// - /// Get the objects for files within a directory. - /// - /// the directory to look in - /// the set of objects for the files in that directory - /// - /// This will silently return the empty list if there are any problems. - /// - public static StreamInfo[] DirectoryFilesInfo(string path) - { - return DirectoryEntriesInfo(path, true, false); - } - - /// - /// Get the objects for files and directories within a directory. - /// - /// the directory to look in - /// the set of objects for the files and directories in that directory - /// - ///

- /// This will silently return the empty list if there are any problems. - ///

- ///
- public static StreamInfo[] DirectoryEntriesInfo(string path) - { - return DirectoryEntriesInfo(path, true, true); - } - - private static StreamInfo[] DirectoryEntriesInfo(string path, bool allowFile, bool allowDirectory) - { - // is it worth keeping this distinct from DirectoryEntries for efficiency?? **** - - if (path == null || path.Length == 0) - return new StreamInfo[0]; - if (!allowFile && !allowDirectory) - return new StreamInfo[0]; - if (path[path.Length - 1] != '\\' && path[path.Length - 1] != '/') - { - path = path + (path.IndexOf('/') < 0 ? "\\" : "/"); - } - - string pathLower = path.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(path)) - { - return path.IndexOfAny(pathSeparators) < 0 ? - new StreamInfo[] { new StreamInfo(ZStreamIn.NullStreamName, 0, DateTime.MinValue) } : new StreamInfo[0]; - } - if (ZStreamIn.IsConsoleStream(path)) - { - return path.IndexOfAny(pathSeparators) < 0 ? - new StreamInfo[] { new StreamInfo(ZStreamIn.ConsoleStreamName, 0, DateTime.MinValue) } : new StreamInfo[0]; - } - - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(path)) - { - return path.IndexOfAny(pathSeparators) < 0 || - string.Compare(path.TrimEnd(pathSeparators), "clip:", true) == 0 ? - new StreamInfo[] { new StreamInfo("clip:", 0, DateTime.MinValue) } : new StreamInfo[0]; - } - - // check for cosmos: - if (pathLower.StartsWith("cosmos:")) - { - return Cosmos.DirectoryEntriesInfo(path, allowFile, allowDirectory, false); - } - - // check for Cockpit: - if (pathLower.StartsWith("cockpit:")) - { - return CockpitDirectoryEntriesInfo(path, allowFile, allowDirectory); - } - - // check for Multistream: - if (pathLower.StartsWith("multi:") || pathLower.StartsWith("filelist:")) - { - return new StreamInfo[0]; - } - - // check for HTTP: - if (pathLower.StartsWith("http://") || pathLower.StartsWith("https://")) - { - return new StreamInfo[0]; - } - - // check for SqlStream: - if (SqlTextReader.IsSqlTextReader(path)) - { - if (allowFile) - { - string[] files = SqlTextReader.DatabaseTablePaths(path); - StreamInfo[] res = new StreamInfo[files.Length]; - for (int i = 0; i < res.Length; i++) - { - long len = 0; - DateTime lastMod = DateTime.MinValue; - res[i] = new StreamInfo(files[i], len, lastMod); - } - return res; - } - return new StreamInfo[0]; - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(path)) - { - return InternalStoreUtility.DirectoryEntriesInfo(path); - } - - if (Directory.Exists(path)) - { - try - { - StreamInfo[] res = null; - if (allowFile) - { - string[] files = Directory.GetFiles(path); - res = new StreamInfo[files.Length]; - for (int i = 0; i < res.Length; i++) - { - long len = 0; - DateTime lastMod = DateTime.MinValue; - try - { - FileInfo f = new FileInfo(files[i]); - len = f.Length; - lastMod = f.LastWriteTime; - } - catch - { - // ignore? - } - res[i] = new StreamInfo(files[i], len, lastMod); - } - } - if (!allowDirectory) - return res; - - string[] dirs = Directory.GetDirectories(path); - if (res == null || res.Length == 0) - { - res = new StreamInfo[dirs.Length]; - } - else - { - StreamInfo[] resOld = res; - res = new StreamInfo[resOld.Length + dirs.Length]; - Array.Copy(resOld, 0, res, res.Length - resOld.Length, resOld.Length); - } - for (int i = 0; i < dirs.Length; i++) - { - long len = 0; - DateTime lastMod = DateTime.MinValue; - try - { - //DirectoryInfo f = new DirectoryInfo(dirs[i]); - //lastMod = f.LastWriteTime; - lastMod = Directory.GetLastWriteTime(dirs[i]); - } - catch - { - // ignore? - } - if (dirs[i].Length == 0) - { - dirs[i] = ".\\"; - } - else - { - if (dirs[i][dirs[i].Length - 1] != '\\' && - dirs[i][dirs[i].Length - 1] != '/') - { - dirs[i] = dirs[i] + "\\"; - } - } - res[i] = new StreamInfo(dirs[i], len, lastMod); - } - - return res; - } - catch - { - return new StreamInfo[0]; - } - } - - if ((path.StartsWith("\\\\") || path.StartsWith("//")) && - !Directory.Exists(Path.GetPathRoot(path))) - { - return new StreamInfo[0]; - } - - // check for compressed forms: - string pathBase = pathLower.Substring(0, path.Length - 1); - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionExtensions[i]; - if (pathBase.EndsWith(ext) && File.Exists(pathBase)) - { - StreamInfo[] res = Z7zDecodeStream.DirectoryEntriesInfo(pathBase, null, allowFile, allowDirectory); - if (res.Length == 0 && !Z7zDecodeStream.Exists7z && ext == ".rar") - { - res = RarDecodeStream.DirectoryEntriesInfo(pathBase, null, allowFile, allowDirectory); - } - return res; - } - else - { - string pathBaseExt = pathBase + ext; - if (File.Exists(pathBaseExt)) - { - StreamInfo[] res = Z7zDecodeStream.DirectoryEntriesInfo(pathBaseExt, null, allowFile, allowDirectory); - if (res.Length == 0 && !Z7zDecodeStream.Exists7z && ext == ".rar") - { - res = RarDecodeStream.DirectoryEntriesInfo(pathBaseExt, null, allowFile, allowDirectory); - } - return res; - } - } - } - - // check for compressed archive as directory segment: - // check for compressed archives in path: - // only one path segment is allowed to be an archive... - // normalize path: - //if (fileName[fileName.Length - 1] != '\\') fileName = fileName + "\\"; - string zfileName = path.Replace('/', '\\'); - bool isUnc = zfileName.StartsWith("\\\\"); - while (zfileName.IndexOf("\\\\") >= 0) - { - zfileName = zfileName.Replace("\\\\", "\\"); - } - if (isUnc) - zfileName = "\\" + zfileName; - string znameLower = zfileName.ToLower(); - - string archPath = null; - string inArch = null; - //for (int i = 0; i < ZStreamIn.decompressionArchiveExtensions.Length; i++) - //{ - // string ext = ZStreamIn.decompressionArchiveExtensions[i]; - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionExtensions[i]; - int seg = znameLower.IndexOf(ext + "\\"); - if (seg > 0) - { - archPath = zfileName.Substring(0, seg + ext.Length); - if (File.Exists(archPath)) - { - inArch = zfileName.Substring(seg + ext.Length).Trim('/', '\\'); - break; - } - archPath = null; - } - } - if (archPath == null) - { - // add in extension to each segment... - string[] segs = zfileName.Split('\\'); - for (int i = 0; i < segs.Length; i++) - { - if (segs[i].Length == 0) - continue; - string partial = string.Join("\\", segs, 0, i + 1); - if (partial.Length == 2 && partial[1] == ':') - continue; - if (Directory.Exists(partial)) - continue; - //for (int c = 0; c < ZStreamIn.decompressionArchiveExtensions.Length; c++) - //{ - // string ext = ZStreamIn.decompressionArchiveExtensions[c]; - for (int c = 0; c < ZStreamIn.decompressionExtensions.Length; c++) - { - string ext = ZStreamIn.decompressionExtensions[c]; - if (File.Exists(partial + ext)) - { - archPath = partial + ext; - inArch = string.Join("\\", segs, i + 1, segs.Length - i - 1).Trim('/', '\\'); - break; - } - } - // quit when parent will not exist - break; - } - } - if (archPath != null) - { - //Console.WriteLine(archPath + " :: " + inArch); - // check for path in archive. - inArch = inArch.Trim('\\'); - if (inArch.Length == 0) - return new StreamInfo[0]; - StreamInfo[] res = Z7zDecodeStream.DirectoryEntriesInfo(archPath, inArch + "\\*", allowFile, allowDirectory); - if (res.Length == 0 && !Z7zDecodeStream.Exists7z && Path.GetExtension(archPath).ToLower() == ".rar") - { - res = RarDecodeStream.DirectoryEntriesInfo(archPath, inArch + "\\*", allowFile, allowDirectory); - } - return res; - } - - return new StreamInfo[0]; - } - - private static StreamInfo[] CockpitDirectoryEntriesInfo(string path, bool allowFile, bool allowDirectory) - { - ////string pattern = searchPattern == null ? "*" : searchPattern; - //string pattern = "*"; - //pattern = "^" + System.Text.RegularExpressions.Regex.Escape(pattern) + "$"; - //pattern = pattern.Replace(@"\?", "."); - //pattern = pattern.Replace(@"\*", ".*"); - //System.Text.RegularExpressions.Regex nameRegex = new System.Text.RegularExpressions.Regex( - // pattern, - // System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.CultureInvariant); - - List res = new List(); - string htmlDir; - try - { - if (!path.EndsWith("/") && !path.EndsWith("\\")) - { - path = path + '\\'; - } - htmlDir = ReadFile(path); - } - catch - { - // throw exception? - return new StreamInfo[0]; - } - if (htmlDir == null || htmlDir.Length == 0) - return new StreamInfo[0]; - htmlDir = htmlDir.Replace("
", "
"); - - Hashtable filenames = new Hashtable(); - -#if !DISABLE_XML - System.Xml.XmlTextReader xmlReader = null; - try - { - // apparently, not IDisposable in .NET 1.1: - //using (System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(new StringReader(htmlDir))) - xmlReader = new System.Xml.XmlTextReader(new StringReader(htmlDir)); - { - string filename = null; - long length = -1; - DateTime lastModified = DateTime.MinValue; - bool isDirectory = false; - - // Parse node by node - while (xmlReader.Read()) - { - if (xmlReader.IsStartElement("tr")) - { - filename = null; - length = -1; - lastModified = DateTime.MinValue; - isDirectory = false; - } - else if (xmlReader.IsStartElement("td")) - { - xmlReader.Read(); - if (xmlReader.IsStartElement("a")) - { - // Store the anchor text value - xmlReader.Read(); - filename = xmlReader.Value; - } - else - { - try - { - string val = xmlReader.Value; - if (string.Compare(val.Trim(), " ", true) == 0) - { - isDirectory = true; - } - else - { - if (val.Length != 0) - { - if (char.IsDigit(val[0])) - { - // Attempt to convert to a long - length = Convert.ToInt64(val); - } - else - { - // Attempt to convert to a timestamp - lastModified = Convert.ToDateTime(val); - } - } - } - } - catch - { - // Skip this item - } - } - } - // When all the data has been captured, record the entry - if (filename != null) - { - if (length >= 0 && lastModified != DateTime.MinValue) - { - if (allowFile) - { - //if (nameRegex.IsMatch(filename)) - //{ - string fullname = PathCombine(path, filename); - res.Add(new StreamInfo(fullname, length, lastModified)); - //} - } - filename = null; - length = -1; - lastModified = DateTime.MinValue; - isDirectory = false; - } - else if (isDirectory) - { - if (allowDirectory) - { - string line = filename; - line = line.Replace('\t', ' '); - int oldLen = -1; - while (line.Length != oldLen) - { - oldLen = line.Length; - line = line.Replace(" ", " "); - } - line = line.Trim(); - - if (line != "Parent directory\\") - { - //if (nameRegex.IsMatch(filename)) - //{ - string fullname = PathCombine(path, filename); - if (!fullname.EndsWith("\\") && !fullname.EndsWith("/")) - { - fullname = fullname + "\\"; - } - res.Add(new StreamInfo(fullname, 0, DateTime.MinValue)); - //} - } - } - filename = null; - length = -1; - lastModified = DateTime.MinValue; - isDirectory = false; - } - } - } - } - } - catch - { - // throw exception? - return new StreamInfo[0]; - } - finally - { - try - { - if (xmlReader != null) - xmlReader.Close(); - } - catch - { - // ignore - } - } -#endif - return res.ToArray(); - } - - #endregion - - #region File Operations - - /// - /// Determine if a file exists, including in forms with compression extensions, HTTP URLs, and - /// Cosmos streams. - /// - /// the original filename - /// true if a file with a name of fileName or its compressed variations exists, false otherwise - /// - /// This is useful for detecting whether a file can be opened by - /// ZStreamIn.Open(), since it will look for compressed forms and other variations. - /// - public static bool FileExists(string fileName) - { - if (fileName == null || fileName.Length == 0) - return false; - string nameLower = fileName.ToLower(); - - // check for special names: - if (ZStreamIn.IsNullStream(fileName)) - { - return true; - } - if (ZStreamIn.IsConsoleStream(fileName)) - { - return true; - } - - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(fileName)) - { - return ClipboardReadStream.FileExists(); - } - - // check for cosmos: - if (nameLower.StartsWith("cosmos:")) - { - // no compression support, anyway... - fileName = fileName.TrimEnd('$'); - return Cosmos.FileExists(fileName); - } - - // check for Cockpit: - if (nameLower.StartsWith("cockpit:")) - { - // what is right here? - string parent = PathParent(fileName); - if (parent == null) - { - // assume it exists?? - return true; - } - string name = GetName(fileName); - string[] dirs = DirectoryEntries(parent, true, false); - for (int i = 0; i < dirs.Length; i++) - { - string dir = GetName(dirs[i]).Trim(pathSeparators); - if (string.Compare(name, dir, true) == 0) - { - return true; - } - } - return false; - } - - // check for Multistream: - if (nameLower.StartsWith("multi:")) - { - fileName = fileName.Substring("multi:".Length); - return FileExists(fileName); - } - if (nameLower.StartsWith("filelist:")) - { - fileName = fileName.Substring("filelist:".Length); - return FileExists(fileName); - } - - // check for HTTP: - if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - AzureStorageIO azureStorage = new AzureStorageIO(); - if (azureStorage.BlockBlobExistsByUri(fileName)) - { - return true; - } - return HttpStream.Exists(fileName); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(fileName)) - { - return SqlTextReader.Exists(fileName); - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(fileName)) - { - return InternalStoreUtility.Exists(fileName); - } - // remove trailing "$" - if (fileName[fileName.Length - 1] == '$') - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - if (File.Exists(fileName)) - return true; - - // check for compressed forms: - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - if (File.Exists(fileName + ZStreamIn.decompressionExtensions[i])) - { - return true; - } - } - - // check for named stream: - // should this be based on file existance, first? - int cIndex = fileName.LastIndexOf(':'); - if (cIndex > 0) - { - if (File.Exists(fileName.Substring(0, cIndex))) - { - if (cIndex > 1 || - fileName.IndexOfAny(pathSeparators, 2) < 0) - { - // named: - return (Array.IndexOf(IOUtil.GetNamedStreams(fileName.Substring(0, cIndex)), - fileName.Substring(cIndex + 1)) >= 0); - } - } - } - - // check for compressed archive as directory segment: - // check for compressed archives in path: - // only one path segment is allowed to be an archive... - // normalize path: - //if (fileName[fileName.Length - 1] != '\\') fileName = fileName + "\\"; - fileName = fileName.Replace('/', '\\'); - bool isUnc = fileName.StartsWith("\\\\"); - while (fileName.IndexOf("\\\\") >= 0) - { - fileName = fileName.Replace("\\\\", "\\"); - } - if (isUnc) - fileName = "\\" + fileName; - nameLower = fileName.ToLower(); - - string archPath = null; - string inArch = null; - // check all compressed files, not just archives... - //for (int i = 0; i < ZStreamIn.decompressionArchiveExtensions.Length; i++) - //{ - // string ext = ZStreamIn.decompressionArchiveExtensions[i]; - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionExtensions[i]; - int seg = nameLower.IndexOf(ext + "\\"); - if (seg > 0) - { - archPath = fileName.Substring(0, seg + ext.Length); - if (File.Exists(archPath)) - { - inArch = fileName.Substring(seg + ext.Length).Trim('/', '\\'); - break; - } - archPath = null; - } - } - if (archPath == null) - { - // add in extension to each segment... - string[] segs = fileName.Split('\\'); - for (int i = 0; i < segs.Length; i++) - { - if (segs[i].Length == 0) - continue; - string partial = string.Join("\\", segs, 0, i + 1); - if (partial.Length == 2 && partial[1] == ':') - continue; - if (Directory.Exists(partial)) - continue; - //for (int c = 0; c < ZStreamIn.decompressionArchiveExtensions.Length; c++) - //{ - // string ext = ZStreamIn.decompressionArchiveExtensions[c]; - for (int c = 0; c < ZStreamIn.decompressionExtensions.Length; c++) - { - string ext = ZStreamIn.decompressionExtensions[c]; - if (File.Exists(partial + ext)) - { - archPath = partial + ext; - inArch = string.Join("\\", segs, i + 1, segs.Length - i - 1).Trim('/', '\\'); - break; - } - } - // quit when parent will not exist - break; - } - } - if (archPath != null) - { - //Console.WriteLine(archPath + " :: " + inArch); - // check for path in archive. - inArch = inArch.Trim('\\'); - if (inArch.Length == 0) - return false; - if (Z7zDecodeStream.Exists(archPath, inArch)) - return true; - if (!Z7zDecodeStream.Exists7z && Path.GetExtension(archPath).ToLower() == ".rar") - { - if (RarDecodeStream.Exists(archPath, inArch)) - return true; - } - } - - return false; - } - - /// - /// Find the full path for a command, if it exists in the environment path. - /// - /// the command to look for - /// the full path, or null if it is not found - /// - ///

- /// This will always look in the current PATH directories, as well as in - /// the current directory. The current directory takes precedence. - ///

- ///

- /// The command may have an extension included; it will also be tried - /// with ".exe", ".bat", and ".cmd", in that order, in each path - /// directory. This gives similar results to the standard command line. - ///

- ///
- public static string FindInPath(string cmd) - { - return FindInPath(cmd, false); - } - /// - /// Find the full path for a command, if it exists in the environment path. - /// - /// the command to look for - /// - /// if true, also check the directory of the calling assembly. - /// - /// the full path, or null if it is not found - /// - ///

- /// This will always look in the current PATH directories, as well as in - /// the current directory. The current directory takes precedence. - ///

- ///

- /// If is true, it takes - /// precedence over any other directory. - ///

- ///

- /// The command may have an extension included; it will also be tried - /// with ".exe", ".cmd", and ".bat", in that order, in each path - /// directory. This gives similar results to the standard command line. - ///

- ///
- public static string FindInPath(string cmd, bool includeAssemblyDirectory) - { - if (cmd == null || cmd.Length == 0) - return null; - // caller's directory: - if (includeAssemblyDirectory) - { - string dir = Path.GetDirectoryName(System.Reflection.Assembly.GetCallingAssembly().Location); - string path = Path.Combine(dir, cmd); - if (File.Exists(path)) - return path; - string extPath; - extPath = path + ".exe"; - if (File.Exists(extPath)) - return extPath; - extPath = path + ".cmd"; - if (File.Exists(extPath)) - return extPath; - extPath = path + ".bat"; - if (File.Exists(extPath)) - return extPath; - } - // current directory: - { - string dir = Environment.CurrentDirectory; - string path = Path.Combine(dir, cmd); - if (File.Exists(path)) - return path; - string extPath; - extPath = path + ".exe"; - if (File.Exists(extPath)) - return extPath; - extPath = path + ".cmd"; - if (File.Exists(extPath)) - return extPath; - extPath = path + ".bat"; - if (File.Exists(extPath)) - return extPath; - } - // PATH: - { - string[] paths = Environment.GetEnvironmentVariable("PATH").Trim(';').Split(';'); - for (int i = 0; i < paths.Length; i++) - { - string dir = paths[i].Trim(); - if (dir.Length == 0) - continue; - string path = Path.Combine(dir, cmd); - if (File.Exists(path)) - return path; - string extPath; - extPath = path + ".exe"; - if (File.Exists(extPath)) - return extPath; - extPath = path + ".cmd"; - if (File.Exists(extPath)) - return extPath; - extPath = path + ".bat"; - if (File.Exists(extPath)) - return extPath; - } - } - return null; - } - - /// - /// Delete a stream or directory, if it exists. - /// - /// the stream or directory to delete - /// - ///

- /// This will silently do nothing if the file already does not exist. - ///

- ///

- /// If used on a directory, the directory must already be empty. - ///

- ///

- /// Note that this will not delete all compressed versions of the given filename, - /// without explicitly using an overload of this method. - ///

- ///
- /// fileName is null. - /// fileName is invalid. - /// An I/O error has occurred, or the file cannot be deleted. - /// The stream does not support deleting. - public static void Delete(string fileName) - { - Delete(fileName, false); - } - /// - /// Delete a file or stream, if it exists. - /// - /// the file or stream to delete - /// if true, delete all files and subdirectories if - /// fileName is a directory; otherwise, fileName must be empty if it is a directory - /// - ///

- /// This will silently do nothing if the file already does not exist. - ///

- ///

- /// When including compressed files, this respects the setting of . - ///

- ///
- /// fileName is null. - /// fileName is invalid. - /// An I/O error has occurred, or the file cannot be deleted. - /// The stream does not support deleting. - public static void Delete(string fileName, bool recursive) - { - Delete(fileName, recursive, false); - } - /// - /// Delete a file or stream, if it exists. - /// - /// the file or stream to delete - /// if true, delete all files and subdirectories if - /// fileName is a directory; otherwise, fileName must be empty if it is a directory - /// if true, also delete any compressed versions of the - /// given name; otherwise, only delete the given name - /// - ///

- /// This will silently do nothing if the file already does not exist. - ///

- ///

- /// When including compressed files, this respects the setting of . - ///

- ///
- /// fileName is null. - /// fileName is invalid. - /// An I/O error has occurred, or the file cannot be deleted. - /// The stream does not support deleting. - public static void Delete(string fileName, bool recursive, bool includeCompressedVersions) - { - Contracts.CheckNonEmpty(fileName, nameof(fileName)); - - // check for special names: - string fileNameLower = fileName.ToLower(); - if (ZStreamIn.IsNullStream(fileName)) - { - // just succeed... - return; - } - if (ZStreamIn.IsConsoleStream(fileName)) - { - throw new NotSupportedException("Console streams cannot be deleted."); - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(fileName)) - { - throw new NotSupportedException("Clipboard streams cannot be deleted."); - } - - // check for Cosmos: - if (fileNameLower.StartsWith("cosmos:")) - { - Cosmos.Delete(fileName, recursive); - // don't look for compressed versions? - return; - } - - // check for Cockpit: - if (fileNameLower.StartsWith("cockpit:")) - { - throw new NotSupportedException("Cockpit streams cannot be deleted."); - } - - // check for Multistream: - if (fileNameLower.StartsWith("multi:")) - { - fileName = fileName.Substring("multi:".Length); - Delete(fileName); - } - if (fileNameLower.StartsWith("filelist:")) - { - fileName = fileName.Substring("filelist:".Length); - Delete(fileName); - } - - //REVIEW: We can actually delete a blob, however, it is blocked by this code - // check for HTTP: - if (fileNameLower.StartsWith("http:") || fileNameLower.StartsWith("https:")) - { - throw new NotSupportedException("HTTP streams or blobs cannot be deleted."); - } - - // check for SQL: - if (SqlTextReader.IsSqlTextReader(fileName)) - { - throw new NotSupportedException("Cannot delete a SQL table."); - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(fileName)) - { - throw new NotSupportedException("Cannot delete a InternalStore."); - } - - // remove trailing "$" - if (fileName[fileName.Length - 1] == '$') - { - fileName = fileName.Substring(0, fileName.Length - 1); - } - - // check for named stream: - // should this be based on file existance, first? - int cIndex = fileName.LastIndexOf(':'); - if (cIndex > 0) - { - if (File.Exists(fileName.Substring(0, cIndex))) - { - if (cIndex > 1 || - fileName.IndexOfAny(pathSeparators, 2) < 0) - { - // named: - NamedStream.Delete(fileName); - return; - } - } - } - - bool deleted = false; - // plain file?: - // (handle the mess of exceptions that are normally generated) - try - { - if (Directory.Exists(fileName)) - { - Directory.Delete(fileName, recursive); - deleted = true; - } - else if (File.Exists(fileName)) - { - File.Delete(fileName); - deleted = true; - } - } - catch (UnauthorizedAccessException ex) - { - throw new IOException("Cannot delete: " + fileName, ex); - } - catch (PathTooLongException ex) - { - throw new ArgumentException("Path is too long: " + fileName, "fileName", ex); - } - catch (DirectoryNotFoundException ex) - { - throw new IOException("Directory does not exist: " + fileName, ex); - } - catch (NotSupportedException ex) - { - throw new IOException("Cannot delete: " + fileName, ex); - } - - if (!deleted) - { - // check for compressed archive as directory segment: - // only one path segment is allowed to be an archive... - // normalize path: - //if (fileName[fileName.Length - 1] != '\\') fileName = fileName + "\\"; - string zfileName = fileName.Replace('/', '\\'); - bool isUnc = zfileName.StartsWith("\\\\"); - while (zfileName.IndexOf("\\\\") >= 0) - { - zfileName = zfileName.Replace("\\\\", "\\"); - } - if (isUnc) - zfileName = "\\" + zfileName; - string zfileNameLower = zfileName.ToLower(); - - string archPath = null; - string inArch = null; - // should this be archives only? - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - string ext = ZStreamIn.decompressionExtensions[i]; - int seg = zfileNameLower.IndexOf(ext + "\\"); - if (seg > 0) - { - archPath = zfileName.Substring(0, seg + ext.Length); - if (File.Exists(archPath)) - { - inArch = zfileName.Substring(seg + ext.Length).Trim('\\'); - break; - } - archPath = null; - } - } - if (archPath == null) - { - // add in extension to each segment... - string[] segs = zfileName.Split('\\'); - for (int i = 0; i < segs.Length; i++) - { - if (segs[i].Length == 0) - continue; - string partial = string.Join("\\", segs, 0, i + 1); - if (partial.Length == 2 && partial[1] == ':') - continue; - if (Directory.Exists(partial)) - continue; - // should this be archives only? - for (int c = 0; c < ZStreamIn.decompressionExtensions.Length; c++) - { - string ext = ZStreamIn.decompressionExtensions[c]; - if (File.Exists(partial + ext)) - { - archPath = partial + ext; - inArch = string.Join("\\", segs, i + 1, segs.Length - i - 1).Trim('/', '\\'); - break; - } - } - // quit when parent will not exist - break; - } - } - if (archPath != null) - { - // found compressed archive for path segment - // check for path in archive. - inArch = inArch.Trim('\\'); - if (inArch.Length != 0) - { - // slow: - if (Z7zDecodeStream.Exists(archPath, inArch)) - { - // allow exception to throw if it occurs: - if (recursive) - { - Z7zEncodeStream.Delete(archPath, inArch); - } - else - { - if (Z7zDecodeStream.Exists(archPath, inArch + "\\*")) - { - throw new IOException("Cannot delete non-empty directory in archive when not recursive: " + - fileName); - } - Z7zEncodeStream.Delete(archPath, inArch); - } - } - // skip compressed versions operation! - return; - } - } - } - - // check for compressed versions, if needed: - if (includeCompressedVersions) - { - if (ZStreamIn.FallbackExtension != null) - { - if (ZStreamIn.FallbackExtension.Length != 0) - { - if (File.Exists(fileName + ZStreamIn.FallbackExtension)) - { - Delete(fileName + ZStreamIn.FallbackExtension, false); - } - } - else - { - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - if (File.Exists(fileName + ZStreamIn.decompressionExtensions[i])) - { - Delete(fileName + ZStreamIn.decompressionExtensions[i], false); - } - } - } - } - } - } - - /// - /// Get the length of the stream in bytes, or -1 if it cannot be obtained. - /// - /// the path or stream name - /// the length of the stream in bytes, or -1 if it cannot be obtained - public static long GetLength(string path) - { - // this could be more efficient! *** - // force buffered? - try - { - using (Stream str = ZStreamIn.OpenBuffered(path)) - { - return str.Length; - } - } - catch - { - return -1; - } - } - - /// - /// Set the length of a file, truncating or padding as needed. - /// - /// the file to alter - /// the desired length, in bytes - /// - /// Note that this only operates on normal files, and cannot be successfully used on compressed - /// files or special streams. - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// An I/O error has occurred. - /// The stream does not support both writing and seeking. - /// Attempted to set the value parameter to less than 0. - public static void ResizeFile(string fileName, long length) - { - using (FileStream pad = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) - { - pad.SetLength(length); - } - } - - /// - /// Get the named streams present in the given file. - /// - /// the file to inspect - /// the list of named streams available for the file, excluding the default stream - /// - ///

- /// Named streams only exist on NTFS file systems, generally, and might not be - /// preserved as files are moved around in various forms. Most applications can - /// only access the default stream, but command-line redirection will write and read - /// from named streams when specified. Named streams are specified with the syntax - /// "filename:streamname". This syntax will also work when opening files with - /// , , - /// , and . - ///

- ///

- /// Note that this will not automatically fallback to compressed variations of - /// the given filename. - ///

- ///
- public static string[] GetNamedStreams(string fileName) - { - return NamedStream.GetNamedStreams(fileName); - } - - #endregion - - #region Reading and Writing - - /// - /// Copy one file or directory to another location. - /// - /// the file or stream to copy (potentially with a wildcard pattern) - /// the destination, either as a directory or a file - /// - ///

- /// It is best to put a trailing slash on directories in order to ensure that they are not - /// treated as files. - ///

- ///

- /// If a wildcard pattern is used, the files will all be copied into the destination. A - /// will be thrown if no files match. - /// If there are multiple matches, the destination should be a directory or a continuous stream - /// (such as the console or the null stream), since the effect will be as if each copy overwrote - /// the last one, otherwise. - ///

- ///
- /// source or destination is null. - /// source or destination is invalid. - /// source cannot be found. - /// An I/O error has occurred. - /// The destination does not support writing. - public static void Copy(string source, string destination) - { - Copy(source, destination, false); - } - - /// - /// Copy one file or directory to another location, as lines of text, with any implicit conversion. - /// - /// the file or stream to copy (potentially with a wildcard pattern) - /// the destination, either as a directory or a file - /// - ///

- /// It is best to put a trailing slash on directories in order to ensure that they are not - /// treated as files. - ///

- ///

- /// If a wildcard pattern is used, the files will all be copied into the destination. A - /// will be thrown if no files match. - /// If there are multiple matches, the destination should be a directory or a continuous stream - /// (such as the console or the null stream), since the effect will be as if each copy overwrote - /// the last one, otherwise. - ///

- ///
- /// source or destination is null. - /// source or destination is invalid. - /// source cannot be found. - /// An I/O error has occurred. - /// The destination does not support writing. - public static void CopyLines(string source, string destination) - { - Copy(source, destination, true); - } - - private static void Copy(string source, string destination, bool translateText) - { - Contracts.CheckNonEmpty(source, nameof(source)); - Contracts.CheckNonEmpty(destination, nameof(destination)); - - string[] files = ExpandWildcards(source); - if (files.Length == 0) - throw new FileNotFoundException("No files match the pattern: " + source); - - // this should be better encapsulated... - - if (files.Length > 1) - { - for (int i = 0; i < files.Length; i++) - { - Copy(files[i], destination); - } - return; - } - source = files[0]; - - string fullDestination = null; - - if (FileExists(destination)) - { - fullDestination = destination; - } - else if (DirectoryExists(destination)) - { - fullDestination = destination.TrimEnd(pathSeparators) + "/" + GetFileName(source.TrimEnd(pathSeparators)); - } - else if (DirectoryExists(Path.GetDirectoryName(destination))) - { - // is that correct??? - fullDestination = destination; - } - else - { - // check for special names: - string nameLower = destination.ToLower(); - - if (ZStreamIn.IsNullStream(destination)) - { - fullDestination = destination; - } - else if (ZStreamIn.IsConsoleStream(destination)) - { - fullDestination = destination; - } - else if (ClipboardReadStream.IsClipboardStream(destination)) - { - // clipboard - fullDestination = destination; - } - else if (nameLower.StartsWith("cosmos:")) - { - // cosmos - if (destination[destination.Length - 1] == '/' || destination[destination.Length - 1] == '\\') - { - fullDestination = destination + GetFileName(source.TrimEnd(pathSeparators)); - } - else - { - fullDestination = destination; - } - } - else if (nameLower.StartsWith("cockpit:")) - { - // Cockpit - throw new NotSupportedException("Cockpit streams cannot be written to."); - } - else if (nameLower.StartsWith("http://") || nameLower.StartsWith("https://")) - { - // HTTP - throw new NotSupportedException("HTTP streams cannot be written to."); - } - else if (InternalStoreUtility.IsInternalStore(nameLower)) - { - // InternalStore: - throw new NotSupportedException("Cannot copy to a InternalStore."); - } - else if (SqlTextReader.IsSqlTextReader(nameLower)) - { - // SQL: - //throw new NotSupportedException("Cannot copy to a SQL table."); - fullDestination = destination; - } - else - { - // default? - fullDestination = destination; - } - } - // what about Multistream? *** - - // this could be optimized, of course... - // should we special-case normal file copy to File.Copy()? *** - if (PathsEqual(source, fullDestination)) - return; - if (source[source.Length - 1] == '/' || source[source.Length - 1] == '\\' || DirectoryExists(source)) - { - // recursive copy? - // not for compressed files... - bool copyCompressed = false; - try - { - if (File.Exists(source.TrimEnd(pathSeparators))) - { - source = source.TrimEnd(pathSeparators) + "$"; - fullDestination = fullDestination.TrimEnd(pathSeparators) + "$"; - copyCompressed = true; - } - } - catch - { - // ignore - } - if (!copyCompressed) - { - // we should really try and avoid infinite loops... - if (PathAncestor(source, fullDestination)) - { - throw new ArgumentException("Cannot copy to a subdirectory of the source", "destination"); - } - CreateDirectory(fullDestination.TrimEnd(pathSeparators)); - foreach (string entry in DirectoryEntries(source)) - { - Copy(entry, fullDestination + "/"); - } - return; - } - } - - if (translateText) - { - // this could be optimized, of course... - using (StreamReader reader = ZStreamReader.Open(source)) - { - using (StreamWriter writer = ZStreamWriter.Open(fullDestination)) - { - // preallocate: - try - { - long length = reader.BaseStream.Length; - if (length > 0) - { - if (writer.BaseStream is LowFragmentationStream) - { - ((LowFragmentationStream)writer.BaseStream).Reserve(length); - } - } - } - catch - { - } - - for (string line = reader.ReadLine(); line != null; line = reader.ReadLine()) - { - writer.WriteLine(line); - } - } - } - } - else - { - using (Stream fileIn = ZStreamIn.Open(source)) - { - using (Stream fileOut = ZStreamOut.Open(fullDestination)) - { - // preallocate: - // bad for compression... we really should give the length there - try - { - long length = fileIn.Length; - if (length > 0) - { - if (fileOut is FileStream || fileOut is LowFragmentationStream) - { - fileOut.SetLength(length); - } - } - } - catch - { - } - - byte[] buffer = new byte[256 * 1024]; - for (int count = fileIn.Read(buffer, 0, buffer.Length); count > 0; count = fileIn.Read(buffer, 0, buffer.Length)) - { - fileOut.Write(buffer, 0, count); - } - } - } - } - } - - /// - /// Copy one Stream to another. - /// - /// the Stream to copy - /// the destination Stream - /// - /// The source and destination are both left open. - /// - /// source or destination is null. - /// An I/O error has occurred. - public static void Copy(Stream source, Stream destination) - { - if (source == null) - throw new ArgumentException("source cannot be null", "source"); - if (destination == null) - throw new ArgumentException("destination cannot be null", "destination"); - try - { - if (source is UnbufferedStream) - { - UnbufferedStream us = (UnbufferedStream)source; - //unsafe - //{ - // byte* buffer; - // for (int c = us.Read(out buffer); c > 0; c = us.Read(out buffer)) - // { - // destination.Write(...); - // } - //} - byte[] buffer; - for (int c = us.Read(out buffer); c > 0; c = us.Read(out buffer)) - { - destination.Write(buffer, 0, c); - } - } - else - { - //Console.Error.WriteLine("writing... " + source.GetType().Name + " -> " + destination.GetType().Name); - byte[] buffer = new byte[64 * 1024]; - for (int c = source.Read(buffer, 0, buffer.Length); c > 0; c = source.Read(buffer, 0, buffer.Length)) - { - //Console.Error.WriteLine("writing " + c + "..."); - destination.Write(buffer, 0, c); - } - } - } - catch (Exception ex) - { - throw new IOException("Could not copy source to destination", ex); - } - } - - /// - /// Copy a TextReader to a TextWriter, as lines of text, with any implicit conversion. - /// - /// the TextReader to copy - /// the destination TextWriter - /// - /// The source and destination are both left open. - /// - /// source or destination is null. - /// An I/O error has occurred. - public static void CopyLines(TextReader source, TextWriter destination) - { - if (source == null) - throw new ArgumentException("source cannot be null", "source"); - if (destination == null) - throw new ArgumentException("destination cannot be null", "destination"); - try - { - for (string line = source.ReadLine(); line != null; line = source.ReadLine()) - { - destination.WriteLine(line); - } - } - catch (Exception ex) - { - throw new IOException("Could not copy source to destination", ex); - } - } - - /// - /// Create a stream that is the concatenation of a set of streams. - /// - /// the name of the stream to create - /// the names of the streams to concatenate - /// - ///

- /// This will overwrite the destination. - ///

- ///

- /// For Cosmos files, this maps to a . - ///

- ///

- /// Wildcard patterns are allowed. - ///

- ///
- /// The join could not be completed. - /// The destination or some sources are not valid stream names. - public static void Concatenate(string destination, params string[] sources) - { - if (destination == null || destination.Length == 0) - throw new ArgumentException("destination cannot be empty", "destination"); - if (sources == null) - sources = new string[0]; - bool allCosmos = (string.Compare(destination, 0, "cosmos://", 0, "cosmos://".Length, true) == 0); - if (allCosmos) - { - for (int i = 0; i < sources.Length; i++) - { - if (sources[i] == null || string.Compare(sources[i], 0, "cosmos://", 0, "cosmos://".Length, true) != 0) - { - allCosmos = false; - break; - } - } - } - if (allCosmos) - { - Cosmos.Concatenate(destination, sources); - return; - } - List expanded = null; - for (int i = 0; i < sources.Length; i++) - { - if (sources[i] == null || sources[i].Length == 0) - throw new ArgumentException("sources[" + i + "] cannot be empty", "sources"); - if (sources[i].IndexOf('*') >= 0 || sources[i].IndexOf('?') >= 0 || - sources[i].IndexOf("...") >= 0) - { - if (expanded == null) - { - expanded = new List(); - for (int j = 0; j < i; j++) - { - expanded.Add(sources[j]); - } - } - expanded.AddRange(IOUtil.ExpandWildcards(sources[i])); - } - else - { - if (expanded != null) - expanded.Add(sources[i]); - } - } - if (expanded != null) - { - sources = expanded.ToArray(); - } - - try - { - using (StreamWriter sw = ZStreamWriter.Open(destination)) - { - for (int i = 0; i < sources.Length; i++) - { - using (StreamReader sr = ZStreamReader.Open(sources[i])) - { - CopyLines(sr, sw); - } - } - } - } - catch (Exception ex) - { - throw new IOException("Could not concatenate all sources", ex); - } - } - - /// - /// Consume all bytes from a stream, in the background. - /// - /// the stream to consume - /// the thread that is consuming the data (which can be ignored) - /// - ///

- /// This method ignores all errors. It is useful for tasks such as ignoring - /// StandardError from a process. - ///

- ///

- /// The stream will be closed when the end is reached. - ///

- ///
- public static Thread ConsumeBackground(Stream stream) - { - if (stream == null || !stream.CanRead) - return null; - //ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReadAll), stream); - ParameterizedThreadStart consumeStart = new ParameterizedThreadStart(ReadAll); - Thread consume = Utils.CreateBackgroundThread(consumeStart); - consume.Start(stream); - return consume; - } - - /// - /// Consume all lines from a stream, in the background. - /// - /// the TextReader to consume - /// the thread that is consuming the data (which can be ignored) - /// - ///

- /// This method ignores all errors. It is useful for tasks such as ignoring - /// StandardError from a process. - ///

- ///

- /// The stream will be closed when the end is reached. - ///

- ///
- public static Thread ConsumeBackground(TextReader reader) - { - if (reader == null) - return null; - //ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReadAllLines), reader); - ParameterizedThreadStart consumeStart = new ParameterizedThreadStart(ReadAllLines); - Thread consume = Utils.CreateBackgroundThread(consumeStart); - consume.Start(reader); - return consume; - } - - private static void ReadAll(object streamObj) - { - Stream stream = (Stream)streamObj; - try - { - byte[] buffer = new byte[1024]; - while (stream.Read(buffer, 0, buffer.Length) > 0) - { - } - } - catch - { - } - finally - { - try - { - stream.Close(); - } - catch - { - } - } - } - - private static void ReadAllLines(object readerObj) - { - TextReader reader = (TextReader)readerObj; - try - { - //while (reader.ReadLine() != null) - //{ - //} - char[] buffer = new char[512]; - int c; - while ((c = reader.Read(buffer, 0, buffer.Length)) > 0) - { - //Console.Error.Write(buffer, 0, c); - } - } - catch - { - } - finally - { - try - { - reader.Close(); - } - catch - { - } - } - } - - #region Line Enumeration - -#if OLD_LINES - /// - /// Get an enumerator for the lines in the file or stream fileName - /// - /// the file to read (or URL, or Cosmos stream...) - /// an IEnumerable that generates an IEnumerator for the lines in fileName - /// - /// The reading is performed through . - /// - /// This allows the lines in a stream to be read as: - /// - /// foreach (string line in IOUtil.Lines("file.txt")) - /// { - /// ... - /// } - /// - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static IEnumerable Lines(string fileName) - { - return Lines(fileName, false); - } - /// - /// Get an enumerator for the lines in the file or stream fileName - /// - /// the file to read (or URL, or Cosmos stream...) - /// if true, skip blank lines; if false, read all lines - /// an IEnumerable that generates an IEnumerator for the lines in fileName - /// - /// The reading is performed through . - /// - /// This allows the lines in a stream to be read as: - /// - /// foreach (string line in IOUtil.Lines("file.txt")) - /// { - /// ... - /// } - /// - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static IEnumerable Lines(string fileName, bool skipBlank) - { - return new LineEnumerable(fileName, skipBlank); - } - - private class LineEnumerable : IEnumerable - { - private string fileName; - private bool skipBlank; - - public LineEnumerable(string fileName, bool skipBlank) - { - this.fileName = fileName; - this.skipBlank = skipBlank; - } - - public IEnumerator GetEnumerator() - { - return new LineEnumerator(fileName, skipBlank); - } - } - - /// - /// Enumerator to read through the lines in a StreamReader. - /// - private class LineEnumerator : IEnumerator, IDisposable - { - private string fileName; - private StreamReader reader; - private string line = null; - private bool skipBlank = false; - - /// - /// Create a new enumerator to read through the lines. - /// - /// the file to read lines from - public LineEnumerator(string fileName) - : this(fileName, false) - { - } - /// - /// Create a new enumerator to read through the lines. - /// - /// the file to read lines from - /// if true, skip blank lines; if false, read all lines - public LineEnumerator(string fileName, bool skipBlank) - { - this.fileName = fileName; - this.skipBlank = skipBlank; - this.reader = ZStreamReader.Open(fileName); - } - ~LineEnumerator() - { - Dispose(); - } - /// - /// Return the enumerator to the initial state. - /// - public void Reset() - { - //// can we do this? What about the BOM? - //reader.DiscardBufferedData(); - //reader.BaseStream.Seek(0, SeekOrigin.Begin); - //// should there be an IResetable? - try - { - reader.Close(); - } - catch - { - } - reader = ZStreamReader.Open(fileName); - line = null; - } - /// - /// Get the current line of the file. - /// - public string Current - { - get - { - return line; - } - } - - /// - /// Get the current line of the file. - /// - object IEnumerator.Current - { - get - { - return ((LineEnumerator)this).Current; - } - } - - /// - /// Move the enumerator to the next line. - /// - /// true if the next line exists, or false if at the end of the file - public bool MoveNext() - { - do - { - line = reader.ReadLine(); - } - while (skipBlank && (line != null && line.TrimEnd().Length == 0)); - - return line != null; - } - #region IDisposable Members - - public void Dispose() - { - try - { - reader.Close(); - } - catch - { - } - GC.SuppressFinalize(this); - } - - #endregion - } -#else - /// - /// Get an enumerator for the lines in the file or stream fileName - /// - /// the file to read (or URL, or Cosmos stream...) - /// an IEnumerable that generates an IEnumerator for the lines in fileName - /// - /// The reading is performed through . - /// - /// This allows the lines in a stream to be read as: - /// - /// foreach (string line in IOUtil.Lines("file.txt")) - /// { - /// ... - /// } - /// - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static IEnumerable Lines(string fileName) - { - return Lines(fileName, false); - } - /// - /// Get an enumerator for the lines in the file or stream fileName - /// - /// the file to read (or URL, or Cosmos stream...) - /// if true, skip blank lines; if false, read all lines - /// an IEnumerable that generates an IEnumerator for the lines in fileName - /// - /// The reading is performed through . - /// - /// This allows the lines in a stream to be read as: - /// - /// foreach (string line in IOUtil.Lines("file.txt")) - /// { - /// ... - /// } - /// - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static IEnumerable Lines(string fileName, bool skipBlank) - { - using (StreamReader reader = ZStreamReader.Open(fileName)) - { - for (string line = reader.ReadLine(); line != null; line = reader.ReadLine()) - { - if (skipBlank) - { - bool foundNonSpace = false; - foreach (char c in line) - { - if (c != ' ' && c != '\t' && c != '\r' && c != '\n' && c != '\v') - { - foundNonSpace = true; - break; - } - } - if (!foundNonSpace) - continue; - } - yield return line; - } - } - } -#endif - - #endregion - - /// - /// Read the file or stream specified by fileName. - /// - /// the file to read (or URL, or Cosmos stream...) - /// the text of fileName, or null if it cannot be read - /// - /// The reading is performed through . - /// - ///// fileName is null. - ///// fileName is invalid. - ///// fileName cannot be found. - ///// The utilities needed to open a stream are not available. - public static string ReadFile(string fileName) - { - try - { - using (StreamReader sr = ZStreamReader.Open(fileName)) - { - return sr.ReadToEnd(); - } - } - catch - { - return null; - } - } - /// - /// Read the file or stream specified by fileName. - /// - /// the file to read (or URL, or Cosmos stream...) - /// the encoding to use for reading the text - /// the text of fileName, or null if it cannot be read - /// - /// The reading is performed through . - /// - ///// fileName is null. - ///// fileName is invalid. - ///// fileName cannot be found. - ///// The utilities needed to open a stream are not available. - public static string ReadFile(string fileName, System.Text.Encoding encoding) - { - try - { - using (StreamReader sr = ZStreamReader.Open(fileName, encoding)) - { - return sr.ReadToEnd(); - } - } - catch - { - return null; - } - } - - /// - /// Write text to the file specified by fileName. - /// - /// the text to write - /// the file to write - /// - /// The writing is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open a stream are not available. - /// An error occurs while writing. - public static void WriteFile(string text, string fileName) - { - using (StreamWriter sr = ZStreamWriter.Open(fileName)) - { - if (text != null) - { - sr.Write(text); - } - } - } - /// - /// Write text to the file specified by fileName. - /// - /// the text to write - /// the file to write - /// if true, append to the file; otherwise, create or overwrite - /// - /// The writing is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. - /// An error occurs while writing. - public static void WriteFile(string text, string fileName, bool append) - { - using (StreamWriter sr = ZStreamWriter.Open(fileName, append)) - { - if (text != null) - { - sr.Write(text); - } - } - } - - /// - /// Read the file or stream specified by fileName, as a byte array. - /// - /// the file to read (or URL, or Cosmos stream...) - /// the bytes of fileName, or null if it cannot be read - /// - /// The reading is performed through . - /// - public static byte[] ReadBytes(string fileName) - { - try - { - long len = GetLength(fileName); - if (len >= 0) - { - byte[] res = new byte[len]; - using (Stream sr = ZStreamIn.Open(fileName)) - { - sr.Read(res, 0, res.Length); - return res; - } - } - else - { - // might just be forward-only... - // need double the memory, then... - List buffers = new List(); - long totalLength = 0; - using (Stream sr = ZStreamIn.Open(fileName)) - { - byte[] buf = new byte[256 * 1024]; - int count; - while ((count = sr.Read(buf, 0, buf.Length)) > 0) - { - buffers.Add(buf); - totalLength += count; - if (count < buf.Length) - break; - buf = new byte[256 * 1024]; - } - byte[] res = new byte[totalLength]; - int cur = 0; - for (int i = 0; i < buffers.Count - 1; i++) - { - Buffer.BlockCopy((byte[])buffers[i], 0, res, cur, buf.Length); - cur += buf.Length; - buffers[i] = null; - } - if (buffers.Count != 0) - { - Buffer.BlockCopy((byte[])buffers[buffers.Count - 1], 0, res, cur, count); - } - - return res; - } - } - } - catch - { - return null; - } - } - - /// - /// Write bytes to the file specified by fileName. - /// - /// the bytes to write - /// the file to write - /// - /// This is an alias for . - /// - /// - /// - /// The writing is performed through . - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - /// An error occurs while writing. - public static void WriteFile(byte[] data, string fileName) - { - WriteBytes(data, fileName); - } - /// - /// Write bytes to the file specified by fileName. - /// - /// the bytes to write - /// the file to write - /// if true, append to the file; otherwise, create or overwrite - /// - /// - /// This is an alias for . - /// - /// - /// The writing is performed through . - /// - /// - /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. - /// An error occurs while writing. - public static void WriteFile(byte[] data, string fileName, bool append) - { - WriteBytes(data, fileName, append); - } - /// - /// Write bytes to the file specified by fileName. - /// - /// the bytes to write - /// the file to write - /// - /// The writing is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - /// An error occurs while writing. - public static void WriteBytes(byte[] data, string fileName) - { - using (Stream sr = ZStreamOut.Open(fileName)) - { - if (data != null) - { - sr.Write(data, 0, data.Length); - } - } - } - /// - /// Write bytes to the file specified by fileName. - /// - /// the bytes to write - /// the file to write - /// if true, append to the file; otherwise, create or overwrite - /// - /// The writing is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. - /// An error occurs while writing. - public static void WriteBytes(byte[] data, string fileName, bool append) - { - using (Stream sr = ZStreamOut.Open(fileName, append)) - { - if (data != null) - { - sr.Write(data, 0, data.Length); - } - } - } - - /// - /// Read the lines of the file or stream specified by fileName. - /// - /// the file to read (or URL, or Cosmos stream...) - /// the lines of fileName, or null if it cannot be read - /// - /// The reading is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static string[] ReadLines(string fileName) - { - try - { - using (StreamReader sr = ZStreamReader.Open(fileName)) - { - return ReadLines(sr); - } - } - catch - { - return null; - } - } - /// - /// Read the lines of the file or stream specified by fileName. - /// - /// the file to read (or URL, or Cosmos stream...) - /// the encoding to use for reading the text - /// the lines of fileName, or null if it cannot be read - /// - /// The reading is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static string[] ReadLines(string fileName, System.Text.Encoding encoding) - { - try - { - using (StreamReader sr = ZStreamReader.Open(fileName, encoding)) - { - return ReadLines(sr); - } - } - catch - { - return null; - } - } - /// - /// Read the lines of the StreamReader specified. - /// - /// the TextReader to read - /// the lines of input, or null if it cannot be read - public static string[] ReadLines(TextReader input) - { - try - { - List lines = new List(); - for (string line = input.ReadLine(); line != null; line = input.ReadLine()) - { - lines.Add(line); - } - if (lines.Count > 0 && ((string)lines[lines.Count - 1]).Length == 0) - lines.RemoveAt(lines.Count - 1); - return lines.ToArray(); - } - catch - { - return null; - } - } - - /// - /// Write the lines to the file or stream specified by fileName. - /// - /// the lines to write - /// the file to write - /// - /// - /// This is an alias for . - /// - /// - /// The writing is performed through . - /// - /// - /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open the stream are not available. - /// An error occurs while writing. - public static void WriteFile(string[] lines, string fileName) - { - WriteLines(lines, fileName); - } - /// - /// Write the lines to the file or stream specified by fileName. - /// - /// the lines to write - /// the file to write - /// if true, append to the stream; otherwise, overwrite - /// - /// - /// This is an alias for . - /// - /// - /// The writing is performed through . - /// - /// - /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open the stream are not available. - /// An error occurs while writing. - public static void WriteFile(string[] lines, string fileName, bool append) - { - WriteLines(lines, fileName, append); - } - /// - /// Write the lines to the file or stream specified by fileName. - /// - /// the lines to write - /// the file to write - /// - /// The writing is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open the stream are not available. - /// An error occurs while writing. - public static void WriteLines(string[] lines, string fileName) - { - WriteLines(lines, fileName, false); - } - /// - /// Write the lines to the file or stream specified by fileName. - /// - /// the lines to write - /// the file to write - /// if true, append to the stream; otherwise, overwrite - /// - /// The writing is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open the stream are not available. - /// An error occurs while writing. - public static void WriteLines(string[] lines, string fileName, bool append) - { - using (StreamWriter sw = ZStreamWriter.Open(fileName, append)) - { - WriteLines(lines, sw); - } - } - /// - /// Write the lines to the specified TextWriter. - /// - /// the lines to write - /// the TextWriter to write to - /// - ///

- /// The writing is performed through . - ///

- ///

- /// The output will not be closed. - ///

- ///
- /// An error occurs while writing. - public static void WriteLines(string[] lines, TextWriter output) - { - if (lines == null) - lines = new string[0]; - try - { - for (int i = 0; i < lines.Length; i++) - { - output.Write(lines[i]); - } - } - catch (Exception ex) - { - throw new IOException("Cannot write lines to output", ex); - } - } - - /// - /// Read a file compiled as Embedded Content in the calling assembly. - /// - /// The name of the file to read, without any namespace - /// The contents of the file, or null if it does not exist - public static string ReadResource(string name) - { - try - { - using (System.IO.StreamReader str = ReadResourceReader(name)) - { - if (str == null) - return null; - return str.ReadToEnd(); - } - } - catch - { - return null; - } - } - - /// - /// Read a file compiled as Embedded Content in the calling assembly. - /// - /// The name of the file to read, without any namespace - /// A StreamReader for reading the file, or null if it does not exist - public static StreamReader ReadResourceReader(string name) - { - Stream st = ReadResourceStream(name); - if (st == null) - return null; - return new StreamReader(st); - } - - /// - /// Read a file compiled as Embedded Content in the calling assembly. - /// - /// The name of the file to read, without any namespace - /// A Stream for reading the file, or null if it does not exist - public static Stream ReadResourceStream(string name) - { - // not a streamname, because it is really a code-level issue... - if (name == null || name.Length == 0) - return null; - try - { - string[] names = System.Reflection.Assembly.GetCallingAssembly().GetManifestResourceNames(); - string fullName = null; - string dotName = "." + name; - foreach (string s in names) - { - // this is a hack... *** - if (s == name || s.EndsWith(dotName, StringComparison.OrdinalIgnoreCase)) - { - fullName = s; - break; - } - } - if (fullName == null) - return null; - System.Reflection.Assembly assem = System.Reflection.Assembly.GetExecutingAssembly(); - return assem.GetManifestResourceStream(name); - } - catch - { - return null; - } - } - - #endregion - - #region Checksum, Etc - #region Tables - static readonly uint[] _crctab = - { - 0x0, - 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, - 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, - 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, - 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, - 0x5BD4B01B, 0x569796C2, 0x52568B75, 0x6A1936C8, 0x6ED82B7F, - 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, - 0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, - 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, - 0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, - 0xA4AD16EA, 0xA06C0B5D, 0xD4326D90, 0xD0F37027, 0xDDB056FE, - 0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95, - 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4, - 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0, - 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, - 0x2AC12072, 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, - 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA, 0x7897AB07, - 0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C, - 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, - 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA, - 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, - 0xBB60ADFC, 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, - 0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D, - 0x94EA7B2A, 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, - 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, 0xC6BCF05F, - 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34, - 0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, - 0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, - 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A, - 0x58C1663D, 0x558240E4, 0x51435D53, 0x251D3B9E, 0x21DC2629, - 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C, - 0x3B5A6B9B, 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF, - 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E, - 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, - 0xEBA91BBC, 0xEF68060B, 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, - 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3, - 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2, - 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71, - 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, - 0x857130C3, 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, - 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, 0x7B827D21, - 0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A, - 0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E, 0x18197087, - 0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC, - 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, - 0x2056CD3A, 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE, - 0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, - 0xDBEE767C, 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, - 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4, 0x89B8FD09, - 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662, - 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, - 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4 - }; - - static readonly uint[] _zipCrctab = - { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, - 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, - 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, - 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, - 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, - 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, - 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, - 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, - 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, - 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, - 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, - 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, - 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, - 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, - 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, - 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, - 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, - 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d - }; - #endregion - - /// - /// The types of checksums that can be calculated. - /// - public enum ChecksumType - { - /// - /// The checksum used in the ZIP and gzip file formats. - /// - Zip, - /// - /// Standard CRC32. - /// - Crc32, - /// - /// The first bytes of the SHA1 hash. - /// - SHA1Prefix, - /// - /// The first bytes of the SHA256 hash. - /// - SHA256Prefix, - } - - /// - /// Calculate a standard ZIP/gzip checksum for the specified file. - /// - /// the file to find the checksum of - /// the checksum, as an integer - /// - /// To convert this to a string as displayed for ZIP and gzip, - /// use ToString("X8"). - /// - public static uint Checksum(string fileName) - { - unchecked - { - return (uint)(Checksum(fileName, ChecksumType.Zip) & 0xFFFFFFFF); - } - } - - /// - /// Calculate a standard CRC32 checksum for the specified file. - /// - /// the file to find the checksum of - /// the type of checksum to calculate - /// the checksum, as a 64-bit integer - /// - /// For checksums smaller than 64-bits, the high bits of the return - /// value will be zero. - /// - public static ulong Checksum(string fileName, ChecksumType type) - { - long length = 0; - - using (Stream inFile = ZStreamIn.Open(fileName)) - { - // compute the basic crc - // for (int count = inFile.Read(buffer, 0, buffer.Length); count > 0; count = inFile.Read(buffer, 0, buffer.Length)) - // { - // length += count; - // for (int i = 0; i < count; i++) - // { - // // New checksum value - // crcZip = (crcZip >> 8) ^ zip_crctab[((int)crcZip ^ buffer[i]) & 0xff]; - // crc32 = (crc32 << 8) ^ crctab[(crc32 >> 24) ^ ( ((uint)buffer[i]) & 0xFF )]; - // } - // } - switch (type) - { - case ChecksumType.Crc32: - default: - unsafe - { - uint crc32 = 0; - if (inFile is UnbufferedStream) - { - UnbufferedStream inFileU = (UnbufferedStream)inFile; - byte* buffer; - for (int count = inFileU.Read(out buffer); count > 0; count = inFileU.Read(out buffer)) - { - length += count; - byte* bEnd = buffer + count; - while (buffer != bEnd) - { - crc32 = (crc32 << 8) ^ _crctab[(crc32 >> 24) ^ (((uint)(*buffer)) & 0xFF)]; - buffer++; - } - } - } - else - { - byte[] buffer = new byte[4 * 1024 * 1024]; - for (int count = inFile.Read(buffer, 0, buffer.Length); count > 0; count = inFile.Read(buffer, 0, buffer.Length)) - { - length += count; - fixed (byte* bb = buffer) - { - byte* b = bb; - byte* bEnd = bb + count; - while (b != bEnd) - { - crc32 = (crc32 << 8) ^ _crctab[(crc32 >> 24) ^ (((uint)(*b)) & 0xFF)]; - b++; - } - } - } - } - long adj = length; - while (adj != 0) - { - crc32 = (crc32 << 8) ^ - _crctab[((crc32 >> 24) ^ adj) & 0xFF]; - adj >>= 8; - } - crc32 = ~crc32 & 0xFFFFFFFF; - return crc32; - } - - case ChecksumType.Zip: - unsafe - { - uint crcZip = 0xffffffff; - if (inFile is UnbufferedStream) - { - UnbufferedStream inFileU = (UnbufferedStream)inFile; - byte* buffer; - for (int count = inFileU.Read(out buffer); count > 0; count = inFileU.Read(out buffer)) - { - length += count; - byte* bEnd = buffer + count; - while (buffer != bEnd) - { - // New checksum value - crcZip = (crcZip >> 8) ^ _zipCrctab[((int)crcZip ^ (*buffer)) & 0xff]; - buffer++; - } - } - } - else - { - byte[] buffer = new byte[4 * 1024 * 1024]; - for (int count = inFile.Read(buffer, 0, buffer.Length); count > 0; count = inFile.Read(buffer, 0, buffer.Length)) - { - //Console.WriteLine("read: " + count + " total: " + length); - length += count; - fixed (byte* bb = buffer) - { - byte* b = bb; - byte* bEnd = bb + count; - while (b != bEnd) - { - // New checksum value - crcZip = (crcZip >> 8) ^ _zipCrctab[((int)crcZip ^ (*b)) & 0xff]; - b++; - } - } - } - } - // fix up the crc - crcZip = crcZip ^ 0xffffffff; - return crcZip; - } - - case ChecksumType.SHA1Prefix: - { - System.Security.Cryptography.SHA1Managed sha = new System.Security.Cryptography.SHA1Managed(); - byte[] hash = sha.ComputeHash(inFile); - return BitConverter.ToUInt64(hash, 0); - } - - case ChecksumType.SHA256Prefix: - { - System.Security.Cryptography.SHA256Managed sha = new System.Security.Cryptography.SHA256Managed(); - byte[] hash = sha.ComputeHash(inFile); - return BitConverter.ToUInt64(hash, 0); - } - } - } - } - #endregion -#else - #region File-only operations - - /// - /// Set the length of a file, truncating or padding as needed. - /// - /// the file to alter - /// the desired length, in bytes - /// - /// Note that this only operates on normal files, and cannot be successfully used on compressed - /// files or special streams. - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// An I/O error has occurred. - /// The stream does not support both writing and seeking. - /// Attempted to set the value parameter to less than 0. - public static void ResizeFile(string fileName, long length) - { - using (FileStream pad = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) - { - pad.SetLength(length); - } - } - - /// - /// Determine if a file exists. - /// - /// the original filename - /// true if a file with a name of fileName exists, false otherwise - public static bool FileExists(string fileName) - { - return !string.IsNullOrEmpty(fileName) && File.Exists(fileName); - } - - private static readonly char[] wildChars = new char[] { '*', '?' }; - private static readonly char[] wildPlusChars = new char[] { '*', '?', '+' }; - - /// - /// Expand an extended wildcard pattern into a set of file paths. - /// - /// the pattern to expand - /// the set of file paths matching the pattern - /// - /// The wildcard pattern accepts the standard "*" and "?" placeholders. - /// "..." also refers to a recursive search over subdirectories. - /// "+" can also be used to make a union of several filenames or patterns. - /// In addition to filenames, HTTP URLs, nul, null, $, - /// -, and Cosmos stream names are all recognized as elements. - /// Names of files that do not exist will be excluded. - /// - public static string[] ExpandWildcards(string pattern) - { - if (pattern == null || (pattern.IndexOfAny(wildPlusChars) < 0 && pattern.IndexOf("...") < 0)) - { - if (FileExists(pattern)) - { - return new string[] { pattern }; - } - else - { - return new string[0]; - } - } - List matchList = new List(); - bool disjoint = false; - int filePatternCount = 0; - string[] patterns = pattern.Split('+'); - foreach (string pat in patterns) - { - // hard-code in special types?? - if (pat.Length == 0) - continue; - string patLower = pat.ToLower(); - - filePatternCount++; - int prepatternCount = matchList.Count; - if (pat.IndexOfAny(wildChars) >= 0 || pat.IndexOf("...") >= 0) - { - // compressed extensions are not automatically used! *** - int recursiveIndex = pat.IndexOf("..."); - if (recursiveIndex >= 0) - { - string left = pat.Substring(0, recursiveIndex); - string right = pat.Substring(recursiveIndex + 3); - right = right.TrimStart('\\', '/'); - if (right.Length == 0) - right = "*"; - string path = left; - bool pathEmpty = (path == null || path.Length == 0); - if (pathEmpty) - path = "."; - Stack dirsLeft = new Stack(); - dirsLeft.Push(path); - while (dirsLeft.Count != 0) - { - string dir = (string)dirsLeft.Pop(); - - // watch for lack of access: - try - { - // this is actually incorrect, for 3-char extensions: *** - string[] files = Directory.GetFiles(dir, right); - if (pathEmpty) - { - for (int i = 0; i < files.Length; i++) - { - if (files[i].StartsWith("./") || files[i].StartsWith(".\\")) - files[i] = files[i].Substring(2); - } - } - matchList.AddRange(files); - - string[] subs = Directory.GetDirectories(dir); - for (int s = subs.Length - 1; s >= 0; s--) - { - dirsLeft.Push(subs[s]); - } - } - catch - { - // ignore - } - } - } - else - { - try - { - string path = Path.GetDirectoryName(pat); - bool pathEmpty = !(pat.StartsWith("./") || pat.StartsWith(".\\")); - if (path == null || path.Length == 0) - path = "."; - // watch for lack of access: - try - { - string[] files = Directory.GetFiles(path, Path.GetFileName(pat)); - if (pathEmpty) - { - for (int i = 0; i < files.Length; i++) - { - if (files[i].StartsWith("./") || files[i].StartsWith(".\\")) - files[i] = files[i].Substring(2); - } - } - matchList.AddRange(files); - } - catch - { - // ignore - } - } - catch - { - // ignore bad path? - } - } - } - else - { - // what to do?? Filter to only those that exist?? *** - if (!FileExists(pat)) - continue; - matchList.Add(pat); - } - if (filePatternCount > 1 && matchList.Count != prepatternCount) - { - disjoint = true; - } - } - if (disjoint || true) - { - // remove duplicates, very inefficiently - but it is simple, preserves - // the order, uses no additional memory, and is case-insensitive...: - for (int i = 0; i < matchList.Count - 1; i++) - { - for (int j = i + 1; j < matchList.Count; j++) - { - if (string.Compare((string)matchList[i], (string)matchList[j], true) == 0) - { - matchList.RemoveAt(j); - j--; - } - } - } - } - return matchList.ToArray(); - } - - /// - /// Read the lines of the file or stream specified by fileName. - /// - /// the file to read (or URL, or Cosmos stream...) - /// the lines of fileName, or null if it cannot be read - /// - /// The reading is performed through . - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static string[] ReadLines(string fileName) - { - try - { - using (StreamReader input = ZStreamReader.Open(fileName)) - { - try - { - List lines = new List(); - for (string line = input.ReadLine(); line != null; line = input.ReadLine()) - { - lines.Add(line); - } - if (lines.Count > 0 && ((string)lines[lines.Count - 1]).Length == 0) - lines.RemoveAt(lines.Count - 1); - return lines.ToArray(); - } - catch - { - return null; - } - } - } - catch - { - return null; - } - } - #endregion -#endif - } - -#if TLCFULLBUILD - /// - /// Class representing file or directory information. - /// - /// - /// This is similar to the purpose of and its - /// subclasses, and . - /// However, they are not easy to effectively subclass. - /// - public class StreamInfo : IComparable - { - private readonly string _path; - private /*readonly*/ long _length; - private /*readonly*/ DateTime _lastWriteTime; - private string _canonicalPath; - - /// - /// Create a new StreamInfo. - /// - /// the name of the file or directory - a directory - /// must end with "/" or "\" - /// the length of the item - /// the last write time of the item - public StreamInfo(string path, long length, DateTime lastWriteTime) - { - _length = length; - _lastWriteTime = lastWriteTime; - _canonicalPath = null; - _path = path; - if (_path == null) - { - _path = ""; - } - else - { - _path = path; - } - } - - /// - /// Create a new StreamInfo for an existing file or directory. - /// - /// the path to the file or directory - /// The given path does not exist. - public StreamInfo(string path) - { - if (path == null || path.Length == 0) - { - throw new FileNotFoundException("No directory or file for empty path"); - } - try - { - _canonicalPath = null; - _path = path; - // this is not really efficient: - if (IOUtil.FileExists(path)) - { - // this only works for file systems!! - FileInfo f = new FileInfo(path); - _length = f.Length; - _lastWriteTime = f.LastWriteTime; - } - else if (IOUtil.DirectoryExists(path)) - { - // this only works for file systems!! - if (path[path.Length - 1] != '/' && path[path.Length - 1] != '\\') - { - _path = _path + "/"; - } - _length = 0; - _lastWriteTime = Directory.GetLastWriteTime(path); - } - else - { - throw new FileNotFoundException("No directory or file: " + path); - } - } - catch - { - throw new FileNotFoundException("Cannot access directory or file: " + path); - } - } - - /// - /// Create a new StreamInfo for an existing file or directory. - /// - /// the path to the file or directory - /// dummy parameter to indicate delaying the fetch of metadata - /// The given path does not exist. - internal StreamInfo(string path, bool delay) - { - _canonicalPath = null; - _path = path; - _length = -1; - _lastWriteTime = DateTime.MinValue; - } - - /// - /// Compare two instances, based on the canonical path. - /// - /// the instance to compare to - /// negative if this instance is less than obj; 0 if equal; - /// postive otherwise - public int CompareTo(object obj) - { - StreamInfo other = obj as StreamInfo; - if (other == null) - return -1; - return CanonicalPath.CompareTo(other.CanonicalPath); - } - - /// - /// Determine if this instance is equal to another. - /// - /// the instance to compare to - /// true if obj is a StreamInfo referring to the same canonical path; - /// false otherwise - public override bool Equals(object obj) - { - if (obj is StreamInfo) - { - return CanonicalPath.Equals(((StreamInfo)obj).CanonicalPath); - } - - return false; - } - - /// - /// Get the hashcode, based on the canonical path. - /// - /// the hash code - public override int GetHashCode() - { - return CanonicalPath.GetHashCode(); - } - - /// - /// Get the . - /// - /// the canonical name - public override string ToString() - { - return CanonicalPath; - } - - /// - /// Gets the full path of the file or directory. - /// - public string Path - { - get { return _path; } - } - - /// - /// Gets the name of this item, with no parent path or salshes. - /// - public string Name - { - get - { - if (_path.Length == 0) - return ""; - int end = _path[_path.Length - 1] == '/' || _path[_path.Length - 1] == '\\' ? - _path.Length - 1 : _path.Length; - // what if it ends in multiple slashes? *** - int start = _path.LastIndexOfAny(_pathSeperators, end - 1); - if (start < 0) - { - start = 0; - } - else - { - start++; - } - return _path.Substring(start, end - start); - } - } - - private static readonly char[] _pathSeperators = new char[] { '/', '\\' }; - - /// - /// Gets the full path of the file or directory in a standard form. - /// - public string CanonicalPath - { - get - { - if (_canonicalPath == null) - { - _canonicalPath = IOUtil.GetCanonicalPath(_path); - } - return _canonicalPath; - } - } - - ///// - ///// Get the filename with DOS-style slashes ("\"). - ///// - ///// the filename with DOS-style slashes - //public string GetDosName() - //{ - // return Name.Replace('/', '\\'); - //} - - /// - /// Gets whether the item is a directory (not including archives, - /// which can be accessed as directories). - /// - public bool IsDirectory - { - get - { - return Path.Length != 0 && CanonicalPath[CanonicalPath.Length - 1] == '/'; - } - } - /// - /// Gets whether the item is a compressed file or archive. - /// - public bool IsCompressed - { - get - { - string ext = System.IO.Path.GetExtension(Path); - if (ext.Length == 0) - return false; - ext = ext.ToLower(); - return Array.IndexOf(ZStreamIn.decompressionExtensions, ext) >= 0; - } - } - - /// - /// Gets the last modification time. - /// - public DateTime LastWriteTime - { - get - { - if (_lastWriteTime == DateTime.MinValue) - { - if (IsDirectory) - { - if (Directory.Exists(_path)) - { - _lastWriteTime = Directory.GetLastWriteTime(_path); - } - else - { - // not actually a file... - } - } - else - { - if (File.Exists(_path)) - { - _lastWriteTime = File.GetLastWriteTime(_path); - } - else - { - // not actually a file... - } - } - } - return _lastWriteTime; - } - } - - /// - /// Gets the length of the file in bytes, or 0 for directories. - /// - public long Length - { - get - { - if (_length < 0) - { - if (IsDirectory) - { - _length = 0; - } - else - { - if (File.Exists(_path)) - { - FileInfo f = new FileInfo(_path); - _length = f.Length; - } - else - { - // this shouldn't happen... - } - } - } - return _length; - } - } - } - -#endif // TLCFULLBUILD - #endregion - - #region ZStreams - -#if TLCFULLBUILD - /// - /// Class to create StreamReaders that automatically decompress based on the file extensions. - /// - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - /// - /// Compression support relies on executable utilities to be in the path. - /// See for 7z.exe and 7za.exe (for many formats - - /// .7z, .gz, .zip, .rar, .bz2, .cab, .arj), for gzip.exe - /// (for .gz), or for unrar.exe (for .rar). - /// - ///
-#else - /// - /// Class to create StreamReaders given file paths. - /// -#endif - public class ZStreamReader //: StreamReader - { - // private string tempDir = null; - // private static string fallbackExtension = ""; - private static bool _defaultToLocalEncoding = false; - - private static int _bufferSize = 32 * 1024; //-1; //1024*1024; //32768; - - /// - /// Get or set whether to allow fallback to the compression library if executables - /// are not found in the path. false by default. Using the fallback may result in - /// slower performance and larger files. This setting is shared with ZStreamIn, - /// ZStreamOut, ZStreamReader, and ZStreamWriter. - /// - public static bool AllowLibraryFallback - { - get { return ZStreamIn.AllowLibraryFallback; } - set { ZStreamIn.AllowLibraryFallback = value; } - } - - private ZStreamReader() - { - } - - /// - /// Get or set whether to default to the local encoding, rather than a lenient UTF8. - /// - public static bool DefaultToLocalEncoding - { - get { return _defaultToLocalEncoding; } - set { _defaultToLocalEncoding = value; } - } - - /// - /// Get or set extension to look to append when the given filename does not exist. - /// If set to empty string (the default), try all known extensions; - /// if set to null, disable. - /// This is mapped to ZStreamIn.FallbackExtension. - /// - public static string FallbackExtension - { - //get { return fallbackExtension; } - //set { fallbackExtension = value; } - get { return ZStreamIn.FallbackExtension; } - set { ZStreamIn.FallbackExtension = value; } - } - -#if TLCFULLBUILD - /// - /// Open the specified file. - /// - /// name of the file to open - /// A StreamReader for the (possibly uncompressed) text - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static StreamReader Open(string fileName) - { - Encoding enc = DefaultToLocalEncoding ? Encoding.Default : ZStreamWriter.UTF8Lenient; - return Open(fileName, enc); - } - -#if TLCFULLBUILD - /// - /// Open the specified file. - /// - /// name of the file to open - /// the encoding to use - /// A StreamReader for the (possibly uncompressed) text - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static StreamReader Open(string fileName, Encoding encoding) - { -#if TLCFULLBUILD - // check for SqlStream - we don't want to open this as a Stream: - if (SqlTextReader.IsSqlTextReader(fileName)) - { - return new SqlTextReader(fileName); - } -#endif - // hack for console! It seems to break otherwise, at times, at least in 1.1... - Stream s = null; - try - { - s = ZStreamIn.Open(fileName); - if (_bufferSize > 0) - { - //// hack for console! - //if (fileName.Length > 0 && (fileName[0] == '-' || fileName[0] == '$') && - // (fileName.Length == 1 || (fileName.Length == 2 && - // (fileName[1] == '-' || fileName[1] == '$')))) - //{ - // //s = new BufferedStream(s, BUFFER_SIZE); - // StreamReader sr = new StreamReader(s, encoding, true); - // return sr; - //} - //else - //{ - return new StreamReader(s, encoding, true, _bufferSize); - //} - } - else - { - return new StreamReader(s, encoding, true); //, BUFFER_SIZE); - } - } - catch - { - if (s != null) - { - try - { - s.Close(); - } - catch - { - } - } - throw; - } - } - -#if UNBUFFERED - -#if TLCFULLBUILD - /// - /// Open the specified file with normal file caching. - /// - /// name of the file to open - /// A StreamReader for the (possibly uncompressed) text - /// - /// - /// This method opens the file with system caching, regardless of the setting of - /// . - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// - /// There are several special filenames: - /// - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static StreamReader OpenBuffered(string fileName) - { - Encoding enc = DefaultToLocalEncoding ? Encoding.Default : ZStreamWriter.UTF8Lenient; - return OpenBuffered(fileName, enc); - } - -#if TLCFULLBUILD - /// - /// Open the specified file with normal file caching. - /// - /// name of the file to open - /// the encoding to use - /// A StreamReader for the (possibly uncompressed) text - /// - /// - /// This method opens the file with system caching, regardless of the setting of - /// . - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// - /// There are several special filenames: - /// - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static StreamReader OpenBuffered(string fileName, Encoding encoding) - { -#if TLCFULLBUILD - // check for Azure Storage objects - AzureStorageIO azureStorage = new AzureStorageIO(); - string fileNameLower = fileName.ToLower(); - - //REVIEW: Standardize on a naming convention or employ some other way to distinguish azure vs general http streams. - // check for HTTP: - if (fileNameLower.StartsWith("http://") || fileNameLower.StartsWith("https://")) - { - if (azureStorage.BlockBlobExistsByUri(fileNameLower)) - { - return new StreamReader(azureStorage.GetBlobStream(fileNameLower), encoding); - } - } - - // check for SqlStream - we don't want to open this as a Stream: - if (SqlTextReader.IsSqlTextReader(fileName)) - { - return new SqlTextReader(fileName); - } - // hack for console! -#endif - Stream s = null; - try - { - s = ZStreamIn.OpenBuffered(fileName); - if (_bufferSize > 0) - { - //// hack for console! - //if (fileName.Length > 0 && (fileName[0] == '-' || fileName[0] == '$') && - // (fileName.Length == 1 || (fileName.Length == 2 && - // (fileName[1] == '-' || fileName[1] == '$')))) - //{ - // //s = new BufferedStream(s, BUFFER_SIZE); - // return new StreamReader(s, encoding, true); - //} - //else - //{ - return new StreamReader(s, encoding, true, _bufferSize); - //} - } - else - { - return new StreamReader(s, encoding, true); //, BUFFER_SIZE); - } - } - catch - { - if (s != null) - { - try - { - s.Close(); - } - catch - { - } - } - throw; - } - } - - /// - /// Open the specified file (with unbuffered I/O, if possible). - /// - /// name of the file to open - /// A StreamReader for the (possibly uncompressed) text - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. This is the only way to get speeds over - /// 60 MB/sec or more on reading (350 MB/sec or more is possible on a good array). - /// - /// - /// While compressed files and special stream names will be understood, unbuffered I/O will - /// not be enabled on anything but simple files. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static StreamReader OpenUnbuffered(string fileName) - { - Encoding enc = DefaultToLocalEncoding ? Encoding.Default : ZStreamWriter.UTF8Lenient; - return OpenUnbuffered(fileName, enc); - } - /// - /// Open the specified file (with unbuffered I/O, if possible). - /// - /// name of the file to open - /// the encoding to use - /// A StreamReader for the (possibly uncompressed) text - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. This is the only way to get speeds over - /// 60 MB/sec or more on reading (350 MB/sec or more is possible on a good array). - /// - /// - /// While compressed files and special stream names will be understood, unbuffered I/O will - /// not be enabled on anything but simple files. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static StreamReader OpenUnbuffered(string fileName, Encoding encoding) - { -#if TLCFULLBUILD - // check for Azure Storage objects - AzureStorageIO azureStorage = new AzureStorageIO(); - string fileNameLower = fileName.ToLower(); - if (fileNameLower.StartsWith("http://") || fileNameLower.StartsWith("https://")) - { - if (azureStorage.BlockBlobExistsByUri(fileNameLower)) - { - return new StreamReader(azureStorage.GetBlobStream(fileNameLower), encoding); - } - } - - // check for SqlStream - we don't want to open this as a Stream: - if (SqlTextReader.IsSqlTextReader(fileName)) - { - return new SqlTextReader(fileName); - } -#endif - Stream s = null; - try - { - s = ZStreamIn.OpenUnbuffered(fileName); - return new StreamReader(s, encoding, true, 64 * 1024); - } - catch - { - if (s != null) - { - try - { - s.Close(); - } - catch - { - } - } - throw; - } - } - -#endif - -#if TEMP_FILE_RAR - ///////////////////////// - //// Old temp file code: - // assume only one file inside! - System.CodeDom.Compiler.TempFileCollection tempCollection = new System.CodeDom.Compiler.TempFileCollection(); - tempCollection.KeepFiles = true; - ztempDir = tempCollection.BasePath; - Directory.CreateDirectory(ztempDir); - string fullName = "\"" + (new FileInfo(fileName)).FullName + "\""; - System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo("unrar", "e -y -o+ -inul -dh " + fullName); - procInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; - procInfo.CreateNoWindow = true; - procInfo.UseShellExecute = false; - procInfo.WorkingDirectory = ztempDir; - System.Diagnostics.Process proc = System.Diagnostics.Process.Start(procInfo); - proc.WaitForExit(); - string[] fileNames = Directory.GetFiles(ztempDir); - if (fileNames.Length == 0) - { - try - { - try - { - string[] badFiles = Directory.GetFiles(ztempDir); - if (badFiles != null) - { - for (int i = 0; i < badFiles.Length; i++) - { - File.Delete(Path.Combine(ztempDir, badFiles[i])); - } - } - } - catch //(Exception e2) - { - // ignore any problems... - //Console.WriteLine("!! (Open_) Problem deleting in " + ztempDir + ": " + e2.ToString()); - } - Directory.Delete(ztempDir, true); - } - catch //(Exception e) - { - // ignore any problems... - //Console.WriteLine("!! (Open_) Problem deleting " + ztempDir + ": " + e.ToString()); - } - // should we open the original file, then? *** - throw new Exception("unrar failed on file '" + fileName + "'"); - } - s = new FileStream(fileNames[0], FileMode.Open, FileAccess.Read); - - private ZStreamReader(Stream s, string ztempDir, Encoding e, bool detectEncoding, int bufferSize) - : base(s, e, detectEncoding, bufferSize) - { - tempDir = ztempDir; - } - - /// - /// Destroy the ZStreamReader. - /// - ~ZStreamReader() - { - Dispose(true); - } - - /// - /// Close the StreamReader. - /// - public override void Close() - { - try - { - base.Close(); - isClosed = true; - } - finally - { - if (tempDir != null) - { - try - { - //Console.WriteLine("(Close) Should be deleting: " + tempDir); - try - { - string[] badFiles = Directory.GetFiles(tempDir); - if (badFiles != null) - { - for (int i = 0; i < badFiles.Length; i++) - { - File.Delete(Path.Combine(tempDir, badFiles[i])); - } - } - } - catch //(Exception e2) - { - // ignore any problems... - //Console.WriteLine("!! (Close) Problem deleting " + tempDir + ": " + e2.ToString()); - } - Directory.Delete(tempDir, true); - tempDir = null; - } - catch //(Exception e) - { - // ignore any problems... - //Console.WriteLine("!! (Close) Problem deleting " + tempDir + ": " + e.ToString()); - } - } - } - } - - private bool isClosed = false; - /// - /// Release all resources - /// - /// - protected override void Dispose(bool disposing) - { - //if (disposing) - //{ - if (!isClosed) - { - try - { - base.Close(); - isClosed = true; - } - catch - { - // ignore - probably already closed or some such. - } - } - if (tempDir != null) - { - try - { - //Console.WriteLine("(Dispose) Should be deleting: " + tempDir); - try - { - string[] badFiles = Directory.GetFiles(tempDir); - if (badFiles != null) - { - for (int i = 0; i < badFiles.Length; i++) - { - File.Delete(Path.Combine(tempDir, badFiles[i])); - } - } - } - catch //(Exception e2) - { - // ignore any problems... - //Console.WriteLine("!! (Dispose) Problem deleting in " + tempDir + ": " + e2.ToString()); - } - Directory.Delete(tempDir, true); - tempDir = null; - } - catch //(Exception e) - { - // ignore any problems... - //Console.WriteLine("!! (Dispose) Problem deleting " + tempDir + ": " + e.ToString()); - } - } - //} - base.Dispose (disposing); - } -#endif - } - -#if TLCFULLBUILD - /// - /// Class to create StreamWriters that automatically compress based on the file extensions. - /// - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is line buffered, - /// which may cause problems if the data is needed immediately and is not as fast as full buffering. - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - /// - /// Compression support relies on executable utilities to be in the path. - /// See for 7z.exe and 7za.exe (for - /// .7z, .gz), for gzip.exe - /// (for .gz). - /// - ///
-#else - /// - /// Class to create StreamWriters given file paths. - /// -#endif - public class ZStreamWriter //: StreamWriter - { - // backing field for UTF8Lenient - private static readonly Encoding _utf8Lenient = new UTF8Encoding(false, false); - - /// - /// A lenient UTF8 encoding that ignores problems and skips the BOM. - /// - public static Encoding UTF8Lenient - { - get - { - return _utf8Lenient; - } - } - - private const string WriteNewLine = "\r\n"; - private static Encoding _writeEncoding = UTF8Lenient; - //private static int compressionLevel = 1; - private static bool _breakChunksAtLines = true; - - private static int _bufferSize = 32 * 1024; //-1; //1024*1024; //32768; - - /// - /// Get or set whether the Open method should use a LowFragmentationStream for files. - /// true, by default. - /// - /// - /// The has strong advantages, increasing write - /// speed and decreasing fragmentation. - /// - public static bool DefaultLowFragmentation - { - get { return ZStreamOut.DefaultLowFragmentation; } - set { ZStreamOut.DefaultLowFragmentation = value; } - } - - /// - /// Get or set the encoding that is used for new StreamWriters. - /// - public static Encoding WriteEncoding - { - get { return _writeEncoding; } - set { _writeEncoding = value; } - } - -#if TLCFULLBUILD - /// - /// Get or set whether to break at line boundaries when using chunked streams, - /// such as or . - /// True by default, unlike . - /// - /// - /// This will not necessarily have any effect. It is currently unimplemented in - /// , and most streams have no concept of chunks. - /// -#else - /// - /// Get or set whether to break at line boundaries when using chunked streams. - /// True by default, unlike . - /// - /// - /// This will not necessarily have any effect. Most streams have no concept of chunks. - /// -#endif - public static bool BreakChunksAtLines - { - get { return _breakChunksAtLines; } - set { _breakChunksAtLines = value; } - } - - /// - /// Get or set whether to allow fallback to the compression library if executables - /// are not found in the path. false by default. Using the fallback may result in - /// slower performance and larger files. This setting is shared with ZStreamIn, - /// ZStreamOut, ZStreamReader, and ZStreamWriter. - /// - public static bool AllowLibraryFallback - { - get { return ZStreamIn.AllowLibraryFallback; } - set { ZStreamIn.AllowLibraryFallback = value; } - } - - private ZStreamWriter() - { - } - -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// A StreamWriter for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is line buffered, - /// which may cause problems if the data is needed immediately and is not as fast as full buffering. - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open a stream are not available. -#endif - public static StreamWriter Open(string outFileName) - { - return Open(outFileName, false); - } - -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// Encoding for writing - /// A StreamWriter for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is line buffered, - /// which may cause problems if the data is needed immediately and is not as fast as full buffering. - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open a stream are not available. -#endif - public static StreamWriter Open(string outFileName, Encoding encoding) - { - return Open(outFileName, false, encoding); - } - -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// if true, append; if false, overwrite - /// A StreamWriter for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is line buffered, - /// which may cause problems if the data is needed immediately and is not as fast as full buffering. - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static StreamWriter Open(string outFileName, bool append) - { - return Open(outFileName, append, BreakChunksAtLines); - } - -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// if true, append; if false, overwrite - /// Encoding for writing - /// A StreamWriter for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is line buffered, - /// which may cause problems if the data is needed immediately and is not as fast as full buffering. - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static StreamWriter Open(string outFileName, bool append, Encoding encoding) - { - return Open(outFileName, append, BreakChunksAtLines, false, encoding); - } - -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// if true, append; if false, overwrite - /// if true, break at line boundaries when using chunked streams - /// A StreamWriter for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is line buffered, - /// which may cause problems if the data is needed immediately and is not as fast as full buffering. - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static StreamWriter Open(string outFileName, bool append, bool breakChunksAtLines) - { - return Open(outFileName, append, breakChunksAtLines, false); - } - - private static StreamWriter Open(string outFileName, bool append, bool breakChunksAtLines, bool unbuffered) - { - return Open(outFileName, append, breakChunksAtLines, unbuffered, WriteEncoding); - } - - private static StreamWriter Open(string outFileName, bool append, bool breakChunksAtLines, bool unbuffered, Encoding encoding) - { - // check for SqlStream - we don't want to open this as a Stream: -#if TLCFULLBUILD - if (SqlTextReader.IsSqlTextReader(outFileName)) - { - return new SqlTextWriter(outFileName); - } -#endif - Stream s = unbuffered ? ZStreamOut.OpenUnbuffered(outFileName, append, breakChunksAtLines) - : ZStreamOut.Open(outFileName, append, breakChunksAtLines); - - StreamWriter sw; - int size = _bufferSize; - if (string.Compare(outFileName, "clip:", true) == 0) - { - size = 4; - } - if (size > 0) - { - sw = new StreamWriter(s, encoding, size); - } - else - { - sw = new StreamWriter(s, encoding); - } - sw.NewLine = WriteNewLine; -#if TLCFULLBUILD - if (string.Compare(outFileName, "clip:", true) == 0) - { - // we really want line-level flushing! *** - //sw.AutoFlush = true; - } - if (ZStreamIn.IsConsoleStream(outFileName)) - { - // match standard behavior, but not efficient in many cases! - // we might really want line-level flushing! *** - sw.AutoFlush = true; - ((LineBufferedStream)sw.BaseStream).LineBuffer = true; - } -#endif - return sw; - } - -#if UNBUFFERED - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// Encoding for writing - /// A StreamWriter for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open a stream are not available. - public static StreamWriter OpenUnbuffered(string outFileName, Encoding encoding) - { - return OpenUnbuffered(outFileName, false, encoding); - } - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// A StreamWriter for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open a stream are not available. - public static StreamWriter OpenUnbuffered(string outFileName) - { - return OpenUnbuffered(outFileName, false); - } - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// if true, append; if false, overwrite - /// A StreamWriter for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static StreamWriter OpenUnbuffered(string outFileName, bool append) - { - return OpenUnbuffered(outFileName, append, BreakChunksAtLines); - } - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// if true, append; if false, overwrite - /// Encoding for writing - /// A StreamWriter for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static StreamWriter OpenUnbuffered(string outFileName, bool append, Encoding encoding) - { - return Open(outFileName, append, _breakChunksAtLines, true, encoding); - } - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// if true, append; if false, overwrite - /// if true, break at line boundaries when using chunked streams - /// A StreamWriter for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// Append is specified, and fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static StreamWriter OpenUnbuffered(string outFileName, bool append, bool breakChunksAtLines) - { - return Open(outFileName, append, breakChunksAtLines, true); - } - -#endif - } - -#if TLCFULLBUILD - /// - /// Class to create input Streams that automatically decompress based on the file extensions. - /// - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - /// - /// Compression support relies on executable utilities to be in the path. - /// See for 7z.exe and 7za.exe (for many formats - - /// .7z, .gz, .zip, .rar, .bz2, .cab, .arj), for gzip.exe - /// (for .gz), or for unrar.exe (for .rar). - /// - ///
-#else - /// - /// Class to create input Streams given file paths. - /// -#endif - public class ZStreamIn - { - private static string _fallbackExtension = ""; - private static bool _defaultUnbuffered = false; - - private static int _bufferSize = 32 * 1024; //-1; //64*1024; //32768; - - /// - /// Get or set extension to look to append when the given filename does not exist. - /// If set to empty string (the default), try all known extensions; - /// if set to null, disable. - /// - public static string FallbackExtension - { - get { return _fallbackExtension; } - set { _fallbackExtension = value; } - } - - /// - /// Get or set whether the Open method should use unbuffered I/O whenever possible. - /// false, by default. - /// - public static bool DefaultUnbuffered - { - get { return _defaultUnbuffered; } - set { _defaultUnbuffered = value; } - } - - /// - /// Get or set whether to allow fallback to the compression library if executables - /// are not found in the path. false by default. Using the fallback may result in - /// slower performance and larger files. This setting is shared with ZStreamIn, - /// ZStreamOut, ZStreamReader, and ZStreamWriter. - /// - public static bool AllowLibraryFallback - { - get { return _allowLibraryFallback; } - set { _allowLibraryFallback = value; } - } - private static bool _allowLibraryFallback = true; - - internal static readonly string[] decompressionArchiveExtensions = new string[] - { - // 7za: - ".7z", - ".zip", - ".tar", - // 7z: - ".cab", - ".arj", - ".rar", - ".lzh", - ".chm" - }; - internal static readonly string[] decompressionExtensions = new string[] - { - // 7za: - ".gz", - ".7z", - ".zip", - ".tar", - ".bz2", - ".z", - // 7z: - ".cab", - ".arj", - ".rar", - ".lzh", - ".chm" - }; - internal static readonly string NullStreamName = "nul"; - private static readonly string[] _nullStreamNames = new string[] - { - "nul", - "null" - }; - internal static bool IsNullStream(string fileName) - { - if (fileName == null || fileName.Length == 0) - return false; - for (int i = 0; i < _nullStreamNames.Length; i++) - { - int len = _nullStreamNames[i].Length; - if (string.Compare(fileName, 0, _nullStreamNames[i], 0, len, true) == 0) - { - if (fileName.Length == len) - return true; - - if (fileName[len] == '\\' || - fileName[len] == '/') - { - len++; - // should collapse repeated slashes... - while (len < fileName.Length && - (fileName[len] == '\\' || fileName[len] == '/')) - { - len++; - } - if (len == fileName.Length) - return true; - for (int j = 0; i < _nullStreamNames.Length; j++) - { - if (fileName.Length - len == _nullStreamNames[j].Length && - string.Compare(fileName, len, _nullStreamNames[j], 0, _nullStreamNames[j].Length, true) == 0) - { - return true; - } - } - } - } - } - return false; - } - internal static readonly string ConsoleStreamName = "$"; - private static readonly string[] _consoleStreamNames = new string[] - { - "$", - "-" - }; - internal static bool IsConsoleStream(string fileName) - { - if (fileName == null || fileName.Length == 0) - return false; - for (int i = 0; i < _consoleStreamNames.Length; i++) - { - int len = _consoleStreamNames[i].Length; - if (string.Compare(fileName, 0, _consoleStreamNames[i], 0, len, true) == 0) - { - if (fileName.Length == len) - return true; - - if (fileName[len] == '\\' || - fileName[len] == '/') - { - len++; - // should collapse repeated slashes... - while (len < fileName.Length && - (fileName[len] == '\\' || fileName[len] == '/')) - { - len++; - } - if (len == fileName.Length) - return true; - for (int j = 0; i < _consoleStreamNames.Length; j++) - { - if (fileName.Length - len == _consoleStreamNames[j].Length && - string.Compare(fileName, len, _consoleStreamNames[j], 0, _consoleStreamNames[j].Length, true) == 0) - { - return true; - } - } - } - } - } - return false; - } - - /// - /// Gets the set of extensions (such as ".gz") that are accepted for decompression. - /// - public static string[] DecompressionExtensions - => (string[])decompressionExtensions.Clone(); - - /// - /// Gets the set of extensions (such as ".gz") that are accepted for decompression - /// as archives that can act as directories. - /// - public static string[] DecompressionArchiveExtensions - => (string[])decompressionArchiveExtensions.Clone(); - - private static readonly char[] _pathSeparators = new char[] { '/', '\\' }; - - private ZStreamIn() - { - } - -#if TLCFULLBUILD - private static bool _gzipFailure; - private static bool _gzip7ZFailure; - private static bool _full7ZFailure; -#endif - -#if TLCFULLBUILD - /// - /// Open the specified file. - /// - /// name of the file to open - /// A Stream for the (possibly uncompressed) data - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static Stream Open(string fileName) - { - if (DefaultUnbuffered) - { - return Open(fileName, false, true, false); - } - else - { - return Open(fileName, true); - } - } - - private static Stream Open(string fileName, bool buffered) - { - return Open(fileName, buffered, false, false); - } - private static Stream Open(string fileName, bool buffered, bool bufferedFallback, bool async) - { - Contracts.CheckNonEmpty(fileName, nameof(fileName)); - - // check for special names: - string fileNameLower = fileName.ToLower(); -#if TLCFULLBUILD - if (IsNullStream(fileName)) - { - //return new NullStream(); - return Stream.Null; - } - if (IsConsoleStream(fileName)) - { - // note that ReadByte() and WriteByte() are pathetic, and allocate an array! *** - // They also make too many managed->unmanaged transitions. - // This is 200x slower than it should be. - // Position also will not work. - // Using a BufferedStream wrapper fixes the first problem, with some overhead. - // A custom wrapper should probably be made, but it is a pain. - //return new BufferedStream(Console.OpenStandardInput(), 4096); - //return Console.OpenStandardInput(); - // larger sizes somehow break line buffering, making it be every *two* lines... - return new BufferedStream(Console.OpenStandardInput(), 1024); - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(fileName)) - { - return new ClipboardReadStream(); - } - - // check for Cosmos: - if (fileNameLower.StartsWith("cosmos:")) - { - try - { - // no compression support, anyway... - fileName = fileName.TrimEnd('$'); - return new CosmosReadStream(fileName); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamIn requires cosmos.cmd or cosmos.exe to be in the " + - "path for Cosmos reading."); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamIn requires cosmos.cmd or cosmos.exe to be in the " + - "path for Cosmos reading."); - } - } - - // check for Cockpit: - if (fileNameLower.StartsWith("cockpit:") || fileNameLower.StartsWith("cockpit:")) - { - if (fileName.Length <= "cockpit:".Length) - throw new ArgumentException("Invalid cockpit streamname", "fileName"); - // should we URL-encode? - fileName = fileName.Substring("cockpit:".Length); - fileName = fileName.Replace('/', '\\'); - - string cockpitServer = "cockpit.search.msn.com:81"; - - // check for forced cockpit server: - int hostStart = 0; - while (hostStart < fileName.Length && fileName[hostStart] == '\\') - hostStart++; - if (hostStart < fileName.Length - 2) - { - int hostEnd = hostStart + 1; - while (hostEnd < fileName.Length && fileName[hostEnd] != '\\') - hostEnd++; - int div = fileName.IndexOf('@', hostStart + 1, hostEnd - hostStart - 1); - if (div > 0) - { - // extract cockpit server! - cockpitServer = fileName.Substring(div + 1, hostEnd - div - 1); - fileName = fileName.Substring(0, div) + fileName.Substring(hostEnd); - } - } - - // ls is really for internal use... - string cmd = "get"; - if (fileName.EndsWith("\\") || fileName.EndsWith("/")) - cmd = "ls"; - // force searchmsn proxy!! - fileName = "http://" + cockpitServer + "@searchmsn/files?cmd=" + cmd + "&path=" + - fileName; - fileNameLower = fileName.ToLower(); - } - - // check for Multistream: - if (fileNameLower.StartsWith("multi:")) - { - fileName = fileName.Substring("multi:".Length); - return new MultiStream(fileName); - } - if (fileNameLower.StartsWith("filelist:")) - { - fileName = fileName.Substring("filelist:".Length); - return new MultiStream(fileName); - } - - // check for HTTP: - if (fileNameLower.StartsWith("http:") || fileNameLower.StartsWith("https:")) - { - // check for Azure Storage objects - AzureStorageIO azureStorage = new AzureStorageIO(); - if (azureStorage.BlockBlobExistsByUri(fileNameLower)) - { - return azureStorage.GetBlobStream(fileNameLower); - } - return new HttpStream(fileName); - } - - // check for SqlStream: - if (SqlTextReader.IsSqlTextReader(fileName)) - { - return new SqlTextReader(fileName).CreateStream(); - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(fileName)) - { - try - { - fileName = fileName.TrimEnd('$'); - return new InternalStoreStream(fileName); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamIn requires tstore.exe to be in the " + - "path for InternalStore reading."); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamIn requires tstore.exe to be in the " + - "path for InternalStore reading."); - } - } - - // remove trailing "$" - bool forceRaw = false; - if (fileName[fileName.Length - 1] == '$') - { - forceRaw = true; - fileName = fileName.Substring(0, fileName.Length - 1); - } - - // check for named stream: - // should this be based on file existance, first? - int cIndex = fileName.LastIndexOf(':'); - if (cIndex > 0) - { - if (File.Exists(fileName.Substring(0, cIndex))) - { - if (cIndex > 1 || - fileName.IndexOfAny(_pathSeparators, 2) < 0) - { - // named: - return new NamedStream(fileName, false); - } - } - } - - Stream s = null; - try - { - if (!forceRaw) - { - // check for compressed versions, if needed: - if (FallbackExtension != null) - { - if (!File.Exists(fileName)) - { - if (FallbackExtension.Length != 0) - { - if (File.Exists(fileName + FallbackExtension)) - { - fileName = fileName + FallbackExtension; - } - } - else - { - for (int i = 0; i < decompressionExtensions.Length; i++) - { - if (File.Exists(fileName + decompressionExtensions[i])) - { - fileName = fileName + decompressionExtensions[i]; - break; - } - } - } - } - } - - string ext = Path.GetExtension(fileName).ToLower(); - switch (ext) - { - case ".gz": - { - // try using gzip, fall back to 7zip, and fall back to SharpZipLib: - if (!_gzipFailure) - { -#if GZIP_UNBUFFERED - if (DefaultUnbuffered) - { - Stream sRaw = null; - try - { - sRaw = OpenUnbuffered(fileName); - try - { - s = new GzipDecodeStream(sRaw); - } - catch (InvalidOperationException) - { - gzipFailure = true; - try - { - if (sRaw != null) sRaw.Close(); - } - catch - { - } - } - catch (System.ComponentModel.Win32Exception) - { - gzipFailure = true; - try - { - if (sRaw != null) sRaw.Close(); - } - catch - { - } - } - } - catch - { - try - { - if (sRaw != null) sRaw.Close(); - } - catch - { - } - } - } - else - { - try - { - s = new GzipDecodeStream(fileName); - } - catch (InvalidOperationException) - { - gzipFailure = true; - } - catch (System.ComponentModel.Win32Exception) - { - gzipFailure = true; - } - } -#else - try - { - s = new GzipDecodeStream(fileName); - } - catch (InvalidOperationException) - { - _gzipFailure = true; - } - catch (System.ComponentModel.Win32Exception) - { - _gzipFailure = true; - } -#endif - } - if (s == null && !_gzip7ZFailure) - { - try - { - s = new Z7zDecodeStream(fileName); //, true); - } - catch (InvalidOperationException) - { - _gzip7ZFailure = true; - } - catch (System.ComponentModel.Win32Exception) - { - _gzip7ZFailure = true; - } - } - if (AllowLibraryFallback && s == null) - { - // this could support unbuffered, Cosmos, etc... *** - //// NOTE: - //// - .NET's gzip is very slow (30% or more longer) - //// - .NET's gzip is very large (30% larger compressed files) - //// - .NET's gzip breaks for files over 4 GB - // could wrap to get length, maybe fix 4GB problem... - //if (archiveName.EndsWith(".gz", StringComparison.OrdinalIgnoreCase)) - //{ - // return GzipEncodeStream.GetLengthTag(archiveName); - //} - - s = new System.IO.Compression.GZipStream( - new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), - System.IO.Compression.CompressionMode.Decompress); - } - if (s == null) - { - throw new InvalidOperationException("ZStreamIn requires gzip.exe, 7za.exe, or 7z.exe to be in the " + - "path for " + ext + " decompression, unless AllowLibraryFallback is set. " + - "See http://7-zip.org or http://gnuwin32.sourceforge.net/packages/gzip.htm"); - } - } - break; - - //case ".gz": - case ".7z": - case ".zip": - //case ".bzip2": - case ".bz2": - case ".z": - case ".tar": - { - try - { - s = new Z7zDecodeStream(fileName, true); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamIn requires 7z.exe or 7za.exe to be in the " + - "path for " + ext + " decompression. " + - "See http://7-zip.org"); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamIn requires 7z.exe or 7za.exe to be in the " + - "path for " + ext + " decompression. " + - "See http://7-zip.org"); - } - } - break; - - //case ".rar": - //case ".rpm": - //case ".deb": - case ".cab": - case ".arj": - case ".lzh": - case ".chm": - { - try - { - s = new Z7zDecodeStream(fileName, true); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamIn requires 7z.exe to be in the " + - "path for " + ext + " decompression. " + - "See http://7-zip.org"); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamIn requires 7z.exe to be in the " + - "path for " + ext + " decompression. " + - "See http://7-zip.org"); - } - } - break; - - case ".rar": - { - if (!_full7ZFailure) - { - try - { - s = new Z7zDecodeStream(fileName, true); - } - catch (InvalidOperationException) - { - _full7ZFailure = true; - } - catch (System.ComponentModel.Win32Exception) - { - _full7ZFailure = true; - } - } - if (s == null) - { - try - { - s = new RarDecodeStream(fileName); - } - catch (InvalidOperationException) - { - //unrarFailure = true; - throw new InvalidOperationException("ZStreamIn requires unrar.exe or 7z.exe to be in the " + - "path for " + ext + " decompression. " + - "See http://7-zip.org or http://rarsoft.com"); - } - catch (System.ComponentModel.Win32Exception) - { - //unrarFailure = true; - throw new InvalidOperationException("ZStreamIn requires unrar.exe or 7z.exe to be in the " + - "path for " + ext + " decompression. " + - "See http://7-zip.org or http://rarsoft.com"); - } - } - } - break; - -#if ENABLE_LZMA - case ".lzma": - { - try - { - s = new LzmaDecodeStream(fileName, false); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamIn requires lzma.exe to be in the " + - "path for " + ext + " decompression."); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamIn requires lzma.exe to be in the " + - "path for " + ext + " decompression."); - } - } - break; -#endif - } - - if (s == null && !File.Exists(fileName)) - { - // check for compressed archive as directory segment: - // *** TODO ! - // check for compressed archives in path: - // only one path segment is allowed to be an archive... - // normalize path: - //if (fileName[fileName.Length - 1] != '\\') fileName = fileName + "\\"; - string zfileName = fileName.Replace('/', '\\'); - bool isUnc = zfileName.StartsWith("\\\\"); - while (zfileName.IndexOf("\\\\") >= 0) - { - zfileName = zfileName.Replace("\\\\", "\\"); - } - if (isUnc) - zfileName = "\\" + zfileName; - string zfileNameLower = zfileName.ToLower(); - - string archPath = null; - string inArch = null; - // should this really be only archives?? *** - for (int i = 0; i < ZStreamIn.decompressionExtensions.Length; i++) - { - ext = ZStreamIn.decompressionExtensions[i]; - int seg = zfileNameLower.IndexOf(ext + "\\"); - if (seg > 0) - { - archPath = zfileName.Substring(0, seg + ext.Length); - if (File.Exists(archPath)) - { - inArch = zfileName.Substring(seg + ext.Length).Trim('/', '\\'); - break; - } - archPath = null; - } - } - if (archPath == null) - { - // add in extension to each segment... - string[] segs = zfileName.Split('\\'); - for (int i = 0; i < segs.Length; i++) - { - if (segs[i].Length == 0) - continue; - string partial = string.Join("\\", segs, 0, i + 1); - if (partial.Length == 2 && partial[1] == ':') - continue; - if (Directory.Exists(partial)) - continue; - // should this really be only archives?? *** - for (int c = 0; c < ZStreamIn.decompressionExtensions.Length; c++) - { - ext = ZStreamIn.decompressionExtensions[c]; - if (File.Exists(partial + ext)) - { - archPath = partial + ext; - inArch = string.Join("\\", segs, i + 1, segs.Length - i - 1).Trim('/', '\\'); - break; - } - } - // quit when parent will not exist - break; - } - } - if (archPath != null) - { - //Console.WriteLine(archPath + " :: " + inArch); - // check for path in archive. - inArch = inArch.Trim('\\'); - if (inArch.Length != 0) - { - // optimize for gzip and support unrar.exe: - if (Path.GetExtension(archPath).ToLower() == ".gz") - { - try - { - return Open(archPath); - } - catch (InvalidOperationException) - { - } - } - try - { - s = new Z7zDecodeStream(archPath, inArch); - } - catch (InvalidOperationException) - { - } - catch (System.ComponentModel.Win32Exception) - { - } - if (s == null && !Z7zDecodeStream.Exists7z && - Path.GetExtension(archPath).ToLower() == ".rar") - { - try - { - s = new RarDecodeStream(archPath, inArch); - } - catch (InvalidOperationException) - { - } - catch (System.ComponentModel.Win32Exception) - { - } - } - if (s == null) - { - throw new InvalidOperationException("ZStreamIn requires 7z.exe or 7za.exe to be in the " + - "path for " + ext + " decompression. " + - "See http://7-zip.org"); - } - } - } - } - } -#else - Stream s = null; - try - { -#endif - if (s == null) - { - // don't use unbuffered for small files: - if (!buffered && bufferedFallback) - { - try - { - long len = (new FileInfo(fileName)).Length; - if (len <= 2 * 8 * 1024 * 1024) - { - buffered = true; - } - } - catch - { - } - } - // unbuffered: - if (!buffered) - { -#if UNBUFFERED - // assume sequential and not async? *** - // why are we ignoring the async flag? - try - { - try - { - //return new BufferedStream(new UnbufferedStream(fileName), 8 * 1024 * 1024); - return new UnbufferedStream(fileName); - } - catch (UnbufferedStream.VirtualAllocException) - { - // always fallback on memory allocation failure: ? - //return Open(fileName, true, async); - throw; - } - } - catch - { - if (!bufferedFallback) - throw; - } - //if (BUFFER_SIZE > 0) - //{ - // return UnbufferedStream.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, - // true, async, 4 * BUFFER_SIZE); - //} - //else - //{ - // return UnbufferedStream.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, - // true, async, 64 * 1024); - //} -#else - throw new NotSupportedException("Unbuffered IO is not supported."); -#endif - } - - // buffered: - if (_bufferSize > 0) - { - s = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, _bufferSize); - } - else - { - s = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - } - } - return s; - } - catch - { - if (s != null) - { - try - { - s.Close(); - } - catch - { - } - } - throw; - } - } - - // private static FileStream OpenUnbufferedStream(string filename) - // { - //#if UNBUFFERED - // return UnbufferedStream.Open(filename, FileMode.Open, FileAccess.Read, FileShare.None, true, false, BUFFER_SIZE); - //#else - // throw new NotSupportedException("Unbuffered IO is not supported."); - //#endif - // } - -#if UNBUFFERED - -#if TLCFULLBUILD - /// - /// Open the specified file with normal file caching. - /// - /// name of the file to open - /// A Stream for the (possibly uncompressed) data - /// - /// - /// This method opens the file with system caching, regardless of the setting of - /// . - /// - /// - /// - ///

- /// Compressed files are recognized by extension and automatically decompressed. - /// Filenames that do not exist are checked to see if compressed versions exist; if so, - /// the compressed file is silently opened. (For example, "doc.txt.gz" will be used if - /// "doc.txt" is requested but does not exist). To read compressed files directly, - /// without decompression, append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console input. - /// - /// - /// URLs starting with "http://" or "https://" are downloaded with HTTP. - /// - /// - /// Names starting with "cosmos://" are fetched as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for reading text. - /// - /// - /// The form "sql:server/db/table" or "sql:server/db/{query}" refers to SQL Server. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. -#endif - public static Stream OpenBuffered(string fileName) - { - return Open(fileName, true); - } - - /// - /// Open the specified file (with unbuffered I/O, if possible). - /// - /// name of the file to open - /// A Stream for the data - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. This is the only way to get speeds over - /// 60 MB/sec or more on reading (350 MB/sec or more is possible on a good array). - /// - /// - /// While compressed files and special stream names will be understood, unbuffered I/O will - /// not be enabled on anything but simple files. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static Stream OpenUnbuffered(string fileName) - { - return OpenUnbuffered(fileName, false); - } - /// - /// Open the specified file (with unbuffered I/O, if possible). - /// - /// name of the file to open - /// whether to use asynchronous I/O - /// A Stream for the data - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. This is the only way to get speeds over - /// 60 MB/sec or more on reading (350 MB/sec or more is possible on a good array). - /// - /// - /// While compressed files and special stream names will be understood, unbuffered I/O will - /// not be enabled on anything but simple files. - /// - /// - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// The utilities needed to open a stream are not available. - public static Stream OpenUnbuffered(string fileName, bool async) - { - return Open(fileName, false, false, async); - } - -#endif - } - -#if TLCFULLBUILD - /// - /// Class to create output Streams that automatically compress based on the file extensions. - /// - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is fully buffered, - /// which may cause problems if the data is needed immediately - /// ( uses line buffering). - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - /// - /// Compression support relies on executable utilities to be in the path. - /// See for 7z.exe and 7za.exe (for - /// .7z, .gz), for gzip.exe - /// (for .gz). - /// - ///
-#else - /// - /// Class to create output Streams given file paths. - /// -#endif - public class ZStreamOut - { - private static int _compressionLevel = 6; - private static bool _defaultLowFragmentation = true; - private static bool _breakChunksAtLines = false; - - private static int _bufferSize = 32 * 1024; //64*1024; //-1; //64*1024; //32768; - - /// - /// Get or set the compression level (0 - 9) used for compressed streams. - /// - /// - ///

- /// The default is 1, which is the worst (but fastest) compression. - /// Setting a higher level can significantly improve the compression ratio, - /// especially for tighter compression methods (such as 7z), but the time - /// needed will increase. - ///

- ///

- /// If file size is a problem, raising this value can help. - ///

- ///

- /// A setting of 0 represents storing without compression for methods that - /// support this. - ///

- ///
- public static int CompressionLevel - { - get { return _compressionLevel; } - set { _compressionLevel = Math.Max(0, Math.Min(9, value)); } - } - - /// - /// Get or set whether the Open method should use a LowFragmentationStream for files. - /// true, by default. - /// - /// - /// The has strong advantages, increasing write - /// speed and decreasing fragmentation. - /// - public static bool DefaultLowFragmentation - { - get { return _defaultLowFragmentation; } - set { _defaultLowFragmentation = value; } - } - -#if TLCFULLBUILD - /// - /// Get or set whether to break at line boundaries when using chunked streams, - /// such as or . False by default, - /// unlike . - /// - /// - /// This will not necessarily have any effect. It is currently unimplemented in - /// , and most streams have no concept of chunks. - /// -#else - /// - /// Get or set whether to break at line boundaries when using chunked streams. - /// False by default. - /// - /// - /// This will not necessarily have any effect. Most streams have no concept of chunks. - /// -#endif - public static bool BreakChunksAtLines - { - get { return _breakChunksAtLines; } - set { _breakChunksAtLines = value; } - } - - internal static readonly string[] compressionArchiveExtensions = new string[] - { - // 7za: - ".7z" - //".zip", // broken - //".tar" // broken - }; - internal static readonly string[] compressionExtensions = new string[] - { - // 7za: - ".gz", - ".7z", - //".zip", // broken - //".tar", // broken - //".bzip2", - ".bz2", - }; - - /// - /// Gets the set of extensions (such as ".gz") that are accepted for compression. - /// - public static string[] CompressionExtensions - { - get - { - return (string[])compressionExtensions.Clone(); - } - } - - /// - /// Gets the set of extensions (such as ".7z") that are accepted for multi-file - /// archive compression. - /// - public static string[] CompressionArchiveExtensions - { - get - { - return (string[])compressionArchiveExtensions.Clone(); - } - } - - /// - /// Get whether to allow fallback to the compression library if executables - /// are not found in the path. false by default. Using the fallback may result in - /// slower performance and larger files. This setting is shared with ZStreamIn, - /// ZStreamOut, ZStreamReader, and ZStreamWriter. - /// - public static bool AllowLibraryFallback - { - get { return ZStreamIn.AllowLibraryFallback; } - set { ZStreamIn.AllowLibraryFallback = value; } - } - - private static readonly char[] _pathSeparators = new char[] { '/', '\\' }; - - private ZStreamOut() - { - } - -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// A Stream for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is fully buffered, - /// which may cause problems if the data is needed immediately - /// ( uses line buffering). - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid. - /// The utilities needed to open a stream are not available. -#endif - public static Stream Open(string fileName) - { - return Open(fileName, false); - } - -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// if true, append; if false, overwrite - /// A Stream for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is fully buffered, - /// which may cause problems if the data is needed immediately - /// ( uses line buffering). - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid, or appending cannot be done. - /// The utilities needed to open a stream are not available. - /// Append is specified, and fileName cannot be found. -#endif - public static Stream Open(string fileName, bool append) - { - return Open(fileName, append, BreakChunksAtLines); - } - public static Stream Open(string fileName, bool append, out string pathFull) - { - return Open(fileName, append, BreakChunksAtLines, out pathFull); - } -#if TLCFULLBUILD - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// if true, append; if false, overwrite - /// if true, break at line boundaries when using chunked streams - /// A Stream for the file - /// - ///

- /// Compressed files are recognized by extension and automatically compressed. - /// To write to a file with a compression extension directly, without compression, - /// append a "$" to the filename. - ///

- /// There are several special filenames: - /// - /// - /// The special names "nul" and "null" refer to an empty stream. - /// - /// - /// The special names "-" and "$" refer to the console output. Note that this is fully buffered, - /// which may cause problems if the data is needed immediately - /// ( uses line buffering). - /// - /// - /// Names starting with "cosmos://" are stored as Cosmos streams. - /// - /// - /// The name "clip:" refers to the clipboard, for writing text. - /// - /// - /// The form "sql:server/db/table" refers to SQL Server, for an existing table. - /// - /// - /// "multi:filename" or "filelist:filename" refers to a - /// list of other files. - /// - /// - /// Names ending with ":streamname" open the NTFS named stream "streamname". - /// - /// - ///
- /// fileName is null. - /// fileName is invalid, or appending cannot be done. - /// The utilities needed to open a stream are not available. - /// Append is specified, and fileName cannot be found. -#endif - public static Stream Open(string fileName, bool append, bool breakChunksAtLines) - { - string pathFull; - return Open(fileName, append, breakChunksAtLines, true, out pathFull); - } - public static Stream Open(string fileName, bool append, bool breakChunksAtLines, out string pathFull) - { - return Open(fileName, append, breakChunksAtLines, true, out pathFull); - } - - /// - /// Open the given file, accepting special stream names and decompressing by extension. - /// - /// file to write to - /// if true, append; if false, overwrite - /// if true, use buffered IO; if false, use unbuffered IO - /// if true, break at line boundaries when using chunked streams - /// A Stream for the file - /// fileName is null. - /// fileName is invalid, or appending cannot be done. - /// The utilities needed to open a stream are not available. - /// Append is specified, and fileName cannot be found. - private static Stream Open(string fileName, bool append, bool breakChunksAtLines, bool buffered, out string pathFull) - { - Contracts.CheckNonEmpty(fileName, nameof(fileName)); - - pathFull = null; - - // check for special names: - string fileNameLower = fileName.ToLower(); -#if TLCFULLBUILD - if (ZStreamIn.IsNullStream(fileName)) - { - //return new NullStream(true); - return Stream.Null; - } - if (ZStreamIn.IsConsoleStream(fileName)) - { - // buffer size is ignored for console streams! - // terrible perf for ReadByte(), by default - too many managed->unmanaged transitions. - // buffering, however, leads to problems with timing for some applications that expect - // streaming results. - - //return Console.OpenStandardOutput(); - - LineBufferedStream res = new LineBufferedStream(Console.OpenStandardOutput(), _bufferSize); - res.LineBuffer = false; - return res; - //return new BufferedStream(Console.OpenStandardOutput(), BUFFER_SIZE); - - //return new LineBufferedStream( - //new FileStream( - // new Microsoft.Win32.SafeHandles.SafeFileHandle(IOUtil.Win32.GetStdHandle(-11), false), - // FileAccess.Write, BUFFER_SIZE, false) - // ); - - //return new FileStream( - // new Microsoft.Win32.SafeHandles.SafeFileHandle(IOUtil.Win32.GetStdHandle(-11), false), - // FileAccess.Write, BUFFER_SIZE, false); - - //return new FileStream( - // new Microsoft.Win32.SafeHandles.SafeFileHandle(IOUtil.Win32.GetStdHandle(-11), false), - // FileAccess.Write, 1, false); - } - // check for clipboard: - if (ClipboardReadStream.IsClipboardStream(fileName)) - { - return new ClipboardWriteStream(append); - } - - // check for Cosmos: - if (fileNameLower.StartsWith("cosmos:")) - { - try - { - // no compression support, anyway... - fileName = fileName.TrimEnd('$'); - return new CosmosWriteStream(fileName, append, breakChunksAtLines); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamIn requires cosmos.cmd to be in the " + - "path for Cosmos reading."); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamIn requires cosmos.cmd to be in the " + - "path for Cosmos reading."); - } - } - - // check for Multistream: - if (fileNameLower.StartsWith("multi:")) - { - fileName = fileName.Substring("multi:".Length); - return new MultiStream(fileName, true); - } - if (fileNameLower.StartsWith("filelist:")) - { - fileName = fileName.Substring("filelist:".Length); - return new MultiStream(fileName, true); - } - - // check for Azure Storage objects - //AzureStorageIO.AzureStorageIdentificationStructure azureStorageIdentificationStructure = - // new AzureStorageIO.AzureStorageIdentificationStructure(fileName); - //if (azureStorageIdentificationStructure.IsAzureStorageObject()) - //{ - // return AzureStorageIO.GetBlobStreamFromBlob(azureStorageIdentificationStructure) as Stream; - //} - - if (fileNameLower.StartsWith("http:") || fileNameLower.StartsWith("https:")) - { - AzureStorageIO azureStorage = new AzureStorageIO(); - return azureStorage.GetBlobStreamForWriting(fileNameLower); - - } - - // check for SqlStream: - if (SqlTextReader.IsSqlTextReader(fileName)) - { - return new SqlTextWriter(fileName).CreateStream(); - } - - // check for InternalStore: - if (InternalStoreUtility.IsInternalStore(fileName)) - { - throw new NotSupportedException("Cannot write to a InternalStore."); - } - - // remove trailing "$" - bool forceRaw = false; - if (fileName[fileName.Length - 1] == '$') - { - forceRaw = true; - fileName = fileName.Substring(0, fileName.Length - 1); - } - - // check for named stream: - // should this be based on file existance, first? - int cIndex = fileName.LastIndexOf(':'); - if (cIndex > 0) - { - // does not really need to exist... - //if (File.Exists(fileName.Substring(0, cIndex))) - //{ - if (cIndex > 1 || - fileName.IndexOfAny(_pathSeparators, 2) < 0) - { - // named: - return new NamedStream(fileName, true, append); - } - //} - } - - Stream s = null; - if (!forceRaw) - { - string ext = Path.GetExtension(fileName).ToLower(); - // use special cases for efficiency: - switch (ext) - { - case ".gz": - { - // appending really could be enabled... *** - //bool failed = false; - if (append) - throw new ArgumentException("Cannot append to a gz stream.", "append"); - try - { - s = new GzipEncodeStream(fileName, CompressionLevel); - } - catch (InvalidOperationException) - { - //failed = true; - } - catch (System.ComponentModel.Win32Exception) - { - //failed = true; - } - if (s == null) - { - try - { - s = new Z7zEncodeStream(fileName, Z7zEncodeStream.CompressionFormat.Gzip, CompressionLevel); - } - catch (InvalidOperationException) - { - if (!AllowLibraryFallback) - { - // should fallback here if SharpZip is used!! *** - throw new InvalidOperationException("ZStreamOut requires 7za.exe, 7z.exe, or gzip.exe to be in the " + - "path for " + ext + " compression, unless AllowLibraryFallback is set. " + - "See http://7-zip.org"); - } - } - catch (System.ComponentModel.Win32Exception) - { - if (!AllowLibraryFallback) - { - // should fallback here if SharpZip is used!! *** - throw new InvalidOperationException("ZStreamOut requires 7za.exe, 7z.exe, or gzip.exe to be in the " + - "path for " + ext + " compression, unless AllowLibraryFallback is set. " + - "See http://7-zip.org"); - } - } - } - if (AllowLibraryFallback && s == null) - { - // this could support unbuffered, Cosmos, etc... *** - //// NOTE: - //// - .NET's gzip is very slow (30% or more longer) - //// - .NET's gzip is very large (30% larger compressed files) - //// - .NET's gzip breaks for files over 4 GB - //// - Huffman trees are hard-coded and poor - binary data often *inflates* - //// - Position and Length are not supported - //// - Seeking is not supported - //// - Compression and decompression are not parallelized - s = new System.IO.Compression.GZipStream( - //new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read), - ZStreamOut.Open(fileName + "$"), - System.IO.Compression.CompressionMode.Compress); - // without a buffer, this is even worse... - s = new BufferedStream(s, 32 * 1024); - } - //if (s == null) - //{ - // throw new IOException("Cannot open file '" + fileName + "'"); - //} - } - break; - - //case ".gz": - //case ".zip": // broken!! - //case ".tar": // broken!! - case ".7z": - //case ".bzip2": - case ".bz2": - { - if (append) - throw new ArgumentException("Cannot append to a 7z stream.", "append"); - try - { - s = new Z7zEncodeStream(fileName, CompressionLevel); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamOut requires 7z.exe or 7za.exe to be in the " + - "path for " + ext + " compression. " + - "See http://7-zip.org"); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamOut requires 7z.exe or 7za.exe to be in the " + - "path for " + ext + " compression. " + - "See http://7-zip.org"); - } - } - break; - - // Doesn't work currently in 7-zip: - //case ".zip": - // { - // if (append) throw new ArgumentException("Cannot append to a zip stream.", "append"); - // try - // { - // s = new Z7zEncodeStream(fileName, "zip"); - // } - // catch (InvalidOperationException) - // { - // throw new InvalidOperationException("ZStreamOut requires 7za.exe to be in the " + - // "path for " + ext + " compression. " + - // "See http://7-zip.org"); - // } - // catch (System.ComponentModel.Win32Exception) - // { - // throw new InvalidOperationException("ZStreamOut requires 7za.exe to be in the " + - // "path for " + ext + " compression. " + - // "See http://7-zip.org"); - // } - // } - // break; - -#if ENABLE_LZMA - case ".lzma": - { - if (append) throw new ArgumentException("Cannot append to an lzma stream.", "append"); - try - { - s = new LzmaEncodeStream(fileName, true); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamOut requires lzma.exe to be in the " + - "path for " + ext + " compression."); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamOut requires lzma.exe to be in the " + - "path for " + ext + " compression."); - } - } - break; -#endif - } - - if (s == null) - { - // check for compressed archive as directory segment: - // *** TODO ! - // check for compressed archives in path: - // only one path segment is allowed to be an archive... - // normalize path: - //if (fileName[fileName.Length - 1] != '\\') fileName = fileName + "\\"; - string zfileName = fileName.Replace('/', '\\'); - bool isUnc = zfileName.StartsWith("\\\\"); - while (zfileName.IndexOf("\\\\") >= 0) - { - zfileName = zfileName.Replace("\\\\", "\\"); - } - if (isUnc) - zfileName = "\\" + zfileName; - string zfileNameLower = zfileName.ToLower(); - - string archPath = null; - string inArch = null; - // this could be a problem... We can't write to non-archives in this way... - for (int i = 0; i < ZStreamIn.decompressionArchiveExtensions.Length; i++) - { - ext = ZStreamIn.decompressionArchiveExtensions[i]; - int seg = zfileNameLower.IndexOf(ext + "\\"); - if (seg > 0) - { - archPath = zfileName.Substring(0, seg + ext.Length); - //if (File.Exists(archPath)) - //{ - inArch = zfileName.Substring(seg + ext.Length).Trim('/', '\\'); - break; - //} - //archPath = null; - } - } - if (archPath != null) - { - //Console.WriteLine(archPath + " :: " + inArch); - // check for path in archive. - inArch = inArch.Trim('\\'); - if (inArch.Length != 0) - { - // what about unrar, etc? **** - try - { - s = new Z7zEncodeStream(archPath, inArch, CompressionLevel); - } - catch (InvalidOperationException) - { - throw new InvalidOperationException("ZStreamIn requires 7z.exe or 7za.exe to be in the " + - "path for " + ext + " compression. " + - "See http://7-zip.org"); - } - catch (System.ComponentModel.Win32Exception) - { - throw new InvalidOperationException("ZStreamIn requires 7z.exe or 7za.exe to be in the " + - "path for " + ext + " compression. " + - "See http://7-zip.org"); - } - } - } - } - } -#else - Stream s = null; -#endif - if (s == null) - { - // Report the full path. - pathFull = Path.GetFullPath(fileName); - - if (DefaultLowFragmentation) - { - if (_bufferSize > 0) - { - s = new LowFragmentationStream(fileName, append, _bufferSize); - } - else - { - s = new LowFragmentationStream(fileName, append); - } - } - else - { - if (_bufferSize > 0) - { - s = new FileStream(fileName, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, _bufferSize); - } - else - { - s = new FileStream(fileName, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read); - } - } - } - return s; - } - -#if UNBUFFERED - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// A Stream for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - public static Stream OpenUnbuffered(string fileName) - { - return OpenUnbuffered(fileName, false); - } - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// if true, append; if false, overwrite - /// A Stream for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - public static Stream OpenUnbuffered(string fileName, bool append) - { - return OpenUnbuffered(fileName, append, BreakChunksAtLines); - } - - /// - /// Open the given file (unbuffered, if possible). - /// - /// file to write to - /// if true, append; if false, overwrite - /// if true, break at line boundaries when using chunked streams - /// A Stream for the file - /// - /// - /// Unbuffered I/O can give better performance, especially on fast RAID arrays. - /// It does not use the system file cache. However, for writing, this currently - /// has no effect. - /// - /// - public static Stream OpenUnbuffered(string fileName, bool append, bool breakChunksAtLines) - { - string pathFull; - return Open(fileName, append, breakChunksAtLines, false, out pathFull); - } - -#endif - } - - #endregion - - #region Var - /// - /// Convenience type to represent a value that should be easily converted. - /// - /// - /// - /// Var instance are immutable. - /// - /// - /// In the current form, Var is not very efficient - the value is always stored - /// internally as a string, and it is a reference type. - /// - /// - /// A Var will implicitly convert to and from primitive numerical types, as well as - /// , , and . It can also be compared for - /// equality or order with those types. Comparisons are performed by converting the - /// Var to the type of the other value (for example, comparing to 123 will cause a - /// numerical comparison, while "123" will cause a string comparison). - /// - /// - /// Numbers will be parsed properly if they contain commas, are in exponential notation, - /// or have surrounding whitespace. Hex numbers can be specified by starting with "0x" - /// or "-0x". - /// - /// - /// String methods can be used directly, without casting the value. - /// - /// - public class Var : - IEquatable, IEquatable, IEquatable, IEquatable, - IEquatable, IEquatable, IEquatable, IEquatable, - IEquatable, IEquatable, IEquatable, IEquatable, - IEquatable, IEquatable, IEquatable, IEquatable, - IComparable, IComparable, IComparable, IComparable, - IComparable, IComparable, IComparable, IComparable, - IComparable, IComparable, IComparable, IComparable, - IComparable, IComparable, IComparable, IComparable, - IEnumerable, - IComparable, IEnumerable, IConvertible - { - private string _raw; - - /// - /// Create a new Var, based on the string representation. - /// - /// the string representation - public Var(string raw) - { - _raw = raw; - } - - /// - /// Convert the specified Var to a string. - /// - /// the value to convert - /// the string version of the value - public static implicit operator string(Var v) - { - return v._raw; - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(string s) - { - return new Var(s); - } - - /// - /// Convert the specified Var to an int. - /// - /// the value to convert - /// the int version of the value - public static implicit operator int(Var v) - { - return ParseInt32(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(int n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a uint. - /// - /// the value to convert - /// the uint version of the value - public static implicit operator uint(Var v) - { - return ParseUInt32(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(uint n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a long. - /// - /// the value to convert - /// the long version of the value - public static implicit operator long(Var v) - { - return ParseInt64(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(long n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a ulong. - /// - /// the value to convert - /// the ulong version of the value - public static implicit operator ulong(Var v) - { - return ParseUInt64(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(ulong n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a short. - /// - /// the value to convert - /// the short version of the value - public static implicit operator short(Var v) - { - return ParseInt16(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(short n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a ushort. - /// - /// the value to convert - /// the ushort version of the value - public static implicit operator ushort(Var v) - { - return ParseUInt16(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(ushort n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a byte. - /// - /// the value to convert - /// the byte version of the value - public static implicit operator byte(Var v) - { - return ParseByte(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(byte n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a sbyte. - /// - /// the value to convert - /// the sbyte version of the value - public static implicit operator sbyte(Var v) - { - return ParseSByte(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(sbyte n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a float. - /// - /// the value to convert - /// the float version of the value - public static implicit operator float(Var v) - { - return ParseSingle(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(float n) - { - return new Var(n.ToString("R")); - } - - /// - /// Convert the specified Var to a double. - /// - /// the value to convert - /// the double version of the value - public static implicit operator double(Var v) - { - return ParseDouble(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(double n) - { - return new Var(n.ToString("R")); - } - - /// - /// Convert the specified Var to a char. - /// - /// the value to convert - /// the char version of the value - public static implicit operator char(Var v) - { - return v._raw == null || v._raw.Length == 0 ? '\0' : v._raw[0]; - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(char c) - { - return new Var(c.ToString()); - } - - /// - /// Convert the specified Var to a decimal. - /// - /// the value to convert - /// the decimal version of the value - public static implicit operator decimal(Var v) - { - return v._raw == null || v._raw.Length == 0 ? decimal.Zero : decimal.Parse(v._raw); - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(decimal n) - { - return new Var(n.ToString()); - } - - /// - /// Convert the specified Var to a bool. - /// - /// the value to convert - /// the bool version of the value - public static implicit operator bool(Var v) - { - return v._raw != null && v._raw != "0" && string.Compare(v._raw, "false", true) != 0; - } - /// - /// Convert the specified value to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(bool b) - { - return new Var(b ? "1" : null); - } - - /// - /// Convert the specified Var to a Guid. - /// - /// the value to convert - /// the Guid version of the value - public static implicit operator Guid(Var v) - { - //return v.raw == null || v.raw.Length == 0 ? Guid.Empty : new Guid(v.raw); - if (v._raw == null || v._raw.Length == 0) - return Guid.Empty; - - string s = v._raw; - if (s.Length == 32) - { - // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - s = s.Substring(0, 8) + "-" + s.Substring(8, 4) + "-" + s.Substring(12, 4) + "-" + s.Substring(16, 4) + "-" + s.Substring(20); - // OK, maybe that's not the most efficient... - } - return new Guid(s); - } - /// - /// Convert the specified Guid to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(Guid g) - { - return new Var(g.ToString()); - } - - /// - /// Convert the specified Var to a DateTime. - /// - /// the value to convert - /// the DateTime version of the value - public static implicit operator DateTime(Var v) - { - return v._raw == null || v._raw.Length == 0 ? DateTime.MinValue : - DateTime.Parse(v._raw, null, - System.Globalization.DateTimeStyles.AllowWhiteSpaces | - System.Globalization.DateTimeStyles.NoCurrentDateDefault - ); - } - /// - /// Convert the specified DateTime to a Var. - /// - /// the value to convert - /// the Var version of the value - public static implicit operator Var(DateTime d) - { - return new Var(d.ToString()); - } - - // array conversions might be nice... *** - - ///// - ///// Convert an array of values. - ///// - ///// the values to convert - ///// the converted array - ///// - ///// This is not very good as an implicit cast, because it can be expensive - ///// and it causes heap allocation. However, it is allowed for convenience. - ///// - //public static implicit operator string[](VarList vals) - //{ - // if (vals == null) return null; - // string[] res = new string[vals.Length]; - // vals.CopyTo(res, 0); - // return res; - //} - - /// - /// Convert an array of values. - /// - /// the array to convert - /// the converted array - public static string[] Convert(Var[] vals) - { - if (vals == null) - return null; - string[] res = new string[vals.Length]; - for (int i = 0; i < vals.Length; i++) - { - res[i] = vals[i] == null ? null : (string)vals[i]; - } - return res; - } - /// - /// Convert an array of values. - /// - /// the array to convert - /// the converted array - public static Var[] Convert(string[] vals) - { - if (vals == null) - return null; - Var[] res = new Var[vals.Length]; - for (int i = 0; i < vals.Length; i++) - { - res[i] = new Var(vals[i]); - } - return res; - } - - /// - /// Return the string representation of this value. - /// - /// the string representation of this value - public override string ToString() - { - // leave null? - return _raw; - } - - private static long ParseInt64(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToInt64(s, 16); - } - if (s.Length > 3 && s[0] == '-' && s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) - { - return -System.Convert.ToInt64(s.Substring(3), 16); - } - return long.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static ulong ParseUInt64(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToUInt64(s, 16); - } - return ulong.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static int ParseInt32(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToInt32(s, 16); - } - if (s.Length > 3 && s[0] == '-' && s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) - { - checked - { - return (int)(-System.Convert.ToInt64(s.Substring(3), 16)); - } - } - return int.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static uint ParseUInt32(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToUInt32(s, 16); - } - return uint.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static short ParseInt16(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToInt16(s, 16); - } - if (s.Length > 3 && s[0] == '-' && s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) - { - checked - { - return (short)(-System.Convert.ToInt32(s.Substring(3), 16)); - } - } - return short.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static ushort ParseUInt16(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToUInt16(s, 16); - } - return ushort.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static sbyte ParseSByte(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToSByte(s, 16); - } - if (s.Length > 3 && s[0] == '-' && s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) - { - checked - { - return (sbyte)(-System.Convert.ToInt32(s.Substring(3), 16)); - } - } - return sbyte.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static byte ParseByte(string s) - { - // could be many times faster... - if (s == null) - return 0; - s = s.Trim(); - if (s.Length == 0) - return 0; - try - { - if (s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - { - return System.Convert.ToByte(s, 16); - } - return byte.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static float ParseSingle(string s) - { - // could be many times faster... - if (s == null) - return 0.0F; - s = s.Trim(); - if (s.Length == 0) - return 0.0F; - try - { - if ((s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) || - (s.Length > 3 && s[0] == '-' && s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))) - { - checked - { - return (float)ParseInt64(s); - } - } - return float.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - private static double ParseDouble(string s) - { - // could be many times faster... - if (s == null) - return 0.0; - s = s.Trim(); - if (s.Length == 0) - return 0.0; - try - { - if ((s.Length > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) || - (s.Length > 3 && s[0] == '-' && s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))) - { - checked - { - return (double)ParseInt64(s); - } - } - return double.Parse(s, System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowLeadingSign | System.Globalization.NumberStyles.AllowDecimalPoint); - } - catch (Exception ex) - { - if (ex is InvalidCastException || ex is FormatException || ex is OverflowException) - throw Contracts.ExceptDecode("String cannot be converted to integer: '{0}'", s); - throw; - } - } - - //private bool IsInteger() - //{ - // if (raw == null || raw.Length == 0) return false; - // int i = 0; - // if (raw[0] == '-') - // { - // - // } - // bool first = true; - // foreach (char c in raw) - // { - // first = false; - // } - //} - //private bool IsNumerical() - //{ - //} - - /// Returns the hash code for this value. - /// A 32-bit signed integer hash code. - public override int GetHashCode() - { - // this may be bad - numbers have many string representations... *** - return _raw == null ? 0 : _raw.GetHashCode(); - } - - #region Comparisons - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public override bool Equals(object obj) - { - if (obj is Var) - { - return Equals((Var)obj); - } - else if (obj is string) - { - return Equals((string)obj); - } - else if (obj is double) - { - return Equals((double)obj); - } - else if (obj is float) - { - return Equals((float)obj); - } - else if (obj is int) - { - return Equals((int)obj); - } - else if (obj is uint) - { - return Equals((uint)obj); - } - else if (obj is long) - { - return Equals((long)obj); - } - else if (obj is ulong) - { - return Equals((ulong)obj); - } - else if (obj is short) - { - return Equals((short)obj); - } - else if (obj is ushort) - { - return Equals((ushort)obj); - } - else if (obj is byte) - { - return Equals((byte)obj); - } - else if (obj is sbyte) - { - return Equals((sbyte)obj); - } - else if (obj is char) - { - return Equals((char)obj); - } - else if (obj is decimal) - { - return Equals((decimal)obj); - } - else if (obj is Guid) - { - return Equals((Guid)obj); - } - else if (obj is DateTime) - { - return Equals((DateTime)obj); - } - return false; - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(Var obj) - { - if (_raw == null) - { - return obj == null || obj._raw == null; - } - return Equals(obj._raw); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(string obj) - { - return string.CompareOrdinal(_raw, obj) == 0; - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(double obj) - { - return ((double)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(float obj) - { - return ((double)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(int obj) - { - return ((long)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(uint obj) - { - return ((long)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(long obj) - { - return ((long)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(ulong obj) - { - return ((ulong)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(short obj) - { - return ((long)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(ushort obj) - { - return ((long)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(byte obj) - { - return ((long)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(sbyte obj) - { - return ((long)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(char obj) - { - return ((char)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(decimal obj) - { - return ((decimal)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(Guid obj) - { - return ((Guid)this).Equals(obj); - } - /// Determines whether this instance and a specified value are the same. - /// true if obj is the same as this instance; otherwise, false. - /// the value to compare to - public bool Equals(DateTime obj) - { - return ((DateTime)this).Equals(obj); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, Var v2) - { - // this may be bad - numbers have many string representations... *** - if ((object)v1 == null) - return (object)v2 == null; - if ((object)v2 == null) - return false; - return v1.Equals(v2); - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, long v2) - { - if ((object)v1 == null) - return v2 == 0; - return (long)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, long v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(long v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(long v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, ulong v2) - { - if ((object)v1 == null) - return v2 == 0; - return (ulong)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, ulong v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(ulong v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(ulong v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, int v2) - { - if ((object)v1 == null) - return v2 == 0; - return (long)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, int v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(int v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(int v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, uint v2) - { - if ((object)v1 == null) - return v2 == 0; - return (long)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, uint v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(uint v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(uint v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, short v2) - { - if ((object)v1 == null) - return v2 == 0; - return (long)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, short v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(short v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(short v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, ushort v2) - { - if ((object)v1 == null) - return v2 == 0; - return (long)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, ushort v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(ushort v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(ushort v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, byte v2) - { - if ((object)v1 == null) - return v2 == 0; - return (long)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, byte v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(byte v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(byte v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, sbyte v2) - { - if ((object)v1 == null) - return v2 == 0; - return (long)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, sbyte v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(sbyte v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(sbyte v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, decimal v2) - { - if ((object)v1 == null) - return v2 == 0; - return (decimal)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, decimal v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(decimal v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(decimal v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, float v2) - { - if ((object)v1 == null) - return v2 == 0; - return (double)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, float v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(float v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(float v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, double v2) - { - if ((object)v1 == null) - return v2 == 0; - return (double)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, double v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(double v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(double v1, Var v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, Guid v2) - { - if ((object)v1 == null) - return v2 == Guid.Empty; - return (Guid)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, Guid v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(Var v1, DateTime v2) - { - if ((object)v1 == null) - return v2 == DateTime.MinValue; - return (DateTime)v1 == v2; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(Var v1, DateTime v2) - { - return !(v1 == v2); - } - /// Determines whether the specified values are the same. - /// true if v1 is the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator ==(DateTime v1, Var v2) - { - return v2 == v1; - } - /// Determines whether the specified values are not the same. - /// true if v1 is not the same as v2; otherwise, false. - /// the first value - /// the second value - public static bool operator !=(DateTime v1, Var v2) - { - return !(v1 == v2); - } - - int IComparable.CompareTo(object obj) - { - if (obj == null) - return _raw == null ? 0 : 1; - if (obj is Var) - { - return CompareTo((Var)obj); - } - else if (obj is string) - { - return CompareTo((string)obj); - } - else if (obj is double) - { - return CompareTo((double)obj); - } - else if (obj is float) - { - return CompareTo((float)obj); - } - else if (obj is int) - { - return CompareTo((int)obj); - } - else if (obj is uint) - { - return CompareTo((uint)obj); - } - else if (obj is long) - { - return CompareTo((long)obj); - } - else if (obj is ulong) - { - return CompareTo((ulong)obj); - } - else if (obj is short) - { - return CompareTo((short)obj); - } - else if (obj is ushort) - { - return CompareTo((ushort)obj); - } - else if (obj is byte) - { - return CompareTo((byte)obj); - } - else if (obj is sbyte) - { - return CompareTo((sbyte)obj); - } - else if (obj is char) - { - return CompareTo((char)obj); - } - else if (obj is decimal) - { - return CompareTo((decimal)obj); - } - else if (obj is Guid) - { - return CompareTo((Guid)obj); - } - else if (obj is DateTime) - { - return CompareTo((DateTime)obj); - } - return -1; - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(Var obj) - { - // possibly should use numerical if both are numerical... - if (obj == null) - return _raw == null ? 0 : 1; - return CompareTo(obj._raw); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(string obj) - { - return string.CompareOrdinal(_raw, obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(double obj) - { - return ((double)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(float obj) - { - return ((double)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(int obj) - { - return ((long)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(uint obj) - { - return ((long)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(long obj) - { - return ((long)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(ulong obj) - { - return ((ulong)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(short obj) - { - return ((long)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(ushort obj) - { - return ((long)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(byte obj) - { - return ((long)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(sbyte obj) - { - return ((long)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(char obj) - { - return ((char)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(decimal obj) - { - return ((decimal)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(Guid obj) - { - return ((Guid)this).CompareTo(obj); - } - /// Compares this instance with a specified value. - /// - /// A 32-bit signed integer indicating the lexical relationship between the two comparands. - /// negative if this instance is less than obj, zero if this instance is equal to obj, - /// positive if this instance is greater than obj. - /// - /// the value to compare to - public int CompareTo(DateTime obj) - { - return ((DateTime)this).CompareTo(obj); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, Var v2) - { - if ((object)v2 == null) - return false; - if ((object)v1 == null) - return v2._raw != null; - return v1.CompareTo(v2) < 0; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, Var v2) - { - if ((object)v1 == null) - return false; - if ((object)v2 == null) - return v1._raw != null; - return v2.CompareTo(v1) < 0; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, long v2) - { - long vv1 = ((object)v1 == null) ? 0 : (long)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, long v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, long v2) - { - long vv1 = ((object)v1 == null) ? 0 : (long)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, long v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(long v1, Var v2) - { - long vv2 = ((object)v2 == null) ? 0 : (long)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(long v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(long v1, Var v2) - { - long vv2 = ((object)v2 == null) ? 0 : (long)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(long v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, ulong v2) - { - ulong vv1 = ((object)v1 == null) ? 0 : (ulong)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, ulong v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, ulong v2) - { - ulong vv1 = ((object)v1 == null) ? 0 : (ulong)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, ulong v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(ulong v1, Var v2) - { - ulong vv2 = ((object)v2 == null) ? 0 : (ulong)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(ulong v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(ulong v1, Var v2) - { - ulong vv2 = ((object)v2 == null) ? 0 : (ulong)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(ulong v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, int v2) - { - int vv1 = ((object)v1 == null) ? 0 : (int)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, int v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, int v2) - { - int vv1 = ((object)v1 == null) ? 0 : (int)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, int v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(int v1, Var v2) - { - int vv2 = ((object)v2 == null) ? 0 : (int)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(int v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(int v1, Var v2) - { - int vv2 = ((object)v2 == null) ? 0 : (int)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(int v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, uint v2) - { - uint vv1 = ((object)v1 == null) ? 0 : (uint)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, uint v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, uint v2) - { - uint vv1 = ((object)v1 == null) ? 0 : (uint)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, uint v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(uint v1, Var v2) - { - uint vv2 = ((object)v2 == null) ? 0 : (uint)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(uint v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator >(uint v1, Var v2) - { - uint vv2 = ((object)v2 == null) ? 0 : (uint)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(uint v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, short v2) - { - short vv1 = ((object)v1 == null) ? (short)0 : (short)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, short v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, short v2) - { - short vv1 = ((object)v1 == null) ? (short)0 : (short)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, short v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(short v1, Var v2) - { - short vv2 = ((object)v2 == null) ? (short)0 : (short)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(short v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(short v1, Var v2) - { - short vv2 = ((object)v2 == null) ? (short)0 : (short)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(short v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, ushort v2) - { - ushort vv1 = ((object)v1 == null) ? (ushort)0 : (ushort)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, ushort v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, ushort v2) - { - ushort vv1 = ((object)v1 == null) ? (ushort)0 : (ushort)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, ushort v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(ushort v1, Var v2) - { - ushort vv2 = ((object)v2 == null) ? (ushort)0 : (ushort)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(ushort v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(ushort v1, Var v2) - { - ushort vv2 = ((object)v2 == null) ? (ushort)0 : (ushort)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(ushort v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, byte v2) - { - byte vv1 = ((object)v1 == null) ? (byte)0 : (byte)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, byte v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, byte v2) - { - byte vv1 = ((object)v1 == null) ? (byte)0 : (byte)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, byte v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(byte v1, Var v2) - { - byte vv2 = ((object)v2 == null) ? (byte)0 : (byte)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(byte v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(byte v1, Var v2) - { - byte vv2 = ((object)v2 == null) ? (byte)0 : (byte)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(byte v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, sbyte v2) - { - sbyte vv1 = ((object)v1 == null) ? (sbyte)0 : (sbyte)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, sbyte v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, sbyte v2) - { - sbyte vv1 = ((object)v1 == null) ? (sbyte)0 : (sbyte)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, sbyte v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(sbyte v1, Var v2) - { - sbyte vv2 = ((object)v2 == null) ? (sbyte)0 : (sbyte)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(sbyte v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(sbyte v1, Var v2) - { - sbyte vv2 = ((object)v2 == null) ? (sbyte)0 : (sbyte)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(sbyte v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, decimal v2) - { - decimal vv1 = ((object)v1 == null) ? 0 : (decimal)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, decimal v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, decimal v2) - { - decimal vv1 = ((object)v1 == null) ? 0 : (decimal)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, decimal v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(decimal v1, Var v2) - { - decimal vv2 = ((object)v2 == null) ? 0 : (decimal)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(decimal v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(decimal v1, Var v2) - { - decimal vv2 = ((object)v2 == null) ? 0 : (decimal)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(decimal v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, Guid v2) - { - Guid vv1 = ((object)v1 == null) ? Guid.Empty : (Guid)v1; - return vv1.CompareTo(v2) < 0; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, Guid v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, Guid v2) - { - Guid vv1 = ((object)v1 == null) ? Guid.Empty : (Guid)v1; - return vv1.CompareTo(v2) > 0; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, Guid v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Guid v1, Var v2) - { - Guid vv2 = ((object)v2 == null) ? Guid.Empty : (Guid)v2; - return v1.CompareTo(vv2) < 0; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Guid v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Guid v1, Var v2) - { - Guid vv2 = ((object)v2 == null) ? Guid.Empty : (Guid)v2; - return v1.CompareTo(vv2) > 0; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Guid v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, DateTime v2) - { - DateTime vv1 = ((object)v1 == null) ? DateTime.MinValue : (DateTime)v1; - return vv1.CompareTo(v2) < 0; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, DateTime v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, DateTime v2) - { - DateTime vv1 = ((object)v1 == null) ? DateTime.MinValue : (DateTime)v1; - return vv1.CompareTo(v2) > 0; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, DateTime v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(DateTime v1, Var v2) - { - DateTime vv2 = ((object)v2 == null) ? DateTime.MinValue : (DateTime)v2; - return v1.CompareTo(vv2) < 0; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(DateTime v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(DateTime v1, Var v2) - { - DateTime vv2 = ((object)v2 == null) ? DateTime.MinValue : (DateTime)v2; - return v1.CompareTo(vv2) > 0; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(DateTime v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, float v2) - { - float vv1 = ((object)v1 == null) ? 0 : (float)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, float v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, float v2) - { - float vv1 = ((object)v1 == null) ? 0 : (float)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, float v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(float v1, Var v2) - { - float vv2 = ((object)v2 == null) ? 0 : (float)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(float v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(float v1, Var v2) - { - float vv2 = ((object)v2 == null) ? 0 : (float)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(float v1, Var v2) - { - return !(v1 > v2); - } - - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(Var v1, double v2) - { - double vv1 = ((object)v1 == null) ? 0 : (double)v1; - return vv1 < v2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(Var v1, double v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(Var v1, double v2) - { - double vv1 = ((object)v1 == null) ? 0 : (double)v1; - return vv1 > v2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(Var v1, double v2) - { - return !(v1 > v2); - } - /// Compares two values. - /// true if v1 < v2; false otherwise - /// the first value - /// the second value - public static bool operator <(double v1, Var v2) - { - double vv2 = ((object)v2 == null) ? 0 : (double)v2; - return v1 < vv2; - } - /// Compares two values. - /// true if v1 >= v2; false otherwise - /// the first value - /// the second value - public static bool operator >=(double v1, Var v2) - { - return !(v1 < v2); - } - /// Compares two values. - /// true if v1 > v2; false otherwise - /// the first value - /// the second value - public static bool operator >(double v1, Var v2) - { - double vv2 = ((object)v2 == null) ? 0 : (double)v2; - return v1 > vv2; - } - /// Compares two values. - /// true if v1 <= v2; false otherwise - /// the first value - /// the second value - public static bool operator <=(double v1, Var v2) - { - return !(v1 > v2); - } - #endregion - - /// - /// Negate the value. - /// - /// the value to negate - /// the negated value - public static Var operator -(Var v) - { - if (v == null) - return null; - if (v._raw == null || v._raw.Length == 0) - return new Var(v._raw); - string s = v._raw.Trim(); - if (s.Length != 0) - { - s = (s[0] == '-') ? s.Substring(1) : "-" + s; - } - return new Var(s); - } - - /// - /// Negate the value. - /// - /// the value to negate - /// the negated value - public static Var operator !(Var v) - { - if (v == null) - return null; - return (Var)(!((bool)v)); - } - - /// - /// Increment the value. - /// - /// the value to increment - /// the incremented value - public static Var operator ++(Var v) - { - if (v == null) - return null; - if (v._raw == null || v._raw.Length == 0 || v._raw == "0") - return (Var)1; - // how to guess the type? *** - //char? - // ugly... - if (v._raw.Length == 1 && (v._raw[0] < '0' || v._raw[0] > '9')) - { - return (Var)((char)v + 1); - } - // decimal? ** - // ulong? ** - // integer? - Var res = (long)v + 1; - return res; - // double? ** - } - /// - /// Decrement the value. - /// - /// the value to decrement - /// the decremented value - public static Var operator --(Var v) - { - if (v == null) - return null; - if (v._raw == null || v._raw.Length == 0 || v._raw == "0") - return (Var)(-1); - // how to guess the type? *** - //char? - // ugly... - if (v._raw.Length == 1 && (v._raw[0] < '0' || v._raw[0] > '9')) - { - return (Var)((char)v - 1); - } - // decimal? ** - // ulong? ** - // integer? - return (Var)((long)v - 1); - // double? ** - } - - #region String Methods - /// Concatenates a specified separator between each element of a specified array, yielding a single concatenated string. - /// A consisting of the elements of value interspersed with the separator string. - /// A . - /// An array of . - /// value is null. - public static string Join(string separator, Var[] value) - { - Contracts.CheckValue(value, nameof(value)); - return Join(separator, value, 0, value.Length); - } - - /// Concatenates a specified separator between each element of a specified array, yielding a single concatenated string. Parameters specify the first array element and number of elements to use. - /// A object consisting of the strings in value joined by separator. Or, if count is zero, value has no elements, or separator and all the elements of value are . - /// The number of elements of value to use. - /// A . - /// An array of . - /// The first array element in value to use. - /// startIndex or count is less than 0.-or- startIndex plus count is greater than the number of elements in value. - /// value is null. - public static unsafe string Join(string separator, Var[] value, int startIndex, int count) - { - if (separator == null) - separator = ""; - Contracts.CheckValue(value, nameof(value)); - if (startIndex < 0) - throw Contracts.ExceptParam(nameof(startIndex), "Must be non-negative."); - if (count < 0) - throw Contracts.ExceptParam(nameof(count), "Must be non-negative."); - if (startIndex > value.Length - count) - throw Contracts.ExceptParam(nameof(startIndex)); - if (count == 0) - return ""; - if (separator.Length == 0 && startIndex == 0 && count == value.Length) - return Concat(value); - int length = 0; - int num2 = (startIndex + count) - 1; - for (int i = startIndex; i <= num2; i++) - { - if (value[i] != null) - { - string s = (string)value[i]; - if (s != null) - length += s.Length; - } - } - length += (count - 1) * separator.Length; - if ((length < 0) || ((length + 1) < 0)) - throw Contracts.Process(new InsufficientMemoryException()); - if (length == 0) - return ""; - StringBuilder sb = new StringBuilder(length); - if (value[startIndex] != null) - sb.Append((string)value[startIndex]); - for (int j = startIndex + 1; j <= num2; j++) - { - sb.Append(separator); - if (value[j] != null) - sb.Append((string)value[j]); - } - return sb.ToString(); - } - - /// Concatenates the elements of a specified array. - /// The concatenated elements of values. - /// An array of instances. - /// values is null. - public static string Concat(params Var[] values) - { - return string.Concat(Convert(values)); - } - - /// Returns a value indicating whether the specified object occurs within this string. - /// true if the value parameter occurs within this string, or if value is the empty string (""); otherwise, false. - /// The object to seek. - /// value is null. - public bool Contains(string value) { return _raw.Contains(value); } - - /// Copies a specified number of characters from a specified position in this instance to a specified position in an array of Unicode characters. - /// The number of characters in this instance to copy to destination. - /// An array element in destination. - /// A character position in this instance. - /// An array of Unicode characters. - /// destination is null. - /// sourceIndex, destinationIndex, or count is negative -or- count is greater than the length of the substring from startIndex to the end of this instance -or- count is greater than the length of the subarray from destinationIndex to the end of destination - public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count) { _raw.CopyTo(sourceIndex, destination, destinationIndex, count); } - - /// Determines whether the end of this instance matches the specified string. - /// true if value matches the end of this instance; otherwise, false. - /// A to compare to. - /// value is null. - public bool EndsWith(string value) { return _raw.EndsWith(value); } - - /// Determines whether the end of this string matches the specified string when compared using the specified comparison option. - /// true if the value parameter matches the end of this string; otherwise, false. - /// One of the values that determines how this string and value are compared. - /// A object to compare to. - /// comparisonType is not a value. - /// value is null. - public bool EndsWith(string value, StringComparison comparisonType) { return _raw.EndsWith(value, comparisonType); } - - /// Determines whether the end of this string matches the specified string when compared using the specified culture. - /// true if the value parameter matches the end of this string; otherwise, false. - /// Cultural information that determines how this instance and value are compared. If culture is null, the current culture is used. - /// true to ignore case when comparing this instance and value; otherwise, false. - /// A object to compare to. - /// value is null. - public bool EndsWith(string value, bool ignoreCase, System.Globalization.CultureInfo culture) { return _raw.EndsWith(value, ignoreCase, culture); } - - /// Determines whether this string and a specified object have the same value. A parameter specifies the culture, case, and sort rules used in the comparison. - /// true if the value of the value parameter is the same as this string; otherwise, false. - /// One of the values. - /// A object. - /// This string is null. - /// comparisonType is not a value. - public bool Equals(string value, StringComparison comparisonType) { return _raw.Equals(value, comparisonType); } - - /// Retrieves an object that can iterate through the individual characters in this string. - /// A object. - public CharEnumerator GetEnumerator() { return _raw.GetEnumerator(); } - - /// Reports the index of the first occurrence of the specified Unicode character in this string. - /// The index position of value if that character is found, or -1 if it is not. - /// A Unicode character to seek. - public int IndexOf(char value) { return _raw.IndexOf(value); } - - /// Reports the index of the first occurrence of the specified in this instance. - /// The index position of value if that string is found, or -1 if it is not. If value is , the return value is 0. - /// The to seek. - /// value is null. - public int IndexOf(string value) { return _raw.IndexOf(value); } - - /// Reports the index of the first occurrence of the specified Unicode character in this string. The search starts at a specified character position. - /// The index position of value if that character is found, or -1 if it is not. - /// A Unicode character to seek. - /// The search starting position. - /// startIndex is less than zero or specifies a position beyond the end of this instance. - public int IndexOf(char value, int startIndex) { return _raw.IndexOf(value, startIndex); } - - /// Reports the index of the first occurrence of the specified in this instance. The search starts at a specified character position. - /// The index position of value if that string is found, or -1 if it is not. If value is , the return value is startIndex. - /// The to seek. - /// The search starting position. - /// startIndex is negative.-or- startIndex specifies a position not within this instance. - /// value is null. - public int IndexOf(string value, int startIndex) { return _raw.IndexOf(value, startIndex); } - - /// Reports the index of the first occurrence of the specified string in the current object. A parameter specifies the type of search to use for the specified string. - /// The index position of the value parameter if that string is found, or -1 if it is not. If value is , the return value is 0. - /// One of the values. - /// The object to seek. - /// comparisonType is not a valid value. - /// value is null. - public int IndexOf(string value, StringComparison comparisonType) { return _raw.IndexOf(value, comparisonType); } - - /// Reports the index of the first occurrence of the specified character in this instance. The search starts at a specified character position and examines a specified number of character positions. - /// The index position of value if that character is found, or -1 if it is not. - /// The number of character positions to examine. - /// A Unicode character to seek. - /// The search starting position. - /// count or startIndex is negative.-or- count + startIndex specifies a position beyond the end of this instance. - public int IndexOf(char value, int startIndex, int count) { return _raw.IndexOf(value, startIndex, count); } - - /// Reports the index of the first occurrence of the specified in this instance. The search starts at a specified character position and examines a specified number of character positions. - /// The index position of value if that string is found, or -1 if it is not. If value is , the return value is startIndex. - /// The number of character positions to examine. - /// The to seek. - /// The search starting position. - /// count or startIndex is negative.-or- count plus startIndex specify a position not within this instance. - /// value is null. - public int IndexOf(string value, int startIndex, int count) { return _raw.IndexOf(value, startIndex, count); } - - /// Reports the index of the first occurrence of the specified string in the current object. Parameters specify the starting search position in the current string and the type of search to use for the specified string. - /// The index position of the value parameter if that string is found, or -1 if it is not. If value is , the return value is 0. - /// One of the values. - /// The object to seek. - /// The search starting position. - /// startIndex is negative, or specifies a position that is not within this instance. - /// comparisonType is not a valid value. - /// value is null. - public int IndexOf(string value, int startIndex, StringComparison comparisonType) { return _raw.IndexOf(value, startIndex, comparisonType); } - - /// Reports the index of the first occurrence of the specified string in the current object. Parameters specify the starting search position in the current string, the number of characters in the current string to search, and the type of search to use for the specified string. - /// The index position of the value parameter if that string is found, or -1 if it is not. If value is , the return value is 0. - /// The number of character positions to examine. - /// One of the values. - /// The object to seek. - /// The search starting position. - /// count or startIndex is negative.-or- count plus startIndex specify a position that is not within this instance. - /// comparisonType is not a valid value. - /// value is null. - public int IndexOf(string value, int startIndex, int count, StringComparison comparisonType) { return _raw.IndexOf(value, startIndex, count, comparisonType); } - - /// Reports the index of the first occurrence in this instance of any character in a specified array of Unicode characters. - /// The index position of the first occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found. - /// A Unicode character array containing one or more characters to seek. - /// anyOf is null. - /// 2 - public int IndexOfAny(char[] anyOf) { return _raw.IndexOfAny(anyOf); } - - /// Reports the index of the first occurrence in this instance of any character in a specified array of Unicode characters. The search starts at a specified character position. - /// The index position of the first occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found. - /// A Unicode character array containing one or more characters to seek. - /// The search starting position. - /// startIndex is negative.-or- startIndex is greater than the number of characters in this instance. - /// anyOf is null. - public int IndexOfAny(char[] anyOf, int startIndex) { return _raw.IndexOfAny(anyOf, startIndex); } - - /// Reports the index of the first occurrence in this instance of any character in a specified array of Unicode characters. The search starts at a specified character position and examines a specified number of character positions. - /// The index position of the first occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found. - /// The number of character positions to examine. - /// A Unicode character array containing one or more characters to seek. - /// The search starting position. - /// count or startIndex is negative.-or- count + startIndex is greater than the number of characters in this instance. - /// anyOf is null. - public int IndexOfAny(char[] anyOf, int startIndex, int count) { return _raw.IndexOfAny(anyOf, startIndex, count); } - - /// Inserts a specified instance of at a specified index position in this instance. - /// A new equivalent to this instance but with value inserted at position startIndex. - /// The to insert. - /// The index position of the insertion. - /// startIndex is negative or greater than the length of this instance. - /// value is null. - public string Insert(int startIndex, string value) { return _raw.Insert(startIndex, value); } - - /// Indicates whether this string is in Unicode normalization form C. - /// true if this string is in normalization form C; otherwise, false. - public bool IsNormalized() { return _raw.IsNormalized(); } - - /// Indicates whether this string is in the specified Unicode normalization form. - /// true if this string is in the normalization form specified by the normalizationForm parameter; otherwise, false. - /// A Unicode normalization form. - public bool IsNormalized(NormalizationForm normalizationForm) { return _raw.IsNormalized(normalizationForm); } - - /// Reports the index position of the last occurrence of a specified Unicode character within this instance. - /// The index position of value if that character is found, or -1 if it is not. - /// A Unicode character to seek. - /// value is null. - public int LastIndexOf(char value) { return _raw.LastIndexOf(value); } - - /// Reports the index position of the last occurrence of a specified within this instance. - /// The index position of value if that string is found, or -1 if it is not. If value is , the return value is the last index position in value. - /// A to seek. - /// value is null. - public int LastIndexOf(string value) { return _raw.LastIndexOf(value); } - - /// Reports the index position of the last occurrence of a specified Unicode character within this instance. The search starts at a specified character position. - /// The index position of value if that character is found, or -1 if it is not. - /// A Unicode character to seek. - /// The starting position of a substring within this instance. - /// startIndex is less than zero or greater than the length of this instance. - /// value is null. - public int LastIndexOf(char value, int startIndex) { return _raw.LastIndexOf(value, startIndex); } - - /// Reports the index position of the last occurrence of a specified within this instance. The search starts at a specified character position. - /// The index position of value if that string is found, or -1 if it is not. If value is , the return value is startIndex. - /// The to seek. - /// The search starting position. - /// startIndex is less than zero or specifies a position not within this instance. - /// value is null. - public int LastIndexOf(string value, int startIndex) { return _raw.LastIndexOf(value, startIndex); } - - /// Reports the index of the last occurrence of a specified string within the current object. A parameter specifies the type of search to use for the specified string. - /// The index position of the value parameter if that string is found, or -1 if it is not. - /// One of the values. - /// The object to seek. - /// comparisonType is not a valid value. - /// value is null. - public int LastIndexOf(string value, StringComparison comparisonType) { return _raw.LastIndexOf(value, comparisonType); } - - /// Reports the index position of the last occurrence of the specified Unicode character in a substring within this instance. The search starts at a specified character position and examines a specified number of character positions. - /// The index position of value if that character is found, or -1 if it is not. - /// The number of character positions to examine. - /// A Unicode character to seek. - /// The starting position of a substring within this instance. - /// value is null. - /// startIndex or count is less than zero or greater than the length of this instance. - public int LastIndexOf(char value, int startIndex, int count) { return _raw.LastIndexOf(value, startIndex, count); } - /// Reports the index position of the last occurrence of a specified within this instance. The search starts at a specified character position and examines a specified number of character positions. - /// The index position of value if that string is found, or -1 if it is not. If value is , the return value is startIndex. - /// The number of character positions to examine. - /// The to seek. - /// The search starting position. - /// count or startIndex is negative.-or- count plus startIndex specify a position not within this instance. - /// value is null. - public int LastIndexOf(string value, int startIndex, int count) { return _raw.LastIndexOf(value, startIndex, count); } - - /// Reports the index of the last occurrence of a specified string within the current object. Parameters specify the starting search position in the current string, and type of search to use for the specified string. - /// The index position of the value parameter if that string is found, or -1 if it is not. - /// One of the values. - /// The object to seek. - /// The search starting position. - /// startIndex is less than zero or specifies a position that is not within this instance. - /// comparisonType is not a valid value. - /// value is null. - public int LastIndexOf(string value, int startIndex, StringComparison comparisonType) { return _raw.LastIndexOf(value, startIndex, comparisonType); } - - /// Reports the index position of the last occurrence of a specified object within this instance. Parameters specify the starting search position in the current string, the number of characters in the current string to search, and the type of search to use for the specified string. - /// The index position of the value parameter if that string is found, or -1 if it is not. - /// The number of character positions to examine. - /// One of the values. - /// The object to seek. - /// The search starting position. - /// count or startIndex is negative.-or- count plus startIndex specify a position that is not within this instance. - /// comparisonType is not a valid value. - /// value is null. - public int LastIndexOf(string value, int startIndex, int count, StringComparison comparisonType) { return _raw.LastIndexOf(value, startIndex, count, comparisonType); } - - /// Reports the index position of the last occurrence in this instance of one or more characters specified in a Unicode array. - /// The index position of the last occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found. - /// A Unicode character array containing one or more characters to seek. - /// anyOf is null. - public int LastIndexOfAny(char[] anyOf) { return _raw.LastIndexOfAny(anyOf); } - - /// Reports the index position of the last occurrence in this instance of one or more characters specified in a Unicode array. The search starts at a specified character position. - /// The index position of the last occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found. - /// A Unicode character array containing one or more characters to seek. - /// The search starting position. - /// startIndex specifies a position not within this instance. - /// anyOf is null. - public int LastIndexOfAny(char[] anyOf, int startIndex) { return _raw.LastIndexOfAny(anyOf, startIndex); } - - /// Reports the index position of the last occurrence in this instance of one or more characters specified in a Unicode array. The search starts at a specified character position and examines a specified number of character positions. - /// The index position of the last occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found. - /// The number of character positions to examine. - /// A Unicode character array containing one or more characters to seek. - /// The search starting position. - /// count or startIndex is negative.-or- count plus startIndex specify a position not within this instance. - /// anyOf is null. - public int LastIndexOfAny(char[] anyOf, int startIndex, int count) { return _raw.LastIndexOfAny(anyOf, startIndex, count); } - - /// Returns a new string whose textual value is the same as this string, but whose binary representation is in Unicode normalization form C. - /// A new, normalized string whose textual value is the same as this string, but whose binary representation is in normalization form C. - public string Normalize() { return _raw.Normalize(); } - - /// Returns a new string whose textual value is the same as this string, but whose binary representation is in the specified Unicode normalization form. - /// A new string whose textual value is the same as this string, but whose binary representation is in the normalization form specified by the normalizationForm parameter. - /// A Unicode normalization form. - public string Normalize(NormalizationForm normalizationForm) { return _raw.Normalize(normalizationForm); } - - /// Right-aligns the characters in this instance, padding with spaces on the left for a specified total length. - /// A new that is equivalent to this instance, but right-aligned and padded on the left with as many spaces as needed to create a length of totalWidth. Or, if totalWidth is less than the length of this instance, a new object that is identical to this instance. - /// The number of characters in the resulting string, equal to the number of original characters plus any additional padding characters. - /// totalWidth is less than zero. - public string PadLeft(int totalWidth) { return _raw.PadLeft(totalWidth); } - - /// Right-aligns the characters in this instance, padding on the left with a specified Unicode character for a specified total length. - /// A new that is equivalent to this instance, but right-aligned and padded on the left with as many paddingChar characters as needed to create a length of totalWidth. Or, if totalWidth is less than the length of this instance, a new that is identical to this instance. - /// A Unicode padding character. - /// The number of characters in the resulting string, equal to the number of original characters plus any additional padding characters. - /// totalWidth is less than zero. - public string PadLeft(int totalWidth, char paddingChar) { return _raw.PadLeft(totalWidth, paddingChar); } - - /// Left-aligns the characters in this string, padding with spaces on the right, for a specified total length. - /// A new that is equivalent to this instance, but left-aligned and padded on the right with as many spaces as needed to create a length of totalWidth. Or, if totalWidth is less than the length of this instance, a new that is identical to this instance. - /// The number of characters in the resulting string, equal to the number of original characters plus any additional padding characters. - /// totalWidth is less than zero. - public string PadRight(int totalWidth) { return _raw.PadRight(totalWidth); } - - /// Left-aligns the characters in this string, padding on the right with a specified Unicode character, for a specified total length. - /// A new that is equivalent to this instance, but left-aligned and padded on the right with as many paddingChar characters as needed to create a length of totalWidth. Or, if totalWidth is less than the length of this instance, a new that is identical to this instance. - /// A Unicode padding character. - /// The number of characters in the resulting string, equal to the number of original characters plus any additional padding characters. - /// totalWidth is less than zero. - public string PadRight(int totalWidth, char paddingChar) { return _raw.PadRight(totalWidth, paddingChar); } - - /// Deletes all the characters from this string beginning at a specified position and continuing through the last position. - /// A new object that is equivalent to this string less the removed characters. - /// The position to begin deleting characters. - /// startIndex is less than zero.-or- startIndex specifies a position that is not within this string. - public string Remove(int startIndex) { return _raw.Remove(startIndex); } - - /// Deletes a specified number of characters from this instance beginning at a specified position. - /// A new that is equivalent to this instance less count number of characters. - /// The number of characters to delete. - /// The position to begin deleting characters. - /// Either startIndex or count is less than zero.-or- startIndex plus count specify a position outside this instance. - public string Remove(int startIndex, int count) { return _raw.Remove(startIndex, count); } - - /// Replaces all occurrences of a specified Unicode character in this instance with another specified Unicode character. - /// A equivalent to this instance but with all instances of oldChar replaced with newChar. - /// A Unicode character to replace all occurrences of oldChar. - /// A Unicode character to be replaced. - public string Replace(char oldChar, char newChar) { return _raw.Replace(oldChar, newChar); } - - /// Replaces all occurrences of a specified in this instance, with another specified . - /// A equivalent to this instance but with all instances of oldValue replaced with newValue. - /// A to be replaced. - /// A to replace all occurrences of oldValue. - /// oldValue is null. - /// oldValue is the empty string (""). - public string Replace(string oldValue, string newValue) { return _raw.Replace(oldValue, newValue); } - - /// Returns a array containing the substrings in this instance that are delimited by elements of a specified array. - /// An array whose elements contain the substrings in this instance that are delimited by one or more characters in separator. For more information, see the Remarks section. - /// An array of Unicode characters that delimit the substrings in this instance, an empty array containing no delimiters, or null. - public string[] Split(params char[] separator) { return _raw.Split(separator); } - - /// Returns a array containing the substrings in this instance that are delimited by elements of a specified array. A parameter specifies the maximum number of substrings to return. - /// An array whose elements contain the substrings in this instance that are delimited by one or more characters in separator. For more information, see the Remarks section. - /// The maximum number of substrings to return. - /// An array of Unicode characters that delimit the substrings in this instance, an empty array containing no delimiters, or null. - /// count is negative. - public string[] Split(char[] separator, int count) { return _raw.Split(separator, count); } - - /// Returns a array containing the substrings in this string that are delimited by elements of a specified array. A parameter specifies whether to return empty array elements. - /// An array whose elements contain the substrings in this string that are delimited by one or more characters in separator. For more information, see the Remarks section. - /// Specify to omit empty array elements from the array returned, or to include empty array elements in the array returned. - /// An array of Unicode characters that delimit the substrings in this string, an empty array containing no delimiters, or null. - /// options is not one of the values. - public string[] Split(char[] separator, StringSplitOptions options) { return _raw.Split(separator, options); } - - /// Returns a array containing the substrings in this string that are delimited by elements of a specified array. A parameter specifies whether to return empty array elements. - /// An array whose elements contain the substrings in this string that are delimited by one or more strings in separator. For more information, see the Remarks section. - /// Specify to omit empty array elements from the array returned, or to include empty array elements in the array returned. - /// An array of strings that delimit the substrings in this string, an empty array containing no delimiters, or null. - /// options is not one of the values. - public string[] Split(string[] separator, StringSplitOptions options) { return _raw.Split(separator, options); } - - /// Returns a array containing the substrings in this string that are delimited by elements of a specified array. Parameters specify the maximum number of substrings to return and whether to return empty array elements. - /// An array whose elements contain the substrings in this stringthat are delimited by one or more characters in separator. For more information, see the Remarks section. - /// The maximum number of substrings to return. - /// Specify to omit empty array elements from the array returned, or to include empty array elements in the array returned. - /// An array of Unicode characters that delimit the substrings in this string, an empty array containing no delimiters, or null. - /// options is not one of the values. - /// count is negative. - public string[] Split(char[] separator, int count, StringSplitOptions options) { return _raw.Split(separator, count, options); } - - /// Returns a array containing the substrings in this string that are delimited by elements of a specified array. Parameters specify the maximum number of substrings to return and whether to return empty array elements. - /// An array whose elements contain the substrings in this string that are delimited by one or more strings in separator. For more information, see the Remarks section. - /// The maximum number of substrings to return. - /// Specify to omit empty array elements from the array returned, or to include empty array elements in the array returned. - /// An array of strings that delimit the substrings in this string, an empty array containing no delimiters, or null. - /// options is not one of the values. - /// count is negative. - public string[] Split(string[] separator, int count, StringSplitOptions options) { return _raw.Split(separator, count, options); } - - /// Determines whether the beginning of this instance matches the specified string. - /// true if value matches the beginning of this string; otherwise, false. - /// The to compare. - /// value is null. - public bool StartsWith(string value) { return _raw.StartsWith(value); } - - /// Determines whether the beginning of this string matches the specified string when compared using the specified comparison option. - /// true if the value parameter matches the beginning of this string; otherwise, false. - /// One of the values that determines how this string and value are compared. - /// A object to compare to. - /// comparisonType is not a value. - /// value is null. - public bool StartsWith(string value, StringComparison comparisonType) { return _raw.StartsWith(value, comparisonType); } - - /// Determines whether the beginning of this string matches the specified string when compared using the specified culture. - /// true if the value parameter matches the beginning of this string; otherwise, false. - /// Cultural information that determines how this string and value are compared. If culture is null, the current culture is used. - /// true to ignore case when comparing this string and value; otherwise, false. - /// The object to compare. - /// value is null. - public bool StartsWith(string value, bool ignoreCase, System.Globalization.CultureInfo culture) { return _raw.StartsWith(value, ignoreCase, culture); } - - /// Retrieves a substring from this instance. The substring starts at a specified character position. - /// A object equivalent to the substring that begins at startIndex in this instance, or if startIndex is equal to the length of this instance. - /// The starting character position of a substring in this instance. - /// startIndex is less than zero or greater than the length of this instance. - public string Substring(int startIndex) { return _raw.Substring(startIndex); } - - /// Retrieves a substring from this instance. The substring starts at a specified character position and has a specified length. - /// A equivalent to the substring of length length that begins at startIndex in this instance, or if startIndex is equal to the length of this instance and length is zero. - /// The index of the start of the substring. - /// The number of characters in the substring. - /// startIndex plus length indicates a position not within this instance.-or- startIndex or length is less than zero. - public string Substring(int startIndex, int length) { return _raw.Substring(startIndex, length); } - - IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_raw).GetEnumerator(); } - - IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_raw).GetEnumerator(); } - - /// Copies the characters in this instance to a Unicode character array. - /// A Unicode character array whose elements are the individual characters of this instance. If this instance is an empty string, the returned array is empty and has a zero length. - public char[] ToCharArray() { return _raw.ToCharArray(); } - - /// Copies the characters in a specified substring in this instance to a Unicode character array. - /// A Unicode character array whose elements are the length number of characters in this instance starting from character position startIndex. - /// The starting position of a substring in this instance. - /// The length of the substring in this instance. - /// startIndex or length is less than zero.-or- startIndex plus length is greater than the length of this instance. - public char[] ToCharArray(int startIndex, int length) { return _raw.ToCharArray(startIndex, length); } - - /// Returns a copy of this converted to lowercase, using the casing rules of the current culture. - /// A in lowercase. - public string ToLower() { return _raw.ToLower(); } - - /// Returns a copy of this converted to lowercase, using the casing rules of the specified culture. - /// A in lowercase. - /// A object that supplies culture-specific casing rules. - /// culture is null. - public string ToLower(System.Globalization.CultureInfo culture) { return _raw.ToLower(culture); } - - /// Returns a copy of this object converted to lowercase using the casing rules of the invariant culture. - /// A object in lowercase. - public string ToLowerInvariant() { return _raw.ToLowerInvariant(); } - - /// Returns a copy of this converted to uppercase, using the casing rules of the current culture. - /// A in uppercase. - public string ToUpper() { return _raw.ToUpper(); } - - /// Returns a copy of this converted to uppercase, using the casing rules of the specified culture. - /// A in uppercase. - /// A object that supplies culture-specific casing rules. - /// culture is null. - public string ToUpper(System.Globalization.CultureInfo culture) { return _raw.ToUpper(culture); } - - /// Returns a copy of this object converted to uppercase using the casing rules of the invariant culture. - /// A object in uppercase. - public string ToUpperInvariant() { return _raw.ToUpperInvariant(); } - - /// Removes all occurrences of white space characters from the beginning and end of this instance. - /// A new equivalent to this instance after white space characters are removed from the beginning and end. - public string Trim() { return _raw.Trim(); } - - /// Removes all occurrences of a set of characters specified in an array from the beginning and end of this instance. - /// The that remains after all occurrences of the characters in trimChars are removed from the beginning and end of this instance. If trimChars is null, white space characters are removed instead. - /// An array of Unicode characters to be removed or null. - public string Trim(params char[] trimChars) { return _raw.Trim(trimChars); } - - /// Removes all occurrences of a set of characters specified in an array from the end of this instance. - /// The that remains after all occurrences of the characters in trimChars are removed from the end. If trimChars is null, white space characters are removed instead. - /// An array of Unicode characters to be removed or null. - public string TrimEnd(params char[] trimChars) { return _raw.TrimEnd(trimChars); } - - /// Removes all occurrences of a set of characters specified in an array from the beginning of this instance. - /// The that remains after all occurrences of characters in trimChars are removed from the beginning. If trimChars is null, white space characters are removed instead. - /// An array of Unicode characters to be removed or null. - public string TrimStart(params char[] trimChars) { return _raw.TrimStart(trimChars); } - - /// Gets the character at a specified character position in this instance. - /// A Unicode character. - /// A character position in this instance. - /// index is greater than or equal to the length of this object or less than zero. - public char this[int index] { get { return _raw[index]; } } - - /// Gets the number of characters in this instance. - /// The number of characters in this instance. - public int Length { get { return _raw.Length; } } - #endregion - - #region IConvertible Members - - TypeCode IConvertible.GetTypeCode() - { - return TypeCode.Object; - } - - bool IConvertible.ToBoolean(IFormatProvider provider) - { - return this; - } - - byte IConvertible.ToByte(IFormatProvider provider) - { - return this; - } - - char IConvertible.ToChar(IFormatProvider provider) - { - return this; - } - - DateTime IConvertible.ToDateTime(IFormatProvider provider) - { - return this; - } - - decimal IConvertible.ToDecimal(IFormatProvider provider) - { - return this; - } - - double IConvertible.ToDouble(IFormatProvider provider) - { - return this; - } - - short IConvertible.ToInt16(IFormatProvider provider) - { - return this; - } - - int IConvertible.ToInt32(IFormatProvider provider) - { - return this; - } - - long IConvertible.ToInt64(IFormatProvider provider) - { - return this; - } - - sbyte IConvertible.ToSByte(IFormatProvider provider) - { - return this; - } - - float IConvertible.ToSingle(IFormatProvider provider) - { - return this; - } - - string IConvertible.ToString(IFormatProvider provider) - { - return this; - } - - ushort IConvertible.ToUInt16(IFormatProvider provider) - { - return this; - } - - uint IConvertible.ToUInt32(IFormatProvider provider) - { - return this; - } - - ulong IConvertible.ToUInt64(IFormatProvider provider) - { - return this; - } - - object IConvertible.ToType(Type conversionType, IFormatProvider provider) - { - //throw new Exception("The method or operation is not implemented."); - // *** what do we really need here? - //return this; - if (conversionType == typeof(Var)) - { - return (Var)this; - } - else if (conversionType == typeof(string)) - { - return (string)this; - } - else if (conversionType == typeof(double)) - { - return (double)this; - } - else if (conversionType == typeof(float)) - { - return (float)this; - } - else if (conversionType == typeof(int)) - { - return (int)this; - } - else if (conversionType == typeof(uint)) - { - return (uint)this; - } - else if (conversionType == typeof(long)) - { - return (long)this; - } - else if (conversionType == typeof(ulong)) - { - return (ulong)this; - } - else if (conversionType == typeof(short)) - { - return (short)this; - } - else if (conversionType == typeof(ushort)) - { - return (ushort)this; - } - else if (conversionType == typeof(byte)) - { - return (byte)this; - } - else if (conversionType == typeof(sbyte)) - { - return (sbyte)this; - } - else if (conversionType == typeof(char)) - { - return (char)this; - } - else if (conversionType == typeof(decimal)) - { - return (decimal)this; - } - else if (conversionType == typeof(Guid)) - { - return (Guid)this; - } - else if (conversionType == typeof(DateTime)) - { - return (DateTime)this; - } - return this; - } - - #endregion - } - #endregion - - #region NoPreamble - /// - /// An encoding based on another encoding but with no preamble (BOM). - /// - public class NoPreambleEncoding : System.Text.Encoding - { - private readonly Encoding _baseEncoding; - private static readonly byte[] _preamble = new byte[0]; - - // private backing field for UTF16 - private readonly Encoding _utf16 = new NoPreambleEncoding(Encoding.Unicode); - - /// - /// A UTF16 encoding with no preamble. - /// - public Encoding UTF16 - { - get - { - return _utf16; - } - } - - // backing field for BigEndianUTF16 - private readonly Encoding _bigEndianUtf16 = new NoPreambleEncoding(Encoding.BigEndianUnicode); - - /// - /// A big-endian UTF16 encoding with no preamble. - /// - public Encoding BigEndianUTF16 - { - get - { - return _bigEndianUtf16; - } - } - - /// - /// Create a new encoding based on the specified encoding but with no preamble. - /// - /// the encoding to base this one on - /// The baseEncoding was null. - public NoPreambleEncoding(Encoding baseEncoding) - { - Contracts.CheckValue(baseEncoding, nameof(baseEncoding)); - _baseEncoding = baseEncoding; - } - - /// - /// Returns a sequence of bytes that specifies the encoding used (empty, in this case). - /// - /// - /// A byte array of length zero. - /// - public override byte[] GetPreamble() - { - return _preamble; - } - /// - /// Gets a name for the current encoding that can be used with mail agent body tags. - /// - /// A name for the current that can be used with mail agent body tags.-or- An empty string (""), if the current cannot be used. - public override string BodyName - { - get - { - return _baseEncoding.BodyName; - } - } - /// - /// Creates a shallow copy of the current object. - /// - /// - /// A copy of the current object. - /// - public override object Clone() - { - return new NoPreambleEncoding((Encoding)_baseEncoding.Clone()); - } - /// - /// Gets the code page identifier of the current . - /// - /// The code page identifier of the current . - public override int CodePage - { - get - { - return _baseEncoding.CodePage; - } - } - /// - /// Gets the human-readable description of the current encoding. - /// - /// The human-readable description of the current . - public override string EncodingName - { - get - { - return _baseEncoding.EncodingName; - } - } - /// - /// Calculates the number of bytes produced by encoding all the characters in the specified character array. - /// - /// The character array containing the characters to encode. - /// - /// The number of bytes produced by encoding all the characters in the specified character array. - /// - /// chars is null. - public override int GetByteCount(char[] chars) - { - return _baseEncoding.GetByteCount(chars); - } - /// - /// Calculates the number of bytes produced by encoding the characters in the specified . - /// - /// The containing the set of characters to encode. - /// - /// The number of bytes produced by encoding the specified characters. - /// - /// s is null. - public override int GetByteCount(string s) - { - return _baseEncoding.GetByteCount(s); - } - /// - /// Encodes all the characters in the specified character array into a sequence of bytes. - /// - /// The character array containing the characters to encode. - /// - /// A byte array containing the results of encoding the specified set of characters. - /// - /// chars is null. - public override byte[] GetBytes(char[] chars) - { - return _baseEncoding.GetBytes(chars); - } - /// - /// Encodes a set of characters from the specified character array into a sequence of bytes. - /// - /// The character array containing the set of characters to encode. - /// The index of the first character to encode. - /// The number of characters to encode. - /// - /// A byte array containing the results of encoding the specified set of characters. - /// - /// index or count is less than zero.-or- index and count do not denote a valid range in chars. - /// chars is null. - public override byte[] GetBytes(char[] chars, int index, int count) - { - return _baseEncoding.GetBytes(chars, index, count); - } - /// - /// Encodes all the characters in the specified into a sequence of bytes. - /// - /// The containing the characters to encode. - /// - /// A byte array containing the results of encoding the specified set of characters. - /// - /// s is null. - public override byte[] GetBytes(string s) - { - return _baseEncoding.GetBytes(s); - } - /// - /// Encodes a set of characters from the specified into the specified byte array. - /// - /// The containing the set of characters to encode. - /// The index of the first character to encode. - /// The number of characters to encode. - /// The byte array to contain the resulting sequence of bytes. - /// The index at which to start writing the resulting sequence of bytes. - /// - /// The actual number of bytes written into bytes. - /// - /// bytes does not have enough capacity from byteIndex to the end of the array to accommodate the resulting bytes. - /// charIndex or charCount or byteIndex is less than zero.-or- charIndex and charCount do not denote a valid range in chars.-or- byteIndex is not a valid index in bytes. - /// s is null.-or- bytes is null. - public override int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex) - { - return _baseEncoding.GetBytes(s, charIndex, charCount, bytes, byteIndex); - } - /// - /// Calculates the number of characters produced by decoding all the bytes in the specified byte array. - /// - /// The byte array containing the sequence of bytes to decode. - /// - /// The number of characters produced by decoding the specified sequence of bytes. - /// - /// bytes is null. - public override int GetCharCount(byte[] bytes) - { - return _baseEncoding.GetCharCount(bytes); - } - /// - /// Decodes all the bytes in the specified byte array into a set of characters. - /// - /// The byte array containing the sequence of bytes to decode. - /// - /// A character array containing the results of decoding the specified sequence of bytes. - /// - /// bytes is null. - public override char[] GetChars(byte[] bytes) - { - return _baseEncoding.GetChars(bytes); - } - /// - /// Decodes a sequence of bytes from the specified byte array into a set of characters. - /// - /// The byte array containing the sequence of bytes to decode. - /// The index of the first byte to decode. - /// The number of bytes to decode. - /// - /// A character array containing the results of decoding the specified sequence of bytes. - /// - /// bytes is null. - /// index or count is less than zero.-or- index and count do not denote a valid range in bytes. - public override char[] GetChars(byte[] bytes, int index, int count) - { - return _baseEncoding.GetChars(bytes, index, count); - } - /// - /// Obtains a decoder that converts an encoded sequence of bytes into a sequence of characters. - /// - /// - /// A that converts an encoded sequence of bytes into a sequence of characters. - /// - public override Decoder GetDecoder() - { - return _baseEncoding.GetDecoder(); - } - /// - /// Obtains an encoder that converts a sequence of Unicode characters into an encoded sequence of bytes. - /// - /// - /// An that converts a sequence of Unicode characters into an encoded sequence of bytes. - /// - public override Encoder GetEncoder() - { - return _baseEncoding.GetEncoder(); - } - /// - /// Decodes all the bytes in the specified byte array into a string. - /// - /// The byte array containing the sequence of bytes to decode. - /// - /// A containing the results of decoding the specified sequence of bytes. - /// - /// bytes is null. - public override string GetString(byte[] bytes) - { - return _baseEncoding.GetString(bytes); - } - /// - /// Decodes a sequence of bytes from the specified byte array into a string. - /// - /// The byte array containing the sequence of bytes to decode. - /// The index of the first byte to decode. - /// The number of bytes to decode. - /// - /// A containing the results of decoding the specified sequence of bytes. - /// - /// bytes is null. - /// index or count is less than zero.-or- index and count do not denote a valid range in bytes. - public override string GetString(byte[] bytes, int index, int count) - { - return _baseEncoding.GetString(bytes, index, count); - } - /// - /// Gets a name for the current encoding that can be used with mail agent header tags. - /// - /// A name for the current that can be used with mail agent header tags.-or- An empty string (""), if the current cannot be used. - public override string HeaderName - { - get - { - return _baseEncoding.HeaderName; - } - } - /// - /// Gets a value indicating whether the current encoding is always normalized, using the specified normalization form. - /// - /// One of the values. - /// - /// true if the current object is always normalized using the specified value; otherwise, false. The default is false. - /// - public override bool IsAlwaysNormalized(NormalizationForm form) - { - return _baseEncoding.IsAlwaysNormalized(form); - } - /// - /// Gets a value indicating whether the current encoding can be used by browser clients for displaying content. - /// - /// - /// true if the current can be used by browser clients for displaying content; otherwise, false. - public override bool IsBrowserDisplay - { - get - { - return _baseEncoding.IsBrowserDisplay; - } - } - /// - /// Gets a value indicating whether the current encoding can be used by browser clients for saving content. - /// - /// - /// true if the current can be used by browser clients for saving content; otherwise, false. - public override bool IsBrowserSave - { - get - { - return _baseEncoding.IsBrowserSave; - } - } - /// - /// Gets a value indicating whether the current encoding can be used by mail and news clients for displaying content. - /// - /// - /// true if the current can be used by mail and news clients for displaying content; otherwise, false. - public override bool IsMailNewsDisplay - { - get - { - return _baseEncoding.IsMailNewsDisplay; - } - } - /// - /// Gets a value indicating whether the current encoding can be used by mail and news clients for saving content. - /// - /// - /// true if the current can be used by mail and news clients for saving content; otherwise, false. - public override bool IsMailNewsSave - { - get - { - return _baseEncoding.IsMailNewsSave; - } - } - /// - /// Gets a value indicating whether the current encoding uses single-byte code points. - /// - /// - /// true if the current uses single-byte code points; otherwise, false. - public override bool IsSingleByte - { - get - { - return _baseEncoding.IsSingleByte; - } - } - /// - /// Returns a that represents the current . - /// - /// - /// A that represents the current . - /// - public override string ToString() - { - return _baseEncoding.ToString(); - } - /// - /// Gets the name registered with the Internet Assigned Numbers Authority (IANA) for the current encoding. - /// - /// - /// The IANA name for the current . - public override string WebName - { - get - { - return _baseEncoding.WebName; - } - } - /// - /// Gets the Windows operating system code page that most closely corresponds to the current encoding. - /// - /// - /// The Windows operating system code page that most closely corresponds to the current . - public override int WindowsCodePage - { - get - { - return _baseEncoding.WindowsCodePage; - } - } - /// - /// Determines whether the specified is equal to the current instance. - /// - /// The to compare with the current instance. - /// - /// true if value is an instance of and is equal to the current instance; otherwise, false. - /// - public override bool Equals(object value) - { - return value is NoPreambleEncoding && ((NoPreambleEncoding)value)._baseEncoding.Equals(_baseEncoding); - } - /// - /// Returns the hash code for the current instance. - /// - /// The hash code for the current instance. - public override int GetHashCode() - { - return _baseEncoding.GetHashCode(); - } - /// - /// Calculates the number of bytes produced by encoding a set of characters from the specified character array. - /// - /// The character array containing the set of characters to encode. - /// The index of the first character to encode. - /// The number of characters to encode. - /// - /// The number of bytes produced by encoding the specified characters. - /// - /// index or count is less than zero.-or- index and count do not denote a valid range in chars. - /// chars is null. - public override int GetByteCount(char[] chars, int index, int count) - { - return _baseEncoding.GetByteCount(chars, index, count); - } - - /// - /// Encodes a set of characters from the specified character array into the specified byte array. - /// - /// The character array containing the set of characters to encode. - /// The index of the first character to encode. - /// The number of characters to encode. - /// The byte array to contain the resulting sequence of bytes. - /// The index at which to start writing the resulting sequence of bytes. - /// - /// The actual number of bytes written into bytes. - /// - /// chars is null.-or- bytes is null. - /// bytes does not have enough capacity from byteIndex to the end of the array to accommodate the resulting bytes. - /// charIndex or charCount or byteIndex is less than zero.-or- charIndex and charCount do not denote a valid range in chars.-or- byteIndex is not a valid index in bytes. - public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) - { - return _baseEncoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex); - } - - /// - /// Calculates the number of characters produced by decoding a sequence of bytes from the specified byte array. - /// - /// The byte array containing the sequence of bytes to decode. - /// The index of the first byte to decode. - /// The number of bytes to decode. - /// - /// The number of characters produced by decoding the specified sequence of bytes. - /// - /// bytes is null. - /// index or count is less than zero.-or- index and count do not denote a valid range in bytes. - public override int GetCharCount(byte[] bytes, int index, int count) - { - return _baseEncoding.GetCharCount(bytes, index, count); - } - - /// - /// Decodes a sequence of bytes from the specified byte array into the specified character array. - /// - /// The byte array containing the sequence of bytes to decode. - /// The index of the first byte to decode. - /// The number of bytes to decode. - /// The character array to contain the resulting set of characters. - /// The index at which to start writing the resulting set of characters. - /// - /// The actual number of characters written into chars. - /// - /// byteIndex or byteCount or charIndex is less than zero.-or- byteindex and byteCount do not denote a valid range in bytes.-or- charIndex is not a valid index in chars. - /// bytes is null.-or- chars is null. - /// chars does not have enough capacity from charIndex to the end of the array to accommodate the resulting characters. - public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) - { - return _baseEncoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex); - } - - /// - /// calculates the maximum number of bytes produced by encoding the specified number of characters. - /// - /// The number of characters to encode. - /// - /// The maximum number of bytes produced by encoding the specified number of characters. - /// - /// charCount is less than zero. - public override int GetMaxByteCount(int charCount) - { - return _baseEncoding.GetMaxByteCount(charCount); - } - - /// - /// calculates the maximum number of characters produced by decoding the specified number of bytes. - /// - /// The number of bytes to decode. - /// - /// The maximum number of characters produced by decoding the specified number of bytes. - /// - /// byteCount is less than zero. - public override int GetMaxCharCount(int byteCount) - { - return _baseEncoding.GetMaxCharCount(byteCount); - } - } - #endregion - - #region Parallel Enumeration -#if ENABLE_PARALLEL_ENUMERATION - /// - /// - /// - public class BackgroundEnumerable : IEnumerable - { - IEnumerable baseEnumerable; - - /// - /// - /// - /// - public BackgroundEnumerable(IEnumerable baseEnumerable) - { - this.baseEnumerable = baseEnumerable; - } - -#if EXPLICIT - public IEnumerator GetEnumerator() - { - return new BackgroundEnumerator(baseEnumerable.GetEnumerator()); - } - - private class BackgroundEnumerator : IEnumerator, IDisposable - { - IEnumerator baseEnumerator; - Thread thread; - AutoResetEvent fillMutex; - AutoResetEvent drainMutex; - object current; - object next; - - public BackgroundEnumerator(IEnumerator baseEnumerator) - { - this.baseEnumerator = baseEnumerator; - fillMutex = new AutoResetEvent(false); - drainMutex = new AutoResetEvent(true); - thread = new Thread(new ThreadStart(Enumerate)); - thread.Start(); - } - - private void Enumerate() - { - } - - public object Current - { - get - { - return current; - } - } - - public bool MoveNext() - { - fillMutex.WaitOne(); - current = next; - drainMutex.Set(); - } - - public void Reset() - { - if (thread != null) - { - try - { - thread.Abort(); - } - catch - { - } - thread = null; - } - baseEnumerator.Reset(); - fillMutex = new AutoResetEvent(false); - drainMutex = new AutoResetEvent(true); - thread = new Thread(new ThreadStart(Enumerate)); - thread.Start(); - } - - void IDisposable.Dispose() - { - if (thread != null) - { - try - { - thread.Abort(); - } - catch - { - } - thread = null; - } - } - } -#else - /// - /// - /// - /// - public IEnumerator GetEnumerator() - { - try - { - fillMutex = new AutoResetEvent(false); - drainMutex = new AutoResetEvent(true); - thread = new Thread(new ThreadStart(Enumerate)); - thread.Start(); - - while (true) - { - fillMutex.WaitOne(); - current = next; - if (current == null) yield break; - drainMutex.Set(); - yield return current; - } - } - finally - { - if (thread != null) - { - try - { - thread.Abort(); - } - catch - { - } - thread = null; - } - } - } - - Thread thread; - AutoResetEvent fillMutex; - AutoResetEvent drainMutex; - object current; - object next; - - private void Enumerate() - { - foreach (object obj in baseEnumerable) - { - drainMutex.WaitOne(); - next = obj; - fillMutex.Set(); - } - drainMutex.WaitOne(); - next = null; - fillMutex.Set(); - } -#endif - } - - /// - /// - /// - public class BackgroundEnumerable : IEnumerable - { - IEnumerable baseEnumerable; - - /// - /// - /// - /// - public BackgroundEnumerable(IEnumerable baseEnumerable) - { - this.baseEnumerable = baseEnumerable; - } - -#if EXPLICIT - public IEnumerator GetEnumerator() - { - return new BackgroundEnumerator(baseEnumerable.GetEnumerator()); - } - - private class BackgroundEnumerator : IEnumerator, IDisposable - { - IEnumerator baseEnumerator; - Thread thread; - AutoResetEvent fillMutex; - AutoResetEvent drainMutex; - object current; - object next; - - public BackgroundEnumerator(IEnumerator baseEnumerator) - { - this.baseEnumerator = baseEnumerator; - fillMutex = new AutoResetEvent(false); - drainMutex = new AutoResetEvent(true); - thread = new Thread(new ThreadStart(Enumerate)); - thread.Start(); - } - - private void Enumerate() - { - } - - public object Current - { - get - { - return current; - } - } - - public bool MoveNext() - { - fillMutex.WaitOne(); - current = next; - drainMutex.Set(); - } - - public void Reset() - { - if (thread != null) - { - try - { - thread.Abort(); - } - catch - { - } - thread = null; - } - baseEnumerator.Reset(); - fillMutex = new AutoResetEvent(false); - drainMutex = new AutoResetEvent(true); - thread = new Thread(new ThreadStart(Enumerate)); - thread.Start(); - } - - void IDisposable.Dispose() - { - if (thread != null) - { - try - { - thread.Abort(); - } - catch - { - } - thread = null; - } - } - } -#else - /// - /// - /// - /// - public IEnumerator GetEnumerator() - { - try - { - next = new T[3][]; - for (int i = 0; i < next.Length; i++) next[i] = new T[4]; - T[] current = new T[next[0].Length]; - fillMutex = new AutoResetEvent[next.Length]; - drainMutex = new AutoResetEvent[next.Length]; - for (int i = 0; i < fillMutex.Length; i++) - { - fillMutex[i] = new AutoResetEvent(false); - drainMutex[i] = new AutoResetEvent(true); - } - thread = new Thread(new ThreadStart(Enumerate)); - thread.IsBackground = true; - thread.Start(); - - int currentIndex = 0; - while (true) - { - fillMutex[currentIndex].WaitOne(); - T[] tmp = current; - current = next[currentIndex]; - next[currentIndex] = tmp; - drainMutex[currentIndex].Set(); - if (current == null) yield break; - for (int i = 0; i < current.Length; i++) - { - yield return current[i]; - } - currentIndex = (currentIndex + 1) % next.Length; - } - } - finally - { - if (thread != null) - { - try - { - thread.Abort(); - } - catch - { - } - thread = null; - } - } - } - - Thread thread; - AutoResetEvent[] fillMutex; - AutoResetEvent[] drainMutex; - T[][] next; - - private void Enumerate() - { - int nextIndex = 0; - int index = 0; - foreach (T obj in baseEnumerable) - { - next[nextIndex][index] = obj; - index++; - if (index == next[nextIndex].Length) - { - fillMutex[nextIndex].Set(); - nextIndex = (nextIndex + 1) % next.Length; - drainMutex[nextIndex].WaitOne(); - index = 0; - } - } - if (index != 0) - { - T[] old = next[nextIndex]; - next[nextIndex] = new T[index]; - Array.Copy(old, next[nextIndex], next[nextIndex].Length); - fillMutex[nextIndex].Set(); - nextIndex = (nextIndex + 1) % next.Length; - drainMutex[nextIndex].WaitOne(); - index = 0; - } - next[nextIndex] = null; - fillMutex[nextIndex].Set(); - thread = null; - } -#endif - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -#endif - #endregion - -#if NDOC - /// - /// - /// The Microsoft.ML.Runtime.Internal namespace includes classes and functionality developed - /// by the Text Mining, Search, and Navigation group in Microsoft Research. - /// All functionality is for internal use only and is copyright - /// 2007 Microsoft Corporation. - /// - /// - /// Microsoft.ML.Runtime.Internal.IO contains functionality to help with input and output operations. - /// Using the ZStream classes to open files, support is automatically provided for - /// compression and decompression, HTTP downloading, Cosmos stream fetching, console - /// interaction, named streams, SQL table reading, lists of files, and so on. - /// The concept of filename is extended to allow this to - /// be simple and automatic. Other classes provide memory-mapped files, unbuffered - /// I/O, table reading, and other useful functionality. - /// - /// - /// The most essential feature is the ability to open the expanded class of stream names, - /// easily and efficiently: - /// - /// - /// Stream streamIn = ZStreamIn.Open("filename"); - /// Stream streamOut = ZStreamOut.Open("filename"); - /// StreamReader reader = ZStreamReader.Open("filename"); - /// StreamWriter writer = ZStreamWriter.Open("filename"); - /// - /// - /// See the Open() documentation to see the allowed names for file, console, - /// null, URL, Cosmos, and compressed input and output streams. - /// - /// - /// Compression support relies on executable utilities to be in the path. - /// See for 7z.exe and 7za.exe (for many formats - - /// .7z, .gz, .zip, .rar, .bz2, .cab, .arj), for gzip.exe - /// (for .gz), or for unrar.exe (for .rar). Gzip support built-in to .NET - /// 2.0 can be used, but it has extreme deficiencies in terms of speed, size, and flexibility. - /// - /// - /// The IOUtil static methods are useful functions for file and stream operations. Many duplicate - /// existing Framework methods, but they are extended to handle all streamnames. - /// - /// - /// BinaryReaderEx and BinaryWriterEx allow for easy and efficient serialization of many data types. - /// They also make using .NET binary serialization as simple as using Write and Read on serializable objects. - /// - /// - public class NamespaceDoc - { - // this only exists for NDoc - } -#endif -} diff --git a/src/Microsoft.ML.InternalStreams/LowFragmentationStream.cs b/src/Microsoft.ML.InternalStreams/LowFragmentationStream.cs deleted file mode 100644 index 11a49bfced..0000000000 --- a/src/Microsoft.ML.InternalStreams/LowFragmentationStream.cs +++ /dev/null @@ -1,755 +0,0 @@ -// owner: rragno - -#define LZMA_PLAIN -#define UNBUFFERED - -using System; -using System.IO; -using System.Collections; -using System.Collections.Specialized; -using System.Text; -using System.Threading; -using System.Runtime.InteropServices; -//using System.Xml; -//using System.Data; -//using System.Data.OleDb; - -namespace Microsoft.ML.Runtime.Internal.IO -{ - // Should this start out very small for tiny files? - - /// - /// This is a writable FileStream that reduces the fragmentation by - /// extending the output in chunks. - /// - public class LowFragmentationStream : FileStream - { - #region Static Settings - - private static long _minExtension = 50L * 1024L * 1024L; - private static long _maxExtension = 2L * 1024L * 1024L * 1024L; - private static float _extensionFactor = 0.5F; - - /// - /// Get or set the minimum size increment by which a file will be extended, in bytes. - /// Defaults to 50MB. - /// - public static long MinExtension - { - get { return _minExtension; } - set - { - if (value <= 0) - value = 50L * 1024L * 1024L; - _minExtension = value; - } - } - - /// - /// Get or set the maximum size increment by which a file will be extended, in bytes. - /// Defaults to 2GB. - /// - public static long MaxExtension - { - get { return _maxExtension; } - set - { - if (value <= 0) - value = 2L * 1024L * 1024L * 1024L; - _maxExtension = value; - } - } - - /// - /// Get or set the factor by which a file wll be extended when needed. - /// Defaults to 0.5, and must be greater than 0.0 and less than or equal to 1.0. - /// - public static float ExtensionFactor - { - get { return _extensionFactor; } - set - { - if (value <= 0.0F) - value = 0.5F; - if (value > 1.0F) - value = 1.0F; - _extensionFactor = value; - } - } - - #endregion - - /// - /// This is really equal to base.Length while writing, but base.Length - /// is less efficient. - /// - private long _extendedLength; - /// - /// If positive, this represents the true length of the file. - /// Otherwise, that is the Position value. - /// - private long _length; - /// - /// Hopefully, this is always positive, and is the cached Position for efficiency. - /// - private long _position; - private bool _closed = false; - - /// - /// Construct a writable Stream outputting to the given file. - /// - /// the name of the file to write to - /// - /// An I/O error occurs - /// The caller does not have the required permission. - /// The specified path is invalid, such as being on an unmapped drive. - /// The access needed is not permitted by the operating system for the specified . - /// The specified path, file name, or both exceed the system-defined maximum length. - public LowFragmentationStream(string fileName) - : this(fileName, false) - { - } - /// - /// Construct a writable Stream outputting to the given file. - /// - /// the name of the file to write to - /// the size of the buffer to use, in bytes - /// - /// is negative or zero. - /// An I/O error occurs - /// The caller does not have the required permission. - /// The specified path is invalid, such as being on an unmapped drive. - /// The access needed is not permitted by the operating system for the specified . - /// The specified path, file name, or both exceed the system-defined maximum length. - public LowFragmentationStream(string fileName, int bufferSize) - : this(fileName, false, bufferSize) - { - } - /// - /// Construct a writable Stream outputting to the given file. - /// - /// the name of the file to write to - /// if true, append to the file; otherwise, overwrite - /// - /// Append is specified, and the file cannot be found. - /// An I/O error occurs - /// The caller does not have the required permission. - /// The specified path is invalid, such as being on an unmapped drive. - /// The access needed is not permitted by the operating system for the specified . - /// The specified path, file name, or both exceed the system-defined maximum length. - public LowFragmentationStream(string fileName, bool append) - : this(fileName, append, 64 * 1024) - { - } - /// - /// Construct a writable Stream outputting to the given file. - /// - /// the name of the file to write to - /// if true, append to the file; otherwise, overwrite - /// the size of the buffer to use, in bytes - /// - /// is negative or zero. - /// Append is specified, and the file cannot be found. - /// An I/O error occurs - /// The caller does not have the required permission. - /// The specified path is invalid, such as being on an unmapped drive. - /// The access needed is not permitted by the operating system for the specified . - /// The specified path, file name, or both exceed the system-defined maximum length. - public LowFragmentationStream(string fileName, bool append, int bufferSize) - : base(fileName, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, bufferSize) - { - if (append) - { - _length = base.Length; - _position = _length; - _extendedLength = _length; - Extend(); - } - else - { - _length = -1; - _position = 0; - _extendedLength = 0; - Extend(); - } - } - - #region Allocation - - /// - /// Set the desired file allocation, preferably without changing the end of file. - /// - /// the size to set, in bytes - /// if true, use the low-level undocumented NT API to allocate, without setting the length - private void SetAllocation(long length, bool useNT) - { - // using NT calls seems unreliable, beyond being undocumented, unsupported, and - // likely platform dependant. - // - // Sometimes, it works perfectly. Other times, it generates roughly the same - // number of fragments as not doing anything (but can vary). Other times, it - // generates 10 times as many fragments as not doing anything. - // - // It does, at least, leave the file without extra allocated space at all times. - -#if !NT_ALLOCATE - if (!useNT) - { - base.SetLength(length); - } - else - { -#endif - //FILE_ALLOCATION_INFORMATION allocInfo = new FILE_ALLOCATION_INFORMATION(length); - long allocInfo = length; - IOUtil.Win32.IO_STATUS_BLOCK status = new IOUtil.Win32.IO_STATUS_BLOCK(); // = IO_STATUS_BLOCK.NullBlock; - IOUtil.Win32.NtSetInformationFile( - base.SafeFileHandle.DangerousGetHandle(), - ref status, - ref allocInfo, - 8, //sizeof(FILE_ALLOCATION_INFORMATION), - IOUtil.Win32.FILE_INFORMATION_CLASS.FileAllocationInformation); - // FILE_INFORMATION_CLASS.FileEndOfFileInformation); -#if !NT_ALLOCATE - } -#endif - } - #endregion - - /// - /// Remove allocated space that was not written to. - /// - /// the file to trim - /// true if the file is resized; false otherwise - /// - /// This is not normally needed. The LowFragmentationStream trims itself upon finalization. - /// However, if the runtime is terminated abruptly, it is possible for a file to be left - /// with unused space. In that case, this method will remove the unused space. - /// - /// Append is specified, and the file cannot be found. - /// An I/O error occurs - /// The caller does not have the required permission. - /// The specified path is invalid, such as being on an unmapped drive. - /// The access needed is not permitted by the operating system for the specified . - /// The specified path, file name, or both exceed the system-defined maximum length. - public static bool TrimOverextension(string fileName) - { - long length = -1; - using (FileStream s = new FileStream(fileName, FileMode.Open, FileAccess.Read)) - { - byte[] buffer = new byte[1024 * 1024]; - s.Seek(-1, SeekOrigin.End); - int lastByte = s.ReadByte(); - //Console.WriteLine("last: " + lastByte); - if (lastByte == 0) - { - long end = s.Length; - while (length < 0 && end > 0) - { - end -= buffer.Length; - if (end < 0) - end = 0; - s.Seek(end, SeekOrigin.Begin); - int count = s.Read(buffer, 0, buffer.Length); - for (int c = count - 1; c >= 0; c--) - { - if (buffer[c] != 0) - { - length = end + c; - break; - } - } - } - } - } - if (length < 0) - return false; - IOUtil.ResizeFile(fileName, length); - return true; - } - - private void Extend() - { - // really, using NtSetInformationFile might be better, because it will - // automatically truncate, but that is ugly and not really supported... *** - // Also, it seems to cause random fragmentation, unpredictably. - long pos = Position; - long ext = (long)(pos * _extensionFactor); - if (ext < _minExtension) - { - ext = _minExtension; - } - else if (ext > _maxExtension) - { - ext = _maxExtension; - } - // this calls out to the system: - //long len = base.Length; - long len = _extendedLength; - _extendedLength = pos + ext; - if (_extendedLength > len) - { - try - { - // attempt to keep the over-allocation down, at the beginning - bool useNT = len < _minExtension; - SetAllocation(_extendedLength, useNT); - } - catch - { - //Console.WriteLine("extend failed!"); - // ignore? This could mean there is not enough space on disk! - // If we leave the extendedLength set high, this instance will - // harmlessly believe it has preallocated and just allow the writes - // to extend normally... (of course, we could retry at a smaller - // increment...) - try - { - ext = pos + _minExtension; - base.SetLength(ext); - _extendedLength = ext; - } - catch - { - // give up - } - } - } - else - { - //extendedLength = len; - } - //Seek(pos, SeekOrigin.Begin); - } - - private void Truncate() - { - long len = _length; - if (len <= 0) - { - len = Position; - } - if (len != base.Length) - { - base.SetLength(len); - } - _extendedLength = len; - } - - /// - /// Clean up the stream - truncate the file length as needed. - /// - ~LowFragmentationStream() - { - try - { - Truncate(); - //Flush(true); - } - catch - { - // ignore - } - } - - /// - /// Close the stream. - /// - public override void Close() - { - if (_closed) - return; - try - { - Truncate(); - } - catch - { - // ignore - } - base.Close(); - _closed = true; - GC.SuppressFinalize(this); - } - - /// - /// Release the resources used by this instance. - /// - /// true if disposing - protected override void Dispose(bool disposing) - { - //Truncate(); - Flush(true); - base.Dispose(disposing); - } - - /// - /// Write any pending data, without truncating. - /// - /// - /// Note that this does not truncate the file! - /// - public override void Flush() - { - // should this truncate? *** - Flush(false); - } - /// - /// Write any pending data and optionally truncate. - /// - /// if true, also truncate the file; if false, do not. - public new void Flush(bool truncate) - { - try - { - base.Flush(); - if (truncate) - { - Truncate(); - base.Flush(); - } - } - catch - { - // ignore?? - } - } - - /// - /// Extend the capacity to be at least a certain number of bytes. - /// - /// the number of bytes to allocate - /// - /// This is useful when the approximate or exact size of the output is known. - /// It will not affect the final length of the file, but it can help with efficiency - /// and fragmentation. - /// - public void Reserve(long length) - { - //if (length > base.Length) - if (length > _extendedLength) - { - base.SetLength(length); - _extendedLength = length; - } - } - - #region Reading - // /// - // /// Read data into the buffer. - // /// - // /// the buffer to place the data in - // /// the starting index in buffer - // /// the maximum number of bytes to read - // /// the number of bytes read - // public override int Read(byte[] buffer, int offset, int count) - // { - // return base.Read(buffer, offset, count); - // } - // - // /// - // /// Read a single byte. - // /// - // /// the byte read, or a negative number if end of file - // public override int ReadByte() - // { - // return base.ReadByte(); - // } - // - // /// - // /// Read data into the buffer. - // /// - // /// the buffer to place the data in - // /// the starting index in buffer - // /// the maximum number of bytes to read - // /// the callback to use - // /// the state to use for the callback - // /// the number of bytes read - // /// Read is positioned out of bounds. - // public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - // { - // return base.BeginRead(buffer, offset, count, callback, state); - // } - // - // /// - // /// End an asynchronous read. - // /// - // /// the result - // /// number of bytes read - // public override int EndRead(IAsyncResult asyncResult) - // { - // return base.EndRead(asyncResult); - // } - #endregion - - /// - /// Sets the current position of this stream to the given value. - /// - /// The byte number to seek to. - /// - /// The new position in the stream. - /// - /// An I/O error occurs. - /// Attempted seeking before the beginning of the stream. - /// Methods were called after the stream was closed. - public long Seek(long offset) - { - return Seek(offset, SeekOrigin.Begin); - } - /// - /// Sets the current position of this stream to the given value. - /// - /// The point relative to to seek to, in bytes. - /// Specifies the beginning, the end, or the current position as a reference point for , using a value of type . - /// - /// The new position in the stream. - /// - /// An I/O error occurs. - /// Attempted seeking before the beginning of the stream. - /// Methods were called after the stream was closed. - public override long Seek(long offset, SeekOrigin origin) - { - switch (origin) - { - case SeekOrigin.Begin: - break; - case SeekOrigin.Current: - offset = Position + offset; - break; - case SeekOrigin.End: - offset = (_length > 0 ? _length : Position) + offset; - break; - } - - if (offset != Position) - { - Flush(true); - if (_length < 0 && offset < Position) - { - // now need to record the current length, since it is not Position: - _length = Position; - } - } - _position = base.Seek(offset, SeekOrigin.Begin); - return _position; - } - - /// - /// Set the file length - avoid using this manually except for truncation, - /// since the size is normally automatically extended. - /// - /// the length to set it to, in bytes - /// - /// To simply ensure a predicted length, use instead. - /// - public override void SetLength(long value) - { - base.SetLength(value); - if (Position < value) - { - // must remember the true length... - //Console.WriteLine("SetLength setting length..."); - _length = value; - } - else - { - // length now moves with position... - _length = -1; - _position = base.Position; - } - _extendedLength = value; - } - - #region Writing - - /// - /// Write data from the buffer. - /// - /// the buffer to read the data from - /// the starting index in buffer - /// the maximum number of bytes to write - public override void Write(byte[] buffer, int offset, int count) - { - // what if it fails? - //try - //{ - long next = Position + count; - if (_length > 0 && next >= _length) - { - _length = -1; - } - if (next >= _extendedLength) - { - Extend(); - } - _position = -1; - base.Write(buffer, offset, count); - _position = next; - //} - //catch - //{ - // position = base.Position; - //} - } - - /// - /// Write a single byte. - /// - /// the byte to write - public override void WriteByte(byte value) - { - // what if it fails? - //try - //{ - long next = Position + 1; - if (_length > 0 && next >= _length) - { - _length = -1; - } - if (next >= _extendedLength) - { - Extend(); - } - _position = -1; - base.WriteByte(value); - _position = next; - //} - //catch - //{ - // position = base.Position; - //} - } - - /// - /// Begins an asynchronous write. - /// - /// The buffer to write data to. - /// The zero based byte offset at which to begin writing. - /// The maximum number of bytes to write. - /// The method to be called when the asynchronous write operation is completed. - /// A user-provided object that distinguishes this particular asynchronous write request from other requests. - /// - /// An that references the asynchronous write. - /// - /// The stream does not support writing. - /// The stream is closed. - /// An I/O error occurs. - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object stateObject) - { - // we could wrap the state object... - // just call this +1, in case less is written? - long next = Position + 1; - if (_length > 0 && next >= _length) - { - // should we do this, without EndWrite being called? - _length = -1; - } - if (Position + count >= _extendedLength) - { - Extend(); - } - // we just don't know how much will really be read... - _position = -1; - return base.BeginWrite(buffer, offset, count, callback, stateObject); - } - - /// - /// Ends an asynchronous write, blocking until the I/O operation has completed. - /// - /// The pending asynchronous I/O request. - /// is . - /// This object was not created by calling on this class. - /// is called multiple times. - public override void EndWrite(IAsyncResult asyncResult) - { - // should we sync the position here? - _position = Position; - if (_length > 0) - { - if (Position >= _length) - { - _length = -1; - } - } - base.EndWrite(asyncResult); - } - - #endregion - - /// - /// Get whether the stream can read. - /// - public override bool CanRead - { - get - { - // just pass through? - return base.CanRead; - } - } - - // /// - // /// Get whether the stream can seek - true, but it really cannot. - // /// (CanSeek is stupidly checked by the FileStream Position property - // /// on get, not just set.) - // /// - /// - /// Get whether the stream can seek. - /// - public override bool CanSeek - { - get - { - // do we need to force this to true, or can we rely on it? - //return true; - return base.CanSeek; - } - } - - /// - /// Get whether the stream can write. - /// - public override bool CanWrite - { - get - { - // pass through... - //return true; - return base.CanWrite; - } - } - - /// - /// Get the length of the file. - /// - public override long Length - { - get - { - if (_length > 0) - return _length; - return Position; - } - } - - /// - /// Get or set the position in the file. - /// - public override long Position - { - get - { - // the efficiency concern is over VerifyOSHandlePosition when the handle is exposed... - //return base.Position; - if (_position < 0) - _position = base.Position; - return _position; - } - set - { - //throw new NotSupportedException("LowFragmentationStream cannot seek"); - Seek(value); - } - } - } -} diff --git a/src/Microsoft.ML.InternalStreams/Microsoft.ML.InternalStreams.csproj b/src/Microsoft.ML.InternalStreams/Microsoft.ML.InternalStreams.csproj deleted file mode 100644 index 31074af4f9..0000000000 --- a/src/Microsoft.ML.InternalStreams/Microsoft.ML.InternalStreams.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netstandard2.0 - Microsoft.ML - CORECLR - TRACE;USE_FASTTREENATIVE;NO_STORE;CORECLR;DEBUG;NETSTANDARD2_0 - true - 1591,1572,1573 - Microsoft.ML.InternalStreams - - - - - - - diff --git a/src/Microsoft.ML.InternalStreams/TableIO.cs b/src/Microsoft.ML.InternalStreams/TableIO.cs deleted file mode 100644 index 7341cc4a96..0000000000 --- a/src/Microsoft.ML.InternalStreams/TableIO.cs +++ /dev/null @@ -1,3576 +0,0 @@ -// owner: rragno - -using System; -using System.IO; -using System.Collections; -using System.Collections.Specialized; -using System.Text; -#if !ENABLE_BARTOK -using System.Xml; -#endif -#if ALLOW_DB -using System.Data; -using System.Data.OleDb; -#endif - -namespace Microsoft.ML.Runtime.Internal.IO -{ - //// TODO: consider unifying all formats, syncing with other data access models - //// TODO: simple XML support - //// TODO: consider generalizing header support; changing from "row,item" to "item,field"; - //// making a base TableReader abstract class. - - /// - /// Process tabular data. - /// - public interface ITableProcessor - { - /// - /// Gets or sets whether to trim whitespace from each field. - /// - bool TrimWhitespace { get; set; } - - /// - /// Gets or sets whether to ignore case when matching header names. - /// - bool IgnoreHeaderCase { get; set; } - - /// - /// Gets or sets the header names. - /// - string[] Headers { get; set; } - - /// - /// Check for end of file. - /// - /// true if at end of file, false otherwise - bool Eof(); - - /// - /// Advance to the next row. - /// - void NextRow(); - - /// - /// Close the table. - /// - void Close(); - } - - /// - /// - /// - public interface ITableRow - { - /// - /// Get the field at the column index. - /// - string this[int index] { get; } - - /// - /// Get the field at the column with the given header. - /// - string this[string header] { get; } - } - - /// - /// Read tabular data. - /// - public interface ITableReader : ITableProcessor, IEnumerable, ITableRow - { - /// - /// Gets or sets whether to return "", not null, when the end of a row is reached, - /// until the row is advanced: - /// - bool FillBlankColumns { get; set; } - - /// - /// Check for end of row. - /// - /// true if at end of row, false otherwise - bool RowEnd(); - - /// - /// Get the next field and advance the reader. - /// - /// the field at the next column - string ReadItem(); - - /// - /// Get the next field and advance the reader, filling with empty fields at the end of the row. - /// - /// the field at the next column - string ReadItemLinear(); - - /// - /// Get the number of fields in the current row. - /// - /// the number of fields in the current row - int RowLength(); - - /// - /// Read an entire row and advance the reader. - /// - /// The current row as an array of fields - string[] ReadRow(); - - /// - /// Read an entire row and advance the reader. - /// - /// The length of the row to read, truncating or filling with empty fields as needed - /// The current row as an array of fields - string[] ReadRow(int len); - - /* - /// - /// Get the field at the column index. - /// - string this[int index] { get; } - - /// - /// Get the field at the column with the given header. - /// - string this[string header] { get; } - */ - - /// - /// Reset the reader to the beginning. - /// - void Reset(); - } - - /// - /// Write tabular data. - /// - public interface ITableWriter : ITableProcessor - { - /// - /// Write the next field and advance the writer. - /// - /// the field to write - void WriteItem(string item); - - /// - /// Write an entire row and advance the writer. - /// - /// The row to write as an array of fields - void WriteRow(string[] items); - - /// - /// Write an entire row and advance the writer. - /// - /// The length of the row to write, truncating or filling with empty fields as needed - /// The row to write as an array of fields - void WriteRow(string[] items, int len); - - /// - /// Set the field at the column index. - /// - string this[int index] { set; } - - /// - /// Set the field at the column with the given header. - /// - string this[string header] { set; } - } - - /// - /// Enumerator to read through the rows in a table. - /// - public class TableEnumerator : IEnumerator - { - ITableReader _reader; - - #region IEnumerator Members - /// - /// Create a new enumerator to read through the table rows - /// - /// the table to read lines from - public TableEnumerator(ITableReader reader) - { - _reader = reader; - } - /// - /// Return the enumerator to the initial state. - /// - public void Reset() - { - _reader.Reset(); - } - /// - /// Get the current row of the table. - /// - public ITableRow Current - { - get - { - return (ITableRow)_reader; - } - } - - /// - /// Get the current row of the table. - /// - object IEnumerator.Current - { - get - { - return ((TableEnumerator)this).Current; - } - } - - /// - /// Move the enumerator to the next row. - /// - /// true if the next row exists, or false if at the end of the table - public bool MoveNext() - { - _reader.NextRow(); - return !_reader.Eof(); - } - - #endregion - } - - ////////////////////////////////////////////// - ////// CSV support - ////////////////////////////////////////////// - - /// - /// Read TSV formatted data. - /// - public class TsvReader : CsvReader - { - private void Configure() - { - Delimiter = "\t"; - DelimiterSet = false; - ParseQuotes = false; - ReadHeaders = true; - SkipBlankColumnsLines = true; - SkipBlankLines = true; - // should this one be set? *** - IgnoreHeaderCase = true; - } - - /// - /// Create a TsvReader based on the TextReader, - /// - /// the TextReader to read the table from - public TsvReader(TextReader tr) - : base(tr) - { - Configure(); - } - - /// - /// Create a TsvReader based on the specified file, - /// - /// the name of the file to read the table from - public TsvReader(string fname) - : base(fname) - { - Configure(); - } - - /// - /// Create a TsvReader based on the Stream, - /// - /// the Stream to read the table from - public TsvReader(Stream fstream) - : base(fstream) - { - Configure(); - } - - /// - /// Create a TsvReader based on the specified file, - /// - /// the name of the file to read the table from - /// the encoding to use to interpet the file - public TsvReader(string fname, Encoding encoding) - : base(fname, encoding) - { - Configure(); - } - - /// - /// Create a TsvReader based on the Stream, - /// - /// the Stream to read the table from - /// the encoding to use to interpet the Stream - public TsvReader(Stream fstream, Encoding encoding) - : base(fstream, encoding) - { - Configure(); - } - } - - /// - /// Tab-Separated Value writer. - /// - public class TsvWriter : CsvWriter - { - private void Configure() - { - Delimiter = "\t"; - ParseQuotes = false; - SkipBlankLines = true; - EndInNewline = true; - // should this one be set? *** - IgnoreHeaderCase = true; - } - - /// - /// Create a TsvWriter based on the TextWriter, - /// - /// the TextWriter to write the table to - public TsvWriter(TextWriter tr) - : base(tr) - { - Configure(); - } - - /// - /// Create a TsvWriter based on the specified file, - /// - /// the name of the file to write the table to - public TsvWriter(string fname) - : base(fname) - { - Configure(); - } - - /// - /// Create a TsvWriter based on the Stream, - /// - /// the Stream to write the table to - public TsvWriter(Stream fstream) - : base(fstream) - { - Configure(); - } - - /// - /// Create a TsvWriter based on the specified file, - /// - /// the name of the file to write the table to - /// the encoding to use - public TsvWriter(string fname, Encoding encoding) - : base(fname, encoding) - { - Configure(); - } - - /// - /// Create a TsvWriter based on the Stream, - /// - /// the Stream to write the table to - /// the encoding to use - public TsvWriter(Stream fstream, Encoding encoding) - : base(fstream, encoding) - { - Configure(); - } - } - - /// - /// Read CSV formatted data. - /// - public class CsvReader : ITableReader, IDisposable - { - // trim whitespace from each entry: - private bool _trimWhitespace = true; - // skip lines that are only whitespace: - private bool _skipBlankLines = true; - // skip lines that have delimeters but only whitespace otherwise: - private bool _skipBlankColumnsLines = true; - // return "", not null, when the end of a row is reached, until the row is advanced: - private bool _fillBlankColumns = true; - // treat repeated delimiters as a single delimiter: - private bool _collapseDelimiters = false; - // treat delimiter string as a set of delimiter characters: - private bool _delimiterSet = false; - // read the first line as header names for the columns - private bool _readHeaders = false; - // the names of the headers - private string[] _headers = null; - private string[] _headersNormalized = null; - private bool _ignoreHeaderCase = true; - private bool _initialized = false; - // use the quoteChar to determine quoted sections: - private bool _parseQuotes = true; - private string _quoteChar = "\""; - private string _delimiter = ","; - - private TextReader _file; - private string _curLine; - private long _rowNumber = 0; // gives 1-based rows, like excel... - - // support 1-row read-ahead: - private StringCollection _curRow; - private string[] _curRowArray; - private int _curCol; - - /// - /// Create a CsvReader based on the TextReader, - /// - /// the TextReader to read the table from - public CsvReader(TextReader tr) - { - _file = tr; - //if (file == null) - // Console.Out.WriteLine(" Error: CsvReader could not open null file!"); - } - - /// - /// Create a CsvReader based on the specified file, - /// - /// the name of the file to read the table from - public CsvReader(string fname) - : this(ZStreamReader.Open(fname)) - // : this(new StreamReader(fname, Encoding.UTF8, true)) - { - } - - /// - /// Create a CsvReader based on the Stream, - /// - /// the Stream to read the table from - public CsvReader(Stream fstream) - : this(new StreamReader(fstream)) - { - } - - /// - /// Create a CsvReader based on the specified file, - /// - /// the name of the file to read the table from - /// the encoding to use to interpet the file - public CsvReader(string fname, Encoding encoding) - // : this(ZStreamReader.Open(fname, encoding)) - : this(new StreamReader(fname, encoding, true)) - { - } - - /// - /// Create a CsvReader based on the Stream, - /// - /// the Stream to read the table from - /// the encoding to use to interpet the Stream - public CsvReader(Stream fstream, Encoding encoding) - : this(new StreamReader(fstream, encoding, true)) - { - } - - /// - /// Gets or sets whether to trim whitespace from each field. - /// - public bool TrimWhitespace - { - get { return _trimWhitespace; } - set { _trimWhitespace = value; } - } - /// - /// Get or set whether to skip blank lines. - /// - public bool SkipBlankLines - { - get { return _skipBlankLines; } - set { _skipBlankLines = value; } - } - /// - /// Get or set whether to skip lines with all fields empty. - /// - public bool SkipBlankColumnsLines - { - get { return _skipBlankColumnsLines; } - set { _skipBlankColumnsLines = value; } - } - /// - /// Gets or sets whether to return "", not null, when the end of a row is reached, - /// until the row is advanced: - /// - public bool FillBlankColumns - { - get { return _fillBlankColumns; } - set { _fillBlankColumns = value; } - } - /// - /// Get or set whether to respect quotes when parsing - /// - public bool ParseQuotes - { - get { return _quoteChar != null && _quoteChar.Length > 0 && _parseQuotes; } - set { _parseQuotes = value; } - } - /// - /// Get or set the string to use for a quote symbol - /// - public string QuoteChar - { - get { return _quoteChar; } - set { _quoteChar = value; } - } - /// - /// Get or set the column delimiter string. - /// - public string Delimiter - { - get { return _delimiter; } - set { _delimiter = value; } - } - /// - /// Get or set whether to collapse consecutive delimiters. - /// - public bool CollapseDelimiters - { - get { return _collapseDelimiters; } - set { _collapseDelimiters = value; } - } - /// - /// Get or set whether to treate the delimiter string as a set of characters. - /// - public bool DelimiterSet - { - get { return _delimiterSet; } - set { _delimiterSet = value; } - } - /// - /// Get or set whether to read the headers from the first line of the input. - /// - public bool ReadHeaders - { - get { return _readHeaders; } - set { _readHeaders = value; } - } - /// - /// Gets or sets whether to ignore case when matching header names. - /// - public bool IgnoreHeaderCase - { - get { return _ignoreHeaderCase; } - set - { - if (_ignoreHeaderCase != value) - { - _ignoreHeaderCase = value; - FixupNormalizedHeaders(); - } - } - } - /// - /// Gets or sets the header names. - /// - public string[] Headers - { - get - { - Initialize(); - return _headers; - } - set - { - _headers = value; - FixupNormalizedHeaders(); - } - } - /// - /// Get the number of the current row. - /// - public long RowNumber - { - get { return _rowNumber; } - } - - /// - /// Check for end of file. - /// - /// true if at end of file, false otherwise - public bool Eof() - { - // a little tricky when finishing the last row with remaining whitespace... - // won't show as EOF until after nextRow is called... - if (_file == null) - return true; - if (_file.Peek() != -1) - return false; - if (!_initialized) - Initialize(); - return RowEnd(); - } - - /// - /// Check for end of row. - /// - /// true if at end of row, false otherwise - public bool RowEnd() - { - return ((_curRow == null || _curCol >= _curRow.Count) && - (_curRowArray == null || _curCol >= _curRowArray.Length)); - } - - private void Initialize() - { - if (_initialized) - return; - _initialized = true; - NextRow(); - // read and store the column header names: - if (ReadHeaders) - { - // always skip blanks when reading headers - bool givenSkipBlankLines = SkipBlankLines; - bool givenSkipBlankColumnsLines = SkipBlankColumnsLines; - SkipBlankLines = true; - SkipBlankColumnsLines = true; - Headers = ReadRow(); - SkipBlankLines = givenSkipBlankLines; - SkipBlankColumnsLines = givenSkipBlankColumnsLines; - } - } - - private void FixupNormalizedHeaders() - { - if (_headers == null) - { - _headersNormalized = null; - return; - } - _headersNormalized = new string[_headers.Length]; - for (int i = 0; i < _headers.Length; i++) - { - string header = _headers[i]; - if (header == null) - continue; - header = header.Trim(); - if (IgnoreHeaderCase) - header = header.ToLower(); - _headersNormalized[i] = header; - } - } - - /// - /// Get the field at the column index. - /// - public string this[int index] - { - get - { - if (!_initialized) - Initialize(); - if (_curRow == null) - { - // look in the string[], instead... - if (_curRowArray == null) - return null; - if (index < 0 || index >= _curRowArray.Length) - { - if (_fillBlankColumns) - return ""; - return null; - } - return _curRowArray[index]; - } - if (index < 0 || index >= _curRow.Count) - { - if (_fillBlankColumns) - return ""; - return null; - } - return _curRow[index]; - } - } - - /// - /// Get the field at the column with the given header. - /// - public string this[string header] - { - get - { - if (!_initialized) - Initialize(); - if (header == null || _headers == null) - return null; - header = header.Trim(); - if (IgnoreHeaderCase) - header = header.ToLower(); - for (int i = 0; i < _headers.Length; i++) - { - if (header == _headersNormalized[i]) - { - return this[i]; - } - } - return null; - } - } - - /// - /// Get the index of the column which has the given header. - /// - public int GetColumnIndex(string header) - { - if (!_initialized) - Initialize(); - if (header == null || _headers == null) - return -1; - header = header.Trim(); - if (IgnoreHeaderCase) - header = header.ToLower(); - for (int i = 0; i < _headers.Length; i++) - { - if (header == _headersNormalized[i]) - { - return i; - } - } - return -1; - } - - /// - /// Get the next field and advance the reader. - /// - /// the field at the next column - public string ReadItem() - { - // check if we need to setup the reading: - if (!_initialized) - Initialize(); - - //// Should actually return a blank entry for the *last* blank entry and null beyond *** - if (RowEnd()) - { - if (_fillBlankColumns) - return ""; - else - return null; - } - - string res = _curRow != null ? _curRow[_curCol] : _curRowArray[_curCol]; - _curCol++; - return res; - } - - // should optimize for 1-character quotes and delimiters... - private string ReadItemFromLine(ref int curPos) - { - if (curPos >= _curLine.Length) - return null; - - string resStr; - curPos++; - // check for empty case: - bool empty = (curPos >= _curLine.Length); - if (!empty) - { - // optimized check for empty in middle of line - if (_delimiterSet) // look for *any* of the characters - { - if (_curLine.Length - curPos >= 1 && - _delimiter.IndexOf(_curLine[curPos]) >= 0) - { - // leave cursor on the delimiter - empty = true; - } - } - else - { - if (_curLine.Length - curPos >= _delimiter.Length && - string.CompareOrdinal(_curLine, curPos, _delimiter, 0, _delimiter.Length) == 0) - { - // leave cursor on end of the delimiter: - curPos += _delimiter.Length - 1; - empty = true; - } - } - } - if (empty) - { - resStr = ""; - } - else - { - // check for unquoted case: - int nextDelimiterIndex; - if (_delimiterSet) - { - // should optimize this: - nextDelimiterIndex = _curLine.IndexOfAny(_delimiter.ToCharArray(), curPos); - } - else - { - nextDelimiterIndex = _curLine.IndexOf(_delimiter, curPos); - } - if (nextDelimiterIndex < 0) - { - nextDelimiterIndex = _curLine.Length; - } - if (!_parseQuotes || _curLine.IndexOf(_quoteChar, curPos, nextDelimiterIndex - curPos) < 0) - { - // simple case! no quote characters... - resStr = _curLine.Substring(curPos, nextDelimiterIndex - curPos); - curPos = nextDelimiterIndex; - } - else - { - StringBuilder res = new StringBuilder(); - for (bool inQuoted = false; true; curPos++) - { - // check for end of line: - if (curPos >= _curLine.Length) - { - if (!inQuoted) - { - // done with item! - break; - } - else - { - // uh oh... a quoted newline... - if (_file == null) - break; - if (_file.Peek() == -1) - break; - // read a new row... - // rowNumber++; -- don't count it as a new row. - _curLine = _file.ReadLine(); - curPos = -1; - res.Append('\n'); - continue; - } - } - - // check for delimiters: - if (!inQuoted) - { - if (_delimiterSet) // look for *any* of the characters - { - if (_curLine.Length - curPos >= 1 && - _delimiter.IndexOf(_curLine[curPos]) >= 0) - { - // leave cursor on the delimiter - break; - } - } - else - { - if (_curLine.Length - curPos >= _delimiter.Length && - string.CompareOrdinal(_curLine, curPos, _delimiter, 0, _delimiter.Length) == 0) - { - // leave cursor on end of the delimiter: - curPos += _delimiter.Length - 1; - break; - } - } - } - // hard to say how to best handle quotes... Want to be lenient. - if (_parseQuotes && - (_curLine.Length - curPos >= _quoteChar.Length && - string.CompareOrdinal(_curLine, curPos, _quoteChar, 0, _quoteChar.Length) == 0)) - { - // double quote characters mean a literal quote character - // - but only when in quoted mode! - if (inQuoted && - _curLine.Length - curPos >= 2 * _quoteChar.Length && - string.CompareOrdinal(_curLine, curPos + _quoteChar.Length, _quoteChar, 0, _quoteChar.Length) == 0) - { - res.Append(_quoteChar); - curPos += 2 * _quoteChar.Length - 1; - } - else - { - inQuoted = !inQuoted; - curPos += _quoteChar.Length - 1; - } - continue; - } - res.Append(_curLine[curPos]); - } - resStr = res.ToString(); - } - if (_trimWhitespace) - { - // not perfect! *** - if (resStr.Length > 0 && (resStr[0] == ' ' || resStr[resStr.Length - 1] == ' ')) - { - resStr = resStr.Trim(); - } - } - } - // if we are collapsing repeated delimiters, we can do this by skipping blank elements... - if (_collapseDelimiters && resStr.Length == 0) - { - return ReadItemFromLine(ref curPos); - } - //Console.Out.WriteLine(" Item: " + resStr); - return resStr; - } - - /// - /// Get the next field and advance the reader, filling with empty fields at the end of the row. - /// - /// the field at the next column - public string ReadItemLinear() - { - if (!_initialized) - Initialize(); - - if (RowEnd()) - NextRow(); - return ReadItem(); - } - - /// - /// Get the number of fields in the current row. - /// - /// the number of fields in the current row - public int RowLength() - { - if (!_initialized) - Initialize(); - - if (_curRow == null) - { - if (_curRowArray == null) - return 0; - return _curRowArray.Length; - } - return _curRow.Count; - } - - // test if all entries in current row are blank - private bool RowBlank() - { - if (!_initialized) - Initialize(); - - if (_curRow == null) - { - if (_curRowArray == null) - return true; - for (int i = 0; i < _curRowArray.Length; i++) - { - string field = _curRowArray[i]; - if (field.Length != 0) - { - if (_trimWhitespace && - (field[0] == ' ' || field[field.Length - 1] == ' ')) - { - if (field.Trim().Length != 0) - return false; - } - else - { - return false; - } - } - } - return true; - } - for (int i = 0; i < _curRow.Count; i++) - { - string field = _curRow[i]; - if (field.Length != 0) - { - if (_trimWhitespace && - (field[0] == ' ' || field[field.Length - 1] == ' ')) - { - if (field.Trim().Length != 0) - return false; - } - else - { - return false; - } - } - } - return true; - } - - /// - /// Read an entire row and advance the reader. - /// - /// The current row as an array of fields - public string[] ReadRow() - { - return ReadRow(-1); - } - - /// - /// Read an entire row and advance the reader. - /// - /// The length of the row to read, truncating or filling with empty fields as needed - /// The current row as an array of fields - public string[] ReadRow(int len) - { - // check if we need to setup the reading: - if (!_initialized) - { - Initialize(); - } - if (Eof()) - return null; - if (_curRow == null && _curRowArray == null) - { - NextRow(); - } - if (_curRow == null && _curRowArray == null) - return null; - - if (!_parseQuotes && (_delimiterSet || _delimiter.Length == 1) && _curRow == null) - { - _readRowResult = _curRowArray; - NextRow(); - return _readRowResult; - } - - if (_curRow == null) - { - if (len < 0 || len == _curRowArray.Length) - { - _readRowResult = _curRowArray; - } - else - { - if (_readRowResult.Length != len) - _readRowResult = new string[len]; - if (len < _curRowArray.Length) - { -#if ENABLE_BARTOK - for (int i = 0; i < readRowResult.Length; i++) - { - readRowResult[i] = curRowArray[i]; - } -#else - Array.Copy(_curRowArray, _readRowResult, len); -#endif - } - else - { - _curRowArray.CopyTo(_readRowResult, 0); - for (int i = _curRowArray.Length; i < _readRowResult.Length; i++) - { - _readRowResult[i] = ""; - } - } - } - NextRow(); - return _readRowResult; - } - // always make a new array, for now... - _readRowResult = new string[len < 0 ? _curRow.Count : len]; - if (len < 0 || len == _curRow.Count) - { - if (_readRowResult.Length != _curRow.Count) - _readRowResult = new string[_curRow.Count]; - _curRow.CopyTo(_readRowResult, 0); - } - else - { - if (_readRowResult.Length != len) - _readRowResult = new string[len]; - if (len < _curRow.Count) - { - for (int i = 0; i < _readRowResult.Length; i++) - { - _readRowResult[i] = _curRow[i]; - } - } - else - { - _curRow.CopyTo(_readRowResult, 0); - for (int i = _curRow.Count; i < _readRowResult.Length; i++) - { - _readRowResult[i] = ""; - } - } - } - NextRow(); - return _readRowResult; - } - string[] _readRowResult = new string[0]; - - // only reads the *remaining* items... - // also advances the row! - private void ReadRowFromLine() - { - _curRow = null; - _curRowArray = null; - if (_curLine == null) - return; - if (_file == null) - return; - - if (_parseQuotes || !(_delimiterSet || _delimiter.Length == 1)) - { - _curRow = new StringCollection(); - int linePos = -1; - while (linePos < _curLine.Length - 1) - { - string field = ReadItemFromLine(ref linePos); - if (field != null) - { - _curRow.Add(field); - } - } - } - else - { - // we just split, now... - if (_delimiter.Length == 1) - { - _curRowArray = _curLine.Split(_delimiter[0]); - } - else - { - _curRowArray = _curLine.Split(_delimiter.ToCharArray()); - } - } - _curLine = null; - _curCol = 0; - } - - /// - /// Advance to the next row. - /// - public void NextRow() - { - if (_file == null) - return; - if (!_initialized) - { - Initialize(); - return; - } - _curRow = null; - _curRowArray = null; - _curCol = 0; - while (true) - { - _rowNumber++; - _curLine = _file.ReadLine(); - if (_curLine == null) - { - return; - } - if (_skipBlankLines && - (_curLine.Length == 0 || - (_curLine[0] == ' ' && _curLine.Trim().Length == 0))) - { - //Console.Out.WriteLine("(Skipping row as blank line...)"); - continue; - } - ReadRowFromLine(); - if (_skipBlankColumnsLines && RowBlank()) - { - //Console.Out.WriteLine("(Skipping row with blank columns...)"); - _curRow = null; - _curRowArray = null; - continue; - } - break; - } - - //ReadRowFromLine(); - } - - /// - /// Close the table. - /// - public void Close() - { - if (_file == null) - return; - _file.Close(); - _curCol = -1; - _curLine = null; - _curRow = null; - _curRowArray = null; - _file = null; - } - - /// - /// Reset the reader to the beginning. - /// - /// The reader is not based on a Stream. - public void Reset() - { - if (_file == null) - return; - if (!(_file is StreamReader)) - { - throw new InvalidOperationException("Cannot reset CsvReader not based on a Stream."); - } - ((StreamReader)_file).BaseStream.Seek(0, SeekOrigin.Begin); - ((StreamReader)_file).DiscardBufferedData(); - _initialized = false; - _rowNumber = 0; - _curCol = -1; - _curLine = null; - _curRow = null; - _curRowArray = null; - } - - /// - /// Allows for random access into the file. The user is responsible - /// to make sure that position is at the beginning of a row. - /// - /// new position - /// relative to what - /// The reader is not based on a Stream. - public void Seek(long position, SeekOrigin origin) - { - if (_file == null) - return; - if (!(_file is StreamReader)) - { - throw new InvalidOperationException("Cannot seek reader not based on a Stream."); - } - - ((StreamReader)_file).BaseStream.Seek(position, origin); - if (position == 0) - { - _initialized = false; - } - _curCol = -1; - _curLine = null; - _curRow = null; - _curRowArray = null; - } - - /// - /// Returns position of the cursor in the file - /// - /// byte offset of the current position - /// The reader is not based on a Stream. - public long Position() - { - if (_file == null) - return 0; - if (!(_file is StreamReader)) - { - throw new InvalidOperationException("Cannot tell position for reader not based on a Stream."); - } - return ((StreamReader)_file).BaseStream.Position; - } - - #region IDisposable Members - - /// - /// Dispose. - /// - public void Dispose() - { - Close(); - } - - #endregion - /// - /// Return the enumerator - /// - /// an enumerator for the rows in this table - public IEnumerator GetEnumerator() - { - return new TableEnumerator(this); - } - } - - //// TODO: support reorder list - //// TODO: support filtering (ignoring) columns - /// - /// Write CSV formatted data. - /// - public class CsvWriter : ITableWriter, IDisposable - { - // trim whitespace from each entry: - private bool _trimWhitespace = true; - // skip lines that are only whitespace: - private bool _skipBlankLines = true; - // use the quoteChar to determine quoted sections: - private bool _parseQuotes = true; - // always end in a newline: - private bool _endInNewline = true; - // transform tab, carriage return, and newline into space: - private bool _normalizeWhitespace = false; - // characters to use if normalizing whitespace: - private char[] _whitespaceChars = new char[] { '\r', '\n', '\t' }; - - // support for addressing by column headers: - private string[] _headers = null; - private string[] _headersNormalized = null; - private bool _ignoreHeaderCase = true; - private bool _initialized = false; - private StringCollection _curRow = null; - private bool _writeHeaders = true; - - private string _quoteChar = "\""; - private string _delimiter = ","; - private char[] _delimiterOrQuoteOrNewline = new char[] { ',', '"', '\r', '\n' }; - - private bool _lineStart = true; - private long _rowNumber; - - private TextWriter _file; - - /// - /// Create a CsvWriter based on the TextWriter, - /// - /// the TextWriter to write the table to - public CsvWriter(TextWriter tr) - { - _file = tr; - //if (file == null) - // Console.Out.WriteLine(" Error: CsvReader could not open null file!"); - _rowNumber = 1; - } - - /// - /// Create a CsvWriter based on the specified file, - /// - /// the name of the file to write the table to - public CsvWriter(string fname) - : this(ZStreamWriter.Open(fname)) - { - } - - /// - /// Create a CsvWriter based on the Stream, - /// - /// the Stream to write the table to - public CsvWriter(Stream fstream) - : this(new StreamWriter(fstream)) - { - } - - /// - /// Create a CsvWriter based on the specified file, - /// - /// the name of the file to write the table to - /// the encoding to use - public CsvWriter(string fname, Encoding encoding) - : this(new StreamWriter(fname, false, encoding)) - { - } - - /// - /// Create a CsvWriter based on the Stream, - /// - /// the Stream to write the table to - /// the encoding to use - public CsvWriter(Stream fstream, Encoding encoding) - : this(new StreamWriter(fstream, encoding)) - { - } - - /// - /// Get or set whether to convert all whitespace into space characters. - /// - public bool NormalizeWhitespace - { - get { return _normalizeWhitespace; } - set { _normalizeWhitespace = value; } - } - /// - /// Get or set the characters to consider as whitespace. - /// - public char[] WhitespaceChars - { - get { return _whitespaceChars; } - set - { - if (value != null) - { - _whitespaceChars = value; - } - else - { - _whitespaceChars = new char[] { '\r', '\n', '\t', ' ' }; - } - } - } - - /// - /// Get or set whether to write the headers as the first row. - /// - public bool WriteHeaders - { - get { return _writeHeaders; } - set { _writeHeaders = value; } - } - - /// - /// Gets or sets whether to trim whitespace from each field. - /// - public bool TrimWhitespace - { - get { return _trimWhitespace; } - set { _trimWhitespace = value; } - } - - /// - /// Get or set whether to skip blank lines. - /// - public bool SkipBlankLines - { - get { return _skipBlankLines; } - set { _skipBlankLines = value; } - } - - /// - /// Get or set whether to interpet quote characters when parsing. - /// - public bool ParseQuotes - { - get { return _parseQuotes; } - set { _parseQuotes = value; } - } - - /// - /// Get or set the string to use as a quote symbol. - /// - public string QuoteChar - { - get { return _quoteChar; } - set - { - _quoteChar = value; - FixupDelimiterOrQuoteOrNewline(); - } - } - - /// - /// Get or set the string to use to delimit columns. - /// - public string Delimiter - { - get { return _delimiter; } - set - { - _delimiter = value; - FixupDelimiterOrQuoteOrNewline(); - } - } - private void FixupDelimiterOrQuoteOrNewline() - { - string dqn = (_delimiter == null ? "" : _delimiter) + (_quoteChar == null ? "" : _quoteChar) + "\r\n"; - _delimiterOrQuoteOrNewline = dqn.ToCharArray(); - } - - /// - /// Get or set whether to end the file in a newline. - /// - public bool EndInNewline - { - get { return _endInNewline; } - set { _endInNewline = value; } - } - - /// - /// Gets or sets whether to ignore case when matching header names. - /// - public bool IgnoreHeaderCase - { - get { return _ignoreHeaderCase; } - set - { - if (_ignoreHeaderCase != value) - { - _ignoreHeaderCase = value; - FixupNormalizedHeaders(); - } - } - } - /// - /// Gets or sets the header names. - /// - public string[] Headers - { - get - { - return _headers; - } - set - { - _headers = value; - FixupNormalizedHeaders(); - } - } - private void FixupNormalizedHeaders() - { - if (_headers == null) - { - _headersNormalized = null; - return; - } - _headersNormalized = new string[_headers.Length]; - for (int i = 0; i < _headers.Length; i++) - { - string header = _headers[i]; - if (header == null) - continue; - header = header.Trim(); - if (IgnoreHeaderCase) - header = header.ToLower(); - _headersNormalized[i] = header; - } - } - - /// - /// Add a new header to the header list. - /// - /// the header to add - public void AddHeader(string header) - { - if (_headers == null) - _headers = new string[0]; - string[] newHeaders = new string[_headers.Length + 1]; - _headers.CopyTo(newHeaders, 0); - newHeaders[newHeaders.Length - 1] = header; - Headers = newHeaders; - } - - /// - /// Check for end of file. - /// - /// true if at end of file, false otherwise - public bool Eof() - { - return (_file == null); - } - - private void Initialize() - { - if (!_initialized) - { - _initialized = true; - // check if headers were needed and not written: - if (_writeHeaders && _headers != null) - { - WriteRow(_headers); - } - } - } - - private string Quotify(string item) - { - if (_trimWhitespace) - { - if (item.Length != 0 && - (item[0] == ' ' || item[item.Length - 1] == ' ')) - { - item = item.Trim(); - } - } - if (!_parseQuotes) - { - return item; - } - - if (item.IndexOfAny(_delimiterOrQuoteOrNewline) < 0) - { - // no delimiters, newlines, or quotes in string - return item; - } - StringBuilder sb = new StringBuilder(item); - sb.Replace(_quoteChar, _quoteChar + _quoteChar); - sb.Insert(0, _quoteChar); - sb.Append(_quoteChar); - return sb.ToString(); - } - - /// - /// Write the next field and advance the writer. - /// - /// the field to write - public void WriteItem(string item) - { - Initialize(); - WriteStoredRow(); - if (Eof()) - return; - - if (_lineStart) - { - _lineStart = false; - } - else - { - _file.Write(_delimiter); - } - - if (_normalizeWhitespace) - { - item = NormalizeWS(item); - } - item = Quotify(item); - _file.Write(item); - } - - private string NormalizeWS(string orig) - { - if (orig.IndexOfAny(_whitespaceChars) < 0) - return orig; - orig = orig.Replace("\r\n", " "); - orig = orig.Replace('\r', ' '); - orig = orig.Replace('\n', ' '); - orig = orig.Replace('\t', ' '); - return orig; - } - - /// - /// Write an entire row and advance the writer. - /// - /// The row to write as an array of fields - public void WriteRow(string[] items) - { - WriteRow(items, -1); - } - - /// - /// Write an entire row and advance the writer. - /// - /// The length of the row to write, truncating or filling with empty fields as needed - /// The row to write as an array of fields - public void WriteRow(string[] items, int len) - { - Initialize(); - WriteStoredRow(); - if (Eof()) - return; - - if (!_parseQuotes) - { - if (_normalizeWhitespace) - { - // this modifies the input parameter! - for (int i = 0; i < items.Length; i++) - { - items[i] = NormalizeWS(items[i]); - } - } - - if (_skipBlankLines && _lineStart && items.Length == 0) - return; - // if (len < 0 || len == items.Length) - // { - // file.WriteLine(string.Join(delimiter, items)); - // } - // else - // { - // if (items.Length < len) - // { - // file.Write(string.Join(delimiter, items)); - // // pad with empty strings: - // for (int i = items.Length; i < len; i++) - // { - // file.Write(delimiter); - // } - // file.WriteLine(); - // } - // else - // { - // file.WriteLine(string.Join(delimiter, items, 0, len)); - // } - // } - if (items.Length == 0) - { - if (len > 0) - { - for (int i = 1; i < len; i++) - { - _file.Write(_delimiter); - } - } - } - else - { - _file.Write(items[0]); - if (len < 0 || len >= items.Length) - { - for (int i = 1; i < items.Length; i++) - { - _file.Write(_delimiter); - if (items[i].Length != 0) - _file.Write(items[i]); - } - for (int i = items.Length; i < len; i++) - { - _file.Write(_delimiter); - } - } - else - { - for (int i = 1; i < len; i++) - { - _file.Write(_delimiter); - if (items[i].Length != 0) - _file.Write(items[i]); - } - } - } - _file.WriteLine(); - - _lineStart = true; - _rowNumber++; - return; - } - - for (int i = 0; i < items.Length && (len < 0 || i < len); i++) - { - WriteItem(items[i]); - } - // pad with empty strings: - if (len > 0) - { - for (int i = items.Length; i < len; i++) - { - WriteItem(""); - } - } - NextRow(); - } - - /// - /// Write an entire row and advance the writer. - /// - /// The row to write as a collection of fields - public void WriteRow(StringCollection items) - { - WriteRow(items, -1); - } - - /// - /// Write an entire row and advance the writer. - /// - /// The length of the row to write, truncating or filling with empty fields as needed - /// The row to write as a collection of fields - public void WriteRow(StringCollection items, int len) - { - Initialize(); - WriteStoredRow(); - if (Eof()) - return; - - if (!_parseQuotes) - { - // string[] itemsA = new string[items.Count]; - // items.CopyTo(itemsA, 0); - - if (_normalizeWhitespace) - { - // for (int i = 0; i < itemsA.Length; i++) - // { - // itemsA[i] = NormalizeWS(itemsA[i]); - // } - for (int i = 0; i < items.Count; i++) - { - items[i] = NormalizeWS(items[i]); - } - } - - // if (skipBlankLines && lineStart && itemsA.Length == 0) return; - if (_skipBlankLines && _lineStart && items.Count == 0) - return; - // if (len < 0 || len == itemsA.Length) - // { - // file.WriteLine(string.Join(delimiter, itemsA)); - // } - // else - // { - // if (itemsA.Length < len) - // { - // file.Write(string.Join(delimiter, itemsA)); - // // pad with empty strings: - // for (int i = itemsA.Length; i < len; i++) - // { - // file.Write(delimiter); - // } - // file.WriteLine(); - // } - // else - // { - // file.WriteLine(string.Join(delimiter, itemsA, 0, len)); - // } - // } - if (items.Count == 0) - { - if (len > 0) - { - for (int i = 1; i < len; i++) - { - _file.Write(_delimiter); - } - } - } - else - { - _file.Write(items[0]); - if (len < 0 || len >= items.Count) - { - for (int i = 1; i < items.Count; i++) - { - _file.Write(_delimiter); - if (items[i].Length != 0) - _file.Write(items[i]); - } - for (int i = items.Count; i < len; i++) - { - _file.Write(_delimiter); - } - } - else - { - for (int i = 1; i < len; i++) - { - _file.Write(_delimiter); - if (items[i].Length != 0) - _file.Write(items[i]); - } - } - } - _file.WriteLine(); - - _lineStart = true; - _rowNumber++; - return; - } - - for (int i = 0; i < items.Count && (len < 0 || i < len); i++) - { - WriteItem(items[i]); - } - // pad with empty strings: - if (len > 0) - { - for (int i = items.Count; i < len; i++) - { - WriteItem(""); - } - } - NextRow(); - } - - /// - /// Set the field at the column index. - /// - public string this[int index] - { - set - { - if (index < 0) - return; - if (_curRow == null) - _curRow = new StringCollection(); - if (_curRow.Count <= index) // extend it... - { - for (int i = _curRow.Count; i <= index; i++) - { - _curRow.Add(""); - } - } - _curRow[index] = value; - } - } - - /// - /// Set the field at the column with the given header. - /// - public string this[string header] - { - set - { - if (header == null || _headers == null) - return; - header = header.Trim(); - if (IgnoreHeaderCase) - header = header.ToLower(); - for (int i = 0; i < _headersNormalized.Length; i++) - { - if (header == _headersNormalized[i]) - { - this[i] = value; - return; - } - } - // do nothing! - return; - } - } - - private void WriteStoredRow() - { - if (_curRow == null) - return; - WriteRow(_curRow); - _curRow = null; - } - - /// - /// Advance to the next row. - /// - public void NextRow() - { - if (Eof()) - return; - if (_curRow != null) - { - WriteStoredRow(); - return; - } - if (_lineStart && _skipBlankLines) - return; - _file.WriteLine(); - _lineStart = true; - _rowNumber++; - } - - /// - /// Get the number of the current row. - /// - public long RowNumber - { - get { return _rowNumber; } - } - - /// - /// Close the table. - /// - public void Close() - { - if (Eof()) - return; - if (_curRow != null) - { - WriteStoredRow(); - return; - } - if (!_lineStart && _endInNewline) - NextRow(); - _file.Flush(); - _file.Close(); - _lineStart = true; - _file = null; - } - #region IDisposable Members - - /// - /// Dispose. - /// - public void Dispose() - { - Close(); - } - - #endregion - } - -#if !ENABLE_BARTOK - -#if !DISABLE_XML - ////////////////////////////////////////////// - ////// XML support - ////////////////////////////////////////////// - - //// TODO: Decide how to handle attributes vs. child elements - //// TODO: Allow for categories (pushing and popping levels) - //// TODO: Allow override of given element names by header order? - - /// - /// Read XML formatted data. - /// - public class XmlTableReader : ITableReader - { - private bool _trimWhitespace = true; - private bool _fillBlankColumns = true; - private bool _ignoreHeaderCase = true; - private bool _addUnknownHeaders = true; - private bool _headerOrdered = true; - - private XmlTextReader _file; - private Hashtable _currentRow; - private ArrayList _currentRowSequence; - private string _currentName; - private int _currentCol; - //private bool initialized = false; - private string _tableName; - private string[] _headers; - private bool _initialized = false; - - private int _level = 0; - - /// - /// Create a new XmlTableReader - /// - /// the source to base the XmlTableReader on - public XmlTableReader(XmlTextReader tr) - { - tr.DtdProcessing = DtdProcessing.Prohibit; - _headers = new string[0]; - _file = tr; - if (_file != null) - { - _file.WhitespaceHandling = WhitespaceHandling.None; - _file.MoveToContent(); - // read in the "Table" element - _tableName = ""; - if (_file.IsStartElement()) - { - _tableName = _file.Name; - _file.Read(); - } - - // NextRow(); // - don't do this! Might initialize too soon. - } - } - - /// - /// Create a new XmlTableReader - /// - /// the name of the file to base the XmlTableReader on - public XmlTableReader(string fname) - : this(new XmlTextReader(ZStreamReader.Open(fname)) { DtdProcessing = DtdProcessing.Prohibit }) - { - } - - /// - /// Create a new XmlTableReader - /// - /// the source to base the XmlTableReader on - public XmlTableReader(Stream tr) - : this(new XmlTextReader(tr) { DtdProcessing = DtdProcessing.Prohibit }) - { - } - - /// - /// Create a new XmlTableReader - /// - /// the source to base the XmlTableReader on - public XmlTableReader(TextReader tr) - : this(new XmlTextReader(tr) { DtdProcessing = DtdProcessing.Prohibit }) - { - } - - /// - /// Get the current in the hierarchy. - /// - public int Level - { - get { return _level; } - } - - /// - /// Gets or sets the header names. - /// - public string[] Headers - { - get { return _headers; } - set { _headers = value; } - } - - /// - /// Get or set whether to add new headers to the header list as they are encountered. - /// - public bool AddUnknownHeaders - { - get { return _addUnknownHeaders; } - set { _addUnknownHeaders = value; } - } - - /// - /// Get or set whether to sort the headers. - /// - public bool HeaderOrdered - { - get { return _headerOrdered; } - set { _headerOrdered = value; } - } - - /// - /// Get the name of the table. - /// - public string TableName - { - get { return _tableName; } - } - - /// - /// Check for end of file. - /// - /// true if at end of file, false otherwise - public bool Eof() - { - if (!_initialized) - Initialize(); - return _currentRow == null && (_file.ReadState == ReadState.Closed || _file.EOF); - } - - /// - /// Check for end of row. - /// - /// true if at end of row, false otherwise - public bool RowEnd() - { - if (!_initialized) - Initialize(); - return Eof() || _currentRowSequence == null || - _currentCol >= _currentRowSequence.Count; - } - - /// - /// Get the next field and advance the reader. - /// - /// the field at the next column - public string ReadItem() - { - if (!_initialized) - Initialize(); - if (Eof()) - return null; - if (RowEnd()) - { - // should we fill even this?? - if (FillBlankColumns) - return ""; - return null; - } - string res = (string)_currentRowSequence[_currentCol]; - _currentCol++; - return res; - } - - /// - /// Get the next field and advance the reader, filling with empty fields at the end of the row. - /// - /// the field at the next column - public string ReadItemLinear() - { - if (!_initialized) - Initialize(); - if (Eof()) - return null; - if (RowEnd()) - NextRow(); - return ReadItem(); - } - - /// - /// Get the number of fields in the current row. - /// - /// the number of fields in the current row - public int RowLength() - { - if (!_initialized) - Initialize(); - if (_currentRowSequence == null) - return 0; - return _currentRowSequence.Count; - } - - /// - /// Read an entire row and advance the reader. - /// - /// The current row as an array of fields - public string[] ReadRow() - { - if (!_initialized) - Initialize(); - if (_currentRowSequence == null) - return null; - string[] res = (string[])_currentRowSequence.ToArray(typeof(string)); - NextRow(); - return res; - } - - /// - /// Read an entire row and advance the reader. - /// - /// The length of the row to read, truncating or filling with empty fields as needed - /// The current row as an array of fields - public string[] ReadRow(int len) - { - if (!_initialized) - Initialize(); - if (len < 0) - return ReadRow(); - if (_currentRowSequence == null) - return null; - string[] res = new string[len]; - for (int i = 0; i < res.Length; i++) - { - if (i < _currentRowSequence.Count) - { - res[i] = (string)_currentRowSequence[i]; - } - else - { - res[i] = ""; - } - } - NextRow(); - return res; - } - - private void Initialize() - { - if (_initialized) - return; - _initialized = true; - NextRow(); - // can't read and store the column header names: - } - - /// - /// Advance to the next row. - /// - public void NextRow() - { - if (!_initialized) - { - Initialize(); - return; - } - _currentRow = null; - _currentRowSequence = null; - _currentName = null; - _currentCol = -1; - if (Eof()) - { - return; - } - - if (!_file.IsStartElement()) - { - // what to do here? It's wrong. - _file.Read(); - NextRow(); - return; - } - - _currentName = _file.Name; - _currentRow = new Hashtable(); - // assumes headers not null - _currentRowSequence = new ArrayList(_headers.Length); - _currentCol = 0; - if (!_file.IsEmptyElement) - { - string givenHeader, name, val; - - if (_file.HasAttributes) - { - for (int a = 0; a < _file.AttributeCount; a++) - { - _file.MoveToAttribute(a); - givenHeader = _file.Name; - name = givenHeader.Trim(); - if (IgnoreHeaderCase) - name = name.ToLower(); - val = _file.Value; - if (TrimWhitespace) - val = val.Trim(); - - int index = -1; - for (int i = 0; i < _headers.Length; i++) - { - string match = _headers[i].Trim(); - if (IgnoreHeaderCase) - match = match.ToLower(); - if (name == match) - { - index = i; - break; - } - } - if (index < 0) - { - if (_addUnknownHeaders) - { - string[] oldHeaders = _headers; - _headers = new string[oldHeaders.Length + 1]; - oldHeaders.CopyTo(_headers, 0); - index = _headers.Length - 1; - _headers[index] = givenHeader; - } - } - //currentRow.Add(name, val); - _currentRow[name] = val; - if (!_headerOrdered) - { - // skip adding to the sequence for attributes! - //currentRowSequence.Add(val); - } - else - { - if (val.Length != 0 && index >= 0 && index < _headers.Length) - { - for (int b = _currentRowSequence.Count; b <= index; b++) - { - _currentRowSequence.Add(""); - } - _currentRowSequence[index] = val; - } - } - } - _file.MoveToElement(); // Moves the reader back to the element node. - } - - _file.Read(); // pass start element - while (!(_file.NodeType == XmlNodeType.EndElement)) - { - if (_file.IsStartElement()) - { - givenHeader = _file.Name; - name = givenHeader.Trim(); - if (IgnoreHeaderCase) - name = name.ToLower(); - val = ""; - if (!_file.IsEmptyElement) - { - _file.Read(); - val = _file.ReadString(); - if (TrimWhitespace) - val = val.Trim(); - } - - int index = -1; - for (int i = 0; i < _headers.Length; i++) - { - string match = _headers[i].Trim(); - if (IgnoreHeaderCase) - match = match.ToLower(); - if (name == match) - { - index = i; - break; - } - } - if (index < 0) - { - if (_addUnknownHeaders) - { - string[] oldHeaders = _headers; - _headers = new string[oldHeaders.Length + 1]; - oldHeaders.CopyTo(_headers, 0); - index = _headers.Length - 1; - _headers[index] = givenHeader; - } - } - //currentRow.Add(name, val); - _currentRow[name] = val; - if (!_headerOrdered) - { - // skip adding to the sequence for attributes! - //currentRowSequence.Add(val); - } - else - { - if (val.Length != 0 && index >= 0 && index < _headers.Length) - { - for (int b = _currentRowSequence.Count; b <= index; b++) - { - _currentRowSequence.Add(""); - } - _currentRowSequence[index] = val; - } - } - _file.Read(); // skip empty element OR end element... - } - else - { - // text not within a child element?? - val = _file.ReadString(); - if (TrimWhitespace) - val = val.Trim(); - //currentRow.Add("", val); - _currentRow[""] = val; - } - } - } - _file.Read(); - // try to skip the document closing tag? (XmlReader is disgusting, really) - while (_file.NodeType == XmlNodeType.EndElement) - { - _file.Read(); - _level--; - } - if (_level < 0) - _level = 0; - } - - /// - /// Get the field at the column index. - /// - public string this[int index] - { - get - { - if (!_initialized) - Initialize(); - if (_currentRowSequence == null || index < 0 || - index >= _currentRowSequence.Count) - { - if (FillBlankColumns) - return ""; - return null; - } - return (string)_currentRowSequence[index]; - } - } - - /// - /// Get the field at the column with the given header. - /// - public string this[string header] - { - get - { - if (!_initialized) - Initialize(); - header = header.Trim(); - if (IgnoreHeaderCase) - header = header.ToLower(); - string res = (string)_currentRow[header]; - if (res == null && FillBlankColumns) - res = ""; - return res; - } - } - - /// - /// Close the table. - /// - public void Close() - { - _file.Close(); - } - - /// - /// Reset the reader to the beginning. - /// - /// Always thrown, currently. - public void Reset() - { - throw new InvalidOperationException("Cannot reset XmlTableReader."); - } - - /// - /// Gets or sets whether to trim whitespace from each field. - /// - public bool TrimWhitespace - { - get - { - return _trimWhitespace; - } - set - { - _trimWhitespace = value; - } - } - - /// - /// Gets or sets whether to return "", not null, when the end of a row is reached, - /// until the row is advanced: - /// - public bool FillBlankColumns - { - get - { - return _fillBlankColumns; - } - set - { - _fillBlankColumns = value; - } - } - - /// - /// Gets or sets whether to ignore case when matching header names. - /// - public bool IgnoreHeaderCase - { - get - { - return _ignoreHeaderCase; - } - set - { - _ignoreHeaderCase = value; - } - } - - /// - /// Get a row enumerator. - /// - /// and enumerator for the row in this table - public IEnumerator GetEnumerator() - { - return new TableEnumerator(this); - } - } - - /// - /// Write XML formatted data. - /// - public class XmlTableWriter : ITableWriter - { - private bool _trimWhitespace = true; - private bool _ignoreHeaderCase = true; - private bool _addUnknownHeaders = true; - private bool _skipEmptyElements = true; - - private XmlTextWriter _file; - //private Hashtable currentRow; - private ArrayList _currentRowSequence; - private string _tableName = "Table"; - private string _currentName = "Item"; - private int _currentCol; - private bool _initialized; - private string[] _headers; - private bool _fieldsAsAttributes; - private bool _elementEndPending; - private int _openElementCount; - - /// - /// Create a new XmlTableWriter. - /// - /// the destination to write the table to - public XmlTableWriter(XmlTextWriter tr) - { - _file = tr; - _currentCol = 0; - if (_file != null) - { - _file.Formatting = Formatting.Indented; - _file.Indentation = 4; - //Write the XML delcaration - _file.WriteStartDocument(); - } - } - - /// - /// Create a new XmlTableWriter. - /// - /// the filename of the destination to write the table to - public XmlTableWriter(string fname) - : this(new XmlTextWriter(ZStreamWriter.Open(fname))) - { - } - - /// - /// Create a new XmlTableWriter. - /// - /// the destination to write the table to - public XmlTableWriter(Stream tr) - : this(new XmlTextWriter(tr, null)) - { - } - - /// - /// Create a new XmlTableWriter. - /// - /// the destination to write the table to - public XmlTableWriter(TextWriter tr) - : this(new XmlTextWriter(tr)) - { - } - - /// - /// Gets or sets the header names. - /// - public string[] Headers - { - get - { - return _headers; - } - set - { - _headers = value; - if (_headers != null) - { - for (int i = 0; i < _headers.Length; i++) - { - if (_headers[i] == null || _headers[i].Length == 0) - { - _headers[i] = "C" + i; - } - else - { - _headers[i] = _headers[i].Replace(' ', '_'); - _headers[i] = XmlConvert.EncodeName(_headers[i]); - } - } - } - } - } - - /// - /// Get or set the name to use for each item element, - /// - public string ItemName - { - get - { - return _currentName; - } - set - { - _currentName = value; - } - } - - /// - /// Get or set the name to use for the table element. - /// - public string TableName - { - get - { - return _tableName; - } - set - { - _tableName = value; - } - } - - /// - /// Get or set whether to represent the fields as attributes, instead of children. - /// - public bool FieldsAsAttributes - { - get { return _fieldsAsAttributes; } - set { _fieldsAsAttributes = value; } - } - - /// - /// Get or set whether to skip all empty elements. - /// - public bool SkipEmptyElements - { - get { return _skipEmptyElements; } - set { _skipEmptyElements = value; } - } - - /// - /// Check for end of file. - /// - /// true if at end of file, false otherwise - public bool Eof() - { - return _file.WriteState == WriteState.Closed; - } - - /// - /// Write the next field and advance the writer. - /// - /// the field to write - public void WriteItem(string item) - { - if (Eof()) - return; - this[_currentCol] = item; - _currentCol++; - } - - /// - /// Write an entire row and advance the writer. - /// - /// The row to write as an array of fields - public void WriteRow(string[] items) - { - WriteRow(items, -1); - } - - /// - /// Write an entire row and advance the writer. - /// - /// The length of the row to write, truncating or filling with empty fields as needed - /// The row to write as an array of fields - public void WriteRow(string[] items, int len) - { - // only handles sequence - not named items!!! *** - if (Eof()) - return; - if (items == null) - return; - if (!_initialized) - { - _initialized = true; - _file.WriteStartElement(TableName); - } - - if (_elementEndPending) - { - if (_openElementCount > 0) - { - if (TrimWhitespace) - { - _file.WriteEndElement(); - } - else - { - _file.WriteFullEndElement(); - } - _openElementCount--; - } - _elementEndPending = false; - } - - if (len < 0) - len = items.Length; - _file.WriteStartElement(ItemName); - for (int i = 0; i < len; i++) - { - string name; - if (_headers != null && i < _headers.Length) - { - name = _headers[i]; - } - else - { - name = "C" + i; - } - if (FieldsAsAttributes) - { - string val = (i < items.Length) ? (string)items[i] : ""; - if (val == null) - val = ""; - if (TrimWhitespace) - val = val.Trim(); - if (SkipEmptyElements && val.Length == 0) - { - // just skip it... - } - else - { - _file.WriteAttributeString(name, val); - } - } - else - { - string val = (i < items.Length) ? (string)items[i] : ""; - if (val == null) - val = ""; - if (TrimWhitespace) - val = val.Trim(); - ////file.WriteElementString(name, val); - if (SkipEmptyElements && val.Length == 0) - { - // just skip it... - } - else - { - _file.WriteStartElement(name); - if (val.Length == 0) - { - _file.WriteEndElement(); - } - else - { - _file.WriteString(val); - _file.WriteFullEndElement(); - } - } - } - } - - // delay writing the end element: - //file.WriteEndElement(); - _elementEndPending = true; - _openElementCount++; - } - - /// - /// Advance to the next row. - /// - public void NextRow() - { - if (_currentRowSequence != null) - { - // only handles sequence - not named items!!! *** - WriteRow((string[])_currentRowSequence.ToArray(typeof(string))); - _currentRowSequence = null; - } - - //currentRow = null; - _currentRowSequence = null; - _currentCol = 0; - } - - /// - /// Set the field at the column index. - /// - public string this[int index] - { - // checking headers can be done here or at write time. Not much difference. - set - { - if (index < 0) - return; - if (_currentRowSequence == null) - _currentRowSequence = new ArrayList(); - if (_currentRowSequence.Count <= index) // extend it... - { - for (int i = _currentRowSequence.Count; i <= index; i++) - { - _currentRowSequence.Add(""); - } - } - _currentRowSequence[index] = value; - } - } - - /// - /// Set the field at the column with the given header. - /// - public string this[string header] - { - // checking headers can be done here or at write time. Not much difference. - set - { - if (header == null) - return; - //if (currentRow == null) currentRow = new Hashtable(); - string givenHeader = header; - header = header.Trim(); - if (IgnoreHeaderCase) - header = header.ToLower(); - // don't use hash table: - //currentRow[header] = value; - // find in headers: - for (int i = 0; i < _headers.Length; i++) - { - string match = _headers[i].Trim(); - if (IgnoreHeaderCase) - match = match.ToLower(); - if (header == match) - { - this[i] = value; - return; - } - } - // add new header if required: - if (!AddUnknownHeaders) - return; - string[] oldHeaders = _headers; - _headers = new string[oldHeaders.Length + 1]; - oldHeaders.CopyTo(_headers, 0); - _headers[_headers.Length - 1] = givenHeader; - this[_headers.Length - 1] = value; - } - } - - /// - /// Close the table. - /// - public void Close() - { - if (_file == null || Eof()) - return; - // we don't really want this NextRow unless needed... *** - NextRow(); - - for (; _openElementCount > 0; _openElementCount--) - { - if (TrimWhitespace) - { - _file.WriteEndElement(); - } - else - { - _file.WriteFullEndElement(); - } - } - _elementEndPending = false; - - _file.WriteFullEndElement(); - _file.WriteEndDocument(); - _file.Flush(); - _file.Close(); - } - - /// - /// Increase the hierarchy depth. - /// - public void LevelIn() - { - _elementEndPending = false; - } - - /// - /// Decrease the hierarchy depth. - /// - public void LevelOut() - { - if (_openElementCount > 1 || (!_elementEndPending && _openElementCount > 0)) - { - if (TrimWhitespace) - { - _file.WriteEndElement(); - } - else - { - _file.WriteFullEndElement(); - } - - _openElementCount--; - } - } - - /// - /// Gets or sets whether to trim whitespace from each field. - /// - public bool TrimWhitespace - { - get { return _trimWhitespace; } - set { _trimWhitespace = value; } - } - - /// - /// Get or set whether to add new headers to the header list as they are encountered. - /// - public bool AddUnknownHeaders - { - get { return _addUnknownHeaders; } - set { _addUnknownHeaders = value; } - } - - /// - /// Gets or sets whether to ignore case when matching header names. - /// - public bool IgnoreHeaderCase - { - get { return _ignoreHeaderCase; } - set { _ignoreHeaderCase = value; } - } - } - -#endif - -#endif - -#if ALLOW_DB - ////////////////////////////////////////////// - ////// Excel support - ////////////////////////////////////////////// - - //// TODO: ODBC driver support? - //// Bare CsvReader support / merging? - //// Decent exception handling - //// Add in enumerator - - /// - /// Read spreadsheet data in various formats. - /// - public class SpreadsheetReader - { - private string filename; - private bool xlsFormat; - private OleDbConnection oleConn; - private OleDbDataReader oleReader; - private bool isEof; - private string[] cols; - - // trim whitespace from each entry: - private bool trimWhitespace = true; - // skip lines that are empty: - private bool skipBlankLines = true; - // skip lines that have fields but only whitespace in them: - private bool skipBlankColumnsLines = true; - private long rowNumber = 2; // gives 1-base row numbers... - - /// - /// Gets or sets whether to trim whitespace from each field. - /// - public bool TrimWhitespace - { - get { return trimWhitespace; } - set { trimWhitespace = value; } - } - /// - /// Get or set whether to skip blank lines. - /// - public bool SkipBlankLines - { - get { return skipBlankLines; } - set { skipBlankLines = value; } - } - /// - /// Get or set whether to skip lines with all columns blank. - /// - public bool SkipBlankColumnsLines - { - get { return skipBlankColumnsLines; } - set { skipBlankColumnsLines = value; } - } - /// - /// Get the number of the current row. - /// - public long RowNumber - { - get { return rowNumber; } - } - - /// - /// Create a new SpreadsheetReader. - /// - /// the source of the spreadsheet - public SpreadsheetReader(string fname) - { - filename = fname; - // determine format: - xlsFormat = false; - //Console.WriteLine("Extension: " + Path.GetExtension(filename).ToLower()); - if (Path.GetExtension(filename).ToLower() == ".xls") - { - xlsFormat = true; - } - // construct connection string: - string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + - "Data Source="; - if (xlsFormat) // Excel Format - { - connString += "\"" + Path.GetFullPath(filename) + "\"" + ";" + - // "Extended Properties=\"Excel 8.0;HDR=No\""; - "Extended Properties=\"Excel 8.0;HDR=Yes\""; - } - else // assume CSV - { - connString += Path.GetDirectoryName(Path.GetFullPath(filename)) + ";" + - // "Extended Properties=\"text;HDR=No;FMT=Delimited\""; - "Extended Properties=\"text;HDR=Yes;FMT=Delimited\""; - } - //Console.WriteLine("Opening with: " + connString); - string selectString = "SELECT * FROM "; - if (xlsFormat) // Excel Format - { - selectString += "[Sheet1$]"; // hard-coded first sheet? *** - //selectString += "foo"; // hard-coded first sheet? *** - } - else // assume CSV - { - selectString += Path.GetFileName(filename); - } - //Console.WriteLine("Selecting with: " + selectString); - - oleConn = new OleDbConnection(connString); - oleConn.Open(); - //OleDbCommand openCmd = new OleDbCommand(selectString, oleConn); - OleDbCommand openCmd = oleConn.CreateCommand(); - openCmd.CommandText = selectString; - //openCmd.Connection.Open(); - //Console.WriteLine("Opened connection."); - //Console.WriteLine("Database: " + oleConn.Database); - //Console.WriteLine("Datasource: " + oleConn.DataSource); - - // start up reader: - //oleReader = openCmd.ExecuteReader(CommandBehavior.CloseConnection); - - //MessageBox.Show(connString, "Excel Connection String"); - //MessageBox.Show(selectString, "Excel Select String"); - oleReader = openCmd.ExecuteReader(); - //Console.WriteLine("Started Reader."); - - //TestConnection(); - - // Initialize the row reading: - isEof = !Next(); - // Initialize the column names: - SetupColumnNames(); - } - - /// - /// Test the connection to the spreadsheet. - /// - public void TestConnection() - { - if (oleReader == null) - { - Console.WriteLine("OleDbDataReader is not initialized!"); - return; - } - // display column names - for (int c = 0; c < oleReader.FieldCount; c++) - { - Console.Write(oleReader.GetName(c) + " \t"); - } - Console.WriteLine(""); - Console.WriteLine("--------------------------------------------------"); - // display data - while (oleReader.Read()) - { - object[] fields = new Object[oleReader.FieldCount]; - oleReader.GetValues(fields); - for (int i = 0; i < fields.Length; i++) - { - Console.Write("" + fields[i] + " \t"); - } - Console.WriteLine(""); - } - } - - /// - /// Read an entire row and advance the reader. - /// - /// The current row as an array of fields - public object[] ReadRowObjects() - { - if (Eof()) - return new Object[0]; // should it be a null? - object[] fields = new Object[oleReader.FieldCount]; - oleReader.GetValues(fields); - for (int i = 0; i < fields.Length; i++) - { - if (fields[i] == DBNull.Value) - { - fields[i] = null; - } - } - Next(); - return fields; - } - - /// - /// Read an entire row and advance the reader. - /// - /// The current row as an array of fields - public string[] ReadRow() - { - if (Eof()) - return new string[0]; // should it be a null? - object[] fields = new Object[oleReader.FieldCount]; - string[] fieldsStr = new string[oleReader.FieldCount]; - oleReader.GetValues(fields); - for (int i = 0; i < fields.Length; i++) - { - if (fields[i] == DBNull.Value) - { - fieldsStr[i] = ""; - } - else - { - fieldsStr[i] = fields[i].ToString(); - } - } - Next(); - return fieldsStr; - } - - //// Not certain if the FieldCount is stable. *** - private void SetupColumnNames() - { - if (oleReader.FieldCount <= 0) - { - cols = new string[0]; - return; - } - cols = new string[oleReader.FieldCount]; - for (int c = 0; c < oleReader.FieldCount; c++) - { - cols[c] = oleReader.GetName(c); - if (cols[c] == null) - { - cols[c] = ""; - } - } - } - - /// - /// Get the names of the columns. - /// - public string[] ColumnNames - { - get - { - return cols; - } - } - - /// - /// Get the field at the column index. - /// - public object this[int i] - { - get - { - if (Eof()) - return null; - object item = oleReader[i]; - if (item == DBNull.Value) - return null; - if (TrimWhitespace) - { - if (item.GetType() == typeof(String)) - { - item = ((string)item).Trim(); - } - } - return item; - } - } - - /// - /// Set the field at the column with the given header. - /// - public object this[string col] - { - get - { - if (Eof()) - return null; - object item = oleReader[col]; - if (item == DBNull.Value) - return null; - if (TrimWhitespace) - { - if (item.GetType() == typeof(String)) - { - item = ((string)item).Trim(); - } - } - return item; - } - } - - /// - /// Get the field at the column index. - /// - public string this[int i, bool b] - { - get - { - object item = this[i]; - if (item == null) - return ""; - string res = item.ToString(); - if (TrimWhitespace) - { - res = res.Trim(); - } - return res; - } - } - - /// - /// Set the field at the column with the given header. - /// - public string this[string col, bool b] - { - get - { - object item = this[col]; - if (item == null) - return ""; - string res = item.ToString(); - if (TrimWhitespace) - { - res = res.Trim(); - } - return res; - } - } - - /// - /// Advance to the next row. - /// - /// true if there are more rows, false if at end of table - public bool Next() - { - if (Eof() || oleReader == null) - return false; - while (true) - { - rowNumber++; - isEof = !oleReader.Read(); - if (isEof) - break; - if (!SkipBlankLines && !SkipBlankColumnsLines) - break; - if (oleReader.FieldCount == 0) - continue; // does this happen? - int col; - for (col = 0; col < RowLength(); col++) - { - if (SkipBlankColumnsLines) - { - if (this[col, true] != "") - break; - } - else - { - if (this[col] != null) - break; - } - } - if (col < RowLength()) - break; - } - return !isEof; - } - - /// - /// Get the number of fields in the current row. - /// - /// the number of fields in the current row - public int RowLength() - { - if (Eof()) - return 0; - return oleReader.FieldCount; - } - - /// - /// Check for end of file. - /// - /// true if at end of file, false otherwise - public bool Eof() - { - return isEof; - } - - /// - /// Close the table. - /// - public void Close() - { - if (oleReader != null) - oleReader.Close(); - oleReader = null; - if (oleConn != null) - oleConn.Close(); - oleConn = null; - isEof = true; - } - } - - //// TODO: ODBC driver support? - //// Bare CsvReader support / merging? - //// Decent exception handling - /// - /// Write spreadsheet data in various formats. - /// - public class SpreadsheetWriter - { - private string filename; - private bool xlsFormat; - private OleDbConnection oleConn; - //private OleDbDataAdapter oleAdapter; - //private DataTable dataTable; - //private string[] cols; - - // trim whitespace from each entry: - private bool trimWhitespace = true; - - /// - /// Gets or sets whether to trim whitespace from each field. - /// - public bool TrimWhitespace - { - get { return trimWhitespace; } - set { trimWhitespace = value; } - } - - /// - /// Create a new SpreadsheetWriter. - /// - /// the source of the spreadsheet - public SpreadsheetWriter(string fname) - { - filename = fname; - - // determine format: - xlsFormat = false; - //Console.WriteLine("Extension: " + Path.GetExtension(filename).ToLower()); - if (Path.GetExtension(filename).ToLower() == ".xls") - { - xlsFormat = true; - } - - // construct connection string: - string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + - "Data Source="; - if (xlsFormat) // Excel Format - { - connString += filename + ";" + - // "Extended Properties=Excel 8.0;"; - "Extended Properties=\"Excel 8.0;HDR=No\""; - } - else // assume CSV - { - connString += Path.GetDirectoryName(Path.GetFullPath(filename)) + ";" + - "Extended Properties=\"text;HDR=Yes;FMT=Delimited\""; - } - //Console.WriteLine("Opening with: " + connString); - - string selectString = "SELECT * FROM "; - if (xlsFormat) // Excel Format - { - selectString += "[Sheet1$]"; // hard-coded first sheet? *** - } - else // assume CSV - { - selectString += Path.GetFileName(filename); - } - - //// open the connection: - oleConn = new OleDbConnection(connString); - oleConn.Open(); - - //oleAdapter = new OleDbDataAdapter(selectString, connString); - //oleAdapter = new OleDbDataAdapter(selectString, oleConn); - //OleDbCommandBuilder oleCommandBuilder = new OleDbCommandBuilder(oleAdapter); - //oleConn = oleAdapter.SelectCommand.Connection; - //oleConn.Open(); - //dataTable = new DataTable("sheet"); - - //oleAdapter.InsertCommand = new OleDbCommand(); - //oleAdapter.InsertCommand.CommandText = "INSERT INTO [Sheet1$]"; - //// VALUES ('Other','Figimingle','c:\\images\\gardenhose.bmp')"; - //oleAdapter.InsertCommand.Connection = oleConn; - - //OleDbCommand openCmd = new OleDbCommand(selectString, oleConn); - ////OleDbCommand openCmd = oleConn.CreateCommand(); - ////openCmd.CommandText = selectString; - //openCmd.Connection.Open(); - //Console.WriteLine("Opened connection."); - //Console.WriteLine("Database: " + oleConn.Database); - //Console.WriteLine("Datasource: " + oleConn.DataSource); - - // start up reader: - //oleReader = openCmd.ExecuteReader(CommandBehavior.CloseConnection); - ////oleReader = openCmd.ExecuteReader(); - //Console.WriteLine("Started Reader."); - - //TestConnection(); - - // Initialize the column names: - //SetupColumnNames(); - } - - private string sqlString(string item) - { - return "'" + item.Replace("'", "''") + "'"; - } - - private string columnNameTrue(int col) - { - int aInt = (int)'A'; - int zInt = (int)'Z'; - int range = (zInt - aInt + 1); - - string res = ""; - int high = col / range; - if (high > 0) - { - col = col % range; - res += (char)(aInt + high - 1); - } - res += (char)(aInt + col); - return res; - } - - private string columnName(int col) - { - string res = "F"; - res += (col + 1); - return res; - } - - /// - /// Write an entire row and advance the writer. - /// - /// The row to write as an array of fields - public void WriteRow(object[] fields) - { - // widen if needed: - //while (fields.Length > dataTable.Columns.Count) - //{ - // DataColumn col = new DataColumn(); - // dataTable.Columns.Add(col); - //} - OleDbCommand oleCmd = new OleDbCommand(); - oleCmd.Connection = oleConn; - string cmd = "INSERT INTO " + "[Sheet1$] "; // + "(FirstName, LastName) "; - - // give column names: - cmd += "("; - for (int i = 0; i < fields.Length; i++) - { - if (i > 0) - { - cmd += ", "; - } - cmd += columnName(i); - } - cmd += ") "; - - cmd += "VALUES ("; - for (int i = 0; i < fields.Length; i++) - { - if (i > 0) - { - cmd += ", "; - } - cmd += sqlString(fields[i].ToString()); - } - //'Bill', 'Brown' - cmd += ")"; - oleCmd.CommandText = cmd; - try - { - oleCmd.ExecuteNonQuery(); - } - catch (Exception) - { - throw new Exception("Excel insert error."); - } - - //if (oleAdapter == null) return; - // widen if needed: - //while (fields.Length > dataTable.Columns.Count) - //{ - // DataColumn col = new DataColumn(); - // dataTable.Columns.Add(col); - //} - //dataTable.LoadDataRow(fields, false); - //for (int i = 0; i < fields.Length; i++) - //{ - // if (fields[i] == DBNull.Value) - // { - // fields[i] = null; - // } - //} - } - - /// - /// Get the number of fields in the current row. - /// - /// the number of fields in the current row - public int RowLength() - { - return 0; - //return dataTable.Columns.Count; - } - - /// - /// Close the table. - /// - public void Close() - { - //if (oleAdapter != null) - //{ - // oleAdapter.Update(dataTable); - // oleAdapter = null; - //} - if (oleConn != null) - { - oleConn.Close(); - oleConn = null; - } - } - } -#endif -} diff --git a/src/Microsoft.ML.InternalStreams/UnbufferedStream.cs b/src/Microsoft.ML.InternalStreams/UnbufferedStream.cs deleted file mode 100644 index 23442d8475..0000000000 --- a/src/Microsoft.ML.InternalStreams/UnbufferedStream.cs +++ /dev/null @@ -1,1829 +0,0 @@ -// owner: rragno - -//#define MONITOR -using System; -using System.IO; -using System.Security; -using System.Threading; -using Microsoft.ML.Runtime; -using Microsoft.ML.Runtime.Internal.Utilities; -//using System.Xml; -//using System.Data; -//using System.Data.OleDb; - -namespace Microsoft.ML.Runtime.Internal.IO -{ - // * Unbuffered writer - // * Robust stream - // * Improve seek? - // * custom StreamReader - // * custom BinaryReader / BinaryReaderEx - - /// - /// Stream using unbuffered I/O for efficient reading from fast disk arrays. - /// - public sealed class UnbufferedStream : FileStream, IDisposable - { - #region Static Configuration - - /// - /// Get or Set whether to read in the background in a separate thread. - /// - /// - ///

- /// This does not affect existing instances. - ///

- ///

- /// Normally, it is faster to perform a multithreaded read, even on a - /// single-processor machine. However, the thread creation cost does make - /// it somewhat more expensive to create an instance. - ///

- ///
- public static bool ParallelRead { get; set; } = true; - - private static int _initialBlockSize = 4 * 1024 * 1024; - - /// - /// Get or Set the memory used for reading, in bytes. - /// - /// - ///

- /// If the memory cannot be allocated, a backoff strategy will be used. - ///

- ///

- /// The default is 8 MB. - ///

- ///
- public static int BufferSize - { - get - { - return _initialBlockSize * 2; - } - set - { - int newSize = value / 2; - if (newSize < 0) - newSize = 1024 * 1024; - // allow 0 for a minimal (sector-sized) buffer - if (newSize != _initialBlockSize) - _initialBlockSize = newSize; - } - } - #endregion - - #region Instance Fields - - private long _length; - private string _fileName; - - private readonly uint _sectorSize; - private /*readonly*/ IntPtr[] _buffer; - private /*readonly*/ IntPtr[] _alignedBuffer; - private readonly IntPtr _handle; - private /*readonly*/ int _blockSize; - private bool _parallel; - private bool _released = true; - //private int bufferStart = 0; - //private int bufferEnd = 0; - //private byte[] mBuffer; - - #endregion - - #region Creation and Cleanup - - /// - /// Exception that represents a failure in the internal memory allocation. - /// - public class VirtualAllocException : IOException - { - /// - /// Create a new exception. - /// - /// the message associated with this exception - public VirtualAllocException(string msg) - : base(msg) - { - } - } - - /// - /// Open a file for reading without NTFS caching. - /// The stream should be accessed sequentially - seeking can be slow - and it will not - /// support writing. - /// - /// name of file to open - /// Unbuffered file stream - /// fileName is null. - /// fileName is invalid. - /// fileName cannot be found. - /// An I/O error has occurred. - // /// This may throw a different exception than FileNotFound if the file does - // /// not exist. - // is relying on the order of evaluation bad?? *** - public UnbufferedStream(string fileName) - : this(fileName, - new FileAlignmentInfo(fileName), - IOUtil.Win32.CreateFile(fileName, IOUtil.Win32.FileAccess.GENERIC_READ, IOUtil.Win32.FileShare.FILE_SHARE_READ, IntPtr.Zero, IOUtil.Win32.CreationDisposition.OPEN_EXISTING, - IOUtil.Win32.FileFlagsAndAttributes.FILE_FLAG_NO_BUFFERING | IOUtil.Win32.FileFlagsAndAttributes.FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero)) - { - } - /// - /// Open a file for reading without NTFS caching. - /// The stream should be accessed sequentially - seeking can be slow - and it will not - /// support writing. - /// - /// name of file to open - /// the length, sector size, and bytes from the end that are not sector-aligned - /// the handle of the specified file - /// Unbuffered file stream - /// A problem occurred alocating memory at a low level. -#if !UNBUFFERED_AS_STREAM - private UnbufferedStream(string fileName, FileAlignmentInfo alignInfo, IntPtr handle) - : base(new Microsoft.Win32.SafeHandles.SafeFileHandle(handle, true), FileAccess.Read, 1, false) -#else - private UnbufferedStream(string fileName, long length, IntPtr handle) -#endif - { - //Console.WriteLine("new unbuffered: " + fileName); -#if MONITOR - Console.WriteLine(new string('-', (":: " + Path.GetFileName(fileName) + " :: " + "Open").Length)); - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "Open"); -#endif - _fileName = fileName; - //this.length = base.Length; - _length = alignInfo.Length; - _unalignedTail = alignInfo.UnalignedTail; - _sectorSize = alignInfo.SectorSize; - //this.handle = (IntPtr)typeof(FileStream).GetProperty("Handle").GetValue(this, null); - //this.handle = base.Handle; - _handle = handle; - - // open for first time: - Reopen(); - } - - /// - /// Release resources. - /// - ~UnbufferedStream() - { - Dispose(true); - } - - /// - /// Release the resources used for the unbuffered file. - /// - /// true if disposing, false otherwise - protected override void Dispose(bool disposing) - { - try - { - base.Dispose(disposing); - } - catch - { - // ignore - } - try - { - ReleaseBuffer(); - } - catch - { - // ignore - } - try - { - IOUtil.Win32.CloseHandle(_handle); - } - catch - { - // ignore - } -#if MONITOR - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "Close"); - Console.WriteLine(new string('-', (":: " + Path.GetFileName(fileName) + " :: " + "Close").Length)); -#endif - _closed = true; - } - - //static int allocCount = 0; - - private void ReleaseBuffer() - { - //if (checkStream != null) - //{ - // checkStream.Close(); - // checkStream = null; - //} - if (!_released) - { - if (_buffer != null) - { - try - { - for (int j = 0; j < _buffer.Length; j++) - { - if (_buffer[j] != IntPtr.Zero) - { - try - { -#if REUSE_BUFFERS - if (buffer[j] != IntPtr.Zero) - { - if (blockSize == initialBlockSize) - { - // save the buffer for later... - lock (standingBuffers) - { - if (standingBufferCount < standingBuffers.Length) - { - standingBuffers[standingBufferCount++] = buffer[j]; - buffer[j] = IntPtr.Zero; - } - } - } - } -#endif - - if (_buffer[j] != IntPtr.Zero) - { - //Console.Write("(freeing... "); - bool ret = IOUtil.Win32.VirtualFree(_buffer[j], IntPtr.Zero, /*MEM_DECOMMIT*/ IOUtil.Win32.FreeType.MEM_RELEASE); - //int count = Interlocked.Decrement(ref allocCount); - //Console.WriteLine("done: " + ret + " " + count + ")"); - _buffer[j] = IntPtr.Zero; - } - } - catch - { - } - } - } - } - catch - { - } - } - _buffer = null; - _released = true; - } - if (_fillThread != null) - { - // skip this - we close the handle - //try - //{ - // fillThread.Abort(); - //} - //catch - //{ - //} - _fillThread = null; - } - } - - private bool _closed; - - /// - /// Close the stream. - /// - public override void Close() - { - if (_closed) - return; - _closed = true; - base.Close(); - Dispose(true); - } - -#if REUSE_BUFFERS - private static IntPtr[] standingBuffers = new IntPtr[32]; - private static int standingBufferCount = 0; -#endif - - private void Reopen() - { - Reopen(0, true); - } - private void Reopen(long startPosition, bool allocate) - { - if (_fillThread != null) - { - try - { - _fillThread.Abort(); - } - catch - { - } - _fillThread = null; - } - //if (allocate) ReleaseBuffer(); - long startRemainder = (startPosition % _sectorSize); - try - { - startPosition -= startRemainder; - long res; - IOUtil.Win32.SetFilePointerEx(_handle, startPosition, out res, IOUtil.Win32.SeekOrigin.FILE_BEGIN); - } - catch - { - // ignore? - } - - try - { - _released = false; - - _totalRead = startPosition; - _totalGet = startPosition; - _getCount = 0; - _bufferFillIndex = 0; - _bufferGetIndex = 0; - _fillCount = 0; - _currentBuffer = IntPtr.Zero; - _currentBufferLimit = 0; - _currentBufferBottom = 0; - _gotDone = false; - - if (allocate) - { - _parallel = ParallelRead; - int parallelLevel = _parallel ? 2 : 1; - _blockSize = _initialBlockSize; - // force non-parallel for small files... - if (_parallel && (_length < 4 * _sectorSize || _length < 2 * _blockSize)) - { - _parallel = false; - parallelLevel = 1; - } - _blockSize = _blockSize / parallelLevel; - if (_blockSize % _sectorSize != 0) - _blockSize -= (int)(_blockSize % _sectorSize); - if (_blockSize < _sectorSize) - _blockSize = (int)_sectorSize; - - // check on buffer alignment: - //mBuffer = new byte[blockSize + 16]; - //fixed (byte* mb = mBuffer) - //{ - // IntPtr tmp = new IntPtr(mb); - // Console.WriteLine(tmp.ToInt64()); - // Console.WriteLine((tmp.ToInt64() + 7) & ~7); - //} - - _readMutex = new AutoResetEvent[parallelLevel]; - _pullMutex = new AutoResetEvent[parallelLevel]; - _readSize = new int[parallelLevel]; - _done = new bool[parallelLevel]; - - _buffer = new IntPtr[parallelLevel]; - _alignedBuffer = new IntPtr[parallelLevel]; - bool completed = false; - while (!completed) - { - completed = true; - for (int i = 0; i < _buffer.Length; i++) - { - //if (buffer[i] != IntPtr.Zero) throw new VirtualAllocException("Buffer double allocated"); - _buffer[i] = IntPtr.Zero; - -#if REUSE_BUFFERS - if (blockSize == initialBlockSize) - { - //Console.WriteLine("locking..."); - lock (standingBuffers) - { - if (standingBufferCount > 0) - { - standingBufferCount--; - buffer[i] = standingBuffers[standingBufferCount]; - } - } - //Console.WriteLine("locked."); - } -#endif - - if (_buffer[i] == IntPtr.Zero) - { - //Console.WriteLine("allocated: " + - // (System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize / 1024 / 1024) + " MB"); - //Console.Write("(allocating... "); - _buffer[i] = IOUtil.Win32.VirtualAlloc(IntPtr.Zero, new IntPtr(_blockSize + 8), IOUtil.Win32.AllocationType.MEM_RESERVE | IOUtil.Win32.AllocationType.MEM_COMMIT, IOUtil.Win32.Protect.PAGE_READWRITE); - //if (buffer[i] == IntPtr.Zero || buffer[i].ToInt64() < 0) - //{ - // Console.WriteLine("failed @" + (blockSize + 8) + ": " + allocCount + ")"); - // Console.ReadLine(); - //} - //else - //{ - // int acount = Interlocked.Increment(ref allocCount); - // Console.WriteLine("done: " + acount + ")"); - //} - } - - if (_buffer[i] == IntPtr.Zero || _buffer[i].ToInt64() < 0) - { - for (int j = 0; j < i; j++) - { - if (_buffer[j] != IntPtr.Zero) - { - try - { -#if REUSE_BUFFERS - if (buffer[j] != IntPtr.Zero) - { - if (blockSize == initialBlockSize) - { - // save the buffer for later... - lock (standingBuffers) - { - if (standingBufferCount < standingBuffers.Length) - { - standingBuffers[standingBufferCount++] = buffer[j]; - buffer[j] = IntPtr.Zero; - } - } - } - } -#endif - - if (_buffer[j] != IntPtr.Zero) - { - //Console.Write("(freeing... "); - bool ret = IOUtil.Win32.VirtualFree(_buffer[j], IntPtr.Zero, /*MEM_DECOMMIT*/ IOUtil.Win32.FreeType.MEM_RELEASE); - //int count = Interlocked.Decrement(ref allocCount); - //Console.WriteLine("done: " + ret + " " + count + ")"); - _buffer[j] = IntPtr.Zero; - } - } - catch - { - } - } - } - if (_blockSize <= 256 * 1024) - { - throw Contracts.Process(new VirtualAllocException("Could not allocate buffer for UnbufferedStream.")); - } - // try reducing the buffer size: - _blockSize = _blockSize / 2; - // collect to compact memory: - //GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - // try again: - completed = false; - break; - } - _alignedBuffer[i] = new IntPtr((_buffer[i].ToInt64() + 7) & ~7); - _readMutex[i] = new AutoResetEvent(false); - _pullMutex[i] = new AutoResetEvent(true); - } - } - } - else - { - // clear these, in any case: - for (int i = 0; i < _readMutex.Length; i++) - { - _readSize[i] = 0; - _done[i] = false; - _readMutex[i].Reset(); - _pullMutex[i].Set(); - } - } - - _alignedLimit = _length - (_unalignedTail == null ? 0 : _unalignedTail.Length); - //if (alignedLimit < 0) alignedLimit = 0; - if (_parallel) - { - _fillThread = Utils.CreateBackgroundThread(FillBuffer); - // start now? - // skip if small? *** - _fillThread.Start(); - } - - if (startRemainder != 0) - { - //Seek(startRemainder, SeekOrigin.Current); - Skip(startRemainder); - } - } - catch - { - for (int j = 0; j < _buffer.Length; j++) - { - if (_buffer[j] != IntPtr.Zero) - { - try - { - // don't bother trying to save them? - //Console.Write("(freeing... "); - bool ret = IOUtil.Win32.VirtualFree(_buffer[j], IntPtr.Zero, /*MEM_DECOMMIT*/ IOUtil.Win32.FreeType.MEM_RELEASE); - //int count = Interlocked.Decrement(ref allocCount); - //Console.WriteLine("done: " + ret + " " + count + ")"); - _buffer[j] = IntPtr.Zero; - } - catch - { - } - } - } - if (_fillThread != null) - { - try - { - _fillThread.Abort(); - _fillThread = null; - } - catch - { - } - } - try - { - base.Dispose(true); - } - catch - { - } - throw; - } - } - - #endregion - - #region Properties - - /// - /// Get the Length of this file, in bytes. - /// - public override long Length - { - get - { - // return base.Length; - // use the simple, recorded length: - return _length; - } - } - - /// - /// Get whether the stream supports reading - always true. - /// - public override bool CanRead - { - get - { - return true; - //return base.CanRead; - } - } - - /// - /// Get whether the stream supports writing - always false. - /// - public override bool CanWrite - { - get - { - return false; - //return base.CanWrite; - } - } - - #endregion - - #region Seeking - - /// - /// Get or Set the position in the file, in bytes. - /// - public override long Position - { - get - { - //return base.Position; - return _totalGet - _currentBufferLimit + _currentBufferBottom; - } - set - { - //throw new NotSupportedException("UnbufferedStream cannot seek."); - Seek(value); - } - } - - /// - /// Move forward by reading and discarding bytes. - /// - /// the number of bytes to skip - private void Skip(long count) - { - if (count == 0) - return; - //if (forWriting) throw new NotSupportedException(); - byte[] dump = new byte[Math.Min(count, 128 * 1024)]; - if (dump.Length != count) - { - int rem = (int)(count % dump.Length); - if (Read(dump, 0, rem) < rem) - return; - count -= rem; - } - while (count > 0) - { - int read = Read(dump, 0, dump.Length); - if (read != dump.Length) - { - System.Diagnostics.Debug.WriteLine("Skip failed! Read " + read + " / " + dump.Length + " for chunk."); - return; - } - count -= dump.Length; - } - } - - /// - /// Seek to a new position in the file, in bytes. - /// - /// the offset in bytes - /// the new position - public long Seek(long offset) - { - return Seek(offset, SeekOrigin.Begin); - } - /// - /// Seek to a new position in the file, in bytes. - /// - /// the offset in bytes - /// the SeekOrigin to take the offset from - /// the new position - public override long Seek(long offset, SeekOrigin origin) - { -#if SLOW_SEEK - long cur = Position; - switch (origin) - { - case SeekOrigin.Begin: - break; - case SeekOrigin.Current: - offset += cur; - break; - case SeekOrigin.End: - offset = Length - offset; - break; - } - if (offset < 0) offset = 0; - if (offset == cur) return cur; - - if (offset > cur) - { - Skip(offset - cur); - return Position; - } - else - { - Reopen(); - Skip(offset); - return Position; - } -#else - long cur = Position; - switch (origin) - { - case SeekOrigin.Begin: - break; - case SeekOrigin.Current: - offset += cur; - break; - case SeekOrigin.End: - offset = Length - offset; - break; - } - if (offset < 0) - offset = 0; - if (offset == cur) - return cur; - - if (offset > cur && (offset - cur) < 4000000) - { - Skip(offset - cur); - return Position; - } - else - { - Reopen(offset, false); - return Position; - } -#endif - } - - /// - /// Get whether the stream supports seeking. true, although performance - /// might not be optimal. - /// - public override bool CanSeek - { - get - { - return true; - } - } - - #endregion - - #region Reading - - #region Private Read Helpers - - private long _totalRead; - private int _bufferFillIndex; - private int _bufferGetIndex; - private int _fillCount; - private Thread _fillThread; - private /*readonly*/ AutoResetEvent[] _readMutex; - private /*readonly*/ AutoResetEvent[] _pullMutex; - //private readonly AutoResetEvent[] readFillMutex; - //private readonly AutoResetEvent[] readGetMutex; - private /*readonly*/ int[] _readSize; - private byte[] _unalignedTail; - - /// - /// Data about the file size and alignment. - /// - private struct FileAlignmentInfo - { - public readonly long Length; - public readonly uint SectorSize; - public readonly byte[] UnalignedTail; - - /// - /// Hack to read the unaligned tail first, instead of at the end. This helps with - /// keeping the file handles open, which enables seeking later. - /// - /// the file to read the tail of - /// the bytes of the unaligned tail, or null if the file is aligned - /// The file cannot be found. - /// The tail could not be read. - public FileAlignmentInfo(string fileName) - { - Length = (new FileInfo(fileName)).Length; - SectorSize = FindSectorSize(fileName); - int remainder = (int)(Length % SectorSize); - if (remainder == 0) - { - UnalignedTail = null; - } - else - { - UnalignedTail = new byte[remainder]; - int overCount; - for (int i = 0; i < 3; i++) - { - try - { - using (FileStream overRead = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - overRead.Seek(-UnalignedTail.Length, SeekOrigin.End); - overCount = overRead.Read(UnalignedTail, 0, UnalignedTail.Length); - } - if (overCount != remainder) - { - throw Contracts.ExceptIO("UnbufferedStream could not read tail of file: " + - "expected " + remainder + ", read " + overCount); - } - } - catch (FileNotFoundException) - { - throw; - } - catch - { - if (i == 2) - throw; - if (i == 0) - Thread.Sleep(10); - if (i == 1) - Thread.Sleep(100); - } - } - } - } - - /// - /// Return the sector size of the drive of the given path. - /// - /// path name for the drive, file, or directory - /// drive sector size in bytes - private static uint FindSectorSize(string path) - { - uint size = 512; - uint ignore; - IOUtil.Win32.GetDiskFreeSpace(Path.GetPathRoot(path), out ignore, out size, out ignore, out ignore); - return size; - } - } - - private long _alignedLimit; - - private void FillBuffer() - { - // This loop is the only one making reads - they are sequential and on only this - // thread - but the buffers it reads into are read in parallel by other threads. - // The idea is just to keep passing this thread buckets to let it pump data. - try - { - while (FillBufferPass()) - { - // keep reading... - } - } - catch (Exception) // ex) - { - // ignore all exceptions on the filling thread... - // may be needed, but will hide potential problems. - //System.Diagnostics.Debug.WriteLine(""); - //System.Diagnostics.Debug.WriteLine("FillBuffer exception: " + ex.ToString()); - } - } - - private bool FillBufferPass() - { - //Console.WriteLine("[" + totalRead + " / " + alignedLimit + " / " + length + "]"); - // read the aligned amount only, specified by 'alignedLimit': - if (_totalRead < _alignedLimit) - { - int curBlock = (int)Math.Min(_blockSize, _alignedLimit - _totalRead); - - //Console.WriteLine(" " + totalRead + " -> " + (totalRead + curBlock) + " / " + alignedLimit); - // wait for pull of last read: -#if MONITOR - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "".PadLeft(4) + - (" fill wait: " + fillCount + " pullMutex[" + bufferFillIndex + "]").PadRight(56) + - " bytes: " + totalRead + " / " + length + " (" + alignedLimit + ")"); -#endif - _pullMutex[_bufferFillIndex].WaitOne(); -#if MONITOR - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "".PadLeft(4) + - (" fill got: " + fillCount + " pullMutex[" + bufferFillIndex + "]").PadRight(56) + - " bytes: " + totalRead + " / " + length + " (" + alignedLimit + ")"); -#endif - try - { - // read into buffer: - int readBytes; - //long t = DateTime.UtcNow.Ticks; - //long startPos = IOUtil.Win32.Raw.GetFilePos(handle); - bool readres = IOUtil.Win32.Raw.ReadFile(_handle, _alignedBuffer[_bufferFillIndex], - (int)Math.Min(_blockSize, _alignedLimit - _totalRead), out readBytes); - //t = DateTime.UtcNow.Ticks - t; - //Console.WriteLine("core time: " + (t / (double)TimeSpan.TicksPerSecond).ToString("0.000")); - if (!readres) - { - // try again?? *** - System.Diagnostics.Debug.WriteLine(""); - System.Diagnostics.Debug.WriteLine("ReadFile failed! at: " + _totalRead); - Thread.Sleep(10); - readres = IOUtil.Win32.Raw.ReadFile(_handle, _alignedBuffer[_bufferFillIndex], - (int)Math.Min(_blockSize, _alignedLimit - _totalRead), out readBytes); - if (!readres) - { - System.Diagnostics.Debug.WriteLine(""); - System.Diagnostics.Debug.WriteLine("ReadFile failed!! at: " + _totalRead); - - Thread.Sleep(50); - readres = IOUtil.Win32.Raw.ReadFile(_handle, _alignedBuffer[_bufferFillIndex], - (int)Math.Min(_blockSize, _alignedLimit - _totalRead), out readBytes); - - if (!readres) - { - System.Diagnostics.Debug.WriteLine(""); - System.Diagnostics.Debug.WriteLine("ReadFile failed!!! at: " + _totalRead); - readBytes = 0; - } - } - } - - // set read amounts: - _readSize[_bufferFillIndex] = readBytes; - _totalRead += readBytes; - - // signal completed read: - _fillCount++; - -#if MONITOR - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "".PadLeft(4) + - (" fill set: " + fillCount + " readMutex[" + bufferFillIndex + "]").PadRight(56) + - " bytes: " + totalRead + " / " + length + " (" + alignedLimit + ")"); -#endif - if (readBytes == 0) - { - if (_totalRead < _alignedLimit) - { - throw Contracts.ExceptIO("Could not read complete buffer"); - } - } - - if (_totalRead < _alignedLimit || (_unalignedTail != null && _unalignedTail.Length != 0)) - { - //Console.WriteLine("continue..."); - _readMutex[_bufferFillIndex].Set(); - _bufferFillIndex = (_bufferFillIndex + 1) % _readMutex.Length; - return true; - } - else - { - //Console.WriteLine(" totalRead: " + totalRead + " alignedLimit: " + alignedLimit); - _done[_bufferFillIndex] = true; - _readMutex[_bufferFillIndex].Set(); - _bufferFillIndex = (_bufferFillIndex + 1) % _readMutex.Length; - return false; - } - } - catch - { - _pullMutex[_bufferFillIndex].Set(); - throw; - } - } - else if (_alignedLimit == _totalRead && _unalignedTail != null && _unalignedTail.Length != 0) - { - //Console.Error.WriteLine(); - //Console.Error.WriteLine("Unaligned tail: " + alignedLimit + " + " + unalignedTail.Length + " => " + length); - - // wait for pull of last read: - //Console.WriteLine(" fill get : " + fillCount + " [" + bufferFillIndex + "]"); - _pullMutex[_bufferFillIndex].WaitOne(); - - try - { - // use the tail we read at the beginning: - // unalignedTail must not be null, since we are not aligned - _totalRead += _unalignedTail.Length; - CopyBuffer(_unalignedTail, _alignedBuffer[_bufferFillIndex], _unalignedTail.Length); - _readSize[_bufferFillIndex] = _unalignedTail.Length; - //Console.WriteLine(" tail done"); - _done[_bufferFillIndex] = true; - } - catch (Exception ex) - { - _pullMutex[_bufferFillIndex].Set(); - throw ex; - } - - //fillCount++; - //Console.WriteLine(" fill set : " + fillCount + " [" + bufferFillIndex + "]" + " *"); - _readMutex[_bufferFillIndex].Set(); - _bufferFillIndex = (_bufferFillIndex + 1) % _readMutex.Length; - - return false; - } - else - { - //Console.Error.WriteLine(); - //Console.Error.WriteLine("No unaligned tail."); - - _readSize[_bufferFillIndex] = 0; - //Console.WriteLine(" null done?"); - _done[_bufferFillIndex] = true; - //Console.WriteLine(" fill set : " + fillCount + " [" + bufferFillIndex + "]" + " **"); - _readMutex[_bufferFillIndex].Set(); - _bufferFillIndex = (_bufferFillIndex + 1) % _readMutex.Length; - return false; - } - } - - private bool[] _done; - private bool _gotDone; - private long _totalGet; - private int _getCount; - - private void GetBuffer() - { - if (_gotDone) - { - //Console.WriteLine("GetBuffer done"); - _currentBufferBottom = 0; - _currentBufferLimit = 0; - _currentBuffer = _alignedBuffer[0]; - //unsafe - //{ - // current = (byte*)currentBuffer.ToPointer(); - //} - return; - } - // Console.WriteLine("Copying buffer " + bufferIndex); - IntPtr res = _alignedBuffer[_bufferGetIndex]; - - if (_getCount != 0) - { - _pullMutex[(_bufferGetIndex + _readMutex.Length - 1) % _readMutex.Length].Set(); -#if MONITOR - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "".PadLeft(32) + - (" drain set: " + getCount + " pullMutex[" + ((bufferGetIndex + readMutex.Length - 1) % readMutex.Length) + "]").PadRight(28) + - " bytes: " + totalGet + " / " + length); -#endif - } - -#if MONITOR - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "".PadLeft(32) + - (" drain wait: " + getCount + " readMutex[" + bufferGetIndex + "]").PadRight(28) + - " bytes: " + totalGet + " / " + length); -#endif - // if needed, do it ourselves... - if (!_parallel) - { - FillBufferPass(); - } - - _readMutex[_bufferGetIndex].WaitOne(); - _getCount++; - - _currentBufferBottom = 0; - _currentBufferLimit = _readSize[_bufferGetIndex]; - if (_done[_bufferGetIndex] || _currentBufferLimit == 0) - { - //Console.WriteLine(" done : " + done[bufferGetIndex] + " " + currentBufferLimit); - for (int i = 0; i < _readSize.Length; i++) - { - _readSize[i] = 0; - } - _gotDone = true; - } - _totalGet += _currentBufferLimit; - _currentBuffer = res; -#if MONITOR - Console.WriteLine(":: " + Path.GetFileName(fileName) + " :: " + "".PadLeft(32) + - (" drain got: " + getCount + " readMutex[" + bufferGetIndex + "]").PadRight(28) + - " bytes: " + totalGet + " / " + length); -#endif - - _bufferGetIndex = (_bufferGetIndex + 1) % _readMutex.Length; - - //unsafe - //{ - // current = (byte*)currentBuffer.ToPointer(); - //} - } - - private /*unsafe*/ void CopyBuffer(byte[] source, IntPtr dest, int count) - { - if (count <= 0) - return; - - #region copy variations - unsafe - { - byte* d = (byte*)dest.ToPointer(); - for (int i = 0; i < count; i++) - { - *d = source[i]; - d++; - } - } - #endregion - - //// Marshal is incredibly slow!! - //Marshal.Copy(source, 0, dest, count); - } - private /*unsafe*/ void CopyBuffer(IntPtr source, int sourceStart, byte[] dest, int destStart, int count) - { - if (count <= 0) - return; - - #region copy variations - unsafe - { - // pointer to array copy: - byte* s = ((byte*)source.ToPointer()) + sourceStart; - count += destStart; - for (; destStart < count; destStart++) - { - dest[destStart] = *(s++); - } - - // simple pointer copy: - // byte* s = ((byte*)source.ToPointer()) + sourceStart; - // fixed (byte* dd = dest) - // { - // byte* d = dd + destStart; - // byte* dEnd = d + count; - // while (d != dEnd) - // { - // *(d++) = *(s++); - // } - // } - - // int pointer copy: - // int* s = (int*)(((byte*)source.ToPointer()) + sourceStart); - // fixed (byte* dd = dest) - // { - // int* d = (int*)(dd + destStart); - // int* dEnd = d + (count >> 2); - // while (d != dEnd) - // { - // *d = *s; - // d++; - // s++; - // } - // count = count & 3; - // if (count != 0) - // { - // for (int i = 0; i < count; i++) - // { - // *(((byte*)d) + i) = *(((byte*)s) + i); - // } - // } - // } - } - #endregion - - //// Marshal is slow ?? - // Marshal.Copy(new IntPtr(source.ToInt64() + sourceStart), dest, destStart, count); - } - - private IntPtr _currentBuffer; - private int _currentBufferLimit; - private int _currentBufferBottom; - - private byte[] _sharedBuffer; - - #endregion - - #region Public Read Functionality - - /// - /// Reads a block of bytes from the stream and writes the data into a buffer. - /// The buffer is automatically allocated, but it may be shared across calls to this method. - /// - /// the array in which the values are replaced by the bytes read - /// - /// The total number of bytes read into the buffer. This will be 0 if the end - /// of the stream has been reached, and is guaranteed to be less than buffer.Length only if - /// fewer than buffer.Length bytes remain (and it will then equal the remainder of the bytes). - /// - public int Read(out byte[] buffer) - { - if (_sharedBuffer == null) - { - // could use a weak reference... - _sharedBuffer = new byte[_blockSize]; - } - buffer = _sharedBuffer; - //Console.WriteLine("(reading out into buffer[" + buffer.Length + "])"); - int res = Read(buffer); - // should we resize the array here? it might be convenient... - if (res == 0) - { - _sharedBuffer = null; - buffer = new byte[0]; - } - return res; - } - /// - /// Reads a block of bytes from the stream and writes the data in a given buffer. - /// - /// the array in which the values are replaced by the bytes read - /// - /// - /// The total number of bytes read into the buffer. This will be 0 if the end - /// of the stream has been reached, and is guaranteed to be less than buffer.Length only if - /// fewer than buffer.Length bytes remain (and it will then equal the remainder of the bytes). - /// - public int Read(byte[] buffer) - { - return Read(buffer, 0, buffer.Length); - } - /// - /// Reads a block of bytes from the stream and writes the data in a given buffer. - /// - /// the array in which the values between offset and (offset + count - 1) are replaced by the bytes read - /// The byte offset in array at which to begin reading. - /// The maximum number of bytes to read. - /// - /// The total number of bytes read into the buffer. This will be 0 if the end - /// of the stream has been reached, and is guaranteed to be less than count only if - /// fewer than count bytes remain (and it will then equal the remainder of the bytes). - /// - /// The counts are out of range. - /// The buffer is null - public override int Read(byte[] buffer, int offset, int count) - { - //Console.WriteLine("Read into buffer.Length = " + buffer.Length + ", offset = " + offset + ", count = " + count); -#if !OLD_DIRECT_READ - - Contracts.CheckValue(buffer, nameof(buffer)); - Contracts.CheckParam(0 <= offset && offset <= buffer.Length, nameof(offset)); - Contracts.CheckParam(offset <= offset + count && offset + count <= buffer.Length, nameof(count)); - - //Console.WriteLine("(reading " + offset + " , " + count + ")"); - int read = 0; - //unsafe - //{ - while (count > 0) - { - if (_currentBufferLimit == _currentBufferBottom) - { - GetBuffer(); - if (_currentBufferLimit == 0) - break; - } - if (_currentBufferLimit - _currentBufferBottom >= count) - { - CopyBuffer(_currentBuffer, _currentBufferBottom, buffer, offset, count); - _currentBufferBottom += count; - //current += count; - read += count; - count = 0; - break; - } - else - { - int chunk = _currentBufferLimit - _currentBufferBottom; - CopyBuffer(_currentBuffer, _currentBufferBottom, buffer, offset, chunk); - read += chunk; - count -= chunk; - offset += chunk; - _currentBufferBottom = _currentBufferLimit; - } - } - //} - - //if (checkStream == null) - //{ - // checkStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); - //} - //byte[] cbuf = new byte[count]; - //int checkRead = checkStream.Read(cbuf, 0, cbuf.Length); - //if (checkRead != read) - //{ - // Console.WriteLine("!!! bytes read mismatch at " + fileName + ": " + checkStream.Position + " / " + Position + ": " + - // "read = " + read + "; checkRead = " + checkRead); - //} - //else - //{ - // Console.WriteLine(">>> bytes read match at " + fileName + ": " + checkStream.Position + " / " + Position + ": " + - // "read = " + read + "; checkRead = " + checkRead); - //} - return read; - -#else - //if (done) return 0; - if (overRead != null) return overRead.Read(buffer, offset, count); - if (Position + count <= length) - { -//////// return base.Read(buffer, offset, count); - - //int readBytes; - //bool readres; - //fixed (byte* alignedBuffer = mBuffer) - //{ - // readres = ReadFile(handle, new IntPtr(alignedBuffer), blockSize, out readBytes, IntPtr.Zero); - //} - //return readBytes; - -#if SYNCHRONOUS - int readBytes; - bool readres; - readres = ReadFile(handle, alignedBuffer, blockSize, out readBytes, IntPtr.Zero); - if (!readres) return 0; - - fixed (byte* amBuffer = mBuffer) - { - int* abIn = (int*)alignedBuffer.ToPointer(); - int* abOut = (int*)amBuffer; - int* abOutEnd = (int*)(abOut + ((readBytes + 7) >> 2)); - while (abOut != abOutEnd) - { - *abOut = *abIn; - abOut++; - abIn++; - } - } - return readBytes; -#else - -#if ASYNC_BAD - int readBytes; - - if (overlappedIndex < 0) - { - overlappedIndex = 0; - overlappeds[overlappedIndex].Offset = (uint)(totalRead & 0xFFFFFFFF); - overlappeds[overlappedIndex].OffsetHigh = (uint)(totalRead >> 32); - overlappeds[overlappedIndex].hEvent = IntPtr.Zero; - ReadFile(handle, alignedBuffer[overlappedIndex], blockSize, - out readBytes, - ref overlappeds[overlappedIndex]); - totalRead += blockSize; - } - - bool result = GetOverlappedResult(handle, - alignedBuffer[overlappedIndex], - ref overlappeds[overlappedIndex], out readBytes, true); - - Console.WriteLine("read: " + readBytes); - if (readBytes == 0) return 0; - - IntPtr inBuffer = alignedBuffer[overlappedIndex]; - - overlappedIndex = (overlappedIndex + 1) % 2; - overlappeds[overlappedIndex].Offset = (uint)(totalRead & 0xFFFFFFFF); - overlappeds[overlappedIndex].OffsetHigh = (uint)(totalRead >> 32); - overlappeds[overlappedIndex].hEvent = IntPtr.Zero; - ReadFile(handle, alignedBuffer[overlappedIndex], blockSize, - out readBytes, - ref overlappeds[overlappedIndex]); - totalRead += blockSize; - - fixed (byte* amBuffer = mBuffer) - { - int* abIn = (int*)inBuffer.ToPointer(); - int* abOut = (int*)amBuffer; - int* abOutEnd = (int*)(abOut + ((readBytes + 7) >> 2)); - while (abOut != abOutEnd) - { - *abOut = *abIn; - abOut++; - abIn++; - } - } - return readBytes; -#else - IntPtr inBuffer = GetBuffer(); - - fixed (byte* amBuffer = mBuffer) - { - int* abIn = (int*)inBuffer.ToPointer(); - int* abOut = (int*)amBuffer; - int* abOutEnd = (int*)(abOut + ((blockSize + 7) >> 2)); - while (abOut != abOutEnd) - { - *abOut = *abIn; - abOut++; - abIn++; - } - } - return blockSize; -#endif -#endif - } - if (Position >= length) - { - return 0; - } - // Unbuffered reads *must* be aligned to the sector size (assumed as 512, here). - // This will use a padded file to read the correct amount, but otherwise will - // have to truncate the read. - if (count == 0) return 0; - int remaining = (int)(length - Position); - int paddedRemaining = (int)(base.Length - Position); - //Console.WriteLine("Partial read - requested " + count + ", left: " + remaining + - // " [" + paddedRemaining + "]"); - int res = paddedRemaining; - if (res == 0) return 0; - //bool resized = false; - if (res % sectorSize != 0) - { - //// 1. just truncate: - //res = (int)((res / sectorSize) * sectorSize); - - //// 2. can't resize, we've locked it: - //ResizeFile(fileName, ((length / sectorSize + 1) * sectorSize)); - - //// 3. total hack: - int first = (int)((res / sectorSize) * sectorSize); - if (first != 0) - { - Read(buffer, offset, first); - offset += first; - count -= first; - } - long pos = Position; - //Console.WriteLine(" pos: " + pos); - Close(); - overRead = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - overRead.Seek(pos, SeekOrigin.Begin); - return first + Read(buffer, offset, count); - } - //Console.WriteLine(" req: " + res); - if (res == 0) return 0; - res = Math.Min(res, Read(buffer, offset, res)); - //Console.WriteLine(" read: " + res); - //if (resized) - //{ - // ResizeFile(fileName, length); - //} - return Math.Min(res, remaining); -#endif - } - - //private FileStream checkStream = null; - - //private unsafe byte* current = null; - - /// - /// Read a block of bytes from the stream and advance the position. - /// - /// returns a pointer to a (pinned) buffer of bytes read from the stream - /// - /// the number of bytes read - this will be positive unless the end of - /// stream has been reached, in which case it will be 0 - /// - /// The buffer returned here may be shared across calls to this method. - public unsafe int Read(out byte* buffer) - { - if (_currentBufferLimit == _currentBufferBottom) - { - GetBuffer(); - //if (gotDone) - //{ - // //Console.WriteLine("(gotDone : currentBufferBottom = " + currentBufferBottom + - // // ", currentBufferLimit = " + currentBufferLimit + ")"); - // return 0; - //} - //if (currentBufferLimit == 0) return 0; - } - buffer = ((byte*)_currentBuffer.ToPointer()) + _currentBufferBottom; - int count = _currentBufferLimit - _currentBufferBottom; - _currentBufferBottom = _currentBufferLimit; - return count; - } - - // TODO: make ReadByte() fast! *** - - // private byte[] readByteBuffer = new byte[512]; - // private int readByteBufferPos = 0; - // private int readByteBufferCount = 0; - - /// - /// Retrieve the next byte in the stream and advance the position. - /// - /// the next byte, or -1 if at end of stream - /// This is not as efficient as block reading, because of overhead issues. - public override int ReadByte() - { - //checkStream.ReadByte(); // check?? - if (_currentBufferLimit == _currentBufferBottom) - { - GetBuffer(); - } - if (_currentBufferLimit == 0) - return -1; - // note the (post)increment of currentBufferBottom: - unsafe - { - return *(((byte*)_currentBuffer.ToPointer()) + _currentBufferBottom++); - } - //// Marshal is incredibly slow!! - //return Marshal.ReadByte(currentBuffer, currentBufferBottom++); - } - - /// - /// Retrieve the next byte in the stream, without advancing the position. - /// - /// the next byte, or -1 if at end of stream - /// This is not as efficient as block reading, because of overhead issues. - public int Peek() - { - if (_currentBufferLimit == _currentBufferBottom) - { - GetBuffer(); - } - if (_currentBufferLimit == 0) - return -1; - unsafe - { - return *(((byte*)_currentBuffer.ToPointer()) + _currentBufferBottom); - } - //// Marshal is incredibly slow!! - //return Marshal.ReadByte(currentBuffer, currentBufferBottom); - } - - /// - /// Check if the end of file has been reached. - /// - /// true if no more bytes remain; false otherwise - public bool Eof() - { - if (_currentBufferBottom < _currentBufferLimit) - return false; - //if (gotDone) return true; - // is this good enough? We want to be cheap... - return (Position < Length); - } - - #endregion - - #endregion - - #region Unsupported Members - -#if !UNBUFFERED_AS_STREAM - /// - /// Get whether the stream was opened asynchronously. Always false, but this does not - /// matter for managed code. - /// - public override bool IsAsync - { - get - { - return false; - //return base.IsAsync; - } - } -#endif - - /// - /// Write all pending data. This method does nothing. - /// - public override void Flush() - { - } - - /// - /// Set the length of the file - not supported. - /// - /// the length that the file will not be set to - /// Always thrown. - public override void SetLength(long value) - { - throw Contracts.ExceptNotSupp("UnbufferedStream cannot set the file length."); - } - - /// - /// Write a section of buffer to the stream - not supported. - /// - /// the buffer that will not be written - /// the offset in buffer at which to not start writing - /// the number of bytes to not write - /// Always thrown. - public override void Write(byte[] buffer, int offset, int count) - { - throw Contracts.ExceptNotSupp("UnbufferedStream cannot write."); - } - - #endregion - } - -#if UNBUFFEREDREADER - /// - /// StreamReader using unbuffered I/O for efficient reading from fast disk arrays. - /// - public sealed class UnbufferedStreamReader : StreamReader - { - private readonly UnbufferedStream stream; - private Encoding encoding; - private Decoder decoder; - private byte* byteBuffer; - private int byteCount = 0; - private int bytePos = 0; - private char[] charBuffer; - private int charLen = 0; - private int charPos = 0; - - public UnbufferedStreamReader(string fileName) - : this(new UnbufferedStream(fileName)) - { - } - - public UnbufferedStreamReader(UnbufferedStream stream) - : base(stream) - { - this.stream = stream; - Peek(); - encoding = CurrentEncoding; - buffer = null; - bufferCount = 0; - Init(); - } - - private void Init() - { - this.decoder = encoding.GetDecoder(); - byteBuffer = null; - byteCount = 0; - charBuffer = null; - this.byteLen = 0; - this.bytePos = 0; - //this._isBlocked = false; - //this._closable = true; - } - - /// Reads the next character from the input stream and advances the character position by one character. - /// The next character from the input stream represented as an object, or -1 if no more characters are available. - /// An I/O error occurs. - public override int Read() - { - if (stream == null) - throw new IOException("Reader is closed."); - if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0)) - { - return -1; - } - int num1 = this.charBuffer[this.charPos]; - this.charPos++; - return num1; - } - - /// Returns the next available character but does not consume it. - /// The next character to be read, or -1 if no more characters are available or the stream does not support seeking. - /// An I/O error occurs. - public override int Peek() - { - if (stream == null) - throw new IOException("Reader is closed."); - if (charPos < charLen) - { - return charBuffer[charPos]; - } - if ((this.charPos != this.charLen) || (!this._isBlocked && (this.ReadBuffer() != 0))) - { - return this.charBuffer[this.charPos]; - } - return -1; - } - - /// Reads a maximum of count characters from the current stream into buffer, beginning at index. - /// The number of characters that have been read, or 0 if at the end of the stream and no data was read. The number will be less than or equal to the count parameter, depending on whether the data is available within the stream. - /// The maximum number of characters to read. - /// When this method returns, contains the specified character array with the values between index and (index + count - 1) replaced by the characters read from the current source. - /// The index of buffer at which to begin writing. - /// buffer is null. - /// index or count is negative. - /// The buffer length minus index is less than count. - /// An I/O error occurs, such as the stream is closed. - public override int Read([In, Out] char[] buffer, int index, int count) - { - if (stream == null) - throw new IOException("Reader is closed."); - if (buffer == null) - { - throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer")); - } - if ((index < 0) || (count < 0)) - { - throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); - } - if ((buffer.Length - index) < count) - { - throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen")); - } - int num1 = 0; - bool flag1 = false; - while (count > 0) - { - int num2 = this.charLen - this.charPos; - if (num2 == 0) - { - num2 = this.ReadBuffer(buffer, index + num1, count, out flag1); - } - if (num2 == 0) - { - return num1; - } - if (num2 > count) - { - num2 = count; - } - if (!flag1) - { - Buffer.InternalBlockCopy(this.charBuffer, this.charPos * 2, buffer, (index + num1) * 2, num2 * 2); - this.charPos += num2; - } - num1 += num2; - count -= num2; - if (this._isBlocked) - { - return num1; - } - } - return num1; - } - - /// Reads a maximum of count characters from the current stream and writes the data to buffer, beginning at index. - /// The number of characters that have been read. The number will be less than or equal to count, depending on whether all input characters have been read. - /// The maximum number of characters to read. - /// When this method returns, this parameter contains the specified character array with the values between index and (index + count -1) replaced by the characters read from the current source. - /// The place in buffer at which to begin writing. - /// An I/O error occurs. - /// index or count is negative. - /// The buffer length minus index is less than count. - /// buffer is null. - /// The is closed. - public virtual int ReadBlock([In, Out] char[] buffer, int index, int count) - { - int num1; - int num2 = 0; - do - { - num2 += num1 = this.Read(buffer, index + num2, count - num2); - } - while ((num1 > 0) && (num2 < count)); - return num2; - } - - /// Reads a line of characters from the current stream and returns the data as a string. - /// The next line from the input stream, or null if the end of the input stream is reached. - /// An I/O error occurs. - /// There is insufficient memory to allocate a buffer for the returned string. - public override string ReadLine() - { - if (stream == null) - throw new IOException("Reader is closed."); - if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0)) - { - return null; - } - StringBuilder builder1 = null; - while (true) - { - int num1 = this.charPos; - do - { - char ch1 = this.charBuffer[num1]; - if ((ch1 == '\r') || (ch1 == '\n')) - { - string text1; - if (builder1 != null) - { - builder1.Append(this.charBuffer, this.charPos, num1 - this.charPos); - text1 = builder1.ToString(); - } - else - { - text1 = new string(this.charBuffer, this.charPos, num1 - this.charPos); - } - this.charPos = num1 + 1; - if (((ch1 == '\r') && ((this.charPos < this.charLen) || (this.ReadBuffer() > 0))) && (this.charBuffer[this.charPos] == '\n')) - { - this.charPos++; - } - return text1; - } - num1++; - } - while (num1 < this.charLen); - num1 = this.charLen - this.charPos; - if (builder1 == null) - { - builder1 = new StringBuilder(num1 + 80); - } - builder1.Append(this.charBuffer, this.charPos, num1); - if (this.ReadBuffer() <= 0) - { - return builder1.ToString(); - } - } - } - - /// Reads the stream from the current position to the end of the stream. - /// The rest of the stream as a string, from the current position to the end. If the current position is at the end of the stream, returns the empty string(""). - /// An I/O error occurs. - /// There is insufficient memory to allocate a buffer for the returned string. - public override string ReadToEnd() - { - if (stream == null) - throw new IOException("Reader is closed."); - StringBuilder builder1 = new StringBuilder(this.charLen - this.charPos); - do - { - builder1.Append(this.charBuffer, this.charPos, this.charLen - this.charPos); - this.charPos = this.charLen; - this.ReadBuffer(); - } - while (this.charLen > 0); - return builder1.ToString(); - } - - private int ReadBuffer() - { - byteCount = stream.Read(out byteBuffer); - int maxCharsPerBuffer = encoding.GetMaxCharCount(byteCount); - if (charBuffer == null || charBuffer.Length < maxCharsPerBuffer) - { - charBuffer = new char[maxCharsPerBuffer]; - } - - charLen = 0; - charPos = 0; - } - - /// Closes the underlying stream, releases the unmanaged resources used by the , and optionally releases the managed resources. - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected override void Dispose(bool disposing) - { - try - { - base.Dispose(disposing); - } - finally - { - this.stream = null; - this.encoding = null; - } - } - } -#endif -} diff --git a/src/Microsoft.ML.KMeansClustering/KMeansPlusPlusTrainer.cs b/src/Microsoft.ML.KMeansClustering/KMeansPlusPlusTrainer.cs index 1f09ec850f..1ab65a8cd5 100644 --- a/src/Microsoft.ML.KMeansClustering/KMeansPlusPlusTrainer.cs +++ b/src/Microsoft.ML.KMeansClustering/KMeansPlusPlusTrainer.cs @@ -28,7 +28,8 @@ namespace Microsoft.ML.Runtime.KMeans { - public class KMeansPlusPlusTrainer : TrainerBase + /// + public class KMeansPlusPlusTrainer : TrainerBase { public const string LoadNameValue = "KMeansPlusPlus"; internal const string UserNameValue = "KMeans++ Clustering"; @@ -73,11 +74,6 @@ public class Arguments : UnsupervisedLearnerInputBaseWithWeight } private readonly int _k; - private int _dimensionality; - - // The coordinates of the final centroids at the end of the training. During training - // it holds the centroids of the previous iteration. - private readonly VBuffer[] _centroids; private readonly int _maxIterations; // max number of iterations to train private readonly Float _convergenceThreshold; // convergence thresholds @@ -86,77 +82,63 @@ public class Arguments : UnsupervisedLearnerInputBaseWithWeight private readonly InitAlgorithm _initAlgorithm; private readonly int _numThreads; + public override TrainerInfo Info { get; } + public override PredictionKind PredictionKind => PredictionKind.Clustering; + public KMeansPlusPlusTrainer(IHostEnvironment env, Arguments args) : base(env, LoadNameValue) { - Contracts.CheckValue(args, nameof(args)); - Contracts.CheckUserArg(args.K > 0, nameof(args.K), "Number of means must be positive"); + Host.CheckValue(args, nameof(args)); + Host.CheckUserArg(args.K > 0, nameof(args.K), "Must be positive"); _k = args.K; - Contracts.CheckUserArg(args.MaxIterations > 0, nameof(args.MaxIterations), "Number of iterations must be positive"); + Host.CheckUserArg(args.MaxIterations > 0, nameof(args.MaxIterations), "Must be positive"); _maxIterations = args.MaxIterations; - Contracts.CheckUserArg(args.OptTol > 0, nameof(args.OptTol), "Tolerance must be positive"); + Host.CheckUserArg(args.OptTol > 0, nameof(args.OptTol), "Tolerance must be positive"); _convergenceThreshold = args.OptTol; - _centroids = new VBuffer[_k]; - - Contracts.CheckUserArg(args.AccelMemBudgetMb > 0, nameof(args.AccelMemBudgetMb), "Memory budget must be positive"); + Host.CheckUserArg(args.AccelMemBudgetMb > 0, nameof(args.AccelMemBudgetMb), "Must be positive"); _accelMemBudgetMb = args.AccelMemBudgetMb; _initAlgorithm = args.InitAlgorithm; - if (args.NumThreads.HasValue) - { - Contracts.CheckUserArg(args.NumThreads.Value > 0, nameof(args.NumThreads), "The number of threads must be either null or a positive integer."); - } + Host.CheckUserArg(!args.NumThreads.HasValue || args.NumThreads > 0, nameof(args.NumThreads), + "Must be either null or a positive integer."); _numThreads = ComputeNumThreads(Host, args.NumThreads); + Info = new TrainerInfo(); } - public override bool NeedNormalization - { - get { return true; } - } - - public override bool NeedCalibration - { - get { return false; } - } - - public override bool WantCaching - { - get { return true; } - } - - public override PredictionKind PredictionKind + public override KMeansPredictor Train(TrainContext context) { - get { return PredictionKind.Clustering; } - } - - public override void Train(RoleMappedData data) - { - Contracts.CheckValue(data, nameof(data)); + Host.CheckValue(context, nameof(context)); + var data = context.TrainingSet; - data.CheckFeatureFloatVector(out _dimensionality); - Contracts.Assert(_dimensionality > 0); + data.CheckFeatureFloatVector(out int dimensionality); + Contracts.Assert(dimensionality > 0); using (var ch = Host.Start("Training")) { - TrainCore(ch, data); + var pred = TrainCore(ch, data, dimensionality); ch.Done(); + return pred; } } - private void TrainCore(IChannel ch, RoleMappedData data) + private KMeansPredictor TrainCore(IChannel ch, RoleMappedData data, int dimensionality) { Host.AssertValue(ch); ch.AssertValue(data); - // REVIEW: In high-dimensionality cases this is less than ideal - // and we should consider using sparse buffers. + // REVIEW: In high-dimensionality cases this is less than ideal and we should consider + // using sparse buffers for the centroids. + + // The coordinates of the final centroids at the end of the training. During training + // it holds the centroids of the previous iteration. + var centroids = new VBuffer[_k]; for (int i = 0; i < _k; i++) - _centroids[i] = VBufferUtils.CreateDense(_dimensionality); + centroids[i] = VBufferUtils.CreateDense(dimensionality); ch.Info("Initializing centroids"); long missingFeatureCount; @@ -165,34 +147,34 @@ private void TrainCore(IChannel ch, RoleMappedData data) var cursorFactory = new FeatureFloatVectorCursor.Factory(data, CursOpt.Features | CursOpt.Id | CursOpt.Weight); // REVIEW: It would be nice to extract these out into subcomponents in the future. We should // revisit and even consider breaking these all into individual KMeans-flavored trainers, they - // all produce a valid set of output centroids with various trade-offs in runtime (with perhaps + // all produce a valid set of output centroids with various trade-offs in runtime (with perhaps // random initialization creating a set that's not terribly useful.) They could also be extended to // pay attention to their incoming set of centroids and incrementally train. if (_initAlgorithm == InitAlgorithm.KMeansPlusPlus) { - KMeansPlusPlusInit.Initialize(Host, _numThreads, ch, cursorFactory, _k, _dimensionality, - _centroids, out missingFeatureCount, out totalTrainingInstances); + KMeansPlusPlusInit.Initialize(Host, _numThreads, ch, cursorFactory, _k, dimensionality, + centroids, out missingFeatureCount, out totalTrainingInstances); } else if (_initAlgorithm == InitAlgorithm.Random) { KMeansRandomInit.Initialize(Host, _numThreads, ch, cursorFactory, _k, - _centroids, out missingFeatureCount, out totalTrainingInstances); + centroids, out missingFeatureCount, out totalTrainingInstances); } else { // Defaulting to KMeans|| initialization. - KMeansBarBarInitialization.Initialize(Host, _numThreads, ch, cursorFactory, _k, _dimensionality, - _centroids, _accelMemBudgetMb, out missingFeatureCount, out totalTrainingInstances); + KMeansBarBarInitialization.Initialize(Host, _numThreads, ch, cursorFactory, _k, dimensionality, + centroids, _accelMemBudgetMb, out missingFeatureCount, out totalTrainingInstances); } - KMeansUtils.VerifyModelConsistency(_centroids); + KMeansUtils.VerifyModelConsistency(centroids); ch.Info("Centroids initialized, starting main trainer"); KMeansLloydsYinYangTrain.Train( - Host, _numThreads, ch, cursorFactory, totalTrainingInstances, _k, _dimensionality, _maxIterations, - _accelMemBudgetMb, _convergenceThreshold, _centroids); + Host, _numThreads, ch, cursorFactory, totalTrainingInstances, _k, dimensionality, _maxIterations, + _accelMemBudgetMb, _convergenceThreshold, centroids); - KMeansUtils.VerifyModelConsistency(_centroids); + KMeansUtils.VerifyModelConsistency(centroids); ch.Info("Model trained successfully on {0} instances", totalTrainingInstances); if (missingFeatureCount > 0) { @@ -200,11 +182,7 @@ private void TrainCore(IChannel ch, RoleMappedData data) "{0} instances with missing features detected and ignored. Consider using MissingHandler.", missingFeatureCount); } - } - - public override KMeansPredictor CreatePredictor() - { - return new KMeansPredictor(Host, _k, _centroids, copyIn: true); + return new KMeansPredictor(Host, _k, centroids, copyIn: true); } private static int ComputeNumThreads(IHost host, int? argNumThreads) @@ -225,7 +203,12 @@ private static int ComputeNumThreads(IHost host, int? argNumThreads) return Math.Max(1, maxThreads); } - [TlcModule.EntryPoint(Name = "Trainers.KMeansPlusPlusClusterer", Desc = KMeansPlusPlusTrainer.Summary, UserName = UserNameValue, ShortName = ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.KMeansPlusPlusClusterer", + Desc = Summary, + UserName = UserNameValue, + ShortName = ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.ClusteringOutput TrainKMeans(IHostEnvironment env, Arguments input) { Contracts.CheckValue(env, nameof(env)); @@ -299,7 +282,7 @@ public static void Initialize( // This check is only performed once, at the first pass of initialization if (dimensionality != cursor.Features.Length) { - throw Contracts.Except( + throw ch.Except( "Dimensionality doesn't match, expected {0}, got {1}", dimensionality, cursor.Features.Length); @@ -318,7 +301,7 @@ public static void Initialize( probabilityWeight = Math.Min(probabilityWeight, distance); } - Contracts.Assert(FloatUtils.IsFinite(probabilityWeight)); + ch.Assert(FloatUtils.IsFinite(probabilityWeight)); } if (probabilityWeight > 0) @@ -350,7 +333,7 @@ public static void Initialize( // persist the candidate as a new centroid if (!haveCandidate) { - throw Contracts.Except( + throw ch.Except( "Not enough distinct instances to populate {0} clusters (only found {1} distinct instances)", k, i); } @@ -363,13 +346,13 @@ public static void Initialize( /// /// An instance of this class is used by SharedStates in YinYangTrainer - /// and KMeansBarBarInitialization. It effectively bounds MaxInstancesToAccelerate and + /// and KMeansBarBarInitialization. It effectively bounds MaxInstancesToAccelerate and /// initializes RowIndexGetter. /// internal sealed class KMeansAcceleratedRowMap { // Retrieves the row's index for per-instance data. If the - // row is not assigned an index (it occurred after 'maxInstancesToAccelerate') + // row is not assigned an index (it occurred after 'maxInstancesToAccelerate') // or we are not accelerating then this returns -1. public readonly KMeansUtils.RowIndexGetter RowIndexGetter; @@ -451,14 +434,14 @@ internal static class KMeansBarBarInitialization /// /// Data for optimizing KMeans|| initialization. Very similar to SharedState class /// For every instance, there is a space for the best weight and best cluster computed. - /// + /// /// In this class, new clusters mean the clusters that were added to the cluster set - /// in the previous round of KMeans|| and old clusters are the rest of them (the ones + /// in the previous round of KMeans|| and old clusters are the rest of them (the ones /// that were added in the rounds before the previous one). - /// + /// /// In every round of KMeans||, numSamplesPerRound new clusters are added to the set of clusters. - /// There are 'numRounds' number of rounds. We compute and store the distance of each new - /// cluster from every round to all of the previous clusters and use it + /// There are 'numRounds' number of rounds. We compute and store the distance of each new + /// cluster from every round to all of the previous clusters and use it /// to avoid unnecessary computation by applying the triangle inequality. /// private sealed class SharedState @@ -470,12 +453,12 @@ private sealed class SharedState // Note that this array is only allocated for MaxInstancesToAccelerate elements. private readonly int[] _bestCluster; - // _bestWeight holds the weight of instance x to _bestCluster[x] where weight(x) = dist(x, _bestCluster[x])^2 - norm(x)^2. + // _bestWeight holds the weight of instance x to _bestCluster[x] where weight(x) = dist(x, _bestCluster[x])^2 - norm(x)^2. // Note that this array is only allocated for MaxInstancesToAccelerate elements. private readonly Float[] _bestWeight; // The distance of each newly added cluster from the previous round to every old cluster - // the first dimension of this array is the size of numSamplesPerRound + // the first dimension of this array is the size of numSamplesPerRound // and the second dimension is the size of numRounds * numSamplesPerRound. // _clusterDistances[i][j] = dist(cluster[i+clusterPrevCount], cluster[j]) // where clusterPrevCount-1 is the last index of the old clusters @@ -527,8 +510,8 @@ public Float GetBestWeight(int idx) /// /// When assigning an accelerated row to a cluster, we store away the weight /// to its closest cluster, as well as the identity of the new - /// closest cluster. Note that bestWeight can be negative since it is - /// corresponding to the weight of a distance which does not have + /// closest cluster. Note that bestWeight can be negative since it is + /// corresponding to the weight of a distance which does not have /// the L2 norm of the point itself. /// public void SetInstanceCluster(int n, Float bestWeight, int bestCluster) @@ -582,7 +565,7 @@ public bool CanWeightComputationBeAvoided(Float instanceDistanceToBestOldCluster // Use triangle inequality to evaluate whether weight computation can be avoided // dist(x,cNew) + dist(x,cOld) > dist(cOld,cNew) => // dist(x,cNew) > dist(cOld,cNew) - dist(x,cOld) => - // If dist(cOld,cNew) - dist(x,cOld) > dist(x,cOld), then dist(x,cNew) > dist(x,cOld). Therefore it is + // If dist(cOld,cNew) - dist(x,cOld) > dist(x,cOld), then dist(x,cNew) > dist(x,cOld). Therefore it is // not necessary to compute dist(x,cNew). if (distanceBetweenOldAndNewClusters - instanceDistanceToBestOldCluster > instanceDistanceToBestOldCluster) return true; @@ -594,7 +577,7 @@ public bool CanWeightComputationBeAvoided(Float instanceDistanceToBestOldCluster /// /// This function finds the best cluster and the best weight for an instance using /// smart triangle inequality to avoid unnecessary weight computations. - /// + /// /// Note that is used to avoid the storing the new cluster in /// final round. After the final round, best cluster information will be ignored. /// @@ -666,7 +649,7 @@ private static void FindBestCluster(ref VBuffer point, int pointRowIndex, } /// - /// This method computes the memory requirement for _clusterDistances in SharedState (clusterBytes) and + /// This method computes the memory requirement for _clusterDistances in SharedState (clusterBytes) and /// the maximum number of instances whose weight to the closest cluster can be memorized in order to avoid /// recomputation later. /// @@ -695,7 +678,7 @@ private static void ComputeAccelerationMemoryRequirement(long accelMemBudgetMb, /// /// Uses memory in initializationState to cache distances and avoids unnecessary distance computations /// akin to YinYang-KMeans paper. - /// + /// /// Everywhere in this function, weight of an instance x from a cluster c means weight(x,c) = dist(x,c)^2-norm(x)^2. /// We store weight in most cases to avoid unnecessary computation of norm(x). /// @@ -704,13 +687,13 @@ public static void Initialize(IHost host, int numThreads, IChannel ch, FeatureFl out long missingFeatureCount, out long totalTrainingInstances) { Contracts.CheckValue(host, nameof(host)); - host.CheckValue(cursorFactory, nameof(cursorFactory)); host.CheckValue(ch, nameof(ch)); - host.CheckValue(centroids, nameof(centroids)); - host.CheckUserArg(numThreads > 0, nameof(KMeansPlusPlusTrainer.Arguments.NumThreads), "Must be positive"); - host.CheckUserArg(k > 0, nameof(KMeansPlusPlusTrainer.Arguments.K), "Must be positive"); - host.CheckParam(dimensionality > 0, nameof(dimensionality), "Must be positive"); - host.CheckUserArg(accelMemBudgetMb >= 0, nameof(KMeansPlusPlusTrainer.Arguments.AccelMemBudgetMb), "Must be non-negative"); + ch.CheckValue(cursorFactory, nameof(cursorFactory)); + ch.CheckValue(centroids, nameof(centroids)); + ch.CheckUserArg(numThreads > 0, nameof(KMeansPlusPlusTrainer.Arguments.NumThreads), "Must be positive"); + ch.CheckUserArg(k > 0, nameof(KMeansPlusPlusTrainer.Arguments.K), "Must be positive"); + ch.CheckParam(dimensionality > 0, nameof(dimensionality), "Must be positive"); + ch.CheckUserArg(accelMemBudgetMb >= 0, nameof(KMeansPlusPlusTrainer.Arguments.AccelMemBudgetMb), "Must be non-negative"); int numRounds; int numSamplesPerRound; @@ -775,7 +758,7 @@ public static void Initialize(IHost host, int numThreads, IChannel ch, FeatureFl VBufferUtils.Densify(ref clusters[clusterCount]); clustersL2s[clusterCount] = VectorUtils.NormSquared(clusters[clusterCount]); clusterPrevCount = clusterCount; - Contracts.Assert(clusterCount - clusterPrevCount <= numSamplesPerRound); + ch.Assert(clusterCount - clusterPrevCount <= numSamplesPerRound); clusterCount++; logicalExternalRounds++; pCh.Checkpoint(logicalExternalRounds, numRounds + 2); @@ -816,11 +799,11 @@ public static void Initialize(IHost host, int numThreads, IChannel ch, FeatureFl clusterCount++; } - Contracts.Assert(clusterCount - clusterPrevCount <= numSamplesPerRound); + ch.Assert(clusterCount - clusterPrevCount <= numSamplesPerRound); logicalExternalRounds++; pCh.Checkpoint(logicalExternalRounds, numRounds + 2); } - Contracts.Assert(clusterCount == clusters.Length); + ch.Assert(clusterCount == clusters.Length); } // Finally, we do one last pass through the dataset, finding for @@ -839,7 +822,7 @@ public static void Initialize(IHost host, int numThreads, IChannel ch, FeatureFl clustersL2s, false, false, out discardBestWeight, out bestCluster); #if DEBUG int debugBestCluster = KMeansUtils.FindBestCluster(ref point, clusters, clustersL2s); - Contracts.Assert(bestCluster == debugBestCluster); + ch.Assert(bestCluster == debugBestCluster); #endif weights[bestCluster]++; }, @@ -869,9 +852,9 @@ public static void Initialize(IHost host, int numThreads, IChannel ch, FeatureFl ref debugWeightBuffer, ref debugTotalWeights); for (int i = 0; i < totalWeights.Length; i++) - Contracts.Assert(totalWeights[i] == debugTotalWeights[i]); + ch.Assert(totalWeights[i] == debugTotalWeights[i]); #endif - Contracts.Assert(totalWeights.Length == clusters.Length); + ch.Assert(totalWeights.Length == clusters.Length); logicalExternalRounds++; // If we sampled exactly the right number of points then we can @@ -887,10 +870,10 @@ public static void Initialize(IHost host, int numThreads, IChannel ch, FeatureFl else { ArrayDataViewBuilder arrDv = new ArrayDataViewBuilder(host); - arrDv.AddColumn("Features", PrimitiveType.FromKind(DataKind.R4), clusters); - arrDv.AddColumn("Weights", PrimitiveType.FromKind(DataKind.R4), totalWeights); + arrDv.AddColumn(DefaultColumnNames.Features, PrimitiveType.FromKind(DataKind.R4), clusters); + arrDv.AddColumn(DefaultColumnNames.Weight, PrimitiveType.FromKind(DataKind.R4), totalWeights); var subDataViewCursorFactory = new FeatureFloatVectorCursor.Factory( - TrainUtils.CreateExamples(arrDv.GetDataView(), null, "Features", weight: "Weights"), CursOpt.Weight | CursOpt.Features); + new RoleMappedData(arrDv.GetDataView(), null, DefaultColumnNames.Features, weight: DefaultColumnNames.Weight), CursOpt.Weight | CursOpt.Features); long discard1; long discard2; KMeansPlusPlusInit.Initialize(host, numThreads, ch, subDataViewCursorFactory, k, dimensionality, centroids, out discard1, out discard2, false); @@ -1036,7 +1019,7 @@ public void UpdateClusterAssignment(bool firstIteration, ref VBuffer feat { // update the cachedSum as the instance moves from (previous) bestCluster[n] to cluster VectorUtils.Add(ref features, ref CachedSum[cluster]); - // There doesnt seem to be a Subtract function that does a -= b, so doing a += (-1 * b) + // There doesnt seem to be a Subtract function that does a -= b, so doing a += (-1 * b) VectorUtils.AddMult(ref features, -1, ref CachedSum[previousCluster]); NumChanged++; } @@ -1168,7 +1151,7 @@ private sealed class SharedState // max value of delta[i] for 0 <= i < _k public Float DeltaMax; - // Per instance structures + // Per instance structures public int GetBestCluster(int idx) { @@ -1186,18 +1169,18 @@ public int GetBestCluster(int idx) public SharedState(FeatureFloatVectorCursor.Factory factory, IChannel ch, long baseMaxInstancesToAccelerate, int k, bool isParallel, long totalTrainingInstances) { - Contracts.AssertValue(factory); Contracts.AssertValue(ch); - Contracts.Assert(k > 0); - Contracts.Assert(totalTrainingInstances > 0); + ch.AssertValue(factory); + ch.Assert(k > 0); + ch.Assert(totalTrainingInstances > 0); _acceleratedRowMap = new KMeansAcceleratedRowMap(factory, ch, baseMaxInstancesToAccelerate, totalTrainingInstances, isParallel); - Contracts.Assert(MaxInstancesToAccelerate >= 0, + ch.Assert(MaxInstancesToAccelerate >= 0, "MaxInstancesToAccelerate cannot be negative as KMeansAcceleratedRowMap sets it to 0 when baseMaxInstancesToAccelerate is negative"); if (MaxInstancesToAccelerate > 0) { - // allocate data structures + // allocate data structures Delta = new Float[k]; _bestCluster = new int[MaxInstancesToAccelerate]; @@ -1495,7 +1478,7 @@ public struct RowStats /// data set with a probability of numSamples/N * weight/(sum(weight)). Buffer /// is sized to the number of threads plus one and stores the minheaps needed to /// perform the per-thread reservior samples. - /// + /// /// This method assumes that the numSamples is much smaller than the full dataset as /// it expects to be able to sample numSamples * numThreads. /// @@ -1531,13 +1514,13 @@ public static RowStats ParallelWeightedReservoirSample( // We use distance as a proxy for 'is the same point'. By excluding // all points that lie within a very small distance of our current set of // centroids we force the algorithm to explore more broadly and avoid creating a - // set of centroids containing the same, or very close to the same, point + // set of centroids containing the same, or very close to the same, point // more than once. Float sameClusterEpsilon = (Float)1e-15; Float weight = weightFn(ref point, pointRowIndex); - // If numeric instability has forced it to zero, then we bound it to epsilon to + // If numeric instability has forced it to zero, then we bound it to epsilon to // keep the key valid and avoid NaN, (although the math does tend to work out regardless: // 1 / 0 => Inf, base ^ Inf => 0, when |base| < 1) if (weight == 0) @@ -1564,12 +1547,12 @@ public static RowStats ParallelWeightedReservoirSample( }, (Heap[] heaps, IRandom rand, ref Heap finalHeap) => { - Contracts.Assert(finalHeap == null); + host.Assert(finalHeap == null); finalHeap = new Heap((x, y) => x.Weight > y.Weight, numSamples); for (int i = 0; i < heaps.Length; i++) { - Contracts.AssertValue(heaps[i]); - Contracts.Assert(heaps[i].Count <= numSamples, "heaps[i].Count must not be greater than numSamples"); + host.AssertValue(heaps[i]); + host.Assert(heaps[i].Count <= numSamples, "heaps[i].Count must not be greater than numSamples"); while (heaps[i].Count > 0) { var row = heaps[i].Pop(); @@ -1585,7 +1568,7 @@ public static RowStats ParallelWeightedReservoirSample( }, ref buffer, ref outHeap); if (outHeap.Count != numSamples) - throw Contracts.Except("Failed to initialize clusters: too few examples"); + throw host.Except("Failed to initialize clusters: too few examples"); // Keep in mind that the distribution of samples in dst will not be random. It will // have the residual minHeap ordering. diff --git a/src/Microsoft.ML.KMeansClustering/doc.xml b/src/Microsoft.ML.KMeansClustering/doc.xml new file mode 100644 index 0000000000..b4318de334 --- /dev/null +++ b/src/Microsoft.ML.KMeansClustering/doc.xml @@ -0,0 +1,36 @@ + + + + + + + K-means is a popular clustering algorithm. With K-means, the data is clustered into a specified + number of clusters in order to minimize the within-cluster sum of squares. + + + K-means++ improves upon K-means by using the Yinyang K-Means method for choosing the initial cluster centers. + YYK-Means accelerates K-Means up to an order of magnitude while producing exactly the same clustering results (modulo floating point precision issues). + YYK-Means observes that there is a lot of redundancy across iterations in the KMeans algorithms and most points do not change their clusters during an iteration. + It uses various bounding techniques to identify this redundancy and eliminate many distance computations and optimize centroid computations. + For more information on K-means, and K-means++ see: + + K-means + K-means++ + + + + + + + new KMeansPlusPlusClusterer + { + MaxIterations = 100, + NumThreads = 5, + InitAlgorithm = KMeansPlusPlusTrainerInitAlgorithm.KMeansParallel + } + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.LightGBM/LightGbmArguments.cs b/src/Microsoft.ML.LightGBM/LightGbmArguments.cs new file mode 100644 index 0000000000..f31f67a08d --- /dev/null +++ b/src/Microsoft.ML.LightGBM/LightGbmArguments.cs @@ -0,0 +1,414 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Text; +using System.Reflection; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.LightGBM; + +[assembly: LoadableClass(typeof(LightGbmArguments.TreeBooster), typeof(LightGbmArguments.TreeBooster.Arguments), + typeof(SignatureLightGBMBooster), LightGbmArguments.TreeBooster.FriendlyName, LightGbmArguments.TreeBooster.Name)] +[assembly: LoadableClass(typeof(LightGbmArguments.DartBooster), typeof(LightGbmArguments.DartBooster.Arguments), + typeof(SignatureLightGBMBooster), LightGbmArguments.DartBooster.FriendlyName, LightGbmArguments.DartBooster.Name)] +[assembly: LoadableClass(typeof(LightGbmArguments.GossBooster), typeof(LightGbmArguments.GossBooster.Arguments), + typeof(SignatureLightGBMBooster), LightGbmArguments.GossBooster.FriendlyName, LightGbmArguments.GossBooster.Name)] + +[assembly: EntryPointModule(typeof(LightGbmArguments.TreeBooster.Arguments))] +[assembly: EntryPointModule(typeof(LightGbmArguments.DartBooster.Arguments))] +[assembly: EntryPointModule(typeof(LightGbmArguments.GossBooster.Arguments))] + +namespace Microsoft.ML.Runtime.LightGBM +{ + public delegate void SignatureLightGBMBooster(); + + [TlcModule.ComponentKind("BoosterParameterFunction")] + public interface ISupportBoosterParameterFactory : IComponentFactory + { + } + public interface IBoosterParameter + { + void UpdateParameters(Dictionary res); + } + + /// + /// Parameters names comes from LightGBM library. + /// See https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst. + /// + public sealed class LightGbmArguments : LearnerInputBaseWithGroupId + { + public abstract class BoosterParameter : IBoosterParameter + where TArgs : class, new() + { + protected TArgs Args { get; } + + protected BoosterParameter(TArgs args) + { + Args = args; + } + + /// + /// Update the parameters by specific Booster, will update parameters into "res" directly. + /// + public virtual void UpdateParameters(Dictionary res) + { + FieldInfo[] fields = Args.GetType().GetFields(); + foreach (var field in fields) + res[GetArgName(field.Name)] = field.GetValue(Args).ToString(); + } + } + + private static string GetArgName(string name) + { + StringBuilder strBuf = new StringBuilder(); + bool first = true; + foreach (char c in name) + { + if (char.IsUpper(c)) + { + if (first) + first = false; + else + strBuf.Append('_'); + strBuf.Append(char.ToLower(c)); + } + else + strBuf.Append(c); + } + return strBuf.ToString(); + } + + public sealed class TreeBooster : BoosterParameter + { + public const string Name = "gbdt"; + public const string FriendlyName = "Tree Booster"; + + [TlcModule.Component(Name = Name, FriendlyName = FriendlyName, Desc = "Traditional Gradient Boosting Decision Tree.")] + public class Arguments : ISupportBoosterParameterFactory + { + [Argument(ArgumentType.AtMostOnce, HelpText = "Use for binary classification when classes are not balanced.", ShortName = "us")] + public bool UnbalancedSets = false; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, " + + "the more conservative the algorithm will be.")] + [TlcModule.Range(Min = 0.0)] + public double MinSplitGain = 0; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Maximum depth of a tree. 0 means no limit. However, tree still grows by best-first.")] + [TlcModule.Range(Min = 0, Max = int.MaxValue)] + public int MaxDepth = 0; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Minimum sum of instance weight(hessian) needed in a child. If the tree partition step results in a leaf " + + "node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, " + + "this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will be.")] + [TlcModule.Range(Min = 0.0)] + public double MinChildWeight = 0.1; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Subsample frequency. 0 means no subsample. " + + "If subsampleFreq > 0, it will use a subset(ratio=subsample) to train. And the subset will be updated on every Subsample iteratinos.")] + [TlcModule.Range(Min = 0, Max = int.MaxValue)] + public int SubsampleFreq = 0; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Subsample ratio of the training instance. Setting it to 0.5 means that LightGBM randomly collected " + + "half of the data instances to grow trees and this will prevent overfitting. Range: (0,1].")] + [TlcModule.Range(Inf = 0.0, Max = 1.0)] + public double Subsample = 1; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Subsample ratio of columns when constructing each tree. Range: (0,1].", + ShortName = "ff")] + [TlcModule.Range(Inf = 0.0, Max = 1.0)] + public double FeatureFraction = 1; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "L2 regularization term on weights, increasing this value will make model more conservative.", + ShortName = "l2")] + [TlcModule.Range(Min = 0.0)] + [TGUI(Label = "Lambda(L2)", SuggestedSweeps = "0,0.5,1")] + [TlcModule.SweepableDiscreteParam("RegLambda", new object[] { 0f, 0.5f, 1f })] + public double RegLambda = 0.01; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "L1 regularization term on weights, increase this value will make model more conservative.", + ShortName = "l1")] + [TlcModule.Range(Min = 0.0)] + [TGUI(Label = "Alpha(L1)", SuggestedSweeps = "0,0.5,1")] + [TlcModule.SweepableDiscreteParam("RegAlpha", new object[] { 0f, 0.5f, 1f })] + public double RegAlpha = 0; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Control the balance of positive and negative weights, useful for unbalanced classes." + + " A typical value to consider: sum(negative cases) / sum(positive cases).")] + public double ScalePosWeight = 1; + + public virtual IBoosterParameter CreateComponent(IHostEnvironment env) => new TreeBooster(this); + } + + public TreeBooster(Arguments args) + : base(args) + { + Contracts.CheckUserArg(Args.MinSplitGain >= 0, nameof(Args.MinSplitGain), "must be >= 0."); + Contracts.CheckUserArg(Args.MinChildWeight >= 0, nameof(Args.MinChildWeight), "must be >= 0."); + Contracts.CheckUserArg(Args.Subsample > 0 && Args.Subsample <= 1, nameof(Args.Subsample), "must be in (0,1]."); + Contracts.CheckUserArg(Args.FeatureFraction > 0 && Args.FeatureFraction <= 1, nameof(Args.FeatureFraction), "must be in (0,1]."); + Contracts.CheckUserArg(Args.ScalePosWeight > 0 && Args.ScalePosWeight <= 1, nameof(Args.ScalePosWeight), "must be in (0,1]."); + } + + public override void UpdateParameters(Dictionary res) + { + base.UpdateParameters(res); + res["boosting_type"] = Name; + } + } + + public class DartBooster : BoosterParameter + { + public const string Name = "dart"; + public const string FriendlyName = "Tree Dropout Tree Booster"; + + [TlcModule.Component(Name = Name, FriendlyName = FriendlyName, Desc = "Dropouts meet Multiple Additive Regresion Trees. See https://arxiv.org/abs/1505.01866")] + public class Arguments : TreeBooster.Arguments + { + [Argument(ArgumentType.AtMostOnce, HelpText = "Drop ratio for trees. Range:(0,1).")] + [TlcModule.Range(Inf = 0.0, Max = 1.0)] + public double DropRate = 0.1; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Max number of dropped tree in a boosting round.")] + [TlcModule.Range(Inf = 0, Max = int.MaxValue)] + public int MaxDrop = 1; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Probability for not perform dropping in a boosting round.")] + [TlcModule.Range(Inf = 0.0, Max = 1.0)] + public double SkipDrop = 0.5; + + [Argument(ArgumentType.AtMostOnce, HelpText = "True will enable xgboost dart mode.")] + public bool XgboostDartMode = false; + + [Argument(ArgumentType.AtMostOnce, HelpText = "True will enable uniform drop.")] + public bool UniformDrop = false; + + public override IBoosterParameter CreateComponent(IHostEnvironment env) => new DartBooster(this); + } + + public DartBooster(Arguments args) + : base(args) + { + Contracts.CheckUserArg(Args.DropRate > 0 && Args.DropRate < 1, nameof(Args.DropRate), "must be in (0,1)."); + Contracts.CheckUserArg(Args.MaxDrop > 0, nameof(Args.MaxDrop), "must be > 0."); + Contracts.CheckUserArg(Args.SkipDrop >= 0 && Args.SkipDrop < 1, nameof(Args.SkipDrop), "must be in [0,1)."); + } + + public override void UpdateParameters(Dictionary res) + { + base.UpdateParameters(res); + res["boosting_type"] = Name; + } + } + + public class GossBooster : BoosterParameter + { + public const string Name = "goss"; + public const string FriendlyName = "Gradient-based One-Size Sampling"; + + [TlcModule.Component(Name = Name, FriendlyName = FriendlyName, Desc = "Gradient-based One-Side Sampling.")] + public class Arguments : TreeBooster.Arguments + { + [Argument(ArgumentType.AtMostOnce, + HelpText = "Retain ratio for large gradient instances.")] + [TlcModule.Range(Inf = 0.0, Max = 1.0)] + public double TopRate = 0.2; + + [Argument(ArgumentType.AtMostOnce, + HelpText = + "Retain ratio for small gradient instances.")] + [TlcModule.Range(Inf = 0.0, Max = 1.0)] + public double OtherRate = 0.1; + + public override IBoosterParameter CreateComponent(IHostEnvironment env) => new GossBooster(this); + } + + public GossBooster(Arguments args) + : base(args) + { + Contracts.CheckUserArg(Args.TopRate > 0 && Args.TopRate < 1, nameof(Args.TopRate), "must be in (0,1)."); + Contracts.CheckUserArg(Args.OtherRate >= 0 && Args.OtherRate < 1, nameof(Args.TopRate), "must be in [0,1)."); + Contracts.Check(Args.TopRate + Args.OtherRate <= 1, "Sum of topRate and otherRate cannot be larger than 1."); + } + + public override void UpdateParameters(Dictionary res) + { + base.UpdateParameters(res); + res["boosting_type"] = Name; + } + } + + public enum EvalMetricType + { + DefaultMetric, + Rmse, + Mae, + Logloss, + Error, + Merror, + Mlogloss, + Auc, + Ndcg, + Map + }; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Number of iterations.", SortOrder = 1, ShortName = "iter")] + [TGUI(Label = "Number of boosting iterations", SuggestedSweeps = "10,20,50,100,150,200")] + [TlcModule.SweepableDiscreteParam("NumBoostRound", new object[] { 10, 20, 50, 100, 150, 200 })] + public int NumBoostRound = 100; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1].", + SortOrder = 2, ShortName = "lr", NullName = "")] + [TGUI(Label = "Learning Rate", SuggestedSweeps = "0.025-0.4;log")] + [TlcModule.SweepableFloatParamAttribute("LearningRate", 0.025f, 0.4f, isLogScale: true)] + public double? LearningRate; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Maximum leaves for trees.", + SortOrder = 2, ShortName = "nl", NullName = "")] + [TGUI(Description = "The maximum number of leaves per tree", SuggestedSweeps = "2-128;log;inc:4")] + [TlcModule.SweepableLongParamAttribute("NumLeaves", 2, 128, isLogScale: true, stepSize: 4)] + public int? NumLeaves; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Minimum number of instances needed in a child.", + SortOrder = 2, ShortName = "mil", NullName = "")] + [TGUI(Label = "Min Documents In Leaves", SuggestedSweeps = "1,10,20,50 ")] + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerLeaf", new object[] { 1, 10, 20, 50 })] + public int? MinDataPerLeaf; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Max number of bucket bin for features.", ShortName = "mb")] + public int MaxBin = 255; + + [Argument(ArgumentType.Multiple, HelpText = "Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function.", SortOrder = 3)] + public ISupportBoosterParameterFactory Booster = new TreeBooster.Arguments(); + + [Argument(ArgumentType.AtMostOnce, HelpText = "Verbose", ShortName = "v")] + public bool VerboseEval = false; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Printing running messages.")] + public bool Silent = true; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Number of parallel threads used to run LightGBM.", ShortName = "nt")] + public int? NThread; + + [Argument(ArgumentType.AtMostOnce, + HelpText = "Evaluation metrics.", + ShortName = "em")] + public EvalMetricType EvalMetric = EvalMetricType.DefaultMetric; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Use softmax loss for the multi classification.")] + [TlcModule.SweepableDiscreteParam("UseSoftmax", new object[] { true, false})] + public bool? UseSoftmax; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Rounds of early stopping, 0 will disable it.", + ShortName = "es")] + public int EarlyStoppingRound = 0; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Comma seperated list of gains associated to each relevance label.", ShortName = "gains")] + [TGUI(Label = "Ranking Label Gain")] + public string CustomGains = "0,3,7,15,31,63,127,255,511,1023,2047,4095"; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Number of entries in a batch when loading data.", Hide = true)] + public int BatchSize = 1 << 20; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Enable categorical split or not.", ShortName = "cat")] + [TlcModule.SweepableDiscreteParam("UseCat", new object[] { true, false })] + public bool? UseCat; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Enable missing value auto infer or not.")] + [TlcModule.SweepableDiscreteParam("UseMissing", new object[] { true, false })] + public bool UseMissing = false; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Min number of instances per categorical group.", ShortName = "mdpg")] + [TlcModule.Range(Inf = 0, Max = int.MaxValue)] + [TlcModule.SweepableDiscreteParam("MinDataPerGroup", new object[] { 10, 50, 100, 200 })] + public int MinDataPerGroup = 100; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Max number of categorical thresholds.", ShortName = "maxcat")] + [TlcModule.Range(Inf = 0, Max = int.MaxValue)] + [TlcModule.SweepableDiscreteParam("MaxCatThreshold", new object[] { 8, 16, 32, 64 })] + public int MaxCatThreshold = 32; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories.")] + [TlcModule.Range(Min = 0.0)] + [TlcModule.SweepableDiscreteParam("CatSmooth", new object[] { 1, 10, 20 })] + public double CatSmooth = 10; + + [Argument(ArgumentType.AtMostOnce, HelpText = "L2 Regularization for categorical split.")] + [TlcModule.Range(Min = 0.0)] + [TlcModule.SweepableDiscreteParam("CatL2", new object[] { 0.1, 0.5, 1, 5, 10 })] + public double CatL2 = 10; + + [Argument(ArgumentType.Multiple, HelpText = "Parallel LightGBM Learning Algorithm", ShortName = "parag")] + public ISupportParallel ParallelTrainer = new SingleTrainerFactory(); + + internal Dictionary ToDictionary(IHost host) + { + Contracts.CheckValue(host, nameof(host)); + Contracts.CheckUserArg(MaxBin > 0, nameof(MaxBin), "must be > 0."); + Dictionary res = new Dictionary(); + + var boosterParams = Booster.CreateComponent(host); + boosterParams.UpdateParameters(res); + + res[GetArgName(nameof(MaxBin))] = MaxBin.ToString(); + + res["verbose"] = Silent ? "-1" : "1"; + if (NThread.HasValue) + res["nthread"] = NThread.Value.ToString(); + + res["seed"] = host.Rand.Next().ToString(); + + string metric = null; + switch (EvalMetric) + { + case EvalMetricType.DefaultMetric: + break; + case EvalMetricType.Mae: + metric = "l1"; + break; + case EvalMetricType.Logloss: + metric = "binary_logloss"; + break; + case EvalMetricType.Error: + metric = "binary_error"; + break; + case EvalMetricType.Merror: + metric = "multi_error"; + break; + case EvalMetricType.Mlogloss: + metric = "multi_logloss"; + break; + case EvalMetricType.Rmse: + case EvalMetricType.Auc: + case EvalMetricType.Ndcg: + case EvalMetricType.Map: + metric = EvalMetric.ToString().ToLower(); + break; + } + if (!string.IsNullOrEmpty(metric)) + res["metric"] = metric; + res["sigmoid"] = "0.5"; + res["label_gain"] = CustomGains; + res[GetArgName(nameof(UseMissing))] = UseMissing.ToString(); + res[GetArgName(nameof(MinDataPerGroup))] = MinDataPerGroup.ToString(); + res[GetArgName(nameof(MaxCatThreshold))] = MaxCatThreshold.ToString(); + res[GetArgName(nameof(CatSmooth))] = CatSmooth.ToString(); + res[GetArgName(nameof(CatL2))] = CatL2.ToString(); + return res; + } + } +} diff --git a/src/Microsoft.ML.LightGBM/LightGbmBinaryTrainer.cs b/src/Microsoft.ML.LightGBM/LightGbmBinaryTrainer.cs new file mode 100644 index 0000000000..f788b4feab --- /dev/null +++ b/src/Microsoft.ML.LightGBM/LightGbmBinaryTrainer.cs @@ -0,0 +1,151 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.FastTree; +using Microsoft.ML.Runtime.Internal.Calibration; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.LightGBM; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(LightGbmBinaryTrainer.Summary, typeof(LightGbmBinaryTrainer), typeof(LightGbmArguments), + new[] { typeof(SignatureBinaryClassifierTrainer), typeof(SignatureTrainer), typeof(SignatureTreeEnsembleTrainer) }, + LightGbmBinaryTrainer.UserName, LightGbmBinaryTrainer.LoadNameValue, LightGbmBinaryTrainer.ShortName, DocName = "trainer/LightGBM.md")] + +[assembly: LoadableClass(typeof(IPredictorProducing), typeof(LightGbmBinaryPredictor), null, typeof(SignatureLoadModel), + "LightGBM Binary Executor", + LightGbmBinaryPredictor.LoaderSignature)] + +[assembly: LoadableClass(typeof(void), typeof(LightGbm), null, typeof(SignatureEntryPointModule), "LightGBM")] + +namespace Microsoft.ML.Runtime.LightGBM +{ + public sealed class LightGbmBinaryPredictor : FastTreePredictionWrapper + { + public const string LoaderSignature = "LightGBMBinaryExec"; + public const string RegistrationName = "LightGBMBinaryPredictor"; + + private static VersionInfo GetVersionInfo() + { + // REVIEW: can we decouple the version from FastTree predictor version ? + return new VersionInfo( + modelSignature: "LGBBINCL", + // verWrittenCur: 0x00010001, // Initial + // verWrittenCur: 0x00010002, // _numFeatures serialized + // verWrittenCur: 0x00010003, // Ini content out of predictor + //verWrittenCur: 0x00010004, // Add _defaultValueForMissing + verWrittenCur: 0x00010005, // Categorical splits. + verReadableCur: 0x00010004, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + protected override uint VerNumFeaturesSerialized => 0x00010002; + protected override uint VerDefaultValueSerialized => 0x00010004; + protected override uint VerCategoricalSplitSerialized => 0x00010005; + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + + internal LightGbmBinaryPredictor(IHostEnvironment env, FastTree.Internal.Ensemble trainedEnsemble, int featureCount, string innerArgs) + : base(env, RegistrationName, trainedEnsemble, featureCount, innerArgs) + { + } + + private LightGbmBinaryPredictor(IHostEnvironment env, ModelLoadContext ctx) + : base(env, RegistrationName, ctx, GetVersionInfo()) + { + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public static IPredictorProducing Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + var predictor = new LightGbmBinaryPredictor(env, ctx); + ICalibrator calibrator; + ctx.LoadModelOrNull(env, out calibrator, @"Calibrator"); + if (calibrator == null) + return predictor; + return new CalibratedPredictor(env, predictor, calibrator); + } + } + + /// + public sealed class LightGbmBinaryTrainer : LightGbmTrainerBase> + { + internal const string UserName = "LightGBM Binary Classifier"; + internal const string LoadNameValue = "LightGBMBinary"; + internal const string ShortName = "LightGBM"; + internal const string Summary = "Train a LightGBM binary classification model."; + + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + + public LightGbmBinaryTrainer(IHostEnvironment env, LightGbmArguments args) + : base(env, args, LoadNameValue) + { + } + + private protected override IPredictorWithFeatureWeights CreatePredictor() + { + Host.Check(TrainedEnsemble != null, "The predictor cannot be created before training is complete"); + var innerArgs = LightGbmInterfaceUtils.JoinParameters(Options); + var pred = new LightGbmBinaryPredictor(Host, TrainedEnsemble, FeatureCount, innerArgs); + var cali = new PlattCalibrator(Host, -0.5, 0); + return new FeatureWeightsCalibratedPredictor(Host, pred, cali); + } + + protected override void CheckDataValid(IChannel ch, RoleMappedData data) + { + Host.AssertValue(ch); + base.CheckDataValid(ch, data); + var labelType = data.Schema.Label.Type; + if (!(labelType.IsBool || labelType.IsKey || labelType == NumberType.R4)) + { + throw ch.ExceptParam(nameof(data), + $"Label column '{data.Schema.Label.Name}' is of type '{labelType}', but must be key, boolean or R4."); + } + } + + protected override void CheckAndUpdateParametersBeforeTraining(IChannel ch, RoleMappedData data, float[] labels, int[] groups) + { + Options["objective"] = "binary"; + // Add default metric. + if (!Options.ContainsKey("metric")) + Options["metric"] = "binary_logloss"; + } + } + + /// + /// A component to train a LightGBM model. + /// + public static partial class LightGbm + { + [TlcModule.EntryPoint( + Name = "Trainers.LightGbmBinaryClassifier", + Desc = LightGbmBinaryTrainer.Summary, + UserName = LightGbmBinaryTrainer.UserName, + ShortName = LightGbmBinaryTrainer.ShortName, + XmlInclude = new[] { @"", + @""})] + public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironment env, LightGbmArguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("TrainLightGBM"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + return LearnerEntryPointsUtils.Train(host, input, + () => new LightGbmBinaryTrainer(host, input), + getLabel: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn), + getWeight: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.WeightColumn)); + } + } +} diff --git a/src/Microsoft.ML.LightGBM/LightGbmMulticlassTrainer.cs b/src/Microsoft.ML.LightGBM/LightGbmMulticlassTrainer.cs new file mode 100644 index 0000000000..ff44139877 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/LightGbmMulticlassTrainer.cs @@ -0,0 +1,204 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Globalization; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Calibration; +using Microsoft.ML.Runtime.Learners; +using Microsoft.ML.Runtime.LightGBM; + +[assembly: LoadableClass(LightGbmMulticlassTrainer.Summary, typeof(LightGbmMulticlassTrainer), typeof(LightGbmArguments), + new[] { typeof(SignatureMultiClassClassifierTrainer), typeof(SignatureTrainer) }, + "LightGBM Multi-class Classifier", LightGbmMulticlassTrainer.LoadNameValue, LightGbmMulticlassTrainer.ShortName, DocName = "trainer/LightGBM.md")] + +namespace Microsoft.ML.Runtime.LightGBM +{ + + /// + public sealed class LightGbmMulticlassTrainer : LightGbmTrainerBase, OvaPredictor> + { + public const string Summary = "LightGBM Multi Class Classifier"; + public const string LoadNameValue = "LightGBMMulticlass"; + public const string ShortName = "LightGBMMC"; + private const int _minDataToUseSoftmax = 50000; + + private const double _maxNumClass = 1e6; + private int _numClass; + private int _tlcNumClass; + public override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; + + public LightGbmMulticlassTrainer(IHostEnvironment env, LightGbmArguments args) + : base(env, args, LoadNameValue) + { + _numClass = -1; + } + + private FastTree.Internal.Ensemble GetBinaryEnsemble(int classID) + { + FastTree.Internal.Ensemble res = new FastTree.Internal.Ensemble(); + for (int i = classID; i < TrainedEnsemble.NumTrees; i += _numClass) + { + // Ignore dummy trees. + if (TrainedEnsemble.GetTreeAt(i).NumLeaves > 1) + res.AddTree(TrainedEnsemble.GetTreeAt(i)); + } + return res; + } + + private LightGbmBinaryPredictor CreateBinaryPredictor(int classID, string innerArgs) + { + return new LightGbmBinaryPredictor(Host, GetBinaryEnsemble(classID), FeatureCount, innerArgs); + } + + private protected override OvaPredictor CreatePredictor() + { + Host.Check(TrainedEnsemble != null, "The predictor cannot be created before training is complete."); + + Host.Assert(_numClass > 1, "Must know the number of classes before creating a predictor."); + Host.Assert(TrainedEnsemble.NumTrees % _numClass == 0, "Number of trees should be a multiple of number of classes."); + + var innerArgs = LightGbmInterfaceUtils.JoinParameters(Options); + IPredictorProducing[] predictors = new IPredictorProducing[_tlcNumClass]; + for (int i = 0; i < _tlcNumClass; ++i) + { + var pred = CreateBinaryPredictor(i, innerArgs); + var cali = new PlattCalibrator(Host, -0.5, 0); + predictors[i] = new FeatureWeightsCalibratedPredictor(Host, pred, cali); + } + return OvaPredictor.Create(Host, predictors); + } + + protected override void CheckDataValid(IChannel ch, RoleMappedData data) + { + Host.AssertValue(ch); + base.CheckDataValid(ch, data); + var labelType = data.Schema.Label.Type; + if (!(labelType.IsBool || labelType.IsKey || labelType == NumberType.R4)) + { + throw ch.ExceptParam(nameof(data), + $"Label column '{data.Schema.Label.Name}' is of type '{labelType}', but must be key, boolean or R4."); + } + } + + protected override void ConvertNaNLabels(IChannel ch, RoleMappedData data, float[] labels) + { + // Only initialize one time. + if (_numClass < 0) + { + float minLabel = float.MaxValue; + float maxLabel = float.MinValue; + bool hasNaNLabel = false; + foreach (var label in labels) + { + if (float.IsNaN(label)) + hasNaNLabel = true; + else + { + minLabel = Math.Min(minLabel, label); + maxLabel = Math.Max(maxLabel, label); + } + } + ch.CheckParam(minLabel >= 0, nameof(data), "min label cannot be negative"); + if (maxLabel >= _maxNumClass) + throw ch.ExceptParam(nameof(data), $"max label cannot exceed {_maxNumClass}"); + + if (data.Schema.Label.Type.IsKey) + { + ch.Check(data.Schema.Label.Type.AsKey.Contiguous, "label value should be contiguous"); + if (hasNaNLabel) + _numClass = data.Schema.Label.Type.AsKey.Count + 1; + else + _numClass = data.Schema.Label.Type.AsKey.Count; + _tlcNumClass = data.Schema.Label.Type.AsKey.Count; + } + else + { + if (hasNaNLabel) + _numClass = (int)maxLabel + 2; + else + _numClass = (int)maxLabel + 1; + _tlcNumClass = (int)maxLabel + 1; + } + } + float defaultLabel = _numClass - 1; + for (int i = 0; i < labels.Length; ++i) + if (float.IsNaN(labels[i])) + labels[i] = defaultLabel; + } + + protected override void GetDefaultParameters(IChannel ch, int numRow, bool hasCategorical, int totalCats, bool hiddenMsg=false) + { + base.GetDefaultParameters(ch, numRow, hasCategorical, totalCats, true); + int numLeaves = (int)Options["num_leaves"]; + int minDataPerLeaf = Args.MinDataPerLeaf ?? DefaultMinDataPerLeaf(numRow, numLeaves, _numClass); + Options["min_data_per_leaf"] = minDataPerLeaf; + if (!hiddenMsg) + { + if (!Args.LearningRate.HasValue) + ch.Info("Auto-tuning parameters: " + nameof(Args.LearningRate) + " = " + Options["learning_rate"]); + if (!Args.NumLeaves.HasValue) + ch.Info("Auto-tuning parameters: " + nameof(Args.NumLeaves) + " = " + numLeaves); + if (!Args.MinDataPerLeaf.HasValue) + ch.Info("Auto-tuning parameters: " + nameof(Args.MinDataPerLeaf) + " = " + minDataPerLeaf); + } + } + + protected override void CheckAndUpdateParametersBeforeTraining(IChannel ch, RoleMappedData data, float[] labels, int[] groups) + { + Host.AssertValue(ch); + ch.Assert(PredictionKind == PredictionKind.MultiClassClassification); + ch.Assert(_numClass > 1); + Options["num_class"] = _numClass; + bool useSoftmax = false; + + if (Args.UseSoftmax.HasValue) + useSoftmax = Args.UseSoftmax.Value; + else + { + if (labels.Length >= _minDataToUseSoftmax) + useSoftmax = true; + + ch.Info("Auto-tuning parameters: " + nameof(Args.UseSoftmax) + " = " + useSoftmax); + } + + if (useSoftmax) + Options["objective"] = "multiclass"; + else + Options["objective"] = "multiclassova"; + + // Add default metric. + if (!Options.ContainsKey("metric")) + Options["metric"] = "multi_error"; + } + } + + /// + /// A component to train a LightGBM model. + /// + public static partial class LightGbm + { + [TlcModule.EntryPoint( + Name = "Trainers.LightGbmClassifier", + Desc = "Train a LightGBM multi class model.", + UserName = LightGbmMulticlassTrainer.Summary, + ShortName = LightGbmMulticlassTrainer.ShortName, + XmlInclude = new[] { @"", + @""})] + public static CommonOutputs.MulticlassClassificationOutput TrainMultiClass(IHostEnvironment env, LightGbmArguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("TrainLightGBM"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + return LearnerEntryPointsUtils.Train(host, input, + () => new LightGbmMulticlassTrainer(host, input), + getLabel: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn), + getWeight: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.WeightColumn)); + } + } +} diff --git a/src/Microsoft.ML.LightGBM/LightGbmRankingTrainer.cs b/src/Microsoft.ML.LightGBM/LightGbmRankingTrainer.cs new file mode 100644 index 0000000000..3fe4628182 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/LightGbmRankingTrainer.cs @@ -0,0 +1,150 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.FastTree; +using Microsoft.ML.Runtime.FastTree.Internal; +using Microsoft.ML.Runtime.LightGBM; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(LightGbmRankingTrainer.UserName, typeof(LightGbmRankingTrainer), typeof(LightGbmArguments), + new[] { typeof(SignatureRankerTrainer), typeof(SignatureTrainer), typeof(SignatureTreeEnsembleTrainer) }, + "LightGBM Ranking", LightGbmRankingTrainer.LoadNameValue, LightGbmRankingTrainer.ShortName, DocName = "trainer/LightGBM.md")] + +[assembly: LoadableClass(typeof(LightGbmRankingPredictor), null, typeof(SignatureLoadModel), + "LightGBM Ranking Executor", + LightGbmRankingPredictor.LoaderSignature)] + +namespace Microsoft.ML.Runtime.LightGBM +{ + + public sealed class LightGbmRankingPredictor : FastTreePredictionWrapper + { + public const string LoaderSignature = "LightGBMRankerExec"; + public const string RegistrationName = "LightGBMRankingPredictor"; + + private static VersionInfo GetVersionInfo() + { + // REVIEW tfinley(guoke): can we decouple the version from FastTree predictor version ? + return new VersionInfo( + modelSignature: "LGBMRANK", + // verWrittenCur: 0x00010001, // Initial + // verWrittenCur: 0x00010002, // _numFeatures serialized + // verWrittenCur: 0x00010003, // Ini content out of predictor + // verWrittenCur: 0x00010004, // Add _defaultValueForMissing + verWrittenCur: 0x00010005, // Categorical splits. + verReadableCur: 0x00010004, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + protected override uint VerNumFeaturesSerialized => 0x00010002; + protected override uint VerDefaultValueSerialized => 0x00010004; + protected override uint VerCategoricalSplitSerialized => 0x00010005; + public override PredictionKind PredictionKind => PredictionKind.Ranking; + + internal LightGbmRankingPredictor(IHostEnvironment env, FastTree.Internal.Ensemble trainedEnsemble, int featureCount, string innerArgs) + : base(env, RegistrationName, trainedEnsemble, featureCount, innerArgs) + { + } + + private LightGbmRankingPredictor(IHostEnvironment env, ModelLoadContext ctx) + : base(env, RegistrationName, ctx, GetVersionInfo()) + { + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public static LightGbmRankingPredictor Create(IHostEnvironment env, ModelLoadContext ctx) + { + return new LightGbmRankingPredictor(env, ctx); + } + } + + /// + public sealed class LightGbmRankingTrainer : LightGbmTrainerBase + { + public const string UserName = "LightGBM Ranking"; + public const string LoadNameValue = "LightGBMRanking"; + public const string ShortName = "LightGBMRank"; + + public override PredictionKind PredictionKind => PredictionKind.Ranking; + + public LightGbmRankingTrainer(IHostEnvironment env, LightGbmArguments args) + : base(env, args, LoadNameValue) + { + } + + protected override void CheckDataValid(IChannel ch, RoleMappedData data) + { + Host.AssertValue(ch); + base.CheckDataValid(ch, data); + // Check label types. + var labelType = data.Schema.Label.Type; + if (!(labelType.IsKey || labelType == NumberType.R4)) + { + throw ch.ExceptParam(nameof(data), + $"Label column '{data.Schema.Label.Name}' is of type '{labelType}', but must be key or R4."); + } + // Check group types. + var groupType = data.Schema.Group.Type; + if (!(groupType == NumberType.U4 || groupType.IsKey)) + { + throw ch.ExceptParam(nameof(data), + $"Group column '{data.Schema.Group.Name}' is of type '{groupType}', but must be U4 or a Key."); + } + } + + private protected override LightGbmRankingPredictor CreatePredictor() + { + Host.Check(TrainedEnsemble != null, "The predictor cannot be created before training is complete"); + var innerArgs = LightGbmInterfaceUtils.JoinParameters(Options); + return new LightGbmRankingPredictor(Host, TrainedEnsemble, FeatureCount, innerArgs); + } + + protected override void CheckAndUpdateParametersBeforeTraining(IChannel ch, RoleMappedData data, float[] labels, int[] groups) + { + Host.AssertValue(ch); + Options["objective"] = "lambdarank"; + ch.CheckValue(groups, nameof(groups)); + // Add default metric. + if (!Options.ContainsKey("metric")) + Options["metric"] = "ndcg"; + // Only output one ndcg score. + Options["eval_at"] = "5"; + } + } + + /// + /// The entry point for the LightGbmRankingTrainer. + /// + public static partial class LightGbm + { + [TlcModule.EntryPoint(Name = "Trainers.LightGbmRanker", + Desc = "Train a LightGBM ranking model.", + UserName = LightGbmRankingTrainer.UserName, + ShortName = LightGbmRankingTrainer.ShortName, + XmlInclude = new[] { @"", + @""})] + public static CommonOutputs.RankingOutput TrainRanking(IHostEnvironment env, LightGbmArguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("TrainLightGBM"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + return LearnerEntryPointsUtils.Train(host, input, + () => new LightGbmRankingTrainer(host, input), + getLabel: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn), + getWeight: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.WeightColumn), + getGroup: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.GroupIdColumn)); + } + } +} diff --git a/src/Microsoft.ML.LightGBM/LightGbmRegressionTrainer.cs b/src/Microsoft.ML.LightGBM/LightGbmRegressionTrainer.cs new file mode 100644 index 0000000000..0011a8d8e6 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/LightGbmRegressionTrainer.cs @@ -0,0 +1,141 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.FastTree; +using Microsoft.ML.Runtime.FastTree.Internal; +using Microsoft.ML.Runtime.LightGBM; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(LightGbmRegressorTrainer.Summary, typeof(LightGbmRegressorTrainer), typeof(LightGbmArguments), + new[] { typeof(SignatureRegressorTrainer), typeof(SignatureTrainer), typeof(SignatureTreeEnsembleTrainer) }, + LightGbmRegressorTrainer.UserNameValue, LightGbmRegressorTrainer.LoadNameValue, LightGbmRegressorTrainer.ShortName, DocName = "trainer/LightGBM.md")] + +[assembly: LoadableClass(typeof(LightGbmRegressionPredictor), null, typeof(SignatureLoadModel), + "LightGBM Regression Executor", + LightGbmRegressionPredictor.LoaderSignature)] + +namespace Microsoft.ML.Runtime.LightGBM +{ + /// + public sealed class LightGbmRegressionPredictor : FastTreePredictionWrapper + { + public const string LoaderSignature = "LightGBMRegressionExec"; + public const string RegistrationName = "LightGBMRegressionPredictor"; + + private static VersionInfo GetVersionInfo() + { + // REVIEW tfinley(guoke): can we decouple the version from FastTree predictor version ? + return new VersionInfo( + modelSignature: "LGBSIREG", + // verWrittenCur: 0x00010001, // Initial + // verWrittenCur: 0x00010002, // _numFeatures serialized + // verWrittenCur: 0x00010003, // Ini content out of predictor + // verWrittenCur: 0x00010004, // Add _defaultValueForMissing + verWrittenCur: 0x00010005, // Categorical splits. + verReadableCur: 0x00010004, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + protected override uint VerNumFeaturesSerialized => 0x00010002; + protected override uint VerDefaultValueSerialized => 0x00010004; + protected override uint VerCategoricalSplitSerialized => 0x00010005; + public override PredictionKind PredictionKind => PredictionKind.Regression; + + internal LightGbmRegressionPredictor(IHostEnvironment env, FastTree.Internal.Ensemble trainedEnsemble, int featureCount, string innerArgs) + : base(env, RegistrationName, trainedEnsemble, featureCount, innerArgs) + { + } + + private LightGbmRegressionPredictor(IHostEnvironment env, ModelLoadContext ctx) + : base(env, RegistrationName, ctx, GetVersionInfo()) + { + } + + protected override void SaveCore(ModelSaveContext ctx) + { + base.SaveCore(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + } + + public static LightGbmRegressionPredictor Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new LightGbmRegressionPredictor(env, ctx); + } + } + + public sealed class LightGbmRegressorTrainer : LightGbmTrainerBase + { + public const string Summary = "LightGBM Regression"; + public const string LoadNameValue = "LightGBMRegression"; + public const string ShortName = "LightGBMR"; + public const string UserNameValue = "LightGBM Regressor"; + + public override PredictionKind PredictionKind => PredictionKind.Regression; + + public LightGbmRegressorTrainer(IHostEnvironment env, LightGbmArguments args) + : base(env, args, LoadNameValue) + { + } + + private protected override LightGbmRegressionPredictor CreatePredictor() + { + Host.Check(TrainedEnsemble != null, + "The predictor cannot be created before training is complete"); + var innerArgs = LightGbmInterfaceUtils.JoinParameters(Options); + return new LightGbmRegressionPredictor(Host, TrainedEnsemble, FeatureCount, innerArgs); + } + + protected override void CheckDataValid(IChannel ch, RoleMappedData data) + { + Host.AssertValue(ch); + base.CheckDataValid(ch, data); + var labelType = data.Schema.Label.Type; + if (!(labelType.IsBool || labelType.IsKey || labelType == NumberType.R4)) + { + throw ch.ExceptParam(nameof(data), + $"Label column '{data.Schema.Label.Name}' is of type '{labelType}', but must be key, boolean or R4."); + } + } + + protected override void CheckAndUpdateParametersBeforeTraining(IChannel ch, RoleMappedData data, float[] labels, int[] groups) + { + Options["objective"] = "regression"; + // Add default metric. + if (!Options.ContainsKey("metric")) + Options["metric"] = "l2"; + } + } + + /// + /// A component to train a LightGBM model. + /// + public static partial class LightGbm + { + [TlcModule.EntryPoint(Name = "Trainers.LightGbmRegressor", + Desc = LightGbmRegressorTrainer.Summary, + UserName = LightGbmRegressorTrainer.UserNameValue, + ShortName = LightGbmRegressorTrainer.ShortName, + XmlInclude = new[] { @"", + @""})] + public static CommonOutputs.RegressionOutput TrainRegression(IHostEnvironment env, LightGbmArguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("TrainLightGBM"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + + return LearnerEntryPointsUtils.Train(host, input, + () => new LightGbmRegressorTrainer(host, input), + getLabel: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn), + getWeight: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.WeightColumn)); + } + } +} diff --git a/src/Microsoft.ML.LightGBM/LightGbmTrainerBase.cs b/src/Microsoft.ML.LightGBM/LightGbmTrainerBase.cs new file mode 100644 index 0000000000..eae632eb24 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/LightGbmTrainerBase.cs @@ -0,0 +1,860 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Training; + +namespace Microsoft.ML.Runtime.LightGBM +{ + /// + /// Lock for LightGBM trainer. + /// + internal static class LightGbmShared + { + // Lock for the operations that are multi-threading inside in LightGBM DLL. + public static readonly object LockForMultiThreadingInside = new object(); + // Lock for the sampling stage, this can reduce the peak memory usage. + public static readonly object SampleLock = new object(); + } + + /// + /// Base class for all training with LightGBM. + /// + public abstract class LightGbmTrainerBase : TrainerBase + where TPredictor : IPredictorProducing + { + private sealed class CategoricalMetaData + { + public int NumCol; + public int TotalCats; + public int[] CategoricalBoudaries; + public int[] OnehotIndices; + public int[] OnehotBias; + public bool[] IsCategoricalFeature; + } + + private protected readonly LightGbmArguments Args; + + /// + /// Stores argumments as objects to convert them to invariant string type in the end so that + /// the code is culture agnostic. When retrieving key value from this dictionary as string + /// please convert to string invariant by string.Format(CultureInfo.InvariantCulture, "{0}", Option[key]). + /// + private protected readonly Dictionary Options; + private protected readonly IParallel ParallelTraining; + + // Store _featureCount and _trainedEnsemble to construct predictor. + private protected int FeatureCount; + private protected FastTree.Internal.Ensemble TrainedEnsemble; + + private static readonly TrainerInfo _info = new TrainerInfo(normalization: false, caching: false, supportValid: true); + public override TrainerInfo Info => _info; + + private protected LightGbmTrainerBase(IHostEnvironment env, LightGbmArguments args, string name) + : base(env, name) + { + Host.CheckValue(args, nameof(args)); + + Args = args; + Options = Args.ToDictionary(Host); + ParallelTraining = Args.ParallelTrainer != null ? Args.ParallelTrainer.CreateComponent(env) : new SingleTrainer(); + InitParallelTraining(); + } + + public override TPredictor Train(TrainContext context) + { + Host.CheckValue(context, nameof(context)); + + Dataset dtrain = null; + Dataset dvalid = null; + CategoricalMetaData catMetaData; + try + { + using (var ch = Host.Start("Loading data for LightGBM")) + { + using (var pch = Host.StartProgressChannel("Loading data for LightGBM")) + { + dtrain = LoadTrainingData(ch, context.TrainingSet, out catMetaData); + if (context.ValidationSet != null) + dvalid = LoadValidationData(ch, dtrain, context.ValidationSet, catMetaData); + } + ch.Done(); + } + using (var ch = Host.Start("Training with LightGBM")) + { + using (var pch = Host.StartProgressChannel("Training with LightGBM")) + TrainCore(ch, pch, dtrain, catMetaData, dvalid); + ch.Done(); + } + } + finally + { + dtrain?.Dispose(); + dvalid?.Dispose(); + DisposeParallelTraining(); + } + return CreatePredictor(); + } + + private void InitParallelTraining() + { + if (ParallelTraining.ParallelType() != "serial" && ParallelTraining.NumMachines() > 1) + { + Options["tree_learner"] = ParallelTraining.ParallelType(); + var otherParams = ParallelTraining.AdditionalParams(); + if (otherParams != null) + { + foreach (var pair in otherParams) + Options[pair.Key] = pair.Value; + } + + Contracts.CheckValue(ParallelTraining.GetReduceScatterFunction(), nameof(ParallelTraining.GetReduceScatterFunction)); + Contracts.CheckValue(ParallelTraining.GetAllgatherFunction(), nameof(ParallelTraining.GetAllgatherFunction)); + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.NetworkInitWithFunctions( + ParallelTraining.NumMachines(), + ParallelTraining.Rank(), + ParallelTraining.GetReduceScatterFunction(), + ParallelTraining.GetAllgatherFunction() + )); + } + } + + private void DisposeParallelTraining() + { + if (ParallelTraining.NumMachines() > 1) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.NetworkFree()); + } + + protected virtual void CheckDataValid(IChannel ch, RoleMappedData data) + { + data.CheckFeatureFloatVector(); + ch.CheckParam(data.Schema.Label != null, nameof(data), "Need a label column"); + } + + protected virtual void GetDefaultParameters(IChannel ch, int numRow, bool hasCategarical, int totalCats, bool hiddenMsg=false) + { + double learningRate = Args.LearningRate ?? DefaultLearningRate(numRow, hasCategarical, totalCats); + int numLeaves = Args.NumLeaves ?? DefaultNumLeaves(numRow, hasCategarical, totalCats); + int minDataPerLeaf = Args.MinDataPerLeaf ?? DefaultMinDataPerLeaf(numRow, numLeaves, 1); + Options["learning_rate"] = learningRate; + Options["num_leaves"] = numLeaves; + Options["min_data_per_leaf"] = minDataPerLeaf; + if (!hiddenMsg) + { + if (!Args.LearningRate.HasValue) + ch.Info("Auto-tuning parameters: " + nameof(Args.LearningRate) + " = " + learningRate); + if (!Args.NumLeaves.HasValue) + ch.Info("Auto-tuning parameters: " + nameof(Args.NumLeaves) + " = " + numLeaves); + if (!Args.MinDataPerLeaf.HasValue) + ch.Info("Auto-tuning parameters: " + nameof(Args.MinDataPerLeaf) + " = " + minDataPerLeaf); + } + } + + private FloatLabelCursor.Factory CreateCursorFactory(RoleMappedData data) + { + var loadFlags = CursOpt.AllLabels | CursOpt.AllWeights | CursOpt.Features; + if (PredictionKind == PredictionKind.Ranking) + loadFlags |= CursOpt.Group; + + var factory = new FloatLabelCursor.Factory(data, loadFlags); + return factory; + } + + private static List GetCategoricalBoundires(int[] categoricalFeatures, int rawNumCol) + { + List catBoundaries = new List { 0 }; + int curFidx = 0; + int j = 0; + while (curFidx < rawNumCol) + { + if (j < categoricalFeatures.Length && curFidx == categoricalFeatures[j]) + { + if (curFidx > catBoundaries[catBoundaries.Count - 1]) + catBoundaries.Add(curFidx); + if (categoricalFeatures[j + 1] - categoricalFeatures[j] >= 0) + { + curFidx = categoricalFeatures[j + 1] + 1; + catBoundaries.Add(curFidx); + } + else + { + for (int i = curFidx + 1; i <= categoricalFeatures[j + 1] + 1; ++i) + catBoundaries.Add(i); + curFidx = categoricalFeatures[j + 1] + 1; + } + j += 2; + } + else + { + catBoundaries.Add(curFidx + 1); + ++curFidx; + } + } + return catBoundaries; + } + + private static List ConstructCategoricalFeatureMetaData(int[] categoricalFeatures, int rawNumCol, ref CategoricalMetaData catMetaData) + { + List catBoundaries = GetCategoricalBoundires(categoricalFeatures, rawNumCol); + catMetaData.NumCol = catBoundaries.Count - 1; + catMetaData.CategoricalBoudaries = catBoundaries.ToArray(); + catMetaData.IsCategoricalFeature = new bool[catMetaData.NumCol]; + catMetaData.OnehotIndices = new int[rawNumCol]; + catMetaData.OnehotBias = new int[rawNumCol]; + List catIndices = new List(); + int j = 0; + for (int i = 0; i < catMetaData.NumCol; ++i) + { + var numCat = catMetaData.CategoricalBoudaries[i + 1] - catMetaData.CategoricalBoudaries[i]; + if (numCat > 1) + { + catMetaData.TotalCats += numCat; + catMetaData.IsCategoricalFeature[i] = true; + catIndices.Add(i.ToString()); + for (int k = catMetaData.CategoricalBoudaries[i]; k < catMetaData.CategoricalBoudaries[i + 1]; ++k) + { + catMetaData.OnehotIndices[j] = i; + catMetaData.OnehotBias[j] = k - catMetaData.CategoricalBoudaries[i]; + ++j; + } + } + else + { + catMetaData.IsCategoricalFeature[i] = false; + catMetaData.OnehotIndices[j] = i; + catMetaData.OnehotBias[j] = 0; + ++j; + } + } + return catIndices; + } + + private CategoricalMetaData GetCategoricalMetaData(IChannel ch, RoleMappedData trainData, int numRow) + { + CategoricalMetaData catMetaData = new CategoricalMetaData(); + int[] categoricalFeatures = null; + const int useCatThreshold = 50000; + // Disable cat when data is too small, reduce the overfitting. + bool useCat = Args.UseCat ?? numRow > useCatThreshold; + if (!Args.UseCat.HasValue) + ch.Info("Auto-tuning parameters: " + nameof(Args.UseCat) + " = " + useCat); + if (useCat) + { + trainData.Schema.Schema.TryGetColumnIndex(DefaultColumnNames.Features, out int featureIndex); + MetadataUtils.TryGetCategoricalFeatureIndices(trainData.Schema.Schema, featureIndex, out categoricalFeatures); + } + var colType = trainData.Schema.Feature.Type; + int rawNumCol = colType.VectorSize; + FeatureCount = rawNumCol; + catMetaData.TotalCats = 0; + if (categoricalFeatures == null) + { + catMetaData.CategoricalBoudaries = null; + catMetaData.NumCol = rawNumCol; + } + else + { + var catIndices = ConstructCategoricalFeatureMetaData(categoricalFeatures, rawNumCol, ref catMetaData); + // Set categorical features + Options["categorical_feature"] = string.Join(",", catIndices); + } + return catMetaData; + } + + private Dataset LoadTrainingData(IChannel ch, RoleMappedData trainData, out CategoricalMetaData catMetaData) + { + // Verifications. + Host.AssertValue(ch); + ch.CheckValue(trainData, nameof(trainData)); + + CheckDataValid(ch, trainData); + + // Load metadata first. + var factory = CreateCursorFactory(trainData); + GetMetainfo(ch, factory, out int numRow, out float[] labels, out float[] weights, out int[] groups); + catMetaData = GetCategoricalMetaData(ch, trainData, numRow); + GetDefaultParameters(ch, numRow, catMetaData.CategoricalBoudaries != null, catMetaData.TotalCats); + + Dataset dtrain; + string param = LightGbmInterfaceUtils.JoinParameters(Options); + + // To reduce peak memory usage, only enable one sampling task at any given time. + lock (LightGbmShared.SampleLock) + { + CreateDatasetFromSamplingData(ch, factory, numRow, + param, labels, weights, groups, catMetaData, out dtrain); + } + + // Push rows into dataset. + LoadDataset(ch, factory, dtrain, numRow, Args.BatchSize, catMetaData); + + // Some checks. + CheckAndUpdateParametersBeforeTraining(ch, trainData, labels, groups); + return dtrain; + } + + private Dataset LoadValidationData(IChannel ch, Dataset dtrain, RoleMappedData validData, CategoricalMetaData catMetaData) + { + // Verifications. + Host.AssertValue(ch); + + ch.CheckValue(validData, nameof(validData)); + + CheckDataValid(ch, validData); + + // Load meta info first. + var factory = CreateCursorFactory(validData); + GetMetainfo(ch, factory, out int numRow, out float[] labels, out float[] weights, out int[] groups); + + // Construct validation dataset. + Dataset dvalid = new Dataset(dtrain, numRow, labels, weights, groups); + + // Push rows into dataset. + LoadDataset(ch, factory, dvalid, numRow, Args.BatchSize, catMetaData); + + return dvalid; + } + + private void TrainCore(IChannel ch, IProgressChannel pch, Dataset dtrain, CategoricalMetaData catMetaData, Dataset dvalid = null) + { + Host.AssertValue(ch); + Host.AssertValue(pch); + Host.AssertValue(dtrain); + Host.AssertValueOrNull(dvalid); + // For multi class, the number of labels is required. + ch.Assert(PredictionKind != PredictionKind.MultiClassClassification || Options.ContainsKey("num_class"), + "LightGBM requires the number of classes to be specified in the parameters."); + + // Only enable one trainer to run at one time. + lock (LightGbmShared.LockForMultiThreadingInside) + { + ch.Info("LightGBM objective={0}", Options["objective"]); + using (Booster bst = WrappedLightGbmTraining.Train(ch, pch, Options, dtrain, + dvalid: dvalid, numIteration: Args.NumBoostRound, + verboseEval: Args.VerboseEval, earlyStoppingRound: Args.EarlyStoppingRound)) + { + TrainedEnsemble = bst.GetModel(catMetaData.CategoricalBoudaries); + } + } + } + + /// + /// Calculate the density of data. Only use top 1000 rows to calculate. + /// + private static double DetectDensity(FloatLabelCursor.Factory factory, int numRows = 1000) + { + int nonZeroCount = 0; + int totalCount = 0; + using (var cursor = factory.Create()) + { + while (cursor.MoveNext() && numRows > 0) + { + nonZeroCount += cursor.Features.Count; + totalCount += cursor.Features.Length; + --numRows; + } + } + return (double)nonZeroCount / totalCount; + } + + /// + /// Compute row count, list of labels, weights and group counts of the dataset. + /// + private void GetMetainfo(IChannel ch, FloatLabelCursor.Factory factory, + out int numRow, out float[] labels, out float[] weights, out int[] groups) + { + ch.Check(factory.Data.Schema.Label != null, "The data should have label."); + List labelList = new List(); + bool hasWeights = factory.Data.Schema.Weight != null; + bool hasGroup = false; + if (PredictionKind == PredictionKind.Ranking) + { + ch.Check(factory.Data.Schema != null, "The data for ranking task should have group field."); + hasGroup = true; + } + List weightList = hasWeights ? new List() : null; + List cursorGroups = hasGroup ? new List() : null; + + using (var cursor = factory.Create()) + { + while (cursor.MoveNext()) + { + if (labelList.Count == Utils.ArrayMaxSize) + throw ch.Except($"Dataset row count exceeded the maximum count of {Utils.ArrayMaxSize}"); + labelList.Add(cursor.Label); + if (hasWeights) + { + // Default weight = 1. + if (float.IsNaN(cursor.Weight)) + weightList.Add(1); + else + weightList.Add(cursor.Weight); + } + if (hasGroup) + cursorGroups.Add(cursor.Group); + } + } + labels = labelList.ToArray(); + ConvertNaNLabels(ch, factory.Data, labels); + numRow = labels.Length; + ch.Check(numRow > 0, "Cannot use empty dataset."); + weights = hasWeights ? weightList.ToArray() : null; + groups = null; + if (hasGroup) + { + List groupList = new List(); + int lastGroup = -1; + for (int i = 0; i < numRow; ++i) + { + if (i == 0 || cursorGroups[i] != cursorGroups[i - 1]) + { + groupList.Add(1); + ++lastGroup; + } + else + ++groupList[lastGroup]; + } + groups = groupList.ToArray(); + } + } + + /// + /// Convert Nan labels. Default way is converting them to zero. + /// + protected virtual void ConvertNaNLabels(IChannel ch, RoleMappedData data, float[] labels) + { + for (int i = 0; i < labels.Length; ++i) + { + if (float.IsNaN(labels[i])) + labels[i] = 0; + } + } + + private static bool MoveMany(FloatLabelCursor cursor, long count) + { + for (long i = 0; i < count; ++i) + { + if (!cursor.MoveNext()) + return false; + } + return true; + } + + private void GetFeatureValueDense(IChannel ch, FloatLabelCursor cursor, CategoricalMetaData catMetaData, IRandom rand, out float[] featureValues) + { + if (catMetaData.CategoricalBoudaries != null) + { + featureValues = new float[catMetaData.NumCol]; + for (int i = 0; i < catMetaData.NumCol; ++i) + { + float fv = cursor.Features.Values[catMetaData.CategoricalBoudaries[i]]; + if (catMetaData.IsCategoricalFeature[i]) + { + int hotIdx = catMetaData.CategoricalBoudaries[i] - 1; + int nhot = 0; + for (int j = catMetaData.CategoricalBoudaries[i]; j < catMetaData.CategoricalBoudaries[i + 1]; ++j) + { + if (cursor.Features.Values[j] > 0) + { + // Reservoir Sampling. + nhot++; + var prob = rand.NextSingle(); + if (prob < 1.0f / nhot) + hotIdx = j; + } + } + // All-Zero is category 0. + fv = hotIdx - catMetaData.CategoricalBoudaries[i] + 1; + } + featureValues[i] = fv; + } + } + else + { + featureValues = cursor.Features.Values; + } + } + + private void GetFeatureValueSparse(IChannel ch, FloatLabelCursor cursor, + CategoricalMetaData catMetaData, IRandom rand, out int[] indices, + out float[] featureValues, out int cnt) + { + if (catMetaData.CategoricalBoudaries != null) + { + List featureIndices = new List(); + List values = new List(); + int lastIdx = -1; + int nhot = 0; + for (int i = 0; i < cursor.Features.Count; ++i) + { + float fv = cursor.Features.Values[i]; + int colIdx = cursor.Features.Indices[i]; + int newColIdx = catMetaData.OnehotIndices[colIdx]; + if (catMetaData.IsCategoricalFeature[newColIdx]) + fv = catMetaData.OnehotBias[colIdx] + 1; + if (newColIdx != lastIdx) + { + featureIndices.Push(newColIdx); + values.Push(fv); + nhot = 1; + } + else + { + // Multi-hot. + ++nhot; + var prob = rand.NextSingle(); + if (prob < 1.0f / nhot) + values[values.Count - 1] = fv; + } + lastIdx = newColIdx; + } + indices = featureIndices.ToArray(); + featureValues = values.ToArray(); + cnt = featureIndices.Count; + } + else + { + indices = cursor.Features.Indices; + featureValues = cursor.Features.Values; + cnt = cursor.Features.Count; + } + } + + /// + /// Create a dataset from the sampling data. + /// + private void CreateDatasetFromSamplingData(IChannel ch, FloatLabelCursor.Factory factory, + int numRow, string param, float[] labels, float[] weights, int[] groups, CategoricalMetaData catMetaData, + out Dataset dataset) + { + Host.AssertValue(ch); + + int numSampleRow = GetNumSampleRow(numRow, FeatureCount); + + var rand = Host.Rand; + double averageStep = (double)numRow / numSampleRow; + int totalIdx = 0; + int sampleIdx = 0; + double density = DetectDensity(factory); + + double[][] sampleValuePerColumn = new double[catMetaData.NumCol][]; + int[][] sampleIndicesPerColumn = new int[catMetaData.NumCol][]; + int[] nonZeroCntPerColumn = new int[catMetaData.NumCol]; + int estimateNonZeroCnt = (int)(numSampleRow * density); + estimateNonZeroCnt = Math.Max(1, estimateNonZeroCnt); + for(int i = 0; i < catMetaData.NumCol; i++) + { + nonZeroCntPerColumn[i] = 0; + sampleValuePerColumn[i] = new double[estimateNonZeroCnt]; + sampleIndicesPerColumn[i] = new int[estimateNonZeroCnt]; + }; + using (var cursor = factory.Create()) + { + int step = 1; + if (averageStep > 1) + step = rand.Next((int)(2 * averageStep - 1)) + 1; + while (MoveMany(cursor, step)) + { + if (cursor.Features.IsDense) + { + GetFeatureValueDense(ch, cursor, catMetaData, rand, out float[] featureValues); + for (int i = 0; i < catMetaData.NumCol; ++i) + { + float fv = featureValues[i]; + if (fv == 0) + continue; + int curNonZeroCnt = nonZeroCntPerColumn[i]; + Utils.EnsureSize(ref sampleValuePerColumn[i], curNonZeroCnt + 1); + Utils.EnsureSize(ref sampleIndicesPerColumn[i], curNonZeroCnt + 1); + sampleValuePerColumn[i][curNonZeroCnt] = fv; + sampleIndicesPerColumn[i][curNonZeroCnt] = sampleIdx; + nonZeroCntPerColumn[i] = curNonZeroCnt + 1; + } + } + else + { + GetFeatureValueSparse(ch, cursor, catMetaData, rand, out int[] featureIndices, out float[] featureValues, out int cnt); + for (int i = 0; i < cnt; ++i) + { + int colIdx = featureIndices[i]; + float fv = featureValues[i]; + if (fv == 0) + continue; + int curNonZeroCnt = nonZeroCntPerColumn[colIdx]; + Utils.EnsureSize(ref sampleValuePerColumn[colIdx], curNonZeroCnt + 1); + Utils.EnsureSize(ref sampleIndicesPerColumn[colIdx], curNonZeroCnt + 1); + sampleValuePerColumn[colIdx][curNonZeroCnt] = fv; + sampleIndicesPerColumn[colIdx][curNonZeroCnt] = sampleIdx; + nonZeroCntPerColumn[colIdx] = curNonZeroCnt + 1; + } + } + totalIdx += step; + ++sampleIdx; + if (numSampleRow == sampleIdx || numRow == totalIdx) + break; + averageStep = (double)(numRow - totalIdx) / (numSampleRow - sampleIdx); + step = 1; + if (averageStep > 1) + step = rand.Next((int)(2 * averageStep - 1)) + 1; + } + } + dataset = new Dataset(sampleValuePerColumn, sampleIndicesPerColumn, catMetaData.NumCol, nonZeroCntPerColumn, sampleIdx, numRow, param, labels, weights, groups); + } + + /// + /// Load dataset. Use row batch way to reduce peak memory cost. + /// + private void LoadDataset(IChannel ch, FloatLabelCursor.Factory factory, Dataset dataset, int numRow, int batchSize, CategoricalMetaData catMetaData) + { + Host.AssertValue(ch); + ch.AssertValue(factory); + ch.AssertValue(dataset); + ch.Assert(dataset.GetNumRows() == numRow); + ch.Assert(dataset.GetNumCols() == catMetaData.NumCol); + var rand = Host.Rand; + // To avoid array resize, batch size should bigger than size of one row. + batchSize = Math.Max(batchSize, catMetaData.NumCol); + double density = DetectDensity(factory); + int numElem = 0; + int totalRowCount = 0; + int curRowCount = 0; + + if (density >= 0.5) + { + int batchRow = batchSize / catMetaData.NumCol; + batchRow = Math.Max(1, batchRow); + if (batchRow > numRow) + batchRow = numRow; + + // This can only happen if the size of ONE example(row) exceeds the max array size. This looks like a very unlikely case. + if ((long)catMetaData.NumCol * batchRow > Utils.ArrayMaxSize) + throw ch.Except("Size of array exceeded the " + nameof(Utils.ArrayMaxSize)); + + float[] features = new float[catMetaData.NumCol * batchRow]; + + using (var cursor = factory.Create()) + { + while (cursor.MoveNext()) + { + ch.Assert(totalRowCount < numRow); + CopyToArray(ch, cursor, features, catMetaData, rand, ref numElem); + ++totalRowCount; + ++curRowCount; + if (batchRow == curRowCount) + { + ch.Assert(numElem == curRowCount * catMetaData.NumCol); + // PushRows is run by multi-threading inside, so lock here. + lock (LightGbmShared.LockForMultiThreadingInside) + dataset.PushRows(features, curRowCount, catMetaData.NumCol, totalRowCount - curRowCount); + curRowCount = 0; + numElem = 0; + } + } + ch.Assert(totalRowCount == numRow); + if (curRowCount > 0) + { + ch.Assert(numElem == curRowCount * catMetaData.NumCol); + // PushRows is run by multi-threading inside, so lock here. + lock (LightGbmShared.LockForMultiThreadingInside) + dataset.PushRows(features, curRowCount, catMetaData.NumCol, totalRowCount - curRowCount); + } + } + } + else + { + int esimateBatchRow = (int)(batchSize / (catMetaData.NumCol * density)); + esimateBatchRow = Math.Max(1, esimateBatchRow); + float[] features = new float[batchSize]; + int[] indices = new int[batchSize]; + int[] indptr = new int[esimateBatchRow + 1]; + + using (var cursor = factory.Create()) + { + while (cursor.MoveNext()) + { + ch.Assert(totalRowCount < numRow); + // Need push rows to LightGBM. + if (numElem + cursor.Features.Count > features.Length) + { + // Mini batch size is greater than size of one row. + // So, at least we have the data of one row. + ch.Assert(curRowCount > 0); + Utils.EnsureSize(ref indptr, curRowCount + 1); + indptr[curRowCount] = numElem; + // PushRows is run by multi-threading inside, so lock here. + lock (LightGbmShared.LockForMultiThreadingInside) + { + dataset.PushRows(indptr, indices, features, + curRowCount + 1, numElem, catMetaData.NumCol, totalRowCount - curRowCount); + } + curRowCount = 0; + numElem = 0; + } + Utils.EnsureSize(ref indptr, curRowCount + 1); + indptr[curRowCount] = numElem; + CopyToCsr(ch, cursor, indices, features, catMetaData, rand, ref numElem); + ++totalRowCount; + ++curRowCount; + } + ch.Assert(totalRowCount == numRow); + if (curRowCount > 0) + { + Utils.EnsureSize(ref indptr, curRowCount + 1); + indptr[curRowCount] = numElem; + // PushRows is run by multi-threading inside, so lock here. + lock (LightGbmShared.LockForMultiThreadingInside) + { + dataset.PushRows(indptr, indices, features, curRowCount + 1, + numElem, catMetaData.NumCol, totalRowCount - curRowCount); + } + } + } + } + } + + private void CopyToArray(IChannel ch, FloatLabelCursor cursor, float[] features, CategoricalMetaData catMetaData, IRandom rand, ref int numElem) + { + ch.Assert(features.Length >= numElem + catMetaData.NumCol); + if (catMetaData.CategoricalBoudaries != null) + { + if (cursor.Features.IsDense) + { + GetFeatureValueDense(ch, cursor, catMetaData, rand, out float[] featureValues); + for (int i = 0; i < catMetaData.NumCol; ++i) + features[numElem + i] = featureValues[i]; + numElem += catMetaData.NumCol; + } + else + { + GetFeatureValueSparse(ch, cursor, catMetaData, rand, out int[] indices, out float[] featureValues, out int cnt); + int lastIdx = 0; + for (int i = 0; i < cnt; i++) + { + int slot = indices[i]; + float fv = featureValues[i]; + Contracts.Assert(slot >= lastIdx); + while (lastIdx < slot) + features[numElem + lastIdx++] = 0.0f; + Contracts.Assert(lastIdx == slot); + features[numElem + lastIdx++] = fv; + } + while (lastIdx < catMetaData.NumCol) + features[numElem + lastIdx++] = 0.0f; + numElem += catMetaData.NumCol; + } + } + else + { + cursor.Features.CopyTo(features, numElem, 0.0f); + numElem += catMetaData.NumCol; + } + } + + private void CopyToCsr(IChannel ch, FloatLabelCursor cursor, + int[] indices, float[] features, CategoricalMetaData catMetaData, IRandom rand, ref int numElem) + { + int numValue = cursor.Features.Count; + if (numValue > 0) + { + ch.Assert(indices.Length >= numElem + numValue); + ch.Assert(features.Length >= numElem + numValue); + + if (cursor.Features.IsDense) + { + GetFeatureValueDense(ch, cursor, catMetaData, rand, out float[] featureValues); + for (int i = 0; i < catMetaData.NumCol; ++i) + { + float fv = featureValues[i]; + if (fv == 0) + continue; + features[numElem] = fv; + indices[numElem] = i; + ++numElem; + } + } + else + { + GetFeatureValueSparse(ch, cursor, catMetaData, rand, out int[] featureIndices, out float[] featureValues, out int cnt); + for (int i = 0; i < cnt; ++i) + { + int colIdx = featureIndices[i]; + float fv = featureValues[i]; + if (fv == 0) + continue; + features[numElem] = fv; + indices[numElem] = colIdx; + ++numElem; + } + } + } + } + + private static double DefaultLearningRate(int numRow, bool useCat, int totalCats) + { + if (useCat) + { + if (totalCats < 1e6) + return 0.1; + else + return 0.15; + } + else if (numRow <= 100000) + return 0.2; + else + return 0.25; + } + + private static int DefaultNumLeaves(int numRow, bool useCat, int totalCats) + { + if (useCat && totalCats > 100) + { + if (totalCats < 1e6) + return 20; + else + return 30; + } + else if (numRow <= 100000) + return 20; + else + return 30; + } + + protected static int DefaultMinDataPerLeaf(int numRow, int numLeaves, int numClass) + { + if (numClass > 1) + { + int ret = numRow / numLeaves / numClass / 10; + ret = Math.Max(ret, 5); + ret = Math.Min(ret, 50); + return ret; + } + else + { + return 20; + } + } + + private static int GetNumSampleRow(int numRow, int numCol) + { + // Default is 65536. + int ret = 1 << 16; + // If have many features, use more sampling data. + if (numCol >= 100000) + ret *= 4; + ret = Math.Min(ret, numRow); + return ret; + } + + private protected abstract TPredictor CreatePredictor(); + + /// + /// This function will be called before training. It will check the label/group and add parameters for specific applications. + /// + protected abstract void CheckAndUpdateParametersBeforeTraining(IChannel ch, + RoleMappedData data, float[] labels, int[] groups); + } +} diff --git a/src/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.csproj b/src/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.csproj new file mode 100644 index 0000000000..3757c00743 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/Microsoft.ML.LightGBM.csproj @@ -0,0 +1,21 @@ + + + + netstandard2.0 + Microsoft.ML.LightGBM + true + + + + + + + + + + + + + + + diff --git a/src/Microsoft.ML.LightGBM/Parallel/IParallel.cs b/src/Microsoft.ML.LightGBM/Parallel/IParallel.cs new file mode 100644 index 0000000000..469beae930 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/Parallel/IParallel.cs @@ -0,0 +1,74 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Microsoft.ML.Runtime.EntryPoints; + +namespace Microsoft.ML.Runtime.LightGBM +{ + /// + /// Signature of LightGBM IAllreduce + /// + public delegate void SignatureParallelTrainer(); + + /// + /// Reduce function define in LightGBM Cpp side + /// + public unsafe delegate void ReduceFunction(byte* src, byte* output, int typeSize, int arraySize); + + /// + /// Definition of ReduceScatter funtion + /// + public delegate void ReduceScatterFunction([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]byte[] input, int inputSize, int typeSize, + [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 5)]int[] blockStart, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 5)]int[] blockLen, int numBlock, + [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 7)]byte[] output, int outputSize, + IntPtr reducer); + + /// + /// Definition of Allgather funtion + /// + public delegate void AllgatherFunction([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]byte[] input, int inputSize, + [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)]int[] blockStart, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)]int[] blockLen, int numBlock, + [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 6)]byte[] output, int outputSize); + + public interface IParallel + { + /// + /// Type of parallel + /// + string ParallelType(); + + /// + /// Number of machines + /// + int NumMachines(); + + /// + /// Rank of local machine + /// + int Rank(); + + /// + /// ReduceScatter Function + /// + ReduceScatterFunction GetReduceScatterFunction(); + + /// + /// Allgather Function + /// + AllgatherFunction GetAllgatherFunction(); + + /// + /// Additional parameteres + /// + Dictionary AdditionalParams(); + } + + [TlcModule.ComponentKind("ParallelLightGBM")] + public interface ISupportParallel : IComponentFactory + { + } +} diff --git a/src/Microsoft.ML.LightGBM/Parallel/SingleTrainer.cs b/src/Microsoft.ML.LightGBM/Parallel/SingleTrainer.cs new file mode 100644 index 0000000000..4c61bd65c6 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/Parallel/SingleTrainer.cs @@ -0,0 +1,54 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.EntryPoints; + +[assembly: LoadableClass(typeof(Microsoft.ML.Runtime.LightGBM.SingleTrainer), + null, typeof(Microsoft.ML.Runtime.LightGBM.SignatureParallelTrainer), "single")] + +[assembly: EntryPointModule(typeof(Microsoft.ML.Runtime.LightGBM.SingleTrainerFactory))] + +namespace Microsoft.ML.Runtime.LightGBM +{ + public sealed class SingleTrainer : IParallel + { + public AllgatherFunction GetAllgatherFunction() + { + return null; + } + + public ReduceScatterFunction GetReduceScatterFunction() + { + return null; + } + + public int NumMachines() + { + return 1; + } + + public string ParallelType() + { + return "serial"; + } + + public int Rank() + { + return 0; + } + + public Dictionary AdditionalParams() + { + return null; + } + } + + [TlcModule.Component(Name = "Single", Desc = "Single node machine learning process.")] + public sealed class SingleTrainerFactory : ISupportParallel + { + public IParallel CreateComponent(IHostEnvironment env) => new SingleTrainer(); + } +} diff --git a/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs b/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs new file mode 100644 index 0000000000..c9f3128434 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs @@ -0,0 +1,276 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Runtime.FastTree.Internal; + +namespace Microsoft.ML.Runtime.LightGBM +{ + /// + /// Wrapper of Booster object of LightGBM. + /// + internal sealed class Booster : IDisposable + { + private readonly bool _hasValid; + private readonly bool _hasMetric; + + public IntPtr Handle { get; private set; } + public int BestIteration { get; set; } + + public Booster(Dictionary parameters, Dataset trainset, Dataset validset = null) + { + var param = LightGbmInterfaceUtils.JoinParameters(parameters); + var handle = IntPtr.Zero; + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterCreate(trainset.Handle, param, ref handle)); + Handle = handle; + if (validset != null) + { + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterAddValidData(Handle, validset.Handle)); + _hasValid = true; + } + + int numEval = 0; + BestIteration = -1; + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterGetEvalCounts(Handle, ref numEval)); + // At most one metric in ML.NET. + Contracts.Assert(numEval <= 1); + if (numEval == 1) + _hasMetric = true; + } + + public bool Update() + { + int isFinished = 0; + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterUpdateOneIter(Handle, ref isFinished)); + return isFinished == 1; + } + + public double EvalTrain() + { + return Eval(0); + } + + public double EvalValid() + { + if (_hasValid) + return Eval(1); + else + return double.NaN; + } + + private unsafe double Eval(int dataIdx) + { + if (!_hasMetric) + return double.NaN; + int outLen = 0; + double[] res = new double[1]; + fixed (double* ptr = res) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterGetEval(Handle, dataIdx, ref outLen, ptr)); + return res[0]; + } + + private unsafe string GetModelString() + { + int bufLen = 2 << 15; + byte[] buffer = new byte[bufLen]; + int size = 0; + fixed (byte* ptr = buffer) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterSaveModelToString(Handle, BestIteration, bufLen, ref size, ptr)); + // If buffer size is not enough, reallocate buffer and get again. + if (size > bufLen) + { + bufLen = size; + buffer = new byte[bufLen]; + fixed (byte* ptr = buffer) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterSaveModelToString(Handle, BestIteration, bufLen, ref size, ptr)); + } + byte[] content = new byte[size]; + Array.Copy(buffer, content, size); + fixed (byte* ptr = content) + return LightGbmInterfaceUtils.GetString((IntPtr)ptr); + } + + private static double[] Str2DoubleArray(string str, char delimiter) + { + return str.Split(delimiter).Select( + x => { double t; double.TryParse(x, out t); return t; } + ).ToArray(); + + } + + private static int[] Str2IntArray(string str, char delimiter) + { + return str.Split(delimiter).Select(int.Parse).ToArray(); + } + + private static UInt32[] Str2UIntArray(string str, char delimiter) + { + return str.Split(delimiter).Select(UInt32.Parse).ToArray(); + } + + private static bool GetIsDefaultLeft(UInt32 decisionType) + { + // The second bit. + return (decisionType & 2) > 0; + } + + private static bool GetIsCategoricalSplit(UInt32 decisionType) + { + // The first bit. + return (decisionType & 1) > 0; + } + + private static bool GetHasMissing(UInt32 decisionType) + { + // The 3rd and 4th bits. + return ((decisionType >> 2) & 3) > 0; + } + + private static double[] GetDefalutValue(double[] threshold, UInt32[] decisionType) + { + double[] ret = new double[threshold.Length]; + for (int i = 0; i < threshold.Length; ++i) + { + if (GetHasMissing(decisionType[i]) && !GetIsCategoricalSplit(decisionType[i])) + { + if (GetIsDefaultLeft(decisionType[i])) + ret[i] = threshold[i]; + else + ret[i] = threshold[i] + 1; + } + } + return ret; + } + + private static bool FindInBitset(UInt32[] bits, int start, int end, int pos) + { + int i1 = pos / 32; + if (start + i1 >= end) + return false; + int i2 = pos % 32; + return ((bits[start + i1] >> i2) & 1) > 0; + } + + private static int[] GetCatThresholds(UInt32[] catThreshold, int lowerBound, int upperBound) + { + List cats = new List(); + for (int j = lowerBound; j < upperBound; ++j) + { + // 32 bits. + for (int k = 0; k < 32; ++k) + { + int cat = (j - lowerBound) * 32 + k; + if (FindInBitset(catThreshold, lowerBound, upperBound, cat) && cat > 0) + cats.Add(cat); + } + } + return cats.ToArray(); + } + + public FastTree.Internal.Ensemble GetModel(int[] categoricalFeatureBoudaries) + { + FastTree.Internal.Ensemble res = new FastTree.Internal.Ensemble(); + string modelString = GetModelString(); + string[] lines = modelString.Split('\n'); + int i = 0; + for (; i < lines.Length;) + { + if (lines[i].StartsWith("Tree=")) + { + Dictionary kvPairs = new Dictionary(); + ++i; + while (!lines[i].StartsWith("Tree=") && lines[i].Trim().Length != 0) + { + string[] kv = lines[i].Split('='); + Contracts.Check(kv.Length == 2); + kvPairs[kv[0].Trim()] = kv[1].Trim(); + ++i; + } + int numLeaves = int.Parse(kvPairs["num_leaves"]); + int numCat = int.Parse(kvPairs["num_cat"]); + if (numLeaves > 1) + { + var leftChild = Str2IntArray(kvPairs["left_child"], ' '); + var rightChild = Str2IntArray(kvPairs["right_child"], ' '); + var splitFeature = Str2IntArray(kvPairs["split_feature"], ' '); + var threshold = Str2DoubleArray(kvPairs["threshold"], ' '); + var splitGain = Str2DoubleArray(kvPairs["split_gain"], ' '); + var leafOutput = Str2DoubleArray(kvPairs["leaf_value"], ' '); + var decisionType = Str2UIntArray(kvPairs["decision_type"], ' '); + var defaultValue = GetDefalutValue(threshold, decisionType); + var categoricalSplitFeatures = new int[numLeaves - 1][]; + var categoricalSplit = new bool[numLeaves - 1]; + if (categoricalFeatureBoudaries != null) + { + // Add offsets to split features. + for (int node = 0; node < numLeaves - 1; ++node) + splitFeature[node] = categoricalFeatureBoudaries[splitFeature[node]]; + } + + if (numCat > 0) + { + var catBoundaries = Str2IntArray(kvPairs["cat_boundaries"], ' '); + var catThreshold = Str2UIntArray(kvPairs["cat_threshold"], ' '); + for (int node = 0; node < numLeaves - 1; ++node) + { + if (GetIsCategoricalSplit(decisionType[node])) + { + int catIdx = (int)threshold[node]; + var cats = GetCatThresholds(catThreshold, catBoundaries[catIdx], catBoundaries[catIdx + 1]); + categoricalSplitFeatures[node] = new int[cats.Length]; + // Convert Cat thresholds to feature indices. + for (int j = 0; j < cats.Length; ++j) + categoricalSplitFeatures[node][j] = splitFeature[node] + cats[j] - 1; + + splitFeature[node] = -1; + categoricalSplit[node] = true; + // Swap left and right child. + int t = leftChild[node]; + leftChild[node] = rightChild[node]; + rightChild[node] = t; + } + else + { + categoricalSplit[node] = false; + } + } + } + RegressionTree tree = RegressionTree.Create(numLeaves, splitFeature, splitGain, + threshold.Select(x => (float)(x)).ToArray(), defaultValue.Select(x => (float)(x)).ToArray(), leftChild, rightChild, leafOutput, + categoricalSplitFeatures, categoricalSplit); + res.AddTree(tree); + } + else + { + RegressionTree tree = new RegressionTree(2); + var leafOutput = Str2DoubleArray(kvPairs["leaf_value"], ' '); + if (leafOutput[0] != 0) + { + // Convert Constant tree to Two-leaf tree, avoid being filter by TLC. + var categoricalSplitFeatures = new int[1][]; + var categoricalSplit = new bool[1]; + tree = RegressionTree.Create(2, new int[] { 0 }, new double[] { 0 }, + new float[] { 0 }, new float[] { 0 }, new int[] { -1 }, new int[] { -2 }, new double[] { leafOutput[0], leafOutput[0] }, + categoricalSplitFeatures, categoricalSplit); + } + res.AddTree(tree); + } + } + else + ++i; + } + return res; + } + #region IDisposable Support + public void Dispose() + { + if (Handle != IntPtr.Zero) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.BoosterFree(Handle)); + Handle = IntPtr.Zero; + } + #endregion + } +} diff --git a/src/Microsoft.ML.LightGBM/WrappedLightGbmDataset.cs b/src/Microsoft.ML.LightGBM/WrappedLightGbmDataset.cs new file mode 100644 index 0000000000..4cb8637e2d --- /dev/null +++ b/src/Microsoft.ML.LightGBM/WrappedLightGbmDataset.cs @@ -0,0 +1,181 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Threading.Tasks; +using System.Runtime.InteropServices; + +namespace Microsoft.ML.Runtime.LightGBM +{ + /// + /// Wrapper of Dataset object of LightGBM. + /// + internal sealed class Dataset : IDisposable + { + private IntPtr _handle; + private int _lastPushedRowID; + public IntPtr Handle => _handle; + + public unsafe Dataset(double[][] sampleValuePerColumn, + int[][] sampleIndicesPerColumn, + int numCol, + int[] sampleNonZeroCntPerColumn, + int numSampleRow, + int numTotalRow, + string param, float[] labels, float[] weights = null, int[] groups = null) + { + _handle = IntPtr.Zero; + + // Use GCHandle to pin the memory, avoid the memory relocation. + GCHandle[] gcValues = new GCHandle[numCol]; + GCHandle[] gcIndices = new GCHandle[numCol]; + try + { + double*[] ptrArrayValues = new double*[numCol]; + int*[] ptrArrayIndices = new int*[numCol]; + for(int i = 0; i < numCol; i++) + { + gcValues[i] = GCHandle.Alloc(sampleValuePerColumn[i], GCHandleType.Pinned); + ptrArrayValues[i] = (double*)gcValues[i].AddrOfPinnedObject().ToPointer(); + gcIndices[i] = GCHandle.Alloc(sampleIndicesPerColumn[i], GCHandleType.Pinned); + ptrArrayIndices[i] = (int*)gcIndices[i].AddrOfPinnedObject().ToPointer(); + }; + fixed (double** ptrValues = ptrArrayValues) + fixed (int** ptrIndices = ptrArrayIndices) + { + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetCreateFromSampledColumn( + (IntPtr)ptrValues, (IntPtr)ptrIndices, numCol, sampleNonZeroCntPerColumn, numSampleRow, numTotalRow, + param, ref _handle)); + } + } + finally + { + for (int i = 0; i < numCol; i++) + { + if (gcValues[i].IsAllocated) + gcValues[i].Free(); + if (gcIndices[i].IsAllocated) + gcIndices[i].Free(); + }; + } + SetLabel(labels); + SetWeights(weights); + SetGroup(groups); + + Contracts.Assert(GetNumCols() == numCol); + Contracts.Assert(GetNumRows() == numTotalRow); + } + + public Dataset(Dataset reference, int numTotalRow, float[] labels, float[] weights = null, int[] groups = null) + { + IntPtr refHandle = IntPtr.Zero; + if (reference != null) + refHandle = reference.Handle; + + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetCreateByReference(refHandle, numTotalRow, ref _handle)); + + SetLabel(labels); + SetWeights(weights); + SetGroup(groups); + } + + public void Dispose() + { + if (_handle != IntPtr.Zero) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetFree(_handle)); + _handle = IntPtr.Zero; + } + + public void PushRows(float[] data, int numRow, int numCol, int startRowIdx) + { + Contracts.Assert(startRowIdx == _lastPushedRowID); + Contracts.Assert(numCol == GetNumCols()); + Contracts.Assert(numRow > 0); + Contracts.Assert(startRowIdx <= GetNumRows() - numRow); + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetPushRows(_handle, data, numRow, numCol, startRowIdx)); + _lastPushedRowID = startRowIdx + numRow; + } + + public void PushRows(int[] indPtr, int[] indices, float[] data, int nIndptr, + long numElem, int numCol, int startRowIdx) + { + Contracts.Assert(startRowIdx == _lastPushedRowID); + Contracts.Assert(numCol == GetNumCols()); + Contracts.Assert(startRowIdx < GetNumRows()); + LightGbmInterfaceUtils.Check( + WrappedLightGbmInterface.DatasetPushRowsByCsr( + _handle, indPtr, indices, data, nIndptr, numElem, numCol, startRowIdx)); + _lastPushedRowID = startRowIdx + nIndptr - 1; + } + + public int GetNumRows() + { + int res = 0; + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetGetNumData(_handle, ref res)); + return res; + } + + public int GetNumCols() + { + int res = 0; + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetGetNumFeature(_handle, ref res)); + return res; + } + + public unsafe void SetLabel(float[] labels) + { + Contracts.AssertValue(labels); + Contracts.Assert(labels.Length == GetNumRows()); + fixed (float* ptr = labels) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetSetField(_handle, "label", (IntPtr)ptr, labels.Length, + WrappedLightGbmInterface.CApiDType.Float32)); + } + + public unsafe void SetWeights(float[] weights) + { + if (weights != null) + { + Contracts.Assert(weights.Length == GetNumRows()); + // Skip SetWeights if all weights are same. + bool allSame = true; + for (int i = 1; i < weights.Length; ++i) + { + if (weights[i] != weights[0]) + { + allSame = false; + break; + } + } + if (!allSame) + { + fixed (float* ptr = weights) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetSetField(_handle, "weight", (IntPtr)ptr, weights.Length, + WrappedLightGbmInterface.CApiDType.Float32)); + } + } + } + + public unsafe void SetGroup(int[] groups) + { + if (groups != null) + { + fixed (int* ptr = groups) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetSetField(_handle, "group", (IntPtr)ptr, groups.Length, + WrappedLightGbmInterface.CApiDType.Int32)); + } + } + + // Not used now. Can use for the continued train. + public unsafe void SetInitScore(double[] initScores) + { + if (initScores != null) + { + Contracts.Assert(initScores.Length % GetNumRows() == 0); + fixed (double* ptr = initScores) + LightGbmInterfaceUtils.Check(WrappedLightGbmInterface.DatasetSetField(_handle, "init_score", (IntPtr)ptr, initScores.Length, + WrappedLightGbmInterface.CApiDType.Float64)); + } + } + } +} diff --git a/src/Microsoft.ML.LightGBM/WrappedLightGbmInterface.cs b/src/Microsoft.ML.LightGBM/WrappedLightGbmInterface.cs new file mode 100644 index 0000000000..4abdb47354 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/WrappedLightGbmInterface.cs @@ -0,0 +1,221 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.InteropServices; + +namespace Microsoft.ML.Runtime.LightGBM +{ + /// + /// Wrapper of the c interfaces of LightGBM. + /// Refer to https://github.com/Microsoft/LightGBM/blob/master/include/LightGBM/c_api.h to get the details. + /// + internal static class WrappedLightGbmInterface + { + public enum CApiDType : int + { + Float32 = 0, + Float64 = 1, + Int32 = 2, + Int64 = 3 + } + + private const string DllName = "lib_lightgbm"; + + #region API Array + + [DllImport(DllName, EntryPoint = "LGBM_AllocateArray", CallingConvention = CallingConvention.StdCall)] + public static extern int AllocateArray( + long len, + int type, + ref IntPtr ret); + + [DllImport(DllName, EntryPoint = "LGBM_CopyToArray", CallingConvention = CallingConvention.StdCall)] + public static extern int CopyToArray( + IntPtr arr, + int type, + long startIdx, + IntPtr src, + long len); + + [DllImport(DllName, EntryPoint = "LGBM_FreeArray", CallingConvention = CallingConvention.StdCall)] + public static extern int FreeArray( + IntPtr ret, + int type); + + #endregion + + #region API ERROR + + [DllImport(DllName, EntryPoint = "LGBM_GetLastError", CallingConvention = CallingConvention.StdCall)] + public static extern IntPtr GetLastError(); + + #endregion + + #region API Dataset + + [DllImport(DllName, EntryPoint = "LGBM_DatasetCreateFromSampledColumn", CallingConvention = CallingConvention.StdCall)] + public static extern int DatasetCreateFromSampledColumn(IntPtr sampleValuePerColumn, + IntPtr sampleIndicesPerColumn, + int numCol, + int[] sampleNonZeroCntPerColumn, + int numSampleRow, + int numTotalRow, + [MarshalAs(UnmanagedType.LPStr)]string parameters, + ref IntPtr ret); + + [DllImport(DllName, EntryPoint = "LGBM_DatasetCreateByReference", CallingConvention = CallingConvention.StdCall)] + public static extern int DatasetCreateByReference(IntPtr reference, + long numRow, + ref IntPtr ret); + + [DllImport(DllName, EntryPoint = "LGBM_DatasetPushRows", CallingConvention = CallingConvention.StdCall)] + private static extern int DatasetPushRows(IntPtr dataset, + float[] data, + CApiDType dataType, + int numRow, + int numCol, + int startRowIdx); + + public static int DatasetPushRows(IntPtr dataset, + float[] data, + int numRow, + int numCol, + int startRowIdx) + { + return DatasetPushRows(dataset, data, CApiDType.Float32, numRow, numCol, startRowIdx); + } + + [DllImport(DllName, EntryPoint = "LGBM_DatasetPushRowsByCSR", CallingConvention = CallingConvention.StdCall)] + private static extern int DatasetPushRowsByCsr(IntPtr dataset, + int[] indPtr, + CApiDType indPtrType, + int[] indices, + float[] data, + CApiDType dataType, + long nIndPtr, + long numElem, + long numCol, + long startRowIdx); + + public static int DatasetPushRowsByCsr(IntPtr dataset, + int[] indPtr, + int[] indices, + float[] data, + long nIndPtr, + long numElem, + long numCol, + long startRowIdx) + { + return DatasetPushRowsByCsr(dataset, + indPtr, CApiDType.Int32, + indices, data, CApiDType.Float32, + nIndPtr, numElem, numCol, startRowIdx); + } + + [DllImport(DllName, EntryPoint = "LGBM_DatasetFree", CallingConvention = CallingConvention.StdCall)] + public static extern int DatasetFree(IntPtr handle); + + [DllImport(DllName, EntryPoint = "LGBM_DatasetSetField", CallingConvention = CallingConvention.StdCall)] + public static extern int DatasetSetField( + IntPtr handle, + [MarshalAs(UnmanagedType.LPStr)]string field, + IntPtr array, + int len, + CApiDType type); + + [DllImport(DllName, EntryPoint = "LGBM_DatasetGetNumData", CallingConvention = CallingConvention.StdCall)] + public static extern int DatasetGetNumData(IntPtr handle, ref int res); + + [DllImport(DllName, EntryPoint = "LGBM_DatasetGetNumFeature", CallingConvention = CallingConvention.StdCall)] + public static extern int DatasetGetNumFeature(IntPtr handle, ref int res); + + #endregion + + #region API Booster + + [DllImport(DllName, EntryPoint = "LGBM_BoosterCreate", CallingConvention = CallingConvention.StdCall)] + public static extern int BoosterCreate(IntPtr trainset, + [MarshalAs(UnmanagedType.LPStr)]string param, + ref IntPtr res); + + [DllImport(DllName, EntryPoint = "LGBM_BoosterFree", CallingConvention = CallingConvention.StdCall)] + public static extern int BoosterFree(IntPtr handle); + + [DllImport(DllName, EntryPoint = "LGBM_BoosterAddValidData", CallingConvention = CallingConvention.StdCall)] + public static extern int BoosterAddValidData(IntPtr handle, IntPtr validset); + + [DllImport(DllName, EntryPoint = "LGBM_BoosterSaveModelToString", CallingConvention = CallingConvention.StdCall)] + public static extern unsafe int BoosterSaveModelToString(IntPtr handle, + int numIteration, + int bufferLen, + ref int outLen, + byte* outStr); + + #endregion + + #region API train + + [DllImport(DllName, EntryPoint = "LGBM_BoosterUpdateOneIter", CallingConvention = CallingConvention.StdCall)] + public static extern int BoosterUpdateOneIter(IntPtr handle, ref int isFinished); + + [DllImport(DllName, EntryPoint = "LGBM_BoosterGetEvalCounts", CallingConvention = CallingConvention.StdCall)] + public static extern int BoosterGetEvalCounts(IntPtr handle, ref int outLen); + + [DllImport(DllName, EntryPoint = "LGBM_BoosterGetEval", CallingConvention = CallingConvention.StdCall)] + public static extern unsafe int BoosterGetEval(IntPtr handle, int dataIdx, + ref int outLen, double* outResult); + + #endregion + + #region API parallel + + [DllImport(DllName, EntryPoint = "LGBM_NetworkInitWithFunctions", CallingConvention = CallingConvention.StdCall)] + public static extern int NetworkInitWithFunctions(int numMachines, int rank, ReduceScatterFunction reduceScatterFuncPtr, AllgatherFunction allgatherFuncPtr); + + [DllImport(DllName, EntryPoint = "LGBM_NetworkFree", CallingConvention = CallingConvention.StdCall)] + public static extern int NetworkFree(); + + #endregion + } + + internal static class LightGbmInterfaceUtils + { + /// + /// Checks if LightGBM has a pending error message. Raises an exception in that case. + /// + public static void Check(int res) + { + if (res != 0) + { + var charPtr = WrappedLightGbmInterface.GetLastError(); + string mes = Marshal.PtrToStringAnsi(charPtr); + throw Contracts.Except("LightGBM Error, code is {0}, error message is '{1}'.", res, mes); + } + } + + /// + /// Join the parameters to key=value format. + /// + public static string JoinParameters(Dictionary parameters) + { + if (parameters == null) + return ""; + List res = new List(); + foreach (var keyVal in parameters) + res.Add(keyVal.Key + "=" + string.Format(CultureInfo.InvariantCulture, "{0}", keyVal.Value)); + return string.Join(" ", res); + } + + /// + /// Convert the pointer of c string to c# string. + /// + public static string GetString(IntPtr src) + { + return Marshal.PtrToStringAnsi(src); + } + } +} diff --git a/src/Microsoft.ML.LightGBM/WrappedLightGbmTraining.cs b/src/Microsoft.ML.LightGBM/WrappedLightGbmTraining.cs new file mode 100644 index 0000000000..8b2036fb11 --- /dev/null +++ b/src/Microsoft.ML.LightGBM/WrappedLightGbmTraining.cs @@ -0,0 +1,114 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.ML.Runtime.LightGBM +{ + /// + /// Helpers to train a booster with given parameters. + /// + internal static class WrappedLightGbmTraining + { + /// + /// Train and return a booster. + /// + public static Booster Train(IChannel ch, IProgressChannel pch, + Dictionary parameters, Dataset dtrain, Dataset dvalid = null, int numIteration = 100, + bool verboseEval = true, int earlyStoppingRound = 0) + { + // create Booster. + Booster bst = new Booster(parameters, dtrain, dvalid); + + // Disable early stopping if we don't have validation data. + if (dvalid == null && earlyStoppingRound > 0) + { + earlyStoppingRound = 0; + ch.Warning("Validation dataset not present, early stopping will be disabled."); + } + + int bestIter = 0; + double bestScore = double.MaxValue; + double factorToSmallerBetter = 1.0; + + var metric = (string)parameters["metric"]; + if (earlyStoppingRound > 0 && (metric == "auc" || metric == "ndcg" || metric == "map")) + factorToSmallerBetter = -1.0; + + const int evalFreq = 50; + + var metrics = new List() { "Iteration" }; + var units = new List() { "iterations" }; + + if (verboseEval) + { + ch.Assert(parameters.ContainsKey("metric")); + metrics.Add("Training-" + parameters["metric"]); + if (dvalid != null) + metrics.Add("Validation-" + parameters["metric"]); + } + + var header = new ProgressHeader(metrics.ToArray(), units.ToArray()); + + int iter = 0; + double trainError = double.NaN; + double validError = double.NaN; + pch.SetHeader(header, e => + { + e.SetProgress(0, iter, numIteration); + if (verboseEval) + { + e.SetProgress(1, trainError); + if (dvalid != null) + e.SetProgress(2, validError); + } + }); + for (iter = 0; iter < numIteration; ++iter) + { + if (bst.Update()) + break; + + if (earlyStoppingRound > 0) + { + validError = bst.EvalValid(); + if (validError * factorToSmallerBetter < bestScore) + { + bestScore = validError * factorToSmallerBetter; + bestIter = iter; + } + if (iter - bestIter >= earlyStoppingRound) + { + ch.Info($"Met early stopping, best iteration: {bestIter + 1}, best score: {bestScore / factorToSmallerBetter}"); + break; + } + } + if ((iter + 1) % evalFreq == 0) + { + if (verboseEval) + { + trainError = bst.EvalTrain(); + if (dvalid == null) + pch.Checkpoint(new double?[] { iter + 1, trainError }); + else + { + if (earlyStoppingRound == 0) + validError = bst.EvalValid(); + pch.Checkpoint(new double?[] { iter + 1, + trainError, validError }); + } + } + else + pch.Checkpoint(new double?[] { iter + 1 }); + } + } + // Set the BestIteration. + if (iter != numIteration && earlyStoppingRound > 0) + { + bst.BestIteration = bestIter + 1; + } + return bst; + } + } +} diff --git a/src/Microsoft.ML.LightGBM/doc.xml b/src/Microsoft.ML.LightGBM/doc.xml new file mode 100644 index 0000000000..1fcd38dd7a --- /dev/null +++ b/src/Microsoft.ML.LightGBM/doc.xml @@ -0,0 +1,79 @@ + + + + + + + Trains a Light GBM Model. + + + Light GBM is an open source implementation of boosted trees. + GitHub: LightGBM + + + + + + new LightGbmBinaryClassifier + { + NumBoostRound = 200, + LearningRate = 0.5f, + NumLeaves = 32, + MinDataPerLeaf = 20 + } + + + + + + + new LightGbmClassifier + { + NumBoostRound = 200, + LearningRate = 0.5f, + NumLeaves = 32, + MinDataPerLeaf = 20 + } + + + + + + + new LightGbmRegressor + { + NumBoostRound = 100, + LearningRate = 0.5f, + NumLeaves = 32, + MinDataPerLeaf = 20, + Booster = new DartBoosterParameterFunction + { + XgboostDartMode = true, + UniformDrop = true + } + } + + + + + + + new LightGbmRanker + { + NumBoostRound = 100, + LearningRate = 0.5f, + NumLeaves = 32, + MinDataPerLeaf = 20, + Booster = new GbdtBoosterParameterFunction + { + MinSplitGain = 3, + MaxDepth = 200, + Subsample = 0.5 + } + } + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.Maml/HelpCommand.cs b/src/Microsoft.ML.Maml/HelpCommand.cs index e0941f5a93..a815ffc0e5 100644 --- a/src/Microsoft.ML.Maml/HelpCommand.cs +++ b/src/Microsoft.ML.Maml/HelpCommand.cs @@ -344,7 +344,7 @@ private void ShowFormattedSummary(IndentingTextWriter writer, string summary, in // REVIEW: should we replace consecutive spaces with a single space as a preprocessing step? int screenWidth = (columns ?? CmdParser.GetConsoleWindowWidth()) - 1; - // GetConsoleWindowWidth returns 0 if command redirection operator is used + // GetConsoleWindowWidth returns 0 if command redirection operator is used if (screenWidth <= 0) screenWidth = 80; diff --git a/src/Microsoft.ML.Maml/MAML.cs b/src/Microsoft.ML.Maml/MAML.cs index 3f5b5db50a..1f341dd30e 100644 --- a/src/Microsoft.ML.Maml/MAML.cs +++ b/src/Microsoft.ML.Maml/MAML.cs @@ -183,16 +183,16 @@ internal static int MainCore(TlcEnvironment env, string args, bool alwaysPrintSt if (count == 0) { // Didn't recognize any of the exceptions. - ch.Error(MessageSensitivity.None, "***** Unexpected failure. Please contact 'tlcsupp' with details *****"); + ch.Error(MessageSensitivity.None, "***** Unexpected failure. Please refer to https://aka.ms/MLNetIssue to file an issue with details *****"); if (isDumpSaved) { - ch.Error(MessageSensitivity.None, "***** Error log has been saved to '{0}', please send this file to 'tlcsupp' *****", + ch.Error(MessageSensitivity.None, "***** Error log has been saved to '{0}', please refer to https://aka.ms/MLNetIssue to file an issue with details *****", dumpFilePath); } } else if (isDumpSaved) { - ch.Error(MessageSensitivity.None, "Error log has been saved to '{0}'. Please send this file to 'tlcsupp' if you need assistance.", + ch.Error(MessageSensitivity.None, "Error log has been saved to '{0}'. Please refer to https://aka.ms/MLNetIssue if you need assistance.", dumpFilePath); } diff --git a/src/Microsoft.ML.UniversalModelFormat/Microsoft.ML.UniversalModelFormat.csproj b/src/Microsoft.ML.Onnx/Microsoft.ML.Onnx.csproj similarity index 52% rename from src/Microsoft.ML.UniversalModelFormat/Microsoft.ML.UniversalModelFormat.csproj rename to src/Microsoft.ML.Onnx/Microsoft.ML.Onnx.csproj index 4244681bd6..145dd8be8c 100644 --- a/src/Microsoft.ML.UniversalModelFormat/Microsoft.ML.UniversalModelFormat.csproj +++ b/src/Microsoft.ML.Onnx/Microsoft.ML.Onnx.csproj @@ -2,11 +2,16 @@ netstandard2.0 - Microsoft.ML + Microsoft.ML.Onnx + Microsoft.ML.Runtime.Model.Onnx + + + + diff --git a/src/Microsoft.ML.Onnx/OnnxContextImpl.cs b/src/Microsoft.ML.Onnx/OnnxContextImpl.cs new file mode 100644 index 0000000000..5341b35d55 --- /dev/null +++ b/src/Microsoft.ML.Onnx/OnnxContextImpl.cs @@ -0,0 +1,255 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Runtime.UniversalModelFormat.Onnx; +using Microsoft.ML.Runtime.Data; + +namespace Microsoft.ML.Runtime.Model.Onnx +{ + /// + /// A context for defining a ONNX output. + /// + internal sealed class OnnxContextImpl : OnnxContext + { + private readonly List _nodes; + private readonly List _inputs; + // The map from IDataView column names to variable names. + private readonly List _intermediateValues; + private readonly List _outputs; + private readonly Dictionary _columnNameMap; + // All existing variable names. New variables must not exist in this set. + private readonly HashSet _variableNames; + // All existing node names. New node names must not alrady exist in this set. + private readonly HashSet _nodeNames; + private readonly string _name; + private readonly string _producerName; + private readonly IHost _host; + private readonly string _domain; + private readonly string _producerVersion; + private readonly long _modelVersion; + + public OnnxContextImpl(IHostEnvironment env, string name, string producerName, + string producerVersion, long modelVersion, string domain) + { + Contracts.CheckValue(env, nameof(env)); + _host = env.Register(nameof(OnnxContext)); + _host.CheckValue(name, nameof(name)); + _host.CheckValue(name, nameof(domain)); + + _nodes = new List(); + _intermediateValues = new List(); + _inputs = new List(); + _outputs = new List(); + _columnNameMap = new Dictionary(); + _variableNames = new HashSet(); + _nodeNames = new HashSet(); + _name = name; + _producerName = producerName; + _producerVersion = producerVersion; + _modelVersion = modelVersion; + _domain = domain; + } + + public override bool ContainsColumn(string colName) => _columnNameMap.ContainsKey(colName); + + /// + /// Stops tracking a column. If removeVariable is true then it also removes the + /// variable associated with it, this is useful in the event where an output variable is + /// created before realizing the transform cannot actually save as ONNX. + /// + /// IDataView column name to stop tracking + /// Remove associated ONNX variable at the time. + public override void RemoveColumn(string colName, bool removeVariable) + { + _host.CheckNonEmpty(colName, nameof(colName)); + + if (removeVariable) + { + foreach (var val in _intermediateValues) + { + if (val.Name == _columnNameMap[colName]) + { + _intermediateValues.Remove(val); + break; + } + } + } + _columnNameMap.Remove(colName); + } + + /// + /// Removes an ONNX variable. If removeColumn is true then it also removes the + /// IDataView column associated with it. + /// + /// ONNX variable to remove. + /// IDataView column to stop tracking + public override void RemoveVariable(string variableName, bool removeColumn) + { + _host.CheckNonEmpty(variableName, nameof(variableName)); + if (!_columnNameMap.ContainsValue(variableName)) + throw _host.ExceptParam(nameof(variableName), $"Could not find '{variableName}' declared in ONNX graph"); + + if (removeColumn) + { + foreach (var val in _intermediateValues) + { + if (val.Name == variableName) + { + _intermediateValues.Remove(val); + break; + } + } + } + + string columnName = _columnNameMap.Single(kvp => kvp.Value == variableName).Key; + + Contracts.Assert(_variableNames.Contains(columnName)); + + _columnNameMap.Remove(columnName); + _variableNames.Remove(columnName); + } + + /// + /// Generates a unique name for the node based on a prefix. + /// + public override string GetNodeName(string prefix) + { + _host.CheckNonEmpty(prefix, nameof(prefix)); + return GetUniqueName(prefix, _nodeNames.Contains); + } + + /// + /// Adds a node to the node list of the graph. + /// + /// + private void AddNode(NodeProto node) + { + _host.CheckValue(node, nameof(node)); + _host.Assert(!_nodeNames.Contains(node.Name)); + + _nodeNames.Add(node.Name); + _nodes.Add(node); + } + + public override OnnxNode CreateNode(string opType, IEnumerable inputs, + IEnumerable outputs, string name, string domain = null) + { + _host.CheckNonEmpty(opType, nameof(opType)); + _host.CheckValue(inputs, nameof(inputs)); + _host.CheckValue(outputs, nameof(outputs)); + _host.CheckNonEmpty(name, nameof(name)); + + var innerNode = OnnxUtils.MakeNode(opType, inputs, outputs, name, domain); + AddNode(innerNode); + return new OnnxNodeImpl(innerNode); + } + + /// + /// Generates a unique name based on a prefix. + /// + private string GetUniqueName(string prefix, Func pred) + { + _host.CheckNonEmpty(prefix, nameof(prefix)); + _host.CheckValue(pred, nameof(pred)); + + if (!pred(prefix)) + return prefix; + + int count = 0; + while (pred(prefix + count++)) ; + return prefix + --count; + } + + /// + /// Retrieves the variable name that maps to the IDataView column name at a + /// given point in the pipeline execution. + /// + /// Column Name mapping. + public override string GetVariableName(string colName) + { + _host.CheckNonEmpty(colName, nameof(colName)); + _host.Assert(_columnNameMap.ContainsKey(colName)); + + return _columnNameMap[colName]; + } + + /// + /// Retrieves the variable name that maps to the IDataView column name at a + /// given point in the pipeline execution. + /// + /// Column Name mapping. + public string TryGetVariableName(string colName) + { + _host.CheckNonEmpty(colName, nameof(colName)); + if (_columnNameMap.ContainsKey(colName)) + return GetVariableName(colName); + return null; + } + + /// + /// Generates a unique column name based on the IDataView column name if + /// there is a collision between names in the pipeline at any point. + /// + /// IDataView column name. + /// Unique variable name. + private string AddVariable(string colName) + { + _host.CheckNonEmpty(colName, nameof(colName)); + _columnNameMap[colName] = GetUniqueName(colName, _variableNames.Contains); + _variableNames.Add(_columnNameMap[colName]); + return _columnNameMap[colName]; + } + + /// + /// Adds an intermediate column to the list. + /// + public override string AddIntermediateVariable(ColumnType type, string colName, bool skip = false) + { + colName = AddVariable(colName); + // Let the runtime figure the shape. + if (!skip) + { + _host.CheckValue(type, nameof(type)); + _intermediateValues.Add(OnnxUtils.GetModelArgs(type, colName)); + } + return colName; + } + + /// + /// Adds an output variable to the list. + /// + public string AddOutputVariable(ColumnType type, string colName, List dim = null) + { + _host.CheckValue(type, nameof(type)); + + if (!ContainsColumn(colName)) + AddVariable(colName); + + colName = GetVariableName(colName); + _outputs.Add(OnnxUtils.GetModelArgs(type, colName, dim)); + return colName; + } + + /// + /// Adds an input variable to the list. + /// + public void AddInputVariable(ColumnType type, string colName) + { + _host.CheckValue(type, nameof(type)); + _host.CheckValue(colName, nameof(colName)); + + colName = AddVariable(colName); + _inputs.Add(OnnxUtils.GetModelArgs(type, colName)); + } + + /// + /// Makes the ONNX model based on the context. + /// + public ModelProto MakeModel() + => OnnxUtils.MakeModel(_nodes, _producerName, _name, _domain, _producerVersion, _modelVersion, _inputs, _outputs, _intermediateValues); + } +} diff --git a/src/Microsoft.ML.UniversalModelFormat/Onnx/OnnxMl.cs b/src/Microsoft.ML.Onnx/OnnxMl.cs similarity index 100% rename from src/Microsoft.ML.UniversalModelFormat/Onnx/OnnxMl.cs rename to src/Microsoft.ML.Onnx/OnnxMl.cs diff --git a/src/Microsoft.ML.UniversalModelFormat/Onnx/OnnxMl.md b/src/Microsoft.ML.Onnx/OnnxMl.md similarity index 100% rename from src/Microsoft.ML.UniversalModelFormat/Onnx/OnnxMl.md rename to src/Microsoft.ML.Onnx/OnnxMl.md diff --git a/src/Microsoft.ML.Onnx/OnnxNodeImpl..cs b/src/Microsoft.ML.Onnx/OnnxNodeImpl..cs new file mode 100644 index 0000000000..9b30fd1d87 --- /dev/null +++ b/src/Microsoft.ML.Onnx/OnnxNodeImpl..cs @@ -0,0 +1,46 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.UniversalModelFormat.Onnx; + +namespace Microsoft.ML.Runtime.Model.Onnx +{ + internal sealed class OnnxNodeImpl : OnnxNode + { + private readonly NodeProto _node; + + public OnnxNodeImpl(NodeProto node) + { + Contracts.AssertValue(node); + _node = node; + } + + public override void AddAttribute(string argName, double value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, IEnumerable value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, IEnumerable value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, IEnumerable value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, long value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, IEnumerable value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, DvText value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, string[] value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, IEnumerable value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, IEnumerable value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, string value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + public override void AddAttribute(string argName, bool value) + => OnnxUtils.NodeAddAttributes(_node, argName, value); + } +} diff --git a/src/Microsoft.ML.Data/Model/Onnx/OnnxUtils.cs b/src/Microsoft.ML.Onnx/OnnxUtils.cs similarity index 94% rename from src/Microsoft.ML.Data/Model/Onnx/OnnxUtils.cs rename to src/Microsoft.ML.Onnx/OnnxUtils.cs index 5b63c661c2..9605226846 100644 --- a/src/Microsoft.ML.Data/Model/Onnx/OnnxUtils.cs +++ b/src/Microsoft.ML.Onnx/OnnxUtils.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -15,7 +14,7 @@ namespace Microsoft.ML.Runtime.Model.Onnx /// /// Contains methods to create ONNX models in protocol buffer. /// - public sealed class OnnxUtils + internal static class OnnxUtils { private static TypeProto MakeType(TypeProto typeProto, TensorProto.Types.DataType dataType, List dims, List dimsParam) @@ -153,7 +152,7 @@ private static AttributeProto MakeAttribute(string key, IEnumerable private static AttributeProto MakeAttribute(string key, bool value) => MakeAttribute(key, value ? 1 : 0); - public static NodeProto MakeNode(string opType, List inputs, List outputs, string name, string domain = null) + public static NodeProto MakeNode(string opType, IEnumerable inputs, IEnumerable outputs, string name, string domain = null) { Contracts.CheckNonEmpty(opType, nameof(opType)); Contracts.CheckValue(inputs, nameof(inputs)); @@ -169,11 +168,6 @@ public static NodeProto MakeNode(string opType, List inputs, List() { inputs }, new List() { outputs }, name); - } - public static void NodeAddAttributes(NodeProto node, string argName, double value) => node.Attribute.Add(MakeAttribute(argName, value)); @@ -241,17 +235,7 @@ public ModelArgs(string name, TensorProto.Types.DataType dataType, List di } } - public sealed class NodeProtoWrapper - { - public NodeProto Node; - - public NodeProtoWrapper(NodeProto node) - { - Node = node; - } - } - - public static ModelProto MakeModel(List nodes, string producerName, string name, + public static ModelProto MakeModel(List nodes, string producerName, string name, string domain, string producerVersion, long modelVersion, List inputs, List outputs, List intermediateValues) { @@ -268,10 +252,10 @@ public static ModelProto MakeModel(List nodes, string producerName, s model.Domain = domain; model.ProducerName = producerName; model.ProducerVersion = producerVersion; - model.IrVersion = (long)UniversalModelFormat.Onnx.Version.IrVersion; + model.IrVersion = (long)Version.IrVersion; model.ModelVersion = modelVersion; model.OpsetImport.Add(new OperatorSetIdProto() { Domain = "ai.onnx.ml", Version = 1 }); - model.OpsetImport.Add(new OperatorSetIdProto() { Domain = "ai.onnx", Version = 6 }); + model.OpsetImport.Add(new OperatorSetIdProto() { Domain = "", Version = 7 }); model.Graph = new GraphProto(); var graph = model.Graph; graph.Node.Add(nodes); diff --git a/src/Microsoft.ML.Data/Model/Onnx/SaveOnnxCommand.cs b/src/Microsoft.ML.Onnx/SaveOnnxCommand.cs similarity index 96% rename from src/Microsoft.ML.Data/Model/Onnx/SaveOnnxCommand.cs rename to src/Microsoft.ML.Onnx/SaveOnnxCommand.cs index d2dfc93fde..9c40e61ca2 100644 --- a/src/Microsoft.ML.Data/Model/Onnx/SaveOnnxCommand.cs +++ b/src/Microsoft.ML.Onnx/SaveOnnxCommand.cs @@ -12,7 +12,6 @@ using Microsoft.ML.Runtime.EntryPoints; using Microsoft.ML.Runtime.Internal.Utilities; using Microsoft.ML.Runtime.Model.Onnx; -using Microsoft.ML.Runtime.UniversalModelFormat.Onnx; using Newtonsoft.Json; [assembly: LoadableClass(SaveOnnxCommand.Summary, typeof(SaveOnnxCommand), typeof(SaveOnnxCommand.Arguments), typeof(SignatureCommand), @@ -69,7 +68,6 @@ public sealed class Arguments : DataCommand.ArgumentsBase private readonly HashSet _outputsToDrop; private readonly ITransformModel _model; private const string ProducerName = "ML.NET"; - private const string ProducerVersion = "0.2.0.0000"; private const long ModelVersion = 0; public SaveOnnxCommand(IHostEnvironment env, Arguments args) @@ -164,19 +162,23 @@ private void Run(IChannel ch) GetPipe(ch, view, out source, out end, out transforms); Host.Assert(transforms.Count == 0 || transforms.Last.Value == end); - var ctx = new OnnxContext(Host, _name, ProducerName, ProducerVersion, ModelVersion, _domain); + var assembly = System.Reflection.Assembly.GetExecutingAssembly(); + var versionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location); + + var ctx = new OnnxContextImpl(Host, _name, ProducerName, versionInfo.FileVersion, + ModelVersion, _domain); // If we have a predictor, try to get the scorer for it. if (rawPred != null) { RoleMappedData data; if (trainSchema != null) - data = RoleMappedData.Create(end, trainSchema.GetColumnRoleNames()); + data = new RoleMappedData(end, trainSchema.GetColumnRoleNames()); else { // We had a predictor, but no roles stored in the model. Just suppose // default column names are OK, if present. - data = TrainUtils.CreateExamplesOpt(end, DefaultColumnNames.Label, - DefaultColumnNames.Features, DefaultColumnNames.GroupId, DefaultColumnNames.Weight, DefaultColumnNames.Name); + data = new RoleMappedData(end, DefaultColumnNames.Label, + DefaultColumnNames.Features, DefaultColumnNames.GroupId, DefaultColumnNames.Weight, DefaultColumnNames.Name, opt: true); } var scorePipe = ScoreUtils.GetScorer(rawPred, data, Host, trainSchema); diff --git a/src/Microsoft.ML.PCA/PcaTrainer.cs b/src/Microsoft.ML.PCA/PcaTrainer.cs index 0945b04041..5814d840ca 100644 --- a/src/Microsoft.ML.PCA/PcaTrainer.cs +++ b/src/Microsoft.ML.PCA/PcaTrainer.cs @@ -41,7 +41,7 @@ namespace Microsoft.ML.Runtime.PCA /// /// This PCA can be made into Kernel PCA by using Random Fourier Features transform /// - public sealed class RandomizedPcaTrainer : TrainerBase + public sealed class RandomizedPcaTrainer : TrainerBase { public const string LoadNameValue = "pcaAnomaly"; internal const string UserNameValue = "PCA Anomaly Detector"; @@ -69,13 +69,16 @@ public class Arguments : UnsupervisedLearnerInputBaseWithWeight public int? Seed; } - private int _dimension; private readonly int _rank; private readonly int _oversampling; private readonly bool _center; private readonly int _seed; - private VBuffer[] _eigenvectors; // top eigenvectors of the covariance matrix - private VBuffer _mean; + + public override PredictionKind PredictionKind => PredictionKind.AnomalyDetection; + + // The training performs two passes, only. Probably not worth caching. + private static readonly TrainerInfo _info = new TrainerInfo(caching: false); + public override TrainerInfo Info => _info; public RandomizedPcaTrainer(IHostEnvironment env, Arguments args) : base(env, LoadNameValue) @@ -90,65 +93,43 @@ public RandomizedPcaTrainer(IHostEnvironment env, Arguments args) _seed = args.Seed ?? Host.Rand.Next(); } - public override bool NeedNormalization - { - get { return true; } - } - - public override bool NeedCalibration - { - get { return false; } - } - - public override bool WantCaching - { - // Two passes, only. Probably not worth caching. - get { return false; } - } - - public override PcaPredictor CreatePredictor() - { - return new PcaPredictor(Host, _rank, _eigenvectors, ref _mean); - } - - public override PredictionKind PredictionKind { get { return PredictionKind.AnomalyDetection; } } - //Note: the notations used here are the same as in http://web.stanford.edu/group/mmds/slides2010/Martinsson.pdf (pg. 9) - public override void Train(RoleMappedData data) + public override PcaPredictor Train(TrainContext context) { - Host.CheckValue(data, nameof(data)); + Host.CheckValue(context, nameof(context)); - data.CheckFeatureFloatVector(out _dimension); + context.TrainingSet.CheckFeatureFloatVector(out int dimension); using (var ch = Host.Start("Training")) { - TrainCore(ch, data); + var pred = TrainCore(ch, context.TrainingSet, dimension); ch.Done(); + return pred; } } - private void TrainCore(IChannel ch, RoleMappedData data) + private PcaPredictor TrainCore(IChannel ch, RoleMappedData data, int dimension) { Host.AssertValue(ch); ch.AssertValue(data); - if (_rank > _dimension) - throw ch.Except("Rank ({0}) cannot be larger than the original dimension ({1})", _rank, _dimension); - int oversampledRank = Math.Min(_rank + _oversampling, _dimension); + if (_rank > dimension) + throw ch.Except("Rank ({0}) cannot be larger than the original dimension ({1})", _rank, dimension); + int oversampledRank = Math.Min(_rank + _oversampling, dimension); //exact: (size of the 2 big matrices + other minor allocations) / (2^30) - Double memoryUsageEstimate = 2.0 * _dimension * oversampledRank * sizeof(Float) / 1e9; + Double memoryUsageEstimate = 2.0 * dimension * oversampledRank * sizeof(Float) / 1e9; if (memoryUsageEstimate > 2) ch.Info("Estimate memory usage: {0:G2} GB. If running out of memory, reduce rank and oversampling factor.", memoryUsageEstimate); - var y = Zeros(oversampledRank, _dimension); - _mean = _center ? VBufferUtils.CreateDense(_dimension) : VBufferUtils.CreateEmpty(_dimension); + var y = Zeros(oversampledRank, dimension); + var mean = _center ? VBufferUtils.CreateDense(dimension) : VBufferUtils.CreateEmpty(dimension); - var omega = GaussianMatrix(oversampledRank, _dimension, _seed); + var omega = GaussianMatrix(oversampledRank, dimension, _seed); var cursorFactory = new FeatureFloatVectorCursor.Factory(data, CursOpt.Features | CursOpt.Weight); long numBad; - Project(Host, cursorFactory, ref _mean, omega, y, out numBad); + Project(Host, cursorFactory, ref mean, omega, y, out numBad); if (numBad > 0) ch.Warning("Skipped {0} instances with missing features/weights during training", numBad); @@ -166,7 +147,7 @@ private void TrainCore(IChannel ch, RoleMappedData data) var q = y; // q in QR decomposition. var b = omega; // reuse the memory allocated by Omega. - Project(Host, cursorFactory, ref _mean, q, b, out numBad); + Project(Host, cursorFactory, ref mean, q, b, out numBad); //Compute B2 = B' * B var b2 = new Float[oversampledRank * oversampledRank]; @@ -179,8 +160,9 @@ private void TrainCore(IChannel ch, RoleMappedData data) Float[] smallEigenvalues;// eigenvectors and eigenvalues of the small matrix B2. Float[] smallEigenvectors; EigenUtils.EigenDecomposition(b2, out smallEigenvalues, out smallEigenvectors); - PostProcess(b, smallEigenvalues, smallEigenvectors, _dimension, oversampledRank); - _eigenvectors = b; + PostProcess(b, smallEigenvalues, smallEigenvectors, dimension, oversampledRank); + + return new PcaPredictor(Host, _rank, b, ref mean); } private static VBuffer[] Zeros(int k, int d) @@ -284,7 +266,12 @@ private static void PostProcess(VBuffer[] y, Float[] sigma, Float[] z, in } } - [TlcModule.EntryPoint(Name = "Trainers.PcaAnomalyDetector", Desc = "Train an PCA Anomaly model.", UserName = UserNameValue, ShortName = ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.PcaAnomalyDetector", + Desc = "Train an PCA Anomaly model.", + UserName = UserNameValue, + ShortName = ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.AnomalyDetectionOutput TrainPcaAnomaly(IHostEnvironment env, Arguments input) { Contracts.CheckValue(env, nameof(env)); @@ -298,13 +285,13 @@ public static CommonOutputs.AnomalyDetectionOutput TrainPcaAnomaly(IHostEnvironm } } - /// - /// An anomaly detector using PCA. - /// - The algorithm uses the top eigenvectors to approximate the subspace containing the normal class - /// - For each new instance, it computes the norm difference between the raw feature vector and the projected feature on that subspace. - /// - - If the error is close to 0, the instance is considered normal (non-anomaly). - /// + // An anomaly detector using PCA. + // - The algorithm uses the top eigenvectors to approximate the subspace containing the normal class + // - For each new instance, it computes the norm difference between the raw feature vector and the projected feature on that subspace. + // - - If the error is close to 0, the instance is considered normal (non-anomaly). // REVIEW: move the predictor to a different file and fold EigenUtils.cs to this file. + // REVIEW: Include the above detail in the XML documentation file. + /// public sealed class PcaPredictor : PredictorBase, IValueMapper, ICanGetSummaryAsIDataView, diff --git a/src/Microsoft.ML.PCA/PcaTransform.cs b/src/Microsoft.ML.PCA/PcaTransform.cs index cef2264677..6de130532e 100644 --- a/src/Microsoft.ML.PCA/PcaTransform.cs +++ b/src/Microsoft.ML.PCA/PcaTransform.cs @@ -26,6 +26,7 @@ namespace Microsoft.ML.Runtime.Data { + /// public sealed class PcaTransform : OneToOneTransformBase { public sealed class Arguments : TransformInputBase @@ -336,7 +337,7 @@ private void Train(Arguments args, TransformInfo[] transformInfos, IDataView tra for (int iinfo = 0; iinfo < transformInfos.Length; iinfo++) { - //Orthonormalize Y in-place using stabilized Gram Schmidt algorithm + //Orthonormalize Y in-place using stabilized Gram Schmidt algorithm //Ref: http://en.wikipedia.org/wiki/Gram-Schmidt#Algorithm for (var i = 0; i < oversampledRank[iinfo]; ++i) { @@ -536,8 +537,12 @@ private static void TransformFeatures(IExceptionContext ectx, ref VBuffer dst = new VBuffer(transformInfo.Rank, values, dst.Indices); } - [TlcModule.EntryPoint(Name = "Transforms.PcaCalculator", Desc = "Train an PCA Anomaly model.", - UserName = UserName, ShortName = ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.PcaCalculator", + Desc = Summary, + UserName = UserName, + ShortName = ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput Calculate(IHostEnvironment env, Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "Pca", input); diff --git a/src/Microsoft.ML.PCA/doc.xml b/src/Microsoft.ML.PCA/doc.xml new file mode 100644 index 0000000000..5054950c2d --- /dev/null +++ b/src/Microsoft.ML.PCA/doc.xml @@ -0,0 +1,50 @@ + + + + + + + PCA is a dimensionality-reduction transform which computes the projection of the feature vector onto a low-rank subspace. + + + Principle Component Analysis (PCA) is a dimensionality-reduction algorithm which computes the projection of the feature vector to onto a low-rank subspace. + Its training is done using the technique described in the paper: Combining Structured and Unstructured Randomness in Large Scale PCA, + and the paper Finding Structure with Randomness: Probabilistic Algorithms for Constructing Approximate Matrix Decompositions + For more information, see also: + + + Randomized Methods for Computing the Singular Value Decomposition (SVD) of very large matrices + + + A randomized algorithm for principal component analysis + + + Finding Structure with Randomness: Probabilistic Algorithms for Constructing Approximate Matrix Decompositions + + + + + + + An example of how to add the PcaCalculator transform to a pipeline with a column named "Features". + + string[] features = new string["Sepal length", "Sepal width", "Petal length", "Petal width"]; + pipeline.Add(new PcaCalculator(columns){ Rank = 3 }); + + + + + + + new PcaAnomalyDetector + { + Rank = 40, + Oversampling = 40, + NormalizeFeatures = Microsoft.ML.Models.NormalizeOption.Warn + } + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.Parquet/ParquetLoader.cs b/src/Microsoft.ML.Parquet/ParquetLoader.cs index 21271f6e5c..503debae65 100644 --- a/src/Microsoft.ML.Parquet/ParquetLoader.cs +++ b/src/Microsoft.ML.Parquet/ParquetLoader.cs @@ -12,6 +12,7 @@ using Microsoft.ML.Runtime; using Microsoft.ML.Runtime.CommandLine; using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Data.IO; using Microsoft.ML.Runtime.Internal.Utilities; using Microsoft.ML.Runtime.Model; using Parquet; @@ -32,7 +33,7 @@ namespace Microsoft.ML.Runtime.Data public sealed class ParquetLoader : IDataLoader, IDisposable { /// - /// A Column is a singular representation that consolidates all the related column chunks in the + /// A Column is a singular representation that consolidates all the related column chunks in the /// Parquet file. Information stored within the Column includes its name, raw type read from Parquet, /// its corresponding ColumnType, and index. /// Complex columns in Parquet like structs, maps, and lists are flattened into multiple columns. @@ -88,48 +89,29 @@ public sealed class Arguments internal const string ShortName = "Parquet"; internal const string ModelSignature = "PARQELDR"; + private const string SchemaCtxName = "Schema.idv"; + private readonly IHost _host; private readonly Stream _parquetStream; private readonly ParquetOptions _parquetOptions; private readonly int _columnChunkReadSize; private readonly Column[] _columnsLoaded; - private readonly DataSet _schemaDataSet; private const int _defaultColumnChunkReadSize = 1000000; private bool _disposed; + private long? _rowCount; private static VersionInfo GetVersionInfo() { return new VersionInfo( modelSignature: ModelSignature, - verWrittenCur: 0x00010001, // Initial - verReadableCur: 0x00010001, + //verWrittenCur: 0x00010001, // Initial + verWrittenCur: 0x00010002, // Add Schema to Model Context + verReadableCur: 0x00010002, verWeCanReadBack: 0x00010001, loaderSignature: LoaderSignature); } - public static ParquetLoader Create(IHostEnvironment env, ModelLoadContext ctx, IMultiStreamSource files) - { - Contracts.CheckValue(env, nameof(env)); - IHost host = env.Register(LoaderName); - - env.CheckValue(ctx, nameof(ctx)); - ctx.CheckAtModel(GetVersionInfo()); - env.CheckValue(files, nameof(files)); - - // *** Binary format *** - // int: cached chunk size - // bool: TreatBigIntegersAsDates flag - - Arguments args = new Arguments - { - ColumnChunkReadSize = ctx.Reader.ReadInt32(), - TreatBigIntegersAsDates = ctx.Reader.ReadBoolean() - }; - return host.Apply("Loading Model", - ch => new ParquetLoader(args, host, OpenStream(files))); - } - public ParquetLoader(IHostEnvironment env, Arguments args, IMultiStreamSource files) : this(env, args, OpenStream(files)) { @@ -165,6 +147,8 @@ private ParquetLoader(Arguments args, IHost host, Stream stream) TreatBigIntegersAsDates = args.TreatBigIntegersAsDates }; + DataSet schemaDataSet; + try { // We only care about the schema so ignore the rows. @@ -173,7 +157,8 @@ private ParquetLoader(Arguments args, IHost host, Stream stream) Count = 0, Offset = 0 }; - _schemaDataSet = ParquetReader.Read(stream, _parquetOptions, readerOptions); + schemaDataSet = ParquetReader.Read(stream, _parquetOptions, readerOptions); + _rowCount = schemaDataSet.TotalRowCount; } catch (Exception ex) { @@ -181,28 +166,103 @@ private ParquetLoader(Arguments args, IHost host, Stream stream) } _columnChunkReadSize = args.ColumnChunkReadSize; - InitColumns(ch, out _columnsLoaded); + _columnsLoaded = InitColumns(schemaDataSet); Schema = CreateSchema(_host, _columnsLoaded); } } + private ParquetLoader(IHost host, ModelLoadContext ctx, IMultiStreamSource files) + { + Contracts.AssertValue(host); + _host = host; + _host.AssertValue(ctx); + _host.AssertValue(files); + + // *** Binary format *** + // int: cached chunk size + // bool: TreatBigIntegersAsDates flag + // Schema of the loader (0x00010002) + + _columnChunkReadSize = ctx.Reader.ReadInt32(); + bool treatBigIntegersAsDates = ctx.Reader.ReadBoolean(); + + if (ctx.Header.ModelVerWritten >= 0x00010002) + { + // Load the schema + byte[] buffer = null; + if (!ctx.TryLoadBinaryStream(SchemaCtxName, r => buffer = r.ReadByteArray())) + throw _host.ExceptDecode(); + var strm = new MemoryStream(buffer, writable: false); + var loader = new BinaryLoader(_host, new BinaryLoader.Arguments(), strm); + Schema = loader.Schema; + } + + // Only load Parquest related data if a file is present. Otherwise, just the Schema is valid. + if (files.Count > 0) + { + _parquetOptions = new ParquetOptions() + { + TreatByteArrayAsString = true, + TreatBigIntegersAsDates = treatBigIntegersAsDates + }; + + _parquetStream = OpenStream(files); + DataSet schemaDataSet; + + try + { + // We only care about the schema so ignore the rows. + ReaderOptions readerOptions = new ReaderOptions() + { + Count = 0, + Offset = 0 + }; + schemaDataSet = ParquetReader.Read(_parquetStream, _parquetOptions, readerOptions); + _rowCount = schemaDataSet.TotalRowCount; + } + catch (Exception ex) + { + throw new InvalidDataException("Cannot read Parquet file", ex); + } + + _columnsLoaded = InitColumns(schemaDataSet); + Schema = CreateSchema(_host, _columnsLoaded); + } + else if (Schema == null) + { + throw _host.Except("Parquet loader must be created with one file"); + } + } + + public static ParquetLoader Create(IHostEnvironment env, ModelLoadContext ctx, IMultiStreamSource files) + { + Contracts.CheckValue(env, nameof(env)); + IHost host = env.Register(LoaderName); + + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + env.CheckValue(files, nameof(files)); + + return host.Apply("Loading Model", + ch => new ParquetLoader(host, ctx, files)); + } + /// /// Helper function called by the ParquetLoader constructor to initialize the Columns that belong in the Parquet file. /// Composite data fields are flattened; for example, a Map Field in Parquet is flattened into a Key column and a Value /// column. /// - /// Communication channel for error reporting. - /// The array of flattened columns instantiated from the parquet file. - private void InitColumns(IChannel ch, out Column[] cols) + /// The schema data set. + /// The array of flattened columns instantiated from the parquet file. + private Column[] InitColumns(DataSet dataSet) { - cols = null; List columnsLoaded = new List(); - foreach (var parquetField in _schemaDataSet.Schema.Fields) + foreach (var parquetField in dataSet.Schema.Fields) { FlattenFields(parquetField, ref columnsLoaded, false); } - cols = columnsLoaded.ToArray(); + return columnsLoaded.ToArray(); } private void FlattenFields(Field field, ref List cols, bool isRepeatable) @@ -239,7 +299,7 @@ private void FlattenFields(Field field, ref List cols, bool isRepeatable } else { - throw new InvalidDataException("Encountered unknown Parquet field type(Currently recognizes data, map, list, and struct)."); + throw _host.ExceptNotSupp("Encountered unknown Parquet field type(Currently recognizes data, map, list, and struct)."); } } @@ -326,7 +386,7 @@ private static Stream OpenStream(string filename) public long? GetRowCount(bool lazy = true) { - return _schemaDataSet.TotalRowCount; + return _rowCount; } public IRowCursor GetRowCursor(Func predicate, IRandom rand = null) @@ -353,9 +413,22 @@ public void Save(ModelSaveContext ctx) // *** Binary format *** // int: cached chunk size // bool: TreatBigIntegersAsDates flag + // Schema of the loader ctx.Writer.Write(_columnChunkReadSize); ctx.Writer.Write(_parquetOptions.TreatBigIntegersAsDates); + + // Save the schema + var noRows = new EmptyDataView(_host, Schema); + var saverArgs = new BinarySaver.Arguments(); + saverArgs.Silent = true; + var saver = new BinarySaver(_host, saverArgs); + using (var strm = new MemoryStream()) + { + var allColumns = Enumerable.Range(0, Schema.ColumnCount).ToArray(); + saver.SaveData(strm, noRows, allColumns); + ctx.SaveBinaryStream(SchemaCtxName, w => w.WriteByteArray(strm.ToArray())); + } } private sealed class Cursor : RootCursorBase, IRowCursor @@ -377,6 +450,8 @@ public Cursor(ParquetLoader parent, Func predicate, IRandom rand) : base(parent._host) { Ch.AssertValue(predicate); + Ch.AssertValue(parent._parquetStream); + _loader = parent; _fileStream = parent._parquetStream; _parquetConversions = new ParquetConversions(Ch); diff --git a/src/Microsoft.ML.PipelineInference/AutoInference.cs b/src/Microsoft.ML.PipelineInference/AutoInference.cs index 2c94c58348..54e95e595d 100644 --- a/src/Microsoft.ML.PipelineInference/AutoInference.cs +++ b/src/Microsoft.ML.PipelineInference/AutoInference.cs @@ -51,67 +51,6 @@ public class LevelDependencyMap : Dictionary public class DependencyMap : Dictionary { } - /// - /// AutoInference will support metrics as they are added here. - /// - public sealed class SupportedMetric - { - public static readonly SupportedMetric Auc = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Auc, true); - public static readonly SupportedMetric AccuracyMicro = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AccuracyMicro, true); - public static readonly SupportedMetric AccuracyMacro = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AccuracyMacro, true); - public static readonly SupportedMetric L1 = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.L1, false); - public static readonly SupportedMetric L2 = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.L2, false); - public static readonly SupportedMetric F1 = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.F1, true); - public static readonly SupportedMetric AuPrc = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AuPrc, true); - public static readonly SupportedMetric TopKAccuracy = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.TopKAccuracy, true); - public static readonly SupportedMetric Rms = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Rms, false); - public static readonly SupportedMetric LossFn = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.LossFn, false); - public static readonly SupportedMetric RSquared = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.RSquared, false); - public static readonly SupportedMetric LogLoss = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.LogLoss, false); - public static readonly SupportedMetric LogLossReduction = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.LogLossReduction, true); - public static readonly SupportedMetric Ndcg = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Ndcg, true); - public static readonly SupportedMetric Dcg = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Dcg, true); - public static readonly SupportedMetric PositivePrecision = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.PositivePrecision, true); - public static readonly SupportedMetric PositiveRecall = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.PositiveRecall, true); - public static readonly SupportedMetric NegativePrecision = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.NegativePrecision, true); - public static readonly SupportedMetric NegativeRecall = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.NegativeRecall, true); - public static readonly SupportedMetric DrAtK = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.DrAtK, true); - public static readonly SupportedMetric DrAtPFpr = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.DrAtPFpr, true); - public static readonly SupportedMetric DrAtNumPos = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.DrAtNumPos, true); - public static readonly SupportedMetric NumAnomalies = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.NumAnomalies, true); - public static readonly SupportedMetric ThreshAtK = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.ThreshAtK, false); - public static readonly SupportedMetric ThreshAtP = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.ThreshAtP, false); - public static readonly SupportedMetric ThreshAtNumPos = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.ThreshAtNumPos, false); - public static readonly SupportedMetric Nmi = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Nmi, true); - public static readonly SupportedMetric AvgMinScore = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AvgMinScore, false); - public static readonly SupportedMetric Dbi = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Dbi, false); - - public string Name { get; } - public bool IsMaximizing { get; } - - private SupportedMetric(string name, bool isMaximizing) - { - Name = name; - IsMaximizing = isMaximizing; - } - - public static SupportedMetric ByName(string name) - { - var fields = - typeof(SupportedMetric).GetFields(BindingFlags.Static | BindingFlags.Public); - - foreach (var field in fields) - { - var metric = (SupportedMetric)field.GetValue(Auc); - if (name.Equals(metric.Name, StringComparison.OrdinalIgnoreCase)) - return metric; - } - throw new NotSupportedException($"Metric '{name}' not supported."); - } - - public override string ToString() => Name; - } - /// /// Class for encapsulating an entrypoint experiment graph /// and keeping track of the input and output nodes. @@ -123,22 +62,24 @@ public class EntryPointGraphDef /// /// Get the name of the variable asssigned to the Data or Training Data input, based on what is the first node of the subgraph. - /// A better way to do this would be with a ICanBeSubGraphFirstNode common interface between ITransformInput and ITrainerInputs - /// and a custom deserializer. + /// A better way to do this would be with a ICanBeSubGraphFirstNode common interface between ITransformInput and ITrainerInputs + /// and a custom deserializer. /// public string GetSubgraphFirstNodeDataVarName(IExceptionContext ectx) { var nodes = Graph.GetNodes(); - ectx.CheckValue(nodes, nameof(nodes), "Empty Subgraph"); - ectx.CheckValue(nodes[0], nameof(nodes), "Empty Subgraph"); - ectx.CheckValue(nodes[0][FieldNames.Inputs], "Inputs", "Empty subgraph node inputs."); + ectx.Check(nodes != null || nodes.Count == 0, "Empty Subgraph"); + ectx.Check(nodes[0] != null, "Subgraph's first note is empty"); + ectx.Check(nodes[0][FieldNames.Inputs] != null, "Empty subgraph node inputs."); string variableName; if (!GetDataVariableName(ectx, "Data", nodes[0][FieldNames.Inputs], out variableName)) GetDataVariableName(ectx, "TrainingData", nodes[0][FieldNames.Inputs], out variableName); - ectx.CheckNonEmpty(variableName, nameof(variableName), "Subgraph needs to start with an ITransformInput, or an ITrainerInput. Check your subgraph, or account for variation of the name of the Data input here."); + ectx.CheckNonEmpty(variableName, nameof(variableName), "Subgraph needs to start with an" + + nameof(CommonInputs.ITransformInput) + ", or an " + nameof(CommonInputs.ITrainerInput) + + ". Check your subgraph, or account for variation of the name of the Data input here."); return variableName; } @@ -167,26 +108,6 @@ private bool GetDataVariableName(IExceptionContext ectx, string nameOfData, JTok } } - /// - /// Class containing some information about an exectuted pipeline. - /// These are analogous to IRunResult for smart sweepers. - /// - public sealed class RunSummary - { - public double MetricValue { get; } - public double TrainingMetricValue { get; } - public int NumRowsInTraining { get; } - public long RunTimeMilliseconds { get; } - - public RunSummary(double metricValue, int numRows, long runTimeMilliseconds, double trainingMetricValue) - { - MetricValue = metricValue; - TrainingMetricValue = trainingMetricValue; - NumRowsInTraining = numRows; - RunTimeMilliseconds = runTimeMilliseconds; - } - } - [TlcModule.ComponentKind("AutoMlStateBase")] public interface ISupportAutoMlStateFactory : IComponentFactory { } @@ -208,6 +129,7 @@ public sealed class AutoMlMlState : IMlState private TransformInference.SuggestedTransform[] _availableTransforms; private RecipeInference.SuggestedRecipe.SuggestedLearner[] _availableLearners; private DependencyMap _dependencyMapping; + private RoleMappedData _dataRoles; public IPipelineOptimizer AutoMlEngine { get; set; } public PipelinePattern[] BatchCandidates { get; set; } public SupportedMetric Metric { get; } @@ -217,42 +139,8 @@ public sealed class AutoMlMlState : IMlState Desc = "State of an AutoML search and search space.")] public sealed class Arguments : ISupportAutoMlStateFactory { - // REVIEW: These should be the same as SupportedMetrics above. Not sure how to reference that class, - // without the C# API generator trying to create a version of that class in the API as well. - public enum Metrics - { - Auc, - AccuracyMicro, - AccuracyMacro, - L2, - F1, - AuPrc, - TopKAccuracy, - Rms, - LossFn, - RSquared, - LogLoss, - LogLossReduction, - Ndcg, - Dcg, - PositivePrecision, - PositiveRecall, - NegativePrecision, - NegativeRecall, - DrAtK, - DrAtPFpr, - DrAtNumPos, - NumAnomalies, - ThreshAtK, - ThreshAtP, - ThreshAtNumPos, - Nmi, - AvgMinScore, - Dbi - }; - [Argument(ArgumentType.Required, HelpText = "Supported metric for evaluator.", ShortName = "metric")] - public Metrics Metric; + public PipelineSweeperSupportedMetrics.Metrics Metric; [Argument(ArgumentType.Required, HelpText = "AutoML engine (pipeline optimizer) that generates next candidates.", ShortName = "engine")] public ISupportIPipelineOptimizerFactory Engine; @@ -270,7 +158,9 @@ public enum Metrics } public AutoMlMlState(IHostEnvironment env, Arguments args) - : this(env, SupportedMetric.ByName(Enum.GetName(typeof(Arguments.Metrics), args.Metric)), args.Engine.CreateComponent(env), + : this(env, + PipelineSweeperSupportedMetrics.GetSupportedMetric(args.Metric), + args.Engine.CreateComponent(env), args.TerminatorArgs.CreateComponent(env), args.TrainerKind, requestedLearners: args.RequestedLearners) { } @@ -313,7 +203,7 @@ private void MainLearningLoop(int batchSize, int numOfTrainingRows) var currentBatchSize = batchSize; if (_terminator is IterationTerminator itr) currentBatchSize = Math.Min(itr.RemainingIterations(_history), batchSize); - var candidates = AutoMlEngine.GetNextCandidates(_sortedSampledElements.Values, currentBatchSize); + var candidates = AutoMlEngine.GetNextCandidates(_sortedSampledElements.Values, currentBatchSize, _dataRoles); // Break if no candidates returned, means no valid pipeline available. if (candidates.Length == 0) @@ -354,8 +244,7 @@ private void ProcessPipeline(Sweeper.Algorithms.SweeperProbabilityUtils utils, S testMetricVal += 1e-10; // Save performance score - candidate.PerformanceSummary = - new RunSummary(testMetricVal, randomizedNumberOfRows, stopwatch.ElapsedMilliseconds, trainMetricVal); + candidate.PerformanceSummary = new PipelineSweeperRunSummary(testMetricVal, randomizedNumberOfRows, stopwatch.ElapsedMilliseconds, trainMetricVal); _sortedSampledElements.Add(candidate.PerformanceSummary.MetricValue, candidate); _history.Add(candidate); } @@ -370,7 +259,7 @@ private TransformInference.SuggestedTransform[] InferAndFilter(IDataView data, T TransformInference.SuggestedTransform[] existingTransforms = null) { // Infer transforms using experts - var levelTransforms = TransformInference.InferTransforms(_env, data, args); + var levelTransforms = TransformInference.InferTransforms(_env, data, args, _dataRoles); // Retain only those transforms inferred which were also passed in. if (existingTransforms != null) @@ -378,11 +267,13 @@ private TransformInference.SuggestedTransform[] InferAndFilter(IDataView data, T return levelTransforms; } - public void InferSearchSpace(int numTransformLevels) + public void InferSearchSpace(int numTransformLevels, RoleMappedData dataRoles = null) { var learners = RecipeInference.AllowedLearners(_env, TrainerKind).ToArray(); if (_requestedLearners != null && _requestedLearners.Length > 0) learners = learners.Where(l => _requestedLearners.Contains(l.LearnerName)).ToArray(); + + _dataRoles = dataRoles; ComputeSearchSpace(numTransformLevels, learners, (b, c) => InferAndFilter(b, c)); } @@ -521,6 +412,21 @@ public void AddEvaluated(PipelinePattern pipeline) d += 1e-3; _sortedSampledElements.Add(d, pipeline); _history.Add(pipeline); + + using (var ch = _host.Start("Suggested Pipeline")) + { + ch.Info($"PipelineSweeper Iteration Number : {_history.Count}"); + ch.Info($"PipelineSweeper Pipeline Id : {pipeline.UniqueId}"); + + foreach (var transform in pipeline.Transforms) + { + ch.Info($"PipelineSweeper Transform : {transform.Transform}"); + } + + ch.Info($"PipelineSweeper Learner : {pipeline.Learner}"); + ch.Info($"PipelineSweeper Train Metric Value : {pipeline.PerformanceSummary.TrainingMetricValue}"); + ch.Info($"PipelineSweeper Test Metric Value : {pipeline.PerformanceSummary.MetricValue}"); + } } public void AddEvaluated(PipelinePattern[] pipelines) @@ -536,7 +442,8 @@ public PipelinePattern[] GetNextCandidates(int numberOfCandidates) var currentBatchSize = numberOfCandidates; if (_terminator is IterationTerminator itr) currentBatchSize = Math.Min(itr.RemainingIterations(_history), numberOfCandidates); - BatchCandidates = AutoMlEngine.GetNextCandidates(_sortedSampledElements.Select(kvp => kvp.Value), currentBatchSize); + BatchCandidates = AutoMlEngine.GetNextCandidates(_sortedSampledElements.Select(kvp => kvp.Value), currentBatchSize, _dataRoles); + return BatchCandidates; } @@ -557,7 +464,7 @@ public void ClearEvaluatedPipelines() /// /// The InferPipelines methods are just public portals to the internal function that handle different /// types of data being passed in: training IDataView, path to training file, or train and test files. - /// + /// public static AutoMlMlState InferPipelines(IHostEnvironment env, PipelineOptimizerBase autoMlEngine, IDataView trainData, IDataView testData, int numTransformLevels, int batchSize, SupportedMetric metric, out PipelinePattern bestPipeline, ITerminator terminator, MacroUtils.TrainerKinds trainerKind) @@ -578,7 +485,7 @@ public static AutoMlMlState InferPipelines(IHostEnvironment env, PipelineOptimiz { Contracts.CheckValue(env, nameof(env)); - // REVIEW: Should be able to infer schema by itself, without having to + // REVIEW: Should be able to infer schema by itself, without having to // infer recipes. Look into this. // Set loader settings through inference RecipeInference.InferRecipesFromData(env, trainDataPath, schemaDefinitionFile, diff --git a/src/Microsoft.ML.PipelineInference/AutoMlEngines/DefaultsEngine.cs b/src/Microsoft.ML.PipelineInference/AutoMlEngines/DefaultsEngine.cs index 1d106e4cef..929dec86cf 100644 --- a/src/Microsoft.ML.PipelineInference/AutoMlEngines/DefaultsEngine.cs +++ b/src/Microsoft.ML.PipelineInference/AutoMlEngines/DefaultsEngine.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.EntryPoints; using Microsoft.ML.Runtime.PipelineInference; @@ -33,9 +34,10 @@ public DefaultsEngine(IHostEnvironment env, Arguments args) _currentLearnerIndex = 0; } - public override PipelinePattern[] GetNextCandidates(IEnumerable history, int numCandidates) + public override PipelinePattern[] GetNextCandidates(IEnumerable history, int numCandidates, RoleMappedData dataRoles) { var candidates = new List(); + DataRoles = dataRoles; while (candidates.Count < numCandidates) { @@ -53,7 +55,8 @@ public override PipelinePattern[] GetNextCandidates(IEnumerable do { // Make sure transforms set is valid. Repeat until passes verifier. - pipeline = new PipelinePattern(SampleTransforms(out var transformsBitMask), learner, "", Env); + pipeline = new PipelinePattern(SampleTransforms(out var transformsBitMask), + learner, "", Env); valid = PipelineVerifier(pipeline, transformsBitMask); count++; } while (!valid && count <= 1000); @@ -77,7 +80,7 @@ private TransformInference.SuggestedTransform[] SampleTransforms(out long transf // Add final features concat transform. sampledTransforms.AddRange(AutoMlUtils.GetFinalFeatureConcat(Env, FullyTransformedData, - DependencyMapping, sampledTransforms.ToArray(), AvailableTransforms)); + DependencyMapping, sampledTransforms.ToArray(), AvailableTransforms, DataRoles)); return sampledTransforms.ToArray(); } diff --git a/src/Microsoft.ML.PipelineInference/AutoMlEngines/RocketEngine.cs b/src/Microsoft.ML.PipelineInference/AutoMlEngines/RocketEngine.cs index 80388eb53e..867c53053e 100644 --- a/src/Microsoft.ML.PipelineInference/AutoMlEngines/RocketEngine.cs +++ b/src/Microsoft.ML.PipelineInference/AutoMlEngines/RocketEngine.cs @@ -165,7 +165,7 @@ private TransformInference.SuggestedTransform[] SampleTransforms(RecipeInference } } - // Take average mass as weight, and take convex combination of + // Take average mass as weight, and take convex combination of // learner-specific weight and unconditioned weight. allWeight /= allCounts > 0 ? allCounts : 1; learnerWeight /= learnerCounts > 0 ? learnerCounts : 1; @@ -182,12 +182,12 @@ private TransformInference.SuggestedTransform[] SampleTransforms(RecipeInference sampledTransforms.AddRange(remainingAvailableTransforms.Where(t => AutoMlUtils.AtomicGroupPresent(mask, t.AtomicGroupId))); - // Add final features concat transform. NOTE: computed bitmask should always - // exclude the final features concat. If we forget to exclude that one, will - // cause an error in verification, since it isn't included in the original + // Add final features concat transform. NOTE: computed bitmask should always + // exclude the final features concat. If we forget to exclude that one, will + // cause an error in verification, since it isn't included in the original // dependency mapping (i.e., its level isn't in the dictionary). sampledTransforms.AddRange(AutoMlUtils.GetFinalFeatureConcat(Env, FullyTransformedData, - DependencyMapping, sampledTransforms.ToArray(), AvailableTransforms)); + DependencyMapping, sampledTransforms.ToArray(), AvailableTransforms, DataRoles)); transformsBitMask = mask; return sampledTransforms.ToArray(); @@ -202,9 +202,10 @@ private RecipeInference.SuggestedRecipe.SuggestedLearner[] GetTopLearners(IEnume .Select(t=>AvailableLearners[t.Index]).ToArray(); } - public override PipelinePattern[] GetNextCandidates(IEnumerable history, int numCandidates) + public override PipelinePattern[] GetNextCandidates(IEnumerable history, int numCandidates, RoleMappedData dataRoles) { var prevCandidates = history.ToArray(); + DataRoles = dataRoles; switch (_currentStage) { @@ -216,11 +217,11 @@ public override PipelinePattern[] GetNextCandidates(IEnumerable var remainingNum = Math.Min(numStageOneTrials - prevCandidates.Length, numCandidates); if (remainingNum < 1) { - // Select top k learners, update stage, then get requested + // Select top k learners, update stage, then get requested // number of candidates, using second stage logic. UpdateLearners(GetTopLearners(prevCandidates)); _currentStage++; - return GetNextCandidates(prevCandidates, numCandidates); + return GetNextCandidates(prevCandidates, numCandidates, DataRoles); } else return GetInitialPipelines(prevCandidates, remainingNum); @@ -252,9 +253,11 @@ public override PipelinePattern[] GetNextCandidates(IEnumerable } } - private PipelinePattern[] GetInitialPipelines(IEnumerable history, int numCandidates) => - _secondaryEngines[_randomInit ? nameof(UniformRandomEngine) : nameof(DefaultsEngine)] - .GetNextCandidates(history, numCandidates); + private PipelinePattern[] GetInitialPipelines(IEnumerable history, int numCandidates) + { + var engine = _secondaryEngines[_randomInit ? nameof(UniformRandomEngine) : nameof(DefaultsEngine)]; + return engine.GetNextCandidates(history, numCandidates, DataRoles); + } private PipelinePattern[] NextCandidates(PipelinePattern[] history, int numCandidates, bool defaultHyperParams = false, bool uniformRandomTransforms = false) @@ -292,10 +295,11 @@ private PipelinePattern[] NextCandidates(PipelinePattern[] history, int numCandi AutoMlUtils.PopulateSweepableParams(learner); do - { // Make sure transforms set is valid and have not seen pipeline before. + { // Make sure transforms set is valid and have not seen pipeline before. // Repeat until passes or runs out of chances. - pipeline = new PipelinePattern(SampleTransforms(learner, history, - out var transformsBitMask, uniformRandomTransforms), learner, "", Env); + pipeline = new PipelinePattern( + SampleTransforms(learner, history, out var transformsBitMask, uniformRandomTransforms), + learner, "", Env); hashKey = GetHashKey(transformsBitMask, learner); valid = PipelineVerifier(pipeline, transformsBitMask) && !VisitedPipelines.Contains(hashKey); count++; diff --git a/src/Microsoft.ML.PipelineInference/AutoMlEngines/UniformRandomEngine.cs b/src/Microsoft.ML.PipelineInference/AutoMlEngines/UniformRandomEngine.cs index 9f304312c2..2ad0137fe9 100644 --- a/src/Microsoft.ML.PipelineInference/AutoMlEngines/UniformRandomEngine.cs +++ b/src/Microsoft.ML.PipelineInference/AutoMlEngines/UniformRandomEngine.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.EntryPoints; using Microsoft.ML.Runtime.PipelineInference; @@ -13,9 +14,9 @@ namespace Microsoft.ML.Runtime.PipelineInference { /// - /// Example class of an autoML engine (a pipeline optimizer) that simply tries random enumeration. - /// If we use a third-party solution for autoML, we can just implement a new wrapper for it as a - /// PipelineOptimizerBase, and use our existing autoML body code to take advantage of it. This design + /// Example class of an autoML engine (a pipeline optimizer) that simply tries random enumeration. + /// If we use a third-party solution for autoML, we can just implement a new wrapper for it as a + /// PipelineOptimizerBase, and use our existing autoML body code to take advantage of it. This design /// should allow for easy development of new autoML methods. /// public sealed class UniformRandomEngine : PipelineOptimizerBase @@ -30,8 +31,9 @@ public UniformRandomEngine(IHostEnvironment env) : base(env, env.Register("UniformRandomEngine(AutoML)")) {} - public override PipelinePattern[] GetNextCandidates(IEnumerable history, int numberOfCandidates) + public override PipelinePattern[] GetNextCandidates(IEnumerable history, int numberOfCandidates, RoleMappedData dataRoles) { + DataRoles = dataRoles; return GetRandomPipelines(numberOfCandidates); } @@ -66,7 +68,7 @@ private PipelinePattern[] GetRandomPipelines(int numOfPipelines) // Always include features concat transform selectedTransforms.AddRange(AutoMlUtils.GetFinalFeatureConcat(Env, FullyTransformedData, - DependencyMapping, selectedTransforms.ToArray(), AvailableTransforms)); + DependencyMapping, selectedTransforms.ToArray(), AvailableTransforms, DataRoles)); // Compute hash key for checking if we've already seen this pipeline. // However, if we keep missing, don't want to get stuck in infinite loop. diff --git a/src/Microsoft.ML.PipelineInference/AutoMlUtils.cs b/src/Microsoft.ML.PipelineInference/AutoMlUtils.cs index 6aec714618..a8459c5b3c 100644 --- a/src/Microsoft.ML.PipelineInference/AutoMlUtils.cs +++ b/src/Microsoft.ML.PipelineInference/AutoMlUtils.cs @@ -38,11 +38,15 @@ public static double ExtractValueFromIdv(IHostEnvironment env, IDataView result, return outputValue; } - public static AutoInference.RunSummary ExtractRunSummary(IHostEnvironment env, IDataView result, string metricColumnName, IDataView trainResult = null) + public static PipelineSweeperRunSummary ExtractRunSummary(IHostEnvironment env, IDataView result, string metricColumnName, IDataView trainResult = null) { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(result, nameof(result)); + env.CheckNonEmpty(metricColumnName, nameof(metricColumnName)); + double testingMetricValue = ExtractValueFromIdv(env, result, metricColumnName); double trainingMetricValue = trainResult != null ? ExtractValueFromIdv(env, trainResult, metricColumnName) : double.MinValue; - return new AutoInference.RunSummary(testingMetricValue, 0, 0, trainingMetricValue); + return new PipelineSweeperRunSummary(testingMetricValue, 0, 0, trainingMetricValue); } public static CommonInputs.IEvaluatorInput CloneEvaluatorInstance(CommonInputs.IEvaluatorInput evalInput) => @@ -63,8 +67,8 @@ private static T CloneEvaluatorInstance(T evaler) /// /// Using the dependencyMapping and included transforms, determines whether every - /// transform present only consumes columns produced by a lower- or same-level transform, - /// or existed in the original dataset. Note, a column could be produced by a + /// transform present only consumes columns produced by a lower- or same-level transform, + /// or existed in the original dataset. Note, a column could be produced by a /// transform on the same level, such as in multipart (atomic group) transforms. /// public static bool AreColumnsConsistent(TransformInference.SuggestedTransform[] includedTransforms, @@ -169,8 +173,8 @@ private static int[] GetExcludedColumnIndices(TransformInference.SuggestedTransf { List includedColumnIndices = new List(); - // For every column, see if either present in initial dataset, or - // produced by a transform used in current pipeline. + // For every column, see if either present in initial dataset, or + // produced by a transform used in current pipeline. for (int columnIndex = 0; columnIndex < dataSample.Schema.ColumnCount; columnIndex++) { // Create ColumnInfo object for indexing dictionary @@ -181,7 +185,7 @@ private static int[] GetExcludedColumnIndices(TransformInference.SuggestedTransf IsHidden = dataSample.Schema.IsHidden(columnIndex) }; - // Exclude all hidden and non-numeric columns + // Exclude all hidden and non-numeric columns if (colInfo.IsHidden || !colInfo.ItemType.IsNumber) continue; @@ -257,7 +261,7 @@ public static long TransformsToBitmask(TransformInference.SuggestedTransform[] t /// (In other words, if there would be nothing for that concatenate transform to do.) /// private static TransformInference.SuggestedTransform[] GetFinalFeatureConcat(IHostEnvironment env, - IDataView dataSample, int[] excludedColumnIndices, int level, int atomicIdOffset) + IDataView dataSample, int[] excludedColumnIndices, int level, int atomicIdOffset, RoleMappedData dataRoles) { var finalArgs = new TransformInference.Arguments { @@ -266,7 +270,7 @@ private static TransformInference.SuggestedTransform[] GetFinalFeatureConcat(IHo ExcludedColumnIndices = excludedColumnIndices }; - var featuresConcatTransforms = TransformInference.InferConcatNumericFeatures(env, dataSample, finalArgs); + var featuresConcatTransforms = TransformInference.InferConcatNumericFeatures(env, dataSample, finalArgs, dataRoles); for (int i = 0; i < featuresConcatTransforms.Length; i++) { @@ -282,7 +286,7 @@ private static TransformInference.SuggestedTransform[] GetFinalFeatureConcat(IHo /// public static TransformInference.SuggestedTransform[] GetFinalFeatureConcat(IHostEnvironment env, IDataView data, AutoInference.DependencyMap dependencyMapping, TransformInference.SuggestedTransform[] selectedTransforms, - TransformInference.SuggestedTransform[] allTransforms) + TransformInference.SuggestedTransform[] allTransforms, RoleMappedData dataRoles) { int level = 1; int atomicGroupLimit = 0; @@ -292,7 +296,7 @@ public static TransformInference.SuggestedTransform[] GetFinalFeatureConcat(IHos atomicGroupLimit = allTransforms.Max(t => t.AtomicGroupId) + 1; } var excludedColumnIndices = GetExcludedColumnIndices(selectedTransforms, data, dependencyMapping); - return GetFinalFeatureConcat(env, data, excludedColumnIndices, level, atomicGroupLimit); + return GetFinalFeatureConcat(env, data, excludedColumnIndices, level, atomicGroupLimit, dataRoles); } public static IDataView ApplyTransformSet(IHostEnvironment env, IDataView data, TransformInference.SuggestedTransform[] transforms) @@ -425,7 +429,7 @@ private static void SetValue(PropertyInfo pi, IComparable value, object entryPoi /// /// Updates properties of entryPointObj instance based on the values in sweepParams - /// + /// public static bool UpdateProperties(object entryPointObj, TlcModule.SweepableParamAttribute[] sweepParams) { bool result = true; @@ -480,7 +484,7 @@ public static bool UpdateProperties(object entryPointObj, TlcModule.SweepablePar /// /// Updates properties of entryPointObj instance based on the values in sweepParams - /// + /// public static void PopulateSweepableParams(RecipeInference.SuggestedRecipe.SuggestedLearner learner) { foreach (var param in learner.PipelineNode.SweepParams) @@ -566,14 +570,15 @@ private static ParameterSet ConvertToParameterSet(TlcModule.SweepableParamAttrib return learner.PipelineNode.HyperSweeperParamSet; } - public static IRunResult ConvertToRunResult(RecipeInference.SuggestedRecipe.SuggestedLearner learner, - AutoInference.RunSummary rs, bool isMetricMaximizing) => - new RunResult(ConvertToParameterSet(learner.PipelineNode.SweepParams, learner), rs.MetricValue, isMetricMaximizing); - - public static IRunResult[] ConvertToRunResults(PipelinePattern[] history, bool isMetricMaximizing) => - history.Select(h => - ConvertToRunResult(h.Learner, h.PerformanceSummary, isMetricMaximizing)).ToArray(); + public static IRunResult ConvertToRunResult(RecipeInference.SuggestedRecipe.SuggestedLearner learner, PipelineSweeperRunSummary rs, bool isMetricMaximizing) + { + return new RunResult(ConvertToParameterSet(learner.PipelineNode.SweepParams, learner), rs.MetricValue, isMetricMaximizing); + } + public static IRunResult[] ConvertToRunResults(PipelinePattern[] history, bool isMetricMaximizing) + { + return history.Select(h => ConvertToRunResult(h.Learner, h.PerformanceSummary, isMetricMaximizing)).ToArray(); + } /// /// Method to convert set of sweepable hyperparameters into strings of a format understood /// by the current smart hyperparameter sweepers. diff --git a/src/Microsoft.ML.PipelineInference/ColumnGroupingInference.cs b/src/Microsoft.ML.PipelineInference/ColumnGroupingInference.cs index 7e1c4bfc05..36392c47ac 100644 --- a/src/Microsoft.ML.PipelineInference/ColumnGroupingInference.cs +++ b/src/Microsoft.ML.PipelineInference/ColumnGroupingInference.cs @@ -56,7 +56,7 @@ public InferenceResult(GroupingColumn[] columns) /// Group together the single-valued columns with the same type and purpose and generate column names. /// /// The host environment to use. - /// Whether the original file had a header. + /// Whether the original file had a header. /// If yes, the fields are used to generate the column /// names, otherwise they are ignored. /// The (detected) column types. diff --git a/src/Microsoft.ML.PipelineInference/DatasetFeaturesInference.cs b/src/Microsoft.ML.PipelineInference/DatasetFeaturesInference.cs index e8d40fc6c8..a3a8876c7e 100644 --- a/src/Microsoft.ML.PipelineInference/DatasetFeaturesInference.cs +++ b/src/Microsoft.ML.PipelineInference/DatasetFeaturesInference.cs @@ -14,7 +14,7 @@ namespace Microsoft.ML.Runtime.PipelineInference { /// - /// Featurization ideas inspired from: + /// Featurization ideas inspired from: /// http://aad.informatik.uni-freiburg.de/papers/15-NIPS-auto-sklearn-supplementary.pdf /// public static class DatasetFeatureInference diff --git a/src/Microsoft.ML.PipelineInference/ExperimentsGenerator.cs b/src/Microsoft.ML.PipelineInference/ExperimentsGenerator.cs index 3c7441c87f..c9621029d8 100644 --- a/src/Microsoft.ML.PipelineInference/ExperimentsGenerator.cs +++ b/src/Microsoft.ML.PipelineInference/ExperimentsGenerator.cs @@ -109,15 +109,14 @@ public static List GenerateCandidates(IHostEnvironment env, string dataFi RecipeInference.SuggestedRecipe[] recipes = RecipeInference.InferRecipesFromData(env, dataFile, schemaDefinitionFile, out predictorType, out loaderSettings, out inferenceResult); //get all the trainers for this task, and generate the initial set of candidates. - // Exclude the hidden learners, and the metalinear learners. - var trainers = ComponentCatalog.GetAllDerivedClasses(typeof(ITrainer), predictorType) - .Where(cls => !cls.IsHidden && !typeof(IMetaLinearTrainer).IsAssignableFrom(cls.Type)); + // Exclude the hidden learners, and the metalinear learners. + var trainers = ComponentCatalog.GetAllDerivedClasses(typeof(ITrainer), predictorType).Where(cls => !cls.IsHidden); var loaderSubComponent = new SubComponent("TextLoader", loaderSettings); string loader = $" loader={loaderSubComponent}"; - // REVIEW: there are more learners than recipes atm. - // Flip looping through recipes, than through learners if the cardinality changes. + // REVIEW: there are more learners than recipes atm. + // Flip looping through recipes, than through learners if the cardinality changes. foreach (ComponentCatalog.LoadableClassInfo cl in trainers) { string learnerSettings; diff --git a/src/Microsoft.ML.PipelineInference/InferenceUtils.cs b/src/Microsoft.ML.PipelineInference/InferenceUtils.cs index 8f31a792eb..311e98e75d 100644 --- a/src/Microsoft.ML.PipelineInference/InferenceUtils.cs +++ b/src/Microsoft.ML.PipelineInference/InferenceUtils.cs @@ -83,7 +83,7 @@ public static Type InferPredictorCategoryType(IDataView data, PurposeInference.C label.ItemKind == DataKind.TX || data.Schema.GetColumnType(label.ColumnIndex).IsKey) { - if (columns.Any(col => col.Purpose == ColumnPurpose.GroupId)) + if (columns.Any(col => col.Purpose == ColumnPurpose.Group)) return typeof(SignatureRankerTrainer); else return typeof(SignatureMultiClassClassifierTrainer); @@ -177,7 +177,7 @@ public enum ColumnPurpose CategoricalFeature = 4, TextFeature = 5, Weight = 6, - GroupId = 7, + Group = 7, ImagePath = 8 } } diff --git a/src/Microsoft.ML.PipelineInference/Interfaces/IPipelineOptimizer.cs b/src/Microsoft.ML.PipelineInference/Interfaces/IPipelineOptimizer.cs index 84603fc017..00d7654c25 100644 --- a/src/Microsoft.ML.PipelineInference/Interfaces/IPipelineOptimizer.cs +++ b/src/Microsoft.ML.PipelineInference/Interfaces/IPipelineOptimizer.cs @@ -21,7 +21,7 @@ namespace Microsoft.ML.Runtime.PipelineInference /// public interface IPipelineOptimizer { - PipelinePattern[] GetNextCandidates(IEnumerable history, int numberOfCandidates); + PipelinePattern[] GetNextCandidates(IEnumerable history, int numberOfCandidates, RoleMappedData dataRoles); void SetSpace(TransformInference.SuggestedTransform[] availableTransforms, RecipeInference.SuggestedRecipe.SuggestedLearner[] availableLearners, @@ -44,6 +44,7 @@ public abstract class PipelineOptimizerBase : IPipelineOptimizer protected IDataView OriginalData; protected IDataView FullyTransformedData; protected AutoInference.DependencyMap DependencyMapping; + protected RoleMappedData DataRoles; protected readonly IHostEnvironment Env; protected readonly IHost Host; protected readonly Dictionary TransformsMaskValidity; @@ -60,7 +61,7 @@ protected PipelineOptimizerBase(IHostEnvironment env, IHost host) ProbUtils = new SweeperProbabilityUtils(host); } - public abstract PipelinePattern[] GetNextCandidates(IEnumerable history, int numberOfCandidates); + public abstract PipelinePattern[] GetNextCandidates(IEnumerable history, int numberOfCandidates, RoleMappedData dataRoles); public virtual void SetSpace(TransformInference.SuggestedTransform[] availableTransforms, RecipeInference.SuggestedRecipe.SuggestedLearner[] availableLearners, @@ -142,7 +143,7 @@ protected void SampleHyperparameters(RecipeInference.SuggestedRecipe.SuggestedLe var proposedParamSet = sweeper.ProposeSweeps(1, AutoMlUtils.ConvertToRunResults(history, isMaximizingMetric)).First(); Env.Assert(proposedParamSet != null && proposedParamSet.All(ps => hyperParams.Any(hp => hp.Name == ps.Name))); - // Associate proposed param set with learner, so that smart hyperparam + // Associate proposed param set with learner, so that smart hyperparam // sweepers (like KDO) can map them back. learner.PipelineNode.HyperSweeperParamSet = proposedParamSet; diff --git a/src/Microsoft.ML.PipelineInference/Interfaces/ITerminator.cs b/src/Microsoft.ML.PipelineInference/Interfaces/ITerminator.cs index ce51e91031..488c21fc74 100644 --- a/src/Microsoft.ML.PipelineInference/Interfaces/ITerminator.cs +++ b/src/Microsoft.ML.PipelineInference/Interfaces/ITerminator.cs @@ -7,9 +7,9 @@ namespace Microsoft.ML.Runtime.PipelineInference { /// - /// Interface defining various stopping criteria for pipeline sweeps. + /// Interface defining various stopping criteria for pipeline sweeps. /// This could include number of total iterations, compute time, - /// budget expended, etc. + /// budget expended, etc. /// public interface ITerminator { diff --git a/src/Microsoft.ML.PipelineInference/Macros/PipelineSweeperMacro.cs b/src/Microsoft.ML.PipelineInference/Macros/PipelineSweeperMacro.cs index 06c260a054..2f70645d8b 100644 --- a/src/Microsoft.ML.PipelineInference/Macros/PipelineSweeperMacro.cs +++ b/src/Microsoft.ML.PipelineInference/Macros/PipelineSweeperMacro.cs @@ -36,6 +36,30 @@ public sealed class Arguments [Argument(ArgumentType.AtMostOnce, HelpText = "Output datasets from previous iteration of sweep.", SortOrder = 7, Hide = true)] public IDataView[] CandidateOutputs; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'Label'", SortOrder = 8)] + public string[] LabelColumns; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'Group'", SortOrder = 9)] + public string[] GroupColumns; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'Weight'", SortOrder = 10)] + public string[] WeightColumns; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'Name'", SortOrder = 11)] + public string[] NameColumns; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'NumericFeature'", SortOrder = 12)] + public string[] NumericFeatureColumns; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'CategoricalFeature'", SortOrder = 13)] + public string[] CategoricalFeatureColumns; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'TextFeature'", SortOrder = 14)] + public string[] TextFeatureColumns; + + [Argument(ArgumentType.MultipleUnique, HelpText = "Column(s) to use as Role 'ImagePath'", SortOrder = 15)] + public string[] ImagePathColumns; } public sealed class Output @@ -88,6 +112,77 @@ public static Output ExtractSweepResult(IHostEnvironment env, ResultInput input) return new Output { Results = outputView, State = autoMlState }; } + private static RoleMappedData GetDataRoles(IHostEnvironment env, Arguments input) + { + var roles = new List>(); + + if (input.LabelColumns != null) + { + env.Check(input.LabelColumns.Length == 1, "LabelColumns expected one column name to be specified."); + roles.Add(RoleMappedSchema.ColumnRole.Label.Bind(input.LabelColumns[0])); + } + + if (input.GroupColumns != null) + { + env.Check(input.GroupColumns.Length == 1, "GroupColumns expected one column name to be specified."); + roles.Add(RoleMappedSchema.ColumnRole.Group.Bind(input.GroupColumns[0])); + } + + if (input.WeightColumns != null) + { + env.Check(input.WeightColumns.Length == 1, "WeightColumns expected one column name to be specified."); + roles.Add(RoleMappedSchema.ColumnRole.Weight.Bind(input.WeightColumns[0])); + } + + if (input.NameColumns != null) + { + env.Check(input.NameColumns.Length == 1, "NameColumns expected one column name to be specified."); + roles.Add(RoleMappedSchema.ColumnRole.Name.Bind(input.NameColumns[0])); + } + + if (input.NumericFeatureColumns != null) + { + var numericFeature = new RoleMappedSchema.ColumnRole(ColumnPurpose.NumericFeature.ToString()); + foreach (var colName in input.NumericFeatureColumns) + { + var item = numericFeature.Bind(colName); + roles.Add(item); + } + } + + if (input.CategoricalFeatureColumns != null) + { + var categoricalFeature = new RoleMappedSchema.ColumnRole(ColumnPurpose.CategoricalFeature.ToString()); + foreach (var colName in input.CategoricalFeatureColumns) + { + var item = categoricalFeature.Bind(colName); + roles.Add(item); + } + } + + if (input.TextFeatureColumns != null) + { + var textFeature = new RoleMappedSchema.ColumnRole(ColumnPurpose.TextFeature.ToString()); + foreach (var colName in input.TextFeatureColumns) + { + var item = textFeature.Bind(colName); + roles.Add(item); + } + } + + if (input.ImagePathColumns != null) + { + var imagePath = new RoleMappedSchema.ColumnRole(ColumnPurpose.ImagePath.ToString()); + foreach (var colName in input.ImagePathColumns) + { + var item = imagePath.Bind(colName); + roles.Add(item); + } + } + + return new RoleMappedData(input.TrainingData, roles); + } + [TlcModule.EntryPoint(Desc = "AutoML pipeline sweeping optimzation macro.", Name = "Models.PipelineSweeper")] public static CommonOutputs.MacroOutput PipelineSweep( IHostEnvironment env, @@ -98,6 +193,9 @@ public static CommonOutputs.MacroOutput PipelineSweep( "Must have a valid AutoML State, or pass arguments to create one."); env.Check(input.BatchSize > 0, "Batch size must be > 0."); + // Get the user-defined column roles (if any) + var dataRoles = GetDataRoles(env, input); + // If no current state, create object and set data. if (input.State == null) { @@ -113,7 +211,7 @@ public static CommonOutputs.MacroOutput PipelineSweep( } var autoMlState = (AutoInference.AutoMlMlState)input.State; - // The indicators are just so the macro knows those pipelines need to + // The indicators are just so the macro knows those pipelines need to // be run before performing next expansion. If we add them as inputs // to the next iteration, the next iteration cannot run until they have // their values set. Thus, indicators are needed. @@ -133,7 +231,7 @@ public static CommonOutputs.MacroOutput PipelineSweep( // Make sure search space is defined. If not, infer, // with default number of transform levels. if (!autoMlState.IsSearchSpaceDefined()) - autoMlState.InferSearchSpace(numTransformLevels: 1); + autoMlState.InferSearchSpace(numTransformLevels: 1, dataRoles); // Extract performance summaries and assign to previous candidate pipelines. foreach (var pipeline in autoMlState.BatchCandidates) @@ -141,8 +239,7 @@ public static CommonOutputs.MacroOutput PipelineSweep( if (node.Context.TryGetVariable(ExperimentUtils.GenerateOverallMetricVarName(pipeline.UniqueId), out var v) && node.Context.TryGetVariable(AutoMlUtils.GenerateOverallTrainingMetricVarName(pipeline.UniqueId), out var v2)) { - pipeline.PerformanceSummary = - AutoMlUtils.ExtractRunSummary(env, (IDataView)v.Value, autoMlState.Metric.Name, (IDataView)v2.Value); + pipeline.PerformanceSummary = AutoMlUtils.ExtractRunSummary(env, (IDataView)v.Value, autoMlState.Metric.Name, (IDataView)v2.Value); autoMlState.AddEvaluated(pipeline); } } diff --git a/src/Microsoft.ML.PipelineInference/PipelinePattern.cs b/src/Microsoft.ML.PipelineInference/PipelinePattern.cs index 6fdf922a68..02926abb04 100644 --- a/src/Microsoft.ML.PipelineInference/PipelinePattern.cs +++ b/src/Microsoft.ML.PipelineInference/PipelinePattern.cs @@ -55,18 +55,18 @@ public PipelineResultRow(string graphJson, double metricValue, private readonly IHostEnvironment _env; public readonly TransformInference.SuggestedTransform[] Transforms; public readonly RecipeInference.SuggestedRecipe.SuggestedLearner Learner; - public AutoInference.RunSummary PerformanceSummary { get; set; } + public PipelineSweeperRunSummary PerformanceSummary { get; set; } public string LoaderSettings { get; set; } public Guid UniqueId { get; } public PipelinePattern(TransformInference.SuggestedTransform[] transforms, RecipeInference.SuggestedRecipe.SuggestedLearner learner, - string loaderSettings, IHostEnvironment env, AutoInference.RunSummary summary = null) + string loaderSettings, IHostEnvironment env, PipelineSweeperRunSummary summary = null) { // Make sure internal pipeline nodes and sweep params are cloned, not shared. // Cloning the transforms and learner rather than assigning outright - // ensures that this will be the case. Doing this here allows us to not - // worry about changing hyperparameter values in candidate pipelines + // ensures that this will be the case. Doing this here allows us to not + // worry about changing hyperparameter values in candidate pipelines // possibly overwritting other pipelines. Transforms = transforms.Select(t => t.Clone()).ToArray(); Learner = learner.Clone(); @@ -122,7 +122,7 @@ public AutoInference.EntryPointGraphDef ToEntryPointGraph(Experiment experiment /// /// This method will return some indentifying string for the pipeline, - /// based on transforms, learner, and (eventually) hyperparameters. + /// based on transforms, learner, and (eventually) hyperparameters. /// public override string ToString() => $"{Learner}+{string.Join("+", Transforms.Select(t => t.ToString()))}"; @@ -141,7 +141,7 @@ public Experiment CreateTrainTestExperiment(IDataView trainData, IDataView testD Var firstInput = new Var { VarName = graphDef.GetSubgraphFirstNodeDataVarName(_env) }; var finalOutput = graphDef.ModelOutput; - // TrainTestMacro + // TrainTestMacro var trainTestInput = new Models.TrainTestEvaluator { TransformModel = null, @@ -178,7 +178,7 @@ public Models.TrainTestEvaluator.Output AddAsTrainTest(Var trainData, var firstInput = new Var { VarName = graphDef.GetSubgraphFirstNodeDataVarName(_env) }; var finalOutput = graphDef.ModelOutput; - // TrainTestMacro + // TrainTestMacro var trainTestInput = new Models.TrainTestEvaluator { Nodes = subGraph, @@ -205,7 +205,7 @@ public Models.TrainTestEvaluator.Output AddAsTrainTest(Var trainData, /// Runs a train-test experiment on the current pipeline, through entrypoints. /// public void RunTrainTestExperiment(IDataView trainData, IDataView testData, - AutoInference.SupportedMetric metric, MacroUtils.TrainerKinds trainerKind, out double testMetricValue, + SupportedMetric metric, MacroUtils.TrainerKinds trainerKind, out double testMetricValue, out double trainMetricValue) { var experiment = CreateTrainTestExperiment(trainData, testData, trainerKind, true, out var trainTestOutput); @@ -273,7 +273,7 @@ public PipelineResultRow ToResultRow() { var graphDef = ToEntryPointGraph(); - return new PipelineResultRow($"{{'Nodes' : [{graphDef.Graph.ToJsonString()}]}}", + return new PipelineResultRow($"{{\"Nodes\" : [{graphDef.Graph.ToJsonString()}]}}", PerformanceSummary?.MetricValue ?? -1d, UniqueId.ToString("N"), PerformanceSummary?.TrainingMetricValue ?? -1d, graphDef.GetSubgraphFirstNodeDataVarName(_env), diff --git a/src/Microsoft.ML.PipelineInference/PipelineSweeperRunSummary.cs b/src/Microsoft.ML.PipelineInference/PipelineSweeperRunSummary.cs new file mode 100644 index 0000000000..662e08df9f --- /dev/null +++ b/src/Microsoft.ML.PipelineInference/PipelineSweeperRunSummary.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.PipelineInference; +using Microsoft.ML.Runtime.EntryPoints.JsonUtils; +using Newtonsoft.Json.Linq; + +namespace Microsoft.ML.Runtime.PipelineInference +{ + /// + /// Class containing some information about an exectuted pipeline. + /// These are analogous to IRunResult for smart sweepers. + /// + public sealed class PipelineSweeperRunSummary + { + public double MetricValue { get; } + public double TrainingMetricValue { get; } + public int NumRowsInTraining { get; } + public long RunTimeMilliseconds { get; } + + public PipelineSweeperRunSummary(double metricValue, int numRows, long runTimeMilliseconds, double trainingMetricValue) + { + MetricValue = metricValue; + TrainingMetricValue = trainingMetricValue; + NumRowsInTraining = numRows; + RunTimeMilliseconds = runTimeMilliseconds; + } + } +} diff --git a/src/Microsoft.ML.PipelineInference/PipelineSweeperSupportedMetrics.cs b/src/Microsoft.ML.PipelineInference/PipelineSweeperSupportedMetrics.cs new file mode 100644 index 0000000000..accfe9cd14 --- /dev/null +++ b/src/Microsoft.ML.PipelineInference/PipelineSweeperSupportedMetrics.cs @@ -0,0 +1,160 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.EntryPoints.JsonUtils; +using System; + +namespace Microsoft.ML.Runtime.PipelineInference +{ + /// + /// PipelineSweeper will support metrics as they are added here. + /// + public sealed class PipelineSweeperSupportedMetrics + { + public enum Metrics + { + Auc, + AccuracyMicro, + AccuracyMacro, + L1, + L2, + F1, + AuPrc, + TopKAccuracy, + Rms, + LossFn, + RSquared, + LogLoss, + LogLossReduction, + Ndcg, + Dcg, + PositivePrecision, + PositiveRecall, + NegativePrecision, + NegativeRecall, + DrAtK, + DrAtPFpr, + DrAtNumPos, + NumAnomalies, + ThreshAtK, + ThreshAtP, + ThreshAtNumPos, + Nmi, + AvgMinScore, + Dbi + }; + + public static SupportedMetric GetSupportedMetric(Metrics metric) + { + SupportedMetric supportedMetric = null; + switch(metric) + { + case Metrics.Auc: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Auc, true); + break; + case Metrics.AccuracyMicro: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AccuracyMicro, true); + break; + case Metrics.AccuracyMacro: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AccuracyMacro, true); + break; + case Metrics.L1: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.L1, false); + break; + case Metrics.L2: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.L2, false); + break; + case Metrics.F1: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.F1, true); + break; + case Metrics.AuPrc: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AuPrc, true); + break; + case Metrics.TopKAccuracy: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.TopKAccuracy, true); + break; + case Metrics.Rms: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Rms, false); + break; + case Metrics.LossFn: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.LossFn, false); + break; + case Metrics.RSquared: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.RSquared, false); + break; + case Metrics.LogLoss: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.LogLoss, false); + break; + case Metrics.LogLossReduction: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.LogLossReduction, true); + break; + case Metrics.Ndcg: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Ndcg, true); + break; + case Metrics.Dcg: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Dcg, true); + break; + case Metrics.PositivePrecision: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.PositivePrecision, true); + break; + case Metrics.PositiveRecall: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.PositiveRecall, true); + break; + case Metrics.NegativePrecision: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.NegativePrecision, true); + break; + case Metrics.NegativeRecall: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.NegativeRecall, true); + break; + case Metrics.DrAtK: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.DrAtK, true); + break; + case Metrics.DrAtPFpr: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.DrAtPFpr, true); + break; + case Metrics.DrAtNumPos: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.DrAtNumPos, true); + break; + case Metrics.NumAnomalies: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.NumAnomalies, true); + break; + case Metrics.ThreshAtK: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.ThreshAtK, false); + break; + case Metrics.ThreshAtP: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.ThreshAtP, false); + break; + case Metrics.ThreshAtNumPos: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.ThreshAtNumPos, false); + break; + case Metrics.Nmi: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Nmi, true); + break; + case Metrics.AvgMinScore: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.AvgMinScore, false); + break; + case Metrics.Dbi: + supportedMetric = new SupportedMetric(FieldNames.PipelineSweeperSupportedMetrics.Dbi, false); + break; + default: + throw new NotSupportedException($"Metric '{metric}' not supported."); + } + return supportedMetric; + } + } + + public sealed class SupportedMetric + { + public string Name { get; } + public bool IsMaximizing { get; } + + public SupportedMetric(string name, bool isMaximizing) + { + Name = name; + IsMaximizing = isMaximizing; + } + + public override string ToString() => Name; + } +} diff --git a/src/Microsoft.ML.PipelineInference/PurposeInference.cs b/src/Microsoft.ML.PipelineInference/PurposeInference.cs index 7858f1d12b..8e7c32084e 100644 --- a/src/Microsoft.ML.PipelineInference/PurposeInference.cs +++ b/src/Microsoft.ML.PipelineInference/PurposeInference.cs @@ -11,7 +11,7 @@ namespace Microsoft.ML.Runtime.PipelineInference { /// - /// Automatic inference of column purposes for the data view. + /// Automatic inference of column purposes for the data view. /// This is used in the context of text import wizard, but can be used outside as well. /// public static class PurposeInference @@ -51,10 +51,10 @@ public InferenceResult(Column[] columns) } /// - /// The design is the same as for : there's a sequence of 'experts' - /// that each look at all the columns. Every expert may or may not assign the 'answer' (suggested purpose) - /// to a column. If the expert needs some information about the column (for example, the column values), - /// this information is lazily calculated by the column object, not the expert itself, to allow the reuse + /// The design is the same as for : there's a sequence of 'experts' + /// that each look at all the columns. Every expert may or may not assign the 'answer' (suggested purpose) + /// to a column. If the expert needs some information about the column (for example, the column values), + /// this information is lazily calculated by the column object, not the expert itself, to allow the reuse /// of the same information by another expert. /// private interface IPurposeInferenceExpert @@ -147,9 +147,9 @@ public void Apply(IChannel ch, IntermediateColumn[] columns) else if (Regex.IsMatch(column.ColumnName, @"^m_rating$", RegexOptions.IgnoreCase)) column.SuggestedPurpose = ColumnPurpose.Label; else if (Regex.IsMatch(column.ColumnName, @"^m_queryid$", RegexOptions.IgnoreCase)) - column.SuggestedPurpose = ColumnPurpose.GroupId; - else if (Regex.IsMatch(column.ColumnName, @"groupid", RegexOptions.IgnoreCase)) - column.SuggestedPurpose = ColumnPurpose.GroupId; + column.SuggestedPurpose = ColumnPurpose.Group; + else if (Regex.IsMatch(column.ColumnName, @"group", RegexOptions.IgnoreCase)) + column.SuggestedPurpose = ColumnPurpose.Group; else if (Regex.IsMatch(column.ColumnName, @"^m_\w+id$", RegexOptions.IgnoreCase)) column.SuggestedPurpose = ColumnPurpose.Name; else if (Regex.IsMatch(column.ColumnName, @"^id$", RegexOptions.IgnoreCase)) @@ -318,8 +318,10 @@ private static IEnumerable GetExperts() /// The data to use for inference. /// Indices of columns that we're interested in. /// Additional arguments to inference. + /// (Optional) User defined Role mappings for data. /// The result includes the array of auto-detected column purposes. - public static InferenceResult InferPurposes(IHostEnvironment env, IDataView data, IEnumerable columnIndices, Arguments args) + public static InferenceResult InferPurposes(IHostEnvironment env, IDataView data, IEnumerable columnIndices, Arguments args, + RoleMappedData dataRoles = null) { Contracts.CheckValue(env, nameof(env)); var host = env.Register("InferPurposes"); @@ -330,14 +332,25 @@ public static InferenceResult InferPurposes(IHostEnvironment env, IDataView data using (var ch = host.Start("InferPurposes")) { var takenData = data.Take(args.MaxRowsToRead); - var cols = columnIndices.Select(x => new IntermediateColumn(takenData, x)).ToArray(); + var cols = columnIndices.Select(x => new IntermediateColumn(takenData, x)).ToList(); data = takenData; + if (dataRoles != null) + { + var items = dataRoles.Schema.GetColumnRoles(); + foreach(var item in items) + { + Enum.TryParse(item.Key.Value, out ColumnPurpose purpose); + var col = cols.Find(x => x.ColumnName == item.Value.Name); + col.SuggestedPurpose = purpose; + } + } + foreach (var expert in GetExperts()) { using (var expertChannel = host.Start(expert.GetType().ToString())) { - expert.Apply(expertChannel, cols); + expert.Apply(expertChannel, cols.ToArray()); expertChannel.Done(); } } diff --git a/src/Microsoft.ML.PipelineInference/RecipeInference.cs b/src/Microsoft.ML.PipelineInference/RecipeInference.cs index 8c08e650ec..2d94a099d3 100644 --- a/src/Microsoft.ML.PipelineInference/RecipeInference.cs +++ b/src/Microsoft.ML.PipelineInference/RecipeInference.cs @@ -157,15 +157,15 @@ public abstract class Recipe public virtual List AllowedPredictorTypes() => MacroUtils.PredictorTypes.ToList(); protected virtual TransformInference.SuggestedTransform[] GetSuggestedTransforms( - TransformInference.InferenceResult tranformInferenceResult, Type predictorType) + TransformInference.InferenceResult transformInferenceResult, Type predictorType) { List allowedTransforms = AllowedTransforms(); List qualifierTransforms = QualifierTransforms(); if (AllowedPredictorTypes().Any(type => type == predictorType) && - tranformInferenceResult.SuggestedTransforms.Any(transform => qualifierTransforms.Contains(transform.ExpertType))) + transformInferenceResult.SuggestedTransforms.Any(transform => qualifierTransforms.Contains(transform.ExpertType))) { - return tranformInferenceResult.SuggestedTransforms + return transformInferenceResult.SuggestedTransforms .Where(transform => allowedTransforms.Contains(transform.ExpertType) || qualifierTransforms.Contains(transform.ExpertType)) .ToArray(); } @@ -174,10 +174,10 @@ protected virtual TransformInference.SuggestedTransform[] GetSuggestedTransforms } public virtual IEnumerable Apply( - TransformInference.InferenceResult tranformInferenceResult, Type predictorType, IChannel ch) + TransformInference.InferenceResult transformInferenceResult, Type predictorType, IChannel ch) { TransformInference.SuggestedTransform[] transforms = GetSuggestedTransforms( - tranformInferenceResult, predictorType); + transformInferenceResult, predictorType); if (transforms?.Length > 0) { @@ -431,7 +431,7 @@ public static SuggestedRecipe[] InferRecipesFromData(IHostEnvironment env, strin } } - public static InferenceResult InferRecipes(IHostEnvironment env, TransformInference.InferenceResult tranformInferenceResult, + public static InferenceResult InferRecipes(IHostEnvironment env, TransformInference.InferenceResult transformInferenceResult, Type predictorType) { Contracts.CheckValue(env, nameof(env)); @@ -441,7 +441,7 @@ public static InferenceResult InferRecipes(IHostEnvironment env, TransformInfere { var list = new List(); foreach (var recipe in GetRecipes()) - list.AddRange(recipe.Apply(tranformInferenceResult, predictorType, ch)); + list.AddRange(recipe.Apply(transformInferenceResult, predictorType, ch)); if (list.Count == 0) ch.Info("No recipes are needed for the data."); diff --git a/src/Microsoft.ML.PipelineInference/TextFileContents.cs b/src/Microsoft.ML.PipelineInference/TextFileContents.cs index 6b593b2123..cdf90d350b 100644 --- a/src/Microsoft.ML.PipelineInference/TextFileContents.cs +++ b/src/Microsoft.ML.PipelineInference/TextFileContents.cs @@ -12,7 +12,7 @@ namespace Microsoft.ML.Runtime.PipelineInference { /// - /// Utilities for various heuristics against text files. + /// Utilities for various heuristics against text files. /// Currently, separator inference and column count detection. /// public static class TextFileContents @@ -42,8 +42,8 @@ public ColumnSplitResult(bool isSuccess, string separator, bool allowQuote, bool /// /// Attempt to detect text loader arguments. - /// The algorithm selects the first 'acceptable' set: the one that recognizes the same number of columns in at - /// least of the sample's lines, + /// The algorithm selects the first 'acceptable' set: the one that recognizes the same number of columns in at + /// least of the sample's lines, /// and this number of columns is more than 1. /// We sweep on separator, allow sparse and allow quote parameter. /// @@ -90,7 +90,7 @@ from _sep in separatorCandidates else { // REVIEW: May need separate messages for GUI-specific and non-specific. This component can be used - // by itself outside the GUI. + // by itself outside the GUI. ch.Info("Couldn't determine columns in the file using separators {0}. Does the input file consist of only a single column? " + "If so, in TLC GUI, please close the import wizard, and then, in the loader settings to the right, manually add a column, " + "choose a name, and set source index to 0.", diff --git a/src/Microsoft.ML.PipelineInference/TextFileSample.cs b/src/Microsoft.ML.PipelineInference/TextFileSample.cs index ffec976ee0..a2820a104d 100644 --- a/src/Microsoft.ML.PipelineInference/TextFileSample.cs +++ b/src/Microsoft.ML.PipelineInference/TextFileSample.cs @@ -18,7 +18,7 @@ public sealed class TextFileSample : IMultiStreamSource { // REVIEW: consider including multiple files via IMultiStreamSource. - // REVIEW: right now, it expects 0x0A being the trailing character of line break. + // REVIEW: right now, it expects 0x0A being the trailing character of line break. // Consider a more general implementation. private const int BufferSizeMb = 4; @@ -73,12 +73,12 @@ public TextReader OpenTextReader(int index) public long? ApproximateRowCount => _approximateRowCount; /// - /// Create a by reading multiple chunks from the file (or other source) and + /// Create a by reading multiple chunks from the file (or other source) and /// then stitching them together. The algorithm is as follows: /// 0. If the source is not seekable, revert to . /// 1. If the file length is less than 2 * , revert to . /// 2. Read first MB chunk. Determine average line length in the chunk. - /// 3. Determine how large one chunk should be, and how many chunks there should be, to end up + /// 3. Determine how large one chunk should be, and how many chunks there should be, to end up /// with * MB worth of lines. /// 4. Determine seek locations and read the chunks. /// 5. Stitch and return a . @@ -102,7 +102,7 @@ public static TextFileSample CreateFromFullFile(IHostEnvironment env, string pat Contracts.Assert(count == firstChunk.Length); if (!IsEncodingOkForSampling(firstChunk)) return CreateFromHead(path); - // REVIEW: CreateFromHead still truncates the file before the last 0x0A byte. For multi-byte encoding, + // REVIEW: CreateFromHead still truncates the file before the last 0x0A byte. For multi-byte encoding, // this might cause an unfinished string to be present in the buffer. Right now this is considered an acceptable // price to pay for parse-free processing. @@ -113,7 +113,7 @@ public static TextFileSample CreateFromFullFile(IHostEnvironment env, string pat long approximateRowCount = (long)(lineCount * fileSize * 1.0 / firstChunk.Length); var firstNewline = Array.FindIndex(firstChunk, x => x == '\n'); - // First line may be header, so we exclude it. The remaining lineCount-1 line breaks are + // First line may be header, so we exclude it. The remaining lineCount-1 line breaks are // splitting the text into lineCount lines, and the last line is actually half-size. Double averageLineLength = 2.0 * (firstChunk.Length - firstNewline) / (lineCount * 2 - 1); averageLineLength = Math.Max(averageLineLength, 3); @@ -173,9 +173,9 @@ public static TextFileSample CreateFromHead(string path) /// /// Given an array of chunks of the text file, of which the first chunk is the head, - /// this method trims incomplete lines from the beginning and end of each chunk + /// this method trims incomplete lines from the beginning and end of each chunk /// (except that it doesn't trim the beginning of the first chunk and end of last chunk if we read whole file), - /// then joins the rest together to form a final byte buffer and returns a + /// then joins the rest together to form a final byte buffer and returns a /// wrapped around it. /// /// did we read whole file @@ -213,7 +213,7 @@ private static byte[] StitchChunks(bool wholeFile, params byte[][] chunks) } /// - /// Detect whether we can auto-detect EOL characters without parsing. + /// Detect whether we can auto-detect EOL characters without parsing. /// If we do, we can cheaply sample from different file locations and trim the partial strings. /// The encodings that pass the test are UTF8 and all single-byte encodings. /// @@ -222,7 +222,7 @@ private static bool IsEncodingOkForSampling(byte[] buffer) // First check if a BOM/signature exists (sourced from http://www.unicode.org/faq/utf_bom.html#bom4) if (buffer.Length >= 4 && buffer[0] == 0x00 && buffer[1] == 0x00 && buffer[2] == 0xFE && buffer[3] == 0xFF) { - // UTF-32, big-endian + // UTF-32, big-endian return false; } if (buffer.Length >= 4 && buffer[0] == 0xFF && buffer[1] == 0xFE && buffer[2] == 0x00 && buffer[3] == 0x00) @@ -251,7 +251,7 @@ private static bool IsEncodingOkForSampling(byte[] buffer) return true; } - // No BOM/signature was found, so now we need to 'sniff' the file to see if can manually discover the encoding. + // No BOM/signature was found, so now we need to 'sniff' the file to see if can manually discover the encoding. int sniffLim = Math.Min(1000, buffer.Length); // Some text files are encoded in UTF8, but have no BOM/signature. Hence the below manually checks for a UTF8 pattern. This code is based off diff --git a/src/Microsoft.ML.PipelineInference/TransformInference.cs b/src/Microsoft.ML.PipelineInference/TransformInference.cs index 988b56eedf..b636c0d058 100644 --- a/src/Microsoft.ML.PipelineInference/TransformInference.cs +++ b/src/Microsoft.ML.PipelineInference/TransformInference.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using Microsoft.ML; using Microsoft.ML.Runtime.CommandLine; using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.EntryPoints; @@ -15,12 +14,12 @@ namespace Microsoft.ML.Runtime.PipelineInference { /// /// Auto-generate set of transforms for the data view, given the purposes of specified columns. - /// - /// The design is the same as for : there's a sequence of 'experts' + /// + /// The design is the same as for : there's a sequence of 'experts' /// that each look at all the columns. Every expert may or may not suggest additional transforms. - /// If the expert needs some information about the column (for example, the column values), - /// this information is lazily calculated by the column object, not the expert itself, to allow the reuse - /// of the same information by another expert. + /// If the expert needs some information about the column (for example, the column values), + /// this information is lazily calculated by the column object, not the expert itself, to allow the reuse + /// of the same information by another expert. /// public static class TransformInference { @@ -56,7 +55,7 @@ public struct SuggestedTransform : IEquatable public TransformPipelineNode PipelineNode; // Used for grouping transforms that must occur together public int AtomicGroupId { get; set; } - // Stores which columns are consumed by this transform, + // Stores which columns are consumed by this transform, // and which are produced, at which level. public ColumnRoutingStructure RoutingStructure { get; set; } public bool AlwaysInclude { get; set; } @@ -418,7 +417,7 @@ public sealed class GroupIdHashRename : TransformInferenceExpertBase { public override IEnumerable Apply(IntermediateColumn[] columns, Arguments inferenceArgs, IChannel ch) { - var firstGroupColId = Array.FindIndex(columns, x => x.Purpose == ColumnPurpose.GroupId); + var firstGroupColId = Array.FindIndex(columns, x => x.Purpose == ColumnPurpose.Group); if (firstGroupColId < 0) yield break; @@ -668,9 +667,9 @@ private bool IsDictionaryOk(IntermediateColumn column, Double dataSampleFraction int total; int unique; int singletons; - // REVIEW: replace with proper Good-Turing estimation. - // REVIEW: This looks correct; cf. equation (8) of Katz S. "Estimation of Probabilities from - // Sparse Data for the Language Model Component of a Speech Recognizer" (1987), taking into account that + // REVIEW: replace with proper Good-Turing estimation. + // REVIEW: This looks correct; cf. equation (8) of Katz S. "Estimation of Probabilities from + // Sparse Data for the Language Model Component of a Speech Recognizer" (1987), taking into account that // the singleton count was estimated from a fraction of the data (and assuming the estimate is // roughly the same for the entire sample). column.GetUniqueValueCounts(out unique, out singletons, out total); @@ -712,7 +711,7 @@ public override IEnumerable Apply(IntermediateColumn[] colum { Name = columnNameQuoted.ToString(), Source = columnNameQuoted.ToString(), - ResultType = ML.Transforms.DataKind.R4 + ResultType = ML.Data.DataKind.R4 }); } @@ -721,7 +720,7 @@ public override IEnumerable Apply(IntermediateColumn[] colum ch.Info("Suggested conversion to numeric for boolean features."); var args = new SubComponent("Convert", new[] { $"{columnArgument}type=R4" }); - var epInput = new ML.Transforms.ColumnTypeConverter { Column = epColumns.ToArray(), ResultType = ML.Transforms.DataKind.R4 }; + var epInput = new ML.Transforms.ColumnTypeConverter { Column = epColumns.ToArray(), ResultType = ML.Data.DataKind.R4 }; ColumnRoutingStructure.AnnotatedName[] columnsSource = epColumns.Select(c => new ColumnRoutingStructure.AnnotatedName { IsNumeric = false, Name = c.Name }).ToArray(); ColumnRoutingStructure.AnnotatedName[] columnsDest = @@ -793,7 +792,7 @@ public static StringBuilder GetTextTransformBigramTriCharArgument(string columnN } public static SuggestedTransform ConcatColumnsIntoOne(List columnNames, string concatColumnName, - Type tranformType, bool isNumeric) + Type transformType, bool isNumeric) { StringBuilder columnArgument = new StringBuilder(); StringBuilder columnNameQuoted = new StringBuilder(); @@ -844,10 +843,10 @@ public static SuggestedTransform ConcatColumnsIntoOne(List columnNames, new SuggestedTransform( $"Concatenate {columnsToConcat} columns into column {concatColumnName}", new SubComponent("Concat", - new[] { arguments }), tranformType, new TransformPipelineNode(epInput), -1, routingStructure); + new[] { arguments }), transformType, new TransformPipelineNode(epInput), -1, routingStructure); } - public static SuggestedTransform TextTransformUnigramTriChar(string srcColumn, string dstColumn, string arg, Type tranformType) + public static SuggestedTransform TextTransformUnigramTriChar(string srcColumn, string dstColumn, string arg, Type transformType) { StringBuilder columnArgument = InferenceHelpers.GetTextTransformUnigramTriCharArgument(srcColumn, dstColumn); @@ -863,10 +862,10 @@ public static SuggestedTransform TextTransformUnigramTriChar(string srcColumn, s }; return TextTransform(srcColumn, dstColumn, columnArgument.ToString(), "Unigram plus Trichar", - tranformType, new TransformPipelineNode(nodeInput)); + transformType, new TransformPipelineNode(nodeInput)); } - public static SuggestedTransform TextTransformBigramTriChar(string srcColumn, string dstColumn, string arg, Type tranformType) + public static SuggestedTransform TextTransformBigramTriChar(string srcColumn, string dstColumn, string arg, Type transformType) { StringBuilder columnArgument = InferenceHelpers.GetTextTransformBigramTriCharArgument(srcColumn, dstColumn); @@ -881,11 +880,11 @@ public static SuggestedTransform TextTransformBigramTriChar(string srcColumn, st }; return TextTransform(srcColumn, dstColumn, columnArgument.ToString(), "Bigram plus Trichar", - tranformType, new TransformPipelineNode(nodeInput)); + transformType, new TransformPipelineNode(nodeInput)); } public static SuggestedTransform TextTransform(string srcColumn, string dstColumn, string arg, - string outputMsg, Type tranformType, TransformPipelineNode pipelineNode) + string outputMsg, Type transformType, TransformPipelineNode pipelineNode) { ColumnRoutingStructure.AnnotatedName[] columnsSource = { new ColumnRoutingStructure.AnnotatedName { IsNumeric = false, Name = srcColumn } }; @@ -899,7 +898,7 @@ public static SuggestedTransform TextTransform(string srcColumn, string dstColum ") for column '{0}' and output to column '{1}'", srcColumn, dstColumn), new SubComponent("Text", arg), - tranformType, pipelineNode, -1, routingStructure); + transformType, pipelineNode, -1, routingStructure); } } @@ -1142,7 +1141,7 @@ public override IEnumerable Apply(IntermediateColumn[] colum $"Apply text featurizer transform on text features for column '{column.ColumnName}'", args, typeof(Text), new TransformPipelineNode(epInput), -1, routingStructure); } - // Concat text featurized columns into existing feature column, if transformed at least one column. + // Concat text featurized columns into existing feature column, if transformed at least one column. if (!inferenceArgs.ExcludeFeaturesConcatTransforms && featureCols.Count > 0) { yield return InferenceHelpers.GetRemainingFeatures(featureCols, columns, GetType(), IncludeFeaturesOverride); @@ -1560,7 +1559,7 @@ public static InferenceResult InferTransforms(IHostEnvironment env, IDataView da } } - public static SuggestedTransform[] InferTransforms(IHostEnvironment env, IDataView data, Arguments args) + public static SuggestedTransform[] InferTransforms(IHostEnvironment env, IDataView data, Arguments args, RoleMappedData dataRoles) { Contracts.CheckValue(env, nameof(env)); var h = env.Register("InferTransforms"); @@ -1577,7 +1576,7 @@ public static SuggestedTransform[] InferTransforms(IHostEnvironment env, IDataVi // Infer column purposes from data sample. var piArgs = new PurposeInference.Arguments { MaxRowsToRead = MaxRowsToRead }; var columnIndices = Enumerable.Range(0, dataSample.Schema.ColumnCount); - var piResult = PurposeInference.InferPurposes(env, dataSample, columnIndices, piArgs); + var piResult = PurposeInference.InferPurposes(env, dataSample, columnIndices, piArgs, dataRoles); var purposes = piResult.Columns; // Infer transforms @@ -1596,7 +1595,7 @@ public static SuggestedTransform[] InferTransforms(IHostEnvironment env, IDataVi .Contains(t.AtomicGroupId)).ToArray(); } - public static SuggestedTransform[] InferConcatNumericFeatures(IHostEnvironment env, IDataView data, Arguments args) + public static SuggestedTransform[] InferConcatNumericFeatures(IHostEnvironment env, IDataView data, Arguments args, RoleMappedData dataRoles) { Contracts.CheckValue(env, nameof(env)); var h = env.Register("InferConcatNumericFeatures"); @@ -1609,7 +1608,7 @@ public static SuggestedTransform[] InferConcatNumericFeatures(IHostEnvironment e // Infer column purposes from data sample. var piArgs = new PurposeInference.Arguments { MaxRowsToRead = MaxRowsToRead }; var columnIndices = Enumerable.Range(0, data.Schema.ColumnCount); - var piResult = PurposeInference.InferPurposes(env, data, columnIndices, piArgs); + var piResult = PurposeInference.InferPurposes(env, data, columnIndices, piArgs, dataRoles); var purposes = piResult.Columns; var cols = purposes.Where(x => !data.Schema.IsHidden(x.ColumnIndex) diff --git a/src/Microsoft.ML.ResultProcessor/ResultProcessor.cs b/src/Microsoft.ML.ResultProcessor/ResultProcessor.cs index 71244b6536..d516fb1d5f 100644 --- a/src/Microsoft.ML.ResultProcessor/ResultProcessor.cs +++ b/src/Microsoft.ML.ResultProcessor/ResultProcessor.cs @@ -360,10 +360,10 @@ public class ResultProcessor private const string FoldSeparatorString = "----------------------------------------------------------------------------------------"; - private readonly static Regex _rxNameValue = new Regex(@"(?.+)\s*:\s*(?\S+)", RegexOptions.Compiled); - private readonly static Regex _rxNameValueDeviation = new Regex(@"(?.+)\s*:\s*(?\S+)\s*\((?\S+)\)", RegexOptions.Compiled); - private readonly static Regex _rxTimeElapsed = new Regex(@"(?.*)\t Time elapsed\(s\): (?[\d\.]*)", RegexOptions.Compiled); - private readonly static Regex _rxMemoryUsage = new Regex(@"(?[\w]+) memory usage\(MB\): (?[\d]*)", RegexOptions.Compiled); + private static readonly Regex _rxNameValue = new Regex(@"(?.+)\s*:\s*(?\S+)", RegexOptions.Compiled); + private static readonly Regex _rxNameValueDeviation = new Regex(@"(?.+)\s*:\s*(?\S+)\s*\((?\S+)\)", RegexOptions.Compiled); + private static readonly Regex _rxTimeElapsed = new Regex(@"(?.*)\t Time elapsed\(s\): (?[\d\.]*)", RegexOptions.Compiled); + private static readonly Regex _rxMemoryUsage = new Regex(@"(?[\w]+) memory usage\(MB\): (?[\d]*)", RegexOptions.Compiled); public static bool CheckEndOfFileReached(string[] lines) { @@ -1134,7 +1134,7 @@ private static Experiment CreateVisualizationExperiment(ExperimentItemResult res /// /// Deserialize a predictor, returning as an object - /// + /// private static object Load(Stream stream) { BinaryFormatter bf = new BinaryFormatter(); diff --git a/src/Microsoft.ML.StandardLearners/FactorizationMachine/FactorizationMachineInterface.cs b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FactorizationMachineInterface.cs new file mode 100644 index 0000000000..a4a2b79787 --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FactorizationMachineInterface.cs @@ -0,0 +1,94 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Internal.CpuMath; +using Microsoft.ML.Runtime.Internal.Utilities; +using System.Runtime.InteropServices; + +using System.Security; + +namespace Microsoft.ML.Runtime.FactorizationMachine +{ + internal static unsafe class FieldAwareFactorizationMachineInterface + { + internal const string NativePath = "FactorizationMachineNative"; + public const int CbAlign = 16; + + private static bool Compat(AlignedArray a) + { + Contracts.AssertValue(a); + Contracts.Assert(a.Size > 0); + return a.CbAlign == CbAlign; + } + + private static unsafe float* Ptr(AlignedArray a, float* p) + { + Contracts.AssertValue(a); + float* q = p + a.GetBase((long)p); + Contracts.Assert(((long)q & (CbAlign - 1)) == 0); + return q; + } + + [DllImport(NativePath), SuppressUnmanagedCodeSecurity] + public static extern void CalculateIntermediateVariablesNative(int fieldCount, int latentDim, int count, int* /*const*/ fieldIndices, int* /*const*/ featureIndices, + float* /*const*/ featureValues, float* /*const*/ linearWeights, float* /*const*/ latentWeights, float* latentSum, float* response); + + [DllImport(NativePath), SuppressUnmanagedCodeSecurity] + public static extern void CalculateGradientAndUpdateNative(float lambdaLinear, float lambdaLatent, float learningRate, int fieldCount, int latentDim, float weight, + int count, int* /*const*/ fieldIndices, int* /*const*/ featureIndices, float* /*const*/ featureValues, float* /*const*/ latentSum, float slope, + float* linearWeights, float* latentWeights, float* linearAccumulatedSquaredGrads, float* latentAccumulatedSquaredGrads); + + public static void CalculateIntermediateVariables(int fieldCount, int latentDim, int count, int[] fieldIndices, int[] featureIndices, float[] featureValues, + float[] linearWeights, AlignedArray latentWeights, AlignedArray latentSum, ref float response) + { + Contracts.AssertNonEmpty(fieldIndices); + Contracts.AssertNonEmpty(featureValues); + Contracts.AssertNonEmpty(featureIndices); + Contracts.AssertNonEmpty(linearWeights); + Contracts.Assert(Compat(latentWeights)); + Contracts.Assert(Compat(latentSum)); + + unsafe + { + fixed (int* pf = &fieldIndices[0]) + fixed (int* pi = &featureIndices[0]) + fixed (float* px = &featureValues[0]) + fixed (float* pw = &linearWeights[0]) + fixed (float* pv = &latentWeights.Items[0]) + fixed (float* pq = &latentSum.Items[0]) + fixed (float* pr = &response) + CalculateIntermediateVariablesNative(fieldCount, latentDim, count, pf, pi, px, pw, Ptr(latentWeights, pv), Ptr(latentSum, pq), pr); + } + } + + public static void CalculateGradientAndUpdate(float lambdaLinear, float lambdaLatent, float learningRate, int fieldCount, int latentDim, + float weight, int count, int[] fieldIndices, int[] featureIndices, float[] featureValues, AlignedArray latentSum, float slope, + float[] linearWeights, AlignedArray latentWeights, float[] linearAccumulatedSquaredGrads, AlignedArray latentAccumulatedSquaredGrads) + { + Contracts.AssertNonEmpty(fieldIndices); + Contracts.AssertNonEmpty(featureIndices); + Contracts.AssertNonEmpty(featureValues); + Contracts.Assert(Compat(latentSum)); + Contracts.AssertNonEmpty(linearWeights); + Contracts.Assert(Compat(latentWeights)); + Contracts.AssertNonEmpty(linearAccumulatedSquaredGrads); + Contracts.Assert(Compat(latentAccumulatedSquaredGrads)); + + unsafe + { + fixed (int* pf = &fieldIndices[0]) + fixed (int* pi = &featureIndices[0]) + fixed (float* px = &featureValues[0]) + fixed (float* pq = &latentSum.Items[0]) + fixed (float* pw = &linearWeights[0]) + fixed (float* pv = &latentWeights.Items[0]) + fixed (float* phw = &linearAccumulatedSquaredGrads[0]) + fixed (float* phv = &latentAccumulatedSquaredGrads.Items[0]) + CalculateGradientAndUpdateNative(lambdaLinear, lambdaLatent, learningRate, fieldCount, latentDim, weight, count, pf, pi, px, + Ptr(latentSum, pq), slope, pw, Ptr(latentWeights, pv), phw, Ptr(latentAccumulatedSquaredGrads, phv)); + } + + } + } +} diff --git a/src/Microsoft.ML.StandardLearners/FactorizationMachine/FactorizationMachineTrainer.cs b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FactorizationMachineTrainer.cs new file mode 100644 index 0000000000..62270763de --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FactorizationMachineTrainer.cs @@ -0,0 +1,380 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.FactorizationMachine; +using Microsoft.ML.Runtime.Internal.CpuMath; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Training; + +[assembly: LoadableClass(FieldAwareFactorizationMachineTrainer.Summary, typeof(FieldAwareFactorizationMachineTrainer), typeof(FieldAwareFactorizationMachineTrainer.Arguments), + new[] { typeof(SignatureBinaryClassifierTrainer), typeof(SignatureTrainer) }, FieldAwareFactorizationMachineTrainer.UserName, FieldAwareFactorizationMachineTrainer.LoadName, + FieldAwareFactorizationMachineTrainer.ShortName, DocName = "trainer/FactorizationMachine.md")] + +[assembly: LoadableClass(typeof(void), typeof(FieldAwareFactorizationMachineTrainer), null, typeof(SignatureEntryPointModule), FieldAwareFactorizationMachineTrainer.LoadName)] + +namespace Microsoft.ML.Runtime.FactorizationMachine +{ + /* + Train a field-aware factorization machine using ADAGRAD (an advanced stochastic gradient method). See references below + for details. This trainer is essentially faster the one introduced in [2] because of some implemtation tricks[3]. + [1] http://jmlr.org/papers/volume12/duchi11a/duchi11a.pdf + [2] http://www.csie.ntu.edu.tw/~cjlin/papers/ffm.pdf + [3] https://github.com/wschin/fast-ffm/blob/master/fast-ffm.pdf + */ + /// + public sealed class FieldAwareFactorizationMachineTrainer : TrainerBase + { + public const string Summary = "Train a field-aware factorization machine for binary classification"; + public const string UserName = "Field-aware Factorization Machine"; + public const string LoadName = "FieldAwareFactorizationMachine"; + public const string ShortName = "ffm"; + + public sealed class Arguments : LearnerInputBaseWithLabel + { + [Argument(ArgumentType.AtMostOnce, HelpText = "Initial learning rate", ShortName = "lr", SortOrder = 1)] + [TlcModule.SweepableFloatParam(0.001f, 1.0f, isLogScale: true)] + public float LearningRate = (float)0.1; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Number of training iterations", ShortName = "iter", SortOrder = 2)] + [TlcModule.SweepableLongParam(1, 100)] + public int Iters = 5; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Latent space dimension", ShortName = "d", SortOrder = 3)] + [TlcModule.SweepableLongParam(4, 100)] + public int LatentDim = 20; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Regularization coefficient of linear weights", ShortName = "lambdaLinear", SortOrder = 4)] + [TlcModule.SweepableFloatParam(1e-8f, 1f, isLogScale: true)] + public float LambdaLinear = 0.0001f; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Regularization coefficient of latent weights", ShortName = "lambdaLatent", SortOrder = 5)] + [TlcModule.SweepableFloatParam(1e-8f, 1f, isLogScale: true)] + public float LambdaLatent = 0.0001f; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to normalize the input vectors so that the concatenation of all fields' feature vectors is unit-length", ShortName = "norm", SortOrder = 6)] + public bool Norm = true; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to shuffle for each training iteration", ShortName = "shuf", SortOrder = 90)] + public bool Shuffle = true; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Report traning progress or not", ShortName = "verbose", SortOrder = 91)] + public bool Verbose = true; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Radius of initial latent factors", ShortName = "rad", SortOrder = 110)] + [TlcModule.SweepableFloatParam(0.1f, 1f)] + public float Radius = 0.5f; + } + + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + public override TrainerInfo Info { get; } + private readonly int _latentDim; + private readonly int _latentDimAligned; + private readonly float _lambdaLinear; + private readonly float _lambdaLatent; + private readonly float _learningRate; + private readonly int _numIterations; + private readonly bool _norm; + private readonly bool _shuffle; + private readonly bool _verbose; + private readonly float _radius; + + public FieldAwareFactorizationMachineTrainer(IHostEnvironment env, Arguments args) : base(env, LoadName) + { + Host.CheckUserArg(args.LatentDim > 0, nameof(args.LatentDim), "Must be positive"); + Host.CheckUserArg(args.LambdaLinear >= 0, nameof(args.LambdaLinear), "Must be non-negative"); + Host.CheckUserArg(args.LambdaLatent >= 0, nameof(args.LambdaLatent), "Must be non-negative"); + Host.CheckUserArg(args.LearningRate > 0, nameof(args.LearningRate), "Must be positive"); + Host.CheckUserArg(args.Iters >= 0, nameof(args.Iters), "Must be non-negative"); + _latentDim = args.LatentDim; + _latentDimAligned = FieldAwareFactorizationMachineUtils.GetAlignedVectorLength(_latentDim); + _lambdaLinear = args.LambdaLinear; + _lambdaLatent = args.LambdaLatent; + _learningRate = args.LearningRate; + _numIterations = args.Iters; + _norm = args.Norm; + _shuffle = args.Shuffle; + _verbose = args.Verbose; + _radius = args.Radius; + Info = new TrainerInfo(); + } + + private void InitializeTrainingState(int fieldCount, int featureCount, FieldAwareFactorizationMachinePredictor predictor, out float[] linearWeights, + out AlignedArray latentWeightsAligned, out float[] linearAccumulatedSquaredGrads, out AlignedArray latentAccumulatedSquaredGradsAligned) + { + linearWeights = new float[featureCount]; + latentWeightsAligned = new AlignedArray(featureCount * fieldCount * _latentDimAligned, 16); + linearAccumulatedSquaredGrads = new float[featureCount]; + latentAccumulatedSquaredGradsAligned = new AlignedArray(featureCount * fieldCount * _latentDimAligned, 16); + + if (predictor == null) + { + var rng = Host.Rand; + for (int j = 0; j < featureCount; j++) + { + linearWeights[j] = 0; + linearAccumulatedSquaredGrads[j] = 1; + for (int f = 0; f < fieldCount; f++) + { + int vBias = j * fieldCount * _latentDimAligned + f * _latentDimAligned; + for (int k = 0; k < _latentDimAligned; k++) + { + if (k < _latentDim) + latentWeightsAligned[vBias + k] = _radius * (float)rng.NextDouble(); + else + latentWeightsAligned[vBias + k] = 0; + latentAccumulatedSquaredGradsAligned[vBias + k] = 1; + } + } + } + } + else + { + predictor.CopyLinearWeightsTo(linearWeights); + predictor.CopyLatentWeightsTo(latentWeightsAligned); + for (int j = 0; j < featureCount; j++) + { + linearAccumulatedSquaredGrads[j] = 1; + for (int f = 0; f < fieldCount; f++) + { + int vBias = j * fieldCount * _latentDimAligned + f * _latentDimAligned; + for (int k = 0; k < _latentDimAligned; k++) + latentAccumulatedSquaredGradsAligned[vBias + k] = 1; + } + } + } + } + + private static float CalculateLoss(float label, float modelResponse) + { + float margin = label > 0 ? modelResponse : -modelResponse; + if (margin > 0) + return MathUtils.Log(1 + MathUtils.ExpSlow(-margin)); + else + return -margin + MathUtils.Log(1 + MathUtils.ExpSlow(margin)); + } + + private static float CalculateLossSlope(float label, float modelResponse) + { + float sign = label > 0 ? 1 : -1; + float margin = sign * modelResponse; + return -sign * MathUtils.Sigmoid(-margin); + } + + private static double CalculateAvgLoss(IChannel ch, RoleMappedData data, bool norm, float[] linearWeights, AlignedArray latentWeightsAligned, + int latentDimAligned, AlignedArray latentSum, int[] featureFieldBuffer, int[] featureIndexBuffer, float[] featureValueBuffer, VBuffer buffer, ref long badExampleCount) + { + var featureColumns = data.Schema.GetColumns(RoleMappedSchema.ColumnRole.Feature); + Func pred = c => featureColumns.Select(ci => ci.Index).Contains(c) || c == data.Schema.Label.Index || (data.Schema.Weight != null && c == data.Schema.Weight.Index); + var getters = new ValueGetter>[featureColumns.Count]; + float label = 0; + float weight = 1; + double loss = 0; + float modelResponse = 0; + long exampleCount = 0; + badExampleCount = 0; + int count = 0; + using (var cursor = data.Data.GetRowCursor(pred)) + { + var labelGetter = cursor.GetGetter(data.Schema.Label.Index); + var weightGetter = data.Schema.Weight == null ? null : cursor.GetGetter(data.Schema.Weight.Index); + for (int f = 0; f < featureColumns.Count; f++) + getters[f] = cursor.GetGetter>(featureColumns[f].Index); + while (cursor.MoveNext()) + { + labelGetter(ref label); + weightGetter?.Invoke(ref weight); + float annihilation = label - label + weight - weight; + if (!FloatUtils.IsFinite(annihilation)) + { + badExampleCount++; + continue; + } + if (!FieldAwareFactorizationMachineUtils.LoadOneExampleIntoBuffer(getters, buffer, norm, ref count, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer)) + { + badExampleCount++; + continue; + } + FieldAwareFactorizationMachineInterface.CalculateIntermediateVariables(featureColumns.Count, latentDimAligned, count, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer, linearWeights, latentWeightsAligned, latentSum, ref modelResponse); + loss += weight * CalculateLoss(label, modelResponse); + exampleCount++; + } + } + return loss / exampleCount; + } + + private FieldAwareFactorizationMachinePredictor TrainCore(IChannel ch, IProgressChannel pch, RoleMappedData data, RoleMappedData validData, FieldAwareFactorizationMachinePredictor predictor) + { + Host.AssertValue(ch); + Host.AssertValue(pch); + + data.CheckBinaryLabel(); + var featureColumns = data.Schema.GetColumns(RoleMappedSchema.ColumnRole.Feature); + int fieldCount = featureColumns.Count; + int totalFeatureCount = 0; + int[] fieldColumnIndexes = new int[fieldCount]; + for (int f = 0; f < fieldCount; f++) + { + var col = featureColumns[f]; + Host.Assert(col.Type.AsVector.VectorSize > 0); + if (col == null) + throw ch.ExceptParam(nameof(data), "Empty feature column not allowed"); + Host.Assert(!data.Schema.Schema.IsHidden(col.Index)); + if (!col.Type.IsKnownSizeVector || col.Type.ItemType != NumberType.Float) + throw ch.ExceptParam(nameof(data), "Training feature column '{0}' must be a known-size vector of R4, but has type: {1}.", col.Name, col.Type); + fieldColumnIndexes[f] = col.Index; + totalFeatureCount += col.Type.AsVector.VectorSize; + } + ch.Check(checked(totalFeatureCount * fieldCount * _latentDimAligned) <= Utils.ArrayMaxSize, "Latent dimension or the number of fields too large"); + if (predictor != null) + { + ch.Check(predictor.FeatureCount == totalFeatureCount, "Input model's feature count mismatches training feature count"); + ch.Check(predictor.LatentDim == _latentDim, "Input model's latent dimension mismatches trainer's"); + } + if (validData != null) + { + validData.CheckBinaryLabel(); + var validFeatureColumns = data.Schema.GetColumns(RoleMappedSchema.ColumnRole.Feature); + Host.Assert(fieldCount == validFeatureColumns.Count); + for (int f = 0; f < fieldCount; f++) + Host.Assert(featureColumns[f] == validFeatureColumns[f]); + } + bool shuffle = _shuffle; + if (shuffle && !data.Data.CanShuffle) + { + ch.Warning("Training data does not support shuffling, so ignoring request to shuffle"); + shuffle = false; + } + var rng = shuffle ? Host.Rand : null; + var featureGetters = new ValueGetter>[fieldCount]; + var featureBuffer = new VBuffer(); + var featureValueBuffer = new float[totalFeatureCount]; + var featureIndexBuffer = new int[totalFeatureCount]; + var featureFieldBuffer = new int[totalFeatureCount]; + var latentSum = new AlignedArray(fieldCount * fieldCount * _latentDimAligned, 16); + var metricNames = new List() { "Training-loss" }; + if (validData != null) + metricNames.Add("Validation-loss"); + int iter = 0; + long exampleCount = 0; + long badExampleCount = 0; + long validBadExampleCount = 0; + double loss = 0; + double validLoss = 0; + pch.SetHeader(new ProgressHeader(metricNames.ToArray(), new string[] { "iterations", "examples" }), entry => + { + entry.SetProgress(0, iter, _numIterations); + entry.SetProgress(1, exampleCount); + }); + Func pred = c => fieldColumnIndexes.Contains(c) || c == data.Schema.Label.Index || (data.Schema.Weight != null && c == data.Schema.Weight.Index); + InitializeTrainingState(fieldCount, totalFeatureCount, predictor, out float[] linearWeights, + out AlignedArray latentWeightsAligned, out float[] linearAccSqGrads, out AlignedArray latentAccSqGradsAligned); + + // refer to Algorithm 3 in https://github.com/wschin/fast-ffm/blob/master/fast-ffm.pdf + while (iter++ < _numIterations) + { + using (var cursor = data.Data.GetRowCursor(pred, rng)) + { + var labelGetter = RowCursorUtils.GetLabelGetter(cursor, data.Schema.Label.Index); + var weightGetter = data.Schema.Weight == null ? null : RowCursorUtils.GetGetterAs(NumberType.R4, cursor, data.Schema.Weight.Index); + for (int i = 0; i < fieldCount; i++) + featureGetters[i] = cursor.GetGetter>(fieldColumnIndexes[i]); + loss = 0; + exampleCount = 0; + badExampleCount = 0; + while (cursor.MoveNext()) + { + float label = 0; + float weight = 1; + int count = 0; + float modelResponse = 0; + labelGetter(ref label); + weightGetter?.Invoke(ref weight); + float annihilation = label - label + weight - weight; + if (!FloatUtils.IsFinite(annihilation)) + { + badExampleCount++; + continue; + } + if (!FieldAwareFactorizationMachineUtils.LoadOneExampleIntoBuffer(featureGetters, featureBuffer, _norm, ref count, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer)) + { + badExampleCount++; + continue; + } + + // refer to Algorithm 1 in [3] https://github.com/wschin/fast-ffm/blob/master/fast-ffm.pdf + FieldAwareFactorizationMachineInterface.CalculateIntermediateVariables(fieldCount, _latentDimAligned, count, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer, linearWeights, latentWeightsAligned, latentSum, ref modelResponse); + var slope = CalculateLossSlope(label, modelResponse); + + // refer to Algorithm 2 in [3] https://github.com/wschin/fast-ffm/blob/master/fast-ffm.pdf + FieldAwareFactorizationMachineInterface.CalculateGradientAndUpdate(_lambdaLinear, _lambdaLatent, _learningRate, fieldCount, _latentDimAligned, weight, count, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer, latentSum, slope, linearWeights, latentWeightsAligned, linearAccSqGrads, latentAccSqGradsAligned); + loss += weight * CalculateLoss(label, modelResponse); + exampleCount++; + } + loss /= exampleCount; + } + + if (_verbose) + { + if (validData == null) + pch.Checkpoint(loss, iter, exampleCount); + else + { + validLoss = CalculateAvgLoss(ch, validData, _norm, linearWeights, latentWeightsAligned, _latentDimAligned, latentSum, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer, featureBuffer, ref validBadExampleCount); + pch.Checkpoint(loss, validLoss, iter, exampleCount); + } + } + } + if (badExampleCount != 0) + ch.Warning($"Skipped {badExampleCount} examples with bad label/weight/features in training set"); + if (validBadExampleCount != 0) + ch.Warning($"Skipped {validBadExampleCount} examples with bad label/weight/features in validation set"); + return new FieldAwareFactorizationMachinePredictor(Host, _norm, fieldCount, totalFeatureCount, _latentDim, linearWeights, latentWeightsAligned); + } + + public override FieldAwareFactorizationMachinePredictor Train(TrainContext context) + { + Host.CheckValue(context, nameof(context)); + var initPredictor = context.InitialPredictor as FieldAwareFactorizationMachinePredictor; + Host.CheckParam(context.InitialPredictor == null || initPredictor != null, nameof(context), + "Initial predictor should have been " + nameof(FieldAwareFactorizationMachinePredictor)); + + using (var ch = Host.Start("Training")) + using (var pch = Host.StartProgressChannel("Training")) + { + var pred = TrainCore(ch, pch, context.TrainingSet, context.ValidationSet, initPredictor); + ch.Done(); + return pred; + } + } + + [TlcModule.EntryPoint(Name = "Trainers.FieldAwareFactorizationMachineBinaryClassifier", + Desc = Summary, + UserName = UserName, + ShortName = ShortName, + XmlInclude = new[] { @"", + @"" })] + public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironment env, Arguments input) + { + Contracts.CheckValue(env, nameof(env)); + var host = env.Register("Train a field-aware factorization machine"); + host.CheckValue(input, nameof(input)); + EntryPointUtils.CheckInputArgs(host, input); + return LearnerEntryPointsUtils.Train(host, input, () => new FieldAwareFactorizationMachineTrainer(host, input), + () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.LabelColumn)); + } + } +} diff --git a/src/Microsoft.ML.StandardLearners/FactorizationMachine/FieldAwareFactorizationMachinePredictor.cs b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FieldAwareFactorizationMachinePredictor.cs new file mode 100644 index 0000000000..37261cb55b --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FieldAwareFactorizationMachinePredictor.cs @@ -0,0 +1,184 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.FactorizationMachine; +using Microsoft.ML.Runtime.Internal.CpuMath; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; + +[assembly: LoadableClass(typeof(FieldAwareFactorizationMachinePredictor), null, typeof(SignatureLoadModel), "Field Aware Factorization Machine", FieldAwareFactorizationMachinePredictor.LoaderSignature)] + +namespace Microsoft.ML.Runtime.FactorizationMachine +{ + public sealed class FieldAwareFactorizationMachinePredictor : PredictorBase, ISchemaBindableMapper, ICanSaveModel + { + public const string LoaderSignature = "FieldAwareFactMacPredict"; + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + private bool _norm; + internal int FieldCount { get; } + internal int FeatureCount { get; } + internal int LatentDim { get; } + internal int LatentDimAligned { get; } + private readonly float[] _linearWeights; + private readonly AlignedArray _latentWeightsAligned; + + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "FAFAMAPD", + verWrittenCur: 0x00010001, + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + internal FieldAwareFactorizationMachinePredictor(IHostEnvironment env, bool norm, int fieldCount, int featureCount, int latentDim, + float[] linearWeights, AlignedArray latentWeightsAligned) : base(env, LoaderSignature) + { + Host.Assert(fieldCount > 0); + Host.Assert(featureCount > 0); + Host.Assert(latentDim > 0); + Host.Assert(Utils.Size(linearWeights) == featureCount); + LatentDimAligned = FieldAwareFactorizationMachineUtils.GetAlignedVectorLength(latentDim); + Host.Assert(latentWeightsAligned.Size == checked(featureCount * fieldCount * LatentDimAligned)); + + _norm = norm; + FieldCount = fieldCount; + FeatureCount = featureCount; + LatentDim = latentDim; + _linearWeights = linearWeights; + _latentWeightsAligned = latentWeightsAligned; + } + + private FieldAwareFactorizationMachinePredictor(IHostEnvironment env, ModelLoadContext ctx) : base(env, LoaderSignature) + { + Host.AssertValue(ctx); + + // *** Binary format *** + // bool: whether to normalize feature vectors + // int: number of fields + // int: number of features + // int: latent dimension + // float[]: linear coefficients + // float[]: latent representation of features + + var norm = ctx.Reader.ReadBoolean(); + var fieldCount = ctx.Reader.ReadInt32(); + Host.CheckDecode(fieldCount > 0); + var featureCount = ctx.Reader.ReadInt32(); + Host.CheckDecode(featureCount > 0); + var latentDim = ctx.Reader.ReadInt32(); + Host.CheckDecode(latentDim > 0); + LatentDimAligned = FieldAwareFactorizationMachineUtils.GetAlignedVectorLength(latentDim); + Host.Check(checked(featureCount * fieldCount * LatentDimAligned) <= Utils.ArrayMaxSize, "Latent dimension too large"); + var linearWeights = ctx.Reader.ReadFloatArray(); + Host.CheckDecode(Utils.Size(linearWeights) == featureCount); + var latentWeights = ctx.Reader.ReadFloatArray(); + Host.CheckDecode(Utils.Size(latentWeights) == featureCount * fieldCount * latentDim); + + _norm = norm; + FieldCount = fieldCount; + FeatureCount = featureCount; + LatentDim = latentDim; + _linearWeights = linearWeights; + _latentWeightsAligned = new AlignedArray(FeatureCount * FieldCount * LatentDimAligned, 16); + for (int j = 0; j < FeatureCount; j++) + { + for (int f = 0; f < FieldCount; f++) + { + int vBias = j * FieldCount * LatentDim + f * LatentDim; + int vBiasAligned = j * FieldCount * LatentDimAligned + f * LatentDimAligned; + for (int k = 0; k < LatentDimAligned; k++) + { + if (k < LatentDim) + _latentWeightsAligned[vBiasAligned + k] = latentWeights[vBias + k]; + else + _latentWeightsAligned[vBiasAligned + k] = 0; + } + } + } + } + + public static FieldAwareFactorizationMachinePredictor Create(IHostEnvironment env, ModelLoadContext ctx) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + return new FieldAwareFactorizationMachinePredictor(env, ctx); + } + + protected override void SaveCore(ModelSaveContext ctx) + { + Host.AssertValue(ctx); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // bool: whether to normalize feature vectors + // int: number of fields + // int: number of features + // int: latent dimension + // float[]: linear coefficients + // float[]: latent representation of features + + Host.Assert(FieldCount > 0); + Host.Assert(FeatureCount > 0); + Host.Assert(LatentDim > 0); + Host.Assert(Utils.Size(_linearWeights) == FeatureCount); + Host.Assert(_latentWeightsAligned.Size == FeatureCount * FieldCount * LatentDimAligned); + + ctx.Writer.Write(_norm); + ctx.Writer.Write(FieldCount); + ctx.Writer.Write(FeatureCount); + ctx.Writer.Write(LatentDim); + ctx.Writer.WriteFloatArray(_linearWeights); + float[] latentWeights = new float[FeatureCount * FieldCount * LatentDim]; + for (int j = 0; j < FeatureCount; j++) + { + for (int f = 0; f < FieldCount; f++) + { + int vBias = j * FieldCount * LatentDim + f * LatentDim; + int vBiasAligned = j * FieldCount * LatentDimAligned + f * LatentDimAligned; + for (int k = 0; k < LatentDim; k++) + latentWeights[vBias + k] = _latentWeightsAligned[vBiasAligned + k]; + } + } + ctx.Writer.WriteFloatArray(latentWeights); + } + + internal float CalculateResponse(ValueGetter>[] getters, VBuffer featureBuffer, + int[] featureFieldBuffer, int[] featureIndexBuffer, float[] featureValueBuffer, AlignedArray latentSum) + { + int count = 0; + float modelResponse = 0; + FieldAwareFactorizationMachineUtils.LoadOneExampleIntoBuffer(getters, featureBuffer, _norm, ref count, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer); + FieldAwareFactorizationMachineInterface.CalculateIntermediateVariables(FieldCount, LatentDimAligned, count, + featureFieldBuffer, featureIndexBuffer, featureValueBuffer, _linearWeights, _latentWeightsAligned, latentSum, ref modelResponse); + return modelResponse; + } + + public ISchemaBoundMapper Bind(IHostEnvironment env, RoleMappedSchema schema) + { + return new FieldAwareFactorizationMachineScalarRowMapper(env, schema, new BinaryClassifierSchema(), this); + } + + internal void CopyLinearWeightsTo(float[] linearWeights) + { + Host.AssertValue(_linearWeights); + Host.AssertValue(linearWeights); + Array.Copy(_linearWeights, linearWeights, _linearWeights.Length); + } + + internal void CopyLatentWeightsTo(AlignedArray latentWeights) + { + Host.AssertValue(_latentWeightsAligned); + Host.AssertValue(latentWeights); + latentWeights.CopyFrom(_latentWeightsAligned); + } + } +} diff --git a/src/Microsoft.ML.StandardLearners/FactorizationMachine/FieldAwareFactorizationMachineUtils.cs b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FieldAwareFactorizationMachineUtils.cs new file mode 100644 index 0000000000..67c53223d7 --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/FactorizationMachine/FieldAwareFactorizationMachineUtils.cs @@ -0,0 +1,143 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Internal.CpuMath; +using Microsoft.ML.Runtime.Internal.Utilities; + +namespace Microsoft.ML.Runtime.FactorizationMachine +{ + internal sealed class FieldAwareFactorizationMachineUtils + { + internal static int GetAlignedVectorLength(int length) + { + int res = length % 4; + if (res == 0) + return length; + else + return length + (4 - res); + } + + internal static bool LoadOneExampleIntoBuffer(ValueGetter>[] getters, VBuffer featureBuffer, bool norm, ref int count, + int[] fieldIndexBuffer, int[] featureIndexBuffer, float[] featureValueBuffer) + { + count = 0; + float featureNorm = 0; + int bias = 0; + float annihilation = 0; + for (int f = 0; f < getters.Length; f++) + { + getters[f](ref featureBuffer); + foreach (var pair in featureBuffer.Items()) + { + fieldIndexBuffer[count] = f; + featureIndexBuffer[count] = bias + pair.Key; + featureValueBuffer[count] = pair.Value; + featureNorm += pair.Value * pair.Value; + annihilation += pair.Value - pair.Value; + count++; + } + bias += featureBuffer.Length; + } + featureNorm = MathUtils.Sqrt(featureNorm); + if (norm) + { + for (int i = 0; i < count; i++) + featureValueBuffer[i] /= featureNorm; + } + return FloatUtils.IsFinite(annihilation); + } + } + + internal sealed class FieldAwareFactorizationMachineScalarRowMapper : ISchemaBoundRowMapper + { + private readonly FieldAwareFactorizationMachinePredictor _pred; + + public RoleMappedSchema InputSchema { get; } + + public ISchema OutputSchema { get; } + + public ISchemaBindableMapper Bindable => _pred; + + private readonly ColumnInfo[] _columns; + private readonly List _inputColumnIndexes; + private readonly IHostEnvironment _env; + + public FieldAwareFactorizationMachineScalarRowMapper(IHostEnvironment env, RoleMappedSchema schema, + ISchema outputSchema, FieldAwareFactorizationMachinePredictor pred) + { + Contracts.AssertValue(env); + Contracts.AssertValue(schema); + Contracts.CheckParam(outputSchema.ColumnCount == 2, nameof(outputSchema)); + Contracts.CheckParam(outputSchema.GetColumnType(0).IsNumber, nameof(outputSchema)); + Contracts.CheckParam(outputSchema.GetColumnType(1).IsNumber, nameof(outputSchema)); + Contracts.AssertValue(pred); + + _env = env; + _columns = schema.GetColumns(RoleMappedSchema.ColumnRole.Feature).ToArray(); + _pred = pred; + + var inputFeatureColumns = _columns.Select(c => new KeyValuePair(RoleMappedSchema.ColumnRole.Feature, c.Name)).ToList(); + InputSchema = new RoleMappedSchema(schema.Schema, inputFeatureColumns); + OutputSchema = outputSchema; + + _inputColumnIndexes = new List(); + foreach (var kvp in inputFeatureColumns) + { + if (schema.Schema.TryGetColumnIndex(kvp.Value, out int index)) + _inputColumnIndexes.Add(index); + } + } + + public IRow GetOutputRow(IRow input, Func predicate, out Action action) + { + var latentSum = new AlignedArray(_pred.FieldCount * _pred.FieldCount * _pred.LatentDimAligned, 16); + var featureBuffer = new VBuffer(); + var featureFieldBuffer = new int[_pred.FeatureCount]; + var featureIndexBuffer = new int[_pred.FeatureCount]; + var featureValueBuffer = new float[_pred.FeatureCount]; + var inputGetters = new ValueGetter>[_pred.FieldCount]; + for (int f = 0; f < _pred.FieldCount; f++) + inputGetters[f] = input.GetGetter>(_inputColumnIndexes[f]); + + action = null; + var getters = new Delegate[2]; + if (predicate(0)) + { + ValueGetter responseGetter = (ref float value) => + { + value = _pred.CalculateResponse(inputGetters, featureBuffer, featureFieldBuffer, featureIndexBuffer, featureValueBuffer, latentSum); + }; + getters[0] = responseGetter; + } + if (predicate(1)) + { + ValueGetter probGetter = (ref float value) => + { + value = _pred.CalculateResponse(inputGetters, featureBuffer, featureFieldBuffer, featureIndexBuffer, featureValueBuffer, latentSum); + value = MathUtils.SigmoidSlow(value); + }; + getters[1] = probGetter; + } + + return new SimpleRow(OutputSchema, input, getters); + } + + public Func GetDependencies(Func predicate) + { + if (Enumerable.Range(0, OutputSchema.ColumnCount).Any(predicate)) + return index => _inputColumnIndexes.Any(c => c == index); + else + return index => false; + } + + public IEnumerable> GetInputColumnRoles() + { + return InputSchema.GetColumnRoles().Select(kvp => new KeyValuePair(kvp.Key, kvp.Value.Name)); + } + } +} diff --git a/src/Microsoft.ML.StandardLearners/FactorizationMachine/doc.xml b/src/Microsoft.ML.StandardLearners/FactorizationMachine/doc.xml new file mode 100644 index 0000000000..bdcb973439 --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/FactorizationMachine/doc.xml @@ -0,0 +1,43 @@ + + + + + + + Train a field-aware factorization machine for binary classification using ADAGRAD (an advanced stochastic gradient method). + + + Field Aware Factorization Machines use, in addition to the input variables, factorized parameters to model the interaction between pairs of variables. + The algorithm is particularly useful for high dimensional datasets which can be very sparse (e.g. click-prediction for advertising systems). + An advantage of FFM over SVMs is that the training data does not need to be stored in memory, and the coefficients can be optimized directly. + For a general idea of what Field-aware Factorization Machines are see: Field Aware Factorization Machines + + See references below for more details. + This trainer is essentially faster the one introduced in [2] because of some implemtation tricks[3]. + + + + Field-aware Factorization Machines for CTR Prediction + + Adaptive Subgradient Methods for Online Learning and Stochastic Optimization + + + An Improved Stochastic Gradient Method for Training Large-scale Field-aware Factorization Machine. + + + + + + + + pipeline.Add(new FieldAwareFactorizationMachineBinaryClassifier + { + LearningRate = 0.5f, + Iter=2 + }); + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.StandardLearners/Microsoft.ML.StandardLearners.csproj b/src/Microsoft.ML.StandardLearners/Microsoft.ML.StandardLearners.csproj index 303995dd5b..6bada43299 100644 --- a/src/Microsoft.ML.StandardLearners/Microsoft.ML.StandardLearners.csproj +++ b/src/Microsoft.ML.StandardLearners/Microsoft.ML.StandardLearners.csproj @@ -1,8 +1,9 @@ - + netstandard2.0 Microsoft.ML + true diff --git a/src/Microsoft.ML.StandardLearners/Optimizer/DifferentiableFunction.cs b/src/Microsoft.ML.StandardLearners/Optimizer/DifferentiableFunction.cs index d7bccdd887..7fd292eb9d 100644 --- a/src/Microsoft.ML.StandardLearners/Optimizer/DifferentiableFunction.cs +++ b/src/Microsoft.ML.StandardLearners/Optimizer/DifferentiableFunction.cs @@ -23,7 +23,7 @@ namespace Microsoft.ML.Runtime.Numeric /// /// A delegate for indexed sets of functions with gradients. - /// + /// /// REVIEW: I didn't add an here, since it looks like this code is not actually /// accessed from anywhere. Maybe it should go away? /// @@ -240,7 +240,7 @@ public static Float Test(DifferentiableFunction f, ref VBuffer x, bool qu /// /// The head of the test output /// - public readonly static string Header = "Trial Numeric deriv Analytic deriv Difference Normalized"; + public static readonly string Header = "Trial Numeric deriv Analytic deriv Difference Normalized"; /// /// Tests the gradient using finite differences on each axis (appropriate for small functions) diff --git a/src/Microsoft.ML.StandardLearners/Optimizer/OptimizationMonitor.cs b/src/Microsoft.ML.StandardLearners/Optimizer/OptimizationMonitor.cs index e97216e854..2f4d7974f4 100644 --- a/src/Microsoft.ML.StandardLearners/Optimizer/OptimizationMonitor.cs +++ b/src/Microsoft.ML.StandardLearners/Optimizer/OptimizationMonitor.cs @@ -169,10 +169,6 @@ public Float Tolerance public bool Terminate(Optimizer.OptimizerState state, out string message) { _unnormMeanImprovement = (state.LastValue - state.Value) + _lambda * _unnormMeanImprovement; - //if (state.Iter < 5) { - // message = "wait for 5..."; - // return false; - //} Float crit = _unnormMeanImprovement * (1 - _lambda) / (1 - MathUtils.Pow(_lambda, state.Iter)); message = string.Format("{0:0.000e0}", crit); diff --git a/src/Microsoft.ML.StandardLearners/Optimizer/Optimizer.cs b/src/Microsoft.ML.StandardLearners/Optimizer/Optimizer.cs index ceab09074d..88fcd47531 100644 --- a/src/Microsoft.ML.StandardLearners/Optimizer/Optimizer.cs +++ b/src/Microsoft.ML.StandardLearners/Optimizer/Optimizer.cs @@ -119,14 +119,14 @@ public override Float Eval(ref VBuffer input, ref VBuffer gradient /// public abstract class OptimizerState { -#pragma warning disable TLC_GeneralName // Too annoying in this case. Consider fixing later. +#pragma warning disable MSML_GeneralName // Too annoying in this case. Consider fixing later. protected internal VBuffer _x; protected internal VBuffer _grad; protected internal VBuffer _newX; protected internal VBuffer _newGrad; protected internal VBuffer _dir; protected internal VBuffer _steepestDescDir; -#pragma warning restore TLC_GeneralName +#pragma warning restore MSML_GeneralName /// /// The dimensionality of the function @@ -493,8 +493,6 @@ internal virtual bool LineSearch(IChannel ch, bool force) }); } - //if (_newX.AlmostEquals(_x)) throw new PrematureConvergenceException(this, "Step size interval numerically zero."); - Value = Eval(ref _newX, ref _newGrad); GradientCalculations++; if (!FloatUtils.IsFinite(Value)) diff --git a/src/Microsoft.ML.StandardLearners/Standard/LinearClassificationTrainer.cs b/src/Microsoft.ML.StandardLearners/Standard/LinearClassificationTrainer.cs index 56a3663054..04d3e2d9e4 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/LinearClassificationTrainer.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/LinearClassificationTrainer.cs @@ -44,62 +44,57 @@ namespace Microsoft.ML.Runtime.Learners using Stopwatch = System.Diagnostics.Stopwatch; using TScalarPredictor = IPredictorWithFeatureWeights; - public abstract class LinearTrainerBase : TrainerBase + public abstract class LinearTrainerBase : TrainerBase where TPredictor : IPredictor { - protected int NumFeatures; - protected VBuffer[] Weights; - protected Float[] Bias; protected bool NeedShuffle; - public override bool NeedNormalization => true; - - public override bool WantCaching => true; + private static readonly TrainerInfo _info = new TrainerInfo(); + public override TrainerInfo Info => _info; /// /// Whether data is to be shuffled every epoch. /// protected abstract bool ShuffleData { get; } - protected LinearTrainerBase(IHostEnvironment env, string name) + private protected LinearTrainerBase(IHostEnvironment env, string name) : base(env, name) { } - protected void TrainEx(RoleMappedData data, LinearPredictor predictor) + public override TPredictor Train(TrainContext context) { + Host.CheckValue(context, nameof(context)); + TPredictor pred; using (var ch = Host.Start("Training")) { - ch.AssertValue(data, nameof(data)); - ch.AssertValueOrNull(predictor); - var preparedData = PrepareDataFromTrainingExamples(ch, data); - TrainCore(ch, preparedData, predictor); + var preparedData = PrepareDataFromTrainingExamples(ch, context.TrainingSet, out int weightSetCount); + var initPred = context.InitialPredictor; + var linInitPred = (initPred as CalibratedPredictorBase)?.SubPredictor as LinearPredictor; + linInitPred = linInitPred ?? initPred as LinearPredictor; + Host.CheckParam(context.InitialPredictor == null || linInitPred != null, nameof(context), + "Initial predictor was not a linear predictor."); + pred = TrainCore(ch, preparedData, linInitPred, weightSetCount); ch.Done(); } + return pred; } - public override void Train(RoleMappedData examples) - { - Host.CheckValue(examples, nameof(examples)); - TrainEx(examples, null); - } - - protected abstract void TrainCore(IChannel ch, RoleMappedData data, LinearPredictor predictor); - - /// - /// Gets the size of weights and bias array. For binary classification and regression, this is 1. - /// For multi-class classification, this equals the number of classes. - /// - protected abstract int WeightArraySize { get; } + protected abstract TPredictor TrainCore(IChannel ch, RoleMappedData data, LinearPredictor predictor, int weightSetCount); /// /// This method ensures that the data meets the requirements of this trainer and its /// subclasses, injects necessary transforms, and throws if it couldn't meet them. /// - protected RoleMappedData PrepareDataFromTrainingExamples(IChannel ch, RoleMappedData examples) + /// The channel + /// The training examples + /// Gets the length of weights and bias array. For binary classification and regression, + /// this is 1. For multi-class classification, this equals the number of classes on the label. + /// A potentially modified version of + protected RoleMappedData PrepareDataFromTrainingExamples(IChannel ch, RoleMappedData examples, out int weightSetCount) { ch.AssertValue(examples); - CheckLabel(examples); + CheckLabel(examples, out weightSetCount); examples.CheckFeatureFloatVector(); var idvToShuffle = examples.Data; IDataView idvToFeedTrain; @@ -118,19 +113,19 @@ protected RoleMappedData PrepareDataFromTrainingExamples(IChannel ch, RoleMapped ch.Assert(idvToFeedTrain.CanShuffle); var roles = examples.Schema.GetColumnRoleNames(); - var examplesToFeedTrain = RoleMappedData.Create(idvToFeedTrain, roles); + var examplesToFeedTrain = new RoleMappedData(idvToFeedTrain, roles); - ch.Assert(examplesToFeedTrain.Schema.Label != null); - ch.Assert(examplesToFeedTrain.Schema.Feature != null); + ch.AssertValue(examplesToFeedTrain.Schema.Label); + ch.AssertValue(examplesToFeedTrain.Schema.Feature); if (examples.Schema.Weight != null) - ch.Assert(examplesToFeedTrain.Schema.Weight != null); + ch.AssertValue(examplesToFeedTrain.Schema.Weight); - NumFeatures = examplesToFeedTrain.Schema.Feature.Type.VectorSize; - ch.Check(NumFeatures > 0, "Training set has 0 instances, aborting training."); + int numFeatures = examplesToFeedTrain.Schema.Feature.Type.VectorSize; + ch.Check(numFeatures > 0, "Training set has no features, aborting training."); return examplesToFeedTrain; } - protected abstract void CheckLabel(RoleMappedData examples); + protected abstract void CheckLabel(RoleMappedData examples, out int weightSetCount); protected Float WDot(ref VBuffer features, ref VBuffer weights, Float bias) { @@ -165,13 +160,13 @@ public abstract class ArgumentsBase : LearnerInputBaseWithLabel { [Argument(ArgumentType.AtMostOnce, HelpText = "L2 regularizer constant. By default the l2 constant is automatically inferred based on data set.", NullName = "", ShortName = "l2", SortOrder = 1)] [TGUI(Label = "L2 Regularizer Constant", SuggestedSweeps = ",1e-7,1e-6,1e-5,1e-4,1e-3,1e-2")] - [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[] { "", 1e-7f, 1e-6f, 1e-5f, 1e-4f, 1e-3f, 1e-2f })] + [TlcModule.SweepableDiscreteParam("L2Const", new object[] { "", 1e-7f, 1e-6f, 1e-5f, 1e-4f, 1e-3f, 1e-2f })] public Float? L2Const; // REVIEW: make the default positive when we know how to consume a sparse model [Argument(ArgumentType.AtMostOnce, HelpText = "L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set.", NullName = "", ShortName = "l1", SortOrder = 2)] [TGUI(Label = "L1 Soft Threshold", SuggestedSweeps = ",0,0.25,0.5,0.75,1")] - [TlcModule.SweepableDiscreteParamAttribute("L1Threshold", new object[] { "", 0f, 0.25f, 0.5f, 0.75f, 1f })] + [TlcModule.SweepableDiscreteParam("L1Threshold", new object[] { "", 0f, 0.25f, 0.5f, 0.75f, 1f })] public Float? L1Threshold; [Argument(ArgumentType.AtMostOnce, HelpText = "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", NullName = "", ShortName = "nt,t,threads", SortOrder = 50)] @@ -180,16 +175,16 @@ public abstract class ArgumentsBase : LearnerInputBaseWithLabel [Argument(ArgumentType.AtMostOnce, HelpText = "The tolerance for the ratio between duality gap and primal loss for convergence checking.", ShortName = "tol")] [TGUI(SuggestedSweeps = "0.001, 0.01, 0.1, 0.2")] - [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[] { 0.001f, 0.01f, 0.1f, 0.2f })] + [TlcModule.SweepableDiscreteParam("ConvergenceTolerance", new object[] { 0.001f, 0.01f, 0.1f, 0.2f })] public Float ConvergenceTolerance = 0.1f; [Argument(ArgumentType.AtMostOnce, HelpText = "Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic.", NullName = "", ShortName = "iter")] [TGUI(Label = "Max number of iterations", SuggestedSweeps = ",10,20,100")] - [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[] { "", 10, 20, 100 })] + [TlcModule.SweepableDiscreteParam("MaxIterations", new object[] { "", 10, 20, 100 })] public int? MaxIterations; [Argument(ArgumentType.AtMostOnce, HelpText = "Shuffle data every epoch?", ShortName = "shuf")] - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", null, isBool:true)] + [TlcModule.SweepableDiscreteParam("Shuffle", null, isBool: true)] public bool Shuffle = true; [Argument(ArgumentType.AtMostOnce, HelpText = "Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations.", NullName = "", ShortName = "checkFreq")] @@ -197,7 +192,7 @@ public abstract class ArgumentsBase : LearnerInputBaseWithLabel [Argument(ArgumentType.AtMostOnce, HelpText = "The learning rate for adjusting bias from being regularized.", ShortName = "blr")] [TGUI(SuggestedSweeps = "0, 0.01, 0.1, 1")] - [TlcModule.SweepableDiscreteParamAttribute("BiasLearningRate", new object[] { 0.0f, 0.01f, 0.1f, 1f })] + [TlcModule.SweepableDiscreteParam("BiasLearningRate", new object[] { 0.0f, 0.01f, 0.1f, 1f })] public Float BiasLearningRate = 0; internal virtual void Check(IHostEnvironment env) @@ -217,6 +212,7 @@ internal virtual void Check(IHostEnvironment env) "could drastically slow down the convergence. So using l2Const = {1} instead.", L2Const); L2Const = L2LowerBound; + ch.Done(); } } } @@ -235,20 +231,15 @@ protected enum MetricKind // The maximum number of dual variables SDCA intends to support. // Actual bound of training dataset size may depend on hardware limit. - // Note that currently the maximum dimension linear learners can support is about 2 billion, - // it is not clear if training a linear learner with more than 10^15 examples provides + // Note that currently the maximum dimension linear learners can support is about 2 billion, + // it is not clear if training a linear learner with more than 10^15 examples provides // substantial additional benefits in terms of accuracy. private const long MaxDualTableSize = 1L << 50; private const Float L2LowerBound = 1e-09f; private readonly ArgumentsBase _args; protected ISupportSdcaLoss Loss; - public override bool NeedNormalization - { - get { return true; } - } - - protected override bool ShuffleData { get { return _args.Shuffle; } } + protected override bool ShuffleData => _args.Shuffle; protected SdcaTrainerBase(ArgumentsBase args, IHostEnvironment env, string name) : base(env, name) @@ -257,13 +248,13 @@ protected SdcaTrainerBase(ArgumentsBase args, IHostEnvironment env, string name) _args.Check(env); } - protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredictor predictor) + protected sealed override TPredictor TrainCore(IChannel ch, RoleMappedData data, LinearPredictor predictor, int weightSetCount) { Contracts.Assert(predictor == null, "SDCA based trainers don't support continuous training."); - Contracts.Assert(NumFeatures > 0, "Number of features must be assigned prior to passing into TrainCore."); - int weightArraySize = WeightArraySize; - Contracts.Assert(weightArraySize >= 1); - long maxTrainingExamples = MaxDualTableSize / weightArraySize; + Contracts.Assert(weightSetCount >= 1); + + int numFeatures = data.Schema.Feature.Type.VectorSize; + long maxTrainingExamples = MaxDualTableSize / weightSetCount; var cursorFactory = new FloatLabelCursor.Factory(data, CursOpt.Label | CursOpt.Features | CursOpt.Weight | CursOpt.Id); int numThreads; if (_args.NumThreads.HasValue) @@ -301,8 +292,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic ch.Assert(checkFrequency > 0); var pOptions = new ParallelOptions { MaxDegreeOfParallelism = numThreads }; - var converged = false; - var watch = new Stopwatch(); + bool converged = false; // Getting the total count of rows in data. Ignore rows with bad label and feature values. long count = 0; @@ -350,7 +340,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic // REVIEW: Is 1024 a good lower bound to enforce sparsity? if (1024 < count && count < (long)idLoMax / 5) { - // The distribution of id.Lo is sparse in [0, idLoMax]. + // The distribution of id.Lo is sparse in [0, idLoMax]. // Building a lookup table is more memory efficient. needLookup = true; } @@ -361,7 +351,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic { // Note: At this point, 'count' may be less than the actual count of training examples. // We initialize the hash table with this partial size to avoid unnecessary rehashing. - // However, it does not mean there are exactly 'count' many trainining examples. + // However, it does not mean there are exactly 'count' many trainining examples. // Necessary rehashing will still occur as the hash table grows. idToIdx = new IdToIdxLookup(count); // Resetting 'count' to zero. @@ -398,24 +388,24 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic Contracts.Assert(_args.L2Const.HasValue); if (_args.L1Threshold == null) - _args.L1Threshold = TuneDefaultL1(ch, NumFeatures); + _args.L1Threshold = TuneDefaultL1(ch, numFeatures); ch.Assert(_args.L1Threshold.HasValue); var l1Threshold = _args.L1Threshold.Value; var l1ThresholdZero = l1Threshold == 0; - VBuffer[] weights = new VBuffer[weightArraySize]; - VBuffer[] bestWeights = new VBuffer[weightArraySize]; - VBuffer[] l1IntermediateWeights = l1ThresholdZero ? null : new VBuffer[weightArraySize]; - Float[] biasReg = new Float[weightArraySize]; - Float[] bestBiasReg = new Float[weightArraySize]; - Float[] biasUnreg = new Float[weightArraySize]; - Float[] bestBiasUnreg = new Float[weightArraySize]; - Float[] l1IntermediateBias = l1ThresholdZero ? null : new Float[weightArraySize]; - - for (int i = 0; i < weightArraySize; i++) + var weights = new VBuffer[weightSetCount]; + var bestWeights = new VBuffer[weightSetCount]; + var l1IntermediateWeights = l1ThresholdZero ? null : new VBuffer[weightSetCount]; + var biasReg = new Float[weightSetCount]; + var bestBiasReg = new Float[weightSetCount]; + var biasUnreg = new Float[weightSetCount]; + var bestBiasUnreg = new Float[weightSetCount]; + var l1IntermediateBias = l1ThresholdZero ? null : new Float[weightSetCount]; + + for (int i = 0; i < weightSetCount; i++) { - weights[i] = VBufferUtils.CreateDense(NumFeatures); - bestWeights[i] = VBufferUtils.CreateDense(NumFeatures); + weights[i] = VBufferUtils.CreateDense(numFeatures); + bestWeights[i] = VBufferUtils.CreateDense(numFeatures); biasReg[i] = 0; bestBiasReg[i] = 0; biasUnreg[i] = 0; @@ -423,7 +413,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic if (!l1ThresholdZero) { - l1IntermediateWeights[i] = VBufferUtils.CreateDense(NumFeatures); + l1IntermediateWeights[i] = VBufferUtils.CreateDense(numFeatures); l1IntermediateBias[i] = 0; } } @@ -441,7 +431,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic if (idToIdx == null) { Contracts.Assert(!needLookup); - long dualsLength = ((long)idLoMax + 1) * WeightArraySize; + long dualsLength = ((long)idLoMax + 1) * weightSetCount; if (dualsLength <= Utils.ArrayMaxSize) { // The dual variables fit into a standard float[]. @@ -454,8 +444,8 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic else { // The dual variables do not fit into standard float[]. - // Using BigArray instead. - // Storing the invariants gives rise to too large memory consumption, + // Using BigArray instead. + // Storing the invariants gives rise to too large memory consumption, // so we favor re-computing the invariants instead of storing them. Contracts.Assert(dualsLength <= MaxDualTableSize); duals = new BigArrayDualsTable(dualsLength); @@ -465,7 +455,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic { // Similar logic as above when using the id-to-index lookup. Contracts.Assert(needLookup); - long dualsLength = count * WeightArraySize; + long dualsLength = count * weightSetCount; if (dualsLength <= Utils.ArrayMaxSize) { duals = new StandardArrayDualsTable((int)dualsLength); @@ -497,8 +487,6 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic ch.Assert(_args.MaxIterations.HasValue); var maxIterations = _args.MaxIterations.Value; - watch.Start(); - var rands = new IRandom[maxIterations]; for (int i = 0; i < maxIterations; i++) rands[i] = RandomUtils.Create(Host.Rand.Next()); @@ -506,9 +494,9 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic // If we favor storing the invariants, precompute the invariants now. if (invariants != null) { - Contracts.Assert((idToIdx == null & ((long)idLoMax + 1) * WeightArraySize <= Utils.ArrayMaxSize) | (idToIdx != null & count * WeightArraySize <= Utils.ArrayMaxSize)); - Func getIndexFromIdAndRow = GetIndexFromIdAndRowGetter(idToIdx); - int invariantCoeff = WeightArraySize == 1 ? 1 : 2; + Contracts.Assert((idToIdx == null & ((long)idLoMax + 1) * weightSetCount <= Utils.ArrayMaxSize) | (idToIdx != null & count * weightSetCount <= Utils.ArrayMaxSize)); + Func getIndexFromIdAndRow = GetIndexFromIdAndRowGetter(idToIdx, biasReg.Length); + int invariantCoeff = weightSetCount == 1 ? 1 : 2; using (var cursor = cursorFactory.Create()) using (var pch = Host.StartProgressChannel("SDCA invariants initialization")) { @@ -543,7 +531,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic pch.SetHeader(new ProgressHeader(metricNames, new[] { "iterations" }), e => e.SetProgress(0, iter, maxIterations)); // Separate logic is needed for single-thread execution to ensure the result is deterministic. - // Note that P.Invoke does not ensure that the actions executes in order even if maximum number of threads is set to 1. + // Note that P.Invoke does not ensure that the actions executes in order even if maximum number of threads is set to 1. if (numThreads == 1) { // The synchorized SDCA procedure. @@ -599,23 +587,25 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic } } - Bias = new Float[weightArraySize]; + var bias = new Float[weightSetCount]; if (bestIter > 0) { ch.Info("Using best model from iteration {0}.", bestIter); - Weights = bestWeights; - for (int i = 0; i < weightArraySize; i++) - Bias[i] = bestBiasReg[i] + bestBiasUnreg[i]; + weights = bestWeights; + for (int i = 0; i < weightSetCount; i++) + bias[i] = bestBiasReg[i] + bestBiasUnreg[i]; } else { ch.Info("Using model from last iteration."); - Weights = weights; - for (int i = 0; i < weightArraySize; i++) - Bias[i] = biasReg[i] + biasUnreg[i]; + for (int i = 0; i < weightSetCount; i++) + bias[i] = biasReg[i] + biasUnreg[i]; } + return CreatePredictor(weights, bias); } + protected abstract TPredictor CreatePredictor(VBuffer[] weights, Float[] bias); + // Assign an upper bound for number of iterations based on data set size first. // This ensures SDCA will not run forever... // Based on empirical estimation of max iterations needed. @@ -688,7 +678,7 @@ private void InitializeConvergenceMetrics(out string[] names, out Double[] initi /// It may be null. When it is null, the training examples are not shuffled and are cursored in its original order. /// /// - /// The id to index mapping. May be null. If it is null, the index is given by the + /// The id to index mapping. May be null. If it is null, the index is given by the /// corresponding lower bits of the id. /// /// The number of threads used in parallel training. It is used in computing the dual update. @@ -696,33 +686,33 @@ private void InitializeConvergenceMetrics(out string[] names, out Double[] initi /// The dual variables. For binary classification and regression, there is one dual variable per row. /// For multiclass classification, there is one dual variable per class per row. /// - /// The array containing regularized bias terms. For binary classification or regression, + /// The array containing regularized bias terms. For binary classification or regression, /// it contains only a single value. For multiclass classification its size equals the number of classes. /// - /// The dual updates invariants. It may be null. If not null, it holds an array of pre-computed numerical quantities + /// The dual updates invariants. It may be null. If not null, it holds an array of pre-computed numerical quantities /// that depend on the training example label and features, not the value of dual variables. /// /// The precomputed numerical quantity 1 / (l2Const * (count of training examples)). /// - /// The weights array. For binary classification or regression, it consists of only one VBuffer. + /// The weights array. For binary classification or regression, it consists of only one VBuffer. /// For multiclass classification, its size equals the number of classes. /// /// - /// The array containing unregularized bias terms. For binary classification or regression, - /// it contains only a single value. For multiclass classification its size equals the number of classes. + /// The array containing unregularized bias terms. For binary classification or regression, + /// it contains only a single value. For multiclass classification its size equals the number of classes. /// /// - /// The array holding the intermediate weights prior to making L1 shrinkage adjustment. It is null iff l1Threshold is zero. - /// Otherwise, for binary classification or regression, it consists of only one VBuffer; + /// The array holding the intermediate weights prior to making L1 shrinkage adjustment. It is null iff l1Threshold is zero. + /// Otherwise, for binary classification or regression, it consists of only one VBuffer; /// for multiclass classification, its size equals the number of classes. /// /// - /// The array holding the intermediate bias prior to making L1 shrinkage adjustment. It is null iff l1Threshold is zero. - /// Otherwise, for binary classification or regression, it consists of only one value; + /// The array holding the intermediate bias prior to making L1 shrinkage adjustment. It is null iff l1Threshold is zero. + /// Otherwise, for binary classification or regression, it consists of only one value; /// for multiclass classification, its size equals the number of classes. /// /// - /// The array holding the pre-computed squared L2-norm of features for each training example. It may be null. It is always null for + /// The array holding the pre-computed squared L2-norm of features for each training example. It may be null. It is always null for /// binary classification and regression because this quantity is not needed. /// protected virtual void TrainWithoutLock(IProgressChannelProvider progress, FloatLabelCursor.Factory cursorFactory, IRandom rand, @@ -746,7 +736,7 @@ protected virtual void TrainWithoutLock(IProgressChannelProvider progress, Float if (pch != null) pch.SetHeader(new ProgressHeader("examples"), e => e.SetProgress(0, rowCount)); - Func getIndexFromId = GetIndexFromIdGetter(idToIdx); + Func getIndexFromId = GetIndexFromIdGetter(idToIdx, biasReg.Length); while (cursor.MoveNext()) { long idx = getIndexFromId(cursor.Id); @@ -772,7 +762,7 @@ protected virtual void TrainWithoutLock(IProgressChannelProvider progress, Float var dualUpdate = Loss.DualUpdate(output, label, dual, invariant, numThreads); // The successive over-relaxation apporach to adjust the sum of dual variables (biasReg) to zero. - // Reference to details: http://stat.rutgers.edu/home/tzhang/papers/ml02_dual.pdf pp. 16-17. + // Reference to details: http://stat.rutgers.edu/home/tzhang/papers/ml02_dual.pdf pp. 16-17. var adjustment = l1ThresholdZero ? lr * biasReg[0] : lr * l1IntermediateBias[0]; dualUpdate -= adjustment; bool success = false; @@ -822,7 +812,7 @@ protected virtual void TrainWithoutLock(IProgressChannelProvider progress, Float } /// - /// Returns whether the algorithm converged, and also populates the + /// Returns whether the algorithm converged, and also populates the /// (which is expected to be parallel to the names returned by ). /// When called, the is expected to hold the previously reported values. /// @@ -834,33 +824,33 @@ protected virtual void TrainWithoutLock(IProgressChannelProvider progress, Float /// For multiclass classification, there is one dual variable per class per row. /// /// - /// The id to index mapping. May be null. If it is null, the index is given by the + /// The id to index mapping. May be null. If it is null, the index is given by the /// corresponding lower bits of the id. /// /// - /// The weights array. For binary classification or regression, it consists of only one VBuffer. + /// The weights array. For binary classification or regression, it consists of only one VBuffer. /// For multiclass classification, its size equals the number of classes. /// /// - /// The weights array that corresponds to the best model obtained from the training iterations thus far. + /// The weights array that corresponds to the best model obtained from the training iterations thus far. /// /// - /// The array containing unregularized bias terms. For binary classification or regression, - /// it contains only a single value. For multiclass classification its size equals the number of classes. + /// The array containing unregularized bias terms. For binary classification or regression, + /// it contains only a single value. For multiclass classification its size equals the number of classes. /// /// - /// The array containing unregularized bias terms corresponding to the best model obtained from the training iterations thus far. - /// For binary classification or regression, it contains only a single value. - /// For multiclass classification its size equals the number of classes. + /// The array containing unregularized bias terms corresponding to the best model obtained from the training iterations thus far. + /// For binary classification or regression, it contains only a single value. + /// For multiclass classification its size equals the number of classes. /// /// - /// The array containing regularized bias terms. For binary classification or regression, - /// it contains only a single value. For multiclass classification its size equals the number of classes. + /// The array containing regularized bias terms. For binary classification or regression, + /// it contains only a single value. For multiclass classification its size equals the number of classes. /// /// - /// The array containing regularized bias terms corresponding to the best model obtained from the training iterations thus far. - /// For binary classification or regression, it contains only a single value. - /// For multiclass classification its size equals the number of classes. + /// The array containing regularized bias terms corresponding to the best model obtained from the training iterations thus far. + /// For binary classification or regression, it contains only a single value. + /// For multiclass classification its size equals the number of classes. /// /// /// The count of (valid) training examples. Bad training examples are excluded from this count. @@ -901,7 +891,7 @@ protected virtual bool CheckConvergence( using (var cursor = cursorFactory.Create()) { long row = 0; - Func getIndexFromIdAndRow = GetIndexFromIdAndRowGetter(idToIdx); + Func getIndexFromIdAndRow = GetIndexFromIdAndRowGetter(idToIdx, biasReg.Length); // Iterates through data to compute loss function. while (cursor.MoveNext()) { @@ -939,7 +929,7 @@ protected virtual bool CheckConvergence( if (metrics[(int)MetricKind.Loss] < bestPrimalLoss) { - // Maintain a copy of weights and bias with best primal loss thus far. + // Maintain a copy of weights and bias with best primal loss thus far. // This is some extra work and uses extra memory, but it seems worth doing it. // REVIEW: Sparsify bestWeights? weights[0].CopyTo(ref bestWeights[0]); @@ -967,7 +957,7 @@ protected virtual Float[] InitializeFeatureNormSquared(int length) protected delegate void Visitor(long index, ref Float value); /// - /// Encapsulates the common functionality of storing and + /// Encapsulates the common functionality of storing and /// retrieving the dual variables. /// protected abstract class DualsTableBase @@ -994,8 +984,8 @@ public StandardArrayDualsTable(int length) public override Float this[long index] { - get { return _duals[(int)index]; } - set { _duals[(int)index] = value; } + get => _duals[(int)index]; + set => _duals[(int)index] = value; } public override void ApplyAt(long index, Visitor manip) @@ -1011,7 +1001,7 @@ private sealed class BigArrayDualsTable : DualsTableBase { private BigArray _duals; - public override long Length { get { return _duals.Length; } } + public override long Length => _duals.Length; public BigArrayDualsTable(long length) { @@ -1021,14 +1011,8 @@ public BigArrayDualsTable(long length) public override Float this[long index] { - get - { - return _duals[index]; - } - set - { - _duals[index] = value; - } + get => _duals[index]; + set => _duals[index] = value; } public override void ApplyAt(long index, Visitor manip) @@ -1042,10 +1026,10 @@ public override void ApplyAt(long index, Visitor manip) /// Returns a function delegate to retrieve index from id. /// This is to avoid redundant conditional branches in the tight loop of training. /// - protected Func GetIndexFromIdGetter(IdToIdxLookup idToIdx) + protected Func GetIndexFromIdGetter(IdToIdxLookup idToIdx, int biasLength) { Contracts.AssertValueOrNull(idToIdx); - long maxTrainingExamples = MaxDualTableSize / WeightArraySize; + long maxTrainingExamples = MaxDualTableSize / biasLength; if (idToIdx == null) { return (UInt128 id) => @@ -1073,10 +1057,10 @@ protected Func GetIndexFromIdGetter(IdToIdxLookup idToIdx) /// Only works if the cursor is not shuffled. /// This is to avoid redundant conditional branches in the tight loop of training. /// - protected Func GetIndexFromIdAndRowGetter(IdToIdxLookup idToIdx) + protected Func GetIndexFromIdAndRowGetter(IdToIdxLookup idToIdx, int biasLength) { Contracts.AssertValueOrNull(idToIdx); - long maxTrainingExamples = MaxDualTableSize / WeightArraySize; + long maxTrainingExamples = MaxDualTableSize / biasLength; if (idToIdx == null) { return (UInt128 id, long row) => @@ -1102,20 +1086,20 @@ protected Func GetIndexFromIdAndRowGetter(IdToIdxLookup idT } } - // REVIEW: This data structure is an extension of HashArray. It may have general + // REVIEW: This data structure is an extension of HashArray. It may have general // purpose of usage to store Id. Should consider lifting this class in the future. - // This class can also be made to accommodate generic type, as long as the type implements a + // This class can also be made to accommodate generic type, as long as the type implements a // good 64-bit hash function. /// /// A hash table data structure to store Id of type , - /// and accommodates size larger than 2 billion. This class is an extension based on BCL. - /// Two operations are supported: adding and retrieving an id with asymptotically constant complexity. - /// The bucket size are prime numbers, starting from 3 and grows to the next prime larger than - /// double the current size until it reaches the maximum possible size. When a table growth is triggered, + /// and accommodates size larger than 2 billion. This class is an extension based on BCL. + /// Two operations are supported: adding and retrieving an id with asymptotically constant complexity. + /// The bucket size are prime numbers, starting from 3 and grows to the next prime larger than + /// double the current size until it reaches the maximum possible size. When a table growth is triggered, /// the table growing operation initializes a new larger bucket and rehash the existing entries to /// the new bucket. Such operation has an expected complexity proportional to the size. /// - protected internal sealed class IdToIdxLookup + protected sealed class IdToIdxLookup { // Utilizing this struct gives better cache behavior than using parallel arrays. private struct Entry @@ -1142,7 +1126,7 @@ public Entry(long itNext, UInt128 value) /// /// Gets the count of id entries. /// - public long Count { get { return _count; } } + public long Count => _count; /// /// Initializes an instance of the class with the specified size. @@ -1304,7 +1288,7 @@ private static class HashHelpers public const long MaxPrime = 0x7FFFFFFFFFFFFFE7; // Table of prime numbers to use as hash table sizes. - // Each subsequent prime, except the last in the list, ensures that the table will at least double in size + // Each subsequent prime, except the last in the list, ensures that the table will at least double in size // upon each growth in order to improve the efficiency of the hash table. // See https://oeis.org/A065545 for the sequence with a[1] = 3, a[k] = next_prime(2 * a[k - 1]). public static readonly long[] Primes = @@ -1319,7 +1303,7 @@ private static class HashHelpers 6173400291209582429, MaxPrime }; - // Returns size of hashtable to grow to. + // Returns size of hashtable to grow to. public static long ExpandPrime(long oldSize) { long newSize = 2 * oldSize; @@ -1368,7 +1352,7 @@ public void Add(Double summand) } } - public sealed class LinearClassificationTrainer : SdcaTrainerBase, ITrainer, ITrainerEx + public sealed class LinearClassificationTrainer : SdcaTrainerBase { public const string LoadNameValue = "SDCA"; public const string UserNameValue = "Fast Linear (SA-SDCA)"; @@ -1402,57 +1386,48 @@ internal override void Check(IHostEnvironment env) public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; - public override bool NeedCalibration => !(_loss is LogLoss); - - protected override int WeightArraySize => 1; + public override TrainerInfo Info { get; } public LinearClassificationTrainer(IHostEnvironment env, Arguments args) : base(args, env, LoadNameValue) { _loss = args.LossFunction.CreateComponent(env); base.Loss = _loss; + Info = new TrainerInfo(calibration: !(_loss is LogLoss)); NeedShuffle = args.Shuffle; _args = args; _positiveInstanceWeight = _args.PositiveInstanceWeight; } - public override IPredictor CreatePredictor() + protected override TScalarPredictor CreatePredictor(VBuffer[] weights, Float[] bias) { - Contracts.Assert(WeightArraySize == 1); - Contracts.Assert(Utils.Size(Weights) == 1); - Contracts.Assert(Utils.Size(Bias) == 1); - Host.Check(Weights[0].Length > 0); - VBuffer maybeSparseWeights = VBufferUtils.CreateEmpty(Weights[0].Length); - VBufferUtils.CreateMaybeSparseCopy(ref Weights[0], ref maybeSparseWeights, Conversions.Instance.GetIsDefaultPredicate(NumberType.Float)); - var predictor = new LinearBinaryPredictor(Host, ref maybeSparseWeights, Bias[0]); + Host.CheckParam(Utils.Size(weights) == 1, nameof(weights)); + Host.CheckParam(Utils.Size(bias) == 1, nameof(bias)); + Host.CheckParam(weights[0].Length > 0, nameof(weights)); + + VBuffer maybeSparseWeights = default; + VBufferUtils.CreateMaybeSparseCopy(ref weights[0], ref maybeSparseWeights, + Conversions.Instance.GetIsDefaultPredicate(NumberType.Float)); + var predictor = new LinearBinaryPredictor(Host, ref maybeSparseWeights, bias[0]); if (!(_loss is LogLoss)) return predictor; return new ParameterMixingCalibratedPredictor(Host, predictor, new PlattCalibrator(Host, -1, 0)); } - TScalarPredictor ITrainer.CreatePredictor() - { - var predictor = CreatePredictor() as TScalarPredictor; - Contracts.AssertValue(predictor); - return predictor; - } - protected override Float GetInstanceWeight(FloatLabelCursor cursor) { return cursor.Label > 0 ? cursor.Weight * _positiveInstanceWeight : cursor.Weight; } - protected override void CheckLabel(RoleMappedData examples) + protected override void CheckLabel(RoleMappedData examples, out int weightSetCount) { examples.CheckBinaryLabel(); + weightSetCount = 1; } } public sealed class StochasticGradientDescentClassificationTrainer : - LinearTrainerBase, - IIncrementalTrainer, - ITrainer, - ITrainerEx + LinearTrainerBase { public const string LoadNameValue = "BinarySGD"; public const string UserNameValue = "Hogwild SGD (binary)"; @@ -1465,7 +1440,7 @@ public sealed class Arguments : LearnerInputBaseWithWeight [Argument(ArgumentType.AtMostOnce, HelpText = "L2 regularizer constant", ShortName = "l2", SortOrder = 50)] [TGUI(Label = "L2 Regularizer Constant", SuggestedSweeps = "1e-7,5e-7,1e-6,5e-6,1e-5")] - [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[] { 1e-7f, 5e-7f, 1e-6f, 5e-6f, 1e-5f })] + [TlcModule.SweepableDiscreteParam("L2Const", new object[] { 1e-7f, 5e-7f, 1e-6f, 5e-6f, 1e-5f })] public Float L2Const = (Float)1e-6; [Argument(ArgumentType.AtMostOnce, HelpText = "Degree of lock-free parallelism. Defaults to automatic depending on data sparseness. Determinism not guaranteed.", ShortName = "nt,t,threads", SortOrder = 50)] @@ -1474,12 +1449,12 @@ public sealed class Arguments : LearnerInputBaseWithWeight [Argument(ArgumentType.AtMostOnce, HelpText = "Exponential moving averaged improvement tolerance for convergence", ShortName = "tol")] [TGUI(SuggestedSweeps = "1e-2,1e-3,1e-4,1e-5")] - [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[] { 1e-2f, 1e-3f, 1e-4f, 1e-5f })] + [TlcModule.SweepableDiscreteParam("ConvergenceTolerance", new object[] { 1e-2f, 1e-3f, 1e-4f, 1e-5f })] public Double ConvergenceTolerance = 1e-4; [Argument(ArgumentType.AtMostOnce, HelpText = "Maximum number of iterations; set to 1 to simulate online learning.", ShortName = "iter")] [TGUI(Label = "Max number of iterations", SuggestedSweeps = "1,5,10,20")] - [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[] { 1, 5, 10, 20 })] + [TlcModule.SweepableDiscreteParam("MaxIterations", new object[] { 1, 5, 10, 20 })] public int MaxIterations = 20; [Argument(ArgumentType.AtMostOnce, HelpText = "Initial learning rate (only used by SGD)", ShortName = "ilr,lr")] @@ -1487,7 +1462,7 @@ public sealed class Arguments : LearnerInputBaseWithWeight public Double InitLearningRate = 0.01; [Argument(ArgumentType.AtMostOnce, HelpText = "Shuffle data every epoch?", ShortName = "shuf")] - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", null, isBool:true)] + [TlcModule.SweepableDiscreteParam("Shuffle", null, isBool: true)] public bool Shuffle = true; [Argument(ArgumentType.AtMostOnce, HelpText = "Apply weight to the positive class, for imbalanced data", ShortName = "piw")] @@ -1502,15 +1477,23 @@ public sealed class Arguments : LearnerInputBaseWithWeight [Argument(ArgumentType.AtMostOnce, HelpText = "The maximum number of examples to use when training the calibrator", Visibility = ArgumentAttribute.VisibilityType.EntryPointsOnly)] public int MaxCalibrationExamples = 1000000; - public void Check(ITrainerHost host) + internal void Check(IHostEnvironment env) { - Contracts.CheckUserArg(L2Const >= 0, nameof(L2Const), "L2 constant must be non-negative."); - Contracts.CheckUserArg(InitLearningRate > 0, nameof(InitLearningRate), "Initial learning rate must be positive."); - Contracts.CheckUserArg(MaxIterations > 0, nameof(MaxIterations), "Max number of iterations must be positive."); - Contracts.CheckUserArg(PositiveInstanceWeight > 0, nameof(PositiveInstanceWeight), "Weight for positive instances must be positive"); + Contracts.CheckValue(env, nameof(env)); + env.CheckUserArg(L2Const >= 0, nameof(L2Const), "Must be non-negative."); + env.CheckUserArg(InitLearningRate > 0, nameof(InitLearningRate), "Must be positive."); + env.CheckUserArg(MaxIterations > 0, nameof(MaxIterations), "Must be positive."); + env.CheckUserArg(PositiveInstanceWeight > 0, nameof(PositiveInstanceWeight), "Must be positive"); if (InitLearningRate * L2Const >= 1) - host.StdOut.WriteLine("Learning rate {0} set too high; reducing to {1}", InitLearningRate, InitLearningRate = (Float)0.5 / L2Const); + { + using (var ch = env.Start("Argument Adjustment")) + { + ch.Warning("{0} {1} set too high; reducing to {1}", nameof(InitLearningRate), + InitLearningRate, InitLearningRate = (Float)0.5 / L2Const); + ch.Done(); + } + } if (ConvergenceTolerance <= 0) ConvergenceTolerance = Float.Epsilon; @@ -1520,63 +1503,34 @@ public void Check(ITrainerHost host) private readonly IClassificationLoss _loss; private readonly Arguments _args; - protected override bool ShuffleData { get { return _args.Shuffle; } } - - protected override int WeightArraySize { get { return 1; } } + protected override bool ShuffleData => _args.Shuffle; - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; - public override bool NeedCalibration - { - get { return !(_loss is LogLoss); } - } + public override TrainerInfo Info { get; } public StochasticGradientDescentClassificationTrainer(IHostEnvironment env, Arguments args) : base(env, LoadNameValue) { + args.Check(env); _loss = args.LossFunction.CreateComponent(env); + Info = new TrainerInfo(calibration: !(_loss is LogLoss), supportIncrementalTrain: true); NeedShuffle = args.Shuffle; _args = args; } - public override IPredictor CreatePredictor() - { - Contracts.Assert(WeightArraySize == 1); - Contracts.Assert(Utils.Size(Weights) == 1); - Contracts.Assert(Utils.Size(Bias) == 1); - Host.Check(Weights[0].Length > 0); - VBuffer maybeSparseWeights = VBufferUtils.CreateEmpty(Weights[0].Length); - VBufferUtils.CreateMaybeSparseCopy(ref Weights[0], ref maybeSparseWeights, Conversions.Instance.GetIsDefaultPredicate(NumberType.Float)); - var predictor = new LinearBinaryPredictor(Host, ref maybeSparseWeights, Bias[0]); - if (!(_loss is LogLoss)) - return predictor; - return new ParameterMixingCalibratedPredictor(Host, predictor, new PlattCalibrator(Host, -1, 0)); - } - - TScalarPredictor ITrainer.CreatePredictor() - { - var predictor = CreatePredictor() as TScalarPredictor; - Contracts.AssertValue(predictor); - return predictor; - } - - public void Train(RoleMappedData data, IPredictor predictor) - { - Host.CheckValue(data, nameof(data)); - Host.CheckValue(predictor, nameof(predictor)); - LinearPredictor pred = (predictor as CalibratedPredictorBase)?.SubPredictor as LinearPredictor; - pred = pred ?? predictor as LinearPredictor; - Host.CheckParam(pred != null, nameof(predictor), "Not a linear predictor."); - TrainEx(data, pred); - } - //For complexity analysis, we assume that // - The number of features is N // - Average number of non-zero per instance is k - protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredictor predictor) + protected override TScalarPredictor TrainCore(IChannel ch, RoleMappedData data, LinearPredictor predictor, int weightSetCount) { - ch.Assert(NumFeatures > 0, "Number of features must be assigned prior to passing into TrainCore."); + Contracts.AssertValue(data); + Contracts.Assert(weightSetCount == 1); + Contracts.AssertValueOrNull(predictor); + + int numFeatures = data.Schema.Feature.Type.VectorSize; var cursorFactory = new FloatLabelCursor.Factory(data, CursOpt.Label | CursOpt.Features | CursOpt.Weight); + int numThreads; if (_args.NumThreads.HasValue) { @@ -1603,7 +1557,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic bias = predictor.Bias; } else - weights = VBufferUtils.CreateDense(NumFeatures); + weights = VBufferUtils.CreateDense(numFeatures); var weightsSync = new object(); double weightScaling = 1; @@ -1612,7 +1566,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic bool converged = false; var watch = new Stopwatch(); - // REVIEW: Investigate using parallel row cursor set instead of getting cursor independently. The convergence of SDCA need to be verified. + // REVIEW: Investigate using parallel row cursor set instead of getting cursor independently. The convergence of SDCA need to be verified. Action checkConvergence = (e, pch) => { if (e % checkFrequency == 0 && e != _args.MaxIterations) @@ -1648,7 +1602,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic watch.Start(); - //Reference: Leon Bottou. Stochastic Gradient Descent Tricks. + //Reference: Leon Bottou. Stochastic Gradient Descent Tricks. //http://research.microsoft.com/pubs/192769/tricks-2012.pdf var trainingTasks = new Action[_args.MaxIterations]; @@ -1669,8 +1623,8 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic Float label = cursor.Label; Float derivative = cursor.Weight * lossFunc.Derivative(WScaledDot(ref features, weightScaling, ref weights, bias), label); // complexity: O(k) - //Note that multiplying the gradient by a weight h is not equivalent to doing h updates - //on the same instance. A potentially better way to do weighted update is described in + //Note that multiplying the gradient by a weight h is not equivalent to doing h updates + //on the same instance. A potentially better way to do weighted update is described in //https://dslpitt.org/uai/papers/11/p392-karampatziakis.pdf if (label > 0) derivative *= positiveInstanceWeight; @@ -1710,7 +1664,7 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic using (var pch = Host.StartProgressChannel("SGD Training")) { // Separate logic is needed for single-thread execution to ensure the result is deterministic. - // Note that P.Invoke does not ensure that the actions executes in order even if maximum number of threads is set to 1. + // Note that P.Invoke does not ensure that the actions executes in order even if maximum number of threads is set to 1. if (numThreads == 1) { int iter = 0; @@ -1742,15 +1696,18 @@ protected override void TrainCore(IChannel ch, RoleMappedData data, LinearPredic VectorUtils.ScaleBy(ref weights, (Float)weightScaling); // restore the true weights - Weights = new VBuffer[1]; - Bias = new Float[1]; - Weights[0] = weights; - Bias[0] = bias; + VBuffer maybeSparseWeights = default; + VBufferUtils.CreateMaybeSparseCopy(ref weights, ref maybeSparseWeights, Conversions.Instance.GetIsDefaultPredicate(NumberType.Float)); + var pred = new LinearBinaryPredictor(Host, ref maybeSparseWeights, bias); + if (!(_loss is LogLoss)) + return pred; + return new ParameterMixingCalibratedPredictor(Host, pred, new PlattCalibrator(Host, -1, 0)); } - protected override void CheckLabel(RoleMappedData examples) + protected override void CheckLabel(RoleMappedData examples, out int weightSetCount) { examples.CheckBinaryLabel(); + weightSetCount = 1; } [TlcModule.EntryPoint(Name = "Trainers.StochasticGradientDescentBinaryClassifier", Desc = "Train an Hogwild SGD binary model.", UserName = UserNameValue, ShortName = ShortName)] @@ -1775,7 +1732,12 @@ public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironm /// public static partial class Sdca { - [TlcModule.EntryPoint(Name = "Trainers.StochasticDualCoordinateAscentBinaryClassifier", Desc = "Train an SDCA binary model.", UserName = LinearClassificationTrainer.UserNameValue, ShortName = LinearClassificationTrainer.LoadNameValue)] + [TlcModule.EntryPoint(Name = "Trainers.StochasticDualCoordinateAscentBinaryClassifier", + Desc = "Train an SDCA binary model.", + UserName = LinearClassificationTrainer.UserNameValue, + ShortName = LinearClassificationTrainer.LoadNameValue, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironment env, LinearClassificationTrainer.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs b/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs index a3ac7ce72e..8f81324768 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs @@ -236,13 +236,12 @@ public bool SaveAsOnnx(OnnxContext ctx, string[] outputs, string featureColumn) Host.Check(Utils.Size(outputs) == 1); string opType = "LinearRegressor"; - var node = OnnxUtils.MakeNode(opType, new List { featureColumn }, new List (outputs), ctx.GetNodeName(opType)); + var node = ctx.CreateNode(opType, new[] { featureColumn }, outputs, ctx.GetNodeName(opType)); // Selection of logit or probit output transform. enum {'NONE', 'LOGIT', 'PROBIT} - OnnxUtils.NodeAddAttributes(node, "post_transform", 0); - OnnxUtils.NodeAddAttributes(node, "targets", 1); - OnnxUtils.NodeAddAttributes(node, "coefficients", Weight.DenseValues()); - OnnxUtils.NodeAddAttributes(node, "intercepts", Bias); - ctx.AddNode(node); + node.AddAttribute("post_transform", "NONE"); + node.AddAttribute("targets", 1); + node.AddAttribute("coefficients", Weight.DenseValues()); + node.AddAttribute("intercepts", new float[] { Bias }); return true; } diff --git a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LbfgsPredictorBase.cs b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LbfgsPredictorBase.cs index 89f4866228..87c1cc592b 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LbfgsPredictorBase.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LbfgsPredictorBase.cs @@ -17,9 +17,7 @@ namespace Microsoft.ML.Runtime.Learners { - public abstract class LbfgsTrainerBase : - TrainerBase, - IIncrementalTrainer + public abstract class LbfgsTrainerBase : TrainerBase where TPredictor : class, IPredictorProducing { public abstract class ArgumentsBase : LearnerInputBaseWithWeight @@ -134,6 +132,11 @@ public abstract class ArgumentsBase : LearnerInputBaseWithWeight private VBuffer[] _localGradients; private Float[] _localLosses; + // REVIEW: It's pointless to request caching when we're going to load everything into + // memory, that is, when using multiple threads. So should caching not be requested? + private static readonly TrainerInfo _info = new TrainerInfo(caching: true, supportIncrementalTrain: true); + public override TrainerInfo Info => _info; + internal LbfgsTrainerBase(ArgumentsBase args, IHostEnvironment env, string name, bool showTrainingStats = false) : base(env, name) { @@ -172,16 +175,9 @@ internal LbfgsTrainerBase(ArgumentsBase args, IHostEnvironment env, string name, } } - public override bool NeedNormalization => true; - - // REVIEW: It's pointless to request caching when we're going to load everything into - // memory, that is, when using multiple threads. - public override bool WantCaching => true; - protected virtual int ClassCount => 1; protected int BiasCount => ClassCount; protected int WeightCount => ClassCount * NumFeatures; - protected virtual Optimizer InitializeOptimizer(IChannel ch, FloatLabelCursor.Factory cursorFactory, out VBuffer init, out ITerminationCriterion terminationCriterion) { @@ -289,28 +285,23 @@ protected virtual VBuffer InitializeWeightsSgd(IChannel ch, FloatLabelCur protected abstract VBuffer InitializeWeightsFromPredictor(TPredictor srcPredictor); - public void Train(RoleMappedData data, TPredictor predictor) - { - Contracts.CheckValue(data, nameof(data)); - Contracts.CheckValue(predictor, nameof(predictor)); - - _srcPredictor = predictor; - Train(data); - } - protected abstract void CheckLabel(RoleMappedData data); protected virtual void PreTrainingProcessInstance(Float label, ref VBuffer feat, Float weight) { } + protected abstract TPredictor CreatePredictor(); + /// /// The basic training calls the optimizer /// - public override void Train(RoleMappedData data) + public override TPredictor Train(TrainContext context) { - Contracts.CheckValue(data, nameof(data)); + Contracts.CheckValue(context, nameof(context)); + var data = context.TrainingSet; + _srcPredictor = context.TrainingSet as TPredictor; data.CheckFeatureFloatVector(out NumFeatures); CheckLabel(data); data.CheckOptFloatWeight(); @@ -318,13 +309,15 @@ public override void Train(RoleMappedData data) if (NumFeatures >= Utils.ArrayMaxSize / ClassCount) { throw Contracts.ExceptParam(nameof(data), - String.Format("The number of model parameters which is equal to ('# of features' + 1) * '# of classes' should be less than or equal to {0}.", Utils.ArrayMaxSize)); + "The number of model parameters which is equal to ('# of features' + 1) * '# of classes' should be less than or equal to {0}.", Utils.ArrayMaxSize); } using (var ch = Host.Start("Training")) { TrainCore(ch, data); + var pred = CreatePredictor(); ch.Done(); + return pred; } } diff --git a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LogisticRegression.cs b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LogisticRegression.cs index 5abc062bf7..09e2bbbcc4 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LogisticRegression.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/LogisticRegression.cs @@ -30,6 +30,8 @@ namespace Microsoft.ML.Runtime.Learners { using Mkl = Microsoft.ML.Runtime.Learners.OlsLinearRegressionTrainer.Mkl; + /// + /// public sealed partial class LogisticRegression : LbfgsTrainerBase { public const string LoadNameValue = "LogisticRegression"; @@ -53,9 +55,7 @@ public LogisticRegression(IHostEnvironment env, Arguments args) _posWeight = 0; } - public override bool NeedCalibration { get { return false; } } - - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; protected override void CheckLabel(RoleMappedData data) { @@ -127,7 +127,7 @@ protected override void ComputeTrainingStatistics(IChannel ch, FloatLabelCursor. ch.Info("Residual Deviance: \t{0} (on {1} degrees of freedom)", deviance, Math.Max(NumGoodRows - numParams, 0)); - // Compute null deviance, i.e., the deviance of null hypothesis. + // Compute null deviance, i.e., the deviance of null hypothesis. // Cap the prior positive rate at 1e-15. Double priorPosRate = _posWeight / WeightSum; Contracts.Assert(0 <= priorPosRate && priorPosRate <= 1); @@ -197,7 +197,7 @@ protected override void ComputeTrainingStatistics(IChannel ch, FloatLabelCursor. var hessian = new Double[hessianDimension]; // Initialize diagonal elements with L2 regularizers except for the first entry (index 0) - // Since bias is not regularized. + // Since bias is not regularized. if (L2Weight > 0) { // i is the array index of the diagonal entry at iRow-th row and iRow-th column. @@ -371,7 +371,7 @@ protected override VBuffer InitializeWeightsFromPredictor(ParameterMixing return InitializeWeights(pred.Weights2, new[] { pred.Bias }); } - public override ParameterMixingCalibratedPredictor CreatePredictor() + protected override ParameterMixingCalibratedPredictor CreatePredictor() { // Logistic regression is naturally calibrated to // output probabilities when transformed using @@ -386,7 +386,13 @@ public override ParameterMixingCalibratedPredictor CreatePredictor() new PlattCalibrator(Host, -1, 0)); } - [TlcModule.EntryPoint(Name = "Trainers.LogisticRegressionBinaryClassifier", Desc = "Train a logistic regression binary model", UserName = UserNameValue, ShortName = ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.LogisticRegressionBinaryClassifier", + Desc = Summary, + UserName = UserNameValue, + ShortName = ShortName, + XmlInclude = new[] { @"", + @""})] + public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironment env, Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs index 51decafea5..5bf0511540 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs @@ -36,6 +36,8 @@ namespace Microsoft.ML.Runtime.Learners { + /// + /// public sealed class MulticlassLogisticRegression : LbfgsTrainerBase, MulticlassLogisticRegressionPredictor> { public const string LoadNameValue = "MultiClassLogisticRegression"; @@ -54,27 +56,25 @@ public sealed class Arguments : ArgumentsBase // These label names are used for model saving in place of class number // to make the model summary more user friendly. These names are populated // in the CheckLabel() method. - // It could be null, if the label type is not a key type, or there is + // It could be null, if the label type is not a key type, or there is // missing label name for some class. private string[] _labelNames; - // The prior distribution of data. + // The prior distribution of data. // This array is of length equal to the number of classes. // After training, it stores the total weights of training examples in each class. private Double[] _prior; private LinearModelStatistics _stats; - protected override int ClassCount { get { return _numClasses; } } + protected override int ClassCount => _numClasses; public MulticlassLogisticRegression(IHostEnvironment env, Arguments args) : base(args, env, LoadNameValue, Contracts.CheckRef(args, nameof(args)).ShowTrainingStats) { } - public override bool NeedCalibration { get { return false; } } - - public override PredictionKind PredictionKind { get { return PredictionKind.MultiClassClassification; } } + public override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; protected override void CheckLabel(RoleMappedData data) { @@ -101,10 +101,10 @@ protected override void CheckLabel(RoleMappedData data) VBuffer labelNames = default(VBuffer); schema.GetMetadata(MetadataUtils.Kinds.KeyValues, labelIdx, ref labelNames); - // If label names is not dense or contain NA or default value, then it follows that + // If label names is not dense or contain NA or default value, then it follows that // at least one class does not have a valid name for its label. If the label names we // try to get from the metadata are not unique, we may also not use them in model summary. - // In both cases we set _labelNames to null and use the "Class_n", where n is the class number + // In both cases we set _labelNames to null and use the "Class_n", where n is the class number // for model summary saving instead. if (!labelNames.IsDense) { @@ -201,7 +201,7 @@ protected override VBuffer InitializeWeightsFromPredictor(MulticlassLogis return InitializeWeights(srcPredictor.DenseWeightsEnumerable(), srcPredictor.BiasesEnumerable()); } - public override MulticlassLogisticRegressionPredictor CreatePredictor() + protected override MulticlassLogisticRegressionPredictor CreatePredictor() { if (_numClasses < 1) throw Contracts.Except("Cannot create a multiclass predictor with {0} classes", _numClasses); @@ -251,7 +251,7 @@ protected override void ComputeTrainingStatistics(IChannel ch, FloatLabelCursor. ch.Info("Residual Deviance: \t{0}", deviance); - // Compute null deviance, i.e., the deviance of null hypothesis. + // Compute null deviance, i.e., the deviance of null hypothesis. // Cap the prior positive rate at 1e-15. Float nullDeviance = 0; for (int iLabel = 0; iLabel < _numClasses; iLabel++) @@ -366,7 +366,7 @@ internal MulticlassLogisticRegressionPredictor(IHostEnvironment env, ref VBuffer } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// This constructor is called by to create the predictor. /// /// The host environment. @@ -484,7 +484,7 @@ private MulticlassLogisticRegressionPredictor(IHostEnvironment env, ModelLoadCon InputType = new VectorType(NumberType.Float, _numFeatures); OutputType = new VectorType(NumberType.Float, _numClasses); - // REVIEW: Should not save the label names duplicately with the predictor again. + // REVIEW: Should not save the label names duplicately with the predictor again. // Get it from the label column schema metadata instead. string[] labelNames = null; if (ctx.TryLoadBinaryStream(LabelNamesSubModelFilename, r => labelNames = LoadLabelNames(ctx, r))) @@ -844,14 +844,13 @@ public bool SaveAsOnnx(OnnxContext ctx, string[] outputs, string featureColumn) Host.CheckValue(ctx, nameof(ctx)); string opType = "LinearClassifier"; - var node = OnnxUtils.MakeNode(opType, new List { featureColumn }, new List(outputs), ctx.GetNodeName(opType)); - // Selection of logit or probit output transform. enum {'NONE', 'LOGIT', 'PROBIT} - OnnxUtils.NodeAddAttributes(node, "post_transform", 0); - OnnxUtils.NodeAddAttributes(node, "multi_class", true); - OnnxUtils.NodeAddAttributes(node, "coefficients", _weights.SelectMany(w => w.DenseValues())); - OnnxUtils.NodeAddAttributes(node, "intercepts", _biases); - OnnxUtils.NodeAddAttributes(node, "classlabels_strings", _labelNames); - ctx.AddNode(node); + var node = ctx.CreateNode(opType, new[] { featureColumn }, outputs, ctx.GetNodeName(opType)); + // Selection of logit or probit output transform. enum {'NONE', 'SOFTMAX', 'LOGISTIC', 'SOFTMAX_ZERO', 'PROBIT} + node.AddAttribute("post_transform", "NONE"); + node.AddAttribute("multi_class", true); + node.AddAttribute("coefficients", _weights.SelectMany(w => w.DenseValues())); + node.AddAttribute("intercepts", _biases); + node.AddAttribute("classlabels_ints", Enumerable.Range(0, _numClasses).Select(x => (long)x)); return true; } @@ -961,7 +960,12 @@ public IRow GetStatsIRowOrNull(RoleMappedSchema schema) /// public partial class LogisticRegression { - [TlcModule.EntryPoint(Name = "Trainers.LogisticRegressionClassifier", Desc = "Train a logistic regression multi class model", UserName = MulticlassLogisticRegression.UserNameValue, ShortName = MulticlassLogisticRegression.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.LogisticRegressionClassifier", + Desc = Summary, + UserName = MulticlassLogisticRegression.UserNameValue, + ShortName = MulticlassLogisticRegression.ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.MulticlassClassificationOutput TrainMultiClass(IHostEnvironment env, MulticlassLogisticRegression.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/doc.xml b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/doc.xml new file mode 100644 index 0000000000..03b844a0ea --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/doc.xml @@ -0,0 +1,68 @@ + + + + + + + Logistic Regression is a method in statistics used to predict the probability of occurrence of an event and can be used as + a classification algorithm. The algorithm predicts the probability of occurrence of an event by fitting data to a logistical function. + + + If the dependent variable has more than two possible values (blood type given diagnostic test results), + then the logistic regression is multinomial. + + The optimization technique used for LogisticRegression Classifier is based on the limited memory Broyden-Fletcher-Goldfarb-Shanno (L-BFGS). + Both the L-BFGS and regular BFGS algorithms use quasi-Newtonian methods to estimate the computationally intensive + Hessian matrix in the equation used by Newton's method to calculate steps. + But the L-BFGS approximation uses only a limited amount of memory to compute the next step direction, + so that it is especially suited for problems with a large number of variables. + The MemorySize argument specifies the number of past positions and gradients to store for use in the + computation of the next step. + + + This learner can use elastic net regularization: a linear combination of L1 (LASSO) and L2 (ridge) regularizations. + Regularization is a method that can render an ill-posed problem more tractable by imposing constraints that provide information + to supplement the data and that prevents overfitting by penalizing models with extreme coefficient values. + This can improve the generalization of the model learned by selecting the optimal complexity in the bias-variance tradeoff. + Regularization works by adding the penalty that is associated with coefficient values to the error of the hypothesis. + An accurate model with extreme coefficient values would be penalized more, but a less accurate model with more conservative + values would be penalized less. L1 and L2 regularization have different effects and uses that are complementary in certain respects. + + + + L1Weight can be applied to sparse models, when working with high-dimensional data. It pulls small weights associated features + that are relatively unimportant towards 0. + L1 regularization is an implementation of OWLQN, based on: + Scalable training of L1-regularized log-linear models + + L2Weight is preferable for data that is not sparse. It pulls large weights towards zero. + + Adding the ridge penalty to the regularization overcomes some of lasso's limitations. It can improve its predictive accuracy, for example, when the number of predictors is greater than the sample size. If x = l1_weight and y = l2_weight, ax + by = c defines the linear span of the regularization terms. + The default values of x and y are both 1. + An agressive regularization can harm predictive capacity by excluding important variables out of the model. So choosing the optimal values for the regularization parameters is important for the performance of the logistic regression model. + For more information see: + + Scalable Training of L1-Regularized Log-Linear Models. + Test Run - L1 and L2 Regularization for Machine Learning. + Wikipedia: L-BFGS. + Wikipedia: Logistic regression. + + + + + + + pipeline.Add(new LogisticRegressionClassifier()); + + + + + + + pipeline.Add(new LogisticRegressionBinaryClassifier()); + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.StandardLearners/Standard/ModelStatistics.cs b/src/Microsoft.ML.StandardLearners/Standard/ModelStatistics.cs index 22da22e100..91874291b0 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/ModelStatistics.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/ModelStatistics.cs @@ -78,7 +78,7 @@ private static VersionInfo GetVersionInfo() // The standard errors of coefficients, including the bias. // The standard error of bias is placed at index zero. - // It could be null when there are too many non-zero weights so that + // It could be null when there are too many non-zero weights so that // the memory is insufficient to hold the Hessian matrix necessary for the computation // of the variance-covariance matrix. private readonly VBuffer? _coeffStdError; diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs index 9a3552f74b..52cd025370 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs @@ -13,9 +13,9 @@ namespace Microsoft.ML.Runtime.Learners { - using TScalarTrainer = ITrainer>; + using TScalarTrainer = ITrainer>; - public abstract class MetaMulticlassTrainer : TrainerBase + public abstract class MetaMulticlassTrainer : TrainerBase where TPred : IPredictor where TArgs : MetaMulticlassTrainer.ArgumentsBase { @@ -38,15 +38,9 @@ public abstract class ArgumentsBase protected readonly TArgs Args; private TScalarTrainer _trainer; - private TPred _pred; public sealed override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; - public sealed override bool NeedNormalization { get; } - public sealed override bool NeedCalibration => false; - - // No matter what the internal predictor, we're performing many passes - // simply by virtue of this being a meta-trainer. - public sealed override bool WantCaching => true; + public override TrainerInfo Info { get; } internal MetaMulticlassTrainer(IHostEnvironment env, TArgs args, string name) : base(env, name) @@ -56,8 +50,9 @@ internal MetaMulticlassTrainer(IHostEnvironment env, TArgs args, string name) Host.CheckUserArg(Args.PredictorType.IsGood(), nameof(Args.PredictorType)); // Create the first trainer so errors in the args surface early. _trainer = Args.PredictorType.CreateInstance(Host); - var ex = _trainer as ITrainerEx; - NeedNormalization = ex != null && ex.NeedNormalization; + // Regarding caching, no matter what the internal predictor, we're performing many passes + // simply by virtue of this being a meta-trainer, so we will still cache. + Info = new TrainerInfo(normalization: _trainer.Info.NeedNormalization); } protected IDataView MapLabelsCore(ColumnType type, RefPredicate equalsTarget, RoleMappedData data, string dstName) @@ -96,9 +91,11 @@ protected TScalarTrainer GetTrainer() protected abstract TPred TrainCore(IChannel ch, RoleMappedData data, int count); - public override void Train(RoleMappedData data) + public override TPred Train(TrainContext context) { - Host.CheckValue(data, nameof(data)); + Host.CheckValue(context, nameof(context)); + var data = context.TrainingSet; + data.CheckFeatureFloatVector(); int count; @@ -107,16 +104,11 @@ public override void Train(RoleMappedData data) using (var ch = Host.Start("Training")) { - _pred = TrainCore(ch, data, count); - ch.Check(_pred != null, "Training did not result in a predictor"); + var pred = TrainCore(ch, data, count); + ch.Check(pred != null, "Training did not result in a predictor"); ch.Done(); + return pred; } } - - public override TPred CreatePredictor() - { - Host.Check(_pred != null, nameof(CreatePredictor) + " called before " + nameof(Train)); - return _pred; - } } } diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs index a06b54fc26..8c96ee1e0b 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs @@ -26,7 +26,8 @@ namespace Microsoft.ML.Runtime.Learners { - public sealed class MultiClassNaiveBayesTrainer : TrainerBase + /// + public sealed class MultiClassNaiveBayesTrainer : TrainerBase { public const string LoadName = "MultiClassNaiveBayes"; internal const string UserName = "Multiclass Naive Bayes"; @@ -37,24 +38,21 @@ public sealed class Arguments : LearnerInputBaseWithLabel { } - private MultiClassNaiveBayesPredictor _predictor; - public override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; - public override bool NeedNormalization => false; - - public override bool NeedCalibration => false; - - public override bool WantCaching => false; + private static readonly TrainerInfo _info = new TrainerInfo(normalization: false, caching: false); + public override TrainerInfo Info => _info; public MultiClassNaiveBayesTrainer(IHostEnvironment env, Arguments args) : base(env, LoadName) { + Host.CheckValue(args, nameof(args)); } - public override void Train(RoleMappedData data) + public override MultiClassNaiveBayesPredictor Train(TrainContext context) { - Host.CheckValue(data, nameof(data)); + Host.CheckValue(context, nameof(context)); + var data = context.TrainingSet; Host.Check(data.Schema.Label != null, "Missing Label column"); Host.Check(data.Schema.Label.Type == NumberType.Float || data.Schema.Label.Type is KeyType, "Invalid type for Label column, only floats and known-size keys are supported"); @@ -83,6 +81,7 @@ public override void Train(RoleMappedData data) if (cursor.Row.Position > int.MaxValue) { ch.Warning("Stopping training because maximum number of rows have been traversed"); + ch.Done(); break; } @@ -112,19 +111,20 @@ public override void Train(RoleMappedData data) examplesProcessed += 1; } + ch.Done(); } Array.Resize(ref labelHistogram, labelCount); Array.Resize(ref featureHistogram, labelCount); - _predictor = new MultiClassNaiveBayesPredictor(Host, labelHistogram, featureHistogram, featureCount); - } - - public override MultiClassNaiveBayesPredictor CreatePredictor() - { - return _predictor; + return new MultiClassNaiveBayesPredictor(Host, labelHistogram, featureHistogram, featureCount); } - [TlcModule.EntryPoint(Name = "Trainers.NaiveBayesClassifier", Desc = "Train a MultiClassNaiveBayesTrainer.", UserName = UserName, ShortName = ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.NaiveBayesClassifier", + Desc = "Train a MultiClassNaiveBayesTrainer.", + UserName = UserName, + ShortName = ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.MulticlassClassificationOutput TrainMultiClassNaiveBayesTrainer(IHostEnvironment env, Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs index 3d6e1e67b2..c123411edd 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs @@ -34,8 +34,9 @@ namespace Microsoft.ML.Runtime.Learners { using CR = RoleMappedSchema.ColumnRole; using TScalarPredictor = IPredictorProducing; - using TScalarTrainer = ITrainer>; + using TScalarTrainer = ITrainer>; + /// public sealed class Ova : MetaMulticlassTrainer { internal const string LoadNameValue = "OVA"; @@ -79,11 +80,12 @@ private TScalarPredictor TrainOne(IChannel ch, TScalarTrainer trainer, RoleMappe var roles = data.Schema.GetColumnRoleNames() .Where(kvp => kvp.Key.Value != CR.Label.Value) .Prepend(CR.Label.Bind(dstName)); - var td = RoleMappedData.Create(view, roles); + var td = new RoleMappedData(view, roles); - trainer.Train(td); + // REVIEW: In principle we could support validation sets and the like via the train context, but + // this is currently unsupported. + var predictor = trainer.Train(td); - var predictor = trainer.CreatePredictor(); if (Args.UseProbabilities) { ICalibratorTrainer calibrator; @@ -92,7 +94,7 @@ private TScalarPredictor TrainOne(IChannel ch, TScalarTrainer trainer, RoleMappe else calibrator = Args.Calibrator.CreateInstance(Host); var res = CalibratorUtils.TrainCalibratorIfNeeded(Host, ch, calibrator, Args.MaxCalibrationExamples, - trainer, predictor, td, true); + trainer, predictor, td); predictor = res as TScalarPredictor; Host.Check(predictor != null, "Calibrated predictor does not implement the expected interface"); } @@ -200,8 +202,8 @@ public static ModelOperations.PredictorModelOutput CombineOvaModels(IHostEnviron host.CheckValue(input, nameof(input)); EntryPointUtils.CheckInputArgs(host, input); host.CheckNonEmpty(input.ModelArray, nameof(input.ModelArray)); - // Something tells me we should put normalization as part of macro expansion, but since i get - // subgraph instead of learner it's a bit tricky to get learner and decide should we add + // Something tells me we should put normalization as part of macro expansion, but since i get + // subgraph instead of learner it's a bit tricky to get learner and decide should we add // normalization node or not, plus everywhere in code we leave that reposnsibility to TransformModel. var normalizedView = input.ModelArray[0].TransformModel.Apply(host, input.TrainingData); using (var ch = host.Start("CombineOvaModels")) @@ -214,7 +216,7 @@ public static ModelOperations.PredictorModelOutput CombineOvaModels(IHostEnviron input.FeatureColumn, DefaultColumnNames.Features); var weight = TrainUtils.MatchNameOrDefaultOrNull(ch, schema, nameof(input.WeightColumn), input.WeightColumn, DefaultColumnNames.Weight); - var data = TrainUtils.CreateExamples(normalizedView, label, feature, null, weight); + var data = new RoleMappedData(normalizedView, label, feature, null, weight); return new ModelOperations.PredictorModelOutput { diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs index c710b3149d..193c8f0290 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs @@ -26,11 +26,34 @@ namespace Microsoft.ML.Runtime.Learners { - using TScalarTrainer = ITrainer>; + using TScalarTrainer = ITrainer>; using TScalarPredictor = IPredictorProducing; using TDistPredictor = IDistPredictorProducing; using CR = RoleMappedSchema.ColumnRole; + /// + /// In this strategy, a binary classification algorithm is trained on each pair of classes. + /// The pairs are unordered but created with replacement: so, if there were three classes, 0, 1, + /// 2, we would train classifiers for the pairs (0,0), (0,1), (0,2), (1,1), (1,2), + /// and(2,2). For each binary classifier, an input data point is considered a + /// positive example if it is in either of the two classes in the pair, and a + /// negative example otherwise. At prediction time, the probabilities for each + /// pair of classes is considered as the probability of being in either class of + /// the pair given the data, and the final predictive probabilities out of that + /// per class are calculated given the probability that an example is in any given + /// pair. + /// + /// These two can allow you to exploit trainers that do not naturally have a + /// multiclass option, e.g., using the Runtime.FastTree.FastTreeBinaryClassificationTrainer + /// to solve a multiclass problem. + /// Alternately, it can allow ML.NET to solve a "simpler" problem even in the cases + /// where the trainer has a multiclass option, but using it directly is not + /// practical due to, usually, memory constraints.For example, while a multiclass + /// logistic regression is a more principled way to solve a multiclass problem, it + /// requires that the learner store a lot more intermediate state in the form of + /// L-BFGS history for all classes *simultaneously*, rather than just one-by-one + /// as would be needed for OVA. + /// public sealed class Pkpd : MetaMulticlassTrainer { internal const string LoadNameValue = "PKPD"; @@ -76,16 +99,15 @@ private TDistPredictor TrainOne(IChannel ch, TScalarTrainer trainer, RoleMappedD var roles = data.Schema.GetColumnRoleNames() .Where(kvp => kvp.Key.Value != CR.Label.Value) .Prepend(CR.Label.Bind(dstName)); - var td = RoleMappedData.Create(view, roles); + var td = new RoleMappedData(view, roles); - trainer.Train(td); + var predictor = trainer.Train(td); ICalibratorTrainer calibrator; if (!Args.Calibrator.IsGood()) calibrator = null; else calibrator = Args.Calibrator.CreateInstance(Host); - TScalarPredictor predictor = trainer.CreatePredictor(); var res = CalibratorUtils.TrainCalibratorIfNeeded(Host, ch, calibrator, Args.MaxCalibrationExamples, trainer, predictor, td); var dist = res as TDistPredictor; diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/doc.xml b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/doc.xml new file mode 100644 index 0000000000..8d2af374db --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/doc.xml @@ -0,0 +1,62 @@ + + + + + + + Trains a multiclass Naive Bayes predictor that supports binary feature values. + + + Naive Bayes is a probabilistic classifier that can be used for multiclass problems. + Using Bayes' theorem, the conditional probability for a sample belonging to a class can be calculated based on the sample count for each feature combination groups. + However, Naive Bayes Classifier is feasible only if the number of features and the values each feature can take is relatively small. + It assumes independence among the presence of features in a class even though they may be dependent on each other. + This multi-class trainer accepts binary feature values of type float, i.e., feature values are either true or false. + Specifically a feature value greater than zero is treated as true. + + + + + + + + + + pipeline.Add(new NaiveBayesClassifier + { + NormalizeFeatures = NormalizeOption.Auto, + Caching = CachingOptions.Memory + }); + + + + + + + Trains a one-versus-all multi-class classifier on top of the specified binary classifier. + + + In this strategy, a binary classification algorithm is used to train one classifier for each class, which distinguishes that class from all other classes. + Prediction is then performed by running these binary classifiers, and choosing the prediction with the highest confidence score. + This algorithm can be used with any of the binary classifiers in ML.NET. + A few binary classifiers already have implementation for multi-class problems, + thus users can choose either one depending on the context. + The OVA version of a binary classifier, such as wrapping a LightGbmBinaryClassifier , + can be different from LightGbmClassifier, which develops a multi-class classifier directly. + Note that even if the classifier indicates that it does not need caching, OneVersusAll will always + request caching, as it will be performing multiple passes over the data set. + These learner will request normalization from the data pipeline if the classifier indicates it would benefit from it. + + + + + + + + pipeline.Add(OneVersusAll.With(new StochasticDualCoordinateAscentBinaryClassifier())); + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.StandardLearners/Standard/OlsLinearRegression.cs b/src/Microsoft.ML.StandardLearners/Standard/OlsLinearRegression.cs index d927ba0a43..7f47271f68 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/OlsLinearRegression.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/OlsLinearRegression.cs @@ -28,11 +28,9 @@ "OLS Linear Regression Executor", OlsLinearRegressionPredictor.LoaderSignature)] -[assembly: LoadableClass(typeof(void), typeof(OlsLinearRegressionTrainer), null, typeof(SignatureEntryPointModule), OlsLinearRegressionTrainer.LoadNameValue)] - namespace Microsoft.ML.Runtime.Learners { - public sealed class OlsLinearRegressionTrainer : TrainerBase + public sealed class OlsLinearRegressionTrainer : TrainerBase { public sealed class Arguments : LearnerInputBaseWithWeight { @@ -53,21 +51,21 @@ public sealed class Arguments : LearnerInputBaseWithWeight public const string ShortName = "ols"; internal const string Summary = "The ordinary least square regression fits the target function as a linear function of the numerical features " + "that minimizes the square loss function."; - - private VBuffer _weights; - private Float _bias; - - // These have length equal to the number of model parameters, i.e., one for bias plus length of weights. - private Double[] _standardErrors; - private Double[] _tValues; - private Double[] _pValues; - - private Double _rSquared; - private Double _rSquaredAdjusted; + internal const string Remarks = @" +Ordinary least squares (OLS) is a parameterized regression method. +It assumes that the conditional mean of the dependent variable follows a linear function of the dependent variables. +By minimizing the squares of the difference between observed values and the predictions, the parameters of the regressor can be estimated. +"; private readonly Float _l2Weight; private readonly bool _perParameterSignificance; + public override PredictionKind PredictionKind => PredictionKind.Regression; + + // The training performs two passes, only. Probably not worth caching. + private static readonly TrainerInfo _info = new TrainerInfo(caching: false); + public override TrainerInfo Info => _info; + public OlsLinearRegressionTrainer(IHostEnvironment env, Arguments args) : base(env, LoadNameValue) { @@ -77,25 +75,6 @@ public OlsLinearRegressionTrainer(IHostEnvironment env, Arguments args) _perParameterSignificance = args.PerParameterSignificance; } - public override bool NeedNormalization - { - get { return true; } - } - - public override bool NeedCalibration - { - get { return false; } - } - - public override bool WantCaching - { - // Two passes, only. Probably not worth caching. - get { return false; } - } - - public override PredictionKind PredictionKind - { get { return PredictionKind.Regression; } } - /// /// In several calculations, we calculate probabilities or other quantities that should range /// from 0 to 1, but because of numerical imprecision may, in entirely innocent circumstances, @@ -104,15 +83,14 @@ public override PredictionKind PredictionKind /// The quantity that should be clamped from 0 to 1 /// Either p, or 0 or 1 if it was outside the range 0 to 1 private static Double ProbClamp(Double p) - { - return Math.Max(0, Math.Min(p, 1)); - } + => Math.Max(0, Math.Min(p, 1)); - public override void Train(RoleMappedData examples) + public override OlsLinearRegressionPredictor Train(TrainContext context) { using (var ch = Host.Start("Training")) { - ch.CheckValue(examples, nameof(examples)); + ch.CheckValue(context, nameof(context)); + var examples = context.TrainingSet; ch.CheckParam(examples.Schema.Feature != null, nameof(examples), "Need a feature column"); ch.CheckParam(examples.Schema.Label != null, nameof(examples), "Need a label column"); @@ -130,12 +108,13 @@ public override void Train(RoleMappedData examples) var cursorFactory = new FloatLabelCursor.Factory(examples, CursOpt.Label | CursOpt.Features); - TrainCore(ch, cursorFactory, typeFeat.VectorSize); + var pred = TrainCore(ch, cursorFactory, typeFeat.VectorSize); ch.Done(); + return pred; } } - private void TrainCore(IChannel ch, FloatLabelCursor.Factory cursorFactory, int featureCount) + private OlsLinearRegressionPredictor TrainCore(IChannel ch, FloatLabelCursor.Factory cursorFactory, int featureCount) { Host.AssertValue(ch); ch.AssertValue(cursorFactory); @@ -259,26 +238,21 @@ private void TrainCore(IChannel ch, FloatLabelCursor.Factory cursorFactory, int var weights = VBufferUtils.CreateDense(beta.Length - 1); for (int i = 1; i < beta.Length; ++i) weights.Values[i - 1] = (Float)beta[i]; - _weights = weights; - _bias = (Float)beta[0]; - _standardErrors = _tValues = _pValues = null; + var bias = (Float)beta[0]; if (!(_l2Weight > 0) && m == n) { // We would expect the solution to the problem to be exact in this case. - _rSquared = 1; - _rSquaredAdjusted = Float.NaN; ch.Info("Number of examples equals number of parameters, solution is exact but no statistics can be derived"); - ch.Done(); - return; + return new OlsLinearRegressionPredictor(Host, ref weights, bias, null, null, null, 1, Float.NaN); } Double rss = 0; // residual sum of squares Double tss = 0; // total sum of squares using (var cursor = cursorFactory.Create()) { - var lrPredictor = new LinearRegressionPredictor(Host, ref _weights, _bias); + var lrPredictor = new LinearRegressionPredictor(Host, ref weights, bias); var lrMap = lrPredictor.GetMapper, Float>(); - Float yh = default(Float); + Float yh = default; while (cursor.MoveNext()) { var features = cursor.Features; @@ -289,27 +263,28 @@ private void TrainCore(IChannel ch, FloatLabelCursor.Factory cursorFactory, int tss += ydm * ydm; } } - _rSquared = ProbClamp(1 - (rss / tss)); + var rSquared = ProbClamp(1 - (rss / tss)); // R^2 adjusted differs from the normal formula on account of the bias term, by Said's reckoning. + double rSquaredAdjusted; if (n > m) { - _rSquaredAdjusted = ProbClamp(1 - (1 - _rSquared) * (n - 1) / (n - m)); + rSquaredAdjusted = ProbClamp(1 - (1 - rSquared) * (n - 1) / (n - m)); ch.Info("Coefficient of determination R2 = {0:g}, or {1:g} (adjusted)", - _rSquared, _rSquaredAdjusted); + rSquared, rSquaredAdjusted); } else - _rSquaredAdjusted = Double.NaN; + rSquaredAdjusted = Double.NaN; // The per parameter significance is compute intensive and may not be required for all practitioners. // Also we can't estimate it, unless we can estimate the variance, which requires more examples than // parameters. if (!_perParameterSignificance || m >= n) - return; + return new OlsLinearRegressionPredictor(Host, ref weights, bias, null, null, null, rSquared, rSquaredAdjusted); - ch.Assert(!Double.IsNaN(_rSquaredAdjusted)); - _standardErrors = new Double[m]; - _tValues = new Double[m]; - _pValues = new Double[m]; + ch.Assert(!Double.IsNaN(rSquaredAdjusted)); + var standardErrors = new Double[m]; + var tValues = new Double[m]; + var pValues = new Double[m]; // Invert X'X: Mkl.Pptri(Mkl.Layout.RowMajor, Mkl.UpLo.Lo, m, xtx); var s2 = rss / (n - m); // estimate of variance of y @@ -317,7 +292,7 @@ private void TrainCore(IChannel ch, FloatLabelCursor.Factory cursorFactory, int for (int i = 0; i < m; i++) { // Initialize with inverse Hessian. - _standardErrors[i] = (Single)xtx[i * (i + 1) / 2 + i]; + standardErrors[i] = (Single)xtx[i * (i + 1) / 2 + i]; } if (_l2Weight > 0) @@ -331,9 +306,9 @@ private void TrainCore(IChannel ch, FloatLabelCursor.Factory cursorFactory, int { var entry = (Single)xtx[ioffset]; var adjustment = -reg * entry * entry; - _standardErrors[iRow] -= adjustment; + standardErrors[iRow] -= adjustment; if (0 < iCol && iCol < iRow) - _standardErrors[iCol] -= adjustment; + standardErrors[iCol] -= adjustment; ioffset++; } } @@ -344,17 +319,14 @@ private void TrainCore(IChannel ch, FloatLabelCursor.Factory cursorFactory, int for (int i = 0; i < m; i++) { // sqrt of diagonal entries of s2 * inverse(X'X + reg * I) * X'X * inverse(X'X + reg * I). - _standardErrors[i] = Math.Sqrt(s2 * _standardErrors[i]); - ch.Check(FloatUtils.IsFinite(_standardErrors[i]), "Non-finite standard error detected from OLS solution"); - _tValues[i] = beta[i] / _standardErrors[i]; - _pValues[i] = (Float)MathUtils.TStatisticToPValue(_tValues[i], n - m); - ch.Check(0 <= _pValues[i] && _pValues[i] <= 1, "p-Value calculated outside expected [0,1] range"); + standardErrors[i] = Math.Sqrt(s2 * standardErrors[i]); + ch.Check(FloatUtils.IsFinite(standardErrors[i]), "Non-finite standard error detected from OLS solution"); + tValues[i] = beta[i] / standardErrors[i]; + pValues[i] = (Float)MathUtils.TStatisticToPValue(tValues[i], n - m); + ch.Check(0 <= pValues[i] && pValues[i] <= 1, "p-Value calculated outside expected [0,1] range"); } - } - public override OlsLinearRegressionPredictor CreatePredictor() - { - return new OlsLinearRegressionPredictor(Host, ref _weights, _bias, _standardErrors, _tValues, _pValues, _rSquared, _rSquaredAdjusted); + return new OlsLinearRegressionPredictor(Host, ref weights, bias, standardErrors, tValues, pValues, rSquared, rSquaredAdjusted); } internal static class Mkl diff --git a/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedLinear.cs b/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedLinear.cs index 0926a961e1..7a3ac55edf 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedLinear.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedLinear.cs @@ -36,7 +36,7 @@ public abstract class AveragedLinearArguments : OnlineLinearArguments [Argument(ArgumentType.AtMostOnce, HelpText = "L2 Regularization Weight", ShortName = "reg", SortOrder = 50)] [TGUI(Label = "L2 Regularization Weight")] - [TlcModule.SweepableFloatParam("L2RegularizerWeight", 0.0f, 0.5f)] + [TlcModule.SweepableFloatParam("L2RegularizerWeight", 0.0f, 0.4f)] public Float L2RegularizerWeight = 0; [Argument(ArgumentType.AtMostOnce, HelpText = "Extra weight given to more recent updates", ShortName = "rg")] diff --git a/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedPerceptron.cs b/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedPerceptron.cs index 1861821d1c..c7c2d1d627 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedPerceptron.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/Online/AveragedPerceptron.cs @@ -23,20 +23,19 @@ namespace Microsoft.ML.Runtime.Learners { - /// - /// This is an averaged perceptron classifier. - /// Configurable subcomponents: - /// - Loss function. By default, hinge loss (aka max-margin avgd perceptron) - /// - Feature normalization. By default, rescaling between min and max values for every feature - /// - Prediction calibration to produce probabilities. Off by default, if on, uses exponential (aka Platt) calibration. - /// + // This is an averaged perceptron classifier. + // Configurable subcomponents: + // - Loss function. By default, hinge loss (aka max-margin avgd perceptron) + // - Feature normalization. By default, rescaling between min and max values for every feature + // - Prediction calibration to produce probabilities. Off by default, if on, uses exponential (aka Platt) calibration. + /// public sealed class AveragedPerceptronTrainer : AveragedLinearTrainer { public const string LoadNameValue = "AveragedPerceptron"; internal const string UserNameValue = "Averaged Perceptron"; internal const string ShortName = "ap"; - internal const string Summary = "Perceptron is a binary classification algorithm that makes its predictions based on a linear function."; + internal const string Summary = "Averaged Perceptron Binary Classifier."; public class Arguments : AveragedLinearArguments { @@ -50,17 +49,14 @@ public class Arguments : AveragedLinearArguments public int MaxCalibrationExamples = 1000000; } + protected override bool NeedCalibration => true; + public AveragedPerceptronTrainer(IHostEnvironment env, Arguments args) : base(args, env, UserNameValue) { LossFunction = Args.LossFunction.CreateComponent(env); } - public override bool NeedCalibration - { - get { return true; } - } - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } protected override void CheckLabel(RoleMappedData data) @@ -69,7 +65,7 @@ protected override void CheckLabel(RoleMappedData data) data.CheckBinaryLabel(); } - public override LinearBinaryPredictor CreatePredictor() + protected override LinearBinaryPredictor CreatePredictor() { Contracts.Assert(WeightsScale == 1); @@ -91,7 +87,12 @@ public override LinearBinaryPredictor CreatePredictor() return new LinearBinaryPredictor(Host, ref weights, bias); } - [TlcModule.EntryPoint(Name = "Trainers.AveragedPerceptronBinaryClassifier", Desc = "Train a Average perceptron.", UserName = UserNameValue, ShortName = ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.AveragedPerceptronBinaryClassifier", + Desc = Summary, + UserName = UserNameValue, + ShortName = ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.BinaryClassificationOutput TrainBinary(IHostEnvironment env, Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/Online/LinearSvm.cs b/src/Microsoft.ML.StandardLearners/Standard/Online/LinearSvm.cs index d2b8f0b30f..d435539e95 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/Online/LinearSvm.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/Online/LinearSvm.cs @@ -80,6 +80,8 @@ public sealed class Arguments : OnlineLinearArguments private Float _weightsUpdateScale; private Float _biasUpdate; + protected override bool NeedCalibration => true; + public LinearSvm(IHostEnvironment env, Arguments args) : base(args, env, UserNameValue) { @@ -87,11 +89,6 @@ public LinearSvm(IHostEnvironment env, Arguments args) Contracts.CheckUserArg(args.BatchSize > 0, nameof(args.BatchSize), UserErrorPositive); } - public override bool NeedCalibration - { - get { return true; } - } - public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } protected override void CheckLabel(RoleMappedData data) @@ -221,7 +218,7 @@ private void UpdateWeights(ref VBuffer weightsUpdate, Float weightsUpdate } } - public override TPredictor CreatePredictor() + protected override TPredictor CreatePredictor() { Contracts.Assert(WeightsScale == 1); return new LinearBinaryPredictor(Host, ref Weights, Bias); diff --git a/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineGradientDescent.cs b/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineGradientDescent.cs index 6910267759..78dc5ea3b2 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineGradientDescent.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineGradientDescent.cs @@ -27,12 +27,13 @@ namespace Microsoft.ML.Runtime.Learners { using TPredictor = LinearRegressionPredictor; + /// public sealed class OnlineGradientDescentTrainer : AveragedLinearTrainer { internal const string LoadNameValue = "OnlineGradientDescent"; internal const string UserNameValue = "Stochastic Gradient Descent (Regression)"; internal const string Summary = "Stochastic gradient descent is an optimization method used to train a wide range of models in machine learning. " - + "In the TLC implementation of SGD, it is for linear regression."; + + "In the TLC implementation of OGD, it is for linear regression."; internal const string ShortName = "ogd"; public sealed class Arguments : AveragedLinearArguments @@ -57,11 +58,6 @@ public OnlineGradientDescentTrainer(IHostEnvironment env, Arguments args) LossFunction = args.LossFunction.CreateComponent(env); } - public override bool NeedCalibration - { - get { return false; } - } - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } protected override void CheckLabel(RoleMappedData data) @@ -69,7 +65,7 @@ protected override void CheckLabel(RoleMappedData data) data.CheckRegressionLabel(); } - public override TPredictor CreatePredictor() + protected override TPredictor CreatePredictor() { Contracts.Assert(WeightsScale == 1); VBuffer weights = default(VBuffer); @@ -89,7 +85,12 @@ public override TPredictor CreatePredictor() return new LinearRegressionPredictor(Host, ref weights, bias); } - [TlcModule.EntryPoint(Name = "Trainers.OnlineGradientDescentRegressor", Desc = "Train a Online gradient descent perceptron.", UserName = UserNameValue, ShortName = OnlineGradientDescentTrainer.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.OnlineGradientDescentRegressor", + Desc = "Train a Online gradient descent perceptron.", + UserName = UserNameValue, + ShortName = ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.RegressionOutput TrainRegression(IHostEnvironment env, Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineLinear.cs b/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineLinear.cs index bcd4b33d58..60fe7f9705 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineLinear.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/Online/OnlineLinear.cs @@ -21,7 +21,7 @@ public abstract class OnlineLinearArguments : LearnerInputBaseWithLabel { [Argument(ArgumentType.AtMostOnce, HelpText = "Number of iterations", ShortName = "iter", SortOrder = 50)] [TGUI(Label = "Number of Iterations", Description = "Number of training iterations through data", SuggestedSweeps = "1,10,100")] - [TlcModule.SweepableLongParamAttribute("NumIterations", 1, 100, stepSize:10, isLogScale:true)] + [TlcModule.SweepableLongParamAttribute("NumIterations", 1, 100, stepSize: 10, isLogScale: true)] public int NumIterations = 1; [Argument(ArgumentType.AtMostOnce, HelpText = "Initial Weights and bias, comma-separated", ShortName = "initweights")] @@ -34,16 +34,14 @@ public abstract class OnlineLinearArguments : LearnerInputBaseWithLabel public Float InitWtsDiameter = 0; [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to shuffle for each training iteration", ShortName = "shuf")] - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[] {false, true})] + [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[] { false, true })] public bool Shuffle = true; [Argument(ArgumentType.AtMostOnce, HelpText = "Size of cache when trained in Scope", ShortName = "cache")] public int StreamingCacheSize = 1000000; } - public abstract class OnlineLinearTrainer : - TrainerBase, - IIncrementalTrainer + public abstract class OnlineLinearTrainer : TrainerBase where TArguments : OnlineLinearArguments where TPredictor : IPredictorProducing { @@ -72,6 +70,10 @@ public abstract class OnlineLinearTrainer : protected const string UserErrorPositive = "must be positive"; protected const string UserErrorNonNegative = "must be non-negative"; + public override TrainerInfo Info { get; } + + protected virtual bool NeedCalibration => false; + protected OnlineLinearTrainer(TArguments args, IHostEnvironment env, string name) : base(env, name) { @@ -81,22 +83,12 @@ protected OnlineLinearTrainer(TArguments args, IHostEnvironment env, string name Contracts.CheckUserArg(args.StreamingCacheSize > 0, nameof(args.StreamingCacheSize), UserErrorPositive); Args = args; - } - - public override bool NeedNormalization - { - get { return true; } - } - - public override bool WantCaching - { - // REVIEW: This could return true if there are more than 0 iterations, - // if we got around the whole shuffling issue. - get { return true; } + // REVIEW: Caching could be false for one iteration, if we got around the whole shuffling issue. + Info = new TrainerInfo(calibration: NeedCalibration); } /// - /// Propagates the _weightsScale to the weights vector. + /// Propagates the to the vector. /// protected void ScaleWeights() { @@ -108,9 +100,9 @@ protected void ScaleWeights() } /// - /// Conditionally propagates the _weightsScale to the weights vector when - /// it reaches a scale where additions to weights would start dropping too much - /// precision. ("Too much" is mostly empirically defined.) + /// Conditionally propagates the to the vector + /// when it reaches a scale where additions to weights would start dropping too much precision. + /// ("Too much" is mostly empirically defined.) /// protected void ScaleWeightsIfNeeded() { @@ -119,18 +111,20 @@ protected void ScaleWeightsIfNeeded() ScaleWeights(); } - private void TrainEx(RoleMappedData data, LinearPredictor predictor) + public override TPredictor Train(TrainContext context) { - Contracts.AssertValue(data, nameof(data)); - Contracts.AssertValueOrNull(predictor); + Host.CheckValue(context, nameof(context)); + var initPredictor = context.InitialPredictor; + var initLinearPred = initPredictor as LinearPredictor ?? (initPredictor as CalibratedPredictorBase)?.SubPredictor as LinearPredictor; + Host.CheckParam(initPredictor == null || initLinearPred != null, nameof(context), "Not a linear predictor."); + var data = context.TrainingSet; - int numFeatures; - data.CheckFeatureFloatVector(out numFeatures); + data.CheckFeatureFloatVector(out int numFeatures); CheckLabel(data); using (var ch = Host.Start("Training")) { - InitCore(ch, numFeatures, predictor); + InitCore(ch, numFeatures, initLinearPred); // InitCore should set the number of features field. Contracts.Assert(NumFeatures > 0); @@ -150,23 +144,11 @@ private void TrainEx(RoleMappedData data, LinearPredictor predictor) ch.Done(); } - } - public override void Train(RoleMappedData data) - { - Host.CheckValue(data, nameof(data)); - TrainEx(data, null); + return CreatePredictor(); } - public void Train(RoleMappedData data, IPredictor predictor) - { - Host.CheckValue(data, nameof(data)); - Host.CheckValue(predictor, nameof(predictor)); - LinearPredictor pred = (predictor as CalibratedPredictorBase)?.SubPredictor as LinearPredictor; - pred = pred ?? predictor as LinearPredictor; - Host.CheckParam(pred != null, nameof(predictor), "Not a linear predictor."); - TrainEx(data, pred); - } + protected abstract TPredictor CreatePredictor(); protected abstract void CheckLabel(RoleMappedData data); diff --git a/src/Microsoft.ML.StandardLearners/Standard/Online/doc.xml b/src/Microsoft.ML.StandardLearners/Standard/Online/doc.xml new file mode 100644 index 0000000000..2ad6e77aa0 --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/Standard/Online/doc.xml @@ -0,0 +1,68 @@ + + + + + + + Stochastic gradient descent is an optimization method used to train a wide range of models in machine learning. + In the ML.Net the implementation of OGD, is for linear regression. + + + Stochastic gradient descent uses a simple yet efficient iterative technique to fit model coefficients using error gradients for convex loss functions. + The OnlineGradientDescentRegressor implements the standard (non-batch) SGD, with a choice of loss functions, + and an option to update the weight vector using the average of the vectors seen over time (averaged argument is set to True by default). + + + + + + new OnlineGradientDescentRegressor + { + NumIterations = 10, + L2RegularizerWeight = 0.6f, + LossFunction = new PoissonLossRegressionLossFunction() + } + + + + + + + Averaged Perceptron Binary Classifier. + + + Perceptron is a classification algorithm that makes its predictions based on a linear function. + I.e., for an instance with feature values f0, f1,..., f_D-1, , the prediction is given by the sign of sigma[0,D-1] ( w_i * f_i), where w_0, w_1,...,w_D-1 are the weights computed by the algorithm. + + Perceptron is an online algorithm, i.e., it processes the instances in the training set one at a time. + The weights are initialized to be 0, or some random values. Then, for each example in the training set, the value of sigma[0, D-1] (w_i * f_i) is computed. + If this value has the same sign as the label of the current example, the weights remain the same. If they have opposite signs, + the weights vector is updated by either subtracting or adding (if the label is negative or positive, respectively) the feature vector of the current example, + multiplied by a factor 0 < a <= 1, called the learning rate. In a generalization of this algorithm, the weights are updated by adding the feature vector multiplied by the learning rate, + and by the gradient of some loss function (in the specific case described above, the loss is hinge-loss, whose gradient is 1 when it is non-zero). + + + In Averaged Perceptron (AKA voted-perceptron), the weight vectors are stored, + together with a weight that counts the number of iterations it survived (this is equivalent to storing the weight vector after every iteration, regardless of whether it was updated or not). + The prediction is then calculated by taking the weighted average of all the sums sigma[0, D-1] (w_i * f_i) or the different weight vectors. + + For more information see: + Wikipedia entry for Perceptron + Large Margin Classification Using the Perceptron Algorithm + + + + + + new AveragedPerceptronBinaryClassifier + { + NumIterations = 10, + L2RegularizerWeight = 0.01f, + LossFunction = new ExpLossClassificationLossFunction() + } + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.StandardLearners/Standard/PoissonRegression/PoissonRegression.cs b/src/Microsoft.ML.StandardLearners/Standard/PoissonRegression/PoissonRegression.cs index a3ef06cf4e..a8c3af7a5e 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/PoissonRegression/PoissonRegression.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/PoissonRegression/PoissonRegression.cs @@ -26,6 +26,7 @@ namespace Microsoft.ML.Runtime.Learners { + /// public sealed class PoissonRegression : LbfgsTrainerBase { internal const string LoadNameValue = "PoissonRegression"; @@ -44,9 +45,7 @@ public PoissonRegression(IHostEnvironment env, Arguments args) { } - public override bool NeedCalibration { get { return false; } } - - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } + public override PredictionKind PredictionKind => PredictionKind.Regression; protected override void CheckLabel(RoleMappedData data) { @@ -105,7 +104,7 @@ protected override Float AccumulateOneGradient(ref VBuffer feat, Float la return -(y * dot - lambda) * weight; } - public override PoissonRegressionPredictor CreatePredictor() + protected override PoissonRegressionPredictor CreatePredictor() { VBuffer weights = default(VBuffer); CurrentWeights.CopyTo(ref weights, 1, CurrentWeights.Length - 1); @@ -124,7 +123,12 @@ protected override void ProcessPriorDistribution(Float label, Float weight) // No-op by design. } - [TlcModule.EntryPoint(Name = "Trainers.PoissonRegressor", Desc = "Train an Poisson regression model.", UserName = UserNameValue, ShortName = ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.PoissonRegressor", + Desc = "Train an Poisson regression model.", + UserName = UserNameValue, + ShortName = ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.RegressionOutput TrainRegression(IHostEnvironment env, Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/PoissonRegression/doc.xml b/src/Microsoft.ML.StandardLearners/Standard/PoissonRegression/doc.xml new file mode 100644 index 0000000000..975f1eb2ff --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/Standard/PoissonRegression/doc.xml @@ -0,0 +1,28 @@ + + + + + + + Trains a Poisson Regression model. + + + Poisson regression is a parameterized regression method. + It assumes that the log of the conditional mean of the dependent variable follows a linear function of the dependent variables. + Assuming that the dependent variable follows a Poisson distribution, the parameters of the regressor can be estimated by maximizing the likelihood of the obtained observations. + + + + + + new PoissonRegressor + { + MaxIterations = 100, + L2Weight = 0.6f + } + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.StandardLearners/Standard/SdcaMultiClass.cs b/src/Microsoft.ML.StandardLearners/Standard/SdcaMultiClass.cs index f8d7db7998..af30335af6 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/SdcaMultiClass.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/SdcaMultiClass.cs @@ -28,10 +28,9 @@ namespace Microsoft.ML.Runtime.Learners { using TVectorPredictor = IPredictorProducing>; - /// - /// SDCA linear multiclass trainer. - /// - public class SdcaMultiClassTrainer : SdcaTrainerBase, ITrainerEx + // SDCA linear multiclass trainer. + /// + public class SdcaMultiClassTrainer : SdcaTrainerBase { public const string LoadNameValue = "SDCAMC"; public const string UserNameValue = "Fast Linear Multi-class Classification (SA-SDCA)"; @@ -46,21 +45,8 @@ public sealed class Arguments : ArgumentsBase private readonly ISupportSdcaClassificationLoss _loss; private readonly Arguments _args; - private int _numClasses; - - public override PredictionKind PredictionKind - { - get { return PredictionKind.MultiClassClassification; } - } - protected override int WeightArraySize - { - get - { - Contracts.Assert(_numClasses > 0, "_numClasses should already have been initialized when this property is called."); - return _numClasses; - } - } + public override PredictionKind PredictionKind => PredictionKind.MultiClassClassification; public SdcaMultiClassTrainer(IHostEnvironment env, Arguments args) : base(args, env, LoadNameValue) @@ -71,8 +57,6 @@ public SdcaMultiClassTrainer(IHostEnvironment env, Arguments args) _args = args; } - public override bool NeedCalibration { get { return false; } } - /// protected override void TrainWithoutLock(IProgressChannelProvider progress, FloatLabelCursor.Factory cursorFactory, IRandom rand, IdToIdxLookup idToIdx, int numThreads, DualsTableBase duals, Float[] biasReg, Float[] invariants, Float lambdaNInv, @@ -83,11 +67,9 @@ protected override void TrainWithoutLock(IProgressChannelProvider progress, Floa Contracts.AssertValueOrNull(idToIdx); Contracts.AssertValueOrNull(invariants); Contracts.AssertValueOrNull(featureNormSquared); - int weightArraySize = WeightArraySize; - Contracts.Assert(weightArraySize == _numClasses); - Contracts.Assert(Utils.Size(weights) == weightArraySize); - Contracts.Assert(Utils.Size(biasReg) == weightArraySize); - Contracts.Assert(Utils.Size(biasUnreg) == weightArraySize); + int numClasses = Utils.Size(weights); + Contracts.Assert(Utils.Size(biasReg) == numClasses); + Contracts.Assert(Utils.Size(biasUnreg) == numClasses); int maxUpdateTrials = 2 * numThreads; var l1Threshold = _args.L1Threshold.Value; @@ -102,11 +84,11 @@ protected override void TrainWithoutLock(IProgressChannelProvider progress, Floa if (pch != null) pch.SetHeader(new ProgressHeader("examples"), e => e.SetProgress(0, rowCount)); - Func getIndexFromId = GetIndexFromIdGetter(idToIdx); + Func getIndexFromId = GetIndexFromIdGetter(idToIdx, biasReg.Length); while (cursor.MoveNext()) { long idx = getIndexFromId(cursor.Id); - long dualIndexInitPos = idx * weightArraySize; + long dualIndexInitPos = idx * numClasses; var features = cursor.Features; var label = (int)cursor.Label; Float invariant; @@ -140,14 +122,14 @@ protected override void TrainWithoutLock(IProgressChannelProvider progress, Floa Float labelAdjustment = 0; // Iterates through all classes. - for (int iClass = 0; iClass < _numClasses; iClass++) + for (int iClass = 0; iClass < numClasses; iClass++) { // Skip the dual/weights/bias update for label class. Will be taken care of at the end. if (iClass == label) continue; // Loop trials for compare-and-swap updates of duals. - // In general, concurrent update conflict to the same dual variable is rare + // In general, concurrent update conflict to the same dual variable is rare // if data is shuffled. for (int numTrials = 0; numTrials < maxUpdateTrials; numTrials++) { @@ -157,14 +139,12 @@ protected override void TrainWithoutLock(IProgressChannelProvider progress, Floa var dualUpdate = _loss.DualUpdate(output, 1, dual, invariant, numThreads); // The successive over-relaxation apporach to adjust the sum of dual variables (biasReg) to zero. - // Reference to details: http://stat.rutgers.edu/home/tzhang/papers/ml02_dual.pdf, pp. 16-17. + // Reference to details: http://stat.rutgers.edu/home/tzhang/papers/ml02_dual.pdf, pp. 16-17. var adjustment = l1ThresholdZero ? lr * biasReg[iClass] : lr * l1IntermediateBias[iClass]; dualUpdate -= adjustment; bool success = false; duals.ApplyAt(dualIndex, (long index, ref Float value) => - { - success = Interlocked.CompareExchange(ref value, dual + dualUpdate, dual) == dual; - }); + success = Interlocked.CompareExchange(ref value, dual + dualUpdate, dual) == dual); if (success) { @@ -252,24 +232,23 @@ protected override bool CheckConvergence( { Contracts.AssertValue(weights); Contracts.AssertValue(duals); - Contracts.Assert(weights.Length == _numClasses); - Contracts.Assert(duals.Length >= _numClasses * count); + int numClasses = weights.Length; + Contracts.Assert(duals.Length >= numClasses * count); Contracts.AssertValueOrNull(idToIdx); - int weightArraySize = WeightArraySize; - Contracts.Assert(weightArraySize == _numClasses); - Contracts.Assert(Utils.Size(weights) == weightArraySize); - Contracts.Assert(Utils.Size(biasReg) == weightArraySize); - Contracts.Assert(Utils.Size(biasUnreg) == weightArraySize); + Contracts.Assert(Utils.Size(weights) == numClasses); + Contracts.Assert(Utils.Size(biasReg) == numClasses); + Contracts.Assert(Utils.Size(biasUnreg) == numClasses); Contracts.Assert(Utils.Size(metrics) == 6); var reportedValues = new Double?[metrics.Length + 1]; reportedValues[metrics.Length] = iter; var lossSum = new CompensatedSum(); var dualLossSum = new CompensatedSum(); + int numFeatures = weights[0].Length; using (var cursor = cursorFactory.Create()) { long row = 0; - Func getIndexFromIdAndRow = GetIndexFromIdAndRowGetter(idToIdx); + Func getIndexFromIdAndRow = GetIndexFromIdAndRowGetter(idToIdx, biasReg.Length); // Iterates through data to compute loss function. while (cursor.MoveNext()) { @@ -280,8 +259,8 @@ protected override bool CheckConvergence( Double subLoss = 0; Double subDualLoss = 0; long idx = getIndexFromIdAndRow(cursor.Id, row); - long dualIndex = idx * _numClasses; - for (int iClass = 0; iClass < _numClasses; iClass++) + long dualIndex = idx * numClasses; + for (int iClass = 0; iClass < numClasses; iClass++) { if (iClass == label) { @@ -291,7 +270,7 @@ protected override bool CheckConvergence( var currentClassOutput = WDot(ref features, ref weights[iClass], biasReg[iClass] + biasUnreg[iClass]); subLoss += _loss.Loss(labelOutput - currentClassOutput, 1); - Contracts.Assert(dualIndex == iClass + idx * _numClasses); + Contracts.Assert(dualIndex == iClass + idx * numClasses); var dual = duals[dualIndex++]; subDualLoss += _loss.DualLoss(1, dual); } @@ -301,7 +280,7 @@ protected override bool CheckConvergence( row++; } - Host.Assert(idToIdx == null || row * WeightArraySize == duals.Length); + Host.Assert(idToIdx == null || row * numClasses == duals.Length); } Contracts.Assert(_args.L2Const.HasValue); @@ -312,7 +291,7 @@ protected override bool CheckConvergence( Double weightsL1Norm = 0; Double weightsL2NormSquared = 0; Double biasRegularizationAdjustment = 0; - for (int iClass = 0; iClass < _numClasses; iClass++) + for (int iClass = 0; iClass < numClasses; iClass++) { weightsL1Norm += VectorUtils.L1Norm(ref weights[iClass]) + Math.Abs(biasReg[iClass]); weightsL2NormSquared += VectorUtils.NormSquared(weights[iClass]) + biasReg[iClass] * biasReg[iClass]; @@ -331,15 +310,16 @@ protected override bool CheckConvergence( metrics[(int)MetricKind.DualityGap] = dualityGap; metrics[(int)MetricKind.BiasUnreg] = biasUnreg[0]; metrics[(int)MetricKind.BiasReg] = biasReg[0]; - metrics[(int)MetricKind.L1Sparsity] = _args.L1Threshold == 0 ? 1 : (Double)weights.Sum(weight => weight.Values.Count(w => w != 0)) / (_numClasses * NumFeatures); + metrics[(int)MetricKind.L1Sparsity] = _args.L1Threshold == 0 ? 1 : weights.Sum( + weight => weight.Values.Count(w => w != 0)) / (numClasses * numFeatures); bool converged = dualityGap / newLoss < _args.ConvergenceTolerance; if (metrics[(int)MetricKind.Loss] < bestPrimalLoss) { - for (int iClass = 0; iClass < _numClasses; iClass++) + for (int iClass = 0; iClass < numClasses; iClass++) { - // Maintain a copy of weights and bias with best primal loss thus far. + // Maintain a copy of weights and bias with best primal loss thus far. // This is some extra work and uses extra memory, but it seems worth doing it. // REVIEW: Sparsify bestWeights? weights[iClass].CopyTo(ref bestWeights[iClass]); @@ -359,14 +339,19 @@ protected override bool CheckConvergence( return converged; } - public override TVectorPredictor CreatePredictor() + protected override TVectorPredictor CreatePredictor(VBuffer[] weights, Float[] bias) { - return new MulticlassLogisticRegressionPredictor(Host, Weights, Bias, _numClasses, NumFeatures, null, stats: null); + Host.CheckValue(weights, nameof(weights)); + Host.CheckValue(bias, nameof(bias)); + Host.CheckParam(weights.Length > 0, nameof(weights)); + Host.CheckParam(weights.Length == bias.Length, nameof(weights)); + + return new MulticlassLogisticRegressionPredictor(Host, weights, bias, bias.Length, weights[0].Length, null, stats: null); } - protected override void CheckLabel(RoleMappedData examples) + protected override void CheckLabel(RoleMappedData examples, out int weightSetCount) { - examples.CheckMultiClassLabel(out _numClasses); + examples.CheckMultiClassLabel(out weightSetCount); } protected override Float[] InitializeFeatureNormSquared(int length) @@ -382,11 +367,16 @@ protected override Float GetInstanceWeight(FloatLabelCursor cursor) } /// - /// A component to train an SDCA model. + /// The Entry Point for SDCA multiclass. /// public static partial class Sdca { - [TlcModule.EntryPoint(Name = "Trainers.StochasticDualCoordinateAscentClassifier", Desc = "Train an SDCA multi class model", UserName = SdcaMultiClassTrainer.UserNameValue, ShortName = SdcaMultiClassTrainer.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.StochasticDualCoordinateAscentClassifier", + Desc = SdcaMultiClassTrainer.Summary, + UserName = SdcaMultiClassTrainer.UserNameValue, + ShortName = SdcaMultiClassTrainer.ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.MulticlassClassificationOutput TrainMultiClass(IHostEnvironment env, SdcaMultiClassTrainer.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/SdcaRegression.cs b/src/Microsoft.ML.StandardLearners/Standard/SdcaRegression.cs index e8f5aeb04d..bfa0796bed 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/SdcaRegression.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/SdcaRegression.cs @@ -25,7 +25,8 @@ namespace Microsoft.ML.Runtime.Learners { using TScalarPredictor = IPredictorWithFeatureWeights; - public sealed class SdcaRegressionTrainer : SdcaTrainerBase, ITrainer, ITrainerEx + /// + public sealed class SdcaRegressionTrainer : SdcaTrainerBase { public const string LoadNameValue = "SDCAR"; public const string UserNameValue = "Fast Linear Regression (SA-SDCA)"; @@ -50,11 +51,7 @@ public Arguments() private readonly ISupportSdcaRegressionLoss _loss; private readonly Arguments _args; - public override PredictionKind PredictionKind { get { return PredictionKind.Regression; } } - - public override bool NeedCalibration { get { return false; } } - - protected override int WeightArraySize { get { return 1; } } + public override PredictionKind PredictionKind => PredictionKind.Regression; public SdcaRegressionTrainer(IHostEnvironment env, Arguments args) : base(args, env, LoadNameValue) @@ -65,22 +62,16 @@ public SdcaRegressionTrainer(IHostEnvironment env, Arguments args) _args = args; } - public override IPredictor CreatePredictor() - { - Contracts.Assert(WeightArraySize == 1); - Contracts.Assert(Utils.Size(Weights) == 1); - Contracts.Assert(Utils.Size(Bias) == 1); - Host.Check(Weights[0].Length > 0); - VBuffer maybeSparseWeights = VBufferUtils.CreateEmpty(Weights[0].Length); - VBufferUtils.CreateMaybeSparseCopy(ref Weights[0], ref maybeSparseWeights, Conversions.Instance.GetIsDefaultPredicate(NumberType.Float)); - return new LinearRegressionPredictor(Host, ref maybeSparseWeights, Bias[0]); - } - - TScalarPredictor ITrainer.CreatePredictor() + protected override TScalarPredictor CreatePredictor(VBuffer[] weights, Float[] bias) { - var predictor = CreatePredictor() as TScalarPredictor; - Contracts.AssertValue(predictor); - return predictor; + Host.CheckParam(Utils.Size(weights) == 1, nameof(weights)); + Host.CheckParam(Utils.Size(bias) == 1, nameof(bias)); + Host.CheckParam(weights[0].Length > 0, nameof(weights)); + + VBuffer maybeSparseWeights = default; + VBufferUtils.CreateMaybeSparseCopy(ref weights[0], ref maybeSparseWeights, + Conversions.Instance.GetIsDefaultPredicate(NumberType.Float)); + return new LinearRegressionPredictor(Host, ref maybeSparseWeights, bias[0]); } protected override Float GetInstanceWeight(FloatLabelCursor cursor) @@ -88,9 +79,10 @@ protected override Float GetInstanceWeight(FloatLabelCursor cursor) return cursor.Weight; } - protected override void CheckLabel(RoleMappedData examples) + protected override void CheckLabel(RoleMappedData examples, out int weightSetCount) { examples.CheckRegressionLabel(); + weightSetCount = 1; } // REVIEW: No extra benefits from using more threads in training. @@ -127,11 +119,16 @@ protected override Float TuneDefaultL2(IChannel ch, int maxIterations, long rowC } /// - /// A component to train an SDCA model. + ///The Entry Point for the SDCA regressor. /// public static partial class Sdca { - [TlcModule.EntryPoint(Name = "Trainers.StochasticDualCoordinateAscentRegressor", Desc = "Train an SDCA regression model", UserName = SdcaRegressionTrainer.UserNameValue, ShortName = SdcaRegressionTrainer.ShortName)] + [TlcModule.EntryPoint(Name = "Trainers.StochasticDualCoordinateAscentRegressor", + Desc = SdcaRegressionTrainer.Summary, + UserName = SdcaRegressionTrainer.UserNameValue, + ShortName = SdcaRegressionTrainer.ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.RegressionOutput TrainRegression(IHostEnvironment env, SdcaRegressionTrainer.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs b/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs index 364e29b877..abfff554c9 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs @@ -38,7 +38,7 @@ namespace Microsoft.ML.Runtime.Learners /// /// A trainer that trains a predictor that returns random values /// - public sealed class RandomTrainer : TrainerBase + public sealed class RandomTrainer : TrainerBase { internal const string LoadNameValue = "RandomPredictor"; internal const string UserNameValue = "Random Predictor"; @@ -54,29 +54,20 @@ public class Arguments public bool BooleanArg = false; } - private Arguments _args; + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + + private static readonly TrainerInfo _info = new TrainerInfo(normalization: false, caching: false); + public override TrainerInfo Info => _info; public RandomTrainer(IHostEnvironment env, Arguments args) : base(env, LoadNameValue) { - _args = args; - } - - public override PredictionKind PredictionKind - { get { return PredictionKind.BinaryClassification; } } - public override bool NeedNormalization - { get { return false; } } - public override bool NeedCalibration - { get { return false; } } - public override bool WantCaching - { get { return false; } } - - public override void Train(RoleMappedData data) - { + Host.CheckValue(args, nameof(args)); } - public override RandomPredictor CreatePredictor() + public override RandomPredictor Train(TrainContext context) { + Host.CheckValue(context, nameof(context)); return new RandomPredictor(Host, Host.Rand.Next()); } } @@ -107,16 +98,10 @@ private static VersionInfo GetVersionInfo() private readonly object _instanceLock; private readonly Random _random; - private readonly ColumnType _inputType; - - public override PredictionKind PredictionKind - { get { return PredictionKind.BinaryClassification; } } - public ColumnType InputType - { get { return _inputType; } } - public ColumnType OutputType - { get { return NumberType.Float; } } - public ColumnType DistType - { get { return NumberType.Float; } } + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; + public ColumnType InputType { get; } + public ColumnType OutputType => NumberType.Float; + public ColumnType DistType => NumberType.Float; public RandomPredictor(IHostEnvironment env, int seed) : base(env, LoaderSignature) @@ -126,7 +111,7 @@ public RandomPredictor(IHostEnvironment env, int seed) _instanceLock = new object(); _random = new Random(_seed); - _inputType = new VectorType(NumberType.Float); + InputType = new VectorType(NumberType.Float); } /// @@ -211,7 +196,7 @@ private void MapDist(ref VBuffer src, ref Float score, ref Float prob) } // Learns the prior distribution for 0/1 class labels and just outputs that. - public sealed class PriorTrainer : TrainerBase + public sealed class PriorTrainer : TrainerBase { internal const string LoadNameValue = "PriorPredictor"; internal const string UserNameValue = "Prior Predictor"; @@ -220,26 +205,22 @@ public sealed class Arguments { } - private Float _prob; + public override PredictionKind PredictionKind => PredictionKind.BinaryClassification; - public override PredictionKind PredictionKind - { get { return PredictionKind.BinaryClassification; } } - public override bool NeedNormalization - { get { return false; } } - public override bool NeedCalibration - { get { return false; } } - public override bool WantCaching - { get { return false; } } + private static readonly TrainerInfo _info = new TrainerInfo(normalization: false, caching: false); + public override TrainerInfo Info => _info; public PriorTrainer(IHostEnvironment env, Arguments args) : base(env, LoadNameValue) { - _prob = Float.NaN; + Host.CheckValue(args, nameof(args)); } - public override void Train(RoleMappedData data) + public override PriorPredictor Train(TrainContext context) { - Contracts.CheckValue(data, nameof(data)); + Contracts.CheckValue(context, nameof(context)); + var data = context.TrainingSet; + data.CheckBinaryLabel(); Contracts.CheckParam(data.Schema.Label != null, nameof(data), "Missing Label column"); Contracts.CheckParam(data.Schema.Label.Type == NumberType.Float, nameof(data), "Invalid type for Label column"); @@ -248,11 +229,11 @@ public override void Train(RoleMappedData data) int col = data.Schema.Label.Index; int colWeight = -1; - if (data.Schema.Weight != null && data.Schema.Weight.Type == NumberType.Float) + if (data.Schema.Weight?.Type == NumberType.Float) colWeight = data.Schema.Weight.Index; using (var cursor = data.Data.GetRowCursor(c => c == col || c == colWeight)) { - var getLab = cursor.GetGetter(col); + var getLab = cursor.GetLabelFloatGetter(data); var getWeight = colWeight >= 0 ? cursor.GetGetter(colWeight) : null; Float lab = default(Float); Float weight = 1; @@ -274,13 +255,8 @@ public override void Train(RoleMappedData data) } } - if (pos + neg > 0) - _prob = (Float)(pos / (pos + neg)); - } - - public override PriorPredictor CreatePredictor() - { - return new PriorPredictor(Host, _prob); + Float prob = prob = pos + neg > 0 ? (Float)(pos / (pos + neg)) : Float.NaN; + return new PriorPredictor(Host, prob); } } @@ -304,8 +280,6 @@ private static VersionInfo GetVersionInfo() private readonly Float _prob; private readonly Float _raw; - private readonly ColumnType _inputType; - public PriorPredictor(IHostEnvironment env, Float prob) : base(env, LoaderSignature) { @@ -314,7 +288,7 @@ public PriorPredictor(IHostEnvironment env, Float prob) _prob = prob; _raw = 2 * _prob - 1; // This could be other functions -- logodds for instance - _inputType = new VectorType(NumberType.Float); + InputType = new VectorType(NumberType.Float); } private PriorPredictor(IHostEnvironment env, ModelLoadContext ctx) @@ -328,7 +302,7 @@ private PriorPredictor(IHostEnvironment env, ModelLoadContext ctx) _raw = 2 * _prob - 1; - _inputType = new VectorType(NumberType.Float); + InputType = new VectorType(NumberType.Float); } public static PriorPredictor Create(IHostEnvironment env, ModelLoadContext ctx) @@ -353,12 +327,9 @@ protected override void SaveCore(ModelSaveContext ctx) public override PredictionKind PredictionKind { get { return PredictionKind.BinaryClassification; } } - public ColumnType InputType - { get { return _inputType; } } - public ColumnType OutputType - { get { return NumberType.Float; } } - public ColumnType DistType - { get { return NumberType.Float; } } + public ColumnType InputType { get; } + public ColumnType OutputType => NumberType.Float; + public ColumnType DistType => NumberType.Float; public ValueMapper GetMapper() { diff --git a/src/Microsoft.ML.StandardLearners/Standard/doc.xml b/src/Microsoft.ML.StandardLearners/Standard/doc.xml new file mode 100644 index 0000000000..eb87605232 --- /dev/null +++ b/src/Microsoft.ML.StandardLearners/Standard/doc.xml @@ -0,0 +1,73 @@ + + + + + + + Train an SDCA linear model. + + + This classifier is a trainer based on the Stochastic Dual Coordinate Ascent(SDCA) method, a state-of-the-art optimization technique for convex objective functions. + The algorithm can be scaled for use on large out-of-memory data sets due to a semi-asynchronized implementation that supports multi-threading. + + Convergence is underwritten by periodically enforcing synchronization between primal and dual updates in a separate thread. + Several choices of loss functions are also provided. + The SDCA method combines several of the best properties and capabilities of logistic regression and SVM algorithms. + + + Note that SDCA is a stochastic and streaming optimization algorithm. + The results depends on the order of the training data. For reproducible results, it is recommended that one sets 'Shuffle' to + False and 'NumThreads' to 1. + Elastic net regularization can be specified by the 'L2Const' and 'L1Threshold' parameters. Note that the 'L2Const' has an effect on the rate of convergence. + In general, the larger the 'L2Const', the faster SDCA converges. + + For more information, see also: + + + Scaling Up Stochastic Dual Coordinate Ascent. + + + Stochastic Dual Coordinate Ascent Methods for Regularized Loss Minimization. + + + + + + + + new StochasticDualCoordinateAscentBinaryClassifier + { + MaxIterations = 100, + NumThreads = 7, + LossFunction = new SmoothedHingeLossSDCAClassificationLossFunction(), + Caching = Microsoft.ML.Models.CachingOptions.Disk + } + + + + + + + new StochasticDualCoordinateAscentClassifier + { + MaxIterations = 100, + NumThreads = 7, + LossFunction = new SmoothedHingeLossSDCAClassificationLossFunction() + } + + + + + + + new StochasticDualCoordinateAscentRegressor + { + MaxIterations = 100, + NumThreads = 5 + } + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML.Sweeper/Algorithms/Grid.cs b/src/Microsoft.ML.Sweeper/Algorithms/Grid.cs index 734cf93e30..53e7046ebd 100644 --- a/src/Microsoft.ML.Sweeper/Algorithms/Grid.cs +++ b/src/Microsoft.ML.Sweeper/Algorithms/Grid.cs @@ -64,10 +64,10 @@ protected SweeperBase(ArgumentsBase args, IHostEnvironment env, IValueGenerator[ SweepParameters = sweepParameters; } - public virtual ParameterSet[] ProposeSweeps(int maxSweeps, IEnumerable previousRuns) + public virtual ParameterSet[] ProposeSweeps(int maxSweeps, IEnumerable previousRuns = null) { var prevParamSets = previousRuns?.Select(r => r.ParameterSet).ToList() ?? new List(); - var result = new List(); + var result = new HashSet(); for (int i = 0; i < maxSweeps; i++) { ParameterSet paramSet; @@ -150,12 +150,12 @@ public RandomGridSweeper(IHostEnvironment env, Arguments args, IValueGenerator[] } } - public override ParameterSet[] ProposeSweeps(int maxSweeps, IEnumerable previousRuns) + public override ParameterSet[] ProposeSweeps(int maxSweeps, IEnumerable previousRuns = null) { if (_nGridPoints == 0) return base.ProposeSweeps(maxSweeps, previousRuns); - var result = new List(); + var result = new HashSet(); var prevParamSets = (previousRuns != null) ? previousRuns.Select(r => r.ParameterSet).ToList() : new List(); diff --git a/src/Microsoft.ML.Sweeper/Algorithms/KdoSweeper.cs b/src/Microsoft.ML.Sweeper/Algorithms/KdoSweeper.cs index cdda9e3cd6..6479c51f7e 100644 --- a/src/Microsoft.ML.Sweeper/Algorithms/KdoSweeper.cs +++ b/src/Microsoft.ML.Sweeper/Algorithms/KdoSweeper.cs @@ -19,20 +19,20 @@ namespace Microsoft.ML.Runtime.Sweeper.Algorithms { /// - /// Kernel Density Optimization (KDO) is a sequential model-based optimization method originally developed by George D. Montanez (me). + /// Kernel Density Optimization (KDO) is a sequential model-based optimization method originally developed by George D. Montanez (me). /// The search space consists of a unit hypercube, with one dimension per hyperparameter (it is a spatial method, so scaling the dimensions /// to the unit hypercube is critical). The idea is that the exploration of the cube to find good values is performed by creating an approximate /// (and biased) kernel density estimate of the space (where density corresponds to metric performance), concentrating mass in regions of better /// performance, then drawing samples from the pdf. - /// - /// To trade off exploration versus exploitation, an fitness proportional mutation scheme is used. Uniform random points are selected during + /// + /// To trade off exploration versus exploitation, an fitness proportional mutation scheme is used. Uniform random points are selected during /// initialization and during the runs (parameter controls how often). A Gaussian model is fit to the distribution of performance values, and - /// each evaluated point in the history is given a value between 0 and 1 corresponding to the CDF evaluation of its performance under the - /// Gaussian. Points with low quantile values are mutated more strongly than those with higher values, which allows the method to hone in + /// each evaluated point in the history is given a value between 0 and 1 corresponding to the CDF evaluation of its performance under the + /// Gaussian. Points with low quantile values are mutated more strongly than those with higher values, which allows the method to hone in /// precisely when approaching really good regions. - /// + /// /// Categorical parameters are handled by forming a categorical distribution on possible values weighted by observed performance of each value, - /// taken independently. + /// taken independently. /// public sealed class KdoSweeper : ISweeper @@ -113,7 +113,7 @@ public ParameterSet[] ProposeSweeps(int maxSweeps, IEnumerable previ var prevRuns = previousRuns?.ToArray() ?? new IRunResult[0]; var numSweeps = Math.Min(numOfCandidates, _args.NumberInitialPopulation - prevRuns.Length); - // Initialization: Will enter here on first iteration and use the default (random) + // Initialization: Will enter here on first iteration and use the default (random) // sweeper to generate initial candidates. if (prevRuns.Length < _args.NumberInitialPopulation) { @@ -348,7 +348,7 @@ private double[] ExtractRandomRunValues(IEnumerable previousRuns) } /// - /// New version of CategoryToWeights method, which fixes an issue where we could + /// New version of CategoryToWeights method, which fixes an issue where we could /// potentially assign a lot of mass to bad categories. /// private double[] CategoriesToWeights(DiscreteValueGenerator param, IRunResult[] previousRuns) @@ -374,7 +374,7 @@ private double[] CategoriesToWeights(DiscreteValueGenerator param, IRunResult[] for (int i = 0; i < weights.Length; i++) weights[i] /= (counts[i] > 0 ? counts[i] : 1); - // If any learner has not been seen, default it's average to + // If any learner has not been seen, default it's average to // best value to encourage exploration of untried algorithms. double bestVal = isMaximizing ? previousRuns.Cast().Where(r => r.HasMetricValue).Max(r => r.MetricValue) : diff --git a/src/Microsoft.ML.Sweeper/Algorithms/NelderMead.cs b/src/Microsoft.ML.Sweeper/Algorithms/NelderMead.cs index bffecaae05..c982fc46ec 100644 --- a/src/Microsoft.ML.Sweeper/Algorithms/NelderMead.cs +++ b/src/Microsoft.ML.Sweeper/Algorithms/NelderMead.cs @@ -104,7 +104,7 @@ public NelderMeadSweeper(IHostEnvironment env, Arguments args) // REVIEW: ideas about how to support discrete values: // 1. assign each discrete value a random number (1-n) to make mirroring possible // 2. each time we need to mirror a discrete value, sample from the remaining value - // 2.1. make the sampling non-uniform by learning "weights" for the different discrete values based on + // 2.1. make the sampling non-uniform by learning "weights" for the different discrete values based on // the metric values that we get when using them. (E.g. if, for a given discrete value, we get a bad result, // we lower its weight, but if we get a good result we increase its weight). var parameterNumeric = parameter as INumericValueGenerator; diff --git a/src/Microsoft.ML.Sweeper/Algorithms/SmacSweeper.cs b/src/Microsoft.ML.Sweeper/Algorithms/SmacSweeper.cs index 87420a265e..cf08cc99c3 100644 --- a/src/Microsoft.ML.Sweeper/Algorithms/SmacSweeper.cs +++ b/src/Microsoft.ML.Sweeper/Algorithms/SmacSweeper.cs @@ -91,8 +91,8 @@ public ParameterSet[] ProposeSweeps(int maxSweeps, IEnumerable previ { int numOfCandidates = maxSweeps; - // Initialization: Will enter here on first iteration and use the default (random) - // sweeper to generate initial candidates. + // Initialization: Will enter here on first iteration and use the default (random) + // sweeper to generate initial candidates. int numRuns = previousRuns == null ? 0 : previousRuns.Count(); if (numRuns < _args.NumberInitialPopulation) return _randomSweeper.ProposeSweeps(Math.Min(numOfCandidates, _args.NumberInitialPopulation - numRuns), previousRuns); @@ -126,12 +126,12 @@ private FastForestRegressionPredictor FitModel(IEnumerable previousR } ArrayDataViewBuilder dvBuilder = new ArrayDataViewBuilder(_host); - dvBuilder.AddColumn("Label", NumberType.Float, targets); - dvBuilder.AddColumn("Features", NumberType.Float, features); + dvBuilder.AddColumn(DefaultColumnNames.Label, NumberType.Float, targets); + dvBuilder.AddColumn(DefaultColumnNames.Features, NumberType.Float, features); IDataView view = dvBuilder.GetDataView(); _host.Assert(view.GetRowCount() == targets.Length, "This data view will have as many rows as there have been evaluations"); - RoleMappedData data = TrainUtils.CreateExamples(view, "Label", "Features"); + RoleMappedData data = new RoleMappedData(view, DefaultColumnNames.Label, DefaultColumnNames.Features); using (IChannel ch = _host.Start("Single training")) { @@ -142,9 +142,8 @@ private FastForestRegressionPredictor FitModel(IEnumerable previousR args.MinDocumentsInLeafs = _args.NMinForSplit; // Train random forest. - FastForestRegression trainer = new FastForestRegression(_host, args); - trainer.Train(data); - FastForestRegressionPredictor predictor = trainer.CreatePredictor(); + var trainer = new FastForestRegression(_host, args); + var predictor = trainer.Train(data); // Return random forest predictor. ch.Done(); @@ -182,34 +181,6 @@ private ParameterSet[] GenerateCandidateConfigurations(int numOfCandidates, IEnu return configs; } - private ParameterSet[] TreeOrderedCandidatesSearch(FastForestRegressionPredictor forest, int numOfCandidates, IEnumerable previousRuns) - { - // Step 1: Get ordered list of all leaf values. - SortedList> leafValueList = new SortedList>(Comparer.Create((x, y) => y.CompareTo(x))); - for (int i = 0; i < forest.TrainedEnsemble.NumTrees; i++) - { - RegressionTree t = forest.TrainedEnsemble.GetTreeAt(i); - for (int j = 0; j < t.NumLeaves; j++) - { - double val = t.LeafValue(j); - while (leafValueList.ContainsKey(val)) - val += Double.Epsilon; - leafValueList.Add(val, Tuple.Create(i, j)); - } - } - - // Step 2: Go through, starting from best leaves. - - //ch.Info("Ha ha, we trained {0} trees", ensemble.NumTrees); - //// This is a pretty silly example of inspecting the tree. - //int count = ensemble.Trees.Sum(t => t.SplitFeatures.Take(t.NumNodes).Count(f => f == 5)); - //ch.Info("Our random forest ensemble used the feature with index 5, {0} times!!", count); - //double allLeavesSum = ensemble.Trees.Sum(t => t.LeafValues.Take(t.NumLeaves).Sum()); - //ch.Info("Our random forest, across all leaves, summed to {0}", allLeavesSum); - //int[] path = t.pathToLeaf(leafIndex); - return null; - } - /// /// Does a mix of greedy local search around best performing parameter sets, while throwing random parameter sets into the mix. /// @@ -220,7 +191,7 @@ private ParameterSet[] TreeOrderedCandidatesSearch(FastForestRegressionPredictor /// Array of parameter sets, which will then be evaluated. private ParameterSet[] GreedyPlusRandomSearch(ParameterSet[] parents, FastForestRegressionPredictor forest, int numOfCandidates, IEnumerable previousRuns) { - // REVIEW: The IsMetricMaximizing flag affects the comparator, so that + // REVIEW: The IsMetricMaximizing flag affects the comparator, so that // performing Max() should get the best, regardless of if it is maximizing or // minimizing. RunResult bestRun = (RunResult)previousRuns.Max(); diff --git a/src/Microsoft.ML.Sweeper/Algorithms/SweeperProbabilityUtils.cs b/src/Microsoft.ML.Sweeper/Algorithms/SweeperProbabilityUtils.cs index cf706d3495..08ef587596 100644 --- a/src/Microsoft.ML.Sweeper/Algorithms/SweeperProbabilityUtils.cs +++ b/src/Microsoft.ML.Sweeper/Algorithms/SweeperProbabilityUtils.cs @@ -79,7 +79,7 @@ public double[] NormalRVs(int numRVs, double mu, double sigma) /// /// This performs (slow) roulette-wheel sampling of a categorical distribution. Should be swapped for other - /// method as soon as one is available. + /// method as soon as one is available. /// /// Number of samples to draw. /// Weights for distribution (should sum to 1). @@ -117,7 +117,7 @@ public double SampleUniform() } /// - /// Simple binary search method for finding smallest index in array where value + /// Simple binary search method for finding smallest index in array where value /// meets or exceeds what you're looking for. /// /// Array to search diff --git a/src/Microsoft.ML.Sweeper/AsyncSweeper.cs b/src/Microsoft.ML.Sweeper/AsyncSweeper.cs index e325846f6f..a86a4755d8 100644 --- a/src/Microsoft.ML.Sweeper/AsyncSweeper.cs +++ b/src/Microsoft.ML.Sweeper/AsyncSweeper.cs @@ -143,7 +143,7 @@ public void Dispose() } /// - /// An wrapper around which enforces determinism by imposing synchronization over past runs. + /// An wrapper around which enforces determinism by imposing synchronization over past runs. /// Suppose n s are generated up to this point. The sweeper will refrain from making a decision /// until the runs with indices in [0, n - relaxation) have all finished. A new batch of s will be /// generated based on the first n - relaxation runs. @@ -181,8 +181,8 @@ public sealed class Arguments // The ith element of _results corresponds to the result of the ith run. private readonly List _results; - // The indices of the runs with null IRunResult. We have to keep track of both the indices and - // the results of finished runs to determine if the synchronization barrier is satisfied. + // The indices of the runs with null IRunResult. We have to keep track of both the indices and + // the results of finished runs to determine if the synchronization barrier is satisfied. // Using _results alone won't do it as the result could be null. // Note that we only need to record those >= _minUnfinishedId. private readonly HashSet _nullRuns; diff --git a/src/Microsoft.ML.Sweeper/Microsoft.ML.Sweeper.csproj b/src/Microsoft.ML.Sweeper/Microsoft.ML.Sweeper.csproj index 7e022fd5ba..265809dd62 100644 --- a/src/Microsoft.ML.Sweeper/Microsoft.ML.Sweeper.csproj +++ b/src/Microsoft.ML.Sweeper/Microsoft.ML.Sweeper.csproj @@ -12,7 +12,6 @@ - diff --git a/src/Microsoft.ML.Sweeper/Parameters.cs b/src/Microsoft.ML.Sweeper/Parameters.cs index 4e09808cb3..dd46374732 100644 --- a/src/Microsoft.ML.Sweeper/Parameters.cs +++ b/src/Microsoft.ML.Sweeper/Parameters.cs @@ -556,7 +556,7 @@ public bool TryParseParameter(string paramValue, Type paramType, string paramNam } // Extract the minimum, and the maximum value of the list of suggested sweeps. - // Positive lookahead splitting at the '-' character. + // Positive lookahead splitting at the '-' character. // It is used for the Float and Long param types. // Example format: "0.02-0.1;steps:5". string[] minMaxRegex = Regex.Split(paramValue, "(?<=[^eE])-"); diff --git a/src/Microsoft.ML.Sweeper/SynthConfigRunner.cs b/src/Microsoft.ML.Sweeper/SynthConfigRunner.cs index eb08e88d16..bee7b8a60b 100644 --- a/src/Microsoft.ML.Sweeper/SynthConfigRunner.cs +++ b/src/Microsoft.ML.Sweeper/SynthConfigRunner.cs @@ -20,7 +20,7 @@ namespace Microsoft.ML.Runtime.Sweeper { /// - /// This class gives a simple way of running optimization experiments on synthetic functions, rather than on actual learning problems. + /// This class gives a simple way of running optimization experiments on synthetic functions, rather than on actual learning problems. /// It was initially created to test the sweeper methods on the Rastrigin function. /// public sealed class SynthConfigRunner : ExeConfigRunnerBase diff --git a/src/Microsoft.ML.Transforms/BootstrapSampleTransform.cs b/src/Microsoft.ML.Transforms/BootstrapSampleTransform.cs index b7f03deeec..91106bd445 100644 --- a/src/Microsoft.ML.Transforms/BootstrapSampleTransform.cs +++ b/src/Microsoft.ML.Transforms/BootstrapSampleTransform.cs @@ -25,20 +25,27 @@ namespace Microsoft.ML.Runtime.Data /// public sealed class BootstrapSampleTransform : FilterBase { + private static class Defaults + { + public const bool Complement = false; + public const bool ShuffleInput = true; + public const int PoolSize = 1000; + } + public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.AtMostOnce, HelpText = "Whether this is the out-of-bag sample, that is, all those rows that are not selected by the transform.", ShortName = "comp")] - public bool Complement; + public bool Complement = Defaults.Complement; [Argument(ArgumentType.AtMostOnce, HelpText = "The random seed. If unspecified random state will be instead derived from the environment.")] public uint? Seed; [Argument(ArgumentType.AtMostOnce, HelpText = "Whether we should attempt to shuffle the source data. By default on, but can be turned off for efficiency.", ShortName = "si")] - public bool ShuffleInput = true; + public bool ShuffleInput = Defaults.ShuffleInput; [Argument(ArgumentType.LastOccurenceWins, HelpText = "When shuffling the output, the number of output rows to keep in that pool. Note that shuffling of output is completely distinct from shuffling of input.", ShortName = "pool")] - public int PoolSize = 1000; + public int PoolSize = Defaults.PoolSize; } internal const string Summary = "Approximate bootstrap sampling."; @@ -76,6 +83,25 @@ public BootstrapSampleTransform(IHostEnvironment env, Arguments args, IDataView _poolSize = args.PoolSize; } + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Whether this is the out-of-bag sample, that is, all those rows that are not selected by the transform. + /// The random seed. If unspecified random state will be instead derived from the environment. + /// Whether we should attempt to shuffle the source data. By default on, but can be turned off for efficiency. + /// When shuffling the output, the number of output rows to keep in that pool. Note that shuffling of output is completely distinct from shuffling of input. + public BootstrapSampleTransform(IHostEnvironment env, + IDataView input, + bool complement = Defaults.Complement, + uint? seed = null, + bool shuffleInput = Defaults.ShuffleInput, + int poolSize = Defaults.PoolSize) + : this(env, new Arguments() { Complement = complement, Seed = seed, ShuffleInput = shuffleInput, PoolSize = poolSize }, input) + { + } + private BootstrapSampleTransform(IHost host, ModelLoadContext ctx, IDataView input) : base(host, input) { diff --git a/src/Microsoft.ML.Transforms/CategoricalHashTransform.cs b/src/Microsoft.ML.Transforms/CategoricalHashTransform.cs index a30b9a6c84..42d1f4d310 100644 --- a/src/Microsoft.ML.Transforms/CategoricalHashTransform.cs +++ b/src/Microsoft.ML.Transforms/CategoricalHashTransform.cs @@ -19,6 +19,7 @@ namespace Microsoft.ML.Runtime.Data { + /// public static class CategoricalHashTransform { public const int NumBitsLim = 31; // can't convert 31-bit hashes to indicator vectors, so max is 30 @@ -86,6 +87,15 @@ public bool TryUnparse(StringBuilder sb) } } + private static class Defaults + { + public const int HashBits = 16; + public const uint Seed = 314489979; + public const bool Ordered = true; + public const int InvertHash = 0; + public const CategoricalTransform.OutputKind OutputKind = CategoricalTransform.OutputKind.Bag; + } + /// /// This class is a merger of and /// with join option removed @@ -97,22 +107,22 @@ public sealed class Arguments : TransformInputBase [Argument(ArgumentType.AtMostOnce, HelpText = "Number of bits to hash into. Must be between 1 and 30, inclusive.", ShortName = "bits", SortOrder = 2)] - public int HashBits = 16; + public int HashBits = Defaults.HashBits; [Argument(ArgumentType.AtMostOnce, HelpText = "Hashing seed")] - public uint Seed = 314489979; + public uint Seed = Defaults.Seed; [Argument(ArgumentType.AtMostOnce, HelpText = "Whether the position of each term should be included in the hash", ShortName = "ord")] - public bool Ordered = true; + public bool Ordered = Defaults.Ordered; [Argument(ArgumentType.AtMostOnce, HelpText = "Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit.", ShortName = "ih")] - public int InvertHash; + public int InvertHash = Defaults.InvertHash; [Argument(ArgumentType.AtMostOnce, HelpText = "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", ShortName = "kind", SortOrder = 102)] - public CategoricalTransform.OutputKind OutputKind = CategoricalTransform.OutputKind.Bag; + public CategoricalTransform.OutputKind OutputKind = Defaults.OutputKind; } internal const string Summary = "Converts the categorical value into an indicator array by hashing the value and using the hash as an index in the " @@ -120,6 +130,38 @@ public sealed class Arguments : TransformInputBase public const string UserName = "Categorical Hash Transform"; + /// + /// A helper method to create for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// Number of bits to hash into. Must be between 1 and 30, inclusive. + /// Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit. + /// The type of output expected. + public static IDataTransform Create(IHostEnvironment env, + IDataView input, + string name, + string source = null, + int hashBits = Defaults.HashBits, + int invertHash = Defaults.InvertHash, + CategoricalTransform.OutputKind outputKind = Defaults.OutputKind) + { + var args = new Arguments() + { + Column = new[] { new Column(){ + Source = source ?? name, + Name = name + } + }, + HashBits = hashBits, + InvertHash = invertHash, + OutputKind = outputKind + }; + return Create(env, args, input); + } + public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataView input) { Contracts.CheckValue(env, nameof(env)); @@ -160,7 +202,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV } return CategoricalTransform.CreateTransformCore( - args.OutputKind,args.Column, + args.OutputKind, args.Column, args.Column.Select(col => col.OutputKind).ToList(), new HashTransform(h, hashArgs, input), h, diff --git a/src/Microsoft.ML.Transforms/CategoricalTransform.cs b/src/Microsoft.ML.Transforms/CategoricalTransform.cs index 621bbe6c1d..5c045e4a48 100644 --- a/src/Microsoft.ML.Transforms/CategoricalTransform.cs +++ b/src/Microsoft.ML.Transforms/CategoricalTransform.cs @@ -21,32 +21,32 @@ [assembly: LoadableClass(typeof(void), typeof(Categorical), null, typeof(SignatureEntryPointModule), "Categorical")] namespace Microsoft.ML.Runtime.Data { - /// - /// Categorical trans. - /// Each column can specify an output kind, Bag, Ind, or Key. - /// Notes: - /// * Each column builds/uses exactly one "vocabulary" (dictionary). - /// * The Key output kind produces integer values and KeyType columns. - /// * The Key value is the one-based index of the slot set in the Ind/Bag options. - /// * In the Key option, not found is assigned the value zero. - /// * In the Ind/Bag options, not found results in an all zero bit vector. - /// * Ind and Bag differ simply in how the bit-vectors generated from individual slots are aggregated: - /// for Ind they are concatenated and for Bag they are added. - /// * When the source column is a singleton, the Ind and Bag options are identical. - /// + /// public static class CategoricalTransform { public enum OutputKind : byte { + /// + /// Output is a bag (multi-set) vector + /// [TGUI(Label = "Output is a bag (multi-set) vector")] Bag = 1, + /// + /// Output is an indicator vector + /// [TGUI(Label = "Output is an indicator vector")] Ind = 2, + /// + /// Output is a key value + /// [TGUI(Label = "Output is a key value")] Key = 3, + /// + /// Output is binary encoded + /// [TGUI(Label = "Output is binary encoded")] Bin = 4, } @@ -96,6 +96,11 @@ public bool TryUnparse(StringBuilder sb) } } + private static class Defaults + { + public const OutputKind OutKind = OutputKind.Ind; + } + public sealed class Arguments : TermTransform.ArgumentsBase { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)] @@ -103,7 +108,7 @@ public sealed class Arguments : TermTransform.ArgumentsBase [Argument(ArgumentType.AtMostOnce, HelpText = "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", ShortName = "kind", SortOrder = 102)] - public OutputKind OutputKind = OutputKind.Ind; + public OutputKind OutputKind = Defaults.OutKind; public Arguments() { @@ -118,6 +123,28 @@ public Arguments() public const string UserName = "Categorical Transform"; + /// + /// A helper method to create for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// The type of output expected. + public static IDataTransform Create(IHostEnvironment env, IDataView input, string name, string source = null, OutputKind outputKind = Defaults.OutKind) + { + var args = new Arguments() + { + Column = new[] { new Column(){ + Source = source ?? name, + Name = name + } + }, + OutputKind = outputKind + }; + return Create(env, args, input); + } + public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataView input) { Contracts.CheckValue(env, nameof(env)); @@ -147,7 +174,7 @@ public static IDataTransform CreateTransformCore( Contracts.CheckValue(columnOutputKinds, nameof(columnOutputKinds)); Contracts.CheckParam(columns.Length == columnOutputKinds.Count, nameof(columns)); - using (var ch = h.Start("Create Tranform Core")) + using (var ch = h.Start("Create Transform Core")) { // Create the KeyToVectorTransform, if needed. List cols = new List(); @@ -216,7 +243,11 @@ public static IDataTransform CreateTransformCore( public static class Categorical { - [TlcModule.EntryPoint(Name = "Transforms.CategoricalOneHotVectorizer", Desc = "Encodes the categorical variable with one-hot encoding based on term dictionary", UserName = CategoricalTransform.UserName)] + [TlcModule.EntryPoint(Name = "Transforms.CategoricalOneHotVectorizer", + Desc = CategoricalTransform.Summary, + UserName = CategoricalTransform.UserName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput CatTransformDict(IHostEnvironment env, CategoricalTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); @@ -228,7 +259,11 @@ public static CommonOutputs.TransformOutput CatTransformDict(IHostEnvironment en return new CommonOutputs.TransformOutput { Model = new TransformModel(env, xf, input.Data), OutputData = xf }; } - [TlcModule.EntryPoint(Name = "Transforms.CategoricalHashOneHotVectorizer", Desc = "Encodes the categorical variable with hash-based encoding", UserName = CategoricalHashTransform.UserName)] + [TlcModule.EntryPoint(Name = "Transforms.CategoricalHashOneHotVectorizer", + Desc = CategoricalHashTransform.Summary, + UserName = CategoricalHashTransform.UserName , + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput CatTransformHash(IHostEnvironment env, CategoricalHashTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); @@ -240,7 +275,11 @@ public static CommonOutputs.TransformOutput CatTransformHash(IHostEnvironment en return new CommonOutputs.TransformOutput { Model = new TransformModel(env, xf, input.Data), OutputData = xf }; } - [TlcModule.EntryPoint(Name = "Transforms.TextToKeyConverter", Desc = TermTransform.Summary, UserName = TermTransform.UserName)] + [TlcModule.EntryPoint(Name = "Transforms.TextToKeyConverter", + Desc = TermTransform.Summary, + UserName = TermTransform.UserName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.TransformOutput TextToKey(IHostEnvironment env, TermTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); @@ -252,7 +291,10 @@ public static CommonOutputs.TransformOutput TextToKey(IHostEnvironment env, Term return new CommonOutputs.TransformOutput { Model = new TransformModel(env, xf, input.Data), OutputData = xf }; } - [TlcModule.EntryPoint(Name = "Transforms.KeyToTextConverter", Desc = "KeyToValueTransform utilizes KeyValues metadata to map key indices to the corresponding values in the KeyValues metadata.", UserName = KeyToValueTransform.UserName)] + [TlcModule.EntryPoint(Name = "Transforms.KeyToTextConverter", + Desc = "KeyToValueTransform utilizes KeyValues metadata to map key indices to the corresponding values in the KeyValues metadata.", + UserName = KeyToValueTransform.UserName, + XmlInclude = new[] { @"" })] public static CommonOutputs.TransformOutput KeyToText(IHostEnvironment env, KeyToValueTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.Transforms/CountFeatureSelection.cs b/src/Microsoft.ML.Transforms/CountFeatureSelection.cs index 72131902b5..67d14dc683 100644 --- a/src/Microsoft.ML.Transforms/CountFeatureSelection.cs +++ b/src/Microsoft.ML.Transforms/CountFeatureSelection.cs @@ -18,27 +18,46 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// Selects the slots for which the count of non-default values is greater than a threshold. - /// Uses a set of aggregators to count the number of non-default values for each slot and - /// instantiates a DropSlots transform to actually drop the slots. - /// + /// public static class CountFeatureSelectionTransform { public const string Summary = "Selects the slots for which the count of non-default values is greater than or equal to a threshold."; public const string UserName = "Count Feature Selection Transform"; + private static class Defaults + { + public const long Count = 1; + } + public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "Columns to use for feature selection", ShortName = "col", SortOrder = 1)] public string[] Column; [Argument(ArgumentType.Required, HelpText = "If the count of non-default values for a slot is greater than or equal to this threshold, the slot is preserved", ShortName = "c", SortOrder = 1)] - public long Count = 1; + public long Count = Defaults.Count; } internal static string RegistrationName = "CountFeatureSelectionTransform"; + /// + /// A helper method to create CountFeatureSelection transform for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// If the count of non-default values for a slot is greater than or equal to this threshold, the slot is preserved. + /// Columns to use for feature selection. + /// + public static IDataTransform Create(IHostEnvironment env, IDataView input, long count = Defaults.Count, params string[] columns) + { + var args = new Arguments() + { + Column = columns, + Count = count + }; + return Create(env, args, input); + } + /// /// Create method corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Transforms/EntryPoints/SelectFeatures.cs b/src/Microsoft.ML.Transforms/EntryPoints/SelectFeatures.cs index 583b7e00ad..5733f84b6b 100644 --- a/src/Microsoft.ML.Transforms/EntryPoints/SelectFeatures.cs +++ b/src/Microsoft.ML.Transforms/EntryPoints/SelectFeatures.cs @@ -11,7 +11,11 @@ namespace Microsoft.ML.Runtime.EntryPoints { public static class SelectFeatures { - [TlcModule.EntryPoint(Name = "Transforms.FeatureSelectorByCount", Desc = CountFeatureSelectionTransform.Summary, UserName = CountFeatureSelectionTransform.UserName)] + [TlcModule.EntryPoint(Name = "Transforms.FeatureSelectorByCount", + Desc = CountFeatureSelectionTransform.Summary, + UserName = CountFeatureSelectionTransform.UserName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput CountSelect(IHostEnvironment env, CountFeatureSelectionTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); @@ -23,7 +27,12 @@ public static CommonOutputs.TransformOutput CountSelect(IHostEnvironment env, Co return new CommonOutputs.TransformOutput { Model = new TransformModel(env, xf, input.Data), OutputData = xf }; } - [TlcModule.EntryPoint(Name = "Transforms.FeatureSelectorByMutualInformation", Desc = MutualInformationFeatureSelectionTransform.Summary, UserName = MutualInformationFeatureSelectionTransform.UserName, ShortName = MutualInformationFeatureSelectionTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.FeatureSelectorByMutualInformation", + Desc = MutualInformationFeatureSelectionTransform.Summary, + UserName = MutualInformationFeatureSelectionTransform.UserName, + ShortName = MutualInformationFeatureSelectionTransform.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput MutualInformationSelect(IHostEnvironment env, MutualInformationFeatureSelectionTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.Transforms/EntryPoints/TextAnalytics.cs b/src/Microsoft.ML.Transforms/EntryPoints/TextAnalytics.cs index 3ce5102fa1..543b997e6d 100644 --- a/src/Microsoft.ML.Transforms/EntryPoints/TextAnalytics.cs +++ b/src/Microsoft.ML.Transforms/EntryPoints/TextAnalytics.cs @@ -17,11 +17,16 @@ namespace Microsoft.ML.Runtime.Transforms /// public static class TextAnalytics { - [TlcModule.EntryPoint(Name = "Transforms.TextFeaturizer", Desc = Data.TextTransform.Summary, UserName = Data.TextTransform.UserName, ShortName = Data.TextTransform.LoaderSignature)] + [TlcModule.EntryPoint(Name = "Transforms.TextFeaturizer", + Desc = Data.TextTransform.Summary, + UserName = Data.TextTransform.UserName, + ShortName = Data.TextTransform.LoaderSignature, + XmlInclude = new[] { @"" , + @""})] public static CommonOutputs.TransformOutput TextTransform(IHostEnvironment env, TextTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "TextTransform", input); - var xf = Microsoft.ML.Runtime.Data.TextTransform.Create(h, input, input.Data); + var xf = Data.TextTransform.Create(h, input, input.Data); return new CommonOutputs.TransformOutput() { Model = new TransformModel(h, xf, input.Data), @@ -29,8 +34,12 @@ public static CommonOutputs.TransformOutput TextTransform(IHostEnvironment env, }; } - [TlcModule.EntryPoint(Name = "Transforms.WordTokenizer", Desc = Data.DelimitedTokenizeTransform.Summary, - UserName = Data.DelimitedTokenizeTransform.UserName, ShortName = Data.DelimitedTokenizeTransform.LoaderSignature)] + [TlcModule.EntryPoint(Name = "Transforms.WordTokenizer", + Desc = Data.DelimitedTokenizeTransform.Summary, + UserName = Data.DelimitedTokenizeTransform.UserName, + ShortName = Data.DelimitedTokenizeTransform.LoaderSignature, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput DelimitedTokenizeTransform(IHostEnvironment env, DelimitedTokenizeTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "DelimitedTokenizeTransform", input); @@ -42,7 +51,11 @@ public static CommonOutputs.TransformOutput DelimitedTokenizeTransform(IHostEnvi }; } - [TlcModule.EntryPoint(Name = "Transforms.NGramTranslator", Desc = Data.NgramTransform.Summary, UserName = Data.NgramTransform.UserName, ShortName = Data.NgramTransform.LoaderSignature)] + [TlcModule.EntryPoint(Name = "Transforms.NGramTranslator", + Desc = NgramTransform.Summary, + UserName = NgramTransform.UserName, + ShortName = NgramTransform.LoaderSignature, + XmlInclude = new[] { @"" })] public static CommonOutputs.TransformOutput NGramTransform(IHostEnvironment env, NgramTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "NGramTransform", input); @@ -54,7 +67,10 @@ public static CommonOutputs.TransformOutput NGramTransform(IHostEnvironment env, }; } - [TlcModule.EntryPoint(Name = "Transforms.Dictionarizer", Desc = Data.TermTransform.Summary, UserName = Data.TermTransform.UserName, ShortName = Data.TermTransform.LoaderSignature)] + [TlcModule.EntryPoint(Name = "Transforms.Dictionarizer", + Desc = Data.TermTransform.Summary, + UserName = Data.TermTransform.UserName, + ShortName = Data.TermTransform.LoaderSignature)] public static CommonOutputs.TransformOutput TermTransform(IHostEnvironment env, TermTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "TermTransform", input); @@ -66,7 +82,12 @@ public static CommonOutputs.TransformOutput TermTransform(IHostEnvironment env, }; } - [TlcModule.EntryPoint(Name = "Transforms.SentimentAnalyzer", Desc = "Uses a pretrained sentiment model to score input strings", UserName = SentimentAnalyzingTransform.UserName, ShortName = SentimentAnalyzingTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.SentimentAnalyzer", + Desc = "Uses a pretrained sentiment model to score input strings", + UserName = SentimentAnalyzingTransform.UserName, + ShortName = SentimentAnalyzingTransform.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput AnalyzeSentiment(IHostEnvironment env, SentimentAnalyzingTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "SentimentAnalyzer", input); @@ -78,7 +99,11 @@ public static CommonOutputs.TransformOutput AnalyzeSentiment(IHostEnvironment en }; } - [TlcModule.EntryPoint(Name = "Transforms.CharacterTokenizer", Desc = CharTokenizeTransform.Summary, UserName = CharTokenizeTransform.UserName, ShortName = CharTokenizeTransform.LoaderSignature)] + [TlcModule.EntryPoint(Name = "Transforms.CharacterTokenizer", + Desc = CharTokenizeTransform.Summary, + UserName = CharTokenizeTransform.UserName, + ShortName = CharTokenizeTransform.LoaderSignature, + XmlInclude = new[] { @"" })] public static CommonOutputs.TransformOutput CharTokenize(IHostEnvironment env, CharTokenizeTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); @@ -92,5 +117,25 @@ public static CommonOutputs.TransformOutput CharTokenize(IHostEnvironment env, C OutputData = view }; } + + [TlcModule.EntryPoint(Name = "Transforms.LightLda", + Desc = LdaTransform.Summary, + UserName = LdaTransform.UserName, + ShortName = LdaTransform.ShortName, + XmlInclude = new[] { @"", + @"" })] + public static CommonOutputs.TransformOutput LightLda(IHostEnvironment env, LdaTransform.Arguments input) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckValue(input, nameof(input)); + + var h = EntryPointUtils.CheckArgsAndCreateHost(env, "LightLda", input); + var view = new LdaTransform(h, input, input.Data); + return new CommonOutputs.TransformOutput() + { + Model = new TransformModel(h, view, input.Data), + OutputData = view + }; + } } } diff --git a/src/Microsoft.ML.Transforms/GcnTransform.cs b/src/Microsoft.ML.Transforms/GcnTransform.cs index 2fee0e8ef3..6edfdfb4a2 100644 --- a/src/Microsoft.ML.Transforms/GcnTransform.cs +++ b/src/Microsoft.ML.Transforms/GcnTransform.cs @@ -38,7 +38,7 @@ namespace Microsoft.ML.Runtime.Data /// Performs the following operation on a vector X: /// Y = (s * X - M) / D, where s is a scale, M is mean and D is either L2 norm or standard deviation. /// Usage examples and Matlab code: - /// + /// http://www.cs.stanford.edu/~acoates/papers/coatesleeng_aistats_2011.pdf. /// public sealed class LpNormNormalizerTransform : OneToOneTransformBase { @@ -53,16 +53,25 @@ public enum NormalizerKind : byte LInf = 3 } + private static class Defaults + { + public const NormalizerKind NormKind = NormalizerKind.L2Norm; + public const bool LpSubMean = false; + public const bool GcnSubMean = true; + public const bool UseStdDev = false; + public const Float Scale = 1; + } + public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)] public Column[] Column; [Argument(ArgumentType.AtMostOnce, HelpText = "The norm to use to normalize each sample", ShortName = "norm", SortOrder = 1)] - public NormalizerKind NormKind = NormalizerKind.L2Norm; + public NormalizerKind NormKind = Defaults.NormKind; [Argument(ArgumentType.AtMostOnce, HelpText = "Subtract mean from each value before normalizing", SortOrder = 2)] - public bool SubMean = false; + public bool SubMean = Defaults.LpSubMean; } public sealed class GcnArguments : TransformInputBase @@ -71,13 +80,13 @@ public sealed class GcnArguments : TransformInputBase public GcnColumn[] Column; [Argument(ArgumentType.AtMostOnce, HelpText = "Subtract mean from each value before normalizing", SortOrder = 1)] - public bool SubMean = true; + public bool SubMean = Defaults.GcnSubMean; [Argument(ArgumentType.AtMostOnce, HelpText = "Normalize by standard deviation rather than L2 norm", ShortName = "useStd")] - public bool UseStdDev = false; + public bool UseStdDev = Defaults.UseStdDev; [Argument(ArgumentType.AtMostOnce, HelpText = "Scale features by this value")] - public Float Scale = 1; + public Float Scale = Defaults.Scale; } public abstract class ColumnBase : OneToOneColumn @@ -237,6 +246,38 @@ private static VersionInfo GetVersionInfo() private readonly ColInfoEx[] _exes; + /// + /// A helper method to create GlobalContrastNormalizer transform for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// Subtract mean from each value before normalizing. + /// Normalize by standard deviation rather than L2 norm. + /// Scale features by this value. + public static IDataTransform CreateGlobalContrastNormalizer(IHostEnvironment env, + IDataView input, + string name, + string source = null, + bool subMean = Defaults.GcnSubMean, + bool useStdDev = Defaults.UseStdDev, + Float scale = Defaults.Scale) + { + var args = new GcnArguments() + { + Column = new[] { new GcnColumn(){ + Source = source ?? name, + Name = name + } + }, + SubMean = subMean, + UseStdDev = useStdDev, + Scale = scale + }; + return new LpNormNormalizerTransform(env, args, input); + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -263,9 +304,38 @@ public LpNormNormalizerTransform(IHostEnvironment env, GcnArguments args, IDataV SetMetadata(); } + /// + /// A helper method to create LpNormNormalizer transform for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// /// The norm to use to normalize each sample. + /// Subtract mean from each value before normalizing. + public static IDataTransform CreateLpNormNormalizer(IHostEnvironment env, + IDataView input, + string name, + string source = null, + NormalizerKind normKind = Defaults.NormKind, + bool subMean = Defaults.LpSubMean) + { + var args = new Arguments() + { + Column = new[] { new Column(){ + Source = source ?? name, + Name = name + } + }, + SubMean = subMean, + NormKind = normKind + }; + return new LpNormNormalizerTransform(env, args, input); + } + public LpNormNormalizerTransform(IHostEnvironment env, Arguments args, IDataView input) - : base(env, RegistrationName, env.CheckRef(args, nameof(args)).Column, - input, TestIsFloatVector) + : base(env, RegistrationName, env.CheckRef(args, nameof(args)).Column, + input, TestIsFloatVector) { Host.AssertNonEmpty(Infos); Host.Assert(Infos.Length == Utils.Size(args.Column)); @@ -369,14 +439,61 @@ protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, ou { switch (ex.NormKind) { + case NormalizerKind.StdDev: + del = + (ref VBuffer dst) => + { + getSrc(ref src); + Float mean = Mean(src.Values, src.Count, src.Length); + Float divisor = StdDev(src.Values, src.Count, src.Length, mean); + FillValues(Host, ref src, ref dst, divisor, scale, mean); + }; + return del; + case NormalizerKind.L2Norm: + del = + (ref VBuffer dst) => + { + getSrc(ref src); + Float mean = Mean(src.Values, src.Count, src.Length); + Float divisor = L2Norm(src.Values, src.Count, mean); + FillValues(Host, ref src, ref dst, divisor, scale, mean); + }; + return del; + case NormalizerKind.L1Norm: + del = + (ref VBuffer dst) => + { + getSrc(ref src); + Float mean = Mean(src.Values, src.Count, src.Length); + Float divisor = L1Norm(src.Values, src.Count, mean); + FillValues(Host, ref src, ref dst, divisor, scale, mean); + }; + return del; + case NormalizerKind.LInf: + del = + (ref VBuffer dst) => + { + getSrc(ref src); + Float mean = Mean(src.Values, src.Count, src.Length); + Float divisor = LInfNorm(src.Values, src.Count, mean); + FillValues(Host, ref src, ref dst, divisor, scale, mean); + }; + return del; + default: + Host.Assert(false, "Unsupported normalizer type"); + goto case NormalizerKind.L2Norm; + } + } + + switch (ex.NormKind) + { case NormalizerKind.StdDev: del = (ref VBuffer dst) => { getSrc(ref src); - Float mean = Mean(src.Values, src.Count, src.Length); - Float divisor = StdDev(src.Values, src.Count, src.Length, mean); - FillValues(Host, ref src, ref dst, divisor, scale, mean); + Float divisor = StdDev(src.Values, src.Count, src.Length); + FillValues(Host, ref src, ref dst, divisor, scale); }; return del; case NormalizerKind.L2Norm: @@ -384,9 +501,8 @@ protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, ou (ref VBuffer dst) => { getSrc(ref src); - Float mean = Mean(src.Values, src.Count, src.Length); - Float divisor = L2Norm(src.Values, src.Count, mean); - FillValues(Host, ref src, ref dst, divisor, scale, mean); + Float divisor = L2Norm(src.Values, src.Count); + FillValues(Host, ref src, ref dst, divisor, scale); }; return del; case NormalizerKind.L1Norm: @@ -394,9 +510,8 @@ protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, ou (ref VBuffer dst) => { getSrc(ref src); - Float mean = Mean(src.Values, src.Count, src.Length); - Float divisor = L1Norm(src.Values, src.Count, mean); - FillValues(Host, ref src, ref dst, divisor, scale, mean); + Float divisor = L1Norm(src.Values, src.Count); + FillValues(Host, ref src, ref dst, divisor, scale); }; return del; case NormalizerKind.LInf: @@ -404,58 +519,13 @@ protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, ou (ref VBuffer dst) => { getSrc(ref src); - Float mean = Mean(src.Values, src.Count, src.Length); - Float divisor = LInfNorm(src.Values, src.Count, mean); - FillValues(Host, ref src, ref dst, divisor, scale, mean); + Float divisor = LInfNorm(src.Values, src.Count); + FillValues(Host, ref src, ref dst, divisor, scale); }; return del; default: Host.Assert(false, "Unsupported normalizer type"); goto case NormalizerKind.L2Norm; - } - } - - switch (ex.NormKind) - { - case NormalizerKind.StdDev: - del = - (ref VBuffer dst) => - { - getSrc(ref src); - Float divisor = StdDev(src.Values, src.Count, src.Length); - FillValues(Host, ref src, ref dst, divisor, scale); - }; - return del; - case NormalizerKind.L2Norm: - del = - (ref VBuffer dst) => - { - getSrc(ref src); - Float divisor = L2Norm(src.Values, src.Count); - FillValues(Host, ref src, ref dst, divisor, scale); - }; - return del; - case NormalizerKind.L1Norm: - del = - (ref VBuffer dst) => - { - getSrc(ref src); - Float divisor = L1Norm(src.Values, src.Count); - FillValues(Host, ref src, ref dst, divisor, scale); - }; - return del; - case NormalizerKind.LInf: - del = - (ref VBuffer dst) => - { - getSrc(ref src); - Float divisor = LInfNorm(src.Values, src.Count); - FillValues(Host, ref src, ref dst, divisor, scale); - }; - return del; - default: - Host.Assert(false, "Unsupported normalizer type"); - goto case NormalizerKind.L2Norm; } } @@ -596,7 +666,11 @@ private static Float Mean(Float[] src, int count, int length) public static class LpNormalization { - [TlcModule.EntryPoint(Name = "Transforms.LpNormalizer", Desc = LpNormNormalizerTransform.Summary, UserName = LpNormNormalizerTransform.UserNameLP, ShortName = LpNormNormalizerTransform.ShortNameLP)] + [TlcModule.EntryPoint(Name = "Transforms.LpNormalizer", + Desc = LpNormNormalizerTransform.Summary, + UserName = LpNormNormalizerTransform.UserNameLP, + ShortName = LpNormNormalizerTransform.ShortNameLP, + XmlInclude = new[] { @"" })] public static CommonOutputs.TransformOutput Normalize(IHostEnvironment env, LpNormNormalizerTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "LpNormalize", input); @@ -608,7 +682,11 @@ public static CommonOutputs.TransformOutput Normalize(IHostEnvironment env, LpNo }; } - [TlcModule.EntryPoint(Name = "Transforms.GlobalContrastNormalizer", Desc = LpNormNormalizerTransform.GcnSummary, UserName = LpNormNormalizerTransform.UserNameGn, ShortName = LpNormNormalizerTransform.ShortNameGn)] + [TlcModule.EntryPoint(Name = "Transforms.GlobalContrastNormalizer", + Desc = LpNormNormalizerTransform.GcnSummary, + UserName = LpNormNormalizerTransform.UserNameGn, + ShortName = LpNormNormalizerTransform.ShortNameGn, + XmlInclude = new[] { @"" })] public static CommonOutputs.TransformOutput GcNormalize(IHostEnvironment env, LpNormNormalizerTransform.GcnArguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "GcNormalize", input); diff --git a/src/Microsoft.ML.Transforms/GroupTransform.cs b/src/Microsoft.ML.Transforms/GroupTransform.cs index 1d5b823278..8e07b11e06 100644 --- a/src/Microsoft.ML.Transforms/GroupTransform.cs +++ b/src/Microsoft.ML.Transforms/GroupTransform.cs @@ -28,14 +28,14 @@ namespace Microsoft.ML.Runtime.Data /// SELECT GroupKey1, GroupKey2, ... GroupKeyK, LIST(Value1), LIST(Value2), ... LIST(ValueN) /// FROM Data /// GROUP BY GroupKey1, GroupKey2, ... GroupKeyK. - /// + /// /// It assumes that the group keys are contiguous (if a new group key sequence is encountered, the group is over). /// The GroupKeyN and ValueN columns can be of any primitive types. The code requires that every raw type T of the group key column /// is an , which is currently true for all existing primitive types. /// The produced ValueN columns will be variable-length vectors of the original value column types. - /// + /// /// The order of ValueN entries in the lists is preserved. - /// + /// /// Example: /// User Item /// Pete Book @@ -43,12 +43,12 @@ namespace Microsoft.ML.Runtime.Data /// Tom Kitten /// Pete Chair /// Pete Cup - /// + /// /// Result: /// User Item /// Pete [Book] /// Tom [Table, Kitten] - /// Pete [Chair, Cup] + /// Pete [Chair, Cup] /// public sealed class GroupTransform : TransformBase { @@ -68,13 +68,13 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } - // REVIEW: maybe we want to have an option to keep all non-group scalar columns, as opposed to + // REVIEW: maybe we want to have an option to keep all non-group scalar columns, as opposed to // explicitly listing the ones to keep. // REVIEW: group keys and keep columns can possibly be vectors, not implemented now. // REVIEW: it might be feasible to have columns that are constant throughout a group, without having to list them - // as group keys. + // as group keys. public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.Multiple, HelpText = "Columns to group by", ShortName = "g", SortOrder = 1, @@ -88,6 +88,18 @@ public sealed class Arguments : TransformInputBase private readonly GroupSchema _schema; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Columns to group by + /// Columns to group together + public GroupTransform(IHostEnvironment env, IDataView input, string groupKey, params string[] columns) + : this(env, new Arguments() { GroupKey = new[] { groupKey }, Column = columns }, input) + { + } + public GroupTransform(IHostEnvironment env, Arguments args, IDataView input) : base(env, RegistrationName, input) { @@ -163,10 +175,10 @@ public override IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolid /// /// For group columns, the schema information is intact. - /// - /// For keep columns, the type is Vector of original type and variable length. + /// + /// For keep columns, the type is Vector of original type and variable length. /// The only metadata preserved is the KeyNames and IsNormalized. - /// + /// /// All other columns are dropped. /// private sealed class GroupSchema : ISchema @@ -395,11 +407,11 @@ public void GetMetadata(string kind, int col, ref TValue value) } /// - /// This cursor will create two cursors on the input data view: + /// This cursor will create two cursors on the input data view: /// - The leading cursor will activate all the group columns, and will advance until it hits the end of the contiguous group. - /// - The trailing cursor will activate all the requested columns, and will go through the group - /// (as identified by the leading cursor), and aggregate the keep columns. - /// + /// - The trailing cursor will activate all the requested columns, and will go through the group + /// (as identified by the leading cursor), and aggregate the keep columns. + /// /// The getters are as follows: /// - The group column getters are taken directly from the trailing cursor. /// - The keep column getters are provided by the aggregators. @@ -443,7 +455,7 @@ public GroupKeyColumnChecker(IRow row, int col) } // REVIEW: potentially, there could be other aggregators. - // REVIEW: Currently, it always produces dense buffers. The anticipated use cases don't include many + // REVIEW: Currently, it always produces dense buffers. The anticipated use cases don't include many // default values at the moment. /// /// This class handles the aggregation of one 'keep' column into a vector. It wraps around an 's @@ -652,7 +664,11 @@ public ValueGetter GetGetter(int col) public static partial class GroupingOperations { - [TlcModule.EntryPoint(Name = "Transforms.CombinerByContiguousGroupId", Desc = GroupTransform.Summary, UserName = GroupTransform.UserName, ShortName = GroupTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.CombinerByContiguousGroupId", + Desc = GroupTransform.Summary, + UserName = GroupTransform.UserName, + ShortName = GroupTransform.ShortName, + XmlInclude = new[] { @"" })] public static CommonOutputs.TransformOutput Group(IHostEnvironment env, GroupTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.Transforms/HashJoinTransform.cs b/src/Microsoft.ML.Transforms/HashJoinTransform.cs index 098564bef3..4f72760c99 100644 --- a/src/Microsoft.ML.Transforms/HashJoinTransform.cs +++ b/src/Microsoft.ML.Transforms/HashJoinTransform.cs @@ -37,6 +37,14 @@ public sealed class HashJoinTransform : OneToOneTransformBase public const int NumBitsMin = 1; public const int NumBitsLim = 32; + private static class Defaults + { + public const bool Join = true; + public const int HashBits = NumBitsLim - 1; + public const uint Seed = 314489979; + public const bool Ordered = true; + } + public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:src)", @@ -45,17 +53,17 @@ public sealed class Arguments : TransformInputBase public Column[] Column; [Argument(ArgumentType.AtMostOnce, HelpText = "Whether the values need to be combined for a single hash")] - public bool Join = true; + public bool Join = Defaults.Join; [Argument(ArgumentType.AtMostOnce, HelpText = "Number of bits to hash into. Must be between 1 and 31, inclusive.", ShortName = "bits", SortOrder = 2)] - public int HashBits = NumBitsLim - 1; + public int HashBits = Defaults.HashBits; [Argument(ArgumentType.AtMostOnce, HelpText = "Hashing seed")] - public uint Seed = 314489979; + public uint Seed = Defaults.Seed; [Argument(ArgumentType.AtMostOnce, HelpText = "Whether the position of each term should be included in the hash", ShortName = "ord")] - public bool Ordered = true; + public bool Ordered = Defaults.Ordered; } public sealed class Column : OneToOneColumn @@ -99,7 +107,7 @@ public bool TryUnparse(StringBuilder sb) public sealed class ColumnInfoEx { - // Either VBuffer> or a single Key. + // Either VBuffer> or a single Key. // Note that if CustomSlotMap contains only one array, the output type of the transform will a single Key. // This corresponds to the join=+ case, although now it's possible to omit certain slots entirely. // If # of hash bits is less than 31, the key type will have a positive count. @@ -166,6 +174,26 @@ private static VersionInfo GetVersionInfo() private readonly ColumnInfoEx[] _exes; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// Whether the values need to be combined for a single hash. + /// Number of bits to hash into. Must be between 1 and 31, inclusive. + public HashJoinTransform(IHostEnvironment env, + IDataView input, + string name, + string source = null, + bool join = Defaults.Join, + int hashBits = Defaults.HashBits) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, Join = join, HashBits = hashBits }, input) + { + } + + /// public HashJoinTransform(IHostEnvironment env, Arguments args, IDataView input) : base(env, RegistrationName, Contracts.CheckRef(args, nameof(args)).Column, input, TestColumnType) { @@ -674,7 +702,12 @@ protected override ColumnType GetColumnTypeCore(int iinfo) public static class HashJoin { - [TlcModule.EntryPoint(Name = "Transforms.HashConverter", Desc = HashJoinTransform.Summary, UserName = HashJoinTransform.UserName, ShortName = HashJoinTransform.RegistrationName)] + [TlcModule.EntryPoint(Name = "Transforms.HashConverter", + Desc = HashJoinTransform.Summary, + UserName = HashJoinTransform.UserName, + ShortName = HashJoinTransform.RegistrationName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput Apply(IHostEnvironment env, HashJoinTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.Transforms/KeyToBinaryVectorTransform.cs b/src/Microsoft.ML.Transforms/KeyToBinaryVectorTransform.cs index 5983efb244..88a4228941 100644 --- a/src/Microsoft.ML.Transforms/KeyToBinaryVectorTransform.cs +++ b/src/Microsoft.ML.Transforms/KeyToBinaryVectorTransform.cs @@ -46,7 +46,7 @@ private static VersionInfo GetVersionInfo() // These arrays are parallel to Infos. // * _concat is whether, given the current input, there are multiple output instance vectors - // to concatenate. + // to concatenate. // * _types contains the output column types. private readonly bool[] _concat; @@ -54,6 +54,18 @@ private static VersionInfo GetVersionInfo() private readonly VectorType[] _types; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + public KeyToBinaryVectorTransform(IHostEnvironment env, IDataView input, string name, string source = null) + : this(env, new Arguments() { Column = new[] { new KeyToVectorTransform.Column() { Source = source ?? name, Name = name } } }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Transforms/LearnerFeatureSelection.cs b/src/Microsoft.ML.Transforms/LearnerFeatureSelection.cs index 8448a406db..c2b2bead79 100644 --- a/src/Microsoft.ML.Transforms/LearnerFeatureSelection.cs +++ b/src/Microsoft.ML.Transforms/LearnerFeatureSelection.cs @@ -33,8 +33,8 @@ public sealed class Arguments public int? NumSlotsToKeep; [Argument(ArgumentType.Multiple, HelpText = "Filter", ShortName = "f", SortOrder = 1)] - public SubComponent>, SignatureFeatureScorerTrainer> Filter = - new SubComponent>, SignatureFeatureScorerTrainer>("SDCA"); + public SubComponent>, SignatureFeatureScorerTrainer> Filter = + new SubComponent>, SignatureFeatureScorerTrainer>("SDCA"); [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for features", ShortName = "feat,col", SortOrder = 3, Purpose = SpecialPurpose.ColumnName)] public string FeatureColumn = DefaultColumnNames.Features; @@ -299,7 +299,7 @@ private static void TrainCore(IHost host, IDataView input, Arguments args, ref V ch.Trace("Binding columns"); var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, args.CustomColumn); - var data = TrainUtils.CreateExamples(view, label, feature, group, weight, name, customCols); + var data = new RoleMappedData(view, label, feature, group, weight, name, customCols); var predictor = TrainUtils.Train(host, ch, data, trainer, args.Filter.Kind, null, null, 0, args.CacheData); diff --git a/src/Microsoft.ML.Transforms/LoadTransform.cs b/src/Microsoft.ML.Transforms/LoadTransform.cs index 83ff43274d..28eb3cb2f3 100644 --- a/src/Microsoft.ML.Transforms/LoadTransform.cs +++ b/src/Microsoft.ML.Transforms/LoadTransform.cs @@ -17,14 +17,14 @@ namespace Microsoft.ML.Runtime.Data { /// - /// Load specific transforms from the specified model file. Allows one to 'cherry pick' transforms from + /// Load specific transforms from the specified model file. Allows one to 'cherry pick' transforms from /// a serialized chain, or to apply a pre-trained transform to a different (but still compatible) data view. /// public static class LoadTransform { public class Arguments { - // REVIEW: make it not required, and make commands fill in the missing model file with the default + // REVIEW: make it not required, and make commands fill in the missing model file with the default // input model file. This requires some hacking in DataDiagnosticCommand. [Argument(ArgumentType.Required, HelpText = "Model file to load the transforms from", ShortName = "in", SortOrder = 1, IsInputFileName = true)] @@ -39,6 +39,25 @@ public class Arguments internal const string Summary = "Loads specified transforms from the model file and applies them to current data."; + /// + /// A helper method to create for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Model file to load the transforms from. + /// The tags (comma-separated) to be loaded (or omitted, if complement is true). + /// Whether to load all transforms except those marked by tags. + public static IDataTransform Create(IHostEnvironment env, IDataView input, string modelFile, string[] tag, bool complement = false) + { + var args = new Arguments() + { + ModelFile = modelFile, + Tag = tag, + Complement = complement + }; + return Create(env, args, input); + } + public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataView input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs b/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs index d8c20f03ca..0af833a046 100644 --- a/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs +++ b/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs @@ -21,10 +21,7 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// Selects the top k slots ordered by their mutual information with the label column. - /// Instantiates a DropSlots transform to actually drop the slots. - /// + /// public static class MutualInformationFeatureSelectionTransform { public const string Summary = @@ -33,6 +30,13 @@ public static class MutualInformationFeatureSelectionTransform public const string UserName = "Mutual Information Feature Selection Transform"; public const string ShortName = "MIFeatureSelection"; + private static class Defaults + { + public const string LabelColumn = DefaultColumnNames.Label; + public const int SlotsInOutput = 1000; + public const int NumBins = 256; + } + public sealed class Arguments : TransformInputBase { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "Columns to use for feature selection", ShortName = "col", @@ -41,19 +45,45 @@ public sealed class Arguments : TransformInputBase [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for labels", ShortName = "lab", SortOrder = 4, Purpose = SpecialPurpose.ColumnName)] - public string LabelColumn = DefaultColumnNames.Label; + public string LabelColumn = Defaults.LabelColumn; [Argument(ArgumentType.AtMostOnce, HelpText = "The maximum number of slots to preserve in output", ShortName = "topk,numSlotsToKeep", SortOrder = 1)] - public int SlotsInOutput = 1000; + public int SlotsInOutput = Defaults.SlotsInOutput; [Argument(ArgumentType.AtMostOnce, HelpText = "Max number of bins for R4/R8 columns, power of 2 recommended", ShortName = "bins")] - public int NumBins = 256; + public int NumBins = Defaults.NumBins; } internal static string RegistrationName = "MutualInformationFeatureSelectionTransform"; + /// + /// A helper method to create for selecting the top k slots ordered by their mutual information. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Column to use for labels. + /// The maximum number of slots to preserve in output. + /// Max number of bins for R4/R8 columns, power of 2 recommended. + /// Columns to use for feature selection. + public static IDataTransform Create(IHostEnvironment env, + IDataView input, + string labelColumn = Defaults.LabelColumn, + int slotsInOutput = Defaults.SlotsInOutput, + int numBins = Defaults.NumBins, + params string[] columns) + { + var args = new Arguments() + { + Column = columns, + LabelColumn = labelColumn, + SlotsInOutput = slotsInOutput, + NumBins = numBins + }; + return Create(env, args, input); + } + /// /// Create method corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Transforms/NADropTransform.cs b/src/Microsoft.ML.Transforms/NADropTransform.cs index 347e889a5b..80e88f3ae3 100644 --- a/src/Microsoft.ML.Transforms/NADropTransform.cs +++ b/src/Microsoft.ML.Transforms/NADropTransform.cs @@ -21,9 +21,7 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// Transform to drop NAs from vector columns. - /// + /// public sealed class NADropTransform : OneToOneTransformBase { public sealed class Arguments : TransformInputBase @@ -69,6 +67,18 @@ private static VersionInfo GetVersionInfo() // The isNA delegates, parallel to Infos. private readonly Delegate[] _isNAs; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + public NADropTransform(IHostEnvironment env, IDataView input, string name, string source = null) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } } }, input) + { + } + public NADropTransform(IHostEnvironment env, Arguments args, IDataView input) : base(Contracts.CheckRef(env, nameof(env)), RegistrationName, env.CheckRef(args, nameof(args)).Column, input, TestType) { diff --git a/src/Microsoft.ML.Transforms/NAHandleTransform.cs b/src/Microsoft.ML.Transforms/NAHandleTransform.cs index 1b82fe3e1e..9e7390948b 100644 --- a/src/Microsoft.ML.Transforms/NAHandleTransform.cs +++ b/src/Microsoft.ML.Transforms/NAHandleTransform.cs @@ -17,29 +17,30 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// This transform handles missing values in the input columns. For each input column, it creates an output column - /// where the missing values are replaced by one of these specified values: - /// - The default value of the appropriate type. - /// - The mean value of the appropriate type. - /// - The max value of the appropriate type. - /// - The min value of the appropriate type. - /// (The last three work only for numeric/time span/ DateTime columns). - /// The output column can also optionally include an indicator vector for which slots were missing in the input column - /// (this can be done only when the indicator vector type can be converted to the input column type, i.e. only for numeric columns). - /// - /// When computing the mean/max/min value, there is also an option to compute it over the whole column instead of per slot. This option - /// has a default value of true for variable length vectors, and false for known length vectors. It can be changed to true for known - /// length vectors, but it results in an error if changed to false for variable length vectors. - /// + /// public static class NAHandleTransform { public enum ReplacementKind { + /// + /// Replace with the default value of the column based on it's type. For example, 'zero' for numeric and 'empty' for string/text columns. + /// [EnumValueDisplay("Zero/empty")] DefaultValue, + + /// + /// Replace with the mean value of the column. Supports only numeric/time span/ DateTime columns. + /// Mean, + + /// + /// Replace with the minimum value of the column. Supports only numeric/time span/ DateTime columns. + /// Minimum, + + /// + /// Replace with the maximum value of the column. Supports only numeric/time span/ DateTime columns. + /// Maximum, [HideEnumValue] @@ -105,6 +106,27 @@ public bool TryUnparse(StringBuilder sb) internal const string FriendlyName = "NA Handle Transform"; internal const string ShortName = "NAHandle"; + /// + /// A helper method to create for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// The replacement method to utilize. + public static IDataTransform Create(IHostEnvironment env, IDataView input, string name, string source = null, ReplacementKind replaceWith = ReplacementKind.DefaultValue) + { + var args = new Arguments() + { + Column = new[] + { + new Column() { Source = source ?? name, Name = name } + }, + ReplaceWith = replaceWith + }; + return Create(env, args, input); + } + public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataView input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.Transforms/NAHandling.cs b/src/Microsoft.ML.Transforms/NAHandling.cs index 2ed6830782..0870d16461 100644 --- a/src/Microsoft.ML.Transforms/NAHandling.cs +++ b/src/Microsoft.ML.Transforms/NAHandling.cs @@ -11,7 +11,12 @@ namespace Microsoft.ML.Runtime.Data { public static class NAHandling { - [TlcModule.EntryPoint(Name = "Transforms.MissingValuesDropper", Desc = NADropTransform.Summary, UserName = NADropTransform.FriendlyName, ShortName = NADropTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.MissingValuesDropper", + Desc = NADropTransform.Summary, + UserName = NADropTransform.FriendlyName, + ShortName = NADropTransform.ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.TransformOutput Drop(IHostEnvironment env, NADropTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, NADropTransform.ShortName, input); @@ -23,7 +28,12 @@ public static CommonOutputs.TransformOutput Drop(IHostEnvironment env, NADropTra }; } - [TlcModule.EntryPoint(Name = "Transforms.MissingValuesRowDropper", Desc = NAFilter.Summary, UserName = NAFilter.FriendlyName, ShortName = NAFilter.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.MissingValuesRowDropper", + Desc = NAFilter.Summary, + UserName = NAFilter.FriendlyName, + ShortName = NAFilter.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput Filter(IHostEnvironment env, NAFilter.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, NAFilter.ShortName, input); @@ -35,7 +45,12 @@ public static CommonOutputs.TransformOutput Filter(IHostEnvironment env, NAFilte }; } - [TlcModule.EntryPoint(Name = "Transforms.MissingValueHandler", Desc = NAHandleTransform.Summary, UserName = NAHandleTransform.FriendlyName, ShortName = NAHandleTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.MissingValueHandler", + Desc = NAHandleTransform.Summary, + UserName = NAHandleTransform.FriendlyName, + ShortName = NAHandleTransform.ShortName, + XmlInclude = new[] { @"", + @"" })] public static CommonOutputs.TransformOutput Handle(IHostEnvironment env, NAHandleTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "NAHandle", input); @@ -47,7 +62,12 @@ public static CommonOutputs.TransformOutput Handle(IHostEnvironment env, NAHandl }; } - [TlcModule.EntryPoint(Name = "Transforms.MissingValueIndicator", Desc = NAIndicatorTransform.Summary, UserName = NAIndicatorTransform.FriendlyName, ShortName = NAIndicatorTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.MissingValueIndicator", + Desc = NAIndicatorTransform.Summary, + UserName = NAIndicatorTransform.FriendlyName, + ShortName = NAIndicatorTransform.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput Indicator(IHostEnvironment env, NAIndicatorTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "NAIndicator", input); @@ -59,7 +79,12 @@ public static CommonOutputs.TransformOutput Indicator(IHostEnvironment env, NAIn }; } - [TlcModule.EntryPoint(Name = "Transforms.MissingValueSubstitutor", Desc = NAReplaceTransform.Summary, UserName = NAReplaceTransform.FriendlyName, ShortName = NAReplaceTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.MissingValueSubstitutor", + Desc = NAReplaceTransform.Summary, + UserName = NAReplaceTransform.FriendlyName, + ShortName = NAReplaceTransform.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput Replace(IHostEnvironment env, NAReplaceTransform.Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "NAReplace", input); diff --git a/src/Microsoft.ML.Transforms/NAIndicatorTransform.cs b/src/Microsoft.ML.Transforms/NAIndicatorTransform.cs index 38ecc2c817..7607e19c61 100644 --- a/src/Microsoft.ML.Transforms/NAIndicatorTransform.cs +++ b/src/Microsoft.ML.Transforms/NAIndicatorTransform.cs @@ -21,10 +21,7 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// This transform can transform either scalars or vectors (both fixed and variable size), - /// creating output columns that indicate corresponding NA values. - /// + /// public sealed class NAIndicatorTransform : OneToOneTransformBase { public sealed class Column : OneToOneColumn @@ -85,6 +82,18 @@ private static string TestType(ColumnType type) // The output column types, parallel to Infos. private readonly ColumnType[] _types; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + public NAIndicatorTransform(IHostEnvironment env, IDataView input, string name, string source = null) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } } }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Transforms/NAReplaceTransform.cs b/src/Microsoft.ML.Transforms/NAReplaceTransform.cs index 522237e303..c9b309af89 100644 --- a/src/Microsoft.ML.Transforms/NAReplaceTransform.cs +++ b/src/Microsoft.ML.Transforms/NAReplaceTransform.cs @@ -27,13 +27,12 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// This transform can transform either scalars or vectors (both fixed and variable size), - /// creating output columns that are identical to the input columns except for replacing NA values - /// with either the default value, user input, or imputed values (min/max/mean are currently supported). - /// Imputation modes are supported for vectors both by slot and across all slots. - /// - /// REVIEW: May make sense to implement the transform template interface. + // This transform can transform either scalars or vectors (both fixed and variable size), + // creating output columns that are identical to the input columns except for replacing NA values + // with either the default value, user input, or imputed values (min/max/mean are currently supported). + // Imputation modes are supported for vectors both by slot and across all slots. + // REVIEW: May make sense to implement the transform template interface. + /// public sealed partial class NAReplaceTransform : OneToOneTransformBase { public enum ReplacementKind @@ -43,6 +42,7 @@ public enum ReplacementKind Mean, Minimum, Maximum, + SpecifiedValue, [HideEnumValue] Def = DefaultValue, @@ -53,8 +53,6 @@ public enum ReplacementKind [HideEnumValue] Max = Maximum, - [HideEnumValue] - SpecifiedValue, [HideEnumValue] Val = SpecifiedValue, [HideEnumValue] @@ -187,6 +185,19 @@ private static string TestType(ColumnType type) public override bool CanSaveOnnx => true; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// The replacement method to utilize. + public NAReplaceTransform(IHostEnvironment env, IDataView input, string name, string source = null, ReplacementKind replacementKind = ReplacementKind.DefaultValue) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, ReplacementKind = replacementKind }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -617,20 +628,19 @@ protected override bool SaveAsOnnxCore(OnnxContext ctx, int iinfo, ColInfo info, return false; string opType = "Imputer"; - var node = OnnxUtils.MakeNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); - OnnxUtils.NodeAddAttributes(node, "replaced_value_float", Single.NaN); + var node = ctx.CreateNode(opType, srcVariableName, dstVariableName, ctx.GetNodeName(opType)); + node.AddAttribute("replaced_value_float", Single.NaN); if (!Infos[iinfo].TypeSrc.IsVector) - OnnxUtils.NodeAddAttributes(node, "imputed_value_float", Enumerable.Repeat((float)_repValues[iinfo], 1)); + node.AddAttribute("imputed_value_floats", Enumerable.Repeat((float)_repValues[iinfo], 1)); else { if (_repIsDefault[iinfo] != null) - OnnxUtils.NodeAddAttributes(node, "imputed_value_floats", (float[])_repValues[iinfo]); + node.AddAttribute("imputed_value_floats", (float[])_repValues[iinfo]); else - OnnxUtils.NodeAddAttributes(node, "imputed_value_float", Enumerable.Repeat((float)_repValues[iinfo], 1)); + node.AddAttribute("imputed_value_floats", Enumerable.Repeat((float)_repValues[iinfo], 1)); } - ctx.AddNode(node); return true; } diff --git a/src/Microsoft.ML.Transforms/OptionalColumnTransform.cs b/src/Microsoft.ML.Transforms/OptionalColumnTransform.cs index 5d3ab591b2..5117496194 100644 --- a/src/Microsoft.ML.Transforms/OptionalColumnTransform.cs +++ b/src/Microsoft.ML.Transforms/OptionalColumnTransform.cs @@ -26,6 +26,7 @@ namespace Microsoft.ML.Runtime.DataPipe { + /// public class OptionalColumnTransform : RowToRowMapperTransformBase { public sealed class Arguments : TransformInputBase @@ -232,6 +233,17 @@ private static VersionInfo GetVersionInfo() private const string RegistrationName = "OptionalColumn"; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Columns to transform. + public OptionalColumnTransform(IHostEnvironment env, IDataView input, params string[] columns) + : this(env, new Arguments() { Column = columns }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// @@ -459,7 +471,13 @@ private Delegate MakeGetterVec(int length) } } - [TlcModule.EntryPoint(Desc = Summary, Name = "Transforms.OptionalColumnCreator", UserName = UserName, ShortName = ShortName)] + [TlcModule.EntryPoint(Desc = Summary, + Name = "Transforms.OptionalColumnCreator", + UserName = UserName, + ShortName = ShortName, + XmlInclude = new[] { @"", + @""})] + public static CommonOutputs.TransformOutput MakeOptional(IHostEnvironment env, Arguments input) { var h = EntryPointUtils.CheckArgsAndCreateHost(env, "OptionalColumn", input); diff --git a/src/Microsoft.ML.Transforms/ProduceIdTransform.cs b/src/Microsoft.ML.Transforms/ProduceIdTransform.cs index c66489d386..0934fd0086 100644 --- a/src/Microsoft.ML.Transforms/ProduceIdTransform.cs +++ b/src/Microsoft.ML.Transforms/ProduceIdTransform.cs @@ -18,7 +18,7 @@ namespace Microsoft.ML.Runtime.Data { /// /// Produces a column with the cursor's ID as a column. This can be useful for diagnostic purposes. - /// + /// /// This class will obviously generate different data given different IDs. So, if you save data to /// some other file, then apply this transform to that dataview, it may of course have a different /// result. This is distinct from most transforms that produce results based on data alone. diff --git a/src/Microsoft.ML.Transforms/Properties/Resources.Designer.cs b/src/Microsoft.ML.Transforms/Properties/Resources.Designer.cs index 28bf1cdaaf..772151fc4f 100644 --- a/src/Microsoft.ML.Transforms/Properties/Resources.Designer.cs +++ b/src/Microsoft.ML.Transforms/Properties/Resources.Designer.cs @@ -338,7 +338,8 @@ internal static string Czech { ///nyt ///nær ///næste - ///næsten /// [rest of string was truncated]";. + ///næsten + /// [rest of string was truncated]";. /// internal static string Danish { get { @@ -581,7 +582,8 @@ internal static string English { ///aussi ///donc ///ces - ///toute /// [rest of string was truncated]";. + ///toute + /// [rest of string was truncated]";. /// internal static string French { get { diff --git a/src/Microsoft.ML.Transforms/RffTransform.cs b/src/Microsoft.ML.Transforms/RffTransform.cs index b8f49b4dce..b7a112e954 100644 --- a/src/Microsoft.ML.Transforms/RffTransform.cs +++ b/src/Microsoft.ML.Transforms/RffTransform.cs @@ -27,20 +27,26 @@ namespace Microsoft.ML.Runtime.Data public sealed class RffTransform : OneToOneTransformBase { + private static class Defaults + { + public const int NewDim = 1000; + public const bool UseSin = false; + } + public sealed class Arguments { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)] public Column[] Column; [Argument(ArgumentType.AtMostOnce, HelpText = "The number of random Fourier features to create", ShortName = "dim")] - public int NewDim = 1000; + public int NewDim = Defaults.NewDim; [Argument(ArgumentType.Multiple, HelpText = "which kernel to use?", ShortName = "kernel")] public SubComponent MatrixGenerator = new SubComponent(GaussianFourierSampler.LoadName); [Argument(ArgumentType.AtMostOnce, HelpText = "create two features for every random Fourier frequency? (one for cos and one for sin)")] - public bool UseSin = false; + public bool UseSin = Defaults.UseSin; [Argument(ArgumentType.LastOccurenceWins, HelpText = "The seed of the random number generator for generating the new features (if unspecified, " + @@ -232,6 +238,23 @@ private static string TestColumnType(ColumnType type) return "Expected R4 or vector of R4 with known size"; } + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// The number of random Fourier features to create. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + public RffTransform(IHostEnvironment env, + IDataView input, + int newDim, + string name, + string source = null) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, NewDim = newDim }, input) + { + } + /// /// Public constructor corresponding to . /// @@ -534,7 +557,7 @@ private static void TransformFeatures(IHost host, ref VBuffer src, ref VB } else { - // This overload of MatTimesSrc ignores the values in slots that are not in src.Indices, so there is + // This overload of MatTimesSrc ignores the values in slots that are not in src.Indices, so there is // no need to zero them out. featuresAligned.CopyFrom(src.Indices, src.Values, 0, 0, src.Count, zeroItems: false); CpuUtils.MatTimesSrc(false, false, transformInfo.RndFourierVectors, src.Indices, featuresAligned, 0, 0, diff --git a/src/Microsoft.ML.Transforms/TermLookupTransform.cs b/src/Microsoft.ML.Transforms/TermLookupTransform.cs index f10fb40092..2848082157 100644 --- a/src/Microsoft.ML.Transforms/TermLookupTransform.cs +++ b/src/Microsoft.ML.Transforms/TermLookupTransform.cs @@ -283,7 +283,7 @@ private static VersionInfo GetVersionInfo() } // This is the byte array containing the binary .idv file contents for the lookup data. - // This is persisted; the _termMap and _valueMap are constructed from it. + // This is persisted; the _termMap and _valueMap are constructed from it. private readonly byte[] _bytes; // The BinaryLoader over the byte array above. We keep this diff --git a/src/Microsoft.ML.Transforms/Text/CharTokenizeTransform.cs b/src/Microsoft.ML.Transforms/Text/CharTokenizeTransform.cs index 423c69ee4b..e1ea2974b3 100644 --- a/src/Microsoft.ML.Transforms/Text/CharTokenizeTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/CharTokenizeTransform.cs @@ -64,12 +64,16 @@ public sealed class Arguments : TransformInputBase public const string LoaderSignature = "CharToken"; public const string UserName = "Character Tokenizer Transform"; + // Keep track of the model that was saved with ver:0x00010001 + private readonly bool _isSeparatorStartEnd; + private static VersionInfo GetVersionInfo() { return new VersionInfo( modelSignature: "CHARTOKN", - verWrittenCur: 0x00010001, // Initial - verReadableCur: 0x00010001, + //verWrittenCur: 0x00010001, // Initial + verWrittenCur: 0x00010002, // Updated to use UnitSeparator character instead of using for vector inputs. + verReadableCur: 0x00010002, verWeCanReadBack: 0x00010001, loaderSignature: LoaderSignature); } @@ -84,6 +88,7 @@ private static VersionInfo GetVersionInfo() private volatile string _keyValuesStr; private volatile int[] _keyValuesBoundaries; + private const ushort UnitSeparator = 0x1f; private const ushort TextStartMarker = 0x02; private const ushort TextEndMarker = 0x03; private const int TextMarkersCount = 2; @@ -120,6 +125,8 @@ private CharTokenizeTransform(IHost host, ModelLoadContext ctx, IDataView input) // byte: _useMarkerChars value. _useMarkerChars = ctx.Reader.ReadBoolByte(); + _isSeparatorStartEnd = ctx.Header.ModelVerReadable < 0x00010002 || ctx.Reader.ReadBoolByte(); + _type = GetOutputColumnType(); SetMetadata(); } @@ -145,6 +152,7 @@ public override void Save(ModelSaveContext ctx) // byte: _useMarkerChars value. SaveBase(ctx); ctx.Writer.WriteBoolByte(_useMarkerChars); + ctx.Writer.WriteBoolByte(_isSeparatorStartEnd); } protected override ColumnType GetColumnTypeCore(int iinfo) @@ -399,8 +407,8 @@ private ValueGetter> MakeGetterVec(IRow input, int iinfo) var getSrc = GetSrcGetter>(input, iinfo); var src = default(VBuffer); - return - (ref VBuffer dst) => + + ValueGetter> getterWithStartEndSep = (ref VBuffer dst) => { getSrc(ref src); @@ -438,6 +446,67 @@ private ValueGetter> MakeGetterVec(IRow input, int iinfo) dst = new VBuffer(len, values, dst.Indices); }; + + ValueGetter < VBuffer > getterWithUnitSep = (ref VBuffer dst) => + { + getSrc(ref src); + + int len = 0; + + for (int i = 0; i < src.Count; i++) + { + if (src.Values[i].HasChars) + { + len += src.Values[i].Length; + + if (i > 0) + len += 1; // add UnitSeparator character to len that will be added + } + } + + if (_useMarkerChars) + len += TextMarkersCount; + + var values = dst.Values; + if (len > 0) + { + if (Utils.Size(values) < len) + values = new ushort[len]; + + int index = 0; + + // VBuffer can be a result of either concatenating text columns together + // or application of word tokenizer before char tokenizer in TextTransform. + // + // Considering VBuffer as a single text stream. + // Therefore, prepend and append start and end markers only once i.e. at the start and at end of vector. + // Insert UnitSeparator after every piece of text in the vector. + if (_useMarkerChars) + values[index++] = TextStartMarker; + + for (int i = 0; i < src.Count; i++) + { + if (!src.Values[i].HasChars) + continue; + + if (i > 0) + values[index++] = UnitSeparator; + + for (int ich = 0; ich < src.Values[i].Length; ich++) + { + values[index++] = src.Values[i][ich]; + } + } + + if (_useMarkerChars) + values[index++] = TextEndMarker; + + Contracts.Assert(index == len); + } + + dst = new VBuffer(len, values, dst.Indices); + }; + return _isSeparatorStartEnd ? getterWithStartEndSep : getterWithUnitSep; } } } diff --git a/src/Microsoft.ML.Transforms/Text/LdaSingleBox.cs b/src/Microsoft.ML.Transforms/Text/LdaSingleBox.cs new file mode 100644 index 0000000000..4a9ef780ca --- /dev/null +++ b/src/Microsoft.ML.Transforms/Text/LdaSingleBox.cs @@ -0,0 +1,357 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; + +namespace Microsoft.ML.Runtime.TextAnalytics +{ + + internal static class LdaInterface + { + public struct LdaEngine + { + public IntPtr Ptr; + } + + private const string NativeDll = "LdaNative"; + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern LdaEngine CreateEngine(int numTopic, int numVocab, float alphaSum, float beta, int numIter, + int likelihoodInterval, int numThread, int mhstep, int maxDocToken); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void AllocateModelMemory(LdaEngine engine, int numTopic, int numVocab, long tableSize, long aliasTableSize); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void AllocateDataMemory(LdaEngine engine, int docNum, long corpusSize); + + [DllImport(NativeDll, CharSet = CharSet.Ansi), SuppressUnmanagedCodeSecurity] + internal static extern void Train(LdaEngine engine, string trainOutput); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void GetModelStat(LdaEngine engine, out long memBlockSize, out long aliasMemBlockSize); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void Test(LdaEngine engine, int numBurninIter, float[] pLogLikelihood); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void CleanData(LdaEngine engine); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void CleanModel(LdaEngine engine); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void DestroyEngine(LdaEngine engine); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void GetWordTopic(LdaEngine engine, int wordId, int[] pTopic, int[] pProb, ref int length); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void SetWordTopic(LdaEngine engine, int wordId, int[] pTopic, int[] pProb, int length); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void SetAlphaSum(LdaEngine engine, float avgDocLength); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern int FeedInData(LdaEngine engine, int[] termId, int[] termFreq, int termNum, int numVocab); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern int FeedInDataDense(LdaEngine engine, int[] termFreq, int termNum, int numVocab); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void GetDocTopic(LdaEngine engine, int docId, int[] pTopic, int[] pProb, ref int numTopicReturn); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void GetTopicSummary(LdaEngine engine, int topicId, int[] pWords, float[] pProb, ref int numTopicReturn); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void TestOneDoc(LdaEngine engine, int[] termId, int[] termFreq, int termNum, int[] pTopics, int[] pProbs, ref int numTopicsMax, int numBurnIter, bool reset); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void TestOneDocDense(LdaEngine engine, int[] termFreq, int termNum, int[] pTopics, int[] pProbs, ref int numTopicsMax, int numBurninIter, bool reset); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void InitializeBeforeTrain(LdaEngine engine); + + [DllImport(NativeDll), SuppressUnmanagedCodeSecurity] + internal static extern void InitializeBeforeTest(LdaEngine engine); + } + + internal sealed class LdaSingleBox : IDisposable + { + private LdaInterface.LdaEngine _engine; + private bool _isDisposed; + private int[] _topics; + private int[] _probabilities; + private int[] _summaryTerm; + private float[] _summaryTermProb; + private readonly int _likelihoodInterval; + private readonly float _alpha; + private readonly float _beta; + private readonly int _mhStep; + private readonly int _numThread; + private readonly int _numSummaryTerms; + private readonly bool _denseOutput; + + public readonly int NumTopic; + public readonly int NumVocab; + public LdaSingleBox(int numTopic, int numVocab, float alpha, + float beta, int numIter, int likelihoodInterval, int numThread, + int mhstep, int numSummaryTerms, bool denseOutput, int maxDocToken) + { + NumTopic = numTopic; + NumVocab = numVocab; + _alpha = alpha; + _beta = beta; + _mhStep = mhstep; + _numSummaryTerms = numSummaryTerms; + _denseOutput = denseOutput; + _likelihoodInterval = likelihoodInterval; + _numThread = numThread; + + _topics = new int[numTopic]; + _probabilities = new int[numTopic]; + + _summaryTerm = new int[_numSummaryTerms]; + _summaryTermProb = new float[_numSummaryTerms]; + + _engine = LdaInterface.CreateEngine(numTopic, numVocab, alpha, beta, numIter, likelihoodInterval, numThread, mhstep, maxDocToken); + } + + public void AllocateModelMemory(int numTopic, int numVocab, long tableSize, long aliasTableSize) + { + Contracts.Check(numTopic >= 0); + Contracts.Check(numVocab >= 0); + Contracts.Check(tableSize >= 0); + Contracts.Check(aliasTableSize >= 0); + LdaInterface.AllocateModelMemory(_engine, numVocab, numTopic, tableSize, aliasTableSize); + } + + public void AllocateDataMemory(int docNum, long corpusSize) + { + Contracts.Check(docNum >= 0); + Contracts.Check(corpusSize >= 0); + LdaInterface.AllocateDataMemory(_engine, docNum, corpusSize); + } + + public void Train(string trainOutput) + { + if (string.IsNullOrWhiteSpace(trainOutput)) + LdaInterface.Train(_engine, null); + else + LdaInterface.Train(_engine, trainOutput); + } + + public void GetModelStat(out long memBlockSize, out long aliasMemBlockSize) + { + LdaInterface.GetModelStat(_engine, out memBlockSize, out aliasMemBlockSize); + } + + public void Test(int numBurninIter, float[] logLikelihood) + { + Contracts.Check(numBurninIter >= 0); + var pLogLikelihood = new float[numBurninIter]; + LdaInterface.Test(_engine, numBurninIter, pLogLikelihood); + logLikelihood = pLogLikelihood.Select(item => (float)item).ToArray(); + } + + public void CleanData() + { + LdaInterface.CleanData(_engine); + } + + public void CleanModel() + { + LdaInterface.CleanModel(_engine); + } + + public void CopyModel(LdaSingleBox trainer, int wordId) + { + int length = NumTopic; + LdaInterface.GetWordTopic(trainer._engine, wordId, _topics, _probabilities, ref length); + LdaInterface.SetWordTopic(_engine, wordId, _topics, _probabilities, length); + } + + public void SetAlphaSum(float averageDocLength) + { + LdaInterface.SetAlphaSum(_engine, averageDocLength); + } + + public int LoadDoc(int[] termID, double[] termVal, int termNum, int numVocab) + { + Contracts.Check(numVocab == NumVocab); + Contracts.Check(termNum > 0); + Contracts.Check(termID.Length >= termNum); + Contracts.Check(termVal.Length >= termNum); + + int[] pID = new int[termNum]; + int[] pVal = termVal.Select(item => (int)item).ToArray(); + Array.Copy(termID, pID, termNum); + return LdaInterface.FeedInData(_engine, pID, pVal, termNum, NumVocab); + } + + public int LoadDocDense(double[] termVal, int termNum, int numVocab) + { + Contracts.Check(numVocab == NumVocab); + Contracts.Check(termNum > 0); + + Contracts.Check(termVal.Length >= termNum); + + int[] pID = new int[termNum]; + int[] pVal = termVal.Select(item => (int)item).ToArray(); + return LdaInterface.FeedInDataDense(_engine, pVal, termNum, NumVocab); + + } + + public List> GetDocTopicVector(int docID) + { + int numTopicReturn = NumTopic; + LdaInterface.GetDocTopic(_engine, docID, _topics, _probabilities, ref numTopicReturn); + var topicRet = new List>(); + int currentTopic = 0; + for (int i = 0; i < numTopicReturn; i++) + { + if (_denseOutput) + { + while (currentTopic < _topics[i]) + { + //use a value to smooth the count so that we get dense output on each topic + //the smooth value is usually set to 0.1 + topicRet.Add(new KeyValuePair(currentTopic, (float)_alpha)); + currentTopic++; + } + topicRet.Add(new KeyValuePair(_topics[i], _probabilities[i] + (float)_alpha)); + currentTopic++; + } + else + { + topicRet.Add(new KeyValuePair(_topics[i], (float)_probabilities[i])); + } + } + + if (_denseOutput) + { + while (currentTopic < NumTopic) + { + topicRet.Add(new KeyValuePair(currentTopic, (float)_alpha)); + currentTopic++; + } + } + return topicRet; + } + + public List> TestDoc(int[] termID, double[] termVal, int termNum, int numBurninIter, bool reset) + { + Contracts.Check(termNum > 0); + Contracts.Check(termVal.Length >= termNum); + Contracts.Check(termID.Length >= termNum); + + int[] pID = new int[termNum]; + int[] pVal = termVal.Select(item => (int)item).ToArray(); + int[] pTopic = new int[NumTopic]; + int[] pProb = new int[NumTopic]; + Array.Copy(termID, pID, termNum); + + int numTopicReturn = NumTopic; + + LdaInterface.TestOneDoc(_engine, pID, pVal, termNum, pTopic, pProb, ref numTopicReturn, numBurninIter, reset); + + // PREfast suspects that the value of numTopicReturn could be changed in _engine->TestOneDoc, which might result in read overrun in the following loop. + if (numTopicReturn > NumTopic) + { + Contracts.Check(false); + numTopicReturn = NumTopic; + } + + var topicRet = new List>(); + for (int i = 0; i < numTopicReturn; i++) + topicRet.Add(new KeyValuePair(pTopic[i], (float)pProb[i])); + return topicRet; + } + + public List> TestDocDense(double[] termVal, int termNum, int numBurninIter, bool reset) + { + Contracts.Check(termNum > 0); + Contracts.Check(numBurninIter > 0); + Contracts.Check(termVal.Length >= termNum); + int[] pVal = termVal.Select(item => (int)item).ToArray(); + int[] pTopic = new int[NumTopic]; + int[] pProb = new int[NumTopic]; + + int numTopicReturn = NumTopic; + + // There are two versions of TestOneDoc interfaces + // (1) TestOneDoc + // (2) TestOneDocRestart + // The second one is the same as the first one except that it will reset + // the states of the internal random number generator, so that it yields reproducable results for the same input + LdaInterface.TestOneDocDense(_engine, pVal, termNum, pTopic, pProb, ref numTopicReturn, numBurninIter, reset); + + // PREfast suspects that the value of numTopicReturn could be changed in _engine->TestOneDoc, which might result in read overrun in the following loop. + if (numTopicReturn > NumTopic) + { + Contracts.Check(false); + numTopicReturn = NumTopic; + } + + var topicRet = new List>(); + for (int i = 0; i < numTopicReturn; i++) + topicRet.Add(new KeyValuePair(pTopic[i], (float)pProb[i])); + return topicRet; + } + + public void InitializeBeforeTrain() + { + LdaInterface.InitializeBeforeTrain(_engine); + } + + public void InitializeBeforeTest() + { + LdaInterface.InitializeBeforeTest(_engine); + } + + public KeyValuePair[] GetModel(int wordId) + { + int length = NumTopic; + LdaInterface.GetWordTopic(_engine, wordId, _topics, _probabilities, ref length); + var wordTopicVector = new KeyValuePair[length]; + + for (int i = 0; i < length; i++) + wordTopicVector[i] = new KeyValuePair(_topics[i], _probabilities[i]); + return wordTopicVector; + } + + public KeyValuePair[] GetTopicSummary(int topicId) + { + int length = _numSummaryTerms; + LdaInterface.GetTopicSummary(_engine, topicId, _summaryTerm, _summaryTermProb, ref length); + var topicSummary = new KeyValuePair[length]; + + for (int i = 0; i < length; i++) + topicSummary[i] = new KeyValuePair(_summaryTerm[i], _summaryTermProb[i]); + return topicSummary; + } + + public void SetModel(int termID, int[] topicID, int[] topicProb, int topicNum) + { + Contracts.Check(termID >= 0); + Contracts.Check(topicNum <= NumTopic); + Array.Copy(topicID, _topics, topicNum); + Array.Copy(topicProb, _probabilities, topicNum); + LdaInterface.SetWordTopic(_engine, termID, _topics, _probabilities, topicNum); + } + + public void Dispose() + { + if (_isDisposed) + return; + _isDisposed = true; + LdaInterface.DestroyEngine(_engine); + _engine.Ptr = IntPtr.Zero; + } + } +} diff --git a/src/Microsoft.ML.Transforms/Text/LdaTransform.cs b/src/Microsoft.ML.Transforms/Text/LdaTransform.cs new file mode 100644 index 0000000000..b5a75a10d1 --- /dev/null +++ b/src/Microsoft.ML.Transforms/Text/LdaTransform.cs @@ -0,0 +1,974 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Float = System.Single; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Internallearn; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Runtime.TextAnalytics; + +[assembly: LoadableClass(typeof(LdaTransform), typeof(LdaTransform.Arguments), typeof(SignatureDataTransform), + LdaTransform.UserName, LdaTransform.LoaderSignature, LdaTransform.ShortName, DocName = "transform/LdaTransform.md")] + +[assembly: LoadableClass(typeof(LdaTransform), null, typeof(SignatureLoadDataTransform), + LdaTransform.UserName, LdaTransform.LoaderSignature)] + +namespace Microsoft.ML.Runtime.TextAnalytics +{ + // LightLDA transform: Big Topic Models on Modest Compute Clusters. + // LightLDA is an implementation of Latent Dirichlet Allocation (LDA). + // Previous implementations of LDA such as SparseLDA or AliasLDA allow to achieve massive data and model scales, + // for example models with tens of billions of parameters to be inferred from billions of documents. + // However this requires using a cluster of thousands of machines with all ensuing costs to setup and maintain. + // LightLDA solves this problem in a more cost-effective manner by providing an implementation + // that is efficient enough for modest clusters with at most tens of machines... + // For more details please see original LightLDA paper: + // http://arxiv.org/abs/1412.1576 + // http://www.www2015.it/documents/proceedings/proceedings/p1351.pdf + // and open source implementation: + // https://github.com/Microsoft/LightLDA + // + // See + // for an example on how to use LdaTransform. + /// + public sealed class LdaTransform : OneToOneTransformBase + { + public sealed class Arguments : TransformInputBase + { + [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:srcs)", ShortName = "col", SortOrder = 49)] + public Column[] Column; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of topics in the LDA", SortOrder = 50)] + [TGUI(SuggestedSweeps = "20,40,100,200")] + [TlcModule.SweepableDiscreteParam("NumTopic", new object[] { 20, 40, 100, 200 })] + public int NumTopic = 100; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Dirichlet prior on document-topic vectors")] + [TGUI(SuggestedSweeps = "1,10,100,200")] + [TlcModule.SweepableDiscreteParam("AlphaSum", new object[] { 1, 10, 100, 200 })] + public Single AlphaSum = 100; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Dirichlet prior on vocab-topic vectors")] + [TGUI(SuggestedSweeps = "0.01,0.015,0.07,0.02")] + [TlcModule.SweepableDiscreteParam("Beta", new object[] { 0.01f, 0.015f, 0.07f, 0.02f })] + public Single Beta = 0.01f; + + [Argument(ArgumentType.Multiple, HelpText = "Number of Metropolis Hasting step")] + [TGUI(SuggestedSweeps = "2,4,8,16")] + [TlcModule.SweepableDiscreteParam("Mhstep", new object[] { 2, 4, 8, 16 })] + public int Mhstep = 4; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Number of iterations", ShortName = "iter")] + [TGUI(SuggestedSweeps = "100,200,300,400")] + [TlcModule.SweepableDiscreteParam("NumIterations", new object[] { 100, 200, 300, 400 })] + public int NumIterations = 200; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Compute log likelihood over local dataset on this iteration interval", ShortName = "llInterval")] + public int LikelihoodInterval = 5; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The threshold of maximum count of tokens per doc", ShortName = "maxNumToken", SortOrder = 50)] + public int NumMaxDocToken = 512; + + // REVIEW: Should change the default when multi-threading support is optimized. + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of training threads. Default value depends on number of logical processors.", ShortName = "t", SortOrder = 50)] + public int? NumThreads; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of words to summarize the topic", ShortName = "ns")] + public int NumSummaryTermPerTopic = 10; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of burn-in iterations", ShortName = "burninIter")] + [TGUI(SuggestedSweeps = "10,20,30,40")] + [TlcModule.SweepableDiscreteParam("NumBurninIterations", new object[] { 10, 20, 30, 40 })] + public int NumBurninIterations = 10; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Reset the random number generator for each document", ShortName = "reset")] + public bool ResetRandomGenerator; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to output the topic-word summary in text format", ShortName = "summary")] + public bool OutputTopicWordSummary; + } + + public sealed class Column : OneToOneColumn + { + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of topics in the LDA")] + public int? NumTopic; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Dirichlet prior on document-topic vectors")] + public Single? AlphaSum; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Dirichlet prior on vocab-topic vectors")] + public Single? Beta; + + [Argument(ArgumentType.Multiple, HelpText = "Number of Metropolis Hasting step")] + public int? Mhstep; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Number of iterations", ShortName = "iter")] + public int? NumIterations; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Compute log likelihood over local dataset on this iteration interval", ShortName = "llInterval")] + public int? LikelihoodInterval; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of training threads", ShortName = "t")] + public int? NumThreads; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The threshold of maximum count of tokens per doc", ShortName = "maxNumToken")] + public int? NumMaxDocToken; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of words to summarize the topic", ShortName = "ns")] + public int? NumSummaryTermPerTopic; + + [Argument(ArgumentType.AtMostOnce, HelpText = "The number of burn-in iterations", ShortName = "burninIter")] + public int? NumBurninIterations = 10; + + [Argument(ArgumentType.AtMostOnce, HelpText = "Reset the random number generator for each document", ShortName = "reset")] + public bool? ResetRandomGenerator; + + public static Column Parse(string str) + { + Contracts.AssertNonEmpty(str); + + var res = new Column(); + if (res.TryParse(str)) + return res; + return null; + } + + public bool TryUnparse(StringBuilder sb) + { + Contracts.AssertValue(sb); + if (NumTopic != null || AlphaSum != null || Beta != null || Mhstep != null || NumIterations != null || LikelihoodInterval != null || + NumThreads != null || NumMaxDocToken != null || NumSummaryTermPerTopic != null || ResetRandomGenerator != null) + return false; + return TryUnparseCore(sb); + } + } + + private sealed class ColInfoEx + { + public readonly int NumTopic; + public readonly Single AlphaSum; + public readonly Single Beta; + public readonly int MHStep; + public readonly int NumIter; + public readonly int LikelihoodInterval; + public readonly int NumThread; + public readonly int NumMaxDocToken; + public readonly int NumSummaryTermPerTopic; + public readonly int NumBurninIter; + public readonly bool ResetRandomGenerator; + + public ColInfoEx(IExceptionContext ectx, Column item, Arguments args) + { + Contracts.AssertValue(ectx); + + NumTopic = item.NumTopic ?? args.NumTopic; + Contracts.CheckUserArg(NumTopic > 0, nameof(item.NumTopic), "Must be positive."); + + AlphaSum = item.AlphaSum ?? args.AlphaSum; + + Beta = item.Beta ?? args.Beta; + + MHStep = item.Mhstep ?? args.Mhstep; + ectx.CheckUserArg(MHStep > 0, nameof(item.Mhstep), "Must be positive."); + + NumIter = item.NumIterations ?? args.NumIterations; + ectx.CheckUserArg(NumIter > 0, nameof(item.NumIterations), "Must be positive."); + + LikelihoodInterval = item.LikelihoodInterval ?? args.LikelihoodInterval; + ectx.CheckUserArg(LikelihoodInterval > 0, nameof(item.LikelihoodInterval), "Must be positive."); + + NumThread = item.NumThreads ?? args.NumThreads ?? 0; + ectx.CheckUserArg(NumThread >= 0, nameof(item.NumThreads), "Must be positive or zero."); + + NumMaxDocToken = item.NumMaxDocToken ?? args.NumMaxDocToken; + ectx.CheckUserArg(NumMaxDocToken > 0, nameof(item.NumMaxDocToken), "Must be positive."); + + NumSummaryTermPerTopic = item.NumSummaryTermPerTopic ?? args.NumSummaryTermPerTopic; + ectx.CheckUserArg(NumSummaryTermPerTopic > 0, nameof(item.NumSummaryTermPerTopic), "Must be positive"); + + NumBurninIter = item.NumBurninIterations ?? args.NumBurninIterations; + ectx.CheckUserArg(NumBurninIter >= 0, nameof(item.NumBurninIterations), "Must be non-negative."); + + ResetRandomGenerator = item.ResetRandomGenerator ?? args.ResetRandomGenerator; + } + + public ColInfoEx(IExceptionContext ectx, ModelLoadContext ctx) + { + Contracts.AssertValue(ectx); + ectx.AssertValue(ctx); + + // *** Binary format *** + // int NumTopic; + // Single AlphaSum; + // Single Beta; + // int MHStep; + // int NumIter; + // int LikelihoodInterval; + // int NumThread; + // int NumMaxDocToken; + // int NumSummaryTermPerTopic; + // int NumBurninIter; + // byte ResetRandomGenerator; + + NumTopic = ctx.Reader.ReadInt32(); + ectx.CheckDecode(NumTopic > 0); + + AlphaSum = ctx.Reader.ReadSingle(); + + Beta = ctx.Reader.ReadSingle(); + + MHStep = ctx.Reader.ReadInt32(); + ectx.CheckDecode(MHStep > 0); + + NumIter = ctx.Reader.ReadInt32(); + ectx.CheckDecode(NumIter > 0); + + LikelihoodInterval = ctx.Reader.ReadInt32(); + ectx.CheckDecode(LikelihoodInterval > 0); + + NumThread = ctx.Reader.ReadInt32(); + ectx.CheckDecode(NumThread >= 0); + + NumMaxDocToken = ctx.Reader.ReadInt32(); + ectx.CheckDecode(NumMaxDocToken > 0); + + NumSummaryTermPerTopic = ctx.Reader.ReadInt32(); + ectx.CheckDecode(NumSummaryTermPerTopic > 0); + + NumBurninIter = ctx.Reader.ReadInt32(); + ectx.CheckDecode(NumBurninIter >= 0); + + ResetRandomGenerator = ctx.Reader.ReadBoolByte(); + } + + public void Save(ModelSaveContext ctx) + { + Contracts.AssertValue(ctx); + + // *** Binary format *** + // int NumTopic; + // Single AlphaSum; + // Single Beta; + // int MHStep; + // int NumIter; + // int LikelihoodInterval; + // int NumThread; + // int NumMaxDocToken; + // int NumSummaryTermPerTopic; + // int NumBurninIter; + // byte ResetRandomGenerator; + + ctx.Writer.Write(NumTopic); + ctx.Writer.Write(AlphaSum); + ctx.Writer.Write(Beta); + ctx.Writer.Write(MHStep); + ctx.Writer.Write(NumIter); + ctx.Writer.Write(LikelihoodInterval); + ctx.Writer.Write(NumThread); + ctx.Writer.Write(NumMaxDocToken); + ctx.Writer.Write(NumSummaryTermPerTopic); + ctx.Writer.Write(NumBurninIter); + ctx.Writer.WriteBoolByte(ResetRandomGenerator); + } + } + + public const string LoaderSignature = "LdaTransform"; + private static VersionInfo GetVersionInfo() + { + return new VersionInfo( + modelSignature: "LIGHTLDA", + verWrittenCur: 0x00010001, // Initial + verReadableCur: 0x00010001, + verWeCanReadBack: 0x00010001, + loaderSignature: LoaderSignature); + } + + private readonly ColInfoEx[] _exes; + private readonly LdaState[] _ldas; + private readonly ColumnType[] _types; + private readonly bool _saveText; + + private const string RegistrationName = "LightLda"; + private const string WordTopicModelFilename = "word_topic_summary.txt"; + internal const string Summary = "The LDA transform implements LightLDA, a state-of-the-art implementation of Latent Dirichlet Allocation."; + internal const string UserName = "Latent Dirichlet Allocation Transform"; + internal const string ShortName = "LightLda"; + + public LdaTransform(IHostEnvironment env, Arguments args, IDataView input) + : base(env, RegistrationName, args.Column, input, TestType) + { + Host.CheckValue(args, nameof(args)); + Host.CheckUserArg(args.NumTopic > 0, nameof(args.NumTopic), "Must be positive."); + Host.CheckValue(input, nameof(input)); + Host.CheckUserArg(Utils.Size(args.Column) > 0, nameof(args.Column)); + _exes = new ColInfoEx[Infos.Length]; + _types = new ColumnType[Infos.Length]; + _ldas = new LdaState[Infos.Length]; + _saveText = args.OutputTopicWordSummary; + for (int i = 0; i < Infos.Length; i++) + { + var ex = new ColInfoEx(Host, args.Column[i], args); + _exes[i] = ex; + _types[i] = new VectorType(NumberType.Float, ex.NumTopic); + } + using (var ch = Host.Start("Train")) + { + Train(ch, input, _ldas); + ch.Done(); + } + Metadata.Seal(); + } + + private void Dispose(bool disposing) + { + if (_ldas != null) + { + foreach (var state in _ldas) + state?.Dispose(); + } + if (disposing) + GC.SuppressFinalize(this); + } + + public void Dispose() + { + Dispose(true); + } + + ~LdaTransform() + { + Dispose(false); + } + + private LdaTransform(IHost host, ModelLoadContext ctx, IDataView input) + : base(host, ctx, input, TestType) + { + Host.AssertValue(ctx); + + // *** Binary format *** + // + // + // ldaState[num infos]: The LDA parameters + + // Note: infos.length would be just one in most cases. + _exes = new ColInfoEx[Infos.Length]; + _ldas = new LdaState[Infos.Length]; + _types = new ColumnType[Infos.Length]; + for (int i = 0; i < _ldas.Length; i++) + { + _ldas[i] = new LdaState(Host, ctx); + _exes[i] = _ldas[i].InfoEx; + _types[i] = new VectorType(NumberType.Float, _ldas[i].InfoEx.NumTopic); + } + using (var ent = ctx.Repository.OpenEntryOrNull("model", WordTopicModelFilename)) + { + _saveText = ent != null; + } + Metadata.Seal(); + } + + public static LdaTransform Create(IHostEnvironment env, ModelLoadContext ctx, IDataView input) + { + Contracts.CheckValue(env, nameof(env)); + var h = env.Register(RegistrationName); + + h.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(GetVersionInfo()); + h.CheckValue(input, nameof(input)); + + return h.Apply( + "Loading Model", + ch => + { + // *** Binary Format *** + // int: sizeof(Float) + // + int cbFloat = ctx.Reader.ReadInt32(); + h.CheckDecode(cbFloat == sizeof(Float)); + return new LdaTransform(h, ctx, input); + }); + } + + public string GetTopicSummary() + { + StringWriter writer = new StringWriter(); + VBuffer slotNames = default(VBuffer); + for (int i = 0; i < _ldas.Length; i++) + { + GetSlotNames(i, ref slotNames); + _ldas[i].GetTopicSummaryWriter(slotNames)(writer); + writer.WriteLine(); + } + return writer.ToString(); + } + + public override void Save(ModelSaveContext ctx) + { + Host.CheckValue(ctx, nameof(ctx)); + ctx.CheckAtModel(); + ctx.SetVersionInfo(GetVersionInfo()); + + // *** Binary format *** + // int: sizeof(Float) + // + // ldaState[num infos]: The LDA parameters + + ctx.Writer.Write(sizeof(Float)); + SaveBase(ctx); + Host.Assert(_ldas.Length == Infos.Length); + VBuffer slotNames = default(VBuffer); + for (int i = 0; i < _ldas.Length; i++) + { + GetSlotNames(i, ref slotNames); + _ldas[i].Save(ctx, _saveText, slotNames); + } + } + + private void GetSlotNames(int iinfo, ref VBuffer dst) + { + Host.Assert(0 <= iinfo && iinfo < Infos.Length); + if (Source.Schema.HasSlotNames(Infos[iinfo].Source, Infos[iinfo].TypeSrc.ValueCount)) + Source.Schema.GetMetadata(MetadataUtils.Kinds.SlotNames, Infos[iinfo].Source, ref dst); + else + dst = default(VBuffer); + } + + private static string TestType(ColumnType t) + { + // LDA consumes term frequency vectors, so I am assuming VBuffer is an appropriate input type. + // It must also be of known size for the sake of the LDA trainer initialization. + if (t.IsKnownSizeVector && t.ItemType is NumberType) + return null; + return "Expected vector of number type of known size."; + } + + private static int GetFrequency(double value) + { + int result = (int)value; + if (!(result == value && result >= 0)) + return -1; + return result; + } + + private void Train(IChannel ch, IDataView trainingData, LdaState[] states) + { + Host.AssertValue(ch); + ch.AssertValue(trainingData); + ch.AssertValue(states); + ch.Assert(states.Length == Infos.Length); + + bool[] activeColumns = new bool[trainingData.Schema.ColumnCount]; + int[] numVocabs = new int[Infos.Length]; + + for (int i = 0; i < Infos.Length; i++) + { + activeColumns[Infos[i].Source] = true; + numVocabs[i] = 0; + } + + //the current lda needs the memory allocation before feedin data, so needs two sweeping of the data, + //one for the pre-calc memory, one for feedin data really + //another solution can be prepare these two value externally and put them in the beginning of the input file. + long[] corpusSize = new long[Infos.Length]; + int[] numDocArray = new int[Infos.Length]; + + using (var cursor = trainingData.GetRowCursor(col => activeColumns[col])) + { + var getters = new ValueGetter>[Utils.Size(Infos)]; + for (int i = 0; i < Infos.Length; i++) + { + corpusSize[i] = 0; + numDocArray[i] = 0; + getters[i] = RowCursorUtils.GetVecGetterAs(NumberType.R8, cursor, Infos[i].Source); + } + VBuffer src = default(VBuffer); + long rowCount = 0; + + while (cursor.MoveNext()) + { + ++rowCount; + for (int i = 0; i < Infos.Length; i++) + { + int docSize = 0; + getters[i](ref src); + + // compute term, doc instance#. + for (int termID = 0; termID < src.Count; termID++) + { + int termFreq = GetFrequency(src.Values[termID]); + if (termFreq < 0) + { + // Ignore this row. + docSize = 0; + break; + } + + if (docSize >= _exes[i].NumMaxDocToken - termFreq) + break; //control the document length + + //if legal then add the term + docSize += termFreq; + } + + // Ignore empty doc + if (docSize == 0) + continue; + + numDocArray[i]++; + corpusSize[i] += docSize * 2 + 1; // in the beggining of each doc, there is a cursor variable + + // increase numVocab if needed. + if (numVocabs[i] < src.Length) + numVocabs[i] = src.Length; + } + } + + for (int i = 0; i < Infos.Length; ++i) + { + if (numDocArray[i] != rowCount) + { + ch.Assert(numDocArray[i] < rowCount); + ch.Warning($"Column '{Infos[i].Name}' has skipped {rowCount - numDocArray[i]} of {rowCount} rows either empty or with negative, non-finite, or fractional values."); + } + } + } + + // Initialize all LDA states + for (int i = 0; i < Infos.Length; i++) + { + var state = new LdaState(Host, _exes[i], numVocabs[i]); + if (numDocArray[i] == 0 || corpusSize[i] == 0) + throw ch.Except("The specified documents are all empty in column '{0}'.", Infos[i].Name); + + state.AllocateDataMemory(numDocArray[i], corpusSize[i]); + states[i] = state; + } + + using (var cursor = trainingData.GetRowCursor(col => activeColumns[col])) + { + int[] docSizeCheck = new int[Infos.Length]; + // This could be optimized so that if multiple trainers consume the same column, it is + // fed into the train method once. + var getters = new ValueGetter>[Utils.Size(Infos)]; + for (int i = 0; i < Infos.Length; i++) + { + docSizeCheck[i] = 0; + getters[i] = RowCursorUtils.GetVecGetterAs(NumberType.R8, cursor, Infos[i].Source); + } + + VBuffer src = default(VBuffer); + + while (cursor.MoveNext()) + { + for (int i = 0; i < Infos.Length; i++) + { + getters[i](ref src); + docSizeCheck[i] += states[i].FeedTrain(Host, ref src); + } + } + for (int i = 0; i < Infos.Length; i++) + { + Host.Assert(corpusSize[i] == docSizeCheck[i]); + states[i].CompleteTrain(); + } + } + } + + private sealed class LdaState : IDisposable + { + public readonly ColInfoEx InfoEx; + private readonly int _numVocab; + private readonly object _preparationSyncRoot; + private readonly object _testSyncRoot; + private bool _predictionPreparationDone; + private LdaSingleBox _ldaTrainer; + + private LdaState() + { + _preparationSyncRoot = new object(); + _testSyncRoot = new object(); + } + + public LdaState(IExceptionContext ectx, ColInfoEx ex, int numVocab) + : this() + { + Contracts.AssertValue(ectx); + ectx.AssertValue(ex, "ex"); + + ectx.Assert(numVocab >= 0); + InfoEx = ex; + _numVocab = numVocab; + + _ldaTrainer = new LdaSingleBox( + InfoEx.NumTopic, + numVocab, /* Need to set number of vocabulary here */ + InfoEx.AlphaSum, + InfoEx.Beta, + InfoEx.NumIter, + InfoEx.LikelihoodInterval, + InfoEx.NumThread, + InfoEx.MHStep, + InfoEx.NumSummaryTermPerTopic, + false, + InfoEx.NumMaxDocToken); + } + + public LdaState(IExceptionContext ectx, ModelLoadContext ctx) + : this() + { + ectx.AssertValue(ctx); + + // *** Binary format *** + // + // int: vocabnum + // long: memblocksize + // long: aliasMemBlockSize + // (serializing term by term, for one term) + // int: term_id, int: topic_num, KeyValuePair[]: termTopicVector + + InfoEx = new ColInfoEx(ectx, ctx); + + _numVocab = ctx.Reader.ReadInt32(); + ectx.CheckDecode(_numVocab > 0); + + long memBlockSize = ctx.Reader.ReadInt64(); + ectx.CheckDecode(memBlockSize > 0); + + long aliasMemBlockSize = ctx.Reader.ReadInt64(); + ectx.CheckDecode(aliasMemBlockSize > 0); + + _ldaTrainer = new LdaSingleBox( + InfoEx.NumTopic, + _numVocab, /* Need to set number of vocabulary here */ + InfoEx.AlphaSum, + InfoEx.Beta, + InfoEx.NumIter, + InfoEx.LikelihoodInterval, + InfoEx.NumThread, + InfoEx.MHStep, + InfoEx.NumSummaryTermPerTopic, + false, + InfoEx.NumMaxDocToken); + + _ldaTrainer.AllocateModelMemory(_numVocab, InfoEx.NumTopic, memBlockSize, aliasMemBlockSize); + + for (int i = 0; i < _numVocab; i++) + { + int termID = ctx.Reader.ReadInt32(); + ectx.CheckDecode(termID >= 0); + int termTopicNum = ctx.Reader.ReadInt32(); + ectx.CheckDecode(termTopicNum >= 0); + + int[] topicId = new int[termTopicNum]; + int[] topicProb = new int[termTopicNum]; + + for (int j = 0; j < termTopicNum; j++) + { + topicId[j] = ctx.Reader.ReadInt32(); + topicProb[j] = ctx.Reader.ReadInt32(); + } + + //set the topic into _ldaTrainer inner topic table + _ldaTrainer.SetModel(termID, topicId, topicProb, termTopicNum); + } + + //do the preparation + if (!_predictionPreparationDone) + { + _ldaTrainer.InitializeBeforeTest(); + _predictionPreparationDone = true; + } + } + + public Action GetTopicSummaryWriter(VBuffer mapping) + { + Action writeAction; + + if (mapping.Length == 0) + { + writeAction = + writer => + { + for (int i = 0; i < _ldaTrainer.NumTopic; i++) + { + KeyValuePair[] topicSummaryVector = _ldaTrainer.GetTopicSummary(i); + writer.Write("{0}\t{1}\t", i, topicSummaryVector.Length); + foreach (KeyValuePair p in topicSummaryVector) + writer.Write("{0}:{1}\t", p.Key, p.Value); + writer.WriteLine(); + } + }; + } + else + { + writeAction = + writer => + { + DvText slotName = default(DvText); + for (int i = 0; i < _ldaTrainer.NumTopic; i++) + { + KeyValuePair[] topicSummaryVector = _ldaTrainer.GetTopicSummary(i); + writer.Write("{0}\t{1}\t", i, topicSummaryVector.Length); + foreach (KeyValuePair p in topicSummaryVector) + { + mapping.GetItemOrDefault(p.Key, ref slotName); + writer.Write("{0}[{1}]:{2}\t", p.Key, slotName, p.Value); + } + writer.WriteLine(); + } + }; + } + + return writeAction; + } + + public void Save(ModelSaveContext ctx, bool saveText, VBuffer mapping) + { + Contracts.AssertValue(ctx); + long memBlockSize = 0; + long aliasMemBlockSize = 0; + _ldaTrainer.GetModelStat(out memBlockSize, out aliasMemBlockSize); + + // *** Binary format *** + // + // int: vocabnum + // long: memblocksize + // long: aliasMemBlockSize + // (serializing term by term, for one term) + // int: term_id, int: topic_num, KeyValuePair[]: termTopicVector + + InfoEx.Save(ctx); + ctx.Writer.Write(_ldaTrainer.NumVocab); + ctx.Writer.Write(memBlockSize); + ctx.Writer.Write(aliasMemBlockSize); + + //save model from this interface + for (int i = 0; i < _ldaTrainer.NumVocab; i++) + { + KeyValuePair[] termTopicVector = _ldaTrainer.GetModel(i); + + //write the topic to disk through ctx + ctx.Writer.Write(i); //term_id + ctx.Writer.Write(termTopicVector.Length); + + foreach (KeyValuePair p in termTopicVector) + { + ctx.Writer.Write(p.Key); + ctx.Writer.Write(p.Value); + } + } + + var writeAction = GetTopicSummaryWriter(mapping); + + // save word-topic summary in text + if (saveText) + ctx.SaveTextStream(WordTopicModelFilename, writeAction); + } + + public void AllocateDataMemory(int docNum, long corpusSize) + { + _ldaTrainer.AllocateDataMemory(docNum, corpusSize); + } + + public int FeedTrain(IExceptionContext ectx, ref VBuffer input) + { + Contracts.AssertValue(ectx); + + // REVIEW: Input the counts to your trainer here. This + // is called multiple times. + + int docSize = 0; + int termNum = 0; + + for (int i = 0; i < input.Count; i++) + { + int termFreq = GetFrequency(input.Values[i]); + if (termFreq < 0) + { + // Ignore this row. + return 0; + } + if (docSize >= InfoEx.NumMaxDocToken - termFreq) + break; + + // If legal then add the term. + docSize += termFreq; + termNum++; + } + + // Ignore empty doc. + if (docSize == 0) + return 0; + + int actualSize = 0; + if (input.IsDense) + actualSize = _ldaTrainer.LoadDocDense(input.Values, termNum, input.Length); + else + actualSize = _ldaTrainer.LoadDoc(input.Indices, input.Values, termNum, input.Length); + + ectx.Assert(actualSize == 2 * docSize + 1, string.Format("The doc size are distinct. Actual: {0}, Expected: {1}", actualSize, 2 * docSize + 1)); + return actualSize; + } + + public void CompleteTrain() + { + //allocate all kinds of in memory sample tables + _ldaTrainer.InitializeBeforeTrain(); + + //call native lda trainer to perform the multi-thread training + _ldaTrainer.Train(""); /* Need to pass in an empty string */ + } + + public void Output(ref VBuffer src, ref VBuffer dst, int numBurninIter, bool reset) + { + // Prediction for a single document. + // LdaSingleBox.InitializeBeforeTest() is NOT thread-safe. + if (!_predictionPreparationDone) + { + lock (_preparationSyncRoot) + { + if (!_predictionPreparationDone) + { + //do some preparation for building tables in native c++ + _ldaTrainer.InitializeBeforeTest(); + _predictionPreparationDone = true; + } + } + } + + int len = InfoEx.NumTopic; + var values = dst.Values; + var indices = dst.Indices; + if (src.Count == 0) + { + dst = new VBuffer(len, 0, values, indices); + return; + } + + // Make sure all the frequencies are valid and truncate if the sum gets too large. + int docSize = 0; + int termNum = 0; + for (int i = 0; i < src.Count; i++) + { + int termFreq = GetFrequency(src.Values[i]); + if (termFreq < 0) + { + // REVIEW: Should this log a warning message? And what should it produce? + // It currently produces a vbuffer of all NA values. + // REVIEW: Need a utility method to do this... + if (Utils.Size(values) < len) + values = new Float[len]; + for (int k = 0; k < len; k++) + values[k] = Float.NaN; + dst = new VBuffer(len, values, indices); + return; + } + + if (docSize >= InfoEx.NumMaxDocToken - termFreq) + break; + + docSize += termFreq; + termNum++; + } + + // REVIEW: Too much memory allocation here on each prediction. + List> retTopics; + if (src.IsDense) + retTopics = _ldaTrainer.TestDocDense(src.Values, termNum, numBurninIter, reset); + else + retTopics = _ldaTrainer.TestDoc(src.Indices.Take(src.Count).ToArray(), src.Values.Take(src.Count).ToArray(), termNum, numBurninIter, reset); + + int count = retTopics.Count; + Contracts.Assert(count <= len); + if (Utils.Size(values) < count) + values = new Float[count]; + if (count < len && Utils.Size(indices) < count) + indices = new int[count]; + + double normalizer = 0; + for (int i = 0; i < count; i++) + { + int index = retTopics[i].Key; + Float value = retTopics[i].Value; + Contracts.Assert(value >= 0); + Contracts.Assert(0 <= index && index < len); + if (count < len) + { + Contracts.Assert(i == 0 || indices[i - 1] < index); + indices[i] = index; + } + else + Contracts.Assert(index == i); + + values[i] = value; + normalizer += value; + } + + if (normalizer > 0) + { + for (int i = 0; i < count; i++) + values[i] = (Float)(values[i] / normalizer); + } + dst = new VBuffer(len, count, values, indices); + } + + public void Dispose() + { + _ldaTrainer.Dispose(); + } + } + + private ColumnType[] InitColumnTypes(int numTopics) + { + Host.Assert(Utils.Size(Infos) > 0); + var types = new ColumnType[Infos.Length]; + for (int c = 0; c < Infos.Length; c++) + types[c] = new VectorType(NumberType.Float, numTopics); + return types; + } + + protected override ColumnType GetColumnTypeCore(int iinfo) + { + Host.Assert(0 <= iinfo & iinfo < Utils.Size(_types)); + return _types[iinfo]; + } + + protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, out Action disposer) + { + Host.AssertValueOrNull(ch); + Host.AssertValue(input); + Host.Assert(0 <= iinfo && iinfo < Infos.Length); + disposer = null; + + return GetTopic(input, iinfo); + } + + private ValueGetter> GetTopic(IRow input, int iinfo) + { + var getSrc = RowCursorUtils.GetVecGetterAs(NumberType.R8, input, Infos[iinfo].Source); + var src = default(VBuffer); + var lda = _ldas[iinfo]; + int numBurninIter = lda.InfoEx.NumBurninIter; + bool reset = lda.InfoEx.ResetRandomGenerator; + return + (ref VBuffer dst) => + { + // REVIEW: This will work, but there are opportunities for caching + // based on input.Counter that are probably worthwhile given how long inference takes. + getSrc(ref src); + lda.Output(ref src, ref dst, numBurninIter, reset); + }; + } + } +} diff --git a/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs b/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs index b90bde76a9..548b80cb8c 100644 --- a/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs @@ -697,7 +697,7 @@ private Delegate MakeGetter(IChannel ch, IRow input, int iinfo, FinderDecorator var keyCounts = _bindings.Infos[iinfo].SrcTypes.Select( t => t.ItemType.KeyCount > 0 ? (uint)t.ItemType.KeyCount : uint.MaxValue).ToArray(); - // REVIEW: Special casing the srcCount==1 case could potentially improve perf. + // REVIEW: Special casing the srcCount==1 case could potentially improve perf. ValueGetter> del = (ref VBuffer dst) => { @@ -990,7 +990,7 @@ public NgramIdFinder Decorate(int iinfo, NgramIdFinder finder) Contracts.Assert(0 <= icol && icol < srcIndices.Length); Contracts.AssertValue(_srcTextGetters[srcIndices[icol]]); var result = finder(ngram, lim, icol, ref more); - // For the hashing NgramIdFinder, a result of -1 indicates that + // For the hashing NgramIdFinder, a result of -1 indicates that // a slot does not exist for the given ngram. We do not pass ngrams // that do not have a slot to the InvertHash collector. if (result != -1) diff --git a/src/Microsoft.ML.Transforms/Text/NgramTransform.cs b/src/Microsoft.ML.Transforms/Text/NgramTransform.cs index 10e4065d4f..546c46479d 100644 --- a/src/Microsoft.ML.Transforms/Text/NgramTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/NgramTransform.cs @@ -376,7 +376,7 @@ private void GetSlotNames(int iinfo, ref VBuffer dst) var unigramNames = new VBuffer(); - // Get the key values of the unigrams. + // Get the key values of the unigrams. Source.Schema.GetMetadata(MetadataUtils.Kinds.KeyValues, Infos[iinfo].Source, ref unigramNames); Host.Check(unigramNames.Length == keyCount); diff --git a/src/Microsoft.ML.Transforms/Text/NgramUtils.cs b/src/Microsoft.ML.Transforms/Text/NgramUtils.cs index dd32fd6c91..8d76a20041 100644 --- a/src/Microsoft.ML.Transforms/Text/NgramUtils.cs +++ b/src/Microsoft.ML.Transforms/Text/NgramUtils.cs @@ -134,7 +134,7 @@ public void GetResult(ref VBuffer dst) _bldr.GetResult(ref dst); } - // Returns false if there is no need to process more ngrams. + // Returns false if there is no need to process more ngrams. private bool ProcessNgrams(int icol) { Contracts.Assert(_queue.Count > 0); @@ -171,8 +171,8 @@ private bool ProcessNgrams(int icol) return true; } - // Uses DFS. When called with i and skips, it assumes that the - // first i terms in the _ngram array are already populated using "skips" skips, + // Uses DFS. When called with i and skips, it assumes that the + // first i terms in the _ngram array are already populated using "skips" skips, // and it adds the (i+1)st term. It then recursively calls ProcessSkipNgrams // to add the next term. private bool ProcessSkipNgrams(int icol, int i, int skips) diff --git a/src/Microsoft.ML.Transforms/Text/SentimentAnalyzerTransform.cs b/src/Microsoft.ML.Transforms/Text/SentimentAnalyzerTransform.cs index 7ff3d84d10..f3471e09e0 100644 --- a/src/Microsoft.ML.Transforms/Text/SentimentAnalyzerTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/SentimentAnalyzerTransform.cs @@ -17,6 +17,7 @@ namespace Microsoft.ML.Runtime.TextAnalytics { + /// public static class SentimentAnalyzingTransform { public sealed class Arguments : TransformInputBase diff --git a/src/Microsoft.ML.Transforms/Text/StopWordsRemoverTransform.cs b/src/Microsoft.ML.Transforms/Text/StopWordsRemoverTransform.cs index 96bf44b4c2..d559430c81 100644 --- a/src/Microsoft.ML.Transforms/Text/StopWordsRemoverTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/StopWordsRemoverTransform.cs @@ -84,8 +84,10 @@ public enum Language Italian = 6, Spanish = 7, Portuguese = 8, +#pragma warning disable MSML_GeneralName // These names correspond to file names, so this is fine in this case. Portuguese_Brazilian = 9, Norwegian_Bokmal = 10, +#pragma warning restore MSML_GeneralName Russian = 11, Polish = 12, Czech = 13, @@ -775,7 +777,7 @@ public CustomStopWordsRemoverTransform(IHostEnvironment env, Arguments args, IDa } /// - /// Public constructor corresponding to SignatureStopWordsRemoverTransform. It accepts arguments of type LoaderArguments, + /// Public constructor corresponding to SignatureStopWordsRemoverTransform. It accepts arguments of type LoaderArguments, /// and a separate array of columns (constructed by the caller -TextTransform- arguments). /// public CustomStopWordsRemoverTransform(IHostEnvironment env, LoaderArguments loaderArgs, IDataView input, OneToOneColumn[] column) diff --git a/src/Microsoft.ML.Transforms/Text/TextTransform.cs b/src/Microsoft.ML.Transforms/Text/TextTransform.cs index b2a34a1126..3f13dd7612 100644 --- a/src/Microsoft.ML.Transforms/Text/TextTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/TextTransform.cs @@ -24,11 +24,10 @@ namespace Microsoft.ML.Runtime.Data using StopWordsLang = StopWordsRemoverTransform.Language; using CaseNormalizationMode = TextNormalizerTransform.CaseNormalizationMode; - /// - /// A transform that turns a collection of text documents into numerical feature vectors. The feature vectors are counts - /// of (word or character) ngrams in a given text. It offers ngram hashing (finding the ngram token string name to feature - /// integer index mapping through hashing) as an option. - /// + // A transform that turns a collection of text documents into numerical feature vectors. The feature vectors are counts + // of (word or character) ngrams in a given text. It offers ngram hashing (finding the ngram token string name to feature + // integer index mapping through hashing) as an option. + /// public static class TextTransform { /// @@ -263,35 +262,15 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV view = new ConcatTransform(h, new ConcatTransform.Arguments() { Column = xfCols }, view); } - if (tparams.NeedsWordTokenizationTransform) - { - var xfCols = new DelimitedTokenizeTransform.Column[textCols.Length]; - wordTokCols = new string[textCols.Length]; - for (int i = 0; i < textCols.Length; i++) - { - var col = new DelimitedTokenizeTransform.Column(); - col.Source = textCols[i]; - col.Name = GenerateColumnName(view.Schema, textCols[i], "WordTokenizer"); - - xfCols[i] = col; - - wordTokCols[i] = col.Name; - tempCols.Add(col.Name); - } - - view = new DelimitedTokenizeTransform(h, new DelimitedTokenizeTransform.Arguments() { Column = xfCols }, view); - } - if (tparams.NeedsNormalizeTransform) { - string[] srcCols = wordTokCols == null ? textCols : wordTokCols; - var xfCols = new TextNormalizerCol[srcCols.Length]; - string[] dstCols = new string[srcCols.Length]; - for (int i = 0; i < srcCols.Length; i++) + var xfCols = new TextNormalizerCol[textCols.Length]; + string[] dstCols = new string[textCols.Length]; + for (int i = 0; i < textCols.Length; i++) { - dstCols[i] = GenerateColumnName(view.Schema, srcCols[i], "TextNormalizer"); + dstCols[i] = GenerateColumnName(view.Schema, textCols[i], "TextNormalizer"); tempCols.Add(dstCols[i]); - xfCols[i] = new TextNormalizerCol() { Source = srcCols[i], Name = dstCols[i] }; + xfCols[i] = new TextNormalizerCol() { Source = textCols[i], Name = dstCols[i] }; } view = new TextNormalizerTransform(h, @@ -304,10 +283,26 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV TextCase = tparams.TextCase }, view); - if (wordTokCols != null) - wordTokCols = dstCols; - else - textCols = dstCols; + textCols = dstCols; + } + + if (tparams.NeedsWordTokenizationTransform) + { + var xfCols = new DelimitedTokenizeTransform.Column[textCols.Length]; + wordTokCols = new string[textCols.Length]; + for (int i = 0; i < textCols.Length; i++) + { + var col = new DelimitedTokenizeTransform.Column(); + col.Source = textCols[i]; + col.Name = GenerateColumnName(view.Schema, textCols[i], "WordTokenizer"); + + xfCols[i] = col; + + wordTokCols[i] = col.Name; + tempCols.Add(col.Name); + } + + view = new DelimitedTokenizeTransform(h, new DelimitedTokenizeTransform.Arguments() { Column = xfCols }, view); } if (tparams.NeedsRemoveStopwordsTransform) @@ -361,7 +356,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV if (tparams.CharExtractorFactory != null) { { - var srcCols = wordTokCols ?? textCols; + var srcCols = tparams.NeedsRemoveStopwordsTransform ? wordTokCols : textCols; charTokCols = new string[srcCols.Length]; var xfCols = new CharTokenizeTransform.Column[srcCols.Length]; for (int i = 0; i < srcCols.Length; i++) diff --git a/src/Microsoft.ML.Transforms/Text/WordBagTransform.cs b/src/Microsoft.ML.Transforms/Text/WordBagTransform.cs index c77ddbb21a..fb56fa2e0a 100644 --- a/src/Microsoft.ML.Transforms/Text/WordBagTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/WordBagTransform.cs @@ -30,7 +30,7 @@ namespace Microsoft.ML.Runtime.Data public delegate void SignatureNgramExtractorFactory(TermLoaderArguments termLoaderArgs); /// - /// A many-to-one column common to both + /// A many-to-one column common to both /// and . /// public sealed class ExtractorColumn : ManyToOneColumn @@ -122,7 +122,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV h.CheckUserArg(args.Tokenizer.IsGood(), nameof(args.Tokenizer), "tokenizer must be specified"); // Compose the WordBagTransform from a tokenize transform, - // followed by a NgramExtractionTransform. + // followed by a NgramExtractionTransform. // Since WordBagTransform is a many-to-one column transform, for each // WordBagTransform.Column with multiple sources, we first apply a ConcatTransform. @@ -180,7 +180,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV } /// - /// A transform that turns a collection of tokenized text (vector of DvText), or vectors of keys into numerical + /// A transform that turns a collection of tokenized text (vector of DvText), or vectors of keys into numerical /// feature vectors. The feature vectors are counts of ngrams (sequences of consecutive *tokens* -words or keys- /// of length 1-n). /// @@ -201,7 +201,7 @@ public sealed class Column : OneToOneColumn public bool? AllLengths; // REVIEW: This argument is actually confusing. If you set only one value we will use this value for all ngrams respectfully e.g. - // if we specify 3 ngrams we will have maxNumTerms * 3. And it also pick first value from this array to run term transform, so if you specify + // if we specify 3 ngrams we will have maxNumTerms * 3. And it also pick first value from this array to run term transform, so if you specify // something like 1,1,10000, term transform would be run with limitation of only one term. [Argument(ArgumentType.Multiple, HelpText = "Maximum number of ngrams to store in the dictionary", ShortName = "max")] public int[] MaxNumTerms = null; @@ -232,7 +232,7 @@ public bool TryUnparse(StringBuilder sb) } /// - /// This class is a merger of and + /// This class is a merger of and /// , with the allLength option removed. /// public abstract class ArgumentsBase @@ -309,7 +309,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV // If the column types of args.column are text, apply term transform to convert them to keys. // Otherwise, skip term transform and apply ngram transform directly. // This logic allows NgramExtractorTransform to handle both text and key input columns. - // Note: ngram transform handles the validation of the types natively (in case the types + // Note: ngram transform handles the validation of the types natively (in case the types // of args.column are not text nor keys). if (termCols.Count > 0) { @@ -471,7 +471,7 @@ public sealed class TermLoaderArguments public interface INgramExtractorFactory { /// - /// Whether the extractor transform created by this factory uses the hashing trick + /// Whether the extractor transform created by this factory uses the hashing trick /// (by using or , for example). /// bool UseHashingTrick { get; } @@ -569,7 +569,7 @@ public static IDataView ApplyConcatOnSources(IHostEnvironment env, ManyToOneColu } /// - /// Generates and returns unique names for columns source. Each element of the returned array is + /// Generates and returns unique names for columns source. Each element of the returned array is /// an array of unique source names per specific column. /// public static string[][] GenerateUniqueSourceNames(IHostEnvironment env, ManyToOneColumn[] columns, ISchema schema) diff --git a/src/Microsoft.ML.Transforms/Text/WordHashBagTransform.cs b/src/Microsoft.ML.Transforms/Text/WordHashBagTransform.cs index 9c43836ce1..507607ffdc 100644 --- a/src/Microsoft.ML.Transforms/Text/WordHashBagTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/WordHashBagTransform.cs @@ -100,8 +100,8 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV // To each input column to the WordHashBagTransform, a tokenize transform is applied, // followed by applying WordHashVectorizeTransform. - // Since WordHashBagTransform is a many-to-one column transform, for each - // WordHashBagTransform.Column we may need to define multiple tokenize transform columns. + // Since WordHashBagTransform is a many-to-one column transform, for each + // WordHashBagTransform.Column we may need to define multiple tokenize transform columns. // NgramHashExtractorTransform may need to define an identical number of HashTransform.Columns. // The intermediate columns are dropped at the end of using a DropColumnsTransform. IDataView view = input; @@ -175,7 +175,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV } /// - /// A transform that turns a collection of tokenized text (vector of DvText) into numerical feature vectors + /// A transform that turns a collection of tokenized text (vector of DvText) into numerical feature vectors /// using the hashing trick. /// public static class NgramHashExtractorTransform @@ -264,7 +264,7 @@ public bool TryUnparse(StringBuilder sb) } /// - /// This class is a merger of and + /// This class is a merger of and /// , with the ordered option, /// the rehashUnigrams option and the allLength option removed. /// @@ -331,7 +331,7 @@ public static IDataTransform Create(IHostEnvironment env, Arguments args, IDataV h.CheckValue(input, nameof(input)); h.CheckUserArg(Utils.Size(args.Column) > 0, nameof(args.Column), "Columns must be specified"); - // To each input column to the NgramHashExtractorArguments, a HashTransform using 31 + // To each input column to the NgramHashExtractorArguments, a HashTransform using 31 // bits (to minimize collisions) is applied first, followed by an NgramHashTransform. IDataView view = input; diff --git a/src/Microsoft.ML.Transforms/Text/WordTokenizeTransform.cs b/src/Microsoft.ML.Transforms/Text/WordTokenizeTransform.cs index 60500d33cc..2e38af34e2 100644 --- a/src/Microsoft.ML.Transforms/Text/WordTokenizeTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/WordTokenizeTransform.cs @@ -35,11 +35,10 @@ public interface ITokenizeTransform : IDataTransform { } - /// - /// The input for this transform is a DvText or a vector of DvTexts, and its output is a vector of DvTexts, - /// corresponding to the tokens in the input text, split using a set of user specified separator characters. - /// Empty strings and strings containing only spaces are dropped. - /// + // The input for this transform is a DvText or a vector of DvTexts, and its output is a vector of DvTexts, + // corresponding to the tokens in the input text, split using a set of user specified separator characters. + // Empty strings and strings containing only spaces are dropped. + /// public sealed class DelimitedTokenizeTransform : OneToOneTransformBase, ITokenizeTransform { public class Column : OneToOneColumn @@ -174,7 +173,7 @@ public DelimitedTokenizeTransform(IHostEnvironment env, Arguments args, IDataVie } /// - /// Public constructor corresponding to SignatureTokenizeTransform. It accepts arguments of type ArgumentsBase, + /// Public constructor corresponding to SignatureTokenizeTransform. It accepts arguments of type ArgumentsBase, /// and a separate array of columns (constructed from the caller -WordBag/WordHashBag- arguments). /// public DelimitedTokenizeTransform(IHostEnvironment env, TokenizeArguments args, IDataView input, OneToOneColumn[] columns) diff --git a/src/Microsoft.ML.Transforms/Text/doc.xml b/src/Microsoft.ML.Transforms/Text/doc.xml new file mode 100644 index 0000000000..5f734e1cfd --- /dev/null +++ b/src/Microsoft.ML.Transforms/Text/doc.xml @@ -0,0 +1,188 @@ + + + + + + + A transform that turns a collection of text documents into numerical feature vectors. + The feature vectors are normalized counts of (word and/or character) ngrams in a given tokenized text. + + + The TextFeaturizer transform gives user one-stop solution for doing: + + Language Detection + Tokenzation​ + Text normalization + Predefined and custom stopwords removal. + Word-based or character-based Ngram and SkipGram extraction.​ + TF, IDF or TF-IDF. + L-p vector normalization.​ + + The TextFeaturizer will show the transformed text, after being applied. + It converts a collection of text columns to a matrix of token ngrams/skip-grams counts. + Features are made of (word/character) n-grams/skip-grams​ and the number of features are equal to the vocabulary size found by analyzing the data. + + + + + + pipeline.Add(new TextFeaturizer("Features", "SentimentText") + { + KeepDiacritics = false, + KeepPunctuations = false, + TextCase = TextNormalizerTransformCaseNormalizationMode.Lower, + OutputTokens = true, + StopWordsRemover = new PredefinedStopWordsRemover(), + VectorNormalizer = TextTransformTextNormKind.L2, + CharFeatureExtractor = new NGramNgramExtractor() { NgramLength = 3, AllLengths = false }, + WordFeatureExtractor = new NGramNgramExtractor() { NgramLength = 2, AllLengths = true } + }); + + + + + + + This transform splits the text into words using the separator character(s). + + + The input for this transform is a DvText or a vector of DvTexts, + and its output is a vector of DvTexts, corresponding to the tokens in the input text. + The output is generated by splitting the input text, using a set of user specified separator characters. + Empty strings and strings containing only spaces are dropped. + This transform is not typically used on its own, but it is one of the transforms composing the Text Featurizer. + + + + + + pipeline.Add( new WordTokenizer("TextColumn") + { + TermSeparators = "' ', '\t', ';'" + }); + + + + + + + This transform produces a bag of counts of n-grams (sequences of consecutive values of length 1-n) in a given vector of keys. + It does so by building a dictionary of n-grams and using the id in the dictionary as the index in the bag. + + + This transform produces a matrix of token ngrams/skip-grams counts for a given corpus of text. + The n-grams are represented as count vectors, with vector slots corresponding to n-grams. + Embedding ngrams in a vector space allows their contents to be compared in an efficient manner. + The slot values in the vector can be weighted by the following factors: + + + term frequency + the number of occurrences of the slot in the text + + + inverse document frequency + a ratio (the logarithm of inverse relative slot frequency) + that measures the information a slot provides by determining how common or rare it is across the entire text. + + + term frequency-inverse document frequency + the product term frequency and the inverse document frequency. + + + This transform is not typically used on its own, but it is one of the transforms composing the Text Featurizer . + + + + + + + + pipeline.Add(new NGramTranslator("TextColumn") + { + Weighting=NgramTransformWeightingCriteria.TfIdf + }); + + + + + + + Uses a pretrained sentiment model to score input strings. + + + The Sentiment transform returns the probability that the sentiment of a natural text is positive. + + The model was trained with the Sentiment-specific word embedding (SSWE) and NGramFeaturizer on Twitter sentiment data, + similarly to the sentiment analysis part of the + Text Analytics cognitive service. + The transform outputs a score between 0 and 1 as a sentiment prediction + (where 0 is a negative sentiment and 1 is a positive sentiment). + Currently it supports only English. + + + + + + pipeline.Add(new SentimentAnalyzer() + { + Source = "TextColumn" + }); + + + + + + + This transform breaks text into individual tokens, each consisting of an individual character. + + + This transform is not typically used on its own, but it is one of the transforms composing the + Text Featurizer. + + + + + + + + pipeline.Add(new CharacterTokenizer("TextCol1" , "TextCol2" )); + + + + + + + The LDA transform implements LightLDA, a state-of-the-art implementation of Latent Dirichlet Allocation. + + + Latent Dirichlet Allocation is a well-known topic modeling algorithm that infers topical structure from text data, + and can be used to featurize any text fields as low-dimensional topical vectors. + LightLDA is an extremely efficient implementation of LDA developed in MSR-Asia that incorporates a number of + optimization techniques. See LightLDA: Big Topic Models on Modest Compute Clusters. + + + With the LDA transform, ML.NET users can train a topic model to produce 1 million topics with 1 million vocabulary + on a 1-billion-token document set one a single machine in a few hours (typically, LDA at this scale takes days and requires large clusters). + The most significant innovation is a super-efficient O(1) Metropolis-Hastings sampling algorithm, + whose running cost is (surprisingly) agnostic of model size, + allowing it to converges nearly an order of magnitude faster than other Gibbs samplers. + + + For more details please see original LightLDA paper, and its open source implementation. + + LightLDA: Big Topic Models on Modest Computer Clusters + LightLDA + + + + + + + + pipeline.Add(new LightLda(("InTextCol" , "OutTextCol"))); + + + + + + diff --git a/src/Microsoft.ML.Transforms/UngroupTransform.cs b/src/Microsoft.ML.Transforms/UngroupTransform.cs index cb97e1c3b3..d77cc48bbd 100644 --- a/src/Microsoft.ML.Transforms/UngroupTransform.cs +++ b/src/Microsoft.ML.Transforms/UngroupTransform.cs @@ -22,28 +22,28 @@ namespace Microsoft.ML.Runtime.Data { - /// - /// This can be thought of as an inverse of . For all specified vector columns - /// ("pivot" columns), performs the "ungroup" (or "unroll") operation as outlined below. - /// - /// If the only pivot column is called P, and has size K, then for every row of the input we will produce - /// K rows, that are identical in all columns except P. The column P will become a scalar column, and this - /// column will hold all the original values of input's P, one value per row, in order. The order of columns - /// will remain the same. - /// - /// Variable-length pivot columns are supported (including zero, which will eliminate the row from the result). - /// - /// Multiple pivot columns are also supported: - /// * A number of output rows is controlled by the 'mode' parameter. - /// - outer: it is equal to the maximum length of pivot columns, - /// - inner: it is equal to the minimum length of pivot columns, - /// - first: it is equal to the length of the first pivot column. - /// * If a particular pivot column has size that is different than the number of output rows, the extra slots will - /// be ignored, and the missing slots will be 'padded' with default values. - /// - /// All metadata is preserved for the retained columns. For 'unrolled' columns, all known metadata - /// except slot names is preserved. - /// + + // This can be thought of as an inverse of GroupTransform. For all specified vector columns + // ("pivot" columns), performs the "ungroup" (or "unroll") operation as outlined below. + // + // If the only pivot column is called P, and has size K, then for every row of the input we will produce + // K rows, that are identical in all columns except P. The column P will become a scalar column, and this + // column will hold all the original values of input's P, one value per row, in order. The order of columns + // will remain the same. + // + // Variable-length pivot columns are supported (including zero, which will eliminate the row from the result). + // + // Multiple pivot columns are also supported: + // * A number of output rows is controlled by the 'mode' parameter. + // - outer: it is equal to the maximum length of pivot columns, + // - inner: it is equal to the minimum length of pivot columns, + // - first: it is equal to the length of the first pivot column. + // * If a particular pivot column has size that is different than the number of output rows, the extra slots will + // be ignored, and the missing slots will be 'padded' with default values. + // + // All metadata is preserved for the retained columns. For 'unrolled' columns, all known metadata + // except slot names is preserved. + /// public sealed class UngroupTransform : TransformBase { public const string Summary = "Un-groups vector columns into sequences of rows, inverse of Group transform"; @@ -61,10 +61,24 @@ private static VersionInfo GetVersionInfo() loaderSignature: LoaderSignature); } + /// + /// Controls the number of output rows produced by the transform + /// public enum UngroupMode { + /// + /// The number of output rows is equal to the minimum length of pivot columns + /// Inner, + + /// + /// The number of output rows is equal to the maximum length of pivot columns + /// Outer, + + /// + /// The number of output rows is equal to the length of the first pivot column. + /// First } @@ -79,6 +93,18 @@ public sealed class Arguments : TransformInputBase private readonly SchemaImpl _schemaImpl; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Specifies how to unroll multiple pivot columns of different size. + /// Columns to unroll, or 'pivot' + public UngroupTransform(IHostEnvironment env, IDataView input, UngroupMode mode, params string[] columns) + : this(env, new Arguments() { Column = columns, Mode = mode }, input) + { + } + public UngroupTransform(IHostEnvironment env, Arguments args, IDataView input) : base(env, LoaderSignature, input) { @@ -145,8 +171,8 @@ public override ISchema Schema return null; } - // Technically, we could shuffle the ungrouped data if the source can shuffle. However, we want to maintain - // contiguous groups. There's also a question whether we should shuffle inside groups or just shuffle groups + // Technically, we could shuffle the ungrouped data if the source can shuffle. However, we want to maintain + // contiguous groups. There's also a question whether we should shuffle inside groups or just shuffle groups // themselves. With these issues, and no anticipated use for shuffled version, it's safer to not shuffle at all. public override bool CanShuffle { @@ -434,7 +460,7 @@ private sealed class Cursor : LinkedRootCursorBase, IRowCursor // For each pivot column that we care about, these getters return the vector size. private readonly Func[] _sizeGetters; - // As a side effect, getters also populate these actual sizes of the necessary pivot columns on MoveNext. + // As a side effect, getters also populate these actual sizes of the necessary pivot columns on MoveNext. // Parallel to columns. private int[] _colSizes; @@ -584,7 +610,7 @@ private ValueGetter MakeGetter(int col, PrimitiveType itemType) var srcGetter = Input.GetGetter>(col); // The position of the source cursor. Used to extract the source row once. long cachedPosition = -1; - // The position inside the sparse row. If the row is sparse, the invariant is + // The position inside the sparse row. If the row is sparse, the invariant is // cachedIndex == row.Count || _pivotColPosition <= row.Indices[cachedIndex]. int cachedIndex = 0; VBuffer row = default(VBuffer); @@ -627,7 +653,12 @@ private ValueGetter MakeGetter(int col, PrimitiveType itemType) public static partial class GroupingOperations { - [TlcModule.EntryPoint(Name = "Transforms.Segregator", Desc = UngroupTransform.Summary, UserName = UngroupTransform.UserName, ShortName = UngroupTransform.ShortName)] + [TlcModule.EntryPoint(Name = "Transforms.Segregator", + Desc = UngroupTransform.Summary, + UserName = UngroupTransform.UserName, + ShortName = UngroupTransform.ShortName, + XmlInclude = new[] { @"", + @""})] public static CommonOutputs.TransformOutput Ungroup(IHostEnvironment env, UngroupTransform.Arguments input) { Contracts.CheckValue(env, nameof(env)); diff --git a/src/Microsoft.ML.Transforms/WhiteningTransform.cs b/src/Microsoft.ML.Transforms/WhiteningTransform.cs index 2ae3824ba8..6854157f31 100644 --- a/src/Microsoft.ML.Transforms/WhiteningTransform.cs +++ b/src/Microsoft.ML.Transforms/WhiteningTransform.cs @@ -40,31 +40,40 @@ public enum WhiteningKind /// 1. Decorrelation of the input data. Input data is assumed to have zero mean. /// 2. Rescale decorrelated features to have unit variance. /// That is, PCA whitening is essentially just a PCA + rescale. - /// ZCA whitening tries to make resulting data to look more like input data by rotating it back to the + /// ZCA whitening tries to make resulting data to look more like input data by rotating it back to the /// original input space. - /// More information: + /// More information: http://ufldl.stanford.edu/wiki/index.php/Whitening /// public sealed class WhiteningTransform : OneToOneTransformBase { + private static class Defaults + { + public const WhiteningKind Kind = WhiteningKind.Zca; + public const Float Eps = (Float)1e-5; + public const int MaxRows = 100 * 1000; + public const bool SaveInverse = false; + public const int PcaNum = 0; + } + public sealed class Arguments { [Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)] public Column[] Column; [Argument(ArgumentType.AtMostOnce, HelpText = "Whitening kind (PCA/ZCA)")] - public WhiteningKind Kind = WhiteningKind.Zca; + public WhiteningKind Kind = Defaults.Kind; [Argument(ArgumentType.AtMostOnce, HelpText = "Scaling regularizer")] - public Float Eps = (Float)1e-5; + public Float Eps = Defaults.Eps; [Argument(ArgumentType.AtMostOnce, HelpText = "Max number of rows", ShortName = "rows")] - public int MaxRows = 100 * 1000; + public int MaxRows = Defaults.MaxRows; [Argument(ArgumentType.AtMostOnce, HelpText = "Whether to save inverse (recovery) matrix", ShortName = "saveInv")] - public bool SaveInverse = false; + public bool SaveInverse = Defaults.SaveInverse; [Argument(ArgumentType.AtMostOnce, HelpText = "PCA components to retain")] - public int PcaNum = 0; + public int PcaNum = Defaults.PcaNum; // REVIEW: add the following options: // 1. Currently there is no way to apply an inverse transform AFTER the the transform is trained. @@ -209,6 +218,23 @@ private static VersionInfo GetVersionInfo() private const string RegistrationName = "Whitening"; + /// + /// Convenience constructor for public facing API. + /// + /// Host Environment. + /// Input . This is the output from previous transform or loader. + /// Name of the output column. + /// Name of the column to be transformed. If this is null '' will be used. + /// Whitening kind (PCA/ZCA). + public WhiteningTransform(IHostEnvironment env, + IDataView input, + string name, + string source = null, + WhiteningKind kind = Defaults.Kind) + : this(env, new Arguments() { Column = new[] { new Column() { Source = source ?? name, Name = name } }, Kind = kind }, input) + { + } + /// /// Public constructor corresponding to SignatureDataTransform. /// diff --git a/src/Microsoft.ML.Transforms/doc.xml b/src/Microsoft.ML.Transforms/doc.xml new file mode 100644 index 0000000000..63d2765afc --- /dev/null +++ b/src/Microsoft.ML.Transforms/doc.xml @@ -0,0 +1,344 @@ + + + + + + + Encodes the categorical variable with hash-based encoding. + + + CategoricalHashOneHotVectorizer converts a categorical value into an indicator array by hashing the value and using the hash as an index in the bag. + If the input column is a vector, a single indicator bag is returned for it. + + + + + + pipeline.Add(new CategoricalHashOneHotVectorizer("Text1") + { + HashBits = 10, + Seed = 314489979, + OutputKind = CategoricalTransformOutputKind.Bag + }); + + + + + + + Converts the categorical value into an indicator array by building a dictionary of categories based on the data and using the id in the dictionary as the index in the array + + + The CategoricalOneHotVectorizer transform passes through a data set, operating on text columns, to + build a dictionary of categories. + For each row, the entire text string appearing in the input column is defined as a category. + The output of this transform is an indicator vector. + Each slot in this vector corresponds to a category in the dictionary, so its length is the size of the built dictionary. + The CategoricalOneHotVectorizer can be applied to one or more columns, in which case it builds and uses a separate dictionary + for each column that it is applied to. + + The produces integer values and KeyType columns. + The Key value is the one-based index of the slot set in the Ind/Bag options. + If the Key option is not found, it is assigned the value zero. + In the , options are not found, they result in an all zero bit vector. + and differ simply in how the bit-vectors generated from individual slots are aggregated: + for Ind they are concatenated and for Bag they are added. + When the source column is a singleton, the Ind and Bag options are identical. + + + + + An example of how to add the CategoricalOneHotVectorizer transform to a pipeline with two text column + features named "Text1" and "Text2". + + pipeline.Add(new CategoricalOneHotVectorizer("Text1", "Text1")); + + + + + + + Selects the slots for which the count of non-default values is greater than or equal to a threshold. + + + + This transform uses a set of aggregators to count the number of non-default values for each slot and + instantiates a to actually drop the slots. + This transform is useful when applied together with a . + The count feature selection can remove those features generated by the hash transform that have no data in the examples. + + + + + + + pipeline.Add(new FeatureSelectorByCount + { + Column = new[]{ "Feature1" }, + Count = 2 + }); + + + + + + + Selects the top k slots across all specified columns ordered by their mutual information with the label column. + + + + The mutual information of two random variables X and Y is a measure of the mutual dependence between the variables. + Formally, the mutual information can be written as: + + I(X;Y) = E[log(p(x,y)) - log(p(x)) - log(p(y))] + where the expectation is taken over the joint distribution of X and Y. + Here p(x,y) is the joint probability density function of X and Y, p(x) and p(y) are the marginal probability density functions of X and Y respectively. + In general, a higher mutual information between the dependent variable (or label) and an independent variable (or feature) means + that the label has higher mutual dependence over that feature. + It keeps the top SlotsInOutput features with the largest mutual information with the label. + + + + + + + pipeline.Add(new FeatureSelectorByMutualInformation + { + Column = new[]{ "Feature1" }, + SlotsInOutput = 6 + }); + + + + + + + Creates a new column with the specified type and default values. + + + If the user wish to create additional columns with a particular type and default values, or replicated the values from one column to another, changing their type, they can do so using this transform. + This transform can be used as a workaround to create a Label column after deserializing a model, for prediction. + Some transforms in the serialized model operate on the Label column, and would throw errors during prediction if such a column is not found. + + + + + + pipeline.Add(new OptionalColumnCreator + { + Column = new[]{ "OptColumn"} + }); + + + + + + + Converts multiple column values into hashes. + This transform accepts both numeric and text inputs, both single and vector-valued columns. + + + This transform can be helpful for ranking and cross-validation. In the case of ranking, where the GroupIdColumn column is required, + and needs to be of a key type you can use the to hash the text value of a single GroupID column into a key value. + If the GroupID is the combination of the values from multiple columns, you can use the HashConverter to hash multiple text columns into one key column. + Similarly with CrossValidator and the StratificationColumn. + + + + + + pipeline.Add(new HashConverter("Column1", "Column2")); + + + + + + + Removes missing values from vector type columns. + + + + + + + pipeline.Add(new MissingValuesDropper("Column1")); + + + + + + + This transform can transform either scalars or vectors (both fixed and variable size), + creating output columns that indicate, through the true/false booleans whether the row has a missing value. + + + + + + + pipeline.Add(new MissingValueIndicator("Column1")); + + + + + + + Create an output column of the same type and size of the input column, + where missing values are replaced with either the default value or the mean/min/max value (for non-text columns only). + + + This transform can transform either scalars or vectors (both fixed and variable size), + creating output columns that are identical to the input columns except for replacing NA values + with either the default value, user input, or imputed values (min/max/mean are currently supported). + Imputation modes are supported for vectors both by slot and across all slots. + + + + + + + pipeline.Add(new MissingValueSubstitutor("FeatureCol") + { + ReplacementKind = NAReplaceTransformReplacementKind.Mean + }); + + + + + + + The LpNormalizer transforms, normalizes vectors (rows) individually by rescaling them to unit norm (L2, L1 or LInf). + Performs the following operation on a vector X: + Y = (X - M) / D + where M is mean and D is either L2 norm, L1 norm or LInf norm. + + + Scaling inputs to unit norms is a common operation for text classification or clustering. + For more information see: + + + + + pipeline.Add(new LpNormalizer("FeatureCol") + { + NormKind = LpNormNormalizerTransformNormalizerKind.L1Norm + }); + + + + + + + Performs a global contrast normalization on input values: + Y = (s * X - M) / D + where s is a scale, M is mean and D is either the L2 norm or standard deviation. + + + Scaling inputs to unit norms is a common operation for text classification or clustering. + For more information see: + + + + + pipeline.Add(new GlobalContrastNormalizer("FeatureCol") + { + SubMean= false + }); + + + + + + + Un-groups vector columns into sequences of rows, inverse of Group transform. + + + This can be thought of as an inverse of the . + For all specified vector columns ("pivot" columns), performs the "ungroup" (or "unroll") operation as outlined below. + + If the only pivot column is called P, and has size K, then for every row of the input we will produce + K rows, that are identical in all columns except P. The column P will become a scalar column, and this + column will hold all the original values of input's P, one value per row, in order. The order of columns + will remain the same. + + Variable-length pivot columns are supported (including zero, which will eliminate the row from the result). + Multiple pivot columns are also supported: + + A number of output rows is controlled by the 'mode' parameter. + + outer it is equal to the maximum length of pivot columns + inner it is equal to the minimum length of pivot columns + first it is equal to the length of the first pivot column + + + + + If a particular pivot column has size that is different than the number of output rows, the extra slots will + be ignored, and the missing slots will be 'padded' with default values. + + + All metadata are preserved for the retained columns. For 'unrolled' columns, all known metadata + except slot names are preserved. + + + + + + + pipeline.Add(new Segregator + { + Column = new[]{"Column1" }, + Mode = UngroupTransformUngroupMode.First + }); + + + + + + + Helps retrieving the original values from a key column. + + + The KeyToTextConverter is the complement of the transform. + Since key values are an enumeration into the set of keys, most transforms that produce key valued outputs + corresponding to input values will often, wherever possible, associate a piece of KeyValue metadata with that dataset. + Transforming values into a categorical variable would be of limited use, + if we couldn't somehow backtrack to figure out what those categories actually mean. + The KeyToTextConverter enables that functionality. + + + + + + pipeline.Add(new KeyToTextConverter(("InColumn", "OutColumn" ))); + + + + + + + Groups values of a scalar column into a vector, by a contiguous group ID. + + + The CombinerByContiguousGroupId transform groups the consecutive rows that share the specified group key (or keys). + Both group keys and the aggregated values can be of arbitrary non-vector types. + The resulting data will have all the group key columns preserved, + and the aggregated columns will become variable-length vectors of the original types. + This transform essentially performs the following SQL-like operation: + SELECT GroupKey1, GroupKey2, ... GroupKeyK, LIST(Value1), LIST(Value2), ... LIST(ValueN) + FROM Data + GROUP BY GroupKey1, GroupKey2, ... GroupKeyK. + + + + + pipeline.Add(new CombinerByContiguousGroupId + { + GroupKey = new []{"Key1", "Key2" } + }); + + + + + + \ No newline at end of file diff --git a/src/Microsoft.ML/CSharpApi.cs b/src/Microsoft.ML/CSharpApi.cs index c103a96475..3ac9a2acfb 100644 --- a/src/Microsoft.ML/CSharpApi.cs +++ b/src/Microsoft.ML/CSharpApi.cs @@ -106,6 +106,18 @@ public void Add(Microsoft.ML.Models.AnomalyDetectionEvaluator input, Microsoft.M _jsonNodes.Add(Serialize("Models.AnomalyDetectionEvaluator", input, output)); } + public Microsoft.ML.Models.AnomalyPipelineEnsemble.Output Add(Microsoft.ML.Models.AnomalyPipelineEnsemble input) + { + var output = new Microsoft.ML.Models.AnomalyPipelineEnsemble.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Models.AnomalyPipelineEnsemble input, Microsoft.ML.Models.AnomalyPipelineEnsemble.Output output) + { + _jsonNodes.Add(Serialize("Models.AnomalyPipelineEnsemble", input, output)); + } + public Microsoft.ML.Models.BinaryClassificationEvaluator.Output Add(Microsoft.ML.Models.BinaryClassificationEvaluator input) { var output = new Microsoft.ML.Models.BinaryClassificationEvaluator.Output(); @@ -130,6 +142,30 @@ public void Add(Microsoft.ML.Models.BinaryCrossValidator input, Microsoft.ML.Mod _jsonNodes.Add(Serialize("Models.BinaryCrossValidator", input, output)); } + public Microsoft.ML.Models.BinaryEnsemble.Output Add(Microsoft.ML.Models.BinaryEnsemble input) + { + var output = new Microsoft.ML.Models.BinaryEnsemble.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Models.BinaryEnsemble input, Microsoft.ML.Models.BinaryEnsemble.Output output) + { + _jsonNodes.Add(Serialize("Models.BinaryEnsemble", input, output)); + } + + public Microsoft.ML.Models.BinaryPipelineEnsemble.Output Add(Microsoft.ML.Models.BinaryPipelineEnsemble input) + { + var output = new Microsoft.ML.Models.BinaryPipelineEnsemble.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Models.BinaryPipelineEnsemble input, Microsoft.ML.Models.BinaryPipelineEnsemble.Output output) + { + _jsonNodes.Add(Serialize("Models.BinaryPipelineEnsemble", input, output)); + } + public Microsoft.ML.Models.ClassificationEvaluator.Output Add(Microsoft.ML.Models.ClassificationEvaluator input) { var output = new Microsoft.ML.Models.ClassificationEvaluator.Output(); @@ -202,6 +238,18 @@ public void Add(Microsoft.ML.Models.DatasetTransformer input, Microsoft.ML.Model _jsonNodes.Add(Serialize("Models.DatasetTransformer", input, output)); } + public Microsoft.ML.Models.EnsembleSummary.Output Add(Microsoft.ML.Models.EnsembleSummary input) + { + var output = new Microsoft.ML.Models.EnsembleSummary.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Models.EnsembleSummary input, Microsoft.ML.Models.EnsembleSummary.Output output) + { + _jsonNodes.Add(Serialize("Models.EnsembleSummary", input, output)); + } + public Microsoft.ML.Models.FixedPlattCalibrator.Output Add(Microsoft.ML.Models.FixedPlattCalibrator input) { var output = new Microsoft.ML.Models.FixedPlattCalibrator.Output(); @@ -214,6 +262,18 @@ public void Add(Microsoft.ML.Models.FixedPlattCalibrator input, Microsoft.ML.Mod _jsonNodes.Add(Serialize("Models.FixedPlattCalibrator", input, output)); } + public Microsoft.ML.Models.MultiClassPipelineEnsemble.Output Add(Microsoft.ML.Models.MultiClassPipelineEnsemble input) + { + var output = new Microsoft.ML.Models.MultiClassPipelineEnsemble.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Models.MultiClassPipelineEnsemble input, Microsoft.ML.Models.MultiClassPipelineEnsemble.Output output) + { + _jsonNodes.Add(Serialize("Models.MultiClassPipelineEnsemble", input, output)); + } + public Microsoft.ML.Models.MultiOutputRegressionEvaluator.Output Add(Microsoft.ML.Models.MultiOutputRegressionEvaluator input) { var output = new Microsoft.ML.Models.MultiOutputRegressionEvaluator.Output(); @@ -334,6 +394,18 @@ public void Add(Microsoft.ML.Models.RankerEvaluator input, Microsoft.ML.Models.R _jsonNodes.Add(Serialize("Models.RankerEvaluator", input, output)); } + public Microsoft.ML.Models.RegressionEnsemble.Output Add(Microsoft.ML.Models.RegressionEnsemble input) + { + var output = new Microsoft.ML.Models.RegressionEnsemble.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Models.RegressionEnsemble input, Microsoft.ML.Models.RegressionEnsemble.Output output) + { + _jsonNodes.Add(Serialize("Models.RegressionEnsemble", input, output)); + } + public Microsoft.ML.Models.RegressionEvaluator.Output Add(Microsoft.ML.Models.RegressionEvaluator input) { var output = new Microsoft.ML.Models.RegressionEvaluator.Output(); @@ -346,6 +418,18 @@ public void Add(Microsoft.ML.Models.RegressionEvaluator input, Microsoft.ML.Mode _jsonNodes.Add(Serialize("Models.RegressionEvaluator", input, output)); } + public Microsoft.ML.Models.RegressionPipelineEnsemble.Output Add(Microsoft.ML.Models.RegressionPipelineEnsemble input) + { + var output = new Microsoft.ML.Models.RegressionPipelineEnsemble.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Models.RegressionPipelineEnsemble input, Microsoft.ML.Models.RegressionPipelineEnsemble.Output output) + { + _jsonNodes.Add(Serialize("Models.RegressionPipelineEnsemble", input, output)); + } + public Microsoft.ML.Models.Summarizer.Output Add(Microsoft.ML.Models.Summarizer input) { var output = new Microsoft.ML.Models.Summarizer.Output(); @@ -406,6 +490,42 @@ public void Add(Microsoft.ML.Trainers.AveragedPerceptronBinaryClassifier input, _jsonNodes.Add(Serialize("Trainers.AveragedPerceptronBinaryClassifier", input, output)); } + public Microsoft.ML.Trainers.EnsembleBinaryClassifier.Output Add(Microsoft.ML.Trainers.EnsembleBinaryClassifier input) + { + var output = new Microsoft.ML.Trainers.EnsembleBinaryClassifier.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.EnsembleBinaryClassifier input, Microsoft.ML.Trainers.EnsembleBinaryClassifier.Output output) + { + _jsonNodes.Add(Serialize("Trainers.EnsembleBinaryClassifier", input, output)); + } + + public Microsoft.ML.Trainers.EnsembleClassification.Output Add(Microsoft.ML.Trainers.EnsembleClassification input) + { + var output = new Microsoft.ML.Trainers.EnsembleClassification.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.EnsembleClassification input, Microsoft.ML.Trainers.EnsembleClassification.Output output) + { + _jsonNodes.Add(Serialize("Trainers.EnsembleClassification", input, output)); + } + + public Microsoft.ML.Trainers.EnsembleRegression.Output Add(Microsoft.ML.Trainers.EnsembleRegression input) + { + var output = new Microsoft.ML.Trainers.EnsembleRegression.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.EnsembleRegression input, Microsoft.ML.Trainers.EnsembleRegression.Output output) + { + _jsonNodes.Add(Serialize("Trainers.EnsembleRegression", input, output)); + } + public Microsoft.ML.Trainers.FastForestBinaryClassifier.Output Add(Microsoft.ML.Trainers.FastForestBinaryClassifier input) { var output = new Microsoft.ML.Trainers.FastForestBinaryClassifier.Output(); @@ -478,6 +598,18 @@ public void Add(Microsoft.ML.Trainers.FastTreeTweedieRegressor input, Microsoft. _jsonNodes.Add(Serialize("Trainers.FastTreeTweedieRegressor", input, output)); } + public Microsoft.ML.Trainers.FieldAwareFactorizationMachineBinaryClassifier.Output Add(Microsoft.ML.Trainers.FieldAwareFactorizationMachineBinaryClassifier input) + { + var output = new Microsoft.ML.Trainers.FieldAwareFactorizationMachineBinaryClassifier.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.FieldAwareFactorizationMachineBinaryClassifier input, Microsoft.ML.Trainers.FieldAwareFactorizationMachineBinaryClassifier.Output output) + { + _jsonNodes.Add(Serialize("Trainers.FieldAwareFactorizationMachineBinaryClassifier", input, output)); + } + public Microsoft.ML.Trainers.GeneralizedAdditiveModelBinaryClassifier.Output Add(Microsoft.ML.Trainers.GeneralizedAdditiveModelBinaryClassifier input) { var output = new Microsoft.ML.Trainers.GeneralizedAdditiveModelBinaryClassifier.Output(); @@ -514,6 +646,54 @@ public void Add(Microsoft.ML.Trainers.KMeansPlusPlusClusterer input, Microsoft.M _jsonNodes.Add(Serialize("Trainers.KMeansPlusPlusClusterer", input, output)); } + public Microsoft.ML.Trainers.LightGbmBinaryClassifier.Output Add(Microsoft.ML.Trainers.LightGbmBinaryClassifier input) + { + var output = new Microsoft.ML.Trainers.LightGbmBinaryClassifier.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.LightGbmBinaryClassifier input, Microsoft.ML.Trainers.LightGbmBinaryClassifier.Output output) + { + _jsonNodes.Add(Serialize("Trainers.LightGbmBinaryClassifier", input, output)); + } + + public Microsoft.ML.Trainers.LightGbmClassifier.Output Add(Microsoft.ML.Trainers.LightGbmClassifier input) + { + var output = new Microsoft.ML.Trainers.LightGbmClassifier.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.LightGbmClassifier input, Microsoft.ML.Trainers.LightGbmClassifier.Output output) + { + _jsonNodes.Add(Serialize("Trainers.LightGbmClassifier", input, output)); + } + + public Microsoft.ML.Trainers.LightGbmRanker.Output Add(Microsoft.ML.Trainers.LightGbmRanker input) + { + var output = new Microsoft.ML.Trainers.LightGbmRanker.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.LightGbmRanker input, Microsoft.ML.Trainers.LightGbmRanker.Output output) + { + _jsonNodes.Add(Serialize("Trainers.LightGbmRanker", input, output)); + } + + public Microsoft.ML.Trainers.LightGbmRegressor.Output Add(Microsoft.ML.Trainers.LightGbmRegressor input) + { + var output = new Microsoft.ML.Trainers.LightGbmRegressor.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Trainers.LightGbmRegressor input, Microsoft.ML.Trainers.LightGbmRegressor.Output output) + { + _jsonNodes.Add(Serialize("Trainers.LightGbmRegressor", input, output)); + } + public Microsoft.ML.Trainers.LinearSvmBinaryClassifier.Output Add(Microsoft.ML.Trainers.LinearSvmBinaryClassifier input) { var output = new Microsoft.ML.Trainers.LinearSvmBinaryClassifier.Output(); @@ -958,6 +1138,18 @@ public void Add(Microsoft.ML.Transforms.LabelToFloatConverter input, Microsoft.M _jsonNodes.Add(Serialize("Transforms.LabelToFloatConverter", input, output)); } + public Microsoft.ML.Transforms.LightLda.Output Add(Microsoft.ML.Transforms.LightLda input) + { + var output = new Microsoft.ML.Transforms.LightLda.Output(); + Add(input, output); + return output; + } + + public void Add(Microsoft.ML.Transforms.LightLda input, Microsoft.ML.Transforms.LightLda.Output output) + { + _jsonNodes.Add(Serialize("Transforms.LightLda", input, output)); + } + public Microsoft.ML.Transforms.LogMeanVarianceNormalizer.Output Add(Microsoft.ML.Transforms.LogMeanVarianceNormalizer input) { var output = new Microsoft.ML.Transforms.LogMeanVarianceNormalizer.Output(); @@ -1461,57 +1653,84 @@ public sealed class Output namespace Data { - public sealed partial class TextLoaderArguments + public enum DataKind : byte { - /// - /// Use separate parsing threads? - /// - public bool UseThreads { get; set; } = true; + I1 = 1, + U1 = 2, + I2 = 3, + U2 = 4, + I4 = 5, + U4 = 6, + I8 = 7, + U8 = 8, + R4 = 9, + Num = 9, + R8 = 10, + TX = 11, + Text = 11, + TXT = 11, + BL = 12, + Bool = 12, + TimeSpan = 13, + TS = 13, + DT = 14, + DateTime = 14, + DZ = 15, + DateTimeZone = 15, + UG = 16, + U16 = 16 + } + public sealed partial class TextLoaderRange + { /// - /// File containing a header with feature names. If specified, header defined in the data file (header+) is ignored. + /// First index in the range /// - public string HeaderFile { get; set; } + public int Min { get; set; } /// - /// Maximum number of rows to produce + /// Last index in the range /// - public long? MaxRows { get; set; } + public int? Max { get; set; } /// - /// Whether the input may include quoted values, which can contain separator characters, colons, and distinguish empty values from missing values. When true, consecutive separators denote a missing value and an empty value is denoted by "". When false, consecutive separators denote an empty value. + /// This range extends to the end of the line, but should be a fixed number of items /// - public bool AllowQuoting { get; set; } = true; + public bool AutoEnd { get; set; } = false; /// - /// Whether the input may include sparse representations + /// This range extends to the end of the line, which can vary from line to line /// - public bool AllowSparse { get; set; } = true; + public bool VariableEnd { get; set; } = false; /// - /// Number of source columns in the text data. Default is that sparse rows contain their size information. + /// This range includes only other indices not specified /// - public int? InputSize { get; set; } + public bool AllOther { get; set; } = false; /// - /// Source column separator. + /// Force scalar columns to be treated as vectors of length one /// - public char[] Separator { get; set; } = { '\t' }; + public bool ForceVector { get; set; } = false; + + } + public sealed partial class KeyRange + { /// - /// Column groups. Each group is specified as name:type:numeric-ranges, eg, col=Features:R4:1-17,26,35-40 + /// First index in the range /// - public TextLoaderColumn[] Column { get; set; } + public ulong Min { get; set; } = 0; /// - /// Remove trailing whitespace from lines + /// Last index in the range /// - public bool TrimWhitespace { get; set; } = false; + public ulong? Max { get; set; } /// - /// Data file has header with feature names. Header is read only if options 'hs' and 'hf' are not specified. + /// Whether the key is contiguous /// - public bool HasHeader { get; set; } = false; + public bool Contiguous { get; set; } = true; } @@ -1539,56 +1758,57 @@ public sealed partial class TextLoaderColumn } - public sealed partial class TextLoaderRange + public sealed partial class TextLoaderArguments { /// - /// First index in the range + /// Use separate parsing threads? /// - public int Min { get; set; } + public bool UseThreads { get; set; } = true; /// - /// Last index in the range + /// File containing a header with feature names. If specified, header defined in the data file (header+) is ignored. /// - public int? Max { get; set; } + public string HeaderFile { get; set; } /// - /// This range extends to the end of the line, but should be a fixed number of items + /// Maximum number of rows to produce /// - public bool AutoEnd { get; set; } = false; + public long? MaxRows { get; set; } /// - /// This range extends to the end of the line, which can vary from line to line + /// Whether the input may include quoted values, which can contain separator characters, colons, and distinguish empty values from missing values. When true, consecutive separators denote a missing value and an empty value is denoted by "". When false, consecutive separators denote an empty value. /// - public bool VariableEnd { get; set; } = false; + public bool AllowQuoting { get; set; } = true; /// - /// This range includes only other indices not specified + /// Whether the input may include sparse representations /// - public bool AllOther { get; set; } = false; + public bool AllowSparse { get; set; } = true; /// - /// Force scalar columns to be treated as vectors of length one + /// Number of source columns in the text data. Default is that sparse rows contain their size information. /// - public bool ForceVector { get; set; } = false; + public int? InputSize { get; set; } - } + /// + /// Source column separator. + /// + public char[] Separator { get; set; } = { '\t' }; - public sealed partial class KeyRange - { /// - /// First index in the range + /// Column groups. Each group is specified as name:type:numeric-ranges, eg, col=Features:R4:1-17,26,35-40 /// - public ulong Min { get; set; } = 0; + public TextLoaderColumn[] Column { get; set; } /// - /// Last index in the range + /// Remove trailing whitespace from lines /// - public ulong? Max { get; set; } + public bool TrimWhitespace { get; set; } = false; /// - /// Whether the key is contiguous + /// Data file has header with feature names. Header is read only if options 'hs' and 'hf' are not specified. /// - public bool Contiguous { get; set; } = true; + public bool HasHeader { get; set; } = false; } @@ -1640,7 +1860,7 @@ public TextLoaderPipelineStep (Output output) /// /// Arguments /// - public Microsoft.ML.Data.TextLoaderArguments Arguments { get; set; } = new Microsoft.ML.Data.TextLoaderArguments(); + public TextLoaderArguments Arguments { get; set; } = new TextLoaderArguments(); public sealed class Output @@ -1770,25 +1990,63 @@ public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IEva namespace Models { + public enum EnsembleCreatorScoreCombiner + { + Median = 0, + Average = 1 + } + /// - /// Evaluates a binary classification scored dataset. + /// Combine anomaly detection models into an ensemble /// - public sealed partial class BinaryClassificationEvaluator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IEvaluatorInput + public sealed partial class AnomalyPipelineEnsemble { /// - /// Probability column name + /// The combiner used to combine the scores /// - public string ProbabilityColumn { get; set; } + public EnsembleCreatorScoreCombiner ModelCombiner { get; set; } = EnsembleCreatorScoreCombiner.Average; /// - /// Probability value for classification thresholding + /// The models to combine into an ensemble /// - public float Threshold { get; set; } + public ArrayVar Models { get; set; } = new ArrayVar(); - /// + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IAnomalyDetectionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + } + } + + namespace Models + { + + /// + /// Evaluates a binary classification scored dataset. + /// + public sealed partial class BinaryClassificationEvaluator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IEvaluatorInput + { + + + /// + /// Probability column name + /// + public string ProbabilityColumn { get; set; } + + /// + /// Probability value for classification thresholding + /// + public float Threshold { get; set; } + + /// /// Use raw score value instead of probability for classification thresholding /// public bool UseRawScoreThreshold { get; set; } = true; @@ -1906,12 +2164,12 @@ public sealed partial class BinaryCrossValidator /// /// The training subgraph inputs /// - public Microsoft.ML.Models.CrossValidationBinaryMacroSubGraphInput Inputs { get; set; } = new Microsoft.ML.Models.CrossValidationBinaryMacroSubGraphInput(); + public CrossValidationBinaryMacroSubGraphInput Inputs { get; set; } = new CrossValidationBinaryMacroSubGraphInput(); /// /// The training subgraph outputs /// - public Microsoft.ML.Models.CrossValidationBinaryMacroSubGraphOutput Outputs { get; set; } = new Microsoft.ML.Models.CrossValidationBinaryMacroSubGraphOutput(); + public CrossValidationBinaryMacroSubGraphOutput Outputs { get; set; } = new CrossValidationBinaryMacroSubGraphOutput(); /// /// Column to use for stratification @@ -1955,6 +2213,82 @@ public sealed class Output } } + namespace Models + { + public enum EnsembleCreatorClassifierCombiner + { + Median = 0, + Average = 1, + Vote = 2 + } + + + /// + /// Combine binary classifiers into an ensemble + /// + public sealed partial class BinaryEnsemble + { + + + /// + /// The combiner used to combine the scores + /// + public EnsembleCreatorClassifierCombiner ModelCombiner { get; set; } = EnsembleCreatorClassifierCombiner.Median; + + /// + /// The models to combine into an ensemble + /// + public ArrayVar Models { get; set; } = new ArrayVar(); + + /// + /// Whether to validate that all the pipelines are identical + /// + public bool ValidatePipelines { get; set; } = true; + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + } + } + + namespace Models + { + + /// + /// Combine binary classification models into an ensemble + /// + public sealed partial class BinaryPipelineEnsemble + { + + + /// + /// The combiner used to combine the scores + /// + public EnsembleCreatorClassifierCombiner ModelCombiner { get; set; } = EnsembleCreatorClassifierCombiner.Median; + + /// + /// The models to combine into an ensemble + /// + public ArrayVar Models { get; set; } = new ArrayVar(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + } + } + namespace Models { @@ -2175,10 +2509,15 @@ public sealed partial class CrossValidationResultsCombiner /// public Microsoft.ML.Runtime.EntryPoints.Optional GroupColumn { get; set; } + /// + /// Name column name + /// + public Microsoft.ML.Runtime.EntryPoints.Optional NameColumn { get; set; } + /// /// Specifies the trainer kind, which determines the evaluator to be used. /// - public Microsoft.ML.Models.MacroUtilsTrainerKinds Kind { get; set; } = Microsoft.ML.Models.MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; + public MacroUtilsTrainerKinds Kind { get; set; } = MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; public sealed class Output @@ -2258,12 +2597,12 @@ public sealed partial class CrossValidator /// /// The training subgraph inputs /// - public Microsoft.ML.Models.CrossValidationMacroSubGraphInput Inputs { get; set; } = new Microsoft.ML.Models.CrossValidationMacroSubGraphInput(); + public CrossValidationMacroSubGraphInput Inputs { get; set; } = new CrossValidationMacroSubGraphInput(); /// /// The training subgraph outputs /// - public Microsoft.ML.Models.CrossValidationMacroSubGraphOutput Outputs { get; set; } = new Microsoft.ML.Models.CrossValidationMacroSubGraphOutput(); + public CrossValidationMacroSubGraphOutput Outputs { get; set; } = new CrossValidationMacroSubGraphOutput(); /// /// Column to use for stratification @@ -2278,7 +2617,7 @@ public sealed partial class CrossValidator /// /// Specifies the trainer kind, which determines the evaluator to be used. /// - public Microsoft.ML.Models.MacroUtilsTrainerKinds Kind { get; set; } = Microsoft.ML.Models.MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; + public MacroUtilsTrainerKinds Kind { get; set; } = MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; /// /// Column to use for labels @@ -2295,6 +2634,11 @@ public sealed partial class CrossValidator /// public Microsoft.ML.Runtime.EntryPoints.Optional GroupColumn { get; set; } + /// + /// Name column name + /// + public Microsoft.ML.Runtime.EntryPoints.Optional NameColumn { get; set; } + public sealed class Output { @@ -2433,6 +2777,38 @@ public DatasetTransformerPipelineStep(Output output) } } + namespace Models + { + + /// + /// Summarize a pipeline ensemble predictor. + /// + public sealed partial class EnsembleSummary + { + + + /// + /// The predictor to summarize + /// + public Var PredictorModel { get; set; } = new Var(); + + + public sealed class Output + { + /// + /// The summaries of the individual predictors + /// + public ArrayVar Summaries { get; set; } = new ArrayVar(); + + /// + /// The model statistics of the individual predictors + /// + public ArrayVar Stats { get; set; } = new ArrayVar(); + + } + } + } + namespace Models { @@ -2507,6 +2883,38 @@ public FixedPlattCalibratorPipelineStep(Output output) } } + namespace Models + { + + /// + /// Combine multiclass classifiers into an ensemble + /// + public sealed partial class MultiClassPipelineEnsemble + { + + + /// + /// The combiner used to combine the scores + /// + public EnsembleCreatorClassifierCombiner ModelCombiner { get; set; } = EnsembleCreatorClassifierCombiner.Median; + + /// + /// The models to combine into an ensemble + /// + public ArrayVar Models { get; set; } = new ArrayVar(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + } + } + namespace Models { @@ -2672,9 +3080,7 @@ public sealed partial class OneVersusAllMacroSubGraphOutput } - /// - /// One-vs-All macro (OVA) - /// + /// public sealed partial class OneVersusAll : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { @@ -2687,7 +3093,7 @@ public sealed partial class OneVersusAll : Microsoft.ML.Runtime.EntryPoints.Comm /// /// The training subgraph output. /// - public Microsoft.ML.Models.OneVersusAllMacroSubGraphOutput OutputForSubGraph { get; set; } = new Microsoft.ML.Models.OneVersusAllMacroSubGraphOutput(); + public OneVersusAllMacroSubGraphOutput OutputForSubGraph { get; set; } = new OneVersusAllMacroSubGraphOutput(); /// /// Use probabilities in OVA combiner @@ -2717,12 +3123,12 @@ public sealed partial class OneVersusAll : Microsoft.ML.Runtime.EntryPoints.Comm /// /// Normalize option for the feature column /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public NormalizeOption NormalizeFeatures { get; set; } = NormalizeOption.Auto; /// /// Whether learner should cache input training data /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public CachingOptions Caching { get; set; } = CachingOptions.Auto; public sealed class Output @@ -2862,12 +3268,12 @@ public sealed partial class OvaModelCombiner : Microsoft.ML.Runtime.EntryPoints. /// /// Normalize option for the feature column /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public NormalizeOption NormalizeFeatures { get; set; } = NormalizeOption.Auto; /// /// Whether learner should cache input training data /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public CachingOptions Caching { get; set; } = CachingOptions.Auto; public sealed class Output @@ -3012,6 +3418,46 @@ public sealed partial class PipelineSweeper /// public ArrayVar CandidateOutputs { get; set; } = new ArrayVar(); + /// + /// Column(s) to use as Role 'Label' + /// + public string[] LabelColumns { get; set; } + + /// + /// Column(s) to use as Role 'Group' + /// + public string[] GroupColumns { get; set; } + + /// + /// Column(s) to use as Role 'Weight' + /// + public string[] WeightColumns { get; set; } + + /// + /// Column(s) to use as Role 'Name' + /// + public string[] NameColumns { get; set; } + + /// + /// Column(s) to use as Role 'NumericFeature' + /// + public string[] NumericFeatureColumns { get; set; } + + /// + /// Column(s) to use as Role 'CategoricalFeature' + /// + public string[] CategoricalFeatureColumns { get; set; } + + /// + /// Column(s) to use as Role 'TextFeature' + /// + public string[] TextFeatureColumns { get; set; } + + /// + /// Column(s) to use as Role 'ImagePath' + /// + public string[] ImagePathColumns { get; set; } + public sealed class Output { @@ -3243,6 +3689,43 @@ public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IEva } } + namespace Models + { + + /// + /// Combine regression models into an ensemble + /// + public sealed partial class RegressionEnsemble + { + + + /// + /// The combiner used to combine the scores + /// + public EnsembleCreatorScoreCombiner ModelCombiner { get; set; } = EnsembleCreatorScoreCombiner.Median; + + /// + /// The models to combine into an ensemble + /// + public ArrayVar Models { get; set; } = new ArrayVar(); + + /// + /// Whether to validate that all the pipelines are identical + /// + public bool ValidatePipelines { get; set; } = true; + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + } + } + namespace Models { @@ -3311,6 +3794,38 @@ public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IEva } } + namespace Models + { + + /// + /// Combine regression models into an ensemble + /// + public sealed partial class RegressionPipelineEnsemble + { + + + /// + /// The combiner used to combine the scores + /// + public EnsembleCreatorScoreCombiner ModelCombiner { get; set; } = EnsembleCreatorScoreCombiner.Median; + + /// + /// The models to combine into an ensemble + /// + public ArrayVar Models { get; set; } = new ArrayVar(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + } + } + namespace Models { @@ -3421,12 +3936,12 @@ public sealed partial class TrainTestBinaryEvaluator /// /// The training subgraph inputs /// - public Microsoft.ML.Models.TrainTestBinaryMacroSubGraphInput Inputs { get; set; } = new Microsoft.ML.Models.TrainTestBinaryMacroSubGraphInput(); + public TrainTestBinaryMacroSubGraphInput Inputs { get; set; } = new TrainTestBinaryMacroSubGraphInput(); /// /// The training subgraph outputs /// - public Microsoft.ML.Models.TrainTestBinaryMacroSubGraphOutput Outputs { get; set; } = new Microsoft.ML.Models.TrainTestBinaryMacroSubGraphOutput(); + public TrainTestBinaryMacroSubGraphOutput Outputs { get; set; } = new TrainTestBinaryMacroSubGraphOutput(); public sealed class Output @@ -3516,17 +4031,17 @@ public sealed partial class TrainTestEvaluator /// /// The training subgraph inputs /// - public Microsoft.ML.Models.TrainTestMacroSubGraphInput Inputs { get; set; } = new Microsoft.ML.Models.TrainTestMacroSubGraphInput(); + public TrainTestMacroSubGraphInput Inputs { get; set; } = new TrainTestMacroSubGraphInput(); /// /// The training subgraph outputs /// - public Microsoft.ML.Models.TrainTestMacroSubGraphOutput Outputs { get; set; } = new Microsoft.ML.Models.TrainTestMacroSubGraphOutput(); + public TrainTestMacroSubGraphOutput Outputs { get; set; } = new TrainTestMacroSubGraphOutput(); /// /// Specifies the trainer kind, which determines the evaluator to be used. /// - public Microsoft.ML.Models.MacroUtilsTrainerKinds Kind { get; set; } = Microsoft.ML.Models.MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; + public MacroUtilsTrainerKinds Kind { get; set; } = MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; /// /// Identifies which pipeline was run for this train test. @@ -3553,6 +4068,11 @@ public sealed partial class TrainTestEvaluator /// public Microsoft.ML.Runtime.EntryPoints.Optional GroupColumn { get; set; } + /// + /// Name column name + /// + public Microsoft.ML.Runtime.EntryPoints.Optional NameColumn { get; set; } + public sealed class Output { @@ -3613,9 +4133,8 @@ public sealed class Output namespace Trainers { - /// - /// Train a Average perceptron. - /// + /// + /// public sealed partial class AveragedPerceptronBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { @@ -3662,7 +4181,7 @@ public sealed partial class AveragedPerceptronBinaryClassifier : Microsoft.ML.Ru /// /// L2 Regularization Weight /// - [TlcModule.SweepableFloatParamAttribute("L2RegularizerWeight", 0f, 0.5f)] + [TlcModule.SweepableFloatParamAttribute("L2RegularizerWeight", 0f, 0.4f)] public float L2RegularizerWeight { get; set; } /// @@ -3778,240 +4297,273 @@ public AveragedPerceptronBinaryClassifierPipelineStep(Output output) namespace Trainers { - public enum Bundle : byte - { - None = 0, - AggregateLowPopulation = 1, - Adjacent = 2 - } - /// - /// Uses a random forest learner to perform binary classification. + /// Train binary ensemble. /// - public sealed partial class FastForestBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class EnsembleBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Upper bound on absolute value of single tree output + /// Algorithm to prune the base learners for selective Ensemble /// - public double MaxTreeOutput { get; set; } = 100d; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleBinarySubModelSelector SubModelSelectorType { get; set; } = new AllSelectorEnsembleBinarySubModelSelector(); /// - /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// Output combiner /// [JsonConverter(typeof(ComponentSerializer))] - public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); + public EnsembleBinaryOutputCombiner OutputCombiner { get; set; } = new MedianEnsembleBinaryOutputCombiner(); /// - /// The maximum number of examples to use when training the calibrator + /// Number of models per batch. If not specified, will default to 50 if there is only one base predictor, or the number of base predictors otherwise. /// - public int MaxCalibrationExamples { get; set; } = 1000000; + public int? NumModels { get; set; } /// - /// Number of labels to be sampled from each leaf to make the distribtuion + /// Batch size /// - public int QuantileSampleCount { get; set; } = 100; + public int BatchSize { get; set; } = -1; /// - /// Allows to choose Parallel FastTree Learning Algorithm + /// Sampling Type /// [JsonConverter(typeof(ComponentSerializer))] - public ParallelTraining ParallelTrainer { get; set; } = new SingleParallelTraining(); + public EnsembleSubsetSelector SamplingType { get; set; } = new BootstrapSelectorEnsembleSubsetSelector(); /// - /// The number of threads to use + /// All the base learners will run asynchronously if the value is true /// - public int? NumThreads { get; set; } + public bool TrainParallel { get; set; } = false; /// - /// The seed of the random number generator + /// True, if metrics for each model need to be evaluated and shown in comparison table. This is done by using validation set if available or the training set /// - public int RngSeed { get; set; } = 123; + public bool ShowMetrics { get; set; } = false; /// - /// The seed of the active feature selection + /// Column to use for labels /// - public int FeatureSelectSeed { get; set; } = 123; + public string LabelColumn { get; set; } = "Label"; /// - /// The entropy (regularization) coefficient between 0 and 1 + /// The data to be used for training /// - public double EntropyCoefficient { get; set; } + public Var TrainingData { get; set; } = new Var(); /// - /// The number of histograms in the pool (between 2 and numLeaves) + /// Column to use for features /// - public int HistogramPoolSize { get; set; } = -1; + public string FeatureColumn { get; set; } = "Features"; /// - /// Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose + /// Normalize option for the feature column /// - public bool? DiskTranspose { get; set; } + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// - /// Whether to collectivize features during dataset preparation to speed up training + /// Whether learner should cache input training data /// - public bool FeatureFlocks { get; set; } = true; + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - /// - /// Whether to do split based on multiple categorical feature values. - /// - public bool CategoricalSplit { get; set; } = false; - /// - /// Maximum categorical split groups to consider when splitting on a categorical feature. Split groups are a collection of split points. This is used to reduce overfitting when there many categorical features. - /// - public int MaxCategoricalGroupsPerNode { get; set; } = 64; + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); - /// - /// Maximum categorical split points to consider when splitting on a categorical feature. - /// - public int MaxCategoricalSplitPoints { get; set; } = 64; + } + public Var GetInputData() => TrainingData; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(EnsembleBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } - /// - /// Minimum categorical docs percentage in a bin to consider for a split. - /// - public double MinDocsPercentageForCategoricalSplit { get; set; } = 0.001d; + TrainingData = dataStep.Data; + } + Output output = experiment.Add(this); + return new EnsembleBinaryClassifierPipelineStep(output); + } - /// - /// Minimum categorical doc count in a bin to consider for a split. - /// - public int MinDocsForCategoricalSplit { get; set; } = 100; + private class EnsembleBinaryClassifierPipelineStep : ILearningPipelinePredictorStep + { + public EnsembleBinaryClassifierPipelineStep(Output output) + { + Model = output.PredictorModel; + } - /// - /// Bias for calculating gradient for each feature bin for a categorical feature. - /// - public double Bias { get; set; } + public Var Model { get; } + } + } + } - /// - /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. - /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + namespace Trainers + { - /// - /// Maximum number of distinct values (bins) per feature - /// - public int MaxBins { get; set; } = 255; + /// + /// Train multiclass ensemble. + /// + public sealed partial class EnsembleClassification : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + { - /// - /// Sparsity level needed to use sparse feature representation - /// - public double SparsifyThreshold { get; set; } = 0.7d; /// - /// The feature first use penalty coefficient + /// Algorithm to prune the base learners for selective Ensemble /// - public double FeatureFirstUsePenalty { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleMulticlassSubModelSelector SubModelSelectorType { get; set; } = new AllSelectorMultiClassEnsembleMulticlassSubModelSelector(); /// - /// The feature re-use penalty (regularization) coefficient + /// Output combiner /// - public double FeatureReusePenalty { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleMulticlassOutputCombiner OutputCombiner { get; set; } = new MultiMedianEnsembleMulticlassOutputCombiner(); /// - /// Tree fitting gain confidence requirement (should be in the range [0,1) ). + /// Number of models per batch. If not specified, will default to 50 if there is only one base predictor, or the number of base predictors otherwise. /// - public double GainConfidenceLevel { get; set; } + public int? NumModels { get; set; } /// - /// The temperature of the randomized softmax distribution for choosing the feature + /// Batch size /// - public double SoftmaxTemperature { get; set; } + public int BatchSize { get; set; } = -1; /// - /// Print execution time breakdown to stdout + /// Sampling Type /// - public bool ExecutionTimes { get; set; } = false; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleSubsetSelector SamplingType { get; set; } = new BootstrapSelectorEnsembleSubsetSelector(); /// - /// The max number of leaves in each regression tree + /// All the base learners will run asynchronously if the value is true /// - [TlcModule.SweepableLongParamAttribute("NumLeaves", 2, 128, stepSize:4, isLogScale:true)] - public int NumLeaves { get; set; } = 20; + public bool TrainParallel { get; set; } = false; /// - /// The minimal number of documents allowed in a leaf of a regression tree, out of the subsampled data + /// True, if metrics for each model need to be evaluated and shown in comparison table. This is done by using validation set if available or the training set /// - [TlcModule.SweepableDiscreteParamAttribute("MinDocumentsInLeafs", new object[]{1, 10, 50})] - public int MinDocumentsInLeafs { get; set; } = 10; + public bool ShowMetrics { get; set; } = false; /// - /// Number of weak hypotheses in the ensemble + /// Column to use for labels /// - [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] - public int NumTrees { get; set; } = 100; + public string LabelColumn { get; set; } = "Label"; /// - /// The fraction of features (chosen randomly) to use on each iteration + /// The data to be used for training /// - public double FeatureFraction { get; set; } = 0.7d; + public Var TrainingData { get; set; } = new Var(); /// - /// Number of trees in each bag (0 for disabling bagging) + /// Column to use for features /// - public int BaggingSize { get; set; } = 1; + public string FeatureColumn { get; set; } = "Features"; /// - /// Percentage of training examples used in each bag + /// Normalize option for the feature column /// - public double BaggingTrainFraction { get; set; } = 0.7d; + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// - /// The fraction of features (chosen randomly) to use on each split + /// Whether learner should cache input training data /// - public double SplitFraction { get; set; } = 0.7d; + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - /// - /// Smoothing paramter for tree regularization - /// - public double Smoothing { get; set; } - /// - /// When a root split is impossible, allow training to proceed - /// - public bool AllowEmptyTrees { get; set; } = true; + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + public Var GetInputData() => TrainingData; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(EnsembleClassification)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + TrainingData = dataStep.Data; + } + Output output = experiment.Add(this); + return new EnsembleClassificationPipelineStep(output); + } + + private class EnsembleClassificationPipelineStep : ILearningPipelinePredictorStep + { + public EnsembleClassificationPipelineStep(Output output) + { + Model = output.PredictorModel; + } + + public Var Model { get; } + } + } + } + + namespace Trainers + { + + /// + /// Train regression ensemble. + /// + public sealed partial class EnsembleRegression : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + { - /// - /// The level of feature compression to use - /// - public int FeatureCompressionLevel { get; set; } = 1; /// - /// Compress the tree Ensemble + /// Algorithm to prune the base learners for selective Ensemble /// - public bool CompressEnsemble { get; set; } = false; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleRegressionSubModelSelector SubModelSelectorType { get; set; } = new AllSelectorEnsembleRegressionSubModelSelector(); /// - /// Maximum Number of trees after compression + /// Output combiner /// - public int MaxTreesAfterCompression { get; set; } = -1; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleRegressionOutputCombiner OutputCombiner { get; set; } = new MedianEnsembleRegressionOutputCombiner(); /// - /// Print metrics graph for the first test set + /// Number of models per batch. If not specified, will default to 50 if there is only one base predictor, or the number of base predictors otherwise. /// - public bool PrintTestGraph { get; set; } = false; + public int? NumModels { get; set; } /// - /// Print Train and Validation metrics in graph + /// Batch size /// - public bool PrintTrainValidGraph { get; set; } = false; + public int BatchSize { get; set; } = -1; /// - /// Calculate metric values for train/valid/test every k rounds + /// Sampling Type /// - public int TestFrequency { get; set; } = 2147483647; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleSubsetSelector SamplingType { get; set; } = new BootstrapSelectorEnsembleSubsetSelector(); /// - /// Column to use for example groupId + /// All the base learners will run asynchronously if the value is true /// - public Microsoft.ML.Runtime.EntryPoints.Optional GroupIdColumn { get; set; } + public bool TrainParallel { get; set; } = false; /// - /// Column to use for example weight + /// True, if metrics for each model need to be evaluated and shown in comparison table. This is done by using validation set if available or the training set /// - public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } + public bool ShowMetrics { get; set; } = false; /// /// Column to use for labels @@ -4039,7 +4591,7 @@ public sealed partial class FastForestBinaryClassifier : Microsoft.ML.Runtime.En public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -4055,18 +4607,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FastForestBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(EnsembleRegression)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new FastForestBinaryClassifierPipelineStep(output); + return new EnsembleRegressionPipelineStep(output); } - private class FastForestBinaryClassifierPipelineStep : ILearningPipelinePredictorStep + private class EnsembleRegressionPipelineStep : ILearningPipelinePredictorStep { - public FastForestBinaryClassifierPipelineStep(Output output) + public EnsembleRegressionPipelineStep(Output output) { Model = output.PredictorModel; } @@ -4078,18 +4630,35 @@ public FastForestBinaryClassifierPipelineStep(Output output) namespace Trainers { + public enum Bundle : byte + { + None = 0, + AggregateLowPopulation = 1, + Adjacent = 2 + } - /// - /// Trains a random forest to fit target values using least-squares. - /// - public sealed partial class FastForestRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + + /// + /// + public sealed partial class FastForestBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Shuffle the labels on every iteration. Useful probably only if using this tree as a tree leaf featurizer for multiclass. + /// Upper bound on absolute value of single tree output /// - public bool ShuffleLabels { get; set; } = false; + public double MaxTreeOutput { get; set; } = 100d; + + /// + /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// + [JsonConverter(typeof(ComponentSerializer))] + public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); + + /// + /// The maximum number of examples to use when training the calibrator + /// + public int MaxCalibrationExamples { get; set; } = 1000000; /// /// Number of labels to be sampled from each leaf to make the distribtuion @@ -4170,7 +4739,7 @@ public sealed partial class FastForestRegressor : Microsoft.ML.Runtime.EntryPoin /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Bundle Bundling { get; set; } = Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -4220,7 +4789,7 @@ public sealed partial class FastForestRegressor : Microsoft.ML.Runtime.EntryPoin public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -4321,7 +4890,7 @@ public sealed partial class FastForestRegressor : Microsoft.ML.Runtime.EntryPoin public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -4337,18 +4906,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FastForestRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FastForestBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new FastForestRegressorPipelineStep(output); + return new FastForestBinaryClassifierPipelineStep(output); } - private class FastForestRegressorPipelineStep : ILearningPipelinePredictorStep + private class FastForestBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public FastForestRegressorPipelineStep(Output output) + public FastForestBinaryClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -4360,139 +4929,22 @@ public FastForestRegressorPipelineStep(Output output) namespace Trainers { - public enum BoostedTreeArgsOptimizationAlgorithmType + + /// + /// + public sealed partial class FastForestRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { - GradientDescent = 0, - AcceleratedGradientDescent = 1, - ConjugateGradientDescent = 2 - } - /// - /// Uses a logit-boost boosted tree learner to perform binary classification. - /// - public sealed partial class FastTreeBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem - { - - - /// - /// Should we use derivatives optimized for unbalanced sets - /// - public bool UnbalancedSets { get; set; } = false; - - /// - /// Use best regression step trees? - /// - public bool BestStepRankingRegressionTrees { get; set; } = false; - - /// - /// Should we use line search for a step size - /// - public bool UseLineSearch { get; set; } = false; - - /// - /// Number of post-bracket line search steps - /// - public int NumPostBracketSteps { get; set; } - - /// - /// Minimum line search step size - /// - public double MinStepSize { get; set; } - - /// - /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) - /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; - - /// - /// Early stopping rule. (Validation set (/valid) is required.) - /// - [JsonConverter(typeof(ComponentSerializer))] - public EarlyStoppingCriterion EarlyStoppingRule { get; set; } - - /// - /// Early stopping metrics. (For regression, 1: L1, 2:L2; for ranking, 1:NDCG@1, 3:NDCG@3) - /// - public int EarlyStoppingMetrics { get; set; } - - /// - /// Enable post-training pruning to avoid overfitting. (a validation set is required) - /// - public bool EnablePruning { get; set; } = false; - - /// - /// Use window and tolerance for pruning - /// - public bool UseTolerantPruning { get; set; } = false; - - /// - /// The tolerance threshold for pruning - /// - public double PruningThreshold { get; set; } = 0.004d; - - /// - /// The moving window size for pruning - /// - public int PruningWindowSize { get; set; } = 5; - - /// - /// The learning rate - /// - [TlcModule.SweepableFloatParamAttribute("LearningRates", 0.025f, 0.4f, isLogScale:true)] - public double LearningRates { get; set; } = 0.2d; - - /// - /// Shrinkage - /// - [TlcModule.SweepableFloatParamAttribute("Shrinkage", 0.025f, 4f, isLogScale:true)] - public double Shrinkage { get; set; } = 1d; - - /// - /// Dropout rate for tree regularization - /// - [TlcModule.SweepableDiscreteParamAttribute("DropoutRate", new object[]{0f, 1E-09f, 0.05f, 0.1f, 0.2f})] - public double DropoutRate { get; set; } - - /// - /// Sample each query 1 in k times in the GetDerivatives function - /// - public int GetDerivativesSampleRate { get; set; } = 1; - - /// - /// Write the last ensemble instead of the one determined by early stopping - /// - public bool WriteLastEnsemble { get; set; } = false; - - /// - /// Upper bound on absolute value of single tree output - /// - public double MaxTreeOutput { get; set; } = 100d; - - /// - /// Training starts from random ordering (determined by /r1) - /// - public bool RandomStart { get; set; } = false; - - /// - /// Filter zero lambdas during training - /// - public bool FilterZeroLambdas { get; set; } = false; - - /// - /// Freeform defining the scores that should be used as the baseline ranker - /// - public string BaselineScoresFormula { get; set; } - /// - /// Baseline alpha for tradeoffs of risk (0 is normal training) + /// Shuffle the labels on every iteration. Useful probably only if using this tree as a tree leaf featurizer for multiclass. /// - public string BaselineAlphaRisk { get; set; } + public bool ShuffleLabels { get; set; } = false; /// - /// The discount freeform which specifies the per position discounts of documents in a query (uses a single variable P for position where P=0 is first position) + /// Number of labels to be sampled from each leaf to make the distribtuion /// - public string PositionDiscountFreeform { get; set; } + public int QuantileSampleCount { get; set; } = 100; /// /// Allows to choose Parallel FastTree Learning Algorithm @@ -4568,7 +5020,7 @@ public sealed partial class FastTreeBinaryClassifier : Microsoft.ML.Runtime.Entr /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Bundle Bundling { get; set; } = Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -4618,7 +5070,7 @@ public sealed partial class FastTreeBinaryClassifier : Microsoft.ML.Runtime.Entr public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -4626,12 +5078,12 @@ public sealed partial class FastTreeBinaryClassifier : Microsoft.ML.Runtime.Entr /// /// The fraction of features (chosen randomly) to use on each iteration /// - public double FeatureFraction { get; set; } = 1d; + public double FeatureFraction { get; set; } = 0.7d; /// /// Number of trees in each bag (0 for disabling bagging) /// - public int BaggingSize { get; set; } + public int BaggingSize { get; set; } = 1; /// /// Percentage of training examples used in each bag @@ -4641,7 +5093,7 @@ public sealed partial class FastTreeBinaryClassifier : Microsoft.ML.Runtime.Entr /// /// The fraction of features (chosen randomly) to use on each split /// - public double SplitFraction { get; set; } = 1d; + public double SplitFraction { get; set; } = 0.7d; /// /// Smoothing paramter for tree regularization @@ -4719,7 +5171,7 @@ public sealed partial class FastTreeBinaryClassifier : Microsoft.ML.Runtime.Entr public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -4735,18 +5187,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FastTreeBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FastForestRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new FastTreeBinaryClassifierPipelineStep(output); + return new FastForestRegressorPipelineStep(output); } - private class FastTreeBinaryClassifierPipelineStep : ILearningPipelinePredictorStep + private class FastForestRegressorPipelineStep : ILearningPipelinePredictorStep { - public FastTreeBinaryClassifierPipelineStep(Output output) + public FastForestRegressorPipelineStep(Output output) { Model = output.PredictorModel; } @@ -4758,53 +5210,24 @@ public FastTreeBinaryClassifierPipelineStep(Output output) namespace Trainers { - - /// - /// Trains gradient boosted decision trees to the LambdaRank quasi-gradient. - /// - public sealed partial class FastTreeRanker : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + public enum BoostedTreeArgsOptimizationAlgorithmType { + GradientDescent = 0, + AcceleratedGradientDescent = 1, + ConjugateGradientDescent = 2 + } - /// - /// Comma seperated list of gains associated to each relevance label. - /// - public string CustomGains { get; set; } = "0,3,7,15,31"; - - /// - /// Train DCG instead of NDCG - /// - public bool TrainDcg { get; set; } = false; - - /// - /// The sorting algorithm to use for DCG and LambdaMart calculations [DescendingStablePessimistic/DescendingStable/DescendingReverse/DescendingDotNet] - /// - public string SortingAlgorithm { get; set; } = "DescendingStablePessimistic"; - - /// - /// max-NDCG truncation to use in the Lambda Mart algorithm - /// - public int LambdaMartMaxTruncation { get; set; } = 100; - - /// - /// Use shifted NDCG - /// - public bool ShiftedNdcg { get; set; } = false; - - /// - /// Cost function parameter (w/c) - /// - public char CostFunctionParam { get; set; } = 'w'; + /// + /// + public sealed partial class FastTreeBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + { - /// - /// Distance weight 2 adjustment to cost - /// - public bool DistanceWeight2 { get; set; } = false; /// - /// Normalize query lambdas + /// Should we use derivatives optimized for unbalanced sets /// - public bool NormalizeQueryLambdas { get; set; } = false; + public bool UnbalancedSets { get; set; } = false; /// /// Use best regression step trees? @@ -4829,7 +5252,7 @@ public sealed partial class FastTreeRanker : Microsoft.ML.Runtime.EntryPoints.Co /// /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; + public BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// /// Early stopping rule. (Validation set (/valid) is required.) @@ -4840,7 +5263,7 @@ public sealed partial class FastTreeRanker : Microsoft.ML.Runtime.EntryPoints.Co /// /// Early stopping metrics. (For regression, 1: L1, 2:L2; for ranking, 1:NDCG@1, 3:NDCG@3) /// - public int EarlyStoppingMetrics { get; set; } = 1; + public int EarlyStoppingMetrics { get; set; } /// /// Enable post-training pruning to avoid overfitting. (a validation set is required) @@ -4994,7 +5417,7 @@ public sealed partial class FastTreeRanker : Microsoft.ML.Runtime.EntryPoints.Co /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Bundle Bundling { get; set; } = Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -5044,7 +5467,7 @@ public sealed partial class FastTreeRanker : Microsoft.ML.Runtime.EntryPoints.Co public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -5145,7 +5568,7 @@ public sealed partial class FastTreeRanker : Microsoft.ML.Runtime.EntryPoints.Co public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRankingOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -5161,18 +5584,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FastTreeRanker)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FastTreeBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new FastTreeRankerPipelineStep(output); + return new FastTreeBinaryClassifierPipelineStep(output); } - private class FastTreeRankerPipelineStep : ILearningPipelinePredictorStep + private class FastTreeBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public FastTreeRankerPipelineStep(Output output) + public FastTreeBinaryClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -5185,13 +5608,52 @@ public FastTreeRankerPipelineStep(Output output) namespace Trainers { - /// - /// Trains gradient boosted decision trees to fit target values using least-squares. - /// - public sealed partial class FastTreeRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class FastTreeRanker : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { + /// + /// Comma seperated list of gains associated to each relevance label. + /// + public string CustomGains { get; set; } = "0,3,7,15,31"; + + /// + /// Train DCG instead of NDCG + /// + public bool TrainDcg { get; set; } = false; + + /// + /// The sorting algorithm to use for DCG and LambdaMart calculations [DescendingStablePessimistic/DescendingStable/DescendingReverse/DescendingDotNet] + /// + public string SortingAlgorithm { get; set; } = "DescendingStablePessimistic"; + + /// + /// max-NDCG truncation to use in the Lambda Mart algorithm + /// + public int LambdaMartMaxTruncation { get; set; } = 100; + + /// + /// Use shifted NDCG + /// + public bool ShiftedNdcg { get; set; } = false; + + /// + /// Cost function parameter (w/c) + /// + public char CostFunctionParam { get; set; } = 'w'; + + /// + /// Distance weight 2 adjustment to cost + /// + public bool DistanceWeight2 { get; set; } = false; + + /// + /// Normalize query lambdas + /// + public bool NormalizeQueryLambdas { get; set; } = false; + /// /// Use best regression step trees? /// @@ -5215,7 +5677,7 @@ public sealed partial class FastTreeRegressor : Microsoft.ML.Runtime.EntryPoints /// /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; + public BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// /// Early stopping rule. (Validation set (/valid) is required.) @@ -5380,7 +5842,7 @@ public sealed partial class FastTreeRegressor : Microsoft.ML.Runtime.EntryPoints /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Bundle Bundling { get; set; } = Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -5430,7 +5892,7 @@ public sealed partial class FastTreeRegressor : Microsoft.ML.Runtime.EntryPoints public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -5531,7 +5993,7 @@ public sealed partial class FastTreeRegressor : Microsoft.ML.Runtime.EntryPoints public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRankingOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -5547,18 +6009,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FastTreeRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FastTreeRanker)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new FastTreeRegressorPipelineStep(output); + return new FastTreeRankerPipelineStep(output); } - private class FastTreeRegressorPipelineStep : ILearningPipelinePredictorStep + private class FastTreeRankerPipelineStep : ILearningPipelinePredictorStep { - public FastTreeRegressorPipelineStep(Output output) + public FastTreeRankerPipelineStep(Output output) { Model = output.PredictorModel; } @@ -5571,18 +6033,12 @@ public FastTreeRegressorPipelineStep(Output output) namespace Trainers { - /// - /// Trains gradient boosted decision trees to fit target values using a Tweedie loss function. This learner is a generalization of Poisson, compound Poisson, and gamma regression. - /// - public sealed partial class FastTreeTweedieRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class FastTreeRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { - /// - /// Index parameter for the Tweedie distribution, in the range [1, 2]. 1 is Poisson loss, 2 is gamma loss, and intermediate values are compound Poisson loss. - /// - public double Index { get; set; } = 1.5d; - /// /// Use best regression step trees? /// @@ -5606,7 +6062,7 @@ public sealed partial class FastTreeTweedieRegressor : Microsoft.ML.Runtime.Entr /// /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; + public BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// /// Early stopping rule. (Validation set (/valid) is required.) @@ -5617,7 +6073,7 @@ public sealed partial class FastTreeTweedieRegressor : Microsoft.ML.Runtime.Entr /// /// Early stopping metrics. (For regression, 1: L1, 2:L2; for ranking, 1:NDCG@1, 3:NDCG@3) /// - public int EarlyStoppingMetrics { get; set; } + public int EarlyStoppingMetrics { get; set; } = 1; /// /// Enable post-training pruning to avoid overfitting. (a validation set is required) @@ -5771,7 +6227,7 @@ public sealed partial class FastTreeTweedieRegressor : Microsoft.ML.Runtime.Entr /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Bundle Bundling { get; set; } = Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -5821,7 +6277,7 @@ public sealed partial class FastTreeTweedieRegressor : Microsoft.ML.Runtime.Entr public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -5938,18 +6394,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FastTreeTweedieRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FastTreeRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new FastTreeTweedieRegressorPipelineStep(output); + return new FastTreeRegressorPipelineStep(output); } - private class FastTreeTweedieRegressorPipelineStep : ILearningPipelinePredictorStep + private class FastTreeRegressorPipelineStep : ILearningPipelinePredictorStep { - public FastTreeTweedieRegressorPipelineStep(Output output) + public FastTreeRegressorPipelineStep(Output output) { Model = output.PredictorModel; } @@ -5962,196 +6418,160 @@ public FastTreeTweedieRegressorPipelineStep(Output output) namespace Trainers { - /// - /// Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features. - /// - public sealed partial class GeneralizedAdditiveModelBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + public sealed partial class FastTreeTweedieRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Should we use derivatives optimized for unbalanced sets + /// Index parameter for the Tweedie distribution, in the range [1, 2]. 1 is Poisson loss, 2 is gamma loss, and intermediate values are compound Poisson loss. /// - public bool UnbalancedSets { get; set; } = false; + public double Index { get; set; } = 1.5d; /// - /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// Use best regression step trees? /// - [JsonConverter(typeof(ComponentSerializer))] - public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); + public bool BestStepRankingRegressionTrees { get; set; } = false; /// - /// The maximum number of examples to use when training the calibrator + /// Should we use line search for a step size /// - public int MaxCalibrationExamples { get; set; } = 1000000; + public bool UseLineSearch { get; set; } = false; /// - /// The entropy (regularization) coefficient between 0 and 1 + /// Number of post-bracket line search steps /// - public double EntropyCoefficient { get; set; } + public int NumPostBracketSteps { get; set; } /// - /// Tree fitting gain confidence requirement (should be in the range [0,1) ). + /// Minimum line search step size /// - public int GainConfidenceLevel { get; set; } + public double MinStepSize { get; set; } /// - /// Total number of iterations over all features + /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - [TlcModule.SweepableDiscreteParamAttribute("NumIterations", new object[]{200, 1500, 9500})] - public int NumIterations { get; set; } = 9500; + public BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// - /// The number of threads to use + /// Early stopping rule. (Validation set (/valid) is required.) /// - public int? NumThreads { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public EarlyStoppingCriterion EarlyStoppingRule { get; set; } /// - /// The learning rate + /// Early stopping metrics. (For regression, 1: L1, 2:L2; for ranking, 1:NDCG@1, 3:NDCG@3) /// - [TlcModule.SweepableFloatParamAttribute("LearningRates", 0.001f, 0.1f, isLogScale:true)] - public double LearningRates { get; set; } = 0.002d; + public int EarlyStoppingMetrics { get; set; } /// - /// Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose + /// Enable post-training pruning to avoid overfitting. (a validation set is required) /// - public bool? DiskTranspose { get; set; } + public bool EnablePruning { get; set; } = false; /// - /// Maximum number of distinct values (bins) per feature + /// Use window and tolerance for pruning /// - public int MaxBins { get; set; } = 255; + public bool UseTolerantPruning { get; set; } = false; /// - /// Upper bound on absolute value of single output + /// The tolerance threshold for pruning /// - public double MaxOutput { get; set; } = double.PositiveInfinity; + public double PruningThreshold { get; set; } = 0.004d; /// - /// Sample each query 1 in k times in the GetDerivatives function + /// The moving window size for pruning /// - public int GetDerivativesSampleRate { get; set; } = 1; + public int PruningWindowSize { get; set; } = 5; /// - /// The seed of the random number generator + /// The learning rate /// - public int RngSeed { get; set; } = 123; + [TlcModule.SweepableFloatParamAttribute("LearningRates", 0.025f, 0.4f, isLogScale:true)] + public double LearningRates { get; set; } = 0.2d; /// - /// Minimum number of training instances required to form a partition + /// Shrinkage /// - [TlcModule.SweepableDiscreteParamAttribute("MinDocuments", new object[]{1, 10, 50})] - public int MinDocuments { get; set; } = 10; + [TlcModule.SweepableFloatParamAttribute("Shrinkage", 0.025f, 4f, isLogScale:true)] + public double Shrinkage { get; set; } = 1d; /// - /// Whether to collectivize features during dataset preparation to speed up training + /// Dropout rate for tree regularization /// - public bool FeatureFlocks { get; set; } = true; + [TlcModule.SweepableDiscreteParamAttribute("DropoutRate", new object[]{0f, 1E-09f, 0.05f, 0.1f, 0.2f})] + public double DropoutRate { get; set; } /// - /// Column to use for example weight + /// Sample each query 1 in k times in the GetDerivatives function /// - public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } + public int GetDerivativesSampleRate { get; set; } = 1; /// - /// Column to use for labels + /// Write the last ensemble instead of the one determined by early stopping /// - public string LabelColumn { get; set; } = "Label"; + public bool WriteLastEnsemble { get; set; } = false; /// - /// The data to be used for training + /// Upper bound on absolute value of single tree output /// - public Var TrainingData { get; set; } = new Var(); + public double MaxTreeOutput { get; set; } = 100d; /// - /// Column to use for features + /// Training starts from random ordering (determined by /r1) /// - public string FeatureColumn { get; set; } = "Features"; + public bool RandomStart { get; set; } = false; /// - /// Normalize option for the feature column + /// Filter zero lambdas during training /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public bool FilterZeroLambdas { get; set; } = false; /// - /// Whether learner should cache input training data + /// Freeform defining the scores that should be used as the baseline ranker /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - - - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput - { - /// - /// The trained model - /// - public Var PredictorModel { get; set; } = new Var(); - - } - public Var GetInputData() => TrainingData; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(GeneralizedAdditiveModelBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } - - TrainingData = dataStep.Data; - } - Output output = experiment.Add(this); - return new GeneralizedAdditiveModelBinaryClassifierPipelineStep(output); - } - - private class GeneralizedAdditiveModelBinaryClassifierPipelineStep : ILearningPipelinePredictorStep - { - public GeneralizedAdditiveModelBinaryClassifierPipelineStep(Output output) - { - Model = output.PredictorModel; - } - - public Var Model { get; } - } - } - } + public string BaselineScoresFormula { get; set; } - namespace Trainers - { + /// + /// Baseline alpha for tradeoffs of risk (0 is normal training) + /// + public string BaselineAlphaRisk { get; set; } - /// - /// Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features. - /// - public sealed partial class GeneralizedAdditiveModelRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// The discount freeform which specifies the per position discounts of documents in a query (uses a single variable P for position where P=0 is first position) + /// + public string PositionDiscountFreeform { get; set; } + /// + /// Allows to choose Parallel FastTree Learning Algorithm + /// + [JsonConverter(typeof(ComponentSerializer))] + public ParallelTraining ParallelTrainer { get; set; } = new SingleParallelTraining(); /// - /// The entropy (regularization) coefficient between 0 and 1 + /// The number of threads to use /// - public double EntropyCoefficient { get; set; } + public int? NumThreads { get; set; } /// - /// Tree fitting gain confidence requirement (should be in the range [0,1) ). + /// The seed of the random number generator /// - public int GainConfidenceLevel { get; set; } + public int RngSeed { get; set; } = 123; /// - /// Total number of iterations over all features + /// The seed of the active feature selection /// - [TlcModule.SweepableDiscreteParamAttribute("NumIterations", new object[]{200, 1500, 9500})] - public int NumIterations { get; set; } = 9500; + public int FeatureSelectSeed { get; set; } = 123; /// - /// The number of threads to use + /// The entropy (regularization) coefficient between 0 and 1 /// - public int? NumThreads { get; set; } + public double EntropyCoefficient { get; set; } /// - /// The learning rate + /// The number of histograms in the pool (between 2 and numLeaves) /// - [TlcModule.SweepableFloatParamAttribute("LearningRates", 0.001f, 0.1f, isLogScale:true)] - public double LearningRates { get; set; } = 0.002d; + public int HistogramPoolSize { get; set; } = -1; /// /// Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose @@ -6159,157 +6579,173 @@ public sealed partial class GeneralizedAdditiveModelRegressor : Microsoft.ML.Run public bool? DiskTranspose { get; set; } /// - /// Maximum number of distinct values (bins) per feature + /// Whether to collectivize features during dataset preparation to speed up training /// - public int MaxBins { get; set; } = 255; + public bool FeatureFlocks { get; set; } = true; /// - /// Upper bound on absolute value of single output + /// Whether to do split based on multiple categorical feature values. /// - public double MaxOutput { get; set; } = double.PositiveInfinity; + public bool CategoricalSplit { get; set; } = false; /// - /// Sample each query 1 in k times in the GetDerivatives function + /// Maximum categorical split groups to consider when splitting on a categorical feature. Split groups are a collection of split points. This is used to reduce overfitting when there many categorical features. /// - public int GetDerivativesSampleRate { get; set; } = 1; + public int MaxCategoricalGroupsPerNode { get; set; } = 64; /// - /// The seed of the random number generator + /// Maximum categorical split points to consider when splitting on a categorical feature. /// - public int RngSeed { get; set; } = 123; + public int MaxCategoricalSplitPoints { get; set; } = 64; /// - /// Minimum number of training instances required to form a partition + /// Minimum categorical docs percentage in a bin to consider for a split. /// - [TlcModule.SweepableDiscreteParamAttribute("MinDocuments", new object[]{1, 10, 50})] - public int MinDocuments { get; set; } = 10; + public double MinDocsPercentageForCategoricalSplit { get; set; } = 0.001d; /// - /// Whether to collectivize features during dataset preparation to speed up training + /// Minimum categorical doc count in a bin to consider for a split. /// - public bool FeatureFlocks { get; set; } = true; + public int MinDocsForCategoricalSplit { get; set; } = 100; /// - /// Column to use for example weight + /// Bias for calculating gradient for each feature bin for a categorical feature. /// - public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } + public double Bias { get; set; } /// - /// Column to use for labels + /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public string LabelColumn { get; set; } = "Label"; + public Bundle Bundling { get; set; } = Bundle.None; /// - /// The data to be used for training + /// Maximum number of distinct values (bins) per feature /// - public Var TrainingData { get; set; } = new Var(); + public int MaxBins { get; set; } = 255; /// - /// Column to use for features + /// Sparsity level needed to use sparse feature representation /// - public string FeatureColumn { get; set; } = "Features"; + public double SparsifyThreshold { get; set; } = 0.7d; /// - /// Normalize option for the feature column + /// The feature first use penalty coefficient /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public double FeatureFirstUsePenalty { get; set; } /// - /// Whether learner should cache input training data + /// The feature re-use penalty (regularization) coefficient /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public double FeatureReusePenalty { get; set; } + /// + /// Tree fitting gain confidence requirement (should be in the range [0,1) ). + /// + public double GainConfidenceLevel { get; set; } - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput - { - /// - /// The trained model - /// - public Var PredictorModel { get; set; } = new Var(); + /// + /// The temperature of the randomized softmax distribution for choosing the feature + /// + public double SoftmaxTemperature { get; set; } - } - public Var GetInputData() => TrainingData; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(GeneralizedAdditiveModelRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } + /// + /// Print execution time breakdown to stdout + /// + public bool ExecutionTimes { get; set; } = false; - TrainingData = dataStep.Data; - } - Output output = experiment.Add(this); - return new GeneralizedAdditiveModelRegressorPipelineStep(output); - } + /// + /// The max number of leaves in each regression tree + /// + [TlcModule.SweepableLongParamAttribute("NumLeaves", 2, 128, stepSize:4, isLogScale:true)] + public int NumLeaves { get; set; } = 20; - private class GeneralizedAdditiveModelRegressorPipelineStep : ILearningPipelinePredictorStep - { - public GeneralizedAdditiveModelRegressorPipelineStep(Output output) - { - Model = output.PredictorModel; - } + /// + /// The minimal number of documents allowed in a leaf of a regression tree, out of the subsampled data + /// + [TlcModule.SweepableDiscreteParamAttribute("MinDocumentsInLeafs", new object[]{1, 10, 50})] + public int MinDocumentsInLeafs { get; set; } = 10; - public Var Model { get; } - } - } - } + /// + /// Total number of decision trees to create in the ensemble + /// + [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] + public int NumTrees { get; set; } = 100; - namespace Trainers - { - public enum KMeansPlusPlusTrainerInitAlgorithm - { - KMeansPlusPlus = 0, - Random = 1, - KMeansParallel = 2 - } + /// + /// The fraction of features (chosen randomly) to use on each iteration + /// + public double FeatureFraction { get; set; } = 1d; + /// + /// Number of trees in each bag (0 for disabling bagging) + /// + public int BaggingSize { get; set; } - /// - /// K-means is a popular clustering algorithm. With K-means, the data is clustered into a specified number of clusters in order to minimize the within-cluster sum of squares. K-means++ improves upon K-means by using a better method for choosing the initial cluster centers. - /// - public sealed partial class KMeansPlusPlusClusterer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IUnsupervisedTrainerWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Percentage of training examples used in each bag + /// + public double BaggingTrainFraction { get; set; } = 0.7d; + /// + /// The fraction of features (chosen randomly) to use on each split + /// + public double SplitFraction { get; set; } = 1d; /// - /// The number of clusters + /// Smoothing paramter for tree regularization /// - [TlcModule.SweepableDiscreteParamAttribute("K", new object[]{5, 10, 20, 40})] - public int K { get; set; } = 5; + public double Smoothing { get; set; } /// - /// Cluster initialization algorithm + /// When a root split is impossible, allow training to proceed /// - public Microsoft.ML.Trainers.KMeansPlusPlusTrainerInitAlgorithm InitAlgorithm { get; set; } = Microsoft.ML.Trainers.KMeansPlusPlusTrainerInitAlgorithm.KMeansParallel; + public bool AllowEmptyTrees { get; set; } = true; /// - /// Tolerance parameter for trainer convergence. Lower = slower, more accurate + /// The level of feature compression to use /// - public float OptTol { get; set; } = 1E-07f; + public int FeatureCompressionLevel { get; set; } = 1; /// - /// Maximum number of iterations. + /// Compress the tree Ensemble /// - public int MaxIterations { get; set; } = 1000; + public bool CompressEnsemble { get; set; } = false; /// - /// Memory budget (in MBs) to use for KMeans acceleration + /// Maximum Number of trees after compression /// - public int AccelMemBudgetMb { get; set; } = 4096; + public int MaxTreesAfterCompression { get; set; } = -1; /// - /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. + /// Print metrics graph for the first test set /// - public int? NumThreads { get; set; } + public bool PrintTestGraph { get; set; } = false; + + /// + /// Print Train and Validation metrics in graph + /// + public bool PrintTrainValidGraph { get; set; } = false; + + /// + /// Calculate metric values for train/valid/test every k rounds + /// + public int TestFrequency { get; set; } = 2147483647; + + /// + /// Column to use for example groupId + /// + public Microsoft.ML.Runtime.EntryPoints.Optional GroupIdColumn { get; set; } /// /// Column to use for example weight /// public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } + /// + /// Column to use for labels + /// + public string LabelColumn { get; set; } = "Label"; + /// /// The data to be used for training /// @@ -6331,7 +6767,7 @@ public sealed partial class KMeansPlusPlusClusterer : Microsoft.ML.Runtime.Entry public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IClusteringOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -6347,18 +6783,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(KMeansPlusPlusClusterer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FastTreeTweedieRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new KMeansPlusPlusClustererPipelineStep(output); + return new FastTreeTweedieRegressorPipelineStep(output); } - private class KMeansPlusPlusClustererPipelineStep : ILearningPipelinePredictorStep + private class FastTreeTweedieRegressorPipelineStep : ILearningPipelinePredictorStep { - public KMeansPlusPlusClustererPipelineStep(Output output) + public FastTreeTweedieRegressorPipelineStep(Output output) { Model = output.PredictorModel; } @@ -6371,74 +6807,62 @@ public KMeansPlusPlusClustererPipelineStep(Output output) namespace Trainers { - /// - /// Train a linear SVM. - /// - public sealed partial class LinearSvmBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class FieldAwareFactorizationMachineBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Regularizer constant - /// - [TlcModule.SweepableFloatParamAttribute("Lambda", 1E-05f, 0.1f, stepSize:10, isLogScale:true)] - public float Lambda { get; set; } = 0.001f; - - /// - /// Batch size - /// - public int BatchSize { get; set; } = 1; - - /// - /// Perform projection to unit-ball? Typically used with batch size > 1. + /// Initial learning rate /// - [TlcModule.SweepableDiscreteParamAttribute("PerformProjection", new object[]{false, true})] - public bool PerformProjection { get; set; } = false; + [TlcModule.SweepableFloatParamAttribute("LearningRate", 0.001f, 1f, isLogScale:true)] + public float LearningRate { get; set; } = 0.1f; /// - /// No bias + /// Number of training iterations /// - [TlcModule.SweepableDiscreteParamAttribute("NoBias", new object[]{false, true})] - public bool NoBias { get; set; } = false; + [TlcModule.SweepableLongParamAttribute("Iters", 1, 100)] + public int Iters { get; set; } = 5; /// - /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// Latent space dimension /// - [JsonConverter(typeof(ComponentSerializer))] - public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); + [TlcModule.SweepableLongParamAttribute("LatentDim", 4, 100)] + public int LatentDim { get; set; } = 20; /// - /// The maximum number of examples to use when training the calibrator + /// Regularization coefficient of linear weights /// - public int MaxCalibrationExamples { get; set; } = 1000000; + [TlcModule.SweepableFloatParamAttribute("LambdaLinear", 1E-08f, 1f, isLogScale:true)] + public float LambdaLinear { get; set; } = 0.0001f; /// - /// Number of iterations + /// Regularization coefficient of latent weights /// - [TlcModule.SweepableLongParamAttribute("NumIterations", 1, 100, stepSize:10, isLogScale:true)] - public int NumIterations { get; set; } = 1; + [TlcModule.SweepableFloatParamAttribute("LambdaLatent", 1E-08f, 1f, isLogScale:true)] + public float LambdaLatent { get; set; } = 0.0001f; /// - /// Initial Weights and bias, comma-separated + /// Whether to normalize the input vectors so that the concatenation of all fields' feature vectors is unit-length /// - public string InitialWeights { get; set; } + public bool Norm { get; set; } = true; /// - /// Init weights diameter + /// Whether to shuffle for each training iteration /// - [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] - public float InitWtsDiameter { get; set; } + public bool Shuffle { get; set; } = true; /// - /// Whether to shuffle for each training iteration + /// Report traning progress or not /// - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] - public bool Shuffle { get; set; } = true; + public bool Verbose { get; set; } = true; /// - /// Size of cache when trained in Scope + /// Radius of initial latent factors /// - public int StreamingCacheSize { get; set; } = 1000000; + [TlcModule.SweepableFloatParamAttribute("Radius", 0.1f, 1f)] + public float Radius { get; set; } = 0.5f; /// /// Column to use for labels @@ -6482,18 +6906,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(LinearSvmBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FieldAwareFactorizationMachineBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new LinearSvmBinaryClassifierPipelineStep(output); + return new FieldAwareFactorizationMachineBinaryClassifierPipelineStep(output); } - private class LinearSvmBinaryClassifierPipelineStep : ILearningPipelinePredictorStep + private class FieldAwareFactorizationMachineBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public LinearSvmBinaryClassifierPipelineStep(Output output) + public FieldAwareFactorizationMachineBinaryClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -6507,83 +6931,90 @@ namespace Trainers { /// - /// Train a logistic regression binary model + /// Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features. /// - public sealed partial class LogisticRegressionBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class GeneralizedAdditiveModelBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Show statistics of training examples. + /// Should we use derivatives optimized for unbalanced sets /// - public bool ShowTrainingStats { get; set; } = false; + public bool UnbalancedSets { get; set; } = false; /// - /// L2 regularization weight + /// The calibrator kind to apply to the predictor. Specify null for no calibration /// - [TlcModule.SweepableFloatParamAttribute("L2Weight", 0f, 1f, numSteps:4)] - public float L2Weight { get; set; } = 1f; + [JsonConverter(typeof(ComponentSerializer))] + public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); /// - /// L1 regularization weight + /// The maximum number of examples to use when training the calibrator /// - [TlcModule.SweepableFloatParamAttribute("L1Weight", 0f, 1f, numSteps:4)] - public float L1Weight { get; set; } = 1f; + public int MaxCalibrationExamples { get; set; } = 1000000; /// - /// Tolerance parameter for optimization convergence. Lower = slower, more accurate + /// The entropy (regularization) coefficient between 0 and 1 /// - [TlcModule.SweepableDiscreteParamAttribute("OptTol", new object[]{0.0001f, 1E-07f})] - public float OptTol { get; set; } = 1E-07f; + public double EntropyCoefficient { get; set; } /// - /// Memory size for L-BFGS. Lower=faster, less accurate + /// Tree fitting gain confidence requirement (should be in the range [0,1) ). /// - [TlcModule.SweepableDiscreteParamAttribute("MemorySize", new object[]{5, 20, 50})] - public int MemorySize { get; set; } = 20; + public int GainConfidenceLevel { get; set; } /// - /// Maximum iterations. + /// Total number of iterations over all features /// - [TlcModule.SweepableLongParamAttribute("MaxIterations", 1, 2147483647)] - public int MaxIterations { get; set; } = 2147483647; + [TlcModule.SweepableDiscreteParamAttribute("NumIterations", new object[]{200, 1500, 9500})] + public int NumIterations { get; set; } = 9500; /// - /// Run SGD to initialize LR weights, converging to this tolerance + /// The number of threads to use /// - public float SgdInitializationTolerance { get; set; } + public int? NumThreads { get; set; } /// - /// If set to true, produce no output during training. + /// The learning rate /// - public bool Quiet { get; set; } = false; + [TlcModule.SweepableFloatParamAttribute("LearningRates", 0.001f, 0.1f, isLogScale:true)] + public double LearningRates { get; set; } = 0.002d; /// - /// Init weights diameter + /// Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose /// - [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] - public float InitWtsDiameter { get; set; } + public bool? DiskTranspose { get; set; } /// - /// Whether or not to use threads. Default is true + /// Maximum number of distinct values (bins) per feature /// - public bool UseThreads { get; set; } = true; + public int MaxBins { get; set; } = 255; /// - /// Number of threads + /// Upper bound on absolute value of single output /// - public int? NumThreads { get; set; } + public double MaxOutput { get; set; } = double.PositiveInfinity; /// - /// Force densification of the internal optimization vectors + /// Sample each query 1 in k times in the GetDerivatives function /// - [TlcModule.SweepableDiscreteParamAttribute("DenseOptimizer", new object[]{false, true})] - public bool DenseOptimizer { get; set; } = false; + public int GetDerivativesSampleRate { get; set; } = 1; /// - /// Enforce non-negative weights + /// The seed of the random number generator /// - public bool EnforceNonNegativity { get; set; } = false; + public int RngSeed { get; set; } = 123; + + /// + /// Minimum number of training instances required to form a partition + /// + [TlcModule.SweepableDiscreteParamAttribute("MinDocuments", new object[]{1, 10, 50})] + public int MinDocuments { get; set; } = 10; + + /// + /// Whether to collectivize features during dataset preparation to speed up training + /// + public bool FeatureFlocks { get; set; } = true; /// /// Column to use for example weight @@ -6632,18 +7063,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(LogisticRegressionBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(GeneralizedAdditiveModelBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new LogisticRegressionBinaryClassifierPipelineStep(output); + return new GeneralizedAdditiveModelBinaryClassifierPipelineStep(output); } - private class LogisticRegressionBinaryClassifierPipelineStep : ILearningPipelinePredictorStep + private class GeneralizedAdditiveModelBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public LogisticRegressionBinaryClassifierPipelineStep(Output output) + public GeneralizedAdditiveModelBinaryClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -6657,83 +7088,74 @@ namespace Trainers { /// - /// Train a logistic regression multi class model + /// Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features. /// - public sealed partial class LogisticRegressionClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class GeneralizedAdditiveModelRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Show statistics of training examples. - /// - public bool ShowTrainingStats { get; set; } = false; - - /// - /// L2 regularization weight + /// The entropy (regularization) coefficient between 0 and 1 /// - [TlcModule.SweepableFloatParamAttribute("L2Weight", 0f, 1f, numSteps:4)] - public float L2Weight { get; set; } = 1f; + public double EntropyCoefficient { get; set; } /// - /// L1 regularization weight + /// Tree fitting gain confidence requirement (should be in the range [0,1) ). /// - [TlcModule.SweepableFloatParamAttribute("L1Weight", 0f, 1f, numSteps:4)] - public float L1Weight { get; set; } = 1f; + public int GainConfidenceLevel { get; set; } /// - /// Tolerance parameter for optimization convergence. Lower = slower, more accurate + /// Total number of iterations over all features /// - [TlcModule.SweepableDiscreteParamAttribute("OptTol", new object[]{0.0001f, 1E-07f})] - public float OptTol { get; set; } = 1E-07f; + [TlcModule.SweepableDiscreteParamAttribute("NumIterations", new object[]{200, 1500, 9500})] + public int NumIterations { get; set; } = 9500; /// - /// Memory size for L-BFGS. Lower=faster, less accurate + /// The number of threads to use /// - [TlcModule.SweepableDiscreteParamAttribute("MemorySize", new object[]{5, 20, 50})] - public int MemorySize { get; set; } = 20; + public int? NumThreads { get; set; } /// - /// Maximum iterations. + /// The learning rate /// - [TlcModule.SweepableLongParamAttribute("MaxIterations", 1, 2147483647)] - public int MaxIterations { get; set; } = 2147483647; + [TlcModule.SweepableFloatParamAttribute("LearningRates", 0.001f, 0.1f, isLogScale:true)] + public double LearningRates { get; set; } = 0.002d; /// - /// Run SGD to initialize LR weights, converging to this tolerance + /// Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose /// - public float SgdInitializationTolerance { get; set; } + public bool? DiskTranspose { get; set; } /// - /// If set to true, produce no output during training. + /// Maximum number of distinct values (bins) per feature /// - public bool Quiet { get; set; } = false; + public int MaxBins { get; set; } = 255; /// - /// Init weights diameter + /// Upper bound on absolute value of single output /// - [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] - public float InitWtsDiameter { get; set; } + public double MaxOutput { get; set; } = double.PositiveInfinity; /// - /// Whether or not to use threads. Default is true + /// Sample each query 1 in k times in the GetDerivatives function /// - public bool UseThreads { get; set; } = true; + public int GetDerivativesSampleRate { get; set; } = 1; /// - /// Number of threads + /// The seed of the random number generator /// - public int? NumThreads { get; set; } + public int RngSeed { get; set; } = 123; /// - /// Force densification of the internal optimization vectors + /// Minimum number of training instances required to form a partition /// - [TlcModule.SweepableDiscreteParamAttribute("DenseOptimizer", new object[]{false, true})] - public bool DenseOptimizer { get; set; } = false; + [TlcModule.SweepableDiscreteParamAttribute("MinDocuments", new object[]{1, 10, 50})] + public int MinDocuments { get; set; } = 10; /// - /// Enforce non-negative weights + /// Whether to collectivize features during dataset preparation to speed up training /// - public bool EnforceNonNegativity { get; set; } = false; + public bool FeatureFlocks { get; set; } = true; /// /// Column to use for example weight @@ -6766,7 +7188,7 @@ public sealed partial class LogisticRegressionClassifier : Microsoft.ML.Runtime. public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -6782,18 +7204,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(LogisticRegressionClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(GeneralizedAdditiveModelRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new LogisticRegressionClassifierPipelineStep(output); + return new GeneralizedAdditiveModelRegressorPipelineStep(output); } - private class LogisticRegressionClassifierPipelineStep : ILearningPipelinePredictorStep + private class GeneralizedAdditiveModelRegressorPipelineStep : ILearningPipelinePredictorStep { - public LogisticRegressionClassifierPipelineStep(Output output) + public GeneralizedAdditiveModelRegressorPipelineStep(Output output) { Model = output.PredictorModel; } @@ -6805,18 +7227,55 @@ public LogisticRegressionClassifierPipelineStep(Output output) namespace Trainers { + public enum KMeansPlusPlusTrainerInitAlgorithm + { + KMeansPlusPlus = 0, + Random = 1, + KMeansParallel = 2 + } - /// - /// Train a MultiClassNaiveBayesTrainer. - /// - public sealed partial class NaiveBayesClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + + /// + /// + public sealed partial class KMeansPlusPlusClusterer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IUnsupervisedTrainerWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Column to use for labels + /// The number of clusters /// - public string LabelColumn { get; set; } = "Label"; + [TlcModule.SweepableDiscreteParamAttribute("K", new object[]{5, 10, 20, 40})] + public int K { get; set; } = 5; + + /// + /// Cluster initialization algorithm + /// + public KMeansPlusPlusTrainerInitAlgorithm InitAlgorithm { get; set; } = KMeansPlusPlusTrainerInitAlgorithm.KMeansParallel; + + /// + /// Tolerance parameter for trainer convergence. Lower = slower, more accurate + /// + public float OptTol { get; set; } = 1E-07f; + + /// + /// Maximum number of iterations. + /// + public int MaxIterations { get; set; } = 1000; + + /// + /// Memory budget (in MBs) to use for KMeans acceleration + /// + public int AccelMemBudgetMb { get; set; } = 4096; + + /// + /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. + /// + public int? NumThreads { get; set; } + + /// + /// Column to use for example weight + /// + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } /// /// The data to be used for training @@ -6839,7 +7298,7 @@ public sealed partial class NaiveBayesClassifier : Microsoft.ML.Runtime.EntryPoi public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IClusteringOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -6855,18 +7314,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(NaiveBayesClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(KMeansPlusPlusClusterer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new NaiveBayesClassifierPipelineStep(output); + return new KMeansPlusPlusClustererPipelineStep(output); } - private class NaiveBayesClassifierPipelineStep : ILearningPipelinePredictorStep + private class KMeansPlusPlusClustererPipelineStep : ILearningPipelinePredictorStep { - public NaiveBayesClassifierPipelineStep(Output output) + public KMeansPlusPlusClustererPipelineStep(Output output) { Model = output.PredictorModel; } @@ -6878,95 +7337,158 @@ public NaiveBayesClassifierPipelineStep(Output output) namespace Trainers { + public enum LightGbmArgumentsEvalMetricType + { + DefaultMetric = 0, + Rmse = 1, + Mae = 2, + Logloss = 3, + Error = 4, + Merror = 5, + Mlogloss = 6, + Auc = 7, + Ndcg = 8, + Map = 9 + } - /// - /// Train a Online gradient descent perceptron. - /// - public sealed partial class OnlineGradientDescentRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + + /// + /// + public sealed partial class LightGbmBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Loss Function + /// Number of iterations. + /// + [TlcModule.SweepableDiscreteParamAttribute("NumBoostRound", new object[]{10, 20, 50, 100, 150, 200})] + public int NumBoostRound { get; set; } = 100; + + /// + /// Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1]. + /// + [TlcModule.SweepableFloatParamAttribute("LearningRate", 0.025f, 0.4f, isLogScale:true)] + public double? LearningRate { get; set; } + + /// + /// Maximum leaves for trees. + /// + [TlcModule.SweepableLongParamAttribute("NumLeaves", 2, 128, stepSize:4, isLogScale:true)] + public int? NumLeaves { get; set; } + + /// + /// Minimum number of instances needed in a child. + /// + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerLeaf", new object[]{1, 10, 20, 50})] + public int? MinDataPerLeaf { get; set; } + + /// + /// Max number of bucket bin for features. + /// + public int MaxBin { get; set; } = 255; + + /// + /// Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function. /// [JsonConverter(typeof(ComponentSerializer))] - public RegressionLossFunction LossFunction { get; set; } = new SquaredLossRegressionLossFunction(); + public BoosterParameterFunction Booster { get; set; } = new GbdtBoosterParameterFunction(); /// - /// Learning rate + /// Verbose /// - [TlcModule.SweepableDiscreteParamAttribute("LearningRate", new object[]{0.01f, 0.1f, 0.5f, 1f})] - public float LearningRate { get; set; } = 0.1f; + public bool VerboseEval { get; set; } = false; /// - /// Decrease learning rate + /// Printing running messages. /// - [TlcModule.SweepableDiscreteParamAttribute("DecreaseLearningRate", new object[]{false, true})] - public bool DecreaseLearningRate { get; set; } = true; + public bool Silent { get; set; } = true; /// - /// Number of examples after which weights will be reset to the current average + /// Number of parallel threads used to run LightGBM. /// - public long? ResetWeightsAfterXExamples { get; set; } + public int? NThread { get; set; } /// - /// Instead of updating averaged weights on every example, only update when loss is nonzero + /// Evaluation metrics. /// - public bool DoLazyUpdates { get; set; } = true; + public LightGbmArgumentsEvalMetricType EvalMetric { get; set; } = LightGbmArgumentsEvalMetricType.DefaultMetric; /// - /// L2 Regularization Weight + /// Use softmax loss for the multi classification. /// - [TlcModule.SweepableFloatParamAttribute("L2RegularizerWeight", 0f, 0.5f)] - public float L2RegularizerWeight { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("UseSoftmax", new object[]{true, false})] + public bool? UseSoftmax { get; set; } /// - /// Extra weight given to more recent updates + /// Rounds of early stopping, 0 will disable it. /// - public float RecencyGain { get; set; } + public int EarlyStoppingRound { get; set; } /// - /// Whether Recency Gain is multiplicative (vs. additive) + /// Comma seperated list of gains associated to each relevance label. /// - public bool RecencyGainMulti { get; set; } = false; + public string CustomGains { get; set; } = "0,3,7,15,31,63,127,255,511,1023,2047,4095"; /// - /// Do averaging? + /// Number of entries in a batch when loading data. /// - public bool Averaged { get; set; } = true; + public int BatchSize { get; set; } = 1048576; /// - /// The inexactness tolerance for averaging + /// Enable categorical split or not. /// - public float AveragedTolerance { get; set; } = 0.01f; + [TlcModule.SweepableDiscreteParamAttribute("UseCat", new object[]{true, false})] + public bool? UseCat { get; set; } /// - /// Number of iterations + /// Enable missing value auto infer or not. /// - [TlcModule.SweepableLongParamAttribute("NumIterations", 1, 100, stepSize:10, isLogScale:true)] - public int NumIterations { get; set; } = 1; + [TlcModule.SweepableDiscreteParamAttribute("UseMissing", new object[]{true, false})] + public bool UseMissing { get; set; } = false; /// - /// Initial Weights and bias, comma-separated + /// Min number of instances per categorical group. /// - public string InitialWeights { get; set; } + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerGroup", new object[]{10, 50, 100, 200})] + public int MinDataPerGroup { get; set; } = 100; /// - /// Init weights diameter + /// Max number of categorical thresholds. /// - [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] - public float InitWtsDiameter { get; set; } + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MaxCatThreshold", new object[]{8, 16, 32, 64})] + public int MaxCatThreshold { get; set; } = 32; /// - /// Whether to shuffle for each training iteration + /// Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories. /// - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] - public bool Shuffle { get; set; } = true; + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatSmooth", new object[]{1, 10, 20})] + public double CatSmooth { get; set; } = 10d; /// - /// Size of cache when trained in Scope + /// L2 Regularization for categorical split. /// - public int StreamingCacheSize { get; set; } = 1000000; + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatL2", new object[]{0.1f, 0.5f, 1, 5, 10})] + public double CatL2 { get; set; } = 10d; + + /// + /// Parallel LightGBM Learning Algorithm + /// + [JsonConverter(typeof(ComponentSerializer))] + public ParallelLightGBM ParallelTrainer { get; set; } = new SingleParallelLightGBM(); + + /// + /// Column to use for example groupId + /// + public Microsoft.ML.Runtime.EntryPoints.Optional GroupIdColumn { get; set; } + + /// + /// Column to use for example weight + /// + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } /// /// Column to use for labels @@ -6994,7 +7516,7 @@ public sealed partial class OnlineGradientDescentRegressor : Microsoft.ML.Runtim public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -7010,18 +7532,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(OnlineGradientDescentRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LightGbmBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new OnlineGradientDescentRegressorPipelineStep(output); + return new LightGbmBinaryClassifierPipelineStep(output); } - private class OnlineGradientDescentRegressorPipelineStep : ILearningPipelinePredictorStep + private class LightGbmBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public OnlineGradientDescentRegressorPipelineStep(Output output) + public LightGbmBinaryClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -7034,175 +7556,138 @@ public OnlineGradientDescentRegressorPipelineStep(Output output) namespace Trainers { - /// - /// Train an PCA Anomaly model. - /// - public sealed partial class PcaAnomalyDetector : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IUnsupervisedTrainerWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class LightGbmClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// The number of components in the PCA + /// Number of iterations. /// - [TlcModule.SweepableDiscreteParamAttribute("Rank", new object[]{10, 20, 40, 80})] - public int Rank { get; set; } = 20; + [TlcModule.SweepableDiscreteParamAttribute("NumBoostRound", new object[]{10, 20, 50, 100, 150, 200})] + public int NumBoostRound { get; set; } = 100; /// - /// Oversampling parameter for randomized PCA training + /// Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1]. /// - [TlcModule.SweepableDiscreteParamAttribute("Oversampling", new object[]{10, 20, 40})] - public int Oversampling { get; set; } = 20; + [TlcModule.SweepableFloatParamAttribute("LearningRate", 0.025f, 0.4f, isLogScale:true)] + public double? LearningRate { get; set; } /// - /// If enabled, data is centered to be zero mean + /// Maximum leaves for trees. /// - [TlcModule.SweepableDiscreteParamAttribute("Center", new object[]{false, true})] - public bool Center { get; set; } = true; + [TlcModule.SweepableLongParamAttribute("NumLeaves", 2, 128, stepSize:4, isLogScale:true)] + public int? NumLeaves { get; set; } /// - /// The seed for random number generation + /// Minimum number of instances needed in a child. /// - public int? Seed { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerLeaf", new object[]{1, 10, 20, 50})] + public int? MinDataPerLeaf { get; set; } /// - /// Column to use for example weight + /// Max number of bucket bin for features. /// - public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } + public int MaxBin { get; set; } = 255; /// - /// The data to be used for training + /// Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function. /// - public Var TrainingData { get; set; } = new Var(); + [JsonConverter(typeof(ComponentSerializer))] + public BoosterParameterFunction Booster { get; set; } = new GbdtBoosterParameterFunction(); /// - /// Column to use for features + /// Verbose /// - public string FeatureColumn { get; set; } = "Features"; + public bool VerboseEval { get; set; } = false; /// - /// Normalize option for the feature column + /// Printing running messages. /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public bool Silent { get; set; } = true; /// - /// Whether learner should cache input training data + /// Number of parallel threads used to run LightGBM. /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public int? NThread { get; set; } + /// + /// Evaluation metrics. + /// + public LightGbmArgumentsEvalMetricType EvalMetric { get; set; } = LightGbmArgumentsEvalMetricType.DefaultMetric; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IAnomalyDetectionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput - { - /// - /// The trained model - /// - public Var PredictorModel { get; set; } = new Var(); - - } - public Var GetInputData() => TrainingData; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(PcaAnomalyDetector)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } - - TrainingData = dataStep.Data; - } - Output output = experiment.Add(this); - return new PcaAnomalyDetectorPipelineStep(output); - } - - private class PcaAnomalyDetectorPipelineStep : ILearningPipelinePredictorStep - { - public PcaAnomalyDetectorPipelineStep(Output output) - { - Model = output.PredictorModel; - } - - public Var Model { get; } - } - } - } - - namespace Trainers - { - - /// - /// Train an Poisson regression model. - /// - public sealed partial class PoissonRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem - { - - - /// - /// L2 regularization weight - /// - [TlcModule.SweepableFloatParamAttribute("L2Weight", 0f, 1f, numSteps:4)] - public float L2Weight { get; set; } = 1f; + /// + /// Use softmax loss for the multi classification. + /// + [TlcModule.SweepableDiscreteParamAttribute("UseSoftmax", new object[]{true, false})] + public bool? UseSoftmax { get; set; } /// - /// L1 regularization weight + /// Rounds of early stopping, 0 will disable it. /// - [TlcModule.SweepableFloatParamAttribute("L1Weight", 0f, 1f, numSteps:4)] - public float L1Weight { get; set; } = 1f; + public int EarlyStoppingRound { get; set; } /// - /// Tolerance parameter for optimization convergence. Lower = slower, more accurate + /// Comma seperated list of gains associated to each relevance label. /// - [TlcModule.SweepableDiscreteParamAttribute("OptTol", new object[]{0.0001f, 1E-07f})] - public float OptTol { get; set; } = 1E-07f; + public string CustomGains { get; set; } = "0,3,7,15,31,63,127,255,511,1023,2047,4095"; /// - /// Memory size for L-BFGS. Lower=faster, less accurate + /// Number of entries in a batch when loading data. /// - [TlcModule.SweepableDiscreteParamAttribute("MemorySize", new object[]{5, 20, 50})] - public int MemorySize { get; set; } = 20; + public int BatchSize { get; set; } = 1048576; /// - /// Maximum iterations. + /// Enable categorical split or not. /// - [TlcModule.SweepableLongParamAttribute("MaxIterations", 1, 2147483647)] - public int MaxIterations { get; set; } = 2147483647; + [TlcModule.SweepableDiscreteParamAttribute("UseCat", new object[]{true, false})] + public bool? UseCat { get; set; } /// - /// Run SGD to initialize LR weights, converging to this tolerance + /// Enable missing value auto infer or not. /// - public float SgdInitializationTolerance { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("UseMissing", new object[]{true, false})] + public bool UseMissing { get; set; } = false; /// - /// If set to true, produce no output during training. + /// Min number of instances per categorical group. /// - public bool Quiet { get; set; } = false; + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerGroup", new object[]{10, 50, 100, 200})] + public int MinDataPerGroup { get; set; } = 100; /// - /// Init weights diameter + /// Max number of categorical thresholds. /// - [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] - public float InitWtsDiameter { get; set; } + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MaxCatThreshold", new object[]{8, 16, 32, 64})] + public int MaxCatThreshold { get; set; } = 32; /// - /// Whether or not to use threads. Default is true + /// Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories. /// - public bool UseThreads { get; set; } = true; + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatSmooth", new object[]{1, 10, 20})] + public double CatSmooth { get; set; } = 10d; /// - /// Number of threads + /// L2 Regularization for categorical split. /// - public int? NumThreads { get; set; } + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatL2", new object[]{0.1f, 0.5f, 1, 5, 10})] + public double CatL2 { get; set; } = 10d; /// - /// Force densification of the internal optimization vectors + /// Parallel LightGBM Learning Algorithm /// - [TlcModule.SweepableDiscreteParamAttribute("DenseOptimizer", new object[]{false, true})] - public bool DenseOptimizer { get; set; } = false; + [JsonConverter(typeof(ComponentSerializer))] + public ParallelLightGBM ParallelTrainer { get; set; } = new SingleParallelLightGBM(); /// - /// Enforce non-negative weights + /// Column to use for example groupId /// - public bool EnforceNonNegativity { get; set; } = false; + public Microsoft.ML.Runtime.EntryPoints.Optional GroupIdColumn { get; set; } /// /// Column to use for example weight @@ -7235,7 +7720,7 @@ public sealed partial class PoissonRegressor : Microsoft.ML.Runtime.EntryPoints. public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -7251,18 +7736,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(PoissonRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LightGbmClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new PoissonRegressorPipelineStep(output); + return new LightGbmClassifierPipelineStep(output); } - private class PoissonRegressorPipelineStep : ILearningPipelinePredictorStep + private class LightGbmClassifierPipelineStep : ILearningPipelinePredictorStep { - public PoissonRegressorPipelineStep(Output output) + public LightGbmClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -7275,80 +7760,143 @@ public PoissonRegressorPipelineStep(Output output) namespace Trainers { - /// - /// Train an SDCA binary model. - /// - public sealed partial class StochasticDualCoordinateAscentBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class LightGbmRanker : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Loss Function + /// Number of iterations. /// - [JsonConverter(typeof(ComponentSerializer))] - public SDCAClassificationLossFunction LossFunction { get; set; } = new LogLossSDCAClassificationLossFunction(); + [TlcModule.SweepableDiscreteParamAttribute("NumBoostRound", new object[]{10, 20, 50, 100, 150, 200})] + public int NumBoostRound { get; set; } = 100; /// - /// Apply weight to the positive class, for imbalanced data + /// Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1]. /// - public float PositiveInstanceWeight { get; set; } = 1f; + [TlcModule.SweepableFloatParamAttribute("LearningRate", 0.025f, 0.4f, isLogScale:true)] + public double? LearningRate { get; set; } /// - /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// Maximum leaves for trees. + /// + [TlcModule.SweepableLongParamAttribute("NumLeaves", 2, 128, stepSize:4, isLogScale:true)] + public int? NumLeaves { get; set; } + + /// + /// Minimum number of instances needed in a child. + /// + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerLeaf", new object[]{1, 10, 20, 50})] + public int? MinDataPerLeaf { get; set; } + + /// + /// Max number of bucket bin for features. + /// + public int MaxBin { get; set; } = 255; + + /// + /// Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function. /// [JsonConverter(typeof(ComponentSerializer))] - public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); + public BoosterParameterFunction Booster { get; set; } = new GbdtBoosterParameterFunction(); /// - /// The maximum number of examples to use when training the calibrator + /// Verbose /// - public int MaxCalibrationExamples { get; set; } = 1000000; + public bool VerboseEval { get; set; } = false; /// - /// L2 regularizer constant. By default the l2 constant is automatically inferred based on data set. + /// Printing running messages. /// - [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{"", 1E-07f, 1E-06f, 1E-05f, 0.0001f, 0.001f, 0.01f})] - public float? L2Const { get; set; } + public bool Silent { get; set; } = true; /// - /// L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set. + /// Number of parallel threads used to run LightGBM. /// - [TlcModule.SweepableDiscreteParamAttribute("L1Threshold", new object[]{"", 0f, 0.25f, 0.5f, 0.75f, 1f})] - public float? L1Threshold { get; set; } + public int? NThread { get; set; } /// - /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. + /// Evaluation metrics. /// - public int? NumThreads { get; set; } + public LightGbmArgumentsEvalMetricType EvalMetric { get; set; } = LightGbmArgumentsEvalMetricType.DefaultMetric; /// - /// The tolerance for the ratio between duality gap and primal loss for convergence checking. + /// Use softmax loss for the multi classification. /// - [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.001f, 0.01f, 0.1f, 0.2f})] - public float ConvergenceTolerance { get; set; } = 0.1f; + [TlcModule.SweepableDiscreteParamAttribute("UseSoftmax", new object[]{true, false})] + public bool? UseSoftmax { get; set; } /// - /// Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic. + /// Rounds of early stopping, 0 will disable it. /// - [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{"", 10, 20, 100})] - public int? MaxIterations { get; set; } + public int EarlyStoppingRound { get; set; } /// - /// Shuffle data every epoch? + /// Comma seperated list of gains associated to each relevance label. /// - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] - public bool Shuffle { get; set; } = true; + public string CustomGains { get; set; } = "0,3,7,15,31,63,127,255,511,1023,2047,4095"; /// - /// Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations. + /// Number of entries in a batch when loading data. /// - public int? CheckFrequency { get; set; } + public int BatchSize { get; set; } = 1048576; /// - /// The learning rate for adjusting bias from being regularized. + /// Enable categorical split or not. /// - [TlcModule.SweepableDiscreteParamAttribute("BiasLearningRate", new object[]{0f, 0.01f, 0.1f, 1f})] - public float BiasLearningRate { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("UseCat", new object[]{true, false})] + public bool? UseCat { get; set; } + + /// + /// Enable missing value auto infer or not. + /// + [TlcModule.SweepableDiscreteParamAttribute("UseMissing", new object[]{true, false})] + public bool UseMissing { get; set; } = false; + + /// + /// Min number of instances per categorical group. + /// + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerGroup", new object[]{10, 50, 100, 200})] + public int MinDataPerGroup { get; set; } = 100; + + /// + /// Max number of categorical thresholds. + /// + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MaxCatThreshold", new object[]{8, 16, 32, 64})] + public int MaxCatThreshold { get; set; } = 32; + + /// + /// Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatSmooth", new object[]{1, 10, 20})] + public double CatSmooth { get; set; } = 10d; + + /// + /// L2 Regularization for categorical split. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatL2", new object[]{0.1f, 0.5f, 1, 5, 10})] + public double CatL2 { get; set; } = 10d; + + /// + /// Parallel LightGBM Learning Algorithm + /// + [JsonConverter(typeof(ComponentSerializer))] + public ParallelLightGBM ParallelTrainer { get; set; } = new SingleParallelLightGBM(); + + /// + /// Column to use for example groupId + /// + public Microsoft.ML.Runtime.EntryPoints.Optional GroupIdColumn { get; set; } + + /// + /// Column to use for example weight + /// + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } /// /// Column to use for labels @@ -7376,7 +7924,7 @@ public sealed partial class StochasticDualCoordinateAscentBinaryClassifier : Mic public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRankingOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -7392,18 +7940,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(StochasticDualCoordinateAscentBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LightGbmRanker)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new StochasticDualCoordinateAscentBinaryClassifierPipelineStep(output); + return new LightGbmRankerPipelineStep(output); } - private class StochasticDualCoordinateAscentBinaryClassifierPipelineStep : ILearningPipelinePredictorStep + private class LightGbmRankerPipelineStep : ILearningPipelinePredictorStep { - public StochasticDualCoordinateAscentBinaryClassifierPipelineStep(Output output) + public LightGbmRankerPipelineStep(Output output) { Model = output.PredictorModel; } @@ -7416,64 +7964,143 @@ public StochasticDualCoordinateAscentBinaryClassifierPipelineStep(Output output) namespace Trainers { - /// - /// Train an SDCA multi class model - /// - public sealed partial class StochasticDualCoordinateAscentClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class LightGbmRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithGroupId, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Loss Function + /// Number of iterations. + /// + [TlcModule.SweepableDiscreteParamAttribute("NumBoostRound", new object[]{10, 20, 50, 100, 150, 200})] + public int NumBoostRound { get; set; } = 100; + + /// + /// Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1]. + /// + [TlcModule.SweepableFloatParamAttribute("LearningRate", 0.025f, 0.4f, isLogScale:true)] + public double? LearningRate { get; set; } + + /// + /// Maximum leaves for trees. + /// + [TlcModule.SweepableLongParamAttribute("NumLeaves", 2, 128, stepSize:4, isLogScale:true)] + public int? NumLeaves { get; set; } + + /// + /// Minimum number of instances needed in a child. + /// + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerLeaf", new object[]{1, 10, 20, 50})] + public int? MinDataPerLeaf { get; set; } + + /// + /// Max number of bucket bin for features. + /// + public int MaxBin { get; set; } = 255; + + /// + /// Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function. /// [JsonConverter(typeof(ComponentSerializer))] - public SDCAClassificationLossFunction LossFunction { get; set; } = new LogLossSDCAClassificationLossFunction(); + public BoosterParameterFunction Booster { get; set; } = new GbdtBoosterParameterFunction(); /// - /// L2 regularizer constant. By default the l2 constant is automatically inferred based on data set. + /// Verbose /// - [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{"", 1E-07f, 1E-06f, 1E-05f, 0.0001f, 0.001f, 0.01f})] - public float? L2Const { get; set; } + public bool VerboseEval { get; set; } = false; /// - /// L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set. + /// Printing running messages. /// - [TlcModule.SweepableDiscreteParamAttribute("L1Threshold", new object[]{"", 0f, 0.25f, 0.5f, 0.75f, 1f})] - public float? L1Threshold { get; set; } + public bool Silent { get; set; } = true; /// - /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. + /// Number of parallel threads used to run LightGBM. /// - public int? NumThreads { get; set; } + public int? NThread { get; set; } /// - /// The tolerance for the ratio between duality gap and primal loss for convergence checking. + /// Evaluation metrics. /// - [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.001f, 0.01f, 0.1f, 0.2f})] - public float ConvergenceTolerance { get; set; } = 0.1f; + public LightGbmArgumentsEvalMetricType EvalMetric { get; set; } = LightGbmArgumentsEvalMetricType.DefaultMetric; /// - /// Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic. + /// Use softmax loss for the multi classification. /// - [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{"", 10, 20, 100})] - public int? MaxIterations { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("UseSoftmax", new object[]{true, false})] + public bool? UseSoftmax { get; set; } /// - /// Shuffle data every epoch? + /// Rounds of early stopping, 0 will disable it. /// - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] - public bool Shuffle { get; set; } = true; + public int EarlyStoppingRound { get; set; } /// - /// Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations. + /// Comma seperated list of gains associated to each relevance label. /// - public int? CheckFrequency { get; set; } + public string CustomGains { get; set; } = "0,3,7,15,31,63,127,255,511,1023,2047,4095"; /// - /// The learning rate for adjusting bias from being regularized. + /// Number of entries in a batch when loading data. /// - [TlcModule.SweepableDiscreteParamAttribute("BiasLearningRate", new object[]{0f, 0.01f, 0.1f, 1f})] - public float BiasLearningRate { get; set; } + public int BatchSize { get; set; } = 1048576; + + /// + /// Enable categorical split or not. + /// + [TlcModule.SweepableDiscreteParamAttribute("UseCat", new object[]{true, false})] + public bool? UseCat { get; set; } + + /// + /// Enable missing value auto infer or not. + /// + [TlcModule.SweepableDiscreteParamAttribute("UseMissing", new object[]{true, false})] + public bool UseMissing { get; set; } = false; + + /// + /// Min number of instances per categorical group. + /// + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MinDataPerGroup", new object[]{10, 50, 100, 200})] + public int MinDataPerGroup { get; set; } = 100; + + /// + /// Max number of categorical thresholds. + /// + [TlcModule.Range(Inf = 0, Max = 2147483647)] + [TlcModule.SweepableDiscreteParamAttribute("MaxCatThreshold", new object[]{8, 16, 32, 64})] + public int MaxCatThreshold { get; set; } = 32; + + /// + /// Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatSmooth", new object[]{1, 10, 20})] + public double CatSmooth { get; set; } = 10d; + + /// + /// L2 Regularization for categorical split. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("CatL2", new object[]{0.1f, 0.5f, 1, 5, 10})] + public double CatL2 { get; set; } = 10d; + + /// + /// Parallel LightGBM Learning Algorithm + /// + [JsonConverter(typeof(ComponentSerializer))] + public ParallelLightGBM ParallelTrainer { get; set; } = new SingleParallelLightGBM(); + + /// + /// Column to use for example groupId + /// + public Microsoft.ML.Runtime.EntryPoints.Optional GroupIdColumn { get; set; } + + /// + /// Column to use for example weight + /// + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } /// /// Column to use for labels @@ -7501,7 +8128,7 @@ public sealed partial class StochasticDualCoordinateAscentClassifier : Microsoft public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -7517,18 +8144,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(StochasticDualCoordinateAscentClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LightGbmRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new StochasticDualCoordinateAscentClassifierPipelineStep(output); + return new LightGbmRegressorPipelineStep(output); } - private class StochasticDualCoordinateAscentClassifierPipelineStep : ILearningPipelinePredictorStep + private class LightGbmRegressorPipelineStep : ILearningPipelinePredictorStep { - public StochasticDualCoordinateAscentClassifierPipelineStep(Output output) + public LightGbmRegressorPipelineStep(Output output) { Model = output.PredictorModel; } @@ -7542,63 +8169,73 @@ namespace Trainers { /// - /// Train an SDCA regression model + /// Train a linear SVM. /// - public sealed partial class StochasticDualCoordinateAscentRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class LinearSvmBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Loss Function + /// Regularizer constant /// - [JsonConverter(typeof(ComponentSerializer))] - public SDCARegressionLossFunction LossFunction { get; set; } = new SquaredLossSDCARegressionLossFunction(); + [TlcModule.SweepableFloatParamAttribute("Lambda", 1E-05f, 0.1f, stepSize:10, isLogScale:true)] + public float Lambda { get; set; } = 0.001f; /// - /// L2 regularizer constant. By default the l2 constant is automatically inferred based on data set. + /// Batch size /// - [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{"", 1E-07f, 1E-06f, 1E-05f, 0.0001f, 0.001f, 0.01f})] - public float? L2Const { get; set; } + public int BatchSize { get; set; } = 1; /// - /// L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set. + /// Perform projection to unit-ball? Typically used with batch size > 1. /// - [TlcModule.SweepableDiscreteParamAttribute("L1Threshold", new object[]{"", 0f, 0.25f, 0.5f, 0.75f, 1f})] - public float? L1Threshold { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("PerformProjection", new object[]{false, true})] + public bool PerformProjection { get; set; } = false; /// - /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. + /// No bias /// - public int? NumThreads { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("NoBias", new object[]{false, true})] + public bool NoBias { get; set; } = false; /// - /// The tolerance for the ratio between duality gap and primal loss for convergence checking. + /// The calibrator kind to apply to the predictor. Specify null for no calibration /// - [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.001f, 0.01f, 0.1f, 0.2f})] - public float ConvergenceTolerance { get; set; } = 0.01f; + [JsonConverter(typeof(ComponentSerializer))] + public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); /// - /// Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic. + /// The maximum number of examples to use when training the calibrator /// - [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{"", 10, 20, 100})] - public int? MaxIterations { get; set; } + public int MaxCalibrationExamples { get; set; } = 1000000; /// - /// Shuffle data every epoch? + /// Number of iterations /// - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] - public bool Shuffle { get; set; } = true; + [TlcModule.SweepableLongParamAttribute("NumIterations", 1, 100, stepSize:10, isLogScale:true)] + public int NumIterations { get; set; } = 1; /// - /// Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations. + /// Initial Weights and bias, comma-separated /// - public int? CheckFrequency { get; set; } + public string InitialWeights { get; set; } /// - /// The learning rate for adjusting bias from being regularized. + /// Init weights diameter /// - [TlcModule.SweepableDiscreteParamAttribute("BiasLearningRate", new object[]{0f, 0.01f, 0.1f, 1f})] - public float BiasLearningRate { get; set; } = 1f; + [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] + public float InitWtsDiameter { get; set; } + + /// + /// Whether to shuffle for each training iteration + /// + [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] + public bool Shuffle { get; set; } = true; + + /// + /// Size of cache when trained in Scope + /// + public int StreamingCacheSize { get; set; } = 1000000; /// /// Column to use for labels @@ -7626,7 +8263,7 @@ public sealed partial class StochasticDualCoordinateAscentRegressor : Microsoft. public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// /// The trained model @@ -7642,18 +8279,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(StochasticDualCoordinateAscentRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LinearSvmBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new StochasticDualCoordinateAscentRegressorPipelineStep(output); + return new LinearSvmBinaryClassifierPipelineStep(output); } - private class StochasticDualCoordinateAscentRegressorPipelineStep : ILearningPipelinePredictorStep + private class LinearSvmBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public StochasticDualCoordinateAscentRegressorPipelineStep(Output output) + public LinearSvmBinaryClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -7666,73 +8303,83 @@ public StochasticDualCoordinateAscentRegressorPipelineStep(Output output) namespace Trainers { - /// - /// Train an Hogwild SGD binary model. - /// - public sealed partial class StochasticGradientDescentBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class LogisticRegressionBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Loss Function + /// Show statistics of training examples. /// - [JsonConverter(typeof(ComponentSerializer))] - public ClassificationLossFunction LossFunction { get; set; } = new LogLossClassificationLossFunction(); + public bool ShowTrainingStats { get; set; } = false; /// - /// L2 regularizer constant + /// L2 regularization weight /// - [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{1E-07f, 5E-07f, 1E-06f, 5E-06f, 1E-05f})] - public float L2Const { get; set; } = 1E-06f; + [TlcModule.SweepableFloatParamAttribute("L2Weight", 0f, 1f, numSteps:4)] + public float L2Weight { get; set; } = 1f; /// - /// Degree of lock-free parallelism. Defaults to automatic depending on data sparseness. Determinism not guaranteed. + /// L1 regularization weight /// - public int? NumThreads { get; set; } + [TlcModule.SweepableFloatParamAttribute("L1Weight", 0f, 1f, numSteps:4)] + public float L1Weight { get; set; } = 1f; /// - /// Exponential moving averaged improvement tolerance for convergence + /// Tolerance parameter for optimization convergence. Lower = slower, more accurate /// - [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.01f, 0.001f, 0.0001f, 1E-05f})] - public double ConvergenceTolerance { get; set; } = 0.0001d; + [TlcModule.SweepableDiscreteParamAttribute("OptTol", new object[]{0.0001f, 1E-07f})] + public float OptTol { get; set; } = 1E-07f; /// - /// Maximum number of iterations; set to 1 to simulate online learning. + /// Memory size for L-BFGS. Lower=faster, less accurate /// - [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{1, 5, 10, 20})] - public int MaxIterations { get; set; } = 20; + [TlcModule.SweepableDiscreteParamAttribute("MemorySize", new object[]{5, 20, 50})] + public int MemorySize { get; set; } = 20; /// - /// Initial learning rate (only used by SGD) + /// Maximum iterations. /// - public double InitLearningRate { get; set; } = 0.01d; + [TlcModule.SweepableLongParamAttribute("MaxIterations", 1, 2147483647)] + public int MaxIterations { get; set; } = 2147483647; /// - /// Shuffle data every epoch? + /// Run SGD to initialize LR weights, converging to this tolerance /// - [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] - public bool Shuffle { get; set; } = true; + public float SgdInitializationTolerance { get; set; } /// - /// Apply weight to the positive class, for imbalanced data + /// If set to true, produce no output during training. /// - public float PositiveInstanceWeight { get; set; } = 1f; + public bool Quiet { get; set; } = false; /// - /// Convergence check frequency (in terms of number of iterations). Default equals number of threads + /// Init weights diameter /// - public int? CheckFrequency { get; set; } + [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] + public float InitWtsDiameter { get; set; } /// - /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// Whether or not to use threads. Default is true /// - [JsonConverter(typeof(ComponentSerializer))] - public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); + public bool UseThreads { get; set; } = true; /// - /// The maximum number of examples to use when training the calibrator + /// Number of threads /// - public int MaxCalibrationExamples { get; set; } = 1000000; + public int? NumThreads { get; set; } + + /// + /// Force densification of the internal optimization vectors + /// + [TlcModule.SweepableDiscreteParamAttribute("DenseOptimizer", new object[]{false, true})] + public bool DenseOptimizer { get; set; } = false; + + /// + /// Enforce non-negative weights + /// + public bool EnforceNonNegativity { get; set; } = false; /// /// Column to use for example weight @@ -7781,18 +8428,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(StochasticGradientDescentBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LogisticRegressionBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new StochasticGradientDescentBinaryClassifierPipelineStep(output); + return new LogisticRegressionBinaryClassifierPipelineStep(output); } - private class StochasticGradientDescentBinaryClassifierPipelineStep : ILearningPipelinePredictorStep + private class LogisticRegressionBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public StochasticGradientDescentBinaryClassifierPipelineStep(Output output) + public LogisticRegressionBinaryClassifierPipelineStep(Output output) { Model = output.PredictorModel; } @@ -7802,270 +8449,199 @@ public StochasticGradientDescentBinaryClassifierPipelineStep(Output output) } } - namespace Transforms + namespace Trainers { - /// - /// Approximate bootstrap sampling. - /// - public sealed partial class ApproximateBootstrapSampler : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class LogisticRegressionClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Whether this is the out-of-bag sample, that is, all those rows that are not selected by the transform. + /// Show statistics of training examples. /// - public bool Complement { get; set; } = false; + public bool ShowTrainingStats { get; set; } = false; /// - /// The random seed. If unspecified random state will be instead derived from the environment. + /// L2 regularization weight /// - public uint? Seed { get; set; } + [TlcModule.SweepableFloatParamAttribute("L2Weight", 0f, 1f, numSteps:4)] + public float L2Weight { get; set; } = 1f; /// - /// Whether we should attempt to shuffle the source data. By default on, but can be turned off for efficiency. + /// L1 regularization weight /// - public bool ShuffleInput { get; set; } = true; + [TlcModule.SweepableFloatParamAttribute("L1Weight", 0f, 1f, numSteps:4)] + public float L1Weight { get; set; } = 1f; /// - /// When shuffling the output, the number of output rows to keep in that pool. Note that shuffling of output is completely distinct from shuffling of input. + /// Tolerance parameter for optimization convergence. Lower = slower, more accurate /// - public int PoolSize { get; set; } = 1000; + [TlcModule.SweepableDiscreteParamAttribute("OptTol", new object[]{0.0001f, 1E-07f})] + public float OptTol { get; set; } = 1E-07f; /// - /// Input dataset + /// Memory size for L-BFGS. Lower=faster, less accurate /// - public Var Data { get; set; } = new Var(); - - - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); - - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); - - } - public Var GetInputData() => Data; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(ApproximateBootstrapSampler)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } - - Data = dataStep.Data; - } - Output output = experiment.Add(this); - return new ApproximateBootstrapSamplerPipelineStep(output); - } - - private class ApproximateBootstrapSamplerPipelineStep : ILearningPipelineDataStep - { - public ApproximateBootstrapSamplerPipelineStep(Output output) - { - Data = output.OutputData; - Model = output.Model; - } - - public Var Data { get; } - public Var Model { get; } - } - } - } + [TlcModule.SweepableDiscreteParamAttribute("MemorySize", new object[]{5, 20, 50})] + public int MemorySize { get; set; } = 20; - namespace Transforms - { + /// + /// Maximum iterations. + /// + [TlcModule.SweepableLongParamAttribute("MaxIterations", 1, 2147483647)] + public int MaxIterations { get; set; } = 2147483647; - /// - /// For binary prediction, it renames the PredictedLabel and Score columns to include the name of the positive class. - /// - public sealed partial class BinaryPredictionScoreColumnsRenamer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Run SGD to initialize LR weights, converging to this tolerance + /// + public float SgdInitializationTolerance { get; set; } + /// + /// If set to true, produce no output during training. + /// + public bool Quiet { get; set; } = false; /// - /// The predictor model used in scoring + /// Init weights diameter /// - public Var PredictorModel { get; set; } = new Var(); + [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] + public float InitWtsDiameter { get; set; } /// - /// Input dataset + /// Whether or not to use threads. Default is true /// - public Var Data { get; set; } = new Var(); + public bool UseThreads { get; set; } = true; + /// + /// Number of threads + /// + public int? NumThreads { get; set; } - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); - - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); - - } - public Var GetInputData() => Data; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(BinaryPredictionScoreColumnsRenamer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } - - Data = dataStep.Data; - } - Output output = experiment.Add(this); - return new BinaryPredictionScoreColumnsRenamerPipelineStep(output); - } - - private class BinaryPredictionScoreColumnsRenamerPipelineStep : ILearningPipelineDataStep - { - public BinaryPredictionScoreColumnsRenamerPipelineStep(Output output) - { - Data = output.OutputData; - Model = output.Model; - } - - public Var Data { get; } - public Var Model { get; } - } - } - } + /// + /// Force densification of the internal optimization vectors + /// + [TlcModule.SweepableDiscreteParamAttribute("DenseOptimizer", new object[]{false, true})] + public bool DenseOptimizer { get; set; } = false; - namespace Transforms - { + /// + /// Enforce non-negative weights + /// + public bool EnforceNonNegativity { get; set; } = false; - public sealed partial class NormalizeTransformBinColumn : OneToOneColumn, IOneToOneColumn - { /// - /// Max number of bins, power of 2 recommended + /// Column to use for example weight /// - public int? NumBins { get; set; } + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } /// - /// Whether to map zero to zero, preserving sparsity + /// Column to use for labels /// - public bool? FixZero { get; set; } + public string LabelColumn { get; set; } = "Label"; /// - /// Max number of examples used to train the normalizer + /// The data to be used for training /// - public long? MaxTrainingExamples { get; set; } + public Var TrainingData { get; set; } = new Var(); /// - /// Name of the new column + /// Column to use for features /// - public string Name { get; set; } + public string FeatureColumn { get; set; } = "Features"; /// - /// Name of the source column + /// Normalize option for the feature column /// - public string Source { get; set; } + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; - } + /// + /// Whether learner should cache input training data + /// + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - /// - /// The values are assigned into equidensity bins and a value is mapped to its bin_number/number_of_bins. - /// - public sealed partial class BinNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { - public BinNormalizer() + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + } + public Var GetInputData() => TrainingData; - public BinNormalizer(params string[] inputColumns) + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { - if (inputColumns != null) + if (previousStep != null) { - foreach (string input in inputColumns) + if (!(previousStep is ILearningPipelineDataStep dataStep)) { - AddColumn(input); + throw new InvalidOperationException($"{ nameof(LogisticRegressionClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } + + TrainingData = dataStep.Data; } + Output output = experiment.Add(this); + return new LogisticRegressionClassifierPipelineStep(output); } - - public BinNormalizer(params ValueTuple[] inputOutputColumns) + + private class LogisticRegressionClassifierPipelineStep : ILearningPipelinePredictorStep { - if (inputOutputColumns != null) + public LogisticRegressionClassifierPipelineStep(Output output) { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } + Model = output.PredictorModel; } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); + public Var Model { get; } } + } + } + + namespace Trainers + { + + /// + /// + public sealed partial class NaiveBayesClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem + { /// - /// New column definition(s) (optional form: name:src) + /// Column to use for labels /// - public Microsoft.ML.Transforms.NormalizeTransformBinColumn[] Column { get; set; } + public string LabelColumn { get; set; } = "Label"; /// - /// Max number of bins, power of 2 recommended + /// The data to be used for training /// - public int NumBins { get; set; } = 1024; + public Var TrainingData { get; set; } = new Var(); /// - /// Whether to map zero to zero, preserving sparsity + /// Column to use for features /// - public bool FixZero { get; set; } = true; + public string FeatureColumn { get; set; } = "Features"; /// - /// Max number of examples used to train the normalizer + /// Normalize option for the feature column /// - public long MaxTrainingExamples { get; set; } = 1000000000; + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// - /// Input dataset + /// Whether learner should cache input training data /// - public Var Data { get; set; } = new Var(); + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); - - /// - /// Transform model + /// The trained model /// - public Var Model { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); } - public Var GetInputData() => Data; + public Var GetInputData() => TrainingData; public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { @@ -8073,176 +8649,153 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(BinNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(NaiveBayesClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } - Data = dataStep.Data; + TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new BinNormalizerPipelineStep(output); + return new NaiveBayesClassifierPipelineStep(output); } - private class BinNormalizerPipelineStep : ILearningPipelineDataStep + private class NaiveBayesClassifierPipelineStep : ILearningPipelinePredictorStep { - public BinNormalizerPipelineStep(Output output) + public NaiveBayesClassifierPipelineStep(Output output) { - Data = output.OutputData; - Model = output.Model; + Model = output.PredictorModel; } - public Var Data { get; } - public Var Model { get; } + public Var Model { get; } } } } - namespace Transforms + namespace Trainers { - public enum CategoricalTransformOutputKind : byte + + /// + /// + public sealed partial class OnlineGradientDescentRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { - Bag = 1, - Ind = 2, - Key = 3, - Bin = 4 - } - public sealed partial class CategoricalHashTransformColumn : OneToOneColumn, IOneToOneColumn - { /// - /// The number of bits to hash into. Must be between 1 and 30, inclusive. + /// Loss Function /// - public int? HashBits { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public RegressionLossFunction LossFunction { get; set; } = new SquaredLossRegressionLossFunction(); /// - /// Hashing seed + /// Learning rate /// - public uint? Seed { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("LearningRate", new object[]{0.01f, 0.1f, 0.5f, 1f})] + public float LearningRate { get; set; } = 0.1f; /// - /// Whether the position of each term should be included in the hash + /// Decrease learning rate /// - public bool? Ordered { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("DecreaseLearningRate", new object[]{false, true})] + public bool DecreaseLearningRate { get; set; } = true; /// - /// Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit. + /// Number of examples after which weights will be reset to the current average /// - public int? InvertHash { get; set; } + public long? ResetWeightsAfterXExamples { get; set; } /// - /// Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index) + /// Instead of updating averaged weights on every example, only update when loss is nonzero /// - public Microsoft.ML.Transforms.CategoricalTransformOutputKind? OutputKind { get; set; } + public bool DoLazyUpdates { get; set; } = true; /// - /// Name of the new column + /// L2 Regularization Weight /// - public string Name { get; set; } + [TlcModule.SweepableFloatParamAttribute("L2RegularizerWeight", 0f, 0.4f)] + public float L2RegularizerWeight { get; set; } /// - /// Name of the source column + /// Extra weight given to more recent updates /// - public string Source { get; set; } + public float RecencyGain { get; set; } - } + /// + /// Whether Recency Gain is multiplicative (vs. additive) + /// + public bool RecencyGainMulti { get; set; } = false; - /// - /// Encodes the categorical variable with hash-based encoding - /// - public sealed partial class CategoricalHashOneHotVectorizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Do averaging? + /// + public bool Averaged { get; set; } = true; - public CategoricalHashOneHotVectorizer() - { - } - - public CategoricalHashOneHotVectorizer(params string[] inputColumns) - { - if (inputColumns != null) - { - foreach (string input in inputColumns) - { - AddColumn(input); - } - } - } - - public CategoricalHashOneHotVectorizer(params ValueTuple[] inputOutputColumns) - { - if (inputOutputColumns != null) - { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } - } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } + /// + /// The inexactness tolerance for averaging + /// + public float AveragedTolerance { get; set; } = 0.01f; - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); - } + /// + /// Number of iterations + /// + [TlcModule.SweepableLongParamAttribute("NumIterations", 1, 100, stepSize:10, isLogScale:true)] + public int NumIterations { get; set; } = 1; + /// + /// Initial Weights and bias, comma-separated + /// + public string InitialWeights { get; set; } /// - /// New column definition(s) (optional form: name:hashBits:src) + /// Init weights diameter /// - public Microsoft.ML.Transforms.CategoricalHashTransformColumn[] Column { get; set; } + [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] + public float InitWtsDiameter { get; set; } /// - /// Number of bits to hash into. Must be between 1 and 30, inclusive. + /// Whether to shuffle for each training iteration /// - public int HashBits { get; set; } = 16; + [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] + public bool Shuffle { get; set; } = true; /// - /// Hashing seed + /// Size of cache when trained in Scope /// - public uint Seed { get; set; } = 314489979; + public int StreamingCacheSize { get; set; } = 1000000; /// - /// Whether the position of each term should be included in the hash + /// Column to use for labels /// - public bool Ordered { get; set; } = true; + public string LabelColumn { get; set; } = "Label"; /// - /// Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit. + /// The data to be used for training /// - public int InvertHash { get; set; } + public Var TrainingData { get; set; } = new Var(); /// - /// Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index) + /// Column to use for features /// - public Microsoft.ML.Transforms.CategoricalTransformOutputKind OutputKind { get; set; } = Microsoft.ML.Transforms.CategoricalTransformOutputKind.Bag; + public string FeatureColumn { get; set; } = "Features"; /// - /// Input dataset + /// Normalize option for the feature column /// - public Var Data { get; set; } = new Var(); + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + /// + /// Whether learner should cache input training data + /// + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { /// - /// Transform model + /// The trained model /// - public Var Model { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); } - public Var GetInputData() => Data; + public Var GetInputData() => TrainingData; public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { @@ -8250,174 +8803,94 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(CategoricalHashOneHotVectorizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(OnlineGradientDescentRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } - Data = dataStep.Data; + TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new CategoricalHashOneHotVectorizerPipelineStep(output); + return new OnlineGradientDescentRegressorPipelineStep(output); } - private class CategoricalHashOneHotVectorizerPipelineStep : ILearningPipelineDataStep + private class OnlineGradientDescentRegressorPipelineStep : ILearningPipelinePredictorStep { - public CategoricalHashOneHotVectorizerPipelineStep(Output output) + public OnlineGradientDescentRegressorPipelineStep(Output output) { - Data = output.OutputData; - Model = output.Model; + Model = output.PredictorModel; } - public Var Data { get; } - public Var Model { get; } + public Var Model { get; } } } } - namespace Transforms + namespace Trainers { - public enum TermTransformSortOrder : byte - { - Occurrence = 0, - Value = 1 - } - - public sealed partial class CategoricalTransformColumn : OneToOneColumn, IOneToOneColumn + /// + /// + public sealed partial class PcaAnomalyDetector : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IUnsupervisedTrainerWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { - /// - /// Output kind: Bag (multi-set vector), Ind (indicator vector), Key (index), or Binary encoded indicator vector - /// - public Microsoft.ML.Transforms.CategoricalTransformOutputKind? OutputKind { get; set; } - - /// - /// Maximum number of terms to keep when auto-training - /// - public int? MaxNumTerms { get; set; } - - /// - /// List of terms - /// - public string[] Term { get; set; } - - /// - /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). - /// - public Microsoft.ML.Transforms.TermTransformSortOrder? Sort { get; set; } - /// - /// Whether key value metadata should be text, regardless of the actual input type - /// - public bool? TextKeyValues { get; set; } /// - /// Name of the new column + /// The number of components in the PCA /// - public string Name { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("Rank", new object[]{10, 20, 40, 80})] + public int Rank { get; set; } = 20; /// - /// Name of the source column + /// Oversampling parameter for randomized PCA training /// - public string Source { get; set; } - - } - - /// - /// Encodes the categorical variable with one-hot encoding based on term dictionary - /// - public sealed partial class CategoricalOneHotVectorizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { - - public CategoricalOneHotVectorizer() - { - } - - public CategoricalOneHotVectorizer(params string[] inputColumns) - { - if (inputColumns != null) - { - foreach (string input in inputColumns) - { - AddColumn(input); - } - } - } - - public CategoricalOneHotVectorizer(params ValueTuple[] inputOutputColumns) - { - if (inputOutputColumns != null) - { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } - } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); - } - + [TlcModule.SweepableDiscreteParamAttribute("Oversampling", new object[]{10, 20, 40})] + public int Oversampling { get; set; } = 20; /// - /// New column definition(s) (optional form: name:src) + /// If enabled, data is centered to be zero mean /// - public Microsoft.ML.Transforms.CategoricalTransformColumn[] Column { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("Center", new object[]{false, true})] + public bool Center { get; set; } = true; /// - /// Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index) + /// The seed for random number generation /// - public Microsoft.ML.Transforms.CategoricalTransformOutputKind OutputKind { get; set; } = Microsoft.ML.Transforms.CategoricalTransformOutputKind.Ind; + public int? Seed { get; set; } /// - /// Maximum number of terms to keep per column when auto-training + /// Column to use for example weight /// - public int MaxNumTerms { get; set; } = 1000000; + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } /// - /// List of terms + /// The data to be used for training /// - public string[] Term { get; set; } + public Var TrainingData { get; set; } = new Var(); /// - /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). + /// Column to use for features /// - public Microsoft.ML.Transforms.TermTransformSortOrder Sort { get; set; } = Microsoft.ML.Transforms.TermTransformSortOrder.Occurrence; + public string FeatureColumn { get; set; } = "Features"; /// - /// Whether key value metadata should be text, regardless of the actual input type + /// Normalize option for the feature column /// - public bool TextKeyValues { get; set; } = true; + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// - /// Input dataset + /// Whether learner should cache input training data /// - public Var Data { get; set; } = new Var(); + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IAnomalyDetectionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); - - /// - /// Transform model + /// The trained model /// - public Var Model { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); } - public Var GetInputData() => Data; + public Var GetInputData() => TrainingData; public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { @@ -8425,123 +8898,143 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(CategoricalOneHotVectorizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(PcaAnomalyDetector)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } - Data = dataStep.Data; + TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new CategoricalOneHotVectorizerPipelineStep(output); + return new PcaAnomalyDetectorPipelineStep(output); } - private class CategoricalOneHotVectorizerPipelineStep : ILearningPipelineDataStep + private class PcaAnomalyDetectorPipelineStep : ILearningPipelinePredictorStep { - public CategoricalOneHotVectorizerPipelineStep(Output output) + public PcaAnomalyDetectorPipelineStep(Output output) { - Data = output.OutputData; - Model = output.Model; + Model = output.PredictorModel; } - public Var Data { get; } - public Var Model { get; } + public Var Model { get; } } } } - namespace Transforms + namespace Trainers { - public sealed partial class CharTokenizeTransformColumn : OneToOneColumn, IOneToOneColumn + /// + /// + public sealed partial class PoissonRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { + + /// - /// Name of the new column + /// L2 regularization weight /// - public string Name { get; set; } + [TlcModule.SweepableFloatParamAttribute("L2Weight", 0f, 1f, numSteps:4)] + public float L2Weight { get; set; } = 1f; /// - /// Name of the source column + /// L1 regularization weight /// - public string Source { get; set; } + [TlcModule.SweepableFloatParamAttribute("L1Weight", 0f, 1f, numSteps:4)] + public float L1Weight { get; set; } = 1f; - } + /// + /// Tolerance parameter for optimization convergence. Lower = slower, more accurate + /// + [TlcModule.SweepableDiscreteParamAttribute("OptTol", new object[]{0.0001f, 1E-07f})] + public float OptTol { get; set; } = 1E-07f; - /// - /// Character-oriented tokenizer where text is considered a sequence of characters. - /// - public sealed partial class CharacterTokenizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Memory size for L-BFGS. Lower=faster, less accurate + /// + [TlcModule.SweepableDiscreteParamAttribute("MemorySize", new object[]{5, 20, 50})] + public int MemorySize { get; set; } = 20; - public CharacterTokenizer() - { - } - - public CharacterTokenizer(params string[] inputColumns) - { - if (inputColumns != null) - { - foreach (string input in inputColumns) - { - AddColumn(input); - } - } - } - - public CharacterTokenizer(params ValueTuple[] inputOutputColumns) - { - if (inputOutputColumns != null) - { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } - } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } + /// + /// Maximum iterations. + /// + [TlcModule.SweepableLongParamAttribute("MaxIterations", 1, 2147483647)] + public int MaxIterations { get; set; } = 2147483647; - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); - } + /// + /// Run SGD to initialize LR weights, converging to this tolerance + /// + public float SgdInitializationTolerance { get; set; } + /// + /// If set to true, produce no output during training. + /// + public bool Quiet { get; set; } = false; /// - /// New column definition(s) (optional form: name:src) + /// Init weights diameter /// - public Microsoft.ML.Transforms.CharTokenizeTransformColumn[] Column { get; set; } + [TlcModule.SweepableFloatParamAttribute("InitWtsDiameter", 0f, 1f, numSteps:5)] + public float InitWtsDiameter { get; set; } /// - /// Whether to mark the beginning/end of each row/slot with start of text character (0x02)/end of text character (0x03) + /// Whether or not to use threads. Default is true /// - public bool UseMarkerChars { get; set; } = true; + public bool UseThreads { get; set; } = true; /// - /// Input dataset + /// Number of threads /// - public Var Data { get; set; } = new Var(); + public int? NumThreads { get; set; } + /// + /// Force densification of the internal optimization vectors + /// + [TlcModule.SweepableDiscreteParamAttribute("DenseOptimizer", new object[]{false, true})] + public bool DenseOptimizer { get; set; } = false; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + /// + /// Enforce non-negative weights + /// + public bool EnforceNonNegativity { get; set; } = false; + + /// + /// Column to use for example weight + /// + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } + + /// + /// Column to use for labels + /// + public string LabelColumn { get; set; } = "Label"; + + /// + /// The data to be used for training + /// + public Var TrainingData { get; set; } = new Var(); + + /// + /// Column to use for features + /// + public string FeatureColumn { get; set; } = "Features"; + + /// + /// Normalize option for the feature column + /// + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + + /// + /// Whether learner should cache input training data + /// + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { /// - /// Transform model + /// The trained model /// - public Var Model { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); } - public Var GetInputData() => Data; + public Var GetInputData() => TrainingData; public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { @@ -8549,94 +9042,139 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(CharacterTokenizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(PoissonRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } - Data = dataStep.Data; + TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new CharacterTokenizerPipelineStep(output); + return new PoissonRegressorPipelineStep(output); } - private class CharacterTokenizerPipelineStep : ILearningPipelineDataStep + private class PoissonRegressorPipelineStep : ILearningPipelinePredictorStep { - public CharacterTokenizerPipelineStep(Output output) + public PoissonRegressorPipelineStep(Output output) { - Data = output.OutputData; - Model = output.Model; + Model = output.PredictorModel; } - public Var Data { get; } - public Var Model { get; } + public Var Model { get; } } } } - namespace Transforms + namespace Trainers { - public sealed partial class ConcatTransformColumn : ManyToOneColumn, IManyToOneColumn + /// + /// + public sealed partial class StochasticDualCoordinateAscentBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { + + /// - /// Name of the new column + /// Loss Function /// - public string Name { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public SDCAClassificationLossFunction LossFunction { get; set; } = new LogLossSDCAClassificationLossFunction(); /// - /// Name of the source column + /// Apply weight to the positive class, for imbalanced data /// - public string[] Source { get; set; } + public float PositiveInstanceWeight { get; set; } = 1f; - } + /// + /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// + [JsonConverter(typeof(ComponentSerializer))] + public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); - /// - /// Concatenates two columns of the same item type. - /// - public sealed partial class ColumnConcatenator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// The maximum number of examples to use when training the calibrator + /// + public int MaxCalibrationExamples { get; set; } = 1000000; - public ColumnConcatenator() - { - } - - public ColumnConcatenator(string outputColumn, params string[] inputColumns) - { - AddColumn(outputColumn, inputColumns); - } - - public void AddColumn(string name, params string[] source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(ManyToOneColumn.Create(name, source)); - Column = list.ToArray(); - } + /// + /// L2 regularizer constant. By default the l2 constant is automatically inferred based on data set. + /// + [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{"", 1E-07f, 1E-06f, 1E-05f, 0.0001f, 0.001f, 0.01f})] + public float? L2Const { get; set; } + /// + /// L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set. + /// + [TlcModule.SweepableDiscreteParamAttribute("L1Threshold", new object[]{"", 0f, 0.25f, 0.5f, 0.75f, 1f})] + public float? L1Threshold { get; set; } /// - /// New column definition(s) (optional form: name:srcs) + /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. /// - public Microsoft.ML.Transforms.ConcatTransformColumn[] Column { get; set; } + public int? NumThreads { get; set; } /// - /// Input dataset + /// The tolerance for the ratio between duality gap and primal loss for convergence checking. /// - public Var Data { get; set; } = new Var(); + [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.001f, 0.01f, 0.1f, 0.2f})] + public float ConvergenceTolerance { get; set; } = 0.1f; + /// + /// Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic. + /// + [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{"", 10, 20, 100})] + public int? MaxIterations { get; set; } - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + /// + /// Shuffle data every epoch? + /// + [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] + public bool Shuffle { get; set; } = true; + + /// + /// Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations. + /// + public int? CheckFrequency { get; set; } + + /// + /// The learning rate for adjusting bias from being regularized. + /// + [TlcModule.SweepableDiscreteParamAttribute("BiasLearningRate", new object[]{0f, 0.01f, 0.1f, 1f})] + public float BiasLearningRate { get; set; } + + /// + /// Column to use for labels + /// + public string LabelColumn { get; set; } = "Label"; + + /// + /// The data to be used for training + /// + public Var TrainingData { get; set; } = new Var(); + + /// + /// Column to use for features + /// + public string FeatureColumn { get; set; } = "Features"; + + /// + /// Normalize option for the feature column + /// + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + /// + /// Whether learner should cache input training data + /// + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { /// - /// Transform model + /// The trained model /// - public Var Model { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); } - public Var GetInputData() => Data; + public Var GetInputData() => TrainingData; public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { @@ -8644,118 +9182,123 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(ColumnConcatenator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(StochasticDualCoordinateAscentBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } - Data = dataStep.Data; + TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new ColumnConcatenatorPipelineStep(output); + return new StochasticDualCoordinateAscentBinaryClassifierPipelineStep(output); } - private class ColumnConcatenatorPipelineStep : ILearningPipelineDataStep + private class StochasticDualCoordinateAscentBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - public ColumnConcatenatorPipelineStep(Output output) + public StochasticDualCoordinateAscentBinaryClassifierPipelineStep(Output output) { - Data = output.OutputData; - Model = output.Model; + Model = output.PredictorModel; } - public Var Data { get; } - public Var Model { get; } + public Var Model { get; } } } } - namespace Transforms + namespace Trainers { - public sealed partial class CopyColumnsTransformColumn : OneToOneColumn, IOneToOneColumn + /// + /// + public sealed partial class StochasticDualCoordinateAscentClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { + + /// - /// Name of the new column + /// Loss Function /// - public string Name { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public SDCAClassificationLossFunction LossFunction { get; set; } = new LogLossSDCAClassificationLossFunction(); /// - /// Name of the source column + /// L2 regularizer constant. By default the l2 constant is automatically inferred based on data set. /// - public string Source { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{"", 1E-07f, 1E-06f, 1E-05f, 0.0001f, 0.001f, 0.01f})] + public float? L2Const { get; set; } - } + /// + /// L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set. + /// + [TlcModule.SweepableDiscreteParamAttribute("L1Threshold", new object[]{"", 0f, 0.25f, 0.5f, 0.75f, 1f})] + public float? L1Threshold { get; set; } - /// - /// Duplicates columns from the dataset - /// - public sealed partial class ColumnCopier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. + /// + public int? NumThreads { get; set; } - public ColumnCopier() - { - } - - public ColumnCopier(params string[] inputColumns) - { - if (inputColumns != null) - { - foreach (string input in inputColumns) - { - AddColumn(input); - } - } - } - - public ColumnCopier(params ValueTuple[] inputOutputColumns) - { - if (inputOutputColumns != null) - { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } - } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } + /// + /// The tolerance for the ratio between duality gap and primal loss for convergence checking. + /// + [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.001f, 0.01f, 0.1f, 0.2f})] + public float ConvergenceTolerance { get; set; } = 0.1f; - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); - } + /// + /// Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic. + /// + [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{"", 10, 20, 100})] + public int? MaxIterations { get; set; } + /// + /// Shuffle data every epoch? + /// + [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] + public bool Shuffle { get; set; } = true; /// - /// New column definition(s) (optional form: name:src) + /// Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations. /// - public Microsoft.ML.Transforms.CopyColumnsTransformColumn[] Column { get; set; } + public int? CheckFrequency { get; set; } /// - /// Input dataset + /// The learning rate for adjusting bias from being regularized. /// - public Var Data { get; set; } = new Var(); + [TlcModule.SweepableDiscreteParamAttribute("BiasLearningRate", new object[]{0f, 0.01f, 0.1f, 1f})] + public float BiasLearningRate { get; set; } + /// + /// Column to use for labels + /// + public string LabelColumn { get; set; } = "Label"; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + /// + /// The data to be used for training + /// + public Var TrainingData { get; set; } = new Var(); + + /// + /// Column to use for features + /// + public string FeatureColumn { get; set; } = "Features"; + + /// + /// Normalize option for the feature column + /// + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + + /// + /// Whether learner should cache input training data + /// + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IMulticlassClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { /// - /// Transform model + /// The trained model /// - public Var Model { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); } - public Var GetInputData() => Data; + public Var GetInputData() => TrainingData; public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { @@ -8763,64 +9306,123 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(ColumnCopier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(StochasticDualCoordinateAscentClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } - Data = dataStep.Data; + TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new ColumnCopierPipelineStep(output); + return new StochasticDualCoordinateAscentClassifierPipelineStep(output); } - private class ColumnCopierPipelineStep : ILearningPipelineDataStep + private class StochasticDualCoordinateAscentClassifierPipelineStep : ILearningPipelinePredictorStep { - public ColumnCopierPipelineStep(Output output) + public StochasticDualCoordinateAscentClassifierPipelineStep(Output output) { - Data = output.OutputData; - Model = output.Model; + Model = output.PredictorModel; } - public Var Data { get; } - public Var Model { get; } + public Var Model { get; } } } } - namespace Transforms + namespace Trainers { - /// - /// Drops columns from the dataset - /// - public sealed partial class ColumnDropper : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class StochasticDualCoordinateAscentRegressor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Column name to drop + /// Loss Function /// - public string[] Column { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public SDCARegressionLossFunction LossFunction { get; set; } = new SquaredLossSDCARegressionLossFunction(); /// - /// Input dataset + /// L2 regularizer constant. By default the l2 constant is automatically inferred based on data set. /// - public Var Data { get; set; } = new Var(); + [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{"", 1E-07f, 1E-06f, 1E-05f, 0.0001f, 0.001f, 0.01f})] + public float? L2Const { get; set; } + /// + /// L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set. + /// + [TlcModule.SweepableDiscreteParamAttribute("L1Threshold", new object[]{"", 0f, 0.25f, 0.5f, 0.75f, 1f})] + public float? L1Threshold { get; set; } + + /// + /// Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed. + /// + public int? NumThreads { get; set; } + + /// + /// The tolerance for the ratio between duality gap and primal loss for convergence checking. + /// + [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.001f, 0.01f, 0.1f, 0.2f})] + public float ConvergenceTolerance { get; set; } = 0.01f; + + /// + /// Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic. + /// + [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{"", 10, 20, 100})] + public int? MaxIterations { get; set; } + + /// + /// Shuffle data every epoch? + /// + [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] + public bool Shuffle { get; set; } = true; + + /// + /// Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations. + /// + public int? CheckFrequency { get; set; } + + /// + /// The learning rate for adjusting bias from being regularized. + /// + [TlcModule.SweepableDiscreteParamAttribute("BiasLearningRate", new object[]{0f, 0.01f, 0.1f, 1f})] + public float BiasLearningRate { get; set; } = 1f; + + /// + /// Column to use for labels + /// + public string LabelColumn { get; set; } = "Label"; + + /// + /// The data to be used for training + /// + public Var TrainingData { get; set; } = new Var(); + + /// + /// Column to use for features + /// + public string FeatureColumn { get; set; } = "Features"; + + /// + /// Normalize option for the feature column + /// + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + + /// + /// Whether learner should cache input training data + /// + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IRegressionOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput + { /// - /// Transform model + /// The trained model /// - public Var Model { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); } - public Var GetInputData() => Data; + public Var GetInputData() => TrainingData; public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { @@ -8828,210 +9430,195 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(ColumnDropper)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(StochasticDualCoordinateAscentRegressor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } - Data = dataStep.Data; + TrainingData = dataStep.Data; } Output output = experiment.Add(this); - return new ColumnDropperPipelineStep(output); + return new StochasticDualCoordinateAscentRegressorPipelineStep(output); } - private class ColumnDropperPipelineStep : ILearningPipelineDataStep + private class StochasticDualCoordinateAscentRegressorPipelineStep : ILearningPipelinePredictorStep { - public ColumnDropperPipelineStep(Output output) + public StochasticDualCoordinateAscentRegressorPipelineStep(Output output) { - Data = output.OutputData; - Model = output.Model; + Model = output.PredictorModel; } - public Var Data { get; } - public Var Model { get; } + public Var Model { get; } } } } - namespace Transforms + namespace Trainers { /// - /// Selects a set of columns, dropping all others + /// Train an Hogwild SGD binary model. /// - public sealed partial class ColumnSelector : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class StochasticGradientDescentBinaryClassifier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithWeight, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInputWithLabel, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITrainerInput, Microsoft.ML.ILearningPipelineItem { /// - /// Column name to keep + /// Loss Function /// - public string[] Column { get; set; } + [JsonConverter(typeof(ComponentSerializer))] + public ClassificationLossFunction LossFunction { get; set; } = new LogLossClassificationLossFunction(); /// - /// Input dataset + /// L2 regularizer constant /// - public Var Data { get; set; } = new Var(); + [TlcModule.SweepableDiscreteParamAttribute("L2Const", new object[]{1E-07f, 5E-07f, 1E-06f, 5E-06f, 1E-05f})] + public float L2Const { get; set; } = 1E-06f; + /// + /// Degree of lock-free parallelism. Defaults to automatic depending on data sparseness. Determinism not guaranteed. + /// + public int? NumThreads { get; set; } - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + /// + /// Exponential moving averaged improvement tolerance for convergence + /// + [TlcModule.SweepableDiscreteParamAttribute("ConvergenceTolerance", new object[]{0.01f, 0.001f, 0.0001f, 1E-05f})] + public double ConvergenceTolerance { get; set; } = 0.0001d; - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); + /// + /// Maximum number of iterations; set to 1 to simulate online learning. + /// + [TlcModule.SweepableDiscreteParamAttribute("MaxIterations", new object[]{1, 5, 10, 20})] + public int MaxIterations { get; set; } = 20; - } - public Var GetInputData() => Data; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(ColumnSelector)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } + /// + /// Initial learning rate (only used by SGD) + /// + public double InitLearningRate { get; set; } = 0.01d; - Data = dataStep.Data; - } - Output output = experiment.Add(this); - return new ColumnSelectorPipelineStep(output); - } + /// + /// Shuffle data every epoch? + /// + [TlcModule.SweepableDiscreteParamAttribute("Shuffle", new object[]{false, true})] + public bool Shuffle { get; set; } = true; - private class ColumnSelectorPipelineStep : ILearningPipelineDataStep - { - public ColumnSelectorPipelineStep(Output output) - { - Data = output.OutputData; - Model = output.Model; - } + /// + /// Apply weight to the positive class, for imbalanced data + /// + public float PositiveInstanceWeight { get; set; } = 1f; - public Var Data { get; } - public Var Model { get; } - } - } - } + /// + /// Convergence check frequency (in terms of number of iterations). Default equals number of threads + /// + public int? CheckFrequency { get; set; } - namespace Transforms - { - public enum DataKind : byte - { - I1 = 1, - U1 = 2, - I2 = 3, - U2 = 4, - I4 = 5, - U4 = 6, - I8 = 7, - U8 = 8, - R4 = 9, - Num = 9, - R8 = 10, - TX = 11, - Text = 11, - TXT = 11, - BL = 12, - Bool = 12, - TimeSpan = 13, - TS = 13, - DT = 14, - DateTime = 14, - DZ = 15, - DateTimeZone = 15, - UG = 16, - U16 = 16 - } + /// + /// The calibrator kind to apply to the predictor. Specify null for no calibration + /// + [JsonConverter(typeof(ComponentSerializer))] + public CalibratorTrainer Calibrator { get; set; } = new PlattCalibratorCalibratorTrainer(); + /// + /// The maximum number of examples to use when training the calibrator + /// + public int MaxCalibrationExamples { get; set; } = 1000000; - public sealed partial class ConvertTransformColumn : OneToOneColumn, IOneToOneColumn - { /// - /// The result type + /// Column to use for example weight + /// + public Microsoft.ML.Runtime.EntryPoints.Optional WeightColumn { get; set; } + + /// + /// Column to use for labels /// - public Microsoft.ML.Transforms.DataKind? ResultType { get; set; } + public string LabelColumn { get; set; } = "Label"; /// - /// For a key column, this defines the range of values + /// The data to be used for training /// - public string Range { get; set; } + public Var TrainingData { get; set; } = new Var(); /// - /// Name of the new column + /// Column to use for features /// - public string Name { get; set; } + public string FeatureColumn { get; set; } = "Features"; /// - /// Name of the source column + /// Normalize option for the feature column /// - public string Source { get; set; } + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; - } + /// + /// Whether learner should cache input training data + /// + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; - /// - /// Converts a column to a different type, using standard conversions. - /// - public sealed partial class ColumnTypeConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { - public ColumnTypeConverter() + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.IBinaryClassificationOutput, Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITrainerOutput { + /// + /// The trained model + /// + public Var PredictorModel { get; set; } = new Var(); + } + public Var GetInputData() => TrainingData; - public ColumnTypeConverter(params string[] inputColumns) + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { - if (inputColumns != null) + if (previousStep != null) { - foreach (string input in inputColumns) + if (!(previousStep is ILearningPipelineDataStep dataStep)) { - AddColumn(input); + throw new InvalidOperationException($"{ nameof(StochasticGradientDescentBinaryClassifier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } + + TrainingData = dataStep.Data; } + Output output = experiment.Add(this); + return new StochasticGradientDescentBinaryClassifierPipelineStep(output); } - - public ColumnTypeConverter(params ValueTuple[] inputOutputColumns) + + private class StochasticGradientDescentBinaryClassifierPipelineStep : ILearningPipelinePredictorStep { - if (inputOutputColumns != null) + public StochasticGradientDescentBinaryClassifierPipelineStep(Output output) { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } + Model = output.PredictorModel; } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); + public Var Model { get; } } + } + } + + namespace Transforms + { + + /// + /// Approximate bootstrap sampling. + /// + public sealed partial class ApproximateBootstrapSampler : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { /// - /// New column definition(s) (optional form: name:type:src) + /// Whether this is the out-of-bag sample, that is, all those rows that are not selected by the transform. /// - public Microsoft.ML.Transforms.ConvertTransformColumn[] Column { get; set; } + public bool Complement { get; set; } = false; /// - /// The result type + /// The random seed. If unspecified random state will be instead derived from the environment. /// - public Microsoft.ML.Transforms.DataKind? ResultType { get; set; } + public uint? Seed { get; set; } /// - /// For a key column, this defines the range of values + /// Whether we should attempt to shuffle the source data. By default on, but can be turned off for efficiency. /// - public string Range { get; set; } + public bool ShuffleInput { get; set; } = true; + + /// + /// When shuffling the output, the number of output rows to keep in that pool. Note that shuffling of output is completely distinct from shuffling of input. + /// + public int PoolSize { get; set; } = 1000; /// /// Input dataset @@ -9060,18 +9647,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(ColumnTypeConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(ApproximateBootstrapSampler)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new ColumnTypeConverterPipelineStep(output); + return new ApproximateBootstrapSamplerPipelineStep(output); } - private class ColumnTypeConverterPipelineStep : ILearningPipelineDataStep + private class ApproximateBootstrapSamplerPipelineStep : ILearningPipelineDataStep { - public ColumnTypeConverterPipelineStep(Output output) + public ApproximateBootstrapSamplerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -9087,21 +9674,16 @@ namespace Transforms { /// - /// Groups values of a scalar column into a vector, by a contiguous group ID + /// For binary prediction, it renames the PredictedLabel and Score columns to include the name of the positive class. /// - public sealed partial class CombinerByContiguousGroupId : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class BinaryPredictionScoreColumnsRenamer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Columns to group by - /// - public string[] GroupKey { get; set; } - - /// - /// Columns to group together + /// The predictor model used in scoring /// - public string[] Column { get; set; } + public Var PredictorModel { get; set; } = new Var(); /// /// Input dataset @@ -9130,18 +9712,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(CombinerByContiguousGroupId)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(BinaryPredictionScoreColumnsRenamer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new CombinerByContiguousGroupIdPipelineStep(output); + return new BinaryPredictionScoreColumnsRenamerPipelineStep(output); } - private class CombinerByContiguousGroupIdPipelineStep : ILearningPipelineDataStep + private class BinaryPredictionScoreColumnsRenamerPipelineStep : ILearningPipelineDataStep { - public CombinerByContiguousGroupIdPipelineStep(Output output) + public BinaryPredictionScoreColumnsRenamerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -9156,8 +9738,13 @@ public CombinerByContiguousGroupIdPipelineStep(Output output) namespace Transforms { - public sealed partial class NormalizeTransformAffineColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class NormalizeTransformBinColumn : OneToOneColumn, IOneToOneColumn { + /// + /// Max number of bins, power of 2 recommended + /// + public int? NumBins { get; set; } + /// /// Whether to map zero to zero, preserving sparsity /// @@ -9181,16 +9768,16 @@ public sealed partial class NormalizeTransformAffineColumn : OneToOneColumn - /// Normalize the columns only if needed + /// The values are assigned into equidensity bins and a value is mapped to its bin_number/number_of_bins. /// - public sealed partial class ConditionalNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class BinNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public ConditionalNormalizer() + public BinNormalizer() { } - public ConditionalNormalizer(params string[] inputColumns) + public BinNormalizer(params string[] inputColumns) { if (inputColumns != null) { @@ -9201,28 +9788,28 @@ public ConditionalNormalizer(params string[] inputColumns) } } - public ConditionalNormalizer(params ValueTuple[] inputOutputColumns) + public BinNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -9230,7 +9817,12 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.NormalizeTransformAffineColumn[] Column { get; set; } + public NormalizeTransformBinColumn[] Column { get; set; } + + /// + /// Max number of bins, power of 2 recommended + /// + public int NumBins { get; set; } = 1024; /// /// Whether to map zero to zero, preserving sparsity @@ -9248,7 +9840,7 @@ public void AddColumn(string name, string source) public Var Data { get; set; } = new Var(); - public sealed class Output + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput { /// /// Transformed dataset @@ -9269,18 +9861,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(ConditionalNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(BinNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new ConditionalNormalizerPipelineStep(output); + return new BinNormalizerPipelineStep(output); } - private class ConditionalNormalizerPipelineStep : ILearningPipelineDataStep + private class BinNormalizerPipelineStep : ILearningPipelineDataStep { - public ConditionalNormalizerPipelineStep(Output output) + public BinNormalizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -9294,153 +9886,196 @@ public ConditionalNormalizerPipelineStep(Output output) namespace Transforms { - public enum CacheCachingType + public enum CategoricalTransformOutputKind : byte { - Memory = 0, - Disk = 1 + Bag = 1, + Ind = 2, + Key = 3, + Bin = 4 } - /// - /// Caches using the specified cache option. - /// - public sealed partial class DataCache : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class CategoricalHashTransformColumn : OneToOneColumn, IOneToOneColumn { + /// + /// The number of bits to hash into. Must be between 1 and 30, inclusive. + /// + public int? HashBits { get; set; } + /// + /// Hashing seed + /// + public uint? Seed { get; set; } /// - /// Caching strategy + /// Whether the position of each term should be included in the hash /// - public Microsoft.ML.Transforms.CacheCachingType Caching { get; set; } = Microsoft.ML.Transforms.CacheCachingType.Memory; + public bool? Ordered { get; set; } /// - /// Input dataset + /// Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit. /// - public Var Data { get; set; } = new Var(); + public int? InvertHash { get; set; } + /// + /// Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index) + /// + public CategoricalTransformOutputKind? OutputKind { get; set; } - public sealed class Output - { - /// - /// Dataset - /// - public Var OutputData { get; set; } = new Var(); + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string Source { get; set; } + + } + + /// + /// + public sealed partial class CategoricalHashOneHotVectorizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + public CategoricalHashOneHotVectorizer() + { } - public Var GetInputData() => Data; - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + public CategoricalHashOneHotVectorizer(params string[] inputColumns) { - if (previousStep != null) + if (inputColumns != null) { - if (!(previousStep is ILearningPipelineDataStep dataStep)) + foreach (string input in inputColumns) { - throw new InvalidOperationException($"{ nameof(DataCache)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + AddColumn(input); } - - Data = dataStep.Data; } - Output output = experiment.Add(this); - return new DataCachePipelineStep(output); } - - private class DataCachePipelineStep : ILearningPipelineDataStep + + public CategoricalHashOneHotVectorizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { - public DataCachePipelineStep(Output output) + if (inputOutputColumns != null) { - Data = output.OutputData; + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } } - - public Var Data { get; } - public Var Model { get; } } - } - } - - namespace Transforms - { + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } - /// - /// Score a dataset with a predictor model - /// - public sealed partial class DatasetScorer - { + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } /// - /// The dataset to be scored + /// New column definition(s) (optional form: name:hashBits:src) /// - public Var Data { get; set; } = new Var(); + public CategoricalHashTransformColumn[] Column { get; set; } /// - /// The predictor model to apply to data + /// Number of bits to hash into. Must be between 1 and 30, inclusive. /// - public Var PredictorModel { get; set; } = new Var(); + public int HashBits { get; set; } = 16; /// - /// Suffix to append to the score columns + /// Hashing seed /// - public string Suffix { get; set; } - - - public sealed class Output - { - /// - /// The scored dataset - /// - public Var ScoredData { get; set; } = new Var(); - - /// - /// The scoring transform - /// - public Var ScoringTransform { get; set; } = new Var(); - - } - } - } - - namespace Transforms - { + public uint Seed { get; set; } = 314489979; - /// - /// Score a dataset with a transform model - /// - public sealed partial class DatasetTransformScorer - { + /// + /// Whether the position of each term should be included in the hash + /// + public bool Ordered { get; set; } = true; + /// + /// Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit. + /// + public int InvertHash { get; set; } /// - /// The dataset to be scored + /// Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index) /// - public Var Data { get; set; } = new Var(); + public CategoricalTransformOutputKind OutputKind { get; set; } = CategoricalTransformOutputKind.Bag; /// - /// The transform model to apply to data + /// Input dataset /// - public Var TransformModel { get; set; } = new Var(); + public Var Data { get; set; } = new Var(); - public sealed class Output + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput { /// - /// The scored dataset + /// Transformed dataset /// - public Var ScoredData { get; set; } = new Var(); + public Var OutputData { get; set; } = new Var(); /// - /// The scoring transform + /// Transform model /// - public Var ScoringTransform { get; set; } = new Var(); + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(CategoricalHashOneHotVectorizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new CategoricalHashOneHotVectorizerPipelineStep(output); + } + + private class CategoricalHashOneHotVectorizerPipelineStep : ILearningPipelineDataStep + { + public CategoricalHashOneHotVectorizerPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + public Var Data { get; } + public Var Model { get; } } } } namespace Transforms { + public enum TermTransformSortOrder : byte + { + Occurrence = 0, + Value = 1 + } - public sealed partial class TermTransformColumn : OneToOneColumn, IOneToOneColumn + + public sealed partial class CategoricalTransformColumn : OneToOneColumn, IOneToOneColumn { + /// + /// Output kind: Bag (multi-set vector), Ind (indicator vector), Key (index), or Binary encoded indicator vector + /// + public CategoricalTransformOutputKind? OutputKind { get; set; } + /// /// Maximum number of terms to keep when auto-training /// @@ -9454,7 +10089,7 @@ public sealed partial class TermTransformColumn : OneToOneColumn /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). /// - public Microsoft.ML.Transforms.TermTransformSortOrder? Sort { get; set; } + public TermTransformSortOrder? Sort { get; set; } /// /// Whether key value metadata should be text, regardless of the actual input type @@ -9473,17 +10108,16 @@ public sealed partial class TermTransformColumn : OneToOneColumn - /// Converts input values (words, numbers, etc.) to index in a dictionary. - /// - public sealed partial class Dictionarizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class CategoricalOneHotVectorizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public Dictionarizer() + public CategoricalOneHotVectorizer() { } - public Dictionarizer(params string[] inputColumns) + public CategoricalOneHotVectorizer(params string[] inputColumns) { if (inputColumns != null) { @@ -9494,28 +10128,28 @@ public Dictionarizer(params string[] inputColumns) } } - public Dictionarizer(params ValueTuple[] inputOutputColumns) + public CategoricalOneHotVectorizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -9523,7 +10157,12 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.TermTransformColumn[] Column { get; set; } + public CategoricalTransformColumn[] Column { get; set; } + + /// + /// Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index) + /// + public CategoricalTransformOutputKind OutputKind { get; set; } = CategoricalTransformOutputKind.Ind; /// /// Maximum number of terms to keep per column when auto-training @@ -9538,12 +10177,12 @@ public void AddColumn(string name, string source) /// /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). /// - public Microsoft.ML.Transforms.TermTransformSortOrder Sort { get; set; } = Microsoft.ML.Transforms.TermTransformSortOrder.Occurrence; + public TermTransformSortOrder Sort { get; set; } = TermTransformSortOrder.Occurrence; /// /// Whether key value metadata should be text, regardless of the actual input type /// - public bool TextKeyValues { get; set; } = false; + public bool TextKeyValues { get; set; } = true; /// /// Input dataset @@ -9572,18 +10211,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(Dictionarizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(CategoricalOneHotVectorizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new DictionarizerPipelineStep(output); + return new CategoricalOneHotVectorizerPipelineStep(output); } - private class DictionarizerPipelineStep : ILearningPipelineDataStep + private class CategoricalOneHotVectorizerPipelineStep : ILearningPipelineDataStep { - public DictionarizerPipelineStep(Output output) + public CategoricalOneHotVectorizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -9598,87 +10237,74 @@ public DictionarizerPipelineStep(Output output) namespace Transforms { - /// - /// Combines all the features into one feature column. - /// - public sealed partial class FeatureCombiner : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class CharTokenizeTransformColumn : OneToOneColumn, IOneToOneColumn { - - /// - /// Features + /// Name of the new column /// - public string[] Features { get; set; } + public string Name { get; set; } /// - /// Input dataset + /// Name of the source column /// - public Var Data { get; set; } = new Var(); - + public string Source { get; set; } - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + } - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); + /// + public sealed partial class CharacterTokenizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + public CharacterTokenizer() + { } - public Var GetInputData() => Data; - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + public CharacterTokenizer(params string[] inputColumns) { - if (previousStep != null) + if (inputColumns != null) { - if (!(previousStep is ILearningPipelineDataStep dataStep)) + foreach (string input in inputColumns) { - throw new InvalidOperationException($"{ nameof(FeatureCombiner)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + AddColumn(input); } - - Data = dataStep.Data; } - Output output = experiment.Add(this); - return new FeatureCombinerPipelineStep(output); } - - private class FeatureCombinerPipelineStep : ILearningPipelineDataStep + + public CharacterTokenizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { - public FeatureCombinerPipelineStep(Output output) + if (inputOutputColumns != null) { - Data = output.OutputData; - Model = output.Model; + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } } - - public Var Data { get; } - public Var Model { get; } } - } - } - - namespace Transforms - { + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } - /// - /// Selects the slots for which the count of non-default values is greater than or equal to a threshold. - /// - public sealed partial class FeatureSelectorByCount : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } /// - /// Columns to use for feature selection + /// New column definition(s) (optional form: name:src) /// - public string[] Column { get; set; } + public CharTokenizeTransformColumn[] Column { get; set; } /// - /// If the count of non-default values for a slot is greater than or equal to this threshold, the slot is preserved + /// Whether to mark the beginning/end of each row/slot with start of text character (0x02)/end of text character (0x03) /// - public long Count { get; set; } = 1; + public bool UseMarkerChars { get; set; } = true; /// /// Input dataset @@ -9707,18 +10333,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FeatureSelectorByCount)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(CharacterTokenizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new FeatureSelectorByCountPipelineStep(output); + return new CharacterTokenizerPipelineStep(output); } - private class FeatureSelectorByCountPipelineStep : ILearningPipelineDataStep + private class CharacterTokenizerPipelineStep : ILearningPipelineDataStep { - public FeatureSelectorByCountPipelineStep(Output output) + public CharacterTokenizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -9733,32 +10359,47 @@ public FeatureSelectorByCountPipelineStep(Output output) namespace Transforms { - /// - /// Selects the top k slots across all specified columns ordered by their mutual information with the label column. - /// - public sealed partial class FeatureSelectorByMutualInformation : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class ConcatTransformColumn : ManyToOneColumn, IManyToOneColumn { - - /// - /// Columns to use for feature selection + /// Name of the new column /// - public string[] Column { get; set; } + public string Name { get; set; } /// - /// Column to use for labels + /// Name of the source column /// - public string LabelColumn { get; set; } = "Label"; + public string[] Source { get; set; } + + } + + /// + /// Concatenates one or more columns of the same item type. + /// + public sealed partial class ColumnConcatenator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public ColumnConcatenator() + { + } + + public ColumnConcatenator(string outputColumn, params string[] inputColumns) + { + AddColumn(outputColumn, inputColumns); + } + + public void AddColumn(string name, params string[] source) + { + var list = Column == null ? new List() : new List(Column); + list.Add(ManyToOneColumn.Create(name, source)); + Column = list.ToArray(); + } - /// - /// The maximum number of slots to preserve in output - /// - public int SlotsInOutput { get; set; } = 1000; /// - /// Max number of bins for R4/R8 columns, power of 2 recommended + /// New column definition(s) (optional form: name:srcs) /// - public int NumBins { get; set; } = 256; + public ConcatTransformColumn[] Column { get; set; } /// /// Input dataset @@ -9787,18 +10428,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(FeatureSelectorByMutualInformation)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(ColumnConcatenator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new FeatureSelectorByMutualInformationPipelineStep(output); + return new ColumnConcatenatorPipelineStep(output); } - private class FeatureSelectorByMutualInformationPipelineStep : ILearningPipelineDataStep + private class ColumnConcatenatorPipelineStep : ILearningPipelineDataStep { - public FeatureSelectorByMutualInformationPipelineStep(Output output) + public ColumnConcatenatorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -9813,23 +10454,8 @@ public FeatureSelectorByMutualInformationPipelineStep(Output output) namespace Transforms { - public sealed partial class LpNormNormalizerTransformGcnColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class CopyColumnsTransformColumn : OneToOneColumn, IOneToOneColumn { - /// - /// Normalize by standard deviation rather than L2 norm - /// - public bool? UseStdDev { get; set; } - - /// - /// Scale features by this value - /// - public float? Scale { get; set; } - - /// - /// Subtract mean from each value before normalizing - /// - public bool? SubMean { get; set; } - /// /// Name of the new column /// @@ -9843,16 +10469,16 @@ public sealed partial class LpNormNormalizerTransformGcnColumn : OneToOneColumn< } /// - /// Performs a global contrast normalization on input values: Y = (s * X - M) / D, where s is a scale, M is mean and D is either L2 norm or standard deviation. + /// Duplicates columns from the dataset /// - public sealed partial class GlobalContrastNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class ColumnCopier : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public GlobalContrastNormalizer() + public ColumnCopier() { } - public GlobalContrastNormalizer(params string[] inputColumns) + public ColumnCopier(params string[] inputColumns) { if (inputColumns != null) { @@ -9863,28 +10489,28 @@ public GlobalContrastNormalizer(params string[] inputColumns) } } - public GlobalContrastNormalizer(params ValueTuple[] inputOutputColumns) + public ColumnCopier(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -9892,22 +10518,7 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.LpNormNormalizerTransformGcnColumn[] Column { get; set; } - - /// - /// Subtract mean from each value before normalizing - /// - public bool SubMean { get; set; } = true; - - /// - /// Normalize by standard deviation rather than L2 norm - /// - public bool UseStdDev { get; set; } = false; - - /// - /// Scale features by this value - /// - public float Scale { get; set; } = 1f; + public CopyColumnsTransformColumn[] Column { get; set; } /// /// Input dataset @@ -9936,18 +10547,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(GlobalContrastNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(ColumnCopier)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new GlobalContrastNormalizerPipelineStep(output); + return new ColumnCopierPipelineStep(output); } - private class GlobalContrastNormalizerPipelineStep : ILearningPipelineDataStep + private class ColumnCopierPipelineStep : ILearningPipelineDataStep { - public GlobalContrastNormalizerPipelineStep(Output output) + public ColumnCopierPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -9962,116 +10573,82 @@ public GlobalContrastNormalizerPipelineStep(Output output) namespace Transforms { - public sealed partial class HashJoinTransformColumn : OneToOneColumn, IOneToOneColumn + /// + /// Drops columns from the dataset + /// + public sealed partial class ColumnDropper : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - /// - /// Whether the values need to be combined for a single hash - /// - public bool? Join { get; set; } - - /// - /// Which slots should be combined together. Example: 0,3,5;0,1;3;2,1,0. Overrides 'join'. - /// - public string CustomSlotMap { get; set; } - - /// - /// Number of bits to hash into. Must be between 1 and 31, inclusive. - /// - public int? HashBits { get; set; } - /// - /// Hashing seed - /// - public uint? Seed { get; set; } /// - /// Whether the position of each term should be included in the hash + /// Column name to drop /// - public bool? Ordered { get; set; } + public string[] Column { get; set; } /// - /// Name of the new column + /// Input dataset /// - public string Name { get; set; } + public Var Data { get; set; } = new Var(); - /// - /// Name of the source column - /// - public string Source { get; set; } - } + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); - /// - /// Converts column values into hashes. This transform accepts both numeric and text inputs, both single and vector-valued columns. This is a part of the Dracula transform. - /// - public sealed partial class HashConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); - public HashConverter() - { } + public Var GetInputData() => Data; - public HashConverter(params string[] inputColumns) + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { - if (inputColumns != null) + if (previousStep != null) { - foreach (string input in inputColumns) + if (!(previousStep is ILearningPipelineDataStep dataStep)) { - AddColumn(input); + throw new InvalidOperationException($"{ nameof(ColumnDropper)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } + + Data = dataStep.Data; } + Output output = experiment.Add(this); + return new ColumnDropperPipelineStep(output); } - - public HashConverter(params ValueTuple[] inputOutputColumns) + + private class ColumnDropperPipelineStep : ILearningPipelineDataStep { - if (inputOutputColumns != null) + public ColumnDropperPipelineStep(Output output) { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } + Data = output.OutputData; + Model = output.Model; } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); + public Var Data { get; } + public Var Model { get; } } + } + } + namespace Transforms + { - /// - /// New column definition(s) (optional form: name:src) - /// - public Microsoft.ML.Transforms.HashJoinTransformColumn[] Column { get; set; } - - /// - /// Whether the values need to be combined for a single hash - /// - public bool Join { get; set; } = true; - - /// - /// Number of bits to hash into. Must be between 1 and 31, inclusive. - /// - public int HashBits { get; set; } = 31; + /// + /// Selects a set of columns, dropping all others + /// + public sealed partial class ColumnSelector : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { - /// - /// Hashing seed - /// - public uint Seed { get; set; } = 314489979; /// - /// Whether the position of each term should be included in the hash + /// Column name to keep /// - public bool Ordered { get; set; } = true; + public string[] Column { get; set; } /// /// Input dataset @@ -10100,18 +10677,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(HashConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(ColumnSelector)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new HashConverterPipelineStep(output); + return new ColumnSelectorPipelineStep(output); } - private class HashConverterPipelineStep : ILearningPipelineDataStep + private class ColumnSelectorPipelineStep : ILearningPipelineDataStep { - public HashConverterPipelineStep(Output output) + public ColumnSelectorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -10126,8 +10703,18 @@ public HashConverterPipelineStep(Output output) namespace Transforms { - public sealed partial class KeyToValueTransformColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class ConvertTransformColumn : OneToOneColumn, IOneToOneColumn { + /// + /// The result type + /// + public Microsoft.ML.Data.DataKind? ResultType { get; set; } + + /// + /// For a key column, this defines the range of values + /// + public string Range { get; set; } + /// /// Name of the new column /// @@ -10141,16 +10728,16 @@ public sealed partial class KeyToValueTransformColumn : OneToOneColumn - /// KeyToValueTransform utilizes KeyValues metadata to map key indices to the corresponding values in the KeyValues metadata. + /// Converts a column to a different type, using standard conversions. /// - public sealed partial class KeyToTextConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class ColumnTypeConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public KeyToTextConverter() + public ColumnTypeConverter() { } - public KeyToTextConverter(params string[] inputColumns) + public ColumnTypeConverter(params string[] inputColumns) { if (inputColumns != null) { @@ -10161,36 +10748,46 @@ public KeyToTextConverter(params string[] inputColumns) } } - public KeyToTextConverter(params ValueTuple[] inputOutputColumns) + public ColumnTypeConverter(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } /// - /// New column definition(s) (optional form: name:src) + /// New column definition(s) (optional form: name:type:src) + /// + public ConvertTransformColumn[] Column { get; set; } + + /// + /// The result type /// - public Microsoft.ML.Transforms.KeyToValueTransformColumn[] Column { get; set; } + public Microsoft.ML.Data.DataKind? ResultType { get; set; } + + /// + /// For a key column, this defines the range of values + /// + public string Range { get; set; } /// /// Input dataset @@ -10219,18 +10816,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(KeyToTextConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(ColumnTypeConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new KeyToTextConverterPipelineStep(output); + return new ColumnTypeConverterPipelineStep(output); } - private class KeyToTextConverterPipelineStep : ILearningPipelineDataStep + private class ColumnTypeConverterPipelineStep : ILearningPipelineDataStep { - public KeyToTextConverterPipelineStep(Output output) + public ColumnTypeConverterPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -10245,22 +10842,20 @@ public KeyToTextConverterPipelineStep(Output output) namespace Transforms { - /// - /// Transforms the label to either key or bool (if needed) to make it suitable for classification. - /// - public sealed partial class LabelColumnKeyBooleanConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + public sealed partial class CombinerByContiguousGroupId : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Convert the key values to text + /// Columns to group by /// - public bool TextKeyValues { get; set; } = true; + public string[] GroupKey { get; set; } /// - /// The label column + /// Columns to group together /// - public string LabelColumn { get; set; } + public string[] Column { get; set; } /// /// Input dataset @@ -10289,18 +10884,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(LabelColumnKeyBooleanConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(CombinerByContiguousGroupId)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new LabelColumnKeyBooleanConverterPipelineStep(output); + return new CombinerByContiguousGroupIdPipelineStep(output); } - private class LabelColumnKeyBooleanConverterPipelineStep : ILearningPipelineDataStep + private class CombinerByContiguousGroupIdPipelineStep : ILearningPipelineDataStep { - public LabelColumnKeyBooleanConverterPipelineStep(Output output) + public CombinerByContiguousGroupIdPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -10315,12 +10910,17 @@ public LabelColumnKeyBooleanConverterPipelineStep(Output output) namespace Transforms { - public sealed partial class LabelIndicatorTransformColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class NormalizeTransformAffineColumn : OneToOneColumn, IOneToOneColumn { /// - /// The positive example class for binary classification. + /// Whether to map zero to zero, preserving sparsity /// - public int? ClassIndex { get; set; } + public bool? FixZero { get; set; } + + /// + /// Max number of examples used to train the normalizer + /// + public long? MaxTrainingExamples { get; set; } /// /// Name of the new column @@ -10335,16 +10935,16 @@ public sealed partial class LabelIndicatorTransformColumn : OneToOneColumn - public sealed partial class LabelIndicator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class ConditionalNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public LabelIndicator() + public ConditionalNormalizer() { } - public LabelIndicator(params string[] inputColumns) + public ConditionalNormalizer(params string[] inputColumns) { if (inputColumns != null) { @@ -10355,28 +10955,28 @@ public LabelIndicator(params string[] inputColumns) } } - public LabelIndicator(params ValueTuple[] inputOutputColumns) + public ConditionalNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -10384,12 +10984,17 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.LabelIndicatorTransformColumn[] Column { get; set; } + public NormalizeTransformAffineColumn[] Column { get; set; } /// - /// Label of the positive class. + /// Whether to map zero to zero, preserving sparsity /// - public int ClassIndex { get; set; } + public bool FixZero { get; set; } = true; + + /// + /// Max number of examples used to train the normalizer + /// + public long MaxTrainingExamples { get; set; } = 1000000000; /// /// Input dataset @@ -10397,7 +11002,7 @@ public void AddColumn(string name, string source) public Var Data { get; set; } = new Var(); - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + public sealed class Output { /// /// Transformed dataset @@ -10418,18 +11023,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(LabelIndicator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(ConditionalNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new LabelIndicatorPipelineStep(output); + return new ConditionalNormalizerPipelineStep(output); } - private class LabelIndicatorPipelineStep : ILearningPipelineDataStep + private class ConditionalNormalizerPipelineStep : ILearningPipelineDataStep { - public LabelIndicatorPipelineStep(Output output) + public ConditionalNormalizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -10443,18 +11048,24 @@ public LabelIndicatorPipelineStep(Output output) namespace Transforms { + public enum CacheCachingType + { + Memory = 0, + Disk = 1 + } + /// - /// Transforms the label to float to make it suitable for regression. + /// Caches using the specified cache option. /// - public sealed partial class LabelToFloatConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class DataCache : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// The label column + /// Caching strategy /// - public string LabelColumn { get; set; } + public CacheCachingType Caching { get; set; } = CacheCachingType.Memory; /// /// Input dataset @@ -10462,18 +11073,13 @@ public sealed partial class LabelToFloatConverter : Microsoft.ML.Runtime.EntryPo public Var Data { get; set; } = new Var(); - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + public sealed class Output { /// - /// Transformed dataset + /// Dataset /// public Var OutputData { get; set; } = new Var(); - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); - } public Var GetInputData() => Data; @@ -10483,21 +11089,20 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(LabelToFloatConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(DataCache)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new LabelToFloatConverterPipelineStep(output); + return new DataCachePipelineStep(output); } - private class LabelToFloatConverterPipelineStep : ILearningPipelineDataStep + private class DataCachePipelineStep : ILearningPipelineDataStep { - public LabelToFloatConverterPipelineStep(Output output) + public DataCachePipelineStep(Output output) { Data = output.OutputData; - Model = output.Model; } public Var Data { get; } @@ -10509,159 +11114,106 @@ public LabelToFloatConverterPipelineStep(Output output) namespace Transforms { - public sealed partial class NormalizeTransformLogNormalColumn : OneToOneColumn, IOneToOneColumn + /// + /// Score a dataset with a predictor model + /// + public sealed partial class DatasetScorer { + + /// - /// Max number of examples used to train the normalizer + /// The dataset to be scored /// - public long? MaxTrainingExamples { get; set; } + public Var Data { get; set; } = new Var(); /// - /// Name of the new column + /// The predictor model to apply to data /// - public string Name { get; set; } + public Var PredictorModel { get; set; } = new Var(); /// - /// Name of the source column + /// Suffix to append to the score columns /// - public string Source { get; set; } + public string Suffix { get; set; } + + + public sealed class Output + { + /// + /// The scored dataset + /// + public Var ScoredData { get; set; } = new Var(); + + /// + /// The scoring transform + /// + public Var ScoringTransform { get; set; } = new Var(); + } } + } + + namespace Transforms + { /// - /// Normalizes the data based on the computed mean and variance of the logarithm of the data. + /// Score a dataset with a transform model /// - public sealed partial class LogMeanVarianceNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class DatasetTransformScorer { - public LogMeanVarianceNormalizer() + + /// + /// The dataset to be scored + /// + public Var Data { get; set; } = new Var(); + + /// + /// The transform model to apply to data + /// + public Var TransformModel { get; set; } = new Var(); + + + public sealed class Output { - } - - public LogMeanVarianceNormalizer(params string[] inputColumns) - { - if (inputColumns != null) - { - foreach (string input in inputColumns) - { - AddColumn(input); - } - } - } - - public LogMeanVarianceNormalizer(params ValueTuple[] inputOutputColumns) - { - if (inputOutputColumns != null) - { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } - } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); - } - - - /// - /// Whether to use CDF as the output - /// - public bool UseCdf { get; set; } = true; - - /// - /// New column definition(s) (optional form: name:src) - /// - public Microsoft.ML.Transforms.NormalizeTransformLogNormalColumn[] Column { get; set; } - - /// - /// Max number of examples used to train the normalizer - /// - public long MaxTrainingExamples { get; set; } = 1000000000; - - /// - /// Input dataset - /// - public Var Data { get; set; } = new Var(); - - - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); - - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); - - } - public Var GetInputData() => Data; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(LogMeanVarianceNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } - - Data = dataStep.Data; - } - Output output = experiment.Add(this); - return new LogMeanVarianceNormalizerPipelineStep(output); - } - - private class LogMeanVarianceNormalizerPipelineStep : ILearningPipelineDataStep - { - public LogMeanVarianceNormalizerPipelineStep(Output output) - { - Data = output.OutputData; - Model = output.Model; - } - - public Var Data { get; } - public Var Model { get; } + /// + /// The scored dataset + /// + public Var ScoredData { get; set; } = new Var(); + + /// + /// The scoring transform + /// + public Var ScoringTransform { get; set; } = new Var(); + } } } namespace Transforms { - public enum LpNormNormalizerTransformNormalizerKind : byte + + public sealed partial class TermTransformColumn : OneToOneColumn, IOneToOneColumn { - L2Norm = 0, - StdDev = 1, - L1Norm = 2, - LInf = 3 - } + /// + /// Maximum number of terms to keep when auto-training + /// + public int? MaxNumTerms { get; set; } + /// + /// List of terms + /// + public string[] Term { get; set; } - public sealed partial class LpNormNormalizerTransformColumn : OneToOneColumn, IOneToOneColumn - { /// - /// The norm to use to normalize each sample + /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). /// - public Microsoft.ML.Transforms.LpNormNormalizerTransformNormalizerKind? NormKind { get; set; } + public TermTransformSortOrder? Sort { get; set; } /// - /// Subtract mean from each value before normalizing + /// Whether key value metadata should be text, regardless of the actual input type /// - public bool? SubMean { get; set; } + public bool? TextKeyValues { get; set; } /// /// Name of the new column @@ -10676,16 +11228,16 @@ public sealed partial class LpNormNormalizerTransformColumn : OneToOneColumn - /// Normalize vectors (rows) individually by rescaling them to unit norm (L2, L1 or LInf). Performs the following operation on a vector X: Y = (X - M) / D, where M is mean and D is either L2 norm, L1 norm or LInf norm. + /// Converts input values (words, numbers, etc.) to index in a dictionary. /// - public sealed partial class LpNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class Dictionarizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public LpNormalizer() + public Dictionarizer() { } - public LpNormalizer(params string[] inputColumns) + public Dictionarizer(params string[] inputColumns) { if (inputColumns != null) { @@ -10696,28 +11248,28 @@ public LpNormalizer(params string[] inputColumns) } } - public LpNormalizer(params ValueTuple[] inputOutputColumns) + public Dictionarizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -10725,17 +11277,27 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.LpNormNormalizerTransformColumn[] Column { get; set; } + public TermTransformColumn[] Column { get; set; } /// - /// The norm to use to normalize each sample + /// Maximum number of terms to keep per column when auto-training /// - public Microsoft.ML.Transforms.LpNormNormalizerTransformNormalizerKind NormKind { get; set; } = Microsoft.ML.Transforms.LpNormNormalizerTransformNormalizerKind.L2Norm; + public int MaxNumTerms { get; set; } = 1000000; /// - /// Subtract mean from each value before normalizing + /// List of terms /// - public bool SubMean { get; set; } = false; + public string[] Term { get; set; } + + /// + /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). + /// + public TermTransformSortOrder Sort { get; set; } = TermTransformSortOrder.Occurrence; + + /// + /// Whether key value metadata should be text, regardless of the actual input type + /// + public bool TextKeyValues { get; set; } = false; /// /// Input dataset @@ -10764,18 +11326,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(LpNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(Dictionarizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new LpNormalizerPipelineStep(output); + return new DictionarizerPipelineStep(output); } - private class LpNormalizerPipelineStep : ILearningPipelineDataStep + private class DictionarizerPipelineStep : ILearningPipelineDataStep { - public LpNormalizerPipelineStep(Output output) + public DictionarizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -10791,103 +11353,85 @@ namespace Transforms { /// - /// Combines a sequence of TransformModels and a PredictorModel into a single PredictorModel. + /// Combines all the features into one feature column. /// - public sealed partial class ManyHeterogeneousModelCombiner + public sealed partial class FeatureCombiner : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Transform model + /// Features /// - public ArrayVar TransformModels { get; set; } = new ArrayVar(); + public string[] Features { get; set; } /// - /// Predictor model + /// Input dataset /// - public Var PredictorModel { get; set; } = new Var(); + public Var Data { get; set; } = new Var(); - public sealed class Output + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput { /// - /// Predictor model + /// Transformed dataset /// - public Var PredictorModel { get; set; } = new Var(); - - } - } - } - - namespace Transforms - { + public Var OutputData { get; set; } = new Var(); - /// - /// Normalizes the data based on the computed mean and variance of the data. - /// - public sealed partial class MeanVarianceNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); - public MeanVarianceNormalizer() - { } + public Var GetInputData() => Data; - public MeanVarianceNormalizer(params string[] inputColumns) + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { - if (inputColumns != null) + if (previousStep != null) { - foreach (string input in inputColumns) + if (!(previousStep is ILearningPipelineDataStep dataStep)) { - AddColumn(input); + throw new InvalidOperationException($"{ nameof(FeatureCombiner)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } + + Data = dataStep.Data; } + Output output = experiment.Add(this); + return new FeatureCombinerPipelineStep(output); } - - public MeanVarianceNormalizer(params ValueTuple[] inputOutputColumns) + + private class FeatureCombinerPipelineStep : ILearningPipelineDataStep { - if (inputOutputColumns != null) + public FeatureCombinerPipelineStep(Output output) { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } + Data = output.OutputData; + Model = output.Model; } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); + public Var Data { get; } + public Var Model { get; } } + } + } + namespace Transforms + { - /// - /// Whether to use CDF as the output - /// - public bool UseCdf { get; set; } = false; + /// + /// + public sealed partial class FeatureSelectorByCount : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { - /// - /// New column definition(s) (optional form: name:src) - /// - public Microsoft.ML.Transforms.NormalizeTransformAffineColumn[] Column { get; set; } /// - /// Whether to map zero to zero, preserving sparsity + /// Columns to use for feature selection /// - public bool FixZero { get; set; } = true; + public string[] Column { get; set; } /// - /// Max number of examples used to train the normalizer + /// If the count of non-default values for a slot is greater than or equal to this threshold, the slot is preserved /// - public long MaxTrainingExamples { get; set; } = 1000000000; + public long Count { get; set; } = 1; /// /// Input dataset @@ -10916,18 +11460,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(MeanVarianceNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FeatureSelectorByCount)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new MeanVarianceNormalizerPipelineStep(output); + return new FeatureSelectorByCountPipelineStep(output); } - private class MeanVarianceNormalizerPipelineStep : ILearningPipelineDataStep + private class FeatureSelectorByCountPipelineStep : ILearningPipelineDataStep { - public MeanVarianceNormalizerPipelineStep(Output output) + public FeatureSelectorByCountPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -10942,67 +11486,31 @@ public MeanVarianceNormalizerPipelineStep(Output output) namespace Transforms { - /// - /// Normalizes the data based on the observed minimum and maximum values of the data. - /// - public sealed partial class MinMaxNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class FeatureSelectorByMutualInformation : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public MinMaxNormalizer() - { - } - - public MinMaxNormalizer(params string[] inputColumns) - { - if (inputColumns != null) - { - foreach (string input in inputColumns) - { - AddColumn(input); - } - } - } - - public MinMaxNormalizer(params ValueTuple[] inputOutputColumns) - { - if (inputOutputColumns != null) - { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } - } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); - } + /// + /// Columns to use for feature selection + /// + public string[] Column { get; set; } /// - /// New column definition(s) (optional form: name:src) + /// Column to use for labels /// - public Microsoft.ML.Transforms.NormalizeTransformAffineColumn[] Column { get; set; } + public string LabelColumn { get; set; } = "Label"; /// - /// Whether to map zero to zero, preserving sparsity + /// The maximum number of slots to preserve in output /// - public bool FixZero { get; set; } = true; + public int SlotsInOutput { get; set; } = 1000; /// - /// Max number of examples used to train the normalizer + /// Max number of bins for R4/R8 columns, power of 2 recommended /// - public long MaxTrainingExamples { get; set; } = 1000000000; + public int NumBins { get; set; } = 256; /// /// Input dataset @@ -11031,18 +11539,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(MinMaxNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(FeatureSelectorByMutualInformation)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new MinMaxNormalizerPipelineStep(output); + return new FeatureSelectorByMutualInformationPipelineStep(output); } - private class MinMaxNormalizerPipelineStep : ILearningPipelineDataStep + private class FeatureSelectorByMutualInformationPipelineStep : ILearningPipelineDataStep { - public MinMaxNormalizerPipelineStep(Output output) + public FeatureSelectorByMutualInformationPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -11056,35 +11564,23 @@ public MinMaxNormalizerPipelineStep(Output output) namespace Transforms { - public enum NAHandleTransformReplacementKind - { - Default = 0, - Def = 0, - DefaultValue = 0, - Mean = 1, - Minimum = 2, - Min = 2, - Maximum = 3, - Max = 3 - } - - public sealed partial class NAHandleTransformColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class LpNormNormalizerTransformGcnColumn : OneToOneColumn, IOneToOneColumn { /// - /// The replacement method to utilize + /// Normalize by standard deviation rather than L2 norm /// - public Microsoft.ML.Transforms.NAHandleTransformReplacementKind? Kind { get; set; } + public bool? UseStdDev { get; set; } /// - /// Whether to impute values by slot + /// Scale features by this value /// - public bool? ImputeBySlot { get; set; } + public float? Scale { get; set; } /// - /// Whether or not to concatenate an indicator vector column to the value column + /// Subtract mean from each value before normalizing /// - public bool? ConcatIndicator { get; set; } + public bool? SubMean { get; set; } /// /// Name of the new column @@ -11098,17 +11594,15 @@ public sealed partial class NAHandleTransformColumn : OneToOneColumn - /// Handle missing values by replacing them with either the default value or the mean/min/max value (for non-text columns only). An indicator column can optionally be concatenated, if theinput column type is numeric. - /// - public sealed partial class MissingValueHandler : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + public sealed partial class GlobalContrastNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public MissingValueHandler() + public GlobalContrastNormalizer() { } - public MissingValueHandler(params string[] inputColumns) + public GlobalContrastNormalizer(params string[] inputColumns) { if (inputColumns != null) { @@ -11119,51 +11613,51 @@ public MissingValueHandler(params string[] inputColumns) } } - public MissingValueHandler(params ValueTuple[] inputOutputColumns) + public GlobalContrastNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } /// - /// New column definition(s) (optional form: name:rep:src) + /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.NAHandleTransformColumn[] Column { get; set; } + public LpNormNormalizerTransformGcnColumn[] Column { get; set; } /// - /// The replacement method to utilize + /// Subtract mean from each value before normalizing /// - public Microsoft.ML.Transforms.NAHandleTransformReplacementKind ReplaceWith { get; set; } = Microsoft.ML.Transforms.NAHandleTransformReplacementKind.Def; + public bool SubMean { get; set; } = true; /// - /// Whether to impute values by slot + /// Normalize by standard deviation rather than L2 norm /// - public bool ImputeBySlot { get; set; } = true; + public bool UseStdDev { get; set; } = false; /// - /// Whether or not to concatenate an indicator vector column to the value column + /// Scale features by this value /// - public bool Concat { get; set; } = true; + public float Scale { get; set; } = 1f; /// /// Input dataset @@ -11192,18 +11686,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(MissingValueHandler)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(GlobalContrastNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new MissingValueHandlerPipelineStep(output); + return new GlobalContrastNormalizerPipelineStep(output); } - private class MissingValueHandlerPipelineStep : ILearningPipelineDataStep + private class GlobalContrastNormalizerPipelineStep : ILearningPipelineDataStep { - public MissingValueHandlerPipelineStep(Output output) + public GlobalContrastNormalizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -11218,8 +11712,33 @@ public MissingValueHandlerPipelineStep(Output output) namespace Transforms { - public sealed partial class NAIndicatorTransformColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class HashJoinTransformColumn : OneToOneColumn, IOneToOneColumn { + /// + /// Whether the values need to be combined for a single hash + /// + public bool? Join { get; set; } + + /// + /// Which slots should be combined together. Example: 0,3,5;0,1;3;2,1,0. Overrides 'join'. + /// + public string CustomSlotMap { get; set; } + + /// + /// Number of bits to hash into. Must be between 1 and 31, inclusive. + /// + public int? HashBits { get; set; } + + /// + /// Hashing seed + /// + public uint? Seed { get; set; } + + /// + /// Whether the position of each term should be included in the hash + /// + public bool? Ordered { get; set; } + /// /// Name of the new column /// @@ -11232,17 +11751,16 @@ public sealed partial class NAIndicatorTransformColumn : OneToOneColumn - /// Create a boolean output column with the same number of slots as the input column, where the output value is true if the value in the input column is missing. - /// - public sealed partial class MissingValueIndicator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class HashConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public MissingValueIndicator() + public HashConverter() { } - public MissingValueIndicator(params string[] inputColumns) + public HashConverter(params string[] inputColumns) { if (inputColumns != null) { @@ -11253,28 +11771,28 @@ public MissingValueIndicator(params string[] inputColumns) } } - public MissingValueIndicator(params ValueTuple[] inputOutputColumns) + public HashConverter(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -11282,7 +11800,27 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.NAIndicatorTransformColumn[] Column { get; set; } + public HashJoinTransformColumn[] Column { get; set; } + + /// + /// Whether the values need to be combined for a single hash + /// + public bool Join { get; set; } = true; + + /// + /// Number of bits to hash into. Must be between 1 and 31, inclusive. + /// + public int HashBits { get; set; } = 31; + + /// + /// Hashing seed + /// + public uint Seed { get; set; } = 314489979; + + /// + /// Whether the position of each term should be included in the hash + /// + public bool Ordered { get; set; } = true; /// /// Input dataset @@ -11311,18 +11849,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(MissingValueIndicator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(HashConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new MissingValueIndicatorPipelineStep(output); + return new HashConverterPipelineStep(output); } - private class MissingValueIndicatorPipelineStep : ILearningPipelineDataStep + private class HashConverterPipelineStep : ILearningPipelineDataStep { - public MissingValueIndicatorPipelineStep(Output output) + public HashConverterPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -11337,7 +11875,7 @@ public MissingValueIndicatorPipelineStep(Output output) namespace Transforms { - public sealed partial class NADropTransformColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class KeyToValueTransformColumn : OneToOneColumn, IOneToOneColumn { /// /// Name of the new column @@ -11351,17 +11889,15 @@ public sealed partial class NADropTransformColumn : OneToOneColumn - /// Removes NAs from vector columns. - /// - public sealed partial class MissingValuesDropper : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + public sealed partial class KeyToTextConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public MissingValuesDropper() + public KeyToTextConverter() { } - public MissingValuesDropper(params string[] inputColumns) + public KeyToTextConverter(params string[] inputColumns) { if (inputColumns != null) { @@ -11372,36 +11908,36 @@ public MissingValuesDropper(params string[] inputColumns) } } - public MissingValuesDropper(params ValueTuple[] inputOutputColumns) + public KeyToTextConverter(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } /// - /// Columns to drop the NAs for + /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.NADropTransformColumn[] Column { get; set; } + public KeyToValueTransformColumn[] Column { get; set; } /// /// Input dataset @@ -11430,18 +11966,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(MissingValuesDropper)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(KeyToTextConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new MissingValuesDropperPipelineStep(output); + return new KeyToTextConverterPipelineStep(output); } - private class MissingValuesDropperPipelineStep : ILearningPipelineDataStep + private class KeyToTextConverterPipelineStep : ILearningPipelineDataStep { - public MissingValuesDropperPipelineStep(Output output) + public KeyToTextConverterPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -11457,21 +11993,21 @@ namespace Transforms { /// - /// Filters out rows that contain missing values. + /// Transforms the label to either key or bool (if needed) to make it suitable for classification. /// - public sealed partial class MissingValuesRowDropper : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class LabelColumnKeyBooleanConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Column + /// Convert the key values to text /// - public string[] Column { get; set; } + public bool TextKeyValues { get; set; } = true; /// - /// If true, keep only rows that contain NA values, and filter the rest. + /// The label column /// - public bool Complement { get; set; } = false; + public string LabelColumn { get; set; } /// /// Input dataset @@ -11500,18 +12036,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(MissingValuesRowDropper)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LabelColumnKeyBooleanConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new MissingValuesRowDropperPipelineStep(output); + return new LabelColumnKeyBooleanConverterPipelineStep(output); } - private class MissingValuesRowDropperPipelineStep : ILearningPipelineDataStep + private class LabelColumnKeyBooleanConverterPipelineStep : ILearningPipelineDataStep { - public MissingValuesRowDropperPipelineStep(Output output) + public LabelColumnKeyBooleanConverterPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -11525,38 +12061,13 @@ public MissingValuesRowDropperPipelineStep(Output output) namespace Transforms { - public enum NAReplaceTransformReplacementKind - { - Default = 0, - DefaultValue = 0, - Def = 0, - Mean = 1, - Min = 2, - Minimum = 2, - Max = 3, - Maximum = 3, - SpecifiedValue = 4, - Val = 4, - Value = 4 - } - - public sealed partial class NAReplaceTransformColumn : OneToOneColumn, IOneToOneColumn + public sealed partial class LabelIndicatorTransformColumn : OneToOneColumn, IOneToOneColumn { /// - /// Replacement value for NAs (uses default value if not given) - /// - public string ReplacementString { get; set; } - - /// - /// The replacement method to utilize - /// - public Microsoft.ML.Transforms.NAReplaceTransformReplacementKind? Kind { get; set; } - - /// - /// Whether to impute values by slot + /// The positive example class for binary classification. /// - public bool? Slot { get; set; } + public int? ClassIndex { get; set; } /// /// Name of the new column @@ -11571,16 +12082,16 @@ public sealed partial class NAReplaceTransformColumn : OneToOneColumn - /// Create an output column of the same type and size of the input column, where missing values are replaced with either the default value or the mean/min/max value (for non-text columns only). + /// Label remapper used by OVA /// - public sealed partial class MissingValueSubstitutor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class LabelIndicator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public MissingValueSubstitutor() + public LabelIndicator() { } - public MissingValueSubstitutor(params string[] inputColumns) + public LabelIndicator(params string[] inputColumns) { if (inputColumns != null) { @@ -11591,51 +12102,46 @@ public MissingValueSubstitutor(params string[] inputColumns) } } - public MissingValueSubstitutor(params ValueTuple[] inputOutputColumns) + public LabelIndicator(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } /// - /// New column definition(s) (optional form: name:rep:src) + /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.NAReplaceTransformColumn[] Column { get; set; } + public LabelIndicatorTransformColumn[] Column { get; set; } /// - /// The replacement method to utilize + /// Label of the positive class. /// - public Microsoft.ML.Transforms.NAReplaceTransformReplacementKind ReplacementKind { get; set; } = Microsoft.ML.Transforms.NAReplaceTransformReplacementKind.Def; + public int ClassIndex { get; set; } /// - /// Whether to impute values by slot + /// Input dataset /// - public bool ImputeBySlot { get; set; } = true; - - /// - /// Input dataset - /// - public Var Data { get; set; } = new Var(); + public Var Data { get; set; } = new Var(); public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput @@ -11659,18 +12165,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(MissingValueSubstitutor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LabelIndicator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new MissingValueSubstitutorPipelineStep(output); + return new LabelIndicatorPipelineStep(output); } - private class MissingValueSubstitutorPipelineStep : ILearningPipelineDataStep + private class LabelIndicatorPipelineStep : ILearningPipelineDataStep { - public MissingValueSubstitutorPipelineStep(Output output) + public LabelIndicatorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -11686,65 +12192,126 @@ namespace Transforms { /// - /// Combines a sequence of TransformModels into a single model + /// Transforms the label to float to make it suitable for regression. /// - public sealed partial class ModelCombiner + public sealed partial class LabelToFloatConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Input models + /// The label column /// - public ArrayVar Models { get; set; } = new ArrayVar(); + public string LabelColumn { get; set; } + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); - public sealed class Output + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput { /// - /// Combined model + /// Transformed dataset /// - public Var OutputModel { get; set; } = new Var(); + public Var OutputData { get; set; } = new Var(); + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(LabelToFloatConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new LabelToFloatConverterPipelineStep(output); + } + + private class LabelToFloatConverterPipelineStep : ILearningPipelineDataStep + { + public LabelToFloatConverterPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } } } } namespace Transforms { - public enum NgramTransformWeightingCriteria + + public sealed partial class LdaTransformColumn : OneToOneColumn, IOneToOneColumn { - Tf = 0, - Idf = 1, - TfIdf = 2 - } + /// + /// The number of topics in the LDA + /// + public int? NumTopic { get; set; } + /// + /// Dirichlet prior on document-topic vectors + /// + public float? AlphaSum { get; set; } - public sealed partial class NgramTransformColumn : OneToOneColumn, IOneToOneColumn - { /// - /// Maximum ngram length + /// Dirichlet prior on vocab-topic vectors /// - public int? NgramLength { get; set; } + public float? Beta { get; set; } /// - /// Whether to include all ngram lengths up to NgramLength or only NgramLength + /// Number of Metropolis Hasting step /// - public bool? AllLengths { get; set; } + public int? Mhstep { get; set; } /// - /// Maximum number of tokens to skip when constructing an ngram + /// Number of iterations /// - public int? SkipLength { get; set; } + public int? NumIterations { get; set; } /// - /// Maximum number of ngrams to store in the dictionary + /// Compute log likelihood over local dataset on this iteration interval /// - public int[] MaxNumTerms { get; set; } + public int? LikelihoodInterval { get; set; } /// - /// Statistical measure used to evaluate how important a word is to a document in a corpus + /// The number of training threads + /// + public int? NumThreads { get; set; } + + /// + /// The threshold of maximum count of tokens per doc + /// + public int? NumMaxDocToken { get; set; } + + /// + /// The number of words to summarize the topic + /// + public int? NumSummaryTermPerTopic { get; set; } + + /// + /// The number of burn-in iterations + /// + public int? NumBurninIterations { get; set; } = 10; + + /// + /// Reset the random number generator for each document /// - public Microsoft.ML.Transforms.NgramTransformWeightingCriteria? Weighting { get; set; } + public bool? ResetRandomGenerator { get; set; } /// /// Name of the new column @@ -11758,17 +12325,16 @@ public sealed partial class NgramTransformColumn : OneToOneColumn - /// Produces a bag of counts of ngrams (sequences of consecutive values of length 1-n) in a given vector of keys. It does so by building a dictionary of ngrams and using the id in the dictionary as the index in the bag. - /// - public sealed partial class NGramTranslator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class LightLda : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public NGramTranslator() + public LightLda() { } - public NGramTranslator(params string[] inputColumns) + public LightLda(params string[] inputColumns) { if (inputColumns != null) { @@ -11779,61 +12345,102 @@ public NGramTranslator(params string[] inputColumns) } } - public NGramTranslator(params ValueTuple[] inputOutputColumns) + public LightLda(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } /// - /// New column definition(s) (optional form: name:src) + /// New column definition(s) (optional form: name:srcs) /// - public Microsoft.ML.Transforms.NgramTransformColumn[] Column { get; set; } + public LdaTransformColumn[] Column { get; set; } /// - /// Maximum ngram length + /// The number of topics in the LDA /// - public int NgramLength { get; set; } = 2; + [TlcModule.SweepableDiscreteParamAttribute("NumTopic", new object[]{20, 40, 100, 200})] + public int NumTopic { get; set; } = 100; /// - /// Whether to store all ngram lengths up to ngramLength, or only ngramLength + /// Dirichlet prior on document-topic vectors /// - public bool AllLengths { get; set; } = true; + [TlcModule.SweepableDiscreteParamAttribute("AlphaSum", new object[]{1, 10, 100, 200})] + public float AlphaSum { get; set; } = 100f; /// - /// Maximum number of tokens to skip when constructing an ngram + /// Dirichlet prior on vocab-topic vectors /// - public int SkipLength { get; set; } + [TlcModule.SweepableDiscreteParamAttribute("Beta", new object[]{0.01f, 0.015f, 0.07f, 0.02f})] + public float Beta { get; set; } = 0.01f; /// - /// Maximum number of ngrams to store in the dictionary + /// Number of Metropolis Hasting step /// - public int[] MaxNumTerms { get; set; } = { 10000000 }; + [TlcModule.SweepableDiscreteParamAttribute("Mhstep", new object[]{2, 4, 8, 16})] + public int Mhstep { get; set; } = 4; /// - /// The weighting criteria + /// Number of iterations /// - public Microsoft.ML.Transforms.NgramTransformWeightingCriteria Weighting { get; set; } = Microsoft.ML.Transforms.NgramTransformWeightingCriteria.Tf; + [TlcModule.SweepableDiscreteParamAttribute("NumIterations", new object[]{100, 200, 300, 400})] + public int NumIterations { get; set; } = 200; + + /// + /// Compute log likelihood over local dataset on this iteration interval + /// + public int LikelihoodInterval { get; set; } = 5; + + /// + /// The threshold of maximum count of tokens per doc + /// + public int NumMaxDocToken { get; set; } = 512; + + /// + /// The number of training threads. Default value depends on number of logical processors. + /// + public int? NumThreads { get; set; } + + /// + /// The number of words to summarize the topic + /// + public int NumSummaryTermPerTopic { get; set; } = 10; + + /// + /// The number of burn-in iterations + /// + [TlcModule.SweepableDiscreteParamAttribute("NumBurninIterations", new object[]{10, 20, 30, 40})] + public int NumBurninIterations { get; set; } = 10; + + /// + /// Reset the random number generator for each document + /// + public bool ResetRandomGenerator { get; set; } = false; + + /// + /// Whether to output the topic-word summary in text format + /// + public bool OutputTopicWordSummary { get; set; } = false; /// /// Input dataset @@ -11862,18 +12469,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(NGramTranslator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LightLda)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new NGramTranslatorPipelineStep(output); + return new LightLdaPipelineStep(output); } - private class NGramTranslatorPipelineStep : ILearningPipelineDataStep + private class LightLdaPipelineStep : ILearningPipelineDataStep { - public NGramTranslatorPipelineStep(Output output) + public LightLdaPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -11888,77 +12495,86 @@ public NGramTranslatorPipelineStep(Output output) namespace Transforms { - /// - /// Does nothing. - /// - public sealed partial class NoOperation : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class NormalizeTransformLogNormalColumn : OneToOneColumn, IOneToOneColumn { - + /// + /// Max number of examples used to train the normalizer + /// + public long? MaxTrainingExamples { get; set; } /// - /// Input dataset + /// Name of the new column /// - public Var Data { get; set; } = new Var(); + public string Name { get; set; } + /// + /// Name of the source column + /// + public string Source { get; set; } - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + } - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); + /// + /// Normalizes the data based on the computed mean and variance of the logarithm of the data. + /// + public sealed partial class LogMeanVarianceNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + public LogMeanVarianceNormalizer() + { } - public Var GetInputData() => Data; - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + public LogMeanVarianceNormalizer(params string[] inputColumns) { - if (previousStep != null) + if (inputColumns != null) { - if (!(previousStep is ILearningPipelineDataStep dataStep)) + foreach (string input in inputColumns) { - throw new InvalidOperationException($"{ nameof(NoOperation)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + AddColumn(input); } - - Data = dataStep.Data; } - Output output = experiment.Add(this); - return new NoOperationPipelineStep(output); } - - private class NoOperationPipelineStep : ILearningPipelineDataStep + + public LogMeanVarianceNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { - public NoOperationPipelineStep(Output output) + if (inputOutputColumns != null) { - Data = output.OutputData; - Model = output.Model; + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } - public Var Data { get; } - public Var Model { get; } + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); } - } - } - namespace Transforms - { - /// - /// If the source column does not exist after deserialization, create a column with the right type and default values. - /// - public sealed partial class OptionalColumnCreator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Whether to use CDF as the output + /// + public bool UseCdf { get; set; } = true; + /// + /// New column definition(s) (optional form: name:src) + /// + public NormalizeTransformLogNormalColumn[] Column { get; set; } /// - /// New column definition(s) + /// Max number of examples used to train the normalizer /// - public string[] Column { get; set; } + public long MaxTrainingExamples { get; set; } = 1000000000; /// /// Input dataset @@ -11987,18 +12603,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(OptionalColumnCreator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LogMeanVarianceNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new OptionalColumnCreatorPipelineStep(output); + return new LogMeanVarianceNormalizerPipelineStep(output); } - private class OptionalColumnCreatorPipelineStep : ILearningPipelineDataStep + private class LogMeanVarianceNormalizerPipelineStep : ILearningPipelineDataStep { - public OptionalColumnCreatorPipelineStep(Output output) + public LogMeanVarianceNormalizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12012,33 +12628,26 @@ public OptionalColumnCreatorPipelineStep(Output output) namespace Transforms { + public enum LpNormNormalizerTransformNormalizerKind : byte + { + L2Norm = 0, + StdDev = 1, + L1Norm = 2, + LInf = 3 + } - public sealed partial class PcaTransformColumn : OneToOneColumn, IOneToOneColumn + + public sealed partial class LpNormNormalizerTransformColumn : OneToOneColumn, IOneToOneColumn { /// - /// The name of the weight column + /// The norm to use to normalize each sample /// - public string WeightColumn { get; set; } + public LpNormNormalizerTransformNormalizerKind? NormKind { get; set; } /// - /// The number of components in the PCA - /// - public int? Rank { get; set; } - - /// - /// Oversampling parameter for randomized PCA training - /// - public int? Oversampling { get; set; } - - /// - /// If enabled, data is centered to be zero mean - /// - public bool? Center { get; set; } - - /// - /// The seed for random number generation + /// Subtract mean from each value before normalizing /// - public int? Seed { get; set; } + public bool? SubMean { get; set; } /// /// Name of the new column @@ -12052,17 +12661,15 @@ public sealed partial class PcaTransformColumn : OneToOneColumn - /// Train an PCA Anomaly model. - /// - public sealed partial class PcaCalculator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + public sealed partial class LpNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public PcaCalculator() + public LpNormalizer() { } - public PcaCalculator(params string[] inputColumns) + public LpNormalizer(params string[] inputColumns) { if (inputColumns != null) { @@ -12073,28 +12680,28 @@ public PcaCalculator(params string[] inputColumns) } } - public PcaCalculator(params ValueTuple[] inputOutputColumns) + public LpNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -12102,32 +12709,17 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.PcaTransformColumn[] Column { get; set; } - - /// - /// The name of the weight column - /// - public string WeightColumn { get; set; } - - /// - /// The number of components in the PCA - /// - public int Rank { get; set; } = 20; - - /// - /// Oversampling parameter for randomized PCA training - /// - public int Oversampling { get; set; } = 20; + public LpNormNormalizerTransformColumn[] Column { get; set; } /// - /// If enabled, data is centered to be zero mean + /// The norm to use to normalize each sample /// - public bool Center { get; set; } = true; + public LpNormNormalizerTransformNormalizerKind NormKind { get; set; } = LpNormNormalizerTransformNormalizerKind.L2Norm; /// - /// The seed for random number generation + /// Subtract mean from each value before normalizing /// - public int Seed { get; set; } + public bool SubMean { get; set; } = false; /// /// Input dataset @@ -12156,18 +12748,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(PcaCalculator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(LpNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new PcaCalculatorPipelineStep(output); + return new LpNormalizerPipelineStep(output); } - private class PcaCalculatorPipelineStep : ILearningPipelineDataStep + private class LpNormalizerPipelineStep : ILearningPipelineDataStep { - public PcaCalculatorPipelineStep(Output output) + public LpNormalizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12183,110 +12775,103 @@ namespace Transforms { /// - /// Transforms a predicted label column to its original values, unless it is of type bool. + /// Combines a sequence of TransformModels and a PredictorModel into a single PredictorModel. /// - public sealed partial class PredictedLabelColumnOriginalValueConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class ManyHeterogeneousModelCombiner { /// - /// The predicted label column + /// Transform model /// - public string PredictedLabelColumn { get; set; } + public ArrayVar TransformModels { get; set; } = new ArrayVar(); /// - /// Input dataset + /// Predictor model /// - public Var Data { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + public sealed class Output { /// - /// Transformed dataset + /// Predictor model /// - public Var OutputData { get; set; } = new Var(); + public Var PredictorModel { get; set; } = new Var(); - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); + } + } + } + + namespace Transforms + { + /// + /// Normalizes the data based on the computed mean and variance of the data. + /// + public sealed partial class MeanVarianceNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public MeanVarianceNormalizer() + { } - public Var GetInputData() => Data; - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + public MeanVarianceNormalizer(params string[] inputColumns) { - if (previousStep != null) + if (inputColumns != null) { - if (!(previousStep is ILearningPipelineDataStep dataStep)) + foreach (string input in inputColumns) { - throw new InvalidOperationException($"{ nameof(PredictedLabelColumnOriginalValueConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + AddColumn(input); } - - Data = dataStep.Data; } - Output output = experiment.Add(this); - return new PredictedLabelColumnOriginalValueConverterPipelineStep(output); } - - private class PredictedLabelColumnOriginalValueConverterPipelineStep : ILearningPipelineDataStep + + public MeanVarianceNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) { - public PredictedLabelColumnOriginalValueConverterPipelineStep(Output output) + if (inputOutputColumns != null) { - Data = output.OutputData; - Model = output.Model; + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } } - - public Var Data { get; } - public Var Model { get; } } - } - } - - namespace Transforms - { + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } - public sealed partial class GenerateNumberTransformColumn - { - /// - /// Name of the new column - /// - public string Name { get; set; } + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } - /// - /// Use an auto-incremented integer starting at zero instead of a random number - /// - public bool? UseCounter { get; set; } /// - /// The random seed + /// Whether to use CDF as the output /// - public uint? Seed { get; set; } - - } - - /// - /// Adds a column with a generated number sequence. - /// - public sealed partial class RandomNumberGenerator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { - + public bool UseCdf { get; set; } = false; /// - /// New column definition(s) (optional form: name:seed) + /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.GenerateNumberTransformColumn[] Column { get; set; } + public NormalizeTransformAffineColumn[] Column { get; set; } /// - /// Use an auto-incremented integer starting at zero instead of a random number + /// Whether to map zero to zero, preserving sparsity /// - public bool UseCounter { get; set; } = false; + public bool FixZero { get; set; } = true; /// - /// The random seed + /// Max number of examples used to train the normalizer /// - public uint Seed { get; set; } = 42; + public long MaxTrainingExamples { get; set; } = 1000000000; /// /// Input dataset @@ -12315,18 +12900,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(RandomNumberGenerator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(MeanVarianceNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new RandomNumberGeneratorPipelineStep(output); + return new MeanVarianceNormalizerPipelineStep(output); } - private class RandomNumberGeneratorPipelineStep : ILearningPipelineDataStep + private class MeanVarianceNormalizerPipelineStep : ILearningPipelineDataStep { - public RandomNumberGeneratorPipelineStep(Output output) + public MeanVarianceNormalizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12342,41 +12927,66 @@ namespace Transforms { /// - /// Filters a dataview on a column of type Single, Double or Key (contiguous). Keeps the values that are in the specified min/max range. NaNs are always filtered out. If the input is a Key type, the min/max are considered percentages of the number of values. + /// Normalizes the data based on the observed minimum and maximum values of the data. /// - public sealed partial class RowRangeFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class MinMaxNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { + public MinMaxNormalizer() + { + } + + public MinMaxNormalizer(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public MinMaxNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } - /// - /// Column - /// - public string Column { get; set; } - - /// - /// Minimum value (0 to 1 for key types) - /// - public double? Min { get; set; } + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } - /// - /// Maximum value (0 to 1 for key types) - /// - public double? Max { get; set; } /// - /// If true, keep the values that fall outside the range. + /// New column definition(s) (optional form: name:src) /// - public bool Complement { get; set; } = false; + public NormalizeTransformAffineColumn[] Column { get; set; } /// - /// If true, include in the range the values that are equal to min. + /// Whether to map zero to zero, preserving sparsity /// - public bool IncludeMin { get; set; } = true; + public bool FixZero { get; set; } = true; /// - /// If true, include in the range the values that are equal to max. + /// Max number of examples used to train the normalizer /// - public bool? IncludeMax { get; set; } + public long MaxTrainingExamples { get; set; } = 1000000000; /// /// Input dataset @@ -12405,18 +13015,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(RowRangeFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(MinMaxNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new RowRangeFilterPipelineStep(output); + return new MinMaxNormalizerPipelineStep(output); } - private class RowRangeFilterPipelineStep : ILearningPipelineDataStep + private class MinMaxNormalizerPipelineStep : ILearningPipelineDataStep { - public RowRangeFilterPipelineStep(Output output) + public MinMaxNormalizerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12430,23 +13040,109 @@ public RowRangeFilterPipelineStep(Output output) namespace Transforms { - - /// - /// Allows limiting input to a subset of rows at an optional offset. Can be used to implement data paging. - /// - public sealed partial class RowSkipAndTakeFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public enum NAHandleTransformReplacementKind { + DefaultValue = 0, + Mean = 1, + Minimum = 2, + Maximum = 3 + } + public sealed partial class NAHandleTransformColumn : OneToOneColumn, IOneToOneColumn + { /// - /// Number of items to skip + /// The replacement method to utilize /// - public long? Skip { get; set; } + public NAHandleTransformReplacementKind? Kind { get; set; } /// - /// Number of items to take + /// Whether to impute values by slot /// - public long? Take { get; set; } + public bool? ImputeBySlot { get; set; } + + /// + /// Whether or not to concatenate an indicator vector column to the value column + /// + public bool? ConcatIndicator { get; set; } + + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string Source { get; set; } + + } + + /// + /// + public sealed partial class MissingValueHandler : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public MissingValueHandler() + { + } + + public MissingValueHandler(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public MissingValueHandler(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } + + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } + + + /// + /// New column definition(s) (optional form: name:rep:src) + /// + public NAHandleTransformColumn[] Column { get; set; } + + /// + /// The replacement method to utilize + /// + public NAHandleTransformReplacementKind ReplaceWith { get; set; } = NAHandleTransformReplacementKind.DefaultValue; + + /// + /// Whether to impute values by slot + /// + public bool ImputeBySlot { get; set; } = true; + + /// + /// Whether or not to concatenate an indicator vector column to the value column + /// + public bool Concat { get; set; } = true; /// /// Input dataset @@ -12475,18 +13171,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(RowSkipAndTakeFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(MissingValueHandler)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new RowSkipAndTakeFilterPipelineStep(output); + return new MissingValueHandlerPipelineStep(output); } - private class RowSkipAndTakeFilterPipelineStep : ILearningPipelineDataStep + private class MissingValueHandlerPipelineStep : ILearningPipelineDataStep { - public RowSkipAndTakeFilterPipelineStep(Output output) + public MissingValueHandlerPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12501,17 +13197,70 @@ public RowSkipAndTakeFilterPipelineStep(Output output) namespace Transforms { - /// - /// Allows limiting input to a subset of rows by skipping a number of rows. - /// - public sealed partial class RowSkipFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class NAIndicatorTransformColumn : OneToOneColumn, IOneToOneColumn + { + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string Source { get; set; } + + } + + /// + /// + public sealed partial class MissingValueIndicator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { + public MissingValueIndicator() + { + } + + public MissingValueIndicator(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public MissingValueIndicator(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } + + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } + /// - /// Number of items to skip + /// New column definition(s) (optional form: name:src) /// - public long Count { get; set; } + public NAIndicatorTransformColumn[] Column { get; set; } /// /// Input dataset @@ -12540,18 +13289,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(RowSkipFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(MissingValueIndicator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new RowSkipFilterPipelineStep(output); + return new MissingValueIndicatorPipelineStep(output); } - private class RowSkipFilterPipelineStep : ILearningPipelineDataStep + private class MissingValueIndicatorPipelineStep : ILearningPipelineDataStep { - public RowSkipFilterPipelineStep(Output output) + public MissingValueIndicatorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12566,17 +13315,70 @@ public RowSkipFilterPipelineStep(Output output) namespace Transforms { - /// - /// Allows limiting input to a subset of rows by taking N first rows. - /// - public sealed partial class RowTakeFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class NADropTransformColumn : OneToOneColumn, IOneToOneColumn + { + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string Source { get; set; } + + } + + /// + /// + public sealed partial class MissingValuesDropper : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { + public MissingValuesDropper() + { + } + + public MissingValuesDropper(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public MissingValuesDropper(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } + + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } + /// - /// Number of items to take + /// Columns to drop the NAs for /// - public long Count { get; set; } = 9223372036854775807; + public NADropTransformColumn[] Column { get; set; } /// /// Input dataset @@ -12605,18 +13407,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(RowTakeFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(MissingValuesDropper)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new RowTakeFilterPipelineStep(output); + return new MissingValuesDropperPipelineStep(output); } - private class RowTakeFilterPipelineStep : ILearningPipelineDataStep + private class MissingValuesDropperPipelineStep : ILearningPipelineDataStep { - public RowTakeFilterPipelineStep(Output output) + public MissingValuesDropperPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12631,17 +13433,21 @@ public RowTakeFilterPipelineStep(Output output) namespace Transforms { - /// - /// Selects only the last score columns and the extra columns specified in the arguments. - /// - public sealed partial class ScoreColumnSelector : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + /// + public sealed partial class MissingValuesRowDropper : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Extra columns to write + /// Column /// - public string[] ExtraColumns { get; set; } + public string[] Column { get; set; } + + /// + /// If true, keep only rows that contain NA values, and filter the rest. + /// + public bool Complement { get; set; } = false; /// /// Input dataset @@ -12670,18 +13476,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(ScoreColumnSelector)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(MissingValuesRowDropper)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new ScoreColumnSelectorPipelineStep(output); + return new MissingValuesRowDropperPipelineStep(output); } - private class ScoreColumnSelectorPipelineStep : ILearningPipelineDataStep + private class MissingValuesRowDropperPipelineStep : ILearningPipelineDataStep { - public ScoreColumnSelectorPipelineStep(Output output) + public MissingValuesRowDropperPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12695,62 +13501,105 @@ public ScoreColumnSelectorPipelineStep(Output output) namespace Transforms { - - /// - /// Turn the predictor model into a transform model - /// - public sealed partial class Scorer + public enum NAReplaceTransformReplacementKind { + DefaultValue = 0, + Mean = 1, + Minimum = 2, + Maximum = 3, + SpecifiedValue = 4 + } + public sealed partial class NAReplaceTransformColumn : OneToOneColumn, IOneToOneColumn + { /// - /// The predictor model to turn into a transform + /// Replacement value for NAs (uses default value if not given) /// - public Var PredictorModel { get; set; } = new Var(); + public string ReplacementString { get; set; } + /// + /// The replacement method to utilize + /// + public NAReplaceTransformReplacementKind? Kind { get; set; } - public sealed class Output - { - /// - /// The scored dataset - /// - public Var ScoredData { get; set; } = new Var(); + /// + /// Whether to impute values by slot + /// + public bool? Slot { get; set; } - /// - /// The scoring transform - /// - public Var ScoringTransform { get; set; } = new Var(); + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string Source { get; set; } - } } - } - namespace Transforms - { - public enum UngroupTransformUngroupMode + /// + /// + public sealed partial class MissingValueSubstitutor : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - Inner = 0, - Outer = 1, - First = 2 - } + public MissingValueSubstitutor() + { + } + + public MissingValueSubstitutor(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public MissingValueSubstitutor(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } - /// - /// Un-groups vector columns into sequences of rows, inverse of Group transform - /// - public sealed partial class Segregator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } /// - /// Columns to unroll, or 'pivot' + /// New column definition(s) (optional form: name:rep:src) /// - public string[] Column { get; set; } + public NAReplaceTransformColumn[] Column { get; set; } /// - /// Specifies how to unroll multiple pivot columns of different size. + /// The replacement method to utilize + /// + public NAReplaceTransformReplacementKind ReplacementKind { get; set; } = NAReplaceTransformReplacementKind.DefaultValue; + + /// + /// Whether to impute values by slot /// - public Microsoft.ML.Transforms.UngroupTransformUngroupMode Mode { get; set; } = Microsoft.ML.Transforms.UngroupTransformUngroupMode.Inner; + public bool ImputeBySlot { get; set; } = true; /// /// Input dataset @@ -12779,18 +13628,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(Segregator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(MissingValueSubstitutor)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new SegregatorPipelineStep(output); + return new MissingValueSubstitutorPipelineStep(output); } - private class SegregatorPipelineStep : ILearningPipelineDataStep + private class MissingValueSubstitutorPipelineStep : ILearningPipelineDataStep { - public SegregatorPipelineStep(Output output) + public MissingValueSubstitutorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -12806,86 +13655,87 @@ namespace Transforms { /// - /// Uses a pretrained sentiment model to score input strings + /// Combines a sequence of TransformModels into a single model /// - public sealed partial class SentimentAnalyzer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class ModelCombiner { /// - /// Name of the source column. + /// Input models /// - public string Source { get; set; } + public ArrayVar Models { get; set; } = new ArrayVar(); + + + public sealed class Output + { + /// + /// Combined model + /// + public Var OutputModel { get; set; } = new Var(); + + } + } + } + + namespace Transforms + { + public enum NgramTransformWeightingCriteria + { + Tf = 0, + Idf = 1, + TfIdf = 2 + } + + public sealed partial class NgramTransformColumn : OneToOneColumn, IOneToOneColumn + { /// - /// Name of the new column. + /// Maximum ngram length /// - public string Name { get; set; } + public int? NgramLength { get; set; } /// - /// Input dataset + /// Whether to include all ngram lengths up to NgramLength or only NgramLength /// - public Var Data { get; set; } = new Var(); - + public bool? AllLengths { get; set; } - public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput - { - /// - /// Transformed dataset - /// - public Var OutputData { get; set; } = new Var(); + /// + /// Maximum number of tokens to skip when constructing an ngram + /// + public int? SkipLength { get; set; } - /// - /// Transform model - /// - public Var Model { get; set; } = new Var(); + /// + /// Maximum number of ngrams to store in the dictionary + /// + public int[] MaxNumTerms { get; set; } - } - public Var GetInputData() => Data; - - public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) - { - if (previousStep != null) - { - if (!(previousStep is ILearningPipelineDataStep dataStep)) - { - throw new InvalidOperationException($"{ nameof(SentimentAnalyzer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); - } + /// + /// Statistical measure used to evaluate how important a word is to a document in a corpus + /// + public NgramTransformWeightingCriteria? Weighting { get; set; } - Data = dataStep.Data; - } - Output output = experiment.Add(this); - return new SentimentAnalyzerPipelineStep(output); - } + /// + /// Name of the new column + /// + public string Name { get; set; } - private class SentimentAnalyzerPipelineStep : ILearningPipelineDataStep - { - public SentimentAnalyzerPipelineStep(Output output) - { - Data = output.OutputData; - Model = output.Model; - } + /// + /// Name of the source column + /// + public string Source { get; set; } - public Var Data { get; } - public Var Model { get; } - } } - } - namespace Transforms - { - - /// - /// Similar to BinNormalizer, but calculates bins based on correlation with the label column, not equi-density. The new value is bin_number / number_of_bins. - /// - public sealed partial class SupervisedBinNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + /// + public sealed partial class NGramTranslator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - public SupervisedBinNormalizer() + public NGramTranslator() { } - public SupervisedBinNormalizer(params string[] inputColumns) + public NGramTranslator(params string[] inputColumns) { if (inputColumns != null) { @@ -12896,61 +13746,61 @@ public SupervisedBinNormalizer(params string[] inputColumns) } } - public SupervisedBinNormalizer(params ValueTuple[] inputOutputColumns) + public NGramTranslator(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } /// - /// Label column for supervised binning + /// New column definition(s) (optional form: name:src) /// - public string LabelColumn { get; set; } + public NgramTransformColumn[] Column { get; set; } /// - /// Minimum number of examples per bin + /// Maximum ngram length /// - public int MinBinSize { get; set; } = 10; + public int NgramLength { get; set; } = 2; /// - /// New column definition(s) (optional form: name:src) + /// Whether to store all ngram lengths up to ngramLength, or only ngramLength /// - public Microsoft.ML.Transforms.NormalizeTransformBinColumn[] Column { get; set; } + public bool AllLengths { get; set; } = true; /// - /// Max number of bins, power of 2 recommended + /// Maximum number of tokens to skip when constructing an ngram /// - public int NumBins { get; set; } = 1024; + public int SkipLength { get; set; } /// - /// Whether to map zero to zero, preserving sparsity + /// Maximum number of ngrams to store in the dictionary /// - public bool FixZero { get; set; } = true; + public int[] MaxNumTerms { get; set; } = { 10000000 }; /// - /// Max number of examples used to train the normalizer + /// The weighting criteria /// - public long MaxTrainingExamples { get; set; } = 1000000000; + public NgramTransformWeightingCriteria Weighting { get; set; } = NgramTransformWeightingCriteria.Tf; /// /// Input dataset @@ -12979,18 +13829,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(SupervisedBinNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(NGramTranslator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new SupervisedBinNormalizerPipelineStep(output); + return new NGramTranslatorPipelineStep(output); } - private class SupervisedBinNormalizerPipelineStep : ILearningPipelineDataStep + private class NGramTranslatorPipelineStep : ILearningPipelineDataStep { - public SupervisedBinNormalizerPipelineStep(Output output) + public NGramTranslatorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -13004,149 +13854,77 @@ public SupervisedBinNormalizerPipelineStep(Output output) namespace Transforms { - public enum TextTransformLanguage - { - English = 1, - French = 2, - German = 3, - Dutch = 4, - Italian = 5, - Spanish = 6, - Japanese = 7 - } - - public enum TextNormalizerTransformCaseNormalizationMode - { - Lower = 0, - Upper = 1, - None = 2 - } - public enum TextTransformTextNormKind + /// + /// Does nothing. + /// + public sealed partial class NoOperation : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { - None = 0, - L1 = 1, - L2 = 2, - LInf = 3 - } - public sealed partial class TextTransformColumn : ManyToOneColumn, IManyToOneColumn - { /// - /// Name of the new column + /// Input dataset /// - public string Name { get; set; } - - /// - /// Name of the source column - /// - public string[] Source { get; set; } - - } - - public sealed partial class TermLoaderArguments - { - /// - /// List of terms - /// - public string[] Term { get; set; } - - /// - /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). - /// - public Microsoft.ML.Transforms.TermTransformSortOrder Sort { get; set; } = Microsoft.ML.Transforms.TermTransformSortOrder.Occurrence; + public Var Data { get; set; } = new Var(); - /// - /// Drop unknown terms instead of mapping them to NA term. - /// - public bool DropUnknowns { get; set; } = false; - } + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); - /// - /// A transform that turns a collection of text documents into numerical feature vectors. The feature vectors are normalized counts of (word and/or character) ngrams in a given tokenized text. - /// - public sealed partial class TextFeaturizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); - public TextFeaturizer() - { - } - - public TextFeaturizer(string outputColumn, params string[] inputColumns) - { - AddColumn(outputColumn, inputColumns); } + public Var GetInputData() => Data; - public void AddColumn(string name, params string[] source) + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { - Column = ManyToOneColumn.Create(name, source); - } - - - /// - /// New column definition (optional form: name:srcs). - /// - public Microsoft.ML.Transforms.TextTransformColumn Column { get; set; } - - /// - /// Dataset language or 'AutoDetect' to detect language per row. - /// - public Microsoft.ML.Transforms.TextTransformLanguage Language { get; set; } = Microsoft.ML.Transforms.TextTransformLanguage.English; - - /// - /// Stopwords remover. - /// - [JsonConverter(typeof(ComponentSerializer))] - public StopWordsRemover StopWordsRemover { get; set; } - - /// - /// Casing text using the rules of the invariant culture. - /// - public Microsoft.ML.Transforms.TextNormalizerTransformCaseNormalizationMode TextCase { get; set; } = Microsoft.ML.Transforms.TextNormalizerTransformCaseNormalizationMode.Lower; - - /// - /// Whether to keep diacritical marks or remove them. - /// - public bool KeepDiacritics { get; set; } = false; + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(NoOperation)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } - /// - /// Whether to keep punctuation marks or remove them. - /// - public bool KeepPunctuations { get; set; } = true; + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new NoOperationPipelineStep(output); + } - /// - /// Whether to keep numbers or remove them. - /// - public bool KeepNumbers { get; set; } = true; + private class NoOperationPipelineStep : ILearningPipelineDataStep + { + public NoOperationPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } - /// - /// Whether to output the transformed text tokens as an additional column. - /// - public bool OutputTokens { get; set; } = false; + public Var Data { get; } + public Var Model { get; } + } + } + } - /// - /// A dictionary of whitelisted terms. - /// - public Microsoft.ML.Transforms.TermLoaderArguments Dictionary { get; set; } + namespace Transforms + { - /// - /// Ngram feature extractor to use for words (WordBag/WordHashBag). - /// - [JsonConverter(typeof(ComponentSerializer))] - public NgramExtractor WordFeatureExtractor { get; set; } = new NGramNgramExtractor(); + /// + /// + public sealed partial class OptionalColumnCreator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { - /// - /// Ngram feature extractor to use for characters (WordBag/WordHashBag). - /// - [JsonConverter(typeof(ComponentSerializer))] - public NgramExtractor CharFeatureExtractor { get; set; } = new NGramNgramExtractor() { NgramLength = 3, AllLengths = false }; /// - /// Normalize vectors (rows) individually by rescaling them to unit norm. + /// New column definition(s) /// - public Microsoft.ML.Transforms.TextTransformTextNormKind VectorNormalizer { get; set; } = Microsoft.ML.Transforms.TextTransformTextNormKind.L2; + public string[] Column { get; set; } /// /// Input dataset @@ -13175,18 +13953,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(TextFeaturizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(OptionalColumnCreator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new TextFeaturizerPipelineStep(output); + return new OptionalColumnCreatorPipelineStep(output); } - private class TextFeaturizerPipelineStep : ILearningPipelineDataStep + private class OptionalColumnCreatorPipelineStep : ILearningPipelineDataStep { - public TextFeaturizerPipelineStep(Output output) + public OptionalColumnCreatorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -13201,17 +13979,55 @@ public TextFeaturizerPipelineStep(Output output) namespace Transforms { - /// - /// Converts input values (words, numbers, etc.) to index in a dictionary. - /// - public sealed partial class TextToKeyConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + public sealed partial class PcaTransformColumn : OneToOneColumn, IOneToOneColumn { + /// + /// The name of the weight column + /// + public string WeightColumn { get; set; } - public TextToKeyConverter() + /// + /// The number of components in the PCA + /// + public int? Rank { get; set; } + + /// + /// Oversampling parameter for randomized PCA training + /// + public int? Oversampling { get; set; } + + /// + /// If enabled, data is centered to be zero mean + /// + public bool? Center { get; set; } + + /// + /// The seed for random number generation + /// + public int? Seed { get; set; } + + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string Source { get; set; } + + } + + /// + /// + public sealed partial class PcaCalculator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public PcaCalculator() { } - public TextToKeyConverter(params string[] inputColumns) + public PcaCalculator(params string[] inputColumns) { if (inputColumns != null) { @@ -13222,28 +14038,28 @@ public TextToKeyConverter(params string[] inputColumns) } } - public TextToKeyConverter(params ValueTuple[] inputOutputColumns) + public PcaCalculator(params (string inputColumn, string outputColumn)[] inputOutputColumns) { if (inputOutputColumns != null) { - foreach (ValueTuple inputOutput in inputOutputColumns) + foreach (var inputOutput in inputOutputColumns) { - AddColumn(inputOutput.Item2, inputOutput.Item1); + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); } } } - public void AddColumn(string source) + public void AddColumn(string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); Column = list.ToArray(); } - public void AddColumn(string name, string source) + public void AddColumn(string outputColumn, string inputColumn) { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); Column = list.ToArray(); } @@ -13251,27 +14067,32 @@ public void AddColumn(string name, string source) /// /// New column definition(s) (optional form: name:src) /// - public Microsoft.ML.Transforms.TermTransformColumn[] Column { get; set; } + public PcaTransformColumn[] Column { get; set; } /// - /// Maximum number of terms to keep per column when auto-training + /// The name of the weight column /// - public int MaxNumTerms { get; set; } = 1000000; + public string WeightColumn { get; set; } /// - /// List of terms + /// The number of components in the PCA /// - public string[] Term { get; set; } + public int Rank { get; set; } = 20; /// - /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). + /// Oversampling parameter for randomized PCA training /// - public Microsoft.ML.Transforms.TermTransformSortOrder Sort { get; set; } = Microsoft.ML.Transforms.TermTransformSortOrder.Occurrence; + public int Oversampling { get; set; } = 20; /// - /// Whether key value metadata should be text, regardless of the actual input type + /// If enabled, data is centered to be zero mean /// - public bool TextKeyValues { get; set; } = false; + public bool Center { get; set; } = true; + + /// + /// The seed for random number generation + /// + public int Seed { get; set; } /// /// Input dataset @@ -13300,18 +14121,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(TextToKeyConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(PcaCalculator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new TextToKeyConverterPipelineStep(output); + return new PcaCalculatorPipelineStep(output); } - private class TextToKeyConverterPipelineStep : ILearningPipelineDataStep + private class PcaCalculatorPipelineStep : ILearningPipelineDataStep { - public TextToKeyConverterPipelineStep(Output output) + public PcaCalculatorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -13327,68 +14148,110 @@ namespace Transforms { /// - /// Split the dataset into train and test sets + /// Transforms a predicted label column to its original values, unless it is of type bool. /// - public sealed partial class TrainTestDatasetSplitter + public sealed partial class PredictedLabelColumnOriginalValueConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Input dataset - /// - public Var Data { get; set; } = new Var(); - - /// - /// Fraction of training data + /// The predicted label column /// - public float Fraction { get; set; } = 0.8f; + public string PredictedLabelColumn { get; set; } /// - /// Stratification column + /// Input dataset /// - public string StratificationColumn { get; set; } + public Var Data { get; set; } = new Var(); - public sealed class Output + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput { /// - /// Training data + /// Transformed dataset /// - public Var TrainData { get; set; } = new Var(); + public Var OutputData { get; set; } = new Var(); /// - /// Testing data + /// Transform model /// - public Var TestData { get; set; } = new Var(); + public Var Model { get; set; } = new Var(); } - } - } - - namespace Transforms - { - - /// - /// Trains a tree ensemble, or loads it from a file, then maps a numeric feature vector to three outputs: 1. A vector containing the individual tree outputs of the tree ensemble. 2. A vector indicating the leaves that the feature vector falls on in the tree ensemble. 3. A vector indicating the paths that the feature vector falls on in the tree ensemble. If a both a model file and a trainer are specified - will use the model file. If neither are specified, will train a default FastTree model. This can handle key labels by training a regression model towards their optionally permuted indices. - /// - public sealed partial class TreeLeafFeaturizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IFeaturizerInput, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { - + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(PredictedLabelColumnOriginalValueConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new PredictedLabelColumnOriginalValueConverterPipelineStep(output); + } + + private class PredictedLabelColumnOriginalValueConverterPipelineStep : ILearningPipelineDataStep + { + public PredictedLabelColumnOriginalValueConverterPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + public sealed partial class GenerateNumberTransformColumn + { /// - /// Output column: The suffix to append to the default column names + /// Name of the new column /// - public string Suffix { get; set; } + public string Name { get; set; } /// - /// If specified, determines the permutation seed for applying this featurizer to a multiclass problem. + /// Use an auto-incremented integer starting at zero instead of a random number /// - public int LabelPermutationSeed { get; set; } + public bool? UseCounter { get; set; } /// - /// Trainer to use + /// The random seed /// - public Var PredictorModel { get; set; } = new Var(); + public uint? Seed { get; set; } + + } + + /// + /// Adds a column with a generated number sequence. + /// + public sealed partial class RandomNumberGenerator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + + /// + /// New column definition(s) (optional form: name:seed) + /// + public GenerateNumberTransformColumn[] Column { get; set; } + + /// + /// Use an auto-incremented integer starting at zero instead of a random number + /// + public bool UseCounter { get; set; } = false; + + /// + /// The random seed + /// + public uint Seed { get; set; } = 42; /// /// Input dataset @@ -13417,18 +14280,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(TreeLeafFeaturizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(RandomNumberGenerator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new TreeLeafFeaturizerPipelineStep(output); + return new RandomNumberGeneratorPipelineStep(output); } - private class TreeLeafFeaturizerPipelineStep : ILearningPipelineDataStep + private class RandomNumberGeneratorPipelineStep : ILearningPipelineDataStep { - public TreeLeafFeaturizerPipelineStep(Output output) + public RandomNumberGeneratorPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -13444,30 +14307,88 @@ namespace Transforms { /// - /// Combines a TransformModel and a PredictorModel into a single PredictorModel. + /// Filters a dataview on a column of type Single, Double or Key (contiguous). Keeps the values that are in the specified min/max range. NaNs are always filtered out. If the input is a Key type, the min/max are considered percentages of the number of values. /// - public sealed partial class TwoHeterogeneousModelCombiner + public sealed partial class RowRangeFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { /// - /// Transform model + /// Column /// - public Var TransformModel { get; set; } = new Var(); + public string Column { get; set; } /// - /// Predictor model + /// Minimum value (0 to 1 for key types) /// - public Var PredictorModel { get; set; } = new Var(); + public double? Min { get; set; } + /// + /// Maximum value (0 to 1 for key types) + /// + public double? Max { get; set; } - public sealed class Output + /// + /// If true, keep the values that fall outside the range. + /// + public bool Complement { get; set; } = false; + + /// + /// If true, include in the range the values that are equal to min. + /// + public bool IncludeMin { get; set; } = true; + + /// + /// If true, include in the range the values that are equal to max. + /// + public bool? IncludeMax { get; set; } + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput { /// - /// Predictor model + /// Transformed dataset /// - public Var PredictorModel { get; set; } = new Var(); + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(RowRangeFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new RowRangeFilterPipelineStep(output); + } + private class RowRangeFilterPipelineStep : ILearningPipelineDataStep + { + public RowRangeFilterPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } } } } @@ -13475,81 +14396,87 @@ public sealed class Output namespace Transforms { - public sealed partial class DelimitedTokenizeTransformColumn : OneToOneColumn, IOneToOneColumn + /// + /// Allows limiting input to a subset of rows at an optional offset. Can be used to implement data paging. + /// + public sealed partial class RowSkipAndTakeFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem { + + /// - /// Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character. + /// Number of items to skip /// - public string TermSeparators { get; set; } + public long? Skip { get; set; } /// - /// Name of the new column + /// Number of items to take /// - public string Name { get; set; } + public long? Take { get; set; } /// - /// Name of the source column + /// Input dataset /// - public string Source { get; set; } - - } + public Var Data { get; set; } = new Var(); - /// - /// The input to this transform is text, and the output is a vector of text containing the words (tokens) in the original text. The separator is space, but can be specified as any other character (or multiple characters) if needed. - /// - public sealed partial class WordTokenizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem - { - public WordTokenizer() + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + } + public Var GetInputData() => Data; - public WordTokenizer(params string[] inputColumns) + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) { - if (inputColumns != null) + if (previousStep != null) { - foreach (string input in inputColumns) + if (!(previousStep is ILearningPipelineDataStep dataStep)) { - AddColumn(input); + throw new InvalidOperationException($"{ nameof(RowSkipAndTakeFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } + + Data = dataStep.Data; } + Output output = experiment.Add(this); + return new RowSkipAndTakeFilterPipelineStep(output); } - - public WordTokenizer(params ValueTuple[] inputOutputColumns) + + private class RowSkipAndTakeFilterPipelineStep : ILearningPipelineDataStep { - if (inputOutputColumns != null) + public RowSkipAndTakeFilterPipelineStep(Output output) { - foreach (ValueTuple inputOutput in inputOutputColumns) - { - AddColumn(inputOutput.Item2, inputOutput.Item1); - } + Data = output.OutputData; + Model = output.Model; } - } - - public void AddColumn(string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(source)); - Column = list.ToArray(); - } - public void AddColumn(string name, string source) - { - var list = Column == null ? new List() : new List(Column); - list.Add(OneToOneColumn.Create(name, source)); - Column = list.ToArray(); + public Var Data { get; } + public Var Model { get; } } + } + } + namespace Transforms + { + + /// + /// Allows limiting input to a subset of rows by skipping a number of rows. + /// + public sealed partial class RowSkipFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { - /// - /// New column definition(s) - /// - public Microsoft.ML.Transforms.DelimitedTokenizeTransformColumn[] Column { get; set; } /// - /// Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character. + /// Number of items to skip /// - public string TermSeparators { get; set; } = "space"; + public long Count { get; set; } /// /// Input dataset @@ -13578,18 +14505,18 @@ public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Exper { if (!(previousStep is ILearningPipelineDataStep dataStep)) { - throw new InvalidOperationException($"{ nameof(WordTokenizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + throw new InvalidOperationException($"{ nameof(RowSkipFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); } Data = dataStep.Data; } Output output = experiment.Add(this); - return new WordTokenizerPipelineStep(output); + return new RowSkipFilterPipelineStep(output); } - private class WordTokenizerPipelineStep : ILearningPipelineDataStep + private class RowSkipFilterPipelineStep : ILearningPipelineDataStep { - public WordTokenizerPipelineStep(Output output) + public RowSkipFilterPipelineStep(Output output) { Data = output.OutputData; Model = output.Model; @@ -13601,332 +14528,2042 @@ public WordTokenizerPipelineStep(Output output) } } - namespace Runtime - { - public abstract class AutoMlEngine : ComponentKind {} + namespace Transforms + { + + /// + /// Allows limiting input to a subset of rows by taking N first rows. + /// + public sealed partial class RowTakeFilter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + + /// + /// Number of items to take + /// + public long Count { get; set; } = 9223372036854775807; + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(RowTakeFilter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new RowTakeFilterPipelineStep(output); + } + + private class RowTakeFilterPipelineStep : ILearningPipelineDataStep + { + public RowTakeFilterPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + + /// + /// Selects only the last score columns and the extra columns specified in the arguments. + /// + public sealed partial class ScoreColumnSelector : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + + /// + /// Extra columns to write + /// + public string[] ExtraColumns { get; set; } + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(ScoreColumnSelector)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new ScoreColumnSelectorPipelineStep(output); + } + + private class ScoreColumnSelectorPipelineStep : ILearningPipelineDataStep + { + public ScoreColumnSelectorPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + + /// + /// Turn the predictor model into a transform model + /// + public sealed partial class Scorer + { + + + /// + /// The predictor model to turn into a transform + /// + public Var PredictorModel { get; set; } = new Var(); + + + public sealed class Output + { + /// + /// The scored dataset + /// + public Var ScoredData { get; set; } = new Var(); + + /// + /// The scoring transform + /// + public Var ScoringTransform { get; set; } = new Var(); + + } + } + } + + namespace Transforms + { + public enum UngroupTransformUngroupMode + { + Inner = 0, + Outer = 1, + First = 2 + } + + + /// + /// + public sealed partial class Segregator : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + + /// + /// Columns to unroll, or 'pivot' + /// + public string[] Column { get; set; } + + /// + /// Specifies how to unroll multiple pivot columns of different size. + /// + public UngroupTransformUngroupMode Mode { get; set; } = UngroupTransformUngroupMode.Inner; + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(Segregator)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new SegregatorPipelineStep(output); + } + + private class SegregatorPipelineStep : ILearningPipelineDataStep + { + public SegregatorPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + + /// + /// + public sealed partial class SentimentAnalyzer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + + /// + /// Name of the source column. + /// + public string Source { get; set; } + + /// + /// Name of the new column. + /// + public string Name { get; set; } + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(SentimentAnalyzer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new SentimentAnalyzerPipelineStep(output); + } + + private class SentimentAnalyzerPipelineStep : ILearningPipelineDataStep + { + public SentimentAnalyzerPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + + /// + /// Similar to BinNormalizer, but calculates bins based on correlation with the label column, not equi-density. The new value is bin_number / number_of_bins. + /// + public sealed partial class SupervisedBinNormalizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public SupervisedBinNormalizer() + { + } + + public SupervisedBinNormalizer(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public SupervisedBinNormalizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } + + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } + + + /// + /// Label column for supervised binning + /// + public string LabelColumn { get; set; } + + /// + /// Minimum number of examples per bin + /// + public int MinBinSize { get; set; } = 10; + + /// + /// New column definition(s) (optional form: name:src) + /// + public NormalizeTransformBinColumn[] Column { get; set; } + + /// + /// Max number of bins, power of 2 recommended + /// + public int NumBins { get; set; } = 1024; + + /// + /// Whether to map zero to zero, preserving sparsity + /// + public bool FixZero { get; set; } = true; + + /// + /// Max number of examples used to train the normalizer + /// + public long MaxTrainingExamples { get; set; } = 1000000000; + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(SupervisedBinNormalizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new SupervisedBinNormalizerPipelineStep(output); + } + + private class SupervisedBinNormalizerPipelineStep : ILearningPipelineDataStep + { + public SupervisedBinNormalizerPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + public enum TextTransformLanguage + { + English = 1, + French = 2, + German = 3, + Dutch = 4, + Italian = 5, + Spanish = 6, + Japanese = 7 + } + + public enum TextNormalizerTransformCaseNormalizationMode + { + Lower = 0, + Upper = 1, + None = 2 + } + + public enum TextTransformTextNormKind + { + None = 0, + L1 = 1, + L2 = 2, + LInf = 3 + } + + + public sealed partial class TextTransformColumn : ManyToOneColumn, IManyToOneColumn + { + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string[] Source { get; set; } + + } + + public sealed partial class TermLoaderArguments + { + /// + /// List of terms + /// + public string[] Term { get; set; } + + /// + /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). + /// + public TermTransformSortOrder Sort { get; set; } = TermTransformSortOrder.Occurrence; + + /// + /// Drop unknown terms instead of mapping them to NA term. + /// + public bool DropUnknowns { get; set; } = false; + + } + + /// + /// + public sealed partial class TextFeaturizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public TextFeaturizer() + { + } + + public TextFeaturizer(string outputColumn, params string[] inputColumns) + { + AddColumn(outputColumn, inputColumns); + } + + public void AddColumn(string name, params string[] source) + { + Column = ManyToOneColumn.Create(name, source); + } + + + /// + /// New column definition (optional form: name:srcs). + /// + public TextTransformColumn Column { get; set; } + + /// + /// Dataset language or 'AutoDetect' to detect language per row. + /// + public TextTransformLanguage Language { get; set; } = TextTransformLanguage.English; + + /// + /// Stopwords remover. + /// + [JsonConverter(typeof(ComponentSerializer))] + public StopWordsRemover StopWordsRemover { get; set; } + + /// + /// Casing text using the rules of the invariant culture. + /// + public TextNormalizerTransformCaseNormalizationMode TextCase { get; set; } = TextNormalizerTransformCaseNormalizationMode.Lower; + + /// + /// Whether to keep diacritical marks or remove them. + /// + public bool KeepDiacritics { get; set; } = false; + + /// + /// Whether to keep punctuation marks or remove them. + /// + public bool KeepPunctuations { get; set; } = true; + + /// + /// Whether to keep numbers or remove them. + /// + public bool KeepNumbers { get; set; } = true; + + /// + /// Whether to output the transformed text tokens as an additional column. + /// + public bool OutputTokens { get; set; } = false; + + /// + /// A dictionary of whitelisted terms. + /// + public TermLoaderArguments Dictionary { get; set; } + + /// + /// Ngram feature extractor to use for words (WordBag/WordHashBag). + /// + [JsonConverter(typeof(ComponentSerializer))] + public NgramExtractor WordFeatureExtractor { get; set; } = new NGramNgramExtractor(); + + /// + /// Ngram feature extractor to use for characters (WordBag/WordHashBag). + /// + [JsonConverter(typeof(ComponentSerializer))] + public NgramExtractor CharFeatureExtractor { get; set; } = new NGramNgramExtractor() { NgramLength = 3, AllLengths = false }; + + /// + /// Normalize vectors (rows) individually by rescaling them to unit norm. + /// + public TextTransformTextNormKind VectorNormalizer { get; set; } = TextTransformTextNormKind.L2; + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(TextFeaturizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new TextFeaturizerPipelineStep(output); + } + + private class TextFeaturizerPipelineStep : ILearningPipelineDataStep + { + public TextFeaturizerPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + + /// + /// + public sealed partial class TextToKeyConverter : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public TextToKeyConverter() + { + } + + public TextToKeyConverter(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public TextToKeyConverter(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } + + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } + + + /// + /// New column definition(s) (optional form: name:src) + /// + public TermTransformColumn[] Column { get; set; } + + /// + /// Maximum number of terms to keep per column when auto-training + /// + public int MaxNumTerms { get; set; } = 1000000; + + /// + /// List of terms + /// + public string[] Term { get; set; } + + /// + /// How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a'). + /// + public TermTransformSortOrder Sort { get; set; } = TermTransformSortOrder.Occurrence; + + /// + /// Whether key value metadata should be text, regardless of the actual input type + /// + public bool TextKeyValues { get; set; } = false; + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(TextToKeyConverter)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new TextToKeyConverterPipelineStep(output); + } + + private class TextToKeyConverterPipelineStep : ILearningPipelineDataStep + { + public TextToKeyConverterPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + + /// + /// Split the dataset into train and test sets + /// + public sealed partial class TrainTestDatasetSplitter + { + + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + /// + /// Fraction of training data + /// + public float Fraction { get; set; } = 0.8f; + + /// + /// Stratification column + /// + public string StratificationColumn { get; set; } + + + public sealed class Output + { + /// + /// Training data + /// + public Var TrainData { get; set; } = new Var(); + + /// + /// Testing data + /// + public Var TestData { get; set; } = new Var(); + + } + } + } + + namespace Transforms + { + + /// + public sealed partial class TreeLeafFeaturizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.IFeaturizerInput, Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + + /// + /// Output column: The suffix to append to the default column names + /// + public string Suffix { get; set; } + + /// + /// If specified, determines the permutation seed for applying this featurizer to a multiclass problem. + /// + public int LabelPermutationSeed { get; set; } + + /// + /// Trainer to use + /// + public Var PredictorModel { get; set; } = new Var(); + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(TreeLeafFeaturizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new TreeLeafFeaturizerPipelineStep(output); + } + + private class TreeLeafFeaturizerPipelineStep : ILearningPipelineDataStep + { + public TreeLeafFeaturizerPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Transforms + { + + /// + /// Combines a TransformModel and a PredictorModel into a single PredictorModel. + /// + public sealed partial class TwoHeterogeneousModelCombiner + { + + + /// + /// Transform model + /// + public Var TransformModel { get; set; } = new Var(); + + /// + /// Predictor model + /// + public Var PredictorModel { get; set; } = new Var(); + + + public sealed class Output + { + /// + /// Predictor model + /// + public Var PredictorModel { get; set; } = new Var(); + + } + } + } + + namespace Transforms + { + + public sealed partial class DelimitedTokenizeTransformColumn : OneToOneColumn, IOneToOneColumn + { + /// + /// Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character. + /// + public string TermSeparators { get; set; } + + /// + /// Name of the new column + /// + public string Name { get; set; } + + /// + /// Name of the source column + /// + public string Source { get; set; } + + } + + /// + /// + public sealed partial class WordTokenizer : Microsoft.ML.Runtime.EntryPoints.CommonInputs.ITransformInput, Microsoft.ML.ILearningPipelineItem + { + + public WordTokenizer() + { + } + + public WordTokenizer(params string[] inputColumns) + { + if (inputColumns != null) + { + foreach (string input in inputColumns) + { + AddColumn(input); + } + } + } + + public WordTokenizer(params (string inputColumn, string outputColumn)[] inputOutputColumns) + { + if (inputOutputColumns != null) + { + foreach (var inputOutput in inputOutputColumns) + { + AddColumn(inputOutput.outputColumn, inputOutput.inputColumn); + } + } + } + + public void AddColumn(string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(inputColumn)); + Column = list.ToArray(); + } + + public void AddColumn(string outputColumn, string inputColumn) + { + var list = Column == null ? new List() : new List(Column); + list.Add(OneToOneColumn.Create(outputColumn, inputColumn)); + Column = list.ToArray(); + } + + + /// + /// New column definition(s) + /// + public DelimitedTokenizeTransformColumn[] Column { get; set; } + + /// + /// Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character. + /// + public string TermSeparators { get; set; } = "space"; + + /// + /// Input dataset + /// + public Var Data { get; set; } = new Var(); + + + public sealed class Output : Microsoft.ML.Runtime.EntryPoints.CommonOutputs.ITransformOutput + { + /// + /// Transformed dataset + /// + public Var OutputData { get; set; } = new Var(); + + /// + /// Transform model + /// + public Var Model { get; set; } = new Var(); + + } + public Var GetInputData() => Data; + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(WordTokenizer)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + Data = dataStep.Data; + } + Output output = experiment.Add(this); + return new WordTokenizerPipelineStep(output); + } + + private class WordTokenizerPipelineStep : ILearningPipelineDataStep + { + public WordTokenizerPipelineStep(Output output) + { + Data = output.OutputData; + Model = output.Model; + } + + public Var Data { get; } + public Var Model { get; } + } + } + } + + namespace Runtime + { + public abstract class AutoMlEngine : ComponentKind {} + + + + /// + /// AutoML engine that returns learners with default settings. + /// + public sealed class DefaultsAutoMlEngine : AutoMlEngine + { + internal override string ComponentName => "Defaults"; + } + + + + /// + /// AutoML engine that consists of distinct, hierarchical stages of operation. + /// + public sealed class RocketAutoMlEngine : AutoMlEngine + { + /// + /// Number of learners to retain for second stage. + /// + public int TopKLearners { get; set; } = 2; + + /// + /// Number of trials for retained second stage learners. + /// + public int SecondRoundTrialsPerLearner { get; set; } = 5; + + /// + /// Use random initialization only. + /// + public bool RandomInitialization { get; set; } = false; + + /// + /// Number of initilization pipelines, used for random initialization only. + /// + public int NumInitializationPipelines { get; set; } = 20; + + internal override string ComponentName => "Rocket"; + } + + + + /// + /// AutoML engine using uniform random sampling. + /// + public sealed class UniformRandomAutoMlEngine : AutoMlEngine + { + internal override string ComponentName => "UniformRandom"; + } + + public abstract class AutoMlStateBase : ComponentKind {} + + public enum PipelineSweeperSupportedMetricsMetrics + { + Auc = 0, + AccuracyMicro = 1, + AccuracyMacro = 2, + L1 = 3, + L2 = 4, + F1 = 5, + AuPrc = 6, + TopKAccuracy = 7, + Rms = 8, + LossFn = 9, + RSquared = 10, + LogLoss = 11, + LogLossReduction = 12, + Ndcg = 13, + Dcg = 14, + PositivePrecision = 15, + PositiveRecall = 16, + NegativePrecision = 17, + NegativeRecall = 18, + DrAtK = 19, + DrAtPFpr = 20, + DrAtNumPos = 21, + NumAnomalies = 22, + ThreshAtK = 23, + ThreshAtP = 24, + ThreshAtNumPos = 25, + Nmi = 26, + AvgMinScore = 27, + Dbi = 28 + } + + + + /// + /// State of an AutoML search and search space. + /// + public sealed class AutoMlStateAutoMlStateBase : AutoMlStateBase + { + /// + /// Supported metric for evaluator. + /// + public PipelineSweeperSupportedMetricsMetrics Metric { get; set; } = PipelineSweeperSupportedMetricsMetrics.Auc; + + /// + /// AutoML engine (pipeline optimizer) that generates next candidates. + /// + [JsonConverter(typeof(ComponentSerializer))] + public AutoMlEngine Engine { get; set; } + + /// + /// Kind of trainer for task, such as binary classification trainer, multiclass trainer, etc. + /// + public Microsoft.ML.Models.MacroUtilsTrainerKinds TrainerKind { get; set; } = Microsoft.ML.Models.MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; + + /// + /// Arguments for creating terminator, which determines when to stop search. + /// + [JsonConverter(typeof(ComponentSerializer))] + public SearchTerminator TerminatorArgs { get; set; } + + /// + /// Learner set to sweep over (if available). + /// + public string[] RequestedLearners { get; set; } + + internal override string ComponentName => "AutoMlState"; + } + + public abstract class BoosterParameterFunction : ComponentKind {} + + + + /// + /// Dropouts meet Multiple Additive Regresion Trees. See https://arxiv.org/abs/1505.01866 + /// + public sealed class DartBoosterParameterFunction : BoosterParameterFunction + { + /// + /// Drop ratio for trees. Range:(0,1). + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double DropRate { get; set; } = 0.1d; + + /// + /// Max number of dropped tree in a boosting round. + /// + [TlcModule.Range(Inf = 0, Max = 2147483647)] + public int MaxDrop { get; set; } = 1; + + /// + /// Probability for not perform dropping in a boosting round. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double SkipDrop { get; set; } = 0.5d; + + /// + /// True will enable xgboost dart mode. + /// + public bool XgboostDartMode { get; set; } = false; + + /// + /// True will enable uniform drop. + /// + public bool UniformDrop { get; set; } = false; + + /// + /// Use for binary classification when classes are not balanced. + /// + public bool UnbalancedSets { get; set; } = false; + + /// + /// Minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be. + /// + [TlcModule.Range(Min = 0d)] + public double MinSplitGain { get; set; } + + /// + /// Maximum depth of a tree. 0 means no limit. However, tree still grows by best-first. + /// + [TlcModule.Range(Min = 0, Max = 2147483647)] + public int MaxDepth { get; set; } + + /// + /// Minimum sum of instance weight(hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will be. + /// + [TlcModule.Range(Min = 0d)] + public double MinChildWeight { get; set; } = 0.1d; + + /// + /// Subsample frequency. 0 means no subsample. If subsampleFreq > 0, it will use a subset(ratio=subsample) to train. And the subset will be updated on every Subsample iteratinos. + /// + [TlcModule.Range(Min = 0, Max = 2147483647)] + public int SubsampleFreq { get; set; } + + /// + /// Subsample ratio of the training instance. Setting it to 0.5 means that LightGBM randomly collected half of the data instances to grow trees and this will prevent overfitting. Range: (0,1]. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double Subsample { get; set; } = 1d; + + /// + /// Subsample ratio of columns when constructing each tree. Range: (0,1]. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double FeatureFraction { get; set; } = 1d; + + /// + /// L2 regularization term on weights, increasing this value will make model more conservative. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("RegLambda", new object[]{0f, 0.5f, 1f})] + public double RegLambda { get; set; } = 0.01d; + + /// + /// L1 regularization term on weights, increase this value will make model more conservative. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("RegAlpha", new object[]{0f, 0.5f, 1f})] + public double RegAlpha { get; set; } + + /// + /// Control the balance of positive and negative weights, useful for unbalanced classes. A typical value to consider: sum(negative cases) / sum(positive cases). + /// + public double ScalePosWeight { get; set; } = 1d; + + internal override string ComponentName => "dart"; + } + + + + /// + /// Traditional Gradient Boosting Decision Tree. + /// + public sealed class GbdtBoosterParameterFunction : BoosterParameterFunction + { + /// + /// Use for binary classification when classes are not balanced. + /// + public bool UnbalancedSets { get; set; } = false; + + /// + /// Minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be. + /// + [TlcModule.Range(Min = 0d)] + public double MinSplitGain { get; set; } + + /// + /// Maximum depth of a tree. 0 means no limit. However, tree still grows by best-first. + /// + [TlcModule.Range(Min = 0, Max = 2147483647)] + public int MaxDepth { get; set; } + + /// + /// Minimum sum of instance weight(hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will be. + /// + [TlcModule.Range(Min = 0d)] + public double MinChildWeight { get; set; } = 0.1d; + + /// + /// Subsample frequency. 0 means no subsample. If subsampleFreq > 0, it will use a subset(ratio=subsample) to train. And the subset will be updated on every Subsample iteratinos. + /// + [TlcModule.Range(Min = 0, Max = 2147483647)] + public int SubsampleFreq { get; set; } + + /// + /// Subsample ratio of the training instance. Setting it to 0.5 means that LightGBM randomly collected half of the data instances to grow trees and this will prevent overfitting. Range: (0,1]. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double Subsample { get; set; } = 1d; + + /// + /// Subsample ratio of columns when constructing each tree. Range: (0,1]. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double FeatureFraction { get; set; } = 1d; + + /// + /// L2 regularization term on weights, increasing this value will make model more conservative. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("RegLambda", new object[]{0f, 0.5f, 1f})] + public double RegLambda { get; set; } = 0.01d; + + /// + /// L1 regularization term on weights, increase this value will make model more conservative. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("RegAlpha", new object[]{0f, 0.5f, 1f})] + public double RegAlpha { get; set; } + + /// + /// Control the balance of positive and negative weights, useful for unbalanced classes. A typical value to consider: sum(negative cases) / sum(positive cases). + /// + public double ScalePosWeight { get; set; } = 1d; + + internal override string ComponentName => "gbdt"; + } + + + + /// + /// Gradient-based One-Side Sampling. + /// + public sealed class GossBoosterParameterFunction : BoosterParameterFunction + { + /// + /// Retain ratio for large gradient instances. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double TopRate { get; set; } = 0.2d; + + /// + /// Retain ratio for small gradient instances. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double OtherRate { get; set; } = 0.1d; + + /// + /// Use for binary classification when classes are not balanced. + /// + public bool UnbalancedSets { get; set; } = false; + + /// + /// Minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be. + /// + [TlcModule.Range(Min = 0d)] + public double MinSplitGain { get; set; } + + /// + /// Maximum depth of a tree. 0 means no limit. However, tree still grows by best-first. + /// + [TlcModule.Range(Min = 0, Max = 2147483647)] + public int MaxDepth { get; set; } + + /// + /// Minimum sum of instance weight(hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will be. + /// + [TlcModule.Range(Min = 0d)] + public double MinChildWeight { get; set; } = 0.1d; + + /// + /// Subsample frequency. 0 means no subsample. If subsampleFreq > 0, it will use a subset(ratio=subsample) to train. And the subset will be updated on every Subsample iteratinos. + /// + [TlcModule.Range(Min = 0, Max = 2147483647)] + public int SubsampleFreq { get; set; } + + /// + /// Subsample ratio of the training instance. Setting it to 0.5 means that LightGBM randomly collected half of the data instances to grow trees and this will prevent overfitting. Range: (0,1]. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double Subsample { get; set; } = 1d; + + /// + /// Subsample ratio of columns when constructing each tree. Range: (0,1]. + /// + [TlcModule.Range(Inf = 0d, Max = 1d)] + public double FeatureFraction { get; set; } = 1d; + + /// + /// L2 regularization term on weights, increasing this value will make model more conservative. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("RegLambda", new object[]{0f, 0.5f, 1f})] + public double RegLambda { get; set; } = 0.01d; + + /// + /// L1 regularization term on weights, increase this value will make model more conservative. + /// + [TlcModule.Range(Min = 0d)] + [TlcModule.SweepableDiscreteParamAttribute("RegAlpha", new object[]{0f, 0.5f, 1f})] + public double RegAlpha { get; set; } + + /// + /// Control the balance of positive and negative weights, useful for unbalanced classes. A typical value to consider: sum(negative cases) / sum(positive cases). + /// + public double ScalePosWeight { get; set; } = 1d; + + internal override string ComponentName => "goss"; + } + + public abstract class CalibratorTrainer : ComponentKind {} + + + + public sealed class FixedPlattCalibratorCalibratorTrainer : CalibratorTrainer + { + /// + /// The slope parameter of f(x) = 1 / (1 + exp(-slope * x + offset) + /// + public double Slope { get; set; } = 1d; + + /// + /// The offset parameter of f(x) = 1 / (1 + exp(-slope * x + offset) + /// + public double Offset { get; set; } + + internal override string ComponentName => "FixedPlattCalibrator"; + } + + + + public sealed class NaiveCalibratorCalibratorTrainer : CalibratorTrainer + { + internal override string ComponentName => "NaiveCalibrator"; + } + + + + public sealed class PavCalibratorCalibratorTrainer : CalibratorTrainer + { + internal override string ComponentName => "PavCalibrator"; + } + + + + /// + /// Platt calibration. + /// + public sealed class PlattCalibratorCalibratorTrainer : CalibratorTrainer + { + internal override string ComponentName => "PlattCalibrator"; + } + + public abstract class ClassificationLossFunction : ComponentKind {} + + + + /// + /// Exponential loss. + /// + public sealed class ExpLossClassificationLossFunction : ClassificationLossFunction + { + /// + /// Beta (dilation) + /// + public float Beta { get; set; } = 1f; + + internal override string ComponentName => "ExpLoss"; + } + + + + /// + /// Hinge loss. + /// + public sealed class HingeLossClassificationLossFunction : ClassificationLossFunction + { + /// + /// Margin value + /// + public float Margin { get; set; } = 1f; + + internal override string ComponentName => "HingeLoss"; + } + + + + /// + /// Log loss. + /// + public sealed class LogLossClassificationLossFunction : ClassificationLossFunction + { + internal override string ComponentName => "LogLoss"; + } + + + + /// + /// Smoothed Hinge loss. + /// + public sealed class SmoothedHingeLossClassificationLossFunction : ClassificationLossFunction + { + /// + /// Smoothing constant + /// + public float SmoothingConst { get; set; } = 1f; + + internal override string ComponentName => "SmoothedHingeLoss"; + } + + public abstract class EarlyStoppingCriterion : ComponentKind {} + + + + /// + /// Stop in case of loss of generality. + /// + public sealed class GLEarlyStoppingCriterion : EarlyStoppingCriterion + { + /// + /// Threshold in range [0,1]. + /// + [TlcModule.Range(Min = 0f, Max = 1f)] + public float Threshold { get; set; } = 0.01f; + + internal override string ComponentName => "GL"; + } + + + + /// + /// Stops in case of low progress. + /// + public sealed class LPEarlyStoppingCriterion : EarlyStoppingCriterion + { + /// + /// Threshold in range [0,1]. + /// + [TlcModule.Range(Min = 0f, Max = 1f)] + public float Threshold { get; set; } = 0.01f; + + /// + /// The window size. + /// + [TlcModule.Range(Inf = 0)] + public int WindowSize { get; set; } = 5; + + internal override string ComponentName => "LP"; + } + + + + /// + /// Stops in case of generality to progress ration exceeds threshold. + /// + public sealed class PQEarlyStoppingCriterion : EarlyStoppingCriterion + { + /// + /// Threshold in range [0,1]. + /// + [TlcModule.Range(Min = 0f, Max = 1f)] + public float Threshold { get; set; } = 0.01f; + + /// + /// The window size. + /// + [TlcModule.Range(Inf = 0)] + public int WindowSize { get; set; } = 5; + + internal override string ComponentName => "PQ"; + } + + + + /// + /// Stop if validation score exceeds threshold value. + /// + public sealed class TREarlyStoppingCriterion : EarlyStoppingCriterion + { + /// + /// Tolerance threshold. (Non negative value) + /// + [TlcModule.Range(Min = 0f)] + public float Threshold { get; set; } = 0.01f; + + internal override string ComponentName => "TR"; + } + + + + /// + /// Stops in case of consecutive loss in generality. + /// + public sealed class UPEarlyStoppingCriterion : EarlyStoppingCriterion + { + /// + /// The window size. + /// + [TlcModule.Range(Inf = 0)] + public int WindowSize { get; set; } = 5; + + internal override string ComponentName => "UP"; + } + + public abstract class EnsembleBinaryDiversityMeasure : ComponentKind {} + + + + public sealed class DisagreementDiversityMeasureEnsembleBinaryDiversityMeasure : EnsembleBinaryDiversityMeasure + { + internal override string ComponentName => "DisagreementDiversityMeasure"; + } + + public abstract class EnsembleBinaryOutputCombiner : ComponentKind {} + + + + public sealed class AverageEnsembleBinaryOutputCombiner : EnsembleBinaryOutputCombiner + { + internal override string ComponentName => "Average"; + } + + + + public sealed class MedianEnsembleBinaryOutputCombiner : EnsembleBinaryOutputCombiner + { + internal override string ComponentName => "Median"; + } + + + + public sealed class StackingEnsembleBinaryOutputCombiner : EnsembleBinaryOutputCombiner + { + /// + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set + /// + public float ValidationDatasetProportion { get; set; } = 0.3f; + + internal override string ComponentName => "Stacking"; + } + + + + public sealed class VotingEnsembleBinaryOutputCombiner : EnsembleBinaryOutputCombiner + { + internal override string ComponentName => "Voting"; + } + + public enum WeightageKind + { + Accuracy = 0, + Auc = 1, + PosPrecision = 2, + PosRecall = 3, + NegPrecision = 4, + NegRecall = 5 + } + + + + public sealed class WeightedAverageEnsembleBinaryOutputCombiner : EnsembleBinaryOutputCombiner + { + /// + /// The metric type to be used to find the weights for each model + /// + public WeightageKind WeightageName { get; set; } = WeightageKind.Auc; + + internal override string ComponentName => "WeightedAverage"; + } + + public abstract class EnsembleBinarySubModelSelector : ComponentKind {} + + + + public sealed class AllSelectorEnsembleBinarySubModelSelector : EnsembleBinarySubModelSelector + { + internal override string ComponentName => "AllSelector"; + } + + + + public sealed class BestDiverseSelectorEnsembleBinarySubModelSelector : EnsembleBinarySubModelSelector + { + /// + /// The metric type to be used to find the diversity among base learners + /// + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleBinaryDiversityMeasure DiversityMetricType { get; set; } = new DisagreementDiversityMeasureEnsembleBinaryDiversityMeasure(); + + /// + /// The proportion of best base learners to be selected. The range is 0.0-1.0 + /// + public float LearnersSelectionProportion { get; set; } = 0.5f; + /// + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set + /// + public float ValidationDatasetProportion { get; set; } = 0.3f; + internal override string ComponentName => "BestDiverseSelector"; + } - /// - /// AutoML engine that returns learners with default settings. - /// - public sealed class DefaultsAutoMlEngine : AutoMlEngine + public enum BinaryClassifierEvaluatorMetrics { - internal override string ComponentName => "Defaults"; + Accuracy = 0, + PosPrecName = 1, + PosRecallName = 2, + NegPrecName = 3, + NegRecallName = 4, + Auc = 5, + LogLoss = 6, + LogLossReduction = 7, + F1 = 8, + AuPrc = 9 } - /// - /// AutoML engine that consists of distinct, hierarchical stages of operation. - /// - public sealed class RocketAutoMlEngine : AutoMlEngine + public sealed class BestPerformanceSelectorEnsembleBinarySubModelSelector : EnsembleBinarySubModelSelector { /// - /// Number of learners to retain for second stage. + /// The metric type to be used to find the best performance /// - public int TopKLearners { get; set; } = 2; + public BinaryClassifierEvaluatorMetrics MetricName { get; set; } = BinaryClassifierEvaluatorMetrics.Auc; /// - /// Number of trials for retained second stage learners. + /// The proportion of best base learners to be selected. The range is 0.0-1.0 /// - public int SecondRoundTrialsPerLearner { get; set; } = 5; + public float LearnersSelectionProportion { get; set; } = 0.5f; /// - /// Use random initialization only. + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set /// - public bool RandomInitialization { get; set; } = false; + public float ValidationDatasetProportion { get; set; } = 0.3f; - /// - /// Number of initilization pipelines, used for random initialization only. - /// - public int NumInitializationPipelines { get; set; } = 20; + internal override string ComponentName => "BestPerformanceSelector"; + } - internal override string ComponentName => "Rocket"; + public abstract class EnsembleFeatureSelector : ComponentKind {} + + + + public sealed class AllFeatureSelectorEnsembleFeatureSelector : EnsembleFeatureSelector + { + internal override string ComponentName => "AllFeatureSelector"; } - /// - /// AutoML engine using uniform random sampling. - /// - public sealed class UniformRandomAutoMlEngine : AutoMlEngine + public sealed class RandomFeatureSelectorEnsembleFeatureSelector : EnsembleFeatureSelector { - internal override string ComponentName => "UniformRandom"; + /// + /// The proportion of features to be selected. The range is 0.0-1.0 + /// + public float FeaturesSelectionProportion { get; set; } = 0.8f; + + internal override string ComponentName => "RandomFeatureSelector"; } - public abstract class AutoMlStateBase : ComponentKind {} + public abstract class EnsembleMulticlassDiversityMeasure : ComponentKind {} + + - public enum AutoInferenceAutoMlMlStateArgumentsMetrics + public sealed class MultiDisagreementDiversityMeasureEnsembleMulticlassDiversityMeasure : EnsembleMulticlassDiversityMeasure { - Auc = 0, - AccuracyMicro = 1, - AccuracyMacro = 2, - L2 = 3, - F1 = 4, - AuPrc = 5, - TopKAccuracy = 6, - Rms = 7, - LossFn = 8, - RSquared = 9, - LogLoss = 10, - LogLossReduction = 11, - Ndcg = 12, - Dcg = 13, - PositivePrecision = 14, - PositiveRecall = 15, - NegativePrecision = 16, - NegativeRecall = 17, - DrAtK = 18, - DrAtPFpr = 19, - DrAtNumPos = 20, - NumAnomalies = 21, - ThreshAtK = 22, - ThreshAtP = 23, - ThreshAtNumPos = 24, - Nmi = 25, - AvgMinScore = 26, - Dbi = 27 + internal override string ComponentName => "MultiDisagreementDiversityMeasure"; } + public abstract class EnsembleMulticlassOutputCombiner : ComponentKind {} - /// - /// State of an AutoML search and search space. - /// - public sealed class AutoMlStateAutoMlStateBase : AutoMlStateBase + + public sealed class MultiAverageEnsembleMulticlassOutputCombiner : EnsembleMulticlassOutputCombiner { /// - /// Supported metric for evaluator. + /// Whether to normalize the output of base models before combining them /// - public Microsoft.ML.Runtime.AutoInferenceAutoMlMlStateArgumentsMetrics Metric { get; set; } = Microsoft.ML.Runtime.AutoInferenceAutoMlMlStateArgumentsMetrics.Auc; + public bool Normalize { get; set; } = true; - /// - /// AutoML engine (pipeline optimizer) that generates next candidates. - /// - [JsonConverter(typeof(ComponentSerializer))] - public AutoMlEngine Engine { get; set; } + internal override string ComponentName => "MultiAverage"; + } - /// - /// Kind of trainer for task, such as binary classification trainer, multiclass trainer, etc. - /// - public Microsoft.ML.Models.MacroUtilsTrainerKinds TrainerKind { get; set; } = Microsoft.ML.Models.MacroUtilsTrainerKinds.SignatureBinaryClassifierTrainer; + + public sealed class MultiMedianEnsembleMulticlassOutputCombiner : EnsembleMulticlassOutputCombiner + { /// - /// Arguments for creating terminator, which determines when to stop search. + /// Whether to normalize the output of base models before combining them /// - [JsonConverter(typeof(ComponentSerializer))] - public SearchTerminator TerminatorArgs { get; set; } + public bool Normalize { get; set; } = true; + + internal override string ComponentName => "MultiMedian"; + } + + + public sealed class MultiStackingEnsembleMulticlassOutputCombiner : EnsembleMulticlassOutputCombiner + { /// - /// Learner set to sweep over (if available). + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set /// - public string[] RequestedLearners { get; set; } + public float ValidationDatasetProportion { get; set; } = 0.3f; - internal override string ComponentName => "AutoMlState"; + internal override string ComponentName => "MultiStacking"; } - public abstract class CalibratorTrainer : ComponentKind {} + public sealed class MultiVotingEnsembleMulticlassOutputCombiner : EnsembleMulticlassOutputCombiner + { + internal override string ComponentName => "MultiVoting"; + } - /// - /// - /// - public sealed class FixedPlattCalibratorCalibratorTrainer : CalibratorTrainer + public enum MultiWeightageKind + { + AccuracyMicroAvg = 0, + AccuracyMacroAvg = 1 + } + + + + public sealed class MultiWeightedAverageEnsembleMulticlassOutputCombiner : EnsembleMulticlassOutputCombiner { /// - /// The slope parameter of f(x) = 1 / (1 + exp(-slope * x + offset) + /// The metric type to be used to find the weights for each model /// - public double Slope { get; set; } = 1d; + public MultiWeightageKind WeightageName { get; set; } = MultiWeightageKind.AccuracyMicroAvg; /// - /// The offset parameter of f(x) = 1 / (1 + exp(-slope * x + offset) + /// Whether to normalize the output of base models before combining them /// - public double Offset { get; set; } + public bool Normalize { get; set; } = true; - internal override string ComponentName => "FixedPlattCalibrator"; + internal override string ComponentName => "MultiWeightedAverage"; } + public abstract class EnsembleMulticlassSubModelSelector : ComponentKind {} - /// - /// - /// - public sealed class NaiveCalibratorCalibratorTrainer : CalibratorTrainer + + public sealed class AllSelectorMultiClassEnsembleMulticlassSubModelSelector : EnsembleMulticlassSubModelSelector { - internal override string ComponentName => "NaiveCalibrator"; + internal override string ComponentName => "AllSelectorMultiClass"; } - /// - /// - /// - public sealed class PavCalibratorCalibratorTrainer : CalibratorTrainer + public sealed class BestDiverseSelectorMultiClassEnsembleMulticlassSubModelSelector : EnsembleMulticlassSubModelSelector { - internal override string ComponentName => "PavCalibrator"; - } + /// + /// The metric type to be used to find the diversity among base learners + /// + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleMulticlassDiversityMeasure DiversityMetricType { get; set; } = new MultiDisagreementDiversityMeasureEnsembleMulticlassDiversityMeasure(); + /// + /// The proportion of best base learners to be selected. The range is 0.0-1.0 + /// + public float LearnersSelectionProportion { get; set; } = 0.5f; + /// + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set + /// + public float ValidationDatasetProportion { get; set; } = 0.3f; - /// - /// Platt calibration. - /// - public sealed class PlattCalibratorCalibratorTrainer : CalibratorTrainer - { - internal override string ComponentName => "PlattCalibrator"; + internal override string ComponentName => "BestDiverseSelectorMultiClass"; } - public abstract class ClassificationLossFunction : ComponentKind {} + public enum MultiClassClassifierEvaluatorMetrics + { + AccuracyMicro = 0, + AccuracyMacro = 1, + LogLoss = 2, + LogLossReduction = 3 + } - /// - /// Exponential loss. - /// - public sealed class ExpLossClassificationLossFunction : ClassificationLossFunction + public sealed class BestPerformanceSelectorMultiClassEnsembleMulticlassSubModelSelector : EnsembleMulticlassSubModelSelector { /// - /// Beta (dilation) + /// The metric type to be used to find the best performance /// - public float Beta { get; set; } = 1f; + public MultiClassClassifierEvaluatorMetrics MetricName { get; set; } = MultiClassClassifierEvaluatorMetrics.AccuracyMicro; - internal override string ComponentName => "ExpLoss"; + /// + /// The proportion of best base learners to be selected. The range is 0.0-1.0 + /// + public float LearnersSelectionProportion { get; set; } = 0.5f; + + /// + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set + /// + public float ValidationDatasetProportion { get; set; } = 0.3f; + + internal override string ComponentName => "BestPerformanceSelectorMultiClass"; } + public abstract class EnsembleRegressionDiversityMeasure : ComponentKind {} - /// - /// Hinge loss. - /// - public sealed class HingeLossClassificationLossFunction : ClassificationLossFunction + + public sealed class RegressionDisagreementDiversityMeasureEnsembleRegressionDiversityMeasure : EnsembleRegressionDiversityMeasure { - /// - /// Margin value - /// - public float Margin { get; set; } = 1f; + internal override string ComponentName => "RegressionDisagreementDiversityMeasure"; + } - internal override string ComponentName => "HingeLoss"; + public abstract class EnsembleRegressionOutputCombiner : ComponentKind {} + + + + public sealed class AverageEnsembleRegressionOutputCombiner : EnsembleRegressionOutputCombiner + { + internal override string ComponentName => "Average"; } - /// - /// Log loss. - /// - public sealed class LogLossClassificationLossFunction : ClassificationLossFunction + public sealed class MedianEnsembleRegressionOutputCombiner : EnsembleRegressionOutputCombiner { - internal override string ComponentName => "LogLoss"; + internal override string ComponentName => "Median"; } - /// - /// Smoothed Hinge loss. - /// - public sealed class SmoothedHingeLossClassificationLossFunction : ClassificationLossFunction + public sealed class RegressionStackingEnsembleRegressionOutputCombiner : EnsembleRegressionOutputCombiner { /// - /// Smoothing constant + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set /// - public float SmoothingConst { get; set; } = 1f; + public float ValidationDatasetProportion { get; set; } = 0.3f; - internal override string ComponentName => "SmoothedHingeLoss"; + internal override string ComponentName => "RegressionStacking"; } - public abstract class EarlyStoppingCriterion : ComponentKind {} + public abstract class EnsembleRegressionSubModelSelector : ComponentKind {} - /// - /// Stop in case of loss of generality. - /// - public sealed class GLEarlyStoppingCriterion : EarlyStoppingCriterion + public sealed class AllSelectorEnsembleRegressionSubModelSelector : EnsembleRegressionSubModelSelector { - /// - /// Threshold in range [0,1]. - /// - [TlcModule.Range(Min = 0f, Max = 1f)] - public float Threshold { get; set; } = 0.01f; - - internal override string ComponentName => "GL"; + internal override string ComponentName => "AllSelector"; } - /// - /// Stops in case of low progress. - /// - public sealed class LPEarlyStoppingCriterion : EarlyStoppingCriterion + public sealed class BestDiverseSelectorRegressionEnsembleRegressionSubModelSelector : EnsembleRegressionSubModelSelector { /// - /// Threshold in range [0,1]. + /// The metric type to be used to find the diversity among base learners /// - [TlcModule.Range(Min = 0f, Max = 1f)] - public float Threshold { get; set; } = 0.01f; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleRegressionDiversityMeasure DiversityMetricType { get; set; } = new RegressionDisagreementDiversityMeasureEnsembleRegressionDiversityMeasure(); /// - /// The window size. + /// The proportion of best base learners to be selected. The range is 0.0-1.0 /// - [TlcModule.Range(Inf = 0)] - public int WindowSize { get; set; } = 5; + public float LearnersSelectionProportion { get; set; } = 0.5f; - internal override string ComponentName => "LP"; + /// + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set + /// + public float ValidationDatasetProportion { get; set; } = 0.3f; + + internal override string ComponentName => "BestDiverseSelectorRegression"; } + public enum RegressionEvaluatorMetrics + { + L1 = 0, + L2 = 1, + Rms = 2, + Loss = 3, + RSquared = 4 + } - /// - /// Stops in case of generality to progress ration exceeds threshold. - /// - public sealed class PQEarlyStoppingCriterion : EarlyStoppingCriterion + + public sealed class BestPerformanceRegressionSelectorEnsembleRegressionSubModelSelector : EnsembleRegressionSubModelSelector { /// - /// Threshold in range [0,1]. + /// The metric type to be used to find the best performance /// - [TlcModule.Range(Min = 0f, Max = 1f)] - public float Threshold { get; set; } = 0.01f; + public RegressionEvaluatorMetrics MetricName { get; set; } = RegressionEvaluatorMetrics.L1; /// - /// The window size. + /// The proportion of best base learners to be selected. The range is 0.0-1.0 /// - [TlcModule.Range(Inf = 0)] - public int WindowSize { get; set; } = 5; + public float LearnersSelectionProportion { get; set; } = 0.5f; - internal override string ComponentName => "PQ"; + /// + /// The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set + /// + public float ValidationDatasetProportion { get; set; } = 0.3f; + + internal override string ComponentName => "BestPerformanceRegressionSelector"; } + public abstract class EnsembleSubsetSelector : ComponentKind {} - /// - /// Stop if validation score exceeds threshold value. - /// - public sealed class TREarlyStoppingCriterion : EarlyStoppingCriterion + + public sealed class AllInstanceSelectorEnsembleSubsetSelector : EnsembleSubsetSelector { /// - /// Tolerance threshold. (Non negative value) + /// The Feature selector /// - [TlcModule.Range(Min = 0f)] - public float Threshold { get; set; } = 0.01f; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleFeatureSelector FeatureSelector { get; set; } = new AllFeatureSelectorEnsembleFeatureSelector(); - internal override string ComponentName => "TR"; + internal override string ComponentName => "AllInstanceSelector"; } - /// - /// Stops in case of consecutive loss in generality. - /// - public sealed class UPEarlyStoppingCriterion : EarlyStoppingCriterion + public sealed class BootstrapSelectorEnsembleSubsetSelector : EnsembleSubsetSelector { /// - /// The window size. + /// The Feature selector /// - [TlcModule.Range(Inf = 0)] - public int WindowSize { get; set; } = 5; + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleFeatureSelector FeatureSelector { get; set; } = new AllFeatureSelectorEnsembleFeatureSelector(); - internal override string ComponentName => "UP"; + internal override string ComponentName => "BootstrapSelector"; + } + + + + public sealed class RandomPartitionSelectorEnsembleSubsetSelector : EnsembleSubsetSelector + { + /// + /// The Feature selector + /// + [JsonConverter(typeof(ComponentSerializer))] + public EnsembleFeatureSelector FeatureSelector { get; set; } = new AllFeatureSelectorEnsembleFeatureSelector(); + + internal override string ComponentName => "RandomPartitionSelector"; } public abstract class FastTreeTrainer : ComponentKind {} @@ -13966,7 +16603,7 @@ public sealed class FastTreeBinaryClassificationFastTreeTrainer : FastTreeTraine /// /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; + public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// /// Early stopping rule. (Validation set (/valid) is required.) @@ -14131,7 +16768,7 @@ public sealed class FastTreeBinaryClassificationFastTreeTrainer : FastTreeTraine /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -14181,7 +16818,7 @@ public sealed class FastTreeBinaryClassificationFastTreeTrainer : FastTreeTraine public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -14274,12 +16911,12 @@ public sealed class FastTreeBinaryClassificationFastTreeTrainer : FastTreeTraine /// /// Normalize option for the feature column /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// /// Whether learner should cache input training data /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; internal override string ComponentName => "FastTreeBinaryClassification"; } @@ -14354,7 +16991,7 @@ public sealed class FastTreeRankingFastTreeTrainer : FastTreeTrainer /// /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; + public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// /// Early stopping rule. (Validation set (/valid) is required.) @@ -14519,7 +17156,7 @@ public sealed class FastTreeRankingFastTreeTrainer : FastTreeTrainer /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -14569,7 +17206,7 @@ public sealed class FastTreeRankingFastTreeTrainer : FastTreeTrainer public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -14662,12 +17299,12 @@ public sealed class FastTreeRankingFastTreeTrainer : FastTreeTrainer /// /// Normalize option for the feature column /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// /// Whether learner should cache input training data /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; internal override string ComponentName => "FastTreeRanking"; } @@ -14702,7 +17339,7 @@ public sealed class FastTreeRegressionFastTreeTrainer : FastTreeTrainer /// /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; + public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// /// Early stopping rule. (Validation set (/valid) is required.) @@ -14867,7 +17504,7 @@ public sealed class FastTreeRegressionFastTreeTrainer : FastTreeTrainer /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -14917,7 +17554,7 @@ public sealed class FastTreeRegressionFastTreeTrainer : FastTreeTrainer public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -15010,12 +17647,12 @@ public sealed class FastTreeRegressionFastTreeTrainer : FastTreeTrainer /// /// Normalize option for the feature column /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// /// Whether learner should cache input training data /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; internal override string ComponentName => "FastTreeRegression"; } @@ -15055,7 +17692,7 @@ public sealed class FastTreeTweedieRegressionFastTreeTrainer : FastTreeTrainer /// /// Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent) /// - public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; + public Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType OptimizationAlgorithm { get; set; } = Microsoft.ML.Trainers.BoostedTreeArgsOptimizationAlgorithmType.GradientDescent; /// /// Early stopping rule. (Validation set (/valid) is required.) @@ -15220,7 +17857,7 @@ public sealed class FastTreeTweedieRegressionFastTreeTrainer : FastTreeTrainer /// /// Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle. /// - public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; + public Microsoft.ML.Trainers.Bundle Bundling { get; set; } = Microsoft.ML.Trainers.Bundle.None; /// /// Maximum number of distinct values (bins) per feature @@ -15270,7 +17907,7 @@ public sealed class FastTreeTweedieRegressionFastTreeTrainer : FastTreeTrainer public int MinDocumentsInLeafs { get; set; } = 10; /// - /// Number of weak hypotheses in the ensemble + /// Total number of decision trees to create in the ensemble /// [TlcModule.SweepableDiscreteParamAttribute("NumTrees", new object[]{20, 100, 500})] public int NumTrees { get; set; } = 100; @@ -15363,12 +18000,12 @@ public sealed class FastTreeTweedieRegressionFastTreeTrainer : FastTreeTrainer /// /// Normalize option for the feature column /// - public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; + public Microsoft.ML.Models.NormalizeOption NormalizeFeatures { get; set; } = Microsoft.ML.Models.NormalizeOption.Auto; /// /// Whether learner should cache input training data /// - public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; + public Microsoft.ML.Models.CachingOptions Caching { get; set; } = Microsoft.ML.Models.CachingOptions.Auto; internal override string ComponentName => "FastTreeTweedieRegression"; } @@ -15405,7 +18042,7 @@ public sealed class NGramNgramExtractor : NgramExtractor /// /// The weighting criteria /// - public Microsoft.ML.Transforms.NgramTransformWeightingCriteria Weighting { get; set; } = Microsoft.ML.Transforms.NgramTransformWeightingCriteria.Tf; + public Microsoft.ML.Transforms.NgramTransformWeightingCriteria Weighting { get; set; } = Microsoft.ML.Transforms.NgramTransformWeightingCriteria.Tf; internal override string ComponentName => "NGram"; } @@ -15455,6 +18092,18 @@ public sealed class NGramHashNgramExtractor : NgramExtractor internal override string ComponentName => "NGramHash"; } + public abstract class ParallelLightGBM : ComponentKind {} + + + + /// + /// Single node machine learning process. + /// + public sealed class SingleParallelLightGBM : ParallelLightGBM + { + internal override string ComponentName => "Single"; + } + public abstract class ParallelTraining : ComponentKind {} @@ -15490,7 +18139,7 @@ public sealed partial class PartitionedFileLoaderColumn /// /// Data type of the column. /// - public Microsoft.ML.Transforms.DataKind? Type { get; set; } + public Microsoft.ML.Data.DataKind? Type { get; set; } /// /// Index of the directory representing this column. @@ -15508,12 +18157,12 @@ public sealed class SimplePathParserPartitionedPathParser : PartitionedPathParse /// /// Column definitions used to override the Partitioned Path Parser. Expected with the format name:type:numeric-source, e.g. col=MyFeature:R4:1 /// - public Microsoft.ML.Runtime.PartitionedFileLoaderColumn[] Columns { get; set; } + public PartitionedFileLoaderColumn[] Columns { get; set; } /// /// Data type of each column. /// - public Microsoft.ML.Transforms.DataKind Type { get; set; } = Microsoft.ML.Transforms.DataKind.TX; + public Microsoft.ML.Data.DataKind Type { get; set; } = Microsoft.ML.Data.DataKind.TX; internal override string ComponentName => "SimplePathParser"; } diff --git a/src/Microsoft.ML/Data/TextLoader.cs b/src/Microsoft.ML/Data/TextLoader.cs index c9b16ad24e..6e89e8a54e 100644 --- a/src/Microsoft.ML/Data/TextLoader.cs +++ b/src/Microsoft.ML/Data/TextLoader.cs @@ -20,7 +20,7 @@ public TextLoaderRange() } /// - /// Convenience constructor for the scalar case, when a given column + /// Convenience constructor for the scalar case, when a given column /// in the schema spans only a single column in the dataset. /// and are set to the single value . /// @@ -35,7 +35,7 @@ public TextLoaderRange(int ordinal) } /// - /// Convenience constructor for the vector case, when a given column + /// Convenience constructor for the vector case, when a given column /// in the schema spans contiguous columns in the dataset. /// /// Starting column index in the dataset. @@ -58,13 +58,13 @@ public sealed partial class TextLoader /// /// Does the file contains header? /// Column separator character. Default is '\t' - /// Whether the input may include quoted values, + /// Whether the input may include quoted values, /// which can contain separator characters, colons, - /// and distinguish empty values from missing values. When true, consecutive separators - /// denote a missing value and an empty value is denoted by \"\". + /// and distinguish empty values from missing values. When true, consecutive separators + /// denote a missing value and an empty value is denoted by \"\". /// When false, consecutive separators denote an empty value. - /// Whether the input may include sparse representations e.g. - /// if one of the row contains "5 2:6 4:3" that's mean there are 5 columns all zero + /// Whether the input may include sparse representations e.g. + /// if one of the row contains "5 2:6 4:3" that's mean there are 5 columns all zero /// except for 3rd and 5th columns which have values 6 and 3 /// Remove trailing whitespace from lines public TextLoader CreateFrom(bool useHeader = false, diff --git a/src/Microsoft.ML/ILearningPipelineItem.cs b/src/Microsoft.ML/ILearningPipelineItem.cs index c36f890c57..efa4464453 100644 --- a/src/Microsoft.ML/ILearningPipelineItem.cs +++ b/src/Microsoft.ML/ILearningPipelineItem.cs @@ -32,7 +32,7 @@ public interface ILearningPipelineLoader : ILearningPipelineItem /// /// An item that can be added to the Learning Pipeline that can be trained and or return a IDataView. - /// This encapsulates an IDataView(input) and ITranformModel(output) object for a transform and + /// This encapsulates an IDataView(input) and ITransformModel(output) object for a transform and /// for a learner it will encapsulate IDataView(input) and IPredictorModel(output). /// public interface ILearningPipelineStep diff --git a/src/Microsoft.ML/LearningPipeline.cs b/src/Microsoft.ML/LearningPipeline.cs index 0637c5e65e..98e95c1319 100644 --- a/src/Microsoft.ML/LearningPipeline.cs +++ b/src/Microsoft.ML/LearningPipeline.cs @@ -14,7 +14,7 @@ namespace Microsoft.ML { - class ScorerPipelineStep : ILearningPipelineDataStep + public sealed class ScorerPipelineStep : ILearningPipelineDataStep { public ScorerPipelineStep(Var data, Var model) { @@ -26,12 +26,11 @@ public ScorerPipelineStep(Var data, Var model) public Var Model { get; } } - /// /// The class is used to define the steps needed to perform a desired machine learning task. - /// The steps are defined by adding a data loader (e.g. ) followed by zero or more transforms (e.g. ) + /// The steps are defined by adding a data loader (e.g. ) followed by zero or more transforms (e.g. ) /// and at most one trainer/learner (e.g. ) in the pipeline. - /// + /// /// /// /// @@ -41,14 +40,14 @@ public ScorerPipelineStep(Var data, Var model) /// pipeline.Add(new TextLoader <SentimentData> (dataPath, separator: ",")); /// pipeline.Add(new TextFeaturizer("Features", "SentimentText")); /// pipeline.Add(new FastTreeBinaryClassifier()); - /// + /// /// var model = pipeline.Train<SentimentData, SentimentPrediction>(); /// /// [DebuggerTypeProxy(typeof(LearningPipelineDebugProxy))] public class LearningPipeline : ICollection { - private List Items { get; } = new List(); + private List Items { get; } private readonly int? _seed; private readonly int _conc; @@ -56,9 +55,8 @@ public class LearningPipeline : ICollection /// Construct an empty object. /// public LearningPipeline() + : this(conc: 0) { - _seed = null; - _conc = 0; } /// @@ -68,6 +66,7 @@ public LearningPipeline() /// Specify concurrency factor (default value - autoselection) internal LearningPipeline(int? seed = null, int conc = 0) { + Items = new List(); _seed = seed; _conc = conc; } @@ -79,7 +78,7 @@ internal LearningPipeline(int? seed = null, int conc = 0) public bool IsReadOnly => false; /// - /// Add a data loader, transform or trainer into the pipeline. + /// Add a data loader, transform or trainer into the pipeline. /// Possible data loader(s), transforms and trainers options are /// /// Data Loader: diff --git a/src/Microsoft.ML/LearningPipelineDebugProxy.cs b/src/Microsoft.ML/LearningPipelineDebugProxy.cs index e9d93425e4..eab1af6386 100644 --- a/src/Microsoft.ML/LearningPipelineDebugProxy.cs +++ b/src/Microsoft.ML/LearningPipelineDebugProxy.cs @@ -225,7 +225,12 @@ internal class PipelineItemDebugColumn { public string Name { get; set; } public string Type { get; set; } - public string SlotNames { get; set; } = string.Empty; + public string SlotNames { get; set; } + + public PipelineItemDebugColumn() + { + SlotNames = string.Empty; + } } [DebuggerDisplay("{Values}")] diff --git a/src/Microsoft.ML/Microsoft.ML.csproj b/src/Microsoft.ML/Microsoft.ML.csproj index 7b370f2804..bd3d72ab68 100644 --- a/src/Microsoft.ML/Microsoft.ML.csproj +++ b/src/Microsoft.ML/Microsoft.ML.csproj @@ -9,7 +9,6 @@ - diff --git a/src/Microsoft.ML/Models/BinaryClassificationEvaluator.cs b/src/Microsoft.ML/Models/BinaryClassificationEvaluator.cs index 1a670fc854..9d841d1e21 100644 --- a/src/Microsoft.ML/Models/BinaryClassificationEvaluator.cs +++ b/src/Microsoft.ML/Models/BinaryClassificationEvaluator.cs @@ -47,7 +47,7 @@ public BinaryClassificationMetrics Evaluate(PredictionModel model, ILearningPipe Output evaluteOutput = experiment.Add(this); experiment.Compile(); - + experiment.SetInput(datasetScorer.TransformModel, model.PredictorModel); testData.SetInput(environment, experiment); @@ -67,7 +67,8 @@ public BinaryClassificationMetrics Evaluate(PredictionModel model, ILearningPipe var metric = BinaryClassificationMetrics.FromMetrics(environment, overallMetrics, confusionMatrix); - Contracts.Check(metric.Count == 1, $"Exactly one metric set was expected but found {metric.Count} metrics"); + if (metric.Count != 1) + throw environment.Except($"Exactly one metric set was expected but found {metric.Count} metrics"); return metric[0]; } diff --git a/src/Microsoft.ML/Models/BinaryClassificationMetrics.cs b/src/Microsoft.ML/Models/BinaryClassificationMetrics.cs index f536f30ed0..1714265674 100644 --- a/src/Microsoft.ML/Models/BinaryClassificationMetrics.cs +++ b/src/Microsoft.ML/Models/BinaryClassificationMetrics.cs @@ -7,6 +7,7 @@ using Microsoft.ML.Runtime.Data; using System; using System.Collections.Generic; +using static Microsoft.ML.Runtime.Data.MetricKinds; namespace Microsoft.ML.Models { @@ -34,11 +35,11 @@ internal static List FromMetrics(IHostEnvironment e List metrics = new List(); var confusionMatrices = ConfusionMatrix.Create(env, confusionMatrix).GetEnumerator(); - int Index = 0; - foreach(var metric in metricsEnumerable) + int index = 0; + foreach (var metric in metricsEnumerable) { - if (Index++ >= confusionMatriceStartIndex && !confusionMatrices.MoveNext()) + if (index++ >= confusionMatriceStartIndex && !confusionMatrices.MoveNext()) { throw env.Except("Confusion matrices didn't have enough matrices."); } @@ -57,6 +58,7 @@ internal static List FromMetrics(IHostEnvironment e Entropy = metric.Entropy, F1Score = metric.F1Score, Auprc = metric.Auprc, + RowTag = metric.RowTag, ConfusionMatrix = confusionMatrices.Current, }); @@ -162,6 +164,12 @@ internal static List FromMetrics(IHostEnvironment e /// public ConfusionMatrix ConfusionMatrix { get; private set; } + /// + /// For cross-validation, this is equal to "Fold N" for per-fold metric rows, "Overall" for the average metrics and "STD" for standard deviation. + /// For non-CV scenarios, this is equal to null + /// + public string RowTag { get; private set; } + /// /// This class contains the public fields necessary to deserialize from IDataView. /// @@ -200,6 +208,9 @@ private sealed class SerializationClass [ColumnName(BinaryClassifierEvaluator.AuPrc)] public Double Auprc; + + [ColumnName(ColumnNames.FoldIndex)] + public string RowTag; #pragma warning restore 649 // never assigned } } diff --git a/src/Microsoft.ML/Models/ClassificationEvaluator.cs b/src/Microsoft.ML/Models/ClassificationEvaluator.cs index bc97a372a0..7adec772e2 100644 --- a/src/Microsoft.ML/Models/ClassificationEvaluator.cs +++ b/src/Microsoft.ML/Models/ClassificationEvaluator.cs @@ -68,7 +68,8 @@ public ClassificationMetrics Evaluate(PredictionModel model, ILearningPipelineLo var metric = ClassificationMetrics.FromMetrics(environment, overallMetrics, confusionMatrix); - Contracts.Check(metric.Count == 1, $"Exactly one metric set was expected but found {metric.Count} metrics"); + if (metric.Count != 1) + throw environment.Except($"Exactly one metric set was expected but found {metric.Count} metrics"); return metric[0]; } diff --git a/src/Microsoft.ML/Models/ClassificationMetrics.cs b/src/Microsoft.ML/Models/ClassificationMetrics.cs index f3a2416bca..6c1c139278 100644 --- a/src/Microsoft.ML/Models/ClassificationMetrics.cs +++ b/src/Microsoft.ML/Models/ClassificationMetrics.cs @@ -6,6 +6,7 @@ using Microsoft.ML.Runtime.Api; using Microsoft.ML.Runtime.Data; using System.Collections.Generic; +using static Microsoft.ML.Runtime.Data.MetricKinds; namespace Microsoft.ML.Models { @@ -18,7 +19,7 @@ private ClassificationMetrics() { } - internal static List FromMetrics(IHostEnvironment env, IDataView overallMetrics, IDataView confusionMatrix, + internal static List FromMetrics(IHostEnvironment env, IDataView overallMetrics, IDataView confusionMatrix, int confusionMatriceStartIndex = 0) { Contracts.AssertValue(env); @@ -34,14 +35,14 @@ internal static List FromMetrics(IHostEnvironment env, ID List metrics = new List(); var confusionMatrices = ConfusionMatrix.Create(env, confusionMatrix).GetEnumerator(); - int Index = 0; + int index = 0; foreach (var metric in metricsEnumerable) { - if (Index++ >= confusionMatriceStartIndex && !confusionMatrices.MoveNext()) + if (index++ >= confusionMatriceStartIndex && !confusionMatrices.MoveNext()) { throw env.Except("Confusion matrices didn't have enough matrices."); } - + metrics.Add( new ClassificationMetrics() { @@ -51,7 +52,8 @@ internal static List FromMetrics(IHostEnvironment env, ID LogLossReduction = metric.LogLossReduction, TopKAccuracy = metric.TopKAccuracy, PerClassLogLoss = metric.PerClassLogLoss, - ConfusionMatrix = confusionMatrices.Current + ConfusionMatrix = confusionMatrices.Current, + RowTag = metric.RowTag, }); } @@ -64,7 +66,7 @@ internal static List FromMetrics(IHostEnvironment env, ID /// /// /// The micro-average is the fraction of instances predicted correctly. - /// + /// /// The micro-average metric weighs each class according to the number of instances that belong /// to it in the dataset. /// @@ -77,7 +79,7 @@ internal static List FromMetrics(IHostEnvironment env, ID /// The macro-average is computed by taking the average over all the classes of the fraction /// of correct predictions in this class (the number of correctly predicted instances in the class, /// divided by the total number of instances in the class). - /// + /// /// The macro-average metric gives the same weight to each class, no matter how many instances from /// that class the dataset contains. /// @@ -127,6 +129,12 @@ internal static List FromMetrics(IHostEnvironment env, ID /// public double[] PerClassLogLoss { get; private set; } + /// + /// For cross-validation, this is equal to "Fold N" for per-fold metric rows, "Overall" for the average metrics and "STD" for standard deviation. + /// For non-CV scenarios, this is equal to null + /// + public string RowTag { get; private set; } + /// /// Gets the confusion matrix, or error matrix, of the classifier. /// @@ -155,6 +163,9 @@ private sealed class SerializationClass [ColumnName(MultiClassClassifierEvaluator.PerClassLogLoss)] public double[] PerClassLogLoss; + + [ColumnName(ColumnNames.FoldIndex)] + public string RowTag; #pragma warning restore 649 // never assigned } } diff --git a/src/Microsoft.ML/Models/ClusterMetrics.cs b/src/Microsoft.ML/Models/ClusterMetrics.cs index 7f88784ef8..83770389cd 100644 --- a/src/Microsoft.ML/Models/ClusterMetrics.cs +++ b/src/Microsoft.ML/Models/ClusterMetrics.cs @@ -7,6 +7,7 @@ using Microsoft.ML.Runtime.Data; using System; using System.Collections.Generic; +using static Microsoft.ML.Runtime.Data.MetricKinds; namespace Microsoft.ML.Models { @@ -38,6 +39,7 @@ internal static List FromOverallMetrics(IHostEnvironment env, ID AvgMinScore = metric.AvgMinScore, Nmi = metric.Nmi, Dbi = metric.Dbi, + RowTag = metric.RowTag, }); } @@ -57,7 +59,7 @@ internal static List FromOverallMetrics(IHostEnvironment env, ID /// /// /// NMI is a measure of the mutual dependence between the true and predicted cluster labels for instances in the dataset. - /// NMI ranges between 0 and 1 where "0" indicates clustering is random and "1" indicates clustering is perfect w.r.t true labels. + /// NMI ranges between 0 and 1 where "0" indicates clustering is random and "1" indicates clustering is perfect w.r.t true labels. /// public double Nmi { get; private set; } @@ -66,13 +68,19 @@ internal static List FromOverallMetrics(IHostEnvironment env, ID /// /// /// AvgMinScore is the average squared-distance of examples from the respective cluster centroids. - /// It is defined as + /// It is defined as /// AvgMinScore = (1/m) * sum ((xi - c(xi))^2) /// where m is the number of instances in the dataset. /// xi is the i'th instance and c(xi) is the centriod of the predicted cluster for xi. /// public double AvgMinScore { get; private set; } + /// + /// For cross-validation, this is equal to "Fold N" for per-fold metric rows, "Overall" for the average metrics and "STD" for standard deviation. + /// For non-CV scenarios, this is equal to null + /// + public string RowTag { get; private set; } + /// /// This class contains the public fields necessary to deserialize from IDataView. /// @@ -88,6 +96,8 @@ private sealed class SerializationClass [ColumnName(Runtime.Data.ClusteringEvaluator.AvgMinScore)] public Double AvgMinScore; + [ColumnName(ColumnNames.FoldIndex)] + public string RowTag; #pragma warning restore 649 // never assigned } } diff --git a/src/Microsoft.ML/Models/ConfusionMatrix.cs b/src/Microsoft.ML/Models/ConfusionMatrix.cs index 72aa5061dc..9abcd2af9c 100644 --- a/src/Microsoft.ML/Models/ConfusionMatrix.cs +++ b/src/Microsoft.ML/Models/ConfusionMatrix.cs @@ -48,7 +48,7 @@ internal static List Create(IHostEnvironment env, IDataView con if (!confusionMatrix.Schema.TryGetColumnIndex(MetricKinds.ColumnNames.Count, out int countColumn)) { - env.Except($"ConfusionMatrix data view did not contain a {nameof(MetricKinds.ColumnNames.Count)} column."); + throw env.Except($"ConfusionMatrix data view did not contain a {nameof(MetricKinds.ColumnNames.Count)} column."); } IRowCursor cursor = confusionMatrix.GetRowCursor(col => col == countColumn); @@ -65,7 +65,7 @@ internal static List Create(IHostEnvironment env, IDataView con ValueGetter> countGetter = cursor.GetGetter>(countColumn); VBuffer countValues = default; List confusionMatrices = new List(); - + int valuesRowIndex = 0; double[,] elements = null; while (cursor.MoveNext()) diff --git a/src/Microsoft.ML/Models/CrossValidator.cs b/src/Microsoft.ML/Models/CrossValidator.cs index ab84f8a715..c34e2da13b 100644 --- a/src/Microsoft.ML/Models/CrossValidator.cs +++ b/src/Microsoft.ML/Models/CrossValidator.cs @@ -1,4 +1,8 @@ -using Microsoft.ML.Runtime; +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime; using Microsoft.ML.Runtime.Api; using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.EntryPoints; @@ -183,7 +187,7 @@ public class CrossValidationOutput public List ClusterMetrics; public PredictionModel[] PredictorModels; - //REVIEW: Add warnings and per instance results and implement + //REVIEW: Add warnings and per instance results and implement //metrics for ranking, clustering and anomaly detection. } } diff --git a/src/Microsoft.ML/Models/OneVersusAll.cs b/src/Microsoft.ML/Models/OneVersusAll.cs new file mode 100644 index 0000000000..c5b20c8550 --- /dev/null +++ b/src/Microsoft.ML/Models/OneVersusAll.cs @@ -0,0 +1,90 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using static Microsoft.ML.Runtime.EntryPoints.CommonInputs; + +namespace Microsoft.ML.Models +{ + public sealed partial class OneVersusAll + { + /// + /// One-versus-all, OvA, learner (also known as One-vs.-rest, "OvR") is a multi-class learner + /// with the strategy to fit one binary classifier per class in the dataset. + /// It trains the provided binary classifier for each class against the other classes, where the current + /// class is treated as the positive labels and examples in other classes are treated as the negative classes. + /// See wikipedia page. + /// + /// + /// In order to use it all you need to do is add it to pipeline as regular learner: + /// + /// pipeline.Add(OneVersusAll.With(new StochasticDualCoordinateAscentBinaryClassifier())); + /// + /// + /// The base trainer must be a binary classifier. To check the available binary classifiers, type BinaryClassifiers, + /// and look at the available binary learners as suggested by IntelliSense. + /// + /// Underlying binary trainer + /// "Use probabilities (vs. raw outputs) to identify top-score category. + /// By specifying it to false, you can tell One-versus-all to not use the probabilities but instead + /// the raw uncalibrated scores from each predictor. This is generally not recommended, since these quantities + /// are not meant to be comparable from one predictor to another, unlike calibrated probabilities. + public static ILearningPipelineItem With(ITrainerInputWithLabel trainer, bool useProbabilities = true) + { + return new OvaPipelineItem(trainer, useProbabilities); + } + + private class OvaPipelineItem : ILearningPipelineItem + { + private Var _data; + private ITrainerInputWithLabel _trainer; + private bool _useProbabilities; + + public OvaPipelineItem(ITrainerInputWithLabel trainer, bool useProbabilities) + { + _trainer = trainer; + _useProbabilities = useProbabilities; + } + + public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment) + { + using (var env = new TlcEnvironment()) + { + var subgraph = env.CreateExperiment(); + subgraph.Add(_trainer); + var ova = new OneVersusAll(); + if (previousStep != null) + { + if (!(previousStep is ILearningPipelineDataStep dataStep)) + { + throw new InvalidOperationException($"{ nameof(OneVersusAll)} only supports an { nameof(ILearningPipelineDataStep)} as an input."); + } + + _data = dataStep.Data; + ova.TrainingData = dataStep.Data; + ova.UseProbabilities = _useProbabilities; + ova.Nodes = subgraph; + } + Output output = experiment.Add(ova); + return new OvaPipelineStep(output); + } + } + + public Var GetInputData() => _data; + } + + private class OvaPipelineStep : ILearningPipelinePredictorStep + { + public OvaPipelineStep(Output output) + { + Model = output.PredictorModel; + } + + public Var Model { get; } + } + } +} diff --git a/src/Microsoft.ML/Models/OnnxConverter.cs b/src/Microsoft.ML/Models/OnnxConverter.cs index 4bd4a03bc0..c2b8e2b5c1 100644 --- a/src/Microsoft.ML/Models/OnnxConverter.cs +++ b/src/Microsoft.ML/Models/OnnxConverter.cs @@ -10,7 +10,53 @@ namespace Microsoft.ML.Models public sealed partial class OnnxConverter { /// - /// Converts the model to ONNX format. + /// ONNX is an intermediate representation format + /// for machine learning models. It is used to make models portable such that you can + /// train a model using a toolkit and run it in another tookit's runtime, for example, + /// you can create a model using ML.NET, export it to an ONNX-ML model file, + /// then load and run that ONNX-ML model in Windows ML, on an UWP Windows 10 app. + /// + /// This API converts an ML.NET model to ONNX-ML format by inspecting the transform pipeline + /// from the end, checking for components that know how to save themselves as ONNX. + /// The first item in the transform pipeline that does not know how to save itself + /// as ONNX, is considered the "input" to the ONNX pipeline. (Ideally this would be the + /// original loader itself, but this may not be possible if the user used unsavable + /// transforms in defining the pipe.) All the columns in the source that are a type the + /// ONNX knows how to deal with will be tracked. Intermediate transformations of the + /// data appearing as new columns will appear in the output block of the ONNX, with names + /// derived from the corresponding column names. The ONNX JSON will be serialized to a + /// path defined through the Json option. + /// + /// This API supports the following arguments: + /// indicates the file to write the ONNX protocol buffer file to. This is optional. + /// indicates the file to write the JSON representation of the ONNX model. This is optional. + /// indicates the name property in the ONNX model. If left unspecified, it will + /// be the extension-less name of the file specified in the onnx indicates the protocol buffer file + /// to write the ONNX representation to. + /// indicates the domain name of the model. ONNX uses reverse domain name space indicators. + /// For example com.microsoft.cognitiveservices. This is a required field. + /// is a string array of input column names to omit from the input mapping. + /// A common scenario might be to drop the label column, for instance, since it may not be practically + /// useful for the pipeline. Note that any columns depending on these naturally cannot be saved. + /// is similar, except for the output schema. Note that the pipeline handler + /// is currently not intelligent enough to drop intermediate calculations that produce this value: this will + /// merely omit that value from the actual output. + /// + /// Transforms that can be exported to ONNX + /// 1. Concat + /// 2. KeyToVector + /// 3. NAReplace + /// 4. Normalize + /// 5. Term + /// 6. Categorical + /// + /// Learners that can be exported to ONNX + /// 1. FastTree + /// 2. LightGBM + /// 3. Logistic Regression + /// + /// See + /// for an example on how to train a model and then convert that model to ONNX. /// /// Model that needs to be converted to ONNX format. public void Convert(PredictionModel model) diff --git a/src/Microsoft.ML/Models/RegressionEvaluator.cs b/src/Microsoft.ML/Models/RegressionEvaluator.cs index 2cb05ee092..5425c4d91d 100644 --- a/src/Microsoft.ML/Models/RegressionEvaluator.cs +++ b/src/Microsoft.ML/Models/RegressionEvaluator.cs @@ -59,10 +59,11 @@ public RegressionMetrics Evaluate(PredictionModel model, ILearningPipelineLoader { throw environment.Except($"Could not find OverallMetrics in the results returned in {nameof(RegressionEvaluator)} Evaluate."); } - + var metric = RegressionMetrics.FromOverallMetrics(environment, overallMetrics); - Contracts.Assert(metric.Count == 1, $"Exactly one metric set was expected but found {metric.Count} metrics"); + if (metric.Count != 1) + throw environment.Except($"Exactly one metric set was expected but found {metric.Count} metrics"); return metric[0]; } diff --git a/src/Microsoft.ML/Models/RegressionMetrics.cs b/src/Microsoft.ML/Models/RegressionMetrics.cs index 64500f5e6c..bf5ba625f6 100644 --- a/src/Microsoft.ML/Models/RegressionMetrics.cs +++ b/src/Microsoft.ML/Models/RegressionMetrics.cs @@ -7,6 +7,7 @@ using Microsoft.ML.Runtime.Data; using System; using System.Collections.Generic; +using static Microsoft.ML.Runtime.Data.MetricKinds; namespace Microsoft.ML.Models { @@ -40,6 +41,7 @@ internal static List FromOverallMetrics(IHostEnvironment env, Rms = metric.Rms, LossFn = metric.LossFn, RSquared = metric.RSquared, + RowTag = metric.RowTag, }); } @@ -90,6 +92,12 @@ internal static List FromOverallMetrics(IHostEnvironment env, /// public double RSquared { get; private set; } + /// + /// For cross-validation, this is equal to "Fold N" for per-fold metric rows, "Overall" for the average metrics and "STD" for standard deviation. + /// For non-CV scenarios, this is equal to null + /// + public string RowTag { get; private set; } + /// /// This class contains the public fields necessary to deserialize from IDataView. /// @@ -110,6 +118,9 @@ private sealed class SerializationClass [ColumnName(Runtime.Data.RegressionEvaluator.RSquared)] public Double RSquared; + + [ColumnName(ColumnNames.FoldIndex)] + public string RowTag; #pragma warning restore 649 // never assigned } } diff --git a/src/Microsoft.ML/Models/TrainTestEvaluator.cs b/src/Microsoft.ML/Models/TrainTestEvaluator.cs index ae00a34de6..9e3abbc169 100644 --- a/src/Microsoft.ML/Models/TrainTestEvaluator.cs +++ b/src/Microsoft.ML/Models/TrainTestEvaluator.cs @@ -1,4 +1,8 @@ -using Microsoft.ML.Runtime; +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime; using Microsoft.ML.Runtime.Api; using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.EntryPoints; @@ -18,7 +22,7 @@ public sealed partial class TrainTestEvaluator /// /// Class type that represents input schema. /// Class type that represents prediction schema. - /// Machine learning pipeline that contains , + /// Machine learning pipeline that contains , /// transforms and at least one trainer. /// that represents the test dataset. /// Metrics and predictor model. @@ -110,7 +114,7 @@ public TrainTestEvaluatorOutput TrainTestEvaluate TrainTestEvaluate TrainTestEvaluate predictor; using (var memoryStream = new MemoryStream()) { @@ -180,7 +184,7 @@ public class TrainTestEvaluatorOutput public ClusterMetrics ClusterMetrics; public PredictionModel PredictorModels; - //REVIEW: Add warnings and per instance results and implement + //REVIEW: Add warnings and per instance results and implement //metrics for ranking, clustering and anomaly detection. } } diff --git a/src/Microsoft.ML/PredictionModel.cs b/src/Microsoft.ML/PredictionModel.cs index c1dded82b8..e11efa9487 100644 --- a/src/Microsoft.ML/PredictionModel.cs +++ b/src/Microsoft.ML/PredictionModel.cs @@ -31,7 +31,7 @@ internal TransformModel PredictorModel } /// - /// Returns labels that correspond to indices of the score array in the case of + /// Returns labels that correspond to indices of the score array in the case of /// multi-class classification problem. /// /// Label to score mapping diff --git a/src/Microsoft.ML/Runtime/EntryPoints/CVSplit.cs b/src/Microsoft.ML/Runtime/EntryPoints/CVSplit.cs index 79c0c5957e..347fb80e7d 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/CVSplit.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/CVSplit.cs @@ -12,7 +12,7 @@ namespace Microsoft.ML.Runtime.EntryPoints { /// - /// The module that splits the input dataset into the specified number of cross-validation folds, and outputs the 'training' + /// The module that splits the input dataset into the specified number of cross-validation folds, and outputs the 'training' /// and 'testing' portion of the input for each fold. /// public static class CVSplit diff --git a/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationBinaryMacro.cs b/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationBinaryMacro.cs index cdf52cf076..1b022aaea9 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationBinaryMacro.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationBinaryMacro.cs @@ -48,12 +48,12 @@ public sealed class Arguments [Argument(ArgumentType.Required, HelpText = "The training subgraph", SortOrder = 3)] public JArray Nodes; - // This is the subgraph input, that shows that the subgraph should only require one + // This is the subgraph input, that shows that the subgraph should only require one // IDataView as input and indicates the variable name (in the subgraph) for it. [Argument(ArgumentType.Required, HelpText = "The training subgraph inputs", SortOrder = 4)] public SubGraphInput Inputs = new SubGraphInput(); - // This is the subgraph output, that shows that the subgraph should produce one + // This is the subgraph output, that shows that the subgraph should produce one // IPredictorModel as output and indicates the variable name (in the subgraph) for it. [Argument(ArgumentType.Required, HelpText = "The training subgraph outputs", SortOrder = 5)] public SubGraphOutput Outputs = new SubGraphOutput(); diff --git a/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationMacro.cs b/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationMacro.cs index e711b87117..eb034fe3c2 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationMacro.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/CrossValidationMacro.cs @@ -54,23 +54,23 @@ public sealed class Arguments [Argument(ArgumentType.Required, HelpText = "The training subgraph", SortOrder = 3)] public JArray Nodes; - // This is the subgraph input, that shows that the subgraph should only require one + // This is the subgraph input, that shows that the subgraph should only require one // IDataView as input and indicates the variable name (in the subgraph) for it. [Argument(ArgumentType.Required, HelpText = "The training subgraph inputs", SortOrder = 4)] public SubGraphInput Inputs = new SubGraphInput(); - // This is the subgraph output, that shows that the subgraph should produce one + // This is the subgraph output, that shows that the subgraph should produce one // IPredictorModel as output and indicates the variable name (in the subgraph) for it. [Argument(ArgumentType.Required, HelpText = "The training subgraph outputs", SortOrder = 5)] public SubGraphOutput Outputs = new SubGraphOutput(); // For splitting the data into folds, this column is used for grouping rows and makes sure // that a group of rows is not split among folds. - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for stratification", ShortName = "strat", SortOrder = 6)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for stratification", ShortName = "strat", SortOrder = 6)] public string StratificationColumn; // The number of folds to generate. - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Number of folds in k-fold cross-validation", ShortName = "k", SortOrder = 7)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Number of folds in k-fold cross-validation", ShortName = "k", SortOrder = 7)] public int NumFolds = 2; // REVIEW: suggest moving to subcomponents for evaluators, to allow for different parameters on the evaluators @@ -78,14 +78,17 @@ public sealed class Arguments [Argument(ArgumentType.Required, HelpText = "Specifies the trainer kind, which determines the evaluator to be used.", SortOrder = 8)] public MacroUtils.TrainerKinds Kind = MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer; - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for labels", ShortName = "lab", SortOrder = 10)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for labels", ShortName = "lab", SortOrder = 9)] public string LabelColumn = DefaultColumnNames.Label; - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for example weight", ShortName = "weight", SortOrder = 11)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for example weight", ShortName = "weight", SortOrder = 10)] public Optional WeightColumn = Optional.Implicit(DefaultColumnNames.Weight); - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for grouping", ShortName = "group", SortOrder = 12)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for grouping", ShortName = "group", SortOrder = 11)] public Optional GroupColumn = Optional.Implicit(DefaultColumnNames.GroupId); + + [Argument(ArgumentType.AtMostOnce, HelpText = "Name column name", ShortName = "name", SortOrder = 12)] + public Optional NameColumn = Optional.Implicit(DefaultColumnNames.Name); } // REVIEW: This output would be much better as an array of CommonOutputs.ClassificationEvaluateOutput, @@ -127,16 +130,19 @@ public sealed class CombineMetricsInput [Argument(ArgumentType.Multiple, HelpText = "Warning datasets", SortOrder = 4)] public IDataView[] Warnings; - [Argument(ArgumentType.AtMostOnce, HelpText = "The label column name", ShortName = "Label", SortOrder = 5)] + [Argument(ArgumentType.AtMostOnce, HelpText = "The label column name", ShortName = "Label", SortOrder = 6)] public string LabelColumn = DefaultColumnNames.Label; - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for example weight", ShortName = "weight", SortOrder = 6)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for example weight", ShortName = "weight", SortOrder = 7)] public Optional WeightColumn = Optional.Implicit(DefaultColumnNames.Weight); - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for grouping", ShortName = "group", SortOrder = 12)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for grouping", ShortName = "group", SortOrder = 8)] public Optional GroupColumn = Optional.Implicit(DefaultColumnNames.GroupId); - [Argument(ArgumentType.Required, HelpText = "Specifies the trainer kind, which determines the evaluator to be used.", SortOrder = 6)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Name column name", ShortName = "name", SortOrder = 9)] + public Optional NameColumn = Optional.Implicit(DefaultColumnNames.Name); + + [Argument(ArgumentType.Required, HelpText = "Specifies the trainer kind, which determines the evaluator to be used.", SortOrder = 5)] public MacroUtils.TrainerKinds Kind = MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer; } @@ -166,7 +172,7 @@ public static CommonOutputs.MacroOutput CrossValidate( // This will be the final resulting list of nodes that is returned from the macro. var subGraphNodes = new List(); - //the input transform model + //the input transform model VariableBinding transformModelVarName = null; if (input.TransformModel != null) transformModelVarName = node.GetInputVariable(nameof(input.TransformModel)); @@ -206,7 +212,8 @@ public static CommonOutputs.MacroOutput CrossValidate( TransformModel = null, LabelColumn = input.LabelColumn, GroupColumn = input.GroupColumn, - WeightColumn = input.WeightColumn + WeightColumn = input.WeightColumn, + NameColumn = input.NameColumn }; if (transformModelVarName != null) @@ -377,10 +384,15 @@ public static CommonOutputs.MacroOutput CrossValidate( combineArgs.LabelColumn = input.LabelColumn; combineArgs.WeightColumn = input.WeightColumn; combineArgs.GroupColumn = input.GroupColumn; + combineArgs.NameColumn = input.NameColumn; // Set the input bindings for the CombineMetrics entry point. var combineInputBindingMap = new Dictionary>(); var combineInputMap = new Dictionary(); + + var warningsArray = new SimpleParameterBinding(nameof(combineArgs.Warnings)); + combineInputBindingMap.Add(nameof(combineArgs.Warnings), new List { warningsArray }); + combineInputMap.Add(warningsArray, new SimpleVariableBinding(warningsOutput.OutputData.VarName)); var overallArray = new SimpleParameterBinding(nameof(combineArgs.OverallMetrics)); combineInputBindingMap.Add(nameof(combineArgs.OverallMetrics), new List { overallArray }); combineInputMap.Add(overallArray, new SimpleVariableBinding(overallMetricsOutput.OutputData.VarName)); @@ -421,12 +433,11 @@ public static CombinedOutput CombineMetrics(IHostEnvironment env, CombineMetrics var eval = GetEvaluator(env, input.Kind); var perInst = EvaluateUtils.ConcatenatePerInstanceDataViews(env, eval, true, true, input.PerInstanceMetrics.Select( - idv => RoleMappedData.CreateOpt(idv, new[] - { - RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Label, input.LabelColumn), - RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Weight, input.WeightColumn.Value), - RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Group, input.GroupColumn.Value) - })).ToArray(), + idv => new RoleMappedData(idv, opt: true, + RoleMappedSchema.ColumnRole.Label.Bind(input.LabelColumn), + RoleMappedSchema.ColumnRole.Weight.Bind(input.WeightColumn.Value), + RoleMappedSchema.ColumnRole.Group.Bind(input.GroupColumn), + RoleMappedSchema.ColumnRole.Name.Bind(input.NameColumn.Value))).ToArray(), out var variableSizeVectorColumnNames); var warnings = input.Warnings != null ? new List(input.Warnings) : new List(); diff --git a/src/Microsoft.ML/Runtime/EntryPoints/FeatureCombiner.cs b/src/Microsoft.ML/Runtime/EntryPoints/FeatureCombiner.cs index b26960c561..6502fc2afa 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/FeatureCombiner.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/FeatureCombiner.cs @@ -22,7 +22,7 @@ public sealed class FeatureCombinerInput : TransformInputBase [Argument(ArgumentType.Multiple, HelpText = "Features", SortOrder = 2)] public string[] Features; - public IEnumerable> GetRoles() + internal IEnumerable> GetRoles() { if (Utils.Size(Features) > 0) { @@ -49,7 +49,7 @@ public static CommonOutputs.TransformOutput PrepareFeatures(IHostEnvironment env using (var ch = host.Start(featureCombiner)) { var viewTrain = input.Data; - var rms = RoleMappedSchema.Create(viewTrain.Schema, input.GetRoles()); + var rms = new RoleMappedSchema(viewTrain.Schema, input.GetRoles()); var feats = rms.GetColumns(RoleMappedSchema.ColumnRole.Feature); if (Utils.Size(feats) == 0) throw ch.Except("No feature columns specified"); diff --git a/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/GraphRunner.cs b/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/GraphRunner.cs index d29b6f10d2..f6349083af 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/GraphRunner.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/GraphRunner.cs @@ -13,7 +13,7 @@ namespace Microsoft.ML.Runtime.EntryPoints.JsonUtils /// The entry point graph is provided as a of graph nodes. The inputs need to be provided separately: /// the graph runner will only compile a list of required inputs, and the calling code is expected to set them prior /// to running the graph. - /// + /// /// REVIEW: currently, the graph is executed synchronously, one node at a time. This is an implementation choice, we /// probably need to consider parallel asynchronous execution, once we agree on an acceptable syntax for it. /// diff --git a/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/JsonManifestUtils.cs b/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/JsonManifestUtils.cs index 289adc6f75..db1ca0968e 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/JsonManifestUtils.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/JsonUtils/JsonManifestUtils.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Reflection; using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Internal.Tools; using Microsoft.ML.Runtime.Internal.Utilities; using Newtonsoft.Json.Linq; @@ -67,13 +68,7 @@ public static JObject BuildAllManifests(IExceptionContext ectx, ModuleCatalog ca { var jField = new JObject(); jField[FieldNames.Name] = fieldInfo.Name; - var type = fieldInfo.PropertyType; - // Dive inside Optional. - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - type = type.GetGenericArguments()[0]; - // Dive inside Nullable. - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - type = type.GetGenericArguments()[0]; + var type = CSharpGeneratorUtils.ExtractOptionalOrNullableType(fieldInfo.PropertyType); // Dive inside Var. if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Var<>)) type = type.GetGenericArguments()[0]; @@ -308,14 +303,7 @@ private static JToken BuildTypeToken(IExceptionContext ectx, FieldInfo fieldInfo jo[FieldNames.ItemType] = typeString; return jo; } - - // Dive inside Optional. - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - type = type.GetGenericArguments()[0]; - - // Dive inside Nullable. - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - type = type.GetGenericArguments()[0]; + type = CSharpGeneratorUtils.ExtractOptionalOrNullableType(type); // Dive inside Var. if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Var<>)) @@ -356,7 +344,7 @@ private static JToken BuildTypeToken(IExceptionContext ectx, FieldInfo fieldInfo case TlcModule.DataKind.Enum: jo = new JObject(); jo[FieldNames.Kind] = typeEnum.ToString(); - var values = Enum.GetNames(type); + var values = Enum.GetNames(type).Where(n => type.GetField(n).GetCustomAttribute() == null); jo[FieldNames.Values] = new JArray(values); return jo; case TlcModule.DataKind.Array: @@ -445,7 +433,7 @@ private static JToken BuildValueToken(IExceptionContext ectx, object value, Type /// /// Build a token for component default value. This will look up the component in the catalog, and if it finds an entry, it will /// build a JSON structure that would be parsed into the default value. - /// + /// /// This is an inherently fragile setup in case when the factory is not trivial, but it will work well for 'property bag' factories /// that we are currently using. /// @@ -474,7 +462,7 @@ private static JToken BuildComponentToken(IExceptionContext ectx, IComponentFact } catch (MissingMemberException ex) { - // There was no default constructor found. + // There was no default constructor found. // This should never happen, since ModuleCatalog would error out if there is no default ctor. ectx.Assert(false); throw ectx.Except(ex, "Couldn't find default constructor"); diff --git a/src/Microsoft.ML/Runtime/EntryPoints/OneVersusAllMacro.cs b/src/Microsoft.ML/Runtime/EntryPoints/OneVersusAllMacro.cs index c95f384ad6..3da05f1fbf 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/OneVersusAllMacro.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/OneVersusAllMacro.cs @@ -55,13 +55,13 @@ private static Tuple, Var> ProcessClass(IH ClassIndex = k, Column = new[] { - new ML.Transforms.LabelIndicatorTransformColumn - { - ClassIndex = k, - Name = label, - Source = label - } - }, + new ML.Transforms.LabelIndicatorTransformColumn + { + ClassIndex = k, + Name = label, + Source = label + } + }, Data = { VarName = node.GetInputVariable(nameof(input.TrainingData)).ToJson() } }; var exp = new Experiment(env); @@ -128,14 +128,16 @@ private static int GetNumberOfClasses(IHostEnvironment env, Arguments input, out input.WeightColumn, DefaultColumnNames.Weight); // Get number of classes - var data = TrainUtils.CreateExamples(input.TrainingData, label, feature, null, weight); + var data = new RoleMappedData(input.TrainingData, label, feature, null, weight); data.CheckMultiClassLabel(out var numClasses); return numClasses; } } - [TlcModule.EntryPoint(Desc = "One-vs-All macro (OVA)", Name = "Models.OneVersusAll")] - public static CommonOutputs.MacroOutput OVA( + [TlcModule.EntryPoint(Desc = "One-vs-All macro (OVA)", + Name = "Models.OneVersusAll", + XmlInclude = new[] { @"" })] + public static CommonOutputs.MacroOutput OneVersusAll( IHostEnvironment env, Arguments input, EntryPointNode node) @@ -158,7 +160,7 @@ public static CommonOutputs.MacroOutput OVA( macroNodes.AddRange(result.Item1); } - // Use OVA model combiner to combine these models into one. + // Use OVA model combiner to combine these models into one. // Takes in array of models that are binary predictor models and // produces single multiclass predictor model. var macroExperiment = new Experiment(env); diff --git a/src/Microsoft.ML/Runtime/EntryPoints/TrainTestMacro.cs b/src/Microsoft.ML/Runtime/EntryPoints/TrainTestMacro.cs index 3e2ba94615..30a2ee8c4f 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/TrainTestMacro.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/TrainTestMacro.cs @@ -63,14 +63,17 @@ public sealed class Arguments [Argument(ArgumentType.AtMostOnce, HelpText = "Indicates whether to include and output training dataset metrics.", SortOrder = 9)] public Boolean IncludeTrainingMetrics = false; - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for labels", ShortName = "lab", SortOrder = 10)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for labels", ShortName = "lab", SortOrder = 10)] public string LabelColumn = DefaultColumnNames.Label; - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for example weight", ShortName = "weight", SortOrder = 11)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for example weight", ShortName = "weight", SortOrder = 11)] public Optional WeightColumn = Optional.Implicit(DefaultColumnNames.Weight); - [Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for grouping", ShortName = "group", SortOrder = 12)] + [Argument(ArgumentType.AtMostOnce, HelpText = "Column to use for grouping", ShortName = "group", SortOrder = 12)] public Optional GroupColumn = Optional.Implicit(DefaultColumnNames.GroupId); + + [Argument(ArgumentType.AtMostOnce, HelpText = "Name column name", ShortName = "name", SortOrder = 13)] + public Optional NameColumn = Optional.Implicit(DefaultColumnNames.Name); } public sealed class Output @@ -120,7 +123,9 @@ public static CommonOutputs.MacroOutput TrainTest( // Parse the subgraph. var subGraphRunContext = new RunContext(env); var subGraphNodes = EntryPointNode.ValidateNodes(env, subGraphRunContext, input.Nodes, node.Catalog, input.LabelColumn, - input.GroupColumn.IsExplicit ? input.GroupColumn.Value : null, input.WeightColumn.IsExplicit ? input.WeightColumn.Value : null); + input.GroupColumn.IsExplicit ? input.GroupColumn.Value : null, + input.WeightColumn.IsExplicit ? input.WeightColumn.Value : null, + input.NameColumn.IsExplicit ? input.NameColumn.Value : null); // Change the subgraph to use the training data as input. var varName = input.Inputs.Data.VarName; @@ -216,13 +221,13 @@ public static CommonOutputs.MacroOutput TrainTest( // Do not double-add previous nodes. exp.Reset(); - // REVIEW: add similar support for NameColumn and FeatureColumn. var settings = new MacroUtils.EvaluatorSettings { LabelColumn = input.LabelColumn, WeightColumn = input.WeightColumn.IsExplicit ? input.WeightColumn.Value : null, - GroupColumn = input.GroupColumn.IsExplicit ? input.GroupColumn.Value : null + GroupColumn = input.GroupColumn.IsExplicit ? input.GroupColumn.Value : null, + NameColumn = input.NameColumn.IsExplicit ? input.NameColumn.Value : null }; string outVariableName; @@ -300,7 +305,7 @@ public static CommonOutputs.MacroOutput TrainTest( exp.Add(evalNode, evalOutput); subGraphNodes.AddRange(EntryPointNode.ValidateNodes(env, node.Context, exp.GetNodes(), node.Catalog)); - // Marks as an atomic unit that can be run in + // Marks as an atomic unit that can be run in // a distributed fashion. foreach (var subGraphNode in subGraphNodes) subGraphNode.StageId = input.PipelineId; diff --git a/src/Microsoft.ML/Runtime/EntryPoints/TrainTestSplit.cs b/src/Microsoft.ML/Runtime/EntryPoints/TrainTestSplit.cs index 40909ad108..5cea768127 100644 --- a/src/Microsoft.ML/Runtime/EntryPoints/TrainTestSplit.cs +++ b/src/Microsoft.ML/Runtime/EntryPoints/TrainTestSplit.cs @@ -77,7 +77,7 @@ public static string CreateStratificationColumn(IHost host, ref IDataView data, int j = 0; while (data.Schema.TryGetColumnIndex(stratCol, out col)) stratCol = string.Format("{0}_{1:000}", stratColName, j++); - // Construct the stratification column. If user-provided stratification column exists, use HashJoin + // Construct the stratification column. If user-provided stratification column exists, use HashJoin // of it to construct the strat column, otherwise generate a random number and use it. if (stratificationColumn == null) { diff --git a/src/Microsoft.ML/Runtime/Internal/Tools/CSharpApiGenerator.cs b/src/Microsoft.ML/Runtime/Internal/Tools/CSharpApiGenerator.cs index 234c87fade..ba130c96e3 100644 --- a/src/Microsoft.ML/Runtime/Internal/Tools/CSharpApiGenerator.cs +++ b/src/Microsoft.ML/Runtime/Internal/Tools/CSharpApiGenerator.cs @@ -3,11 +3,10 @@ // See the LICENSE file in the project root for more information. using System; -using System.CodeDom; using System.Collections.Generic; using System.IO; using System.Linq; -using Microsoft.CSharp; +using System.Reflection; using Microsoft.ML.Runtime; using Microsoft.ML.Runtime.CommandLine; using Microsoft.ML.Runtime.Data; @@ -34,381 +33,13 @@ public sealed class Arguments public string[] Exclude; } - private static class GeneratorUtils - { - public static string GetFullMethodName(ModuleCatalog.EntryPointInfo entryPointInfo) - { - return entryPointInfo.Name; - } - - public static Tuple GetClassAndMethodNames(ModuleCatalog.EntryPointInfo entryPointInfo) - { - var split = entryPointInfo.Name.Split('.'); - Contracts.Assert(split.Length == 2); - return new Tuple(split[0], split[1]); - } - - public static string GetCSharpTypeName(Type type) - { - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - return GetCSharpTypeName(type.GetGenericArguments()[0]) + "?"; - - string name; - using (var p = new CSharpCodeProvider()) - name = p.GetTypeOutput(new CodeTypeReference(type)); - return name; - } - - public static string GetOutputType(Type outputType) - { - Contracts.Check(Var.CheckType(outputType)); - - if (outputType.IsArray) - return $"ArrayVar<{GetCSharpTypeName(outputType.GetElementType())}>"; - if (outputType.IsGenericType && outputType.GetGenericTypeDefinition() == typeof(Dictionary<,>) - && outputType.GetGenericTypeArgumentsEx()[0] == typeof(string)) - { - return $"DictionaryVar<{GetCSharpTypeName(outputType.GetGenericTypeArgumentsEx()[1])}>"; - } - - return $"Var<{GetCSharpTypeName(outputType)}>"; - } - - public static string GetInputType(ModuleCatalog catalog, Type inputType, - Dictionary typesSymbolTable, string rootNameSpace = "") - { - if (inputType.IsGenericType && inputType.GetGenericTypeDefinition() == typeof(Var<>)) - return $"Var<{GetCSharpTypeName(inputType.GetGenericTypeArgumentsEx()[0])}>"; - - if (inputType.IsArray && Var.CheckType(inputType.GetElementType())) - return $"ArrayVar<{GetCSharpTypeName(inputType.GetElementType())}>"; - - if (inputType.IsGenericType && inputType.GetGenericTypeDefinition() == typeof(Dictionary<,>) - && inputType.GetGenericTypeArgumentsEx()[0] == typeof(string)) - { - return $"DictionaryVar<{GetCSharpTypeName(inputType.GetGenericTypeArgumentsEx()[1])}>"; - } - - if (Var.CheckType(inputType)) - return $"Var<{GetCSharpTypeName(inputType)}>"; - - bool isNullable = false; - bool isOptional = false; - var type = inputType; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = type.GetGenericArguments()[0]; - isNullable = true; - } - else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - { - type = type.GetGenericArguments()[0]; - isOptional = true; - } - - var typeEnum = TlcModule.GetDataType(type); - switch (typeEnum) - { - case TlcModule.DataKind.Float: - case TlcModule.DataKind.Int: - case TlcModule.DataKind.UInt: - case TlcModule.DataKind.Char: - case TlcModule.DataKind.String: - case TlcModule.DataKind.Bool: - case TlcModule.DataKind.DataView: - case TlcModule.DataKind.TransformModel: - case TlcModule.DataKind.PredictorModel: - case TlcModule.DataKind.FileHandle: - return GetCSharpTypeName(inputType); - case TlcModule.DataKind.Array: - return GetInputType(catalog, inputType.GetElementType(), typesSymbolTable) + "[]"; - case TlcModule.DataKind.Component: - string kind; - bool success = catalog.TryGetComponentKind(type, out kind); - Contracts.Assert(success); - return $"{kind}"; - case TlcModule.DataKind.Enum: - var enumName = GetEnumName(type, typesSymbolTable, rootNameSpace); - if (isNullable) - return $"{enumName}?"; - if (isOptional) - return $"Optional<{enumName}>"; - return $"{enumName}"; - default: - if (isNullable) - return rootNameSpace + typesSymbolTable[type.FullName]; - if (isOptional) - return $"Optional<{rootNameSpace + typesSymbolTable[type.FullName]}>"; - if (typesSymbolTable.ContainsKey(type.FullName)) - return rootNameSpace + typesSymbolTable[type.FullName]; - else - return GetSymbolFromType(typesSymbolTable, type, rootNameSpace); - } - } - - public static bool IsComponent(Type inputType) - { - if (inputType.IsArray && Var.CheckType(inputType.GetElementType())) - return false; - - if (inputType.IsGenericType && inputType.GetGenericTypeDefinition() == typeof(Dictionary<,>) - && inputType.GetGenericTypeArgumentsEx()[0] == typeof(string)) - { - return false; - } - - if (Var.CheckType(inputType)) - return false; - - var type = inputType; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - type = type.GetGenericArguments()[0]; - else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - type = type.GetGenericArguments()[0]; - - var typeEnum = TlcModule.GetDataType(type); - return typeEnum == TlcModule.DataKind.Component; - } - - public static string Capitalize(string s) - { - if (string.IsNullOrEmpty(s)) - return s; - return char.ToUpperInvariant(s[0]) + s.Substring(1); - } - - private static string GetCharAsString(char value) - { - switch (value) - { - case '\t': - return "\\t"; - case '\n': - return "\\n"; - case '\r': - return "\\r"; - case '\\': - return "\\"; - case '\"': - return "\""; - case '\'': - return "\\'"; - case '\0': - return "\\0"; - case '\a': - return "\\a"; - case '\b': - return "\\b"; - case '\f': - return "\\f"; - case '\v': - return "\\v"; - default: - return value.ToString(); - } - } - - public static string GetValue(ModuleCatalog catalog, Type fieldType, object fieldValue, - Dictionary typesSymbolTable, string rootNameSpace = "") - { - if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Var<>)) - return $"new Var<{GetCSharpTypeName(fieldType.GetGenericTypeArgumentsEx()[0])}>()"; - - if (fieldType.IsArray && Var.CheckType(fieldType.GetElementType())) - return $"new ArrayVar<{GetCSharpTypeName(fieldType.GetElementType())}>()"; - - if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Dictionary<,>) - && fieldType.GetGenericTypeArgumentsEx()[0] == typeof(string)) - { - return $"new DictionaryVar<{GetCSharpTypeName(fieldType.GetGenericTypeArgumentsEx()[1])}>()"; - } - - if (Var.CheckType(fieldType)) - return $"new Var<{GetCSharpTypeName(fieldType)}>()"; - - if (fieldValue == null) - return null; - - if (!fieldType.IsInterface) - { - try - { - var defaultFieldValue = Activator.CreateInstance(fieldType); - if (defaultFieldValue == fieldValue) - return null; - } - catch (MissingMethodException) - { - // No parameterless constructor, ignore. - } - } - - var typeEnum = TlcModule.GetDataType(fieldType); - if (fieldType.IsGenericType && (fieldType.GetGenericTypeDefinition() == typeof(Optional<>) || fieldType.GetGenericTypeDefinition() == typeof(Nullable<>))) - fieldType = fieldType.GetGenericArguments()[0]; - switch (typeEnum) - { - case TlcModule.DataKind.Array: - var arr = fieldValue as Array; - if (arr != null && arr.GetLength(0) > 0) - return $"{{ {string.Join(", ", arr.Cast().Select(item => GetValue(catalog, fieldType.GetElementType(), item, typesSymbolTable)))} }}"; - return null; - case TlcModule.DataKind.String: - var strval = fieldValue as string; - if (strval != null) - return Quote(strval); - return null; - case TlcModule.DataKind.Float: - if (fieldValue is double d) - { - if (double.IsPositiveInfinity(d)) - return "double.PositiveInfinity"; - if (double.IsNegativeInfinity(d)) - return "double.NegativeInfinity"; - if (d != 0) - return d.ToString("R") + "d"; - } - else if (fieldValue is float f) - { - if (float.IsPositiveInfinity(f)) - return "float.PositiveInfinity"; - if (float.IsNegativeInfinity(f)) - return "float.NegativeInfinity"; - if (f != 0) - return f.ToString("R") + "f"; - } - return null; - case TlcModule.DataKind.Int: - if (fieldValue is int i) - { - if (i != 0) - return i.ToString(); - } - else if (fieldValue is long l) - { - if (l != 0) - return l.ToString(); - } - return null; - case TlcModule.DataKind.Bool: - return (bool)fieldValue ? "true" : "false"; - case TlcModule.DataKind.Enum: - return GetEnumName(fieldType, typesSymbolTable, rootNameSpace) + "." + fieldValue; - case TlcModule.DataKind.Char: - return $"'{GetCharAsString((char)fieldValue)}'"; - case TlcModule.DataKind.Component: - var type = fieldValue.GetType(); - ModuleCatalog.ComponentInfo componentInfo; - if (!catalog.TryFindComponent(fieldType, type, out componentInfo)) - return null; - object defaultComponent = null; - try - { - defaultComponent = Activator.CreateInstance(componentInfo.ArgumentType); - } - catch (MissingMethodException) - { - // No parameterless constructor, ignore. - } - var propertyBag = new List(); - if (defaultComponent != null) - { - foreach (var fieldInfo in componentInfo.ArgumentType.GetFields()) - { - var inputAttr = fieldInfo.GetCustomAttributes(typeof(ArgumentAttribute), false).FirstOrDefault() as ArgumentAttribute; - if (inputAttr == null || inputAttr.Visibility == ArgumentAttribute.VisibilityType.CmdLineOnly) - continue; - if (fieldInfo.FieldType == typeof(JArray) || fieldInfo.FieldType == typeof(JObject)) - continue; - - var propertyValue = GetValue(catalog, fieldInfo.FieldType, fieldInfo.GetValue(fieldValue), typesSymbolTable); - var defaultPropertyValue = GetValue(catalog, fieldInfo.FieldType, fieldInfo.GetValue(defaultComponent), typesSymbolTable); - if (propertyValue != defaultPropertyValue) - propertyBag.Add($"{GeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name)} = {propertyValue}"); - } - } - var properties = propertyBag.Count > 0 ? $" {{ {string.Join(", ", propertyBag)} }}" : ""; - return $"new {GetComponentName(componentInfo)}(){properties}"; - case TlcModule.DataKind.Unknown: - return $"new {rootNameSpace + typesSymbolTable[fieldType.FullName]}()"; - default: - return fieldValue.ToString(); - } - } - - private static string Quote(string src) - { - var dst = src.Replace("\\", @"\\").Replace("\"", "\\\"").Replace("\n", @"\n").Replace("\r", @"\r"); - return "\"" + dst + "\""; - } - - public static string GetComponentName(ModuleCatalog.ComponentInfo component) - { - return $"{Capitalize(component.Name)}{component.Kind}"; - } - - public static string GetEnumName(Type type, Dictionary typesSymbolTable, string rootNamespace = "") - { - if (typesSymbolTable.ContainsKey(type.FullName)) - return rootNamespace + typesSymbolTable[type.FullName]; - else - return GetSymbolFromType(typesSymbolTable, type, rootNamespace); - } - - public static string GetJsonFromField(string fieldName, Type fieldType) - { - if (fieldType.IsArray && Var.CheckType(fieldType.GetElementType())) - return $"{{({fieldName}.IsValue ? {fieldName}.VarName : $\"'${{{fieldName}.VarName}}'\")}}"; - if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Dictionary<,>) - && fieldType.GetGenericTypeArgumentsEx()[0] == typeof(string)) - { - return $"'${{{fieldName}.VarName}}'"; - } - if (Var.CheckType(fieldType)) - return $"'${{{fieldName}.VarName}}'"; - - var isNullable = false; - var type = fieldType; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = type.GetGenericArguments()[0]; - isNullable = true; - } - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - type = type.GetGenericArguments()[0]; - - var typeEnum = TlcModule.GetDataType(type); - switch (typeEnum) - { - default: - if (isNullable) - return $"{{(!{fieldName}.HasValue ? \"null\" : $\"{{{fieldName}.Value}}\")}}"; - return $"{{{fieldName}}}"; - case TlcModule.DataKind.Enum: - if (isNullable) - return $"{{(!{fieldName}.HasValue ? \"null\" : $\"'{{{fieldName}.Value}}'\")}}"; - return $"'{{{fieldName}}}'"; - case TlcModule.DataKind.String: - return $"{{({fieldName} == null ? \"null\" : $\"'{{{fieldName}}}'\")}}"; - case TlcModule.DataKind.Bool: - if (isNullable) - return $"{{(!{fieldName}.HasValue ? \"null\" : {fieldName}.Value ? \"true\" : \"false\")}}"; - return $"'{{({fieldName} ? \"true\" : \"false\")}}'"; - case TlcModule.DataKind.Component: - case TlcModule.DataKind.Unknown: - return $"{{({fieldName} == null ? \"null\" : {fieldName}.ToJson())}}"; - case TlcModule.DataKind.Array: - return $"[{{({fieldName} == null ? \"\" : string.Join(\",\", {fieldName}.Select(f => $\"{GetJsonFromField("f", type.GetElementType())}\")))}}]"; - } - } - } - private readonly IHost _host; private readonly string _csFilename; private readonly string _regenerate; private readonly HashSet _excludedSet; private const string RegistrationName = "CSharpApiGenerator"; - public Dictionary TypesSymbolTable = new Dictionary(); + private const string _defaultNamespace = "Microsoft.ML."; + private readonly GeneratedClasses _generatedClasses; public CSharpApiGenerator(IHostEnvironment env, Arguments args, string regenerate) { @@ -423,6 +54,7 @@ public CSharpApiGenerator(IHostEnvironment env, Arguments args, string regenerat _csFilename = "CSharpApi.cs"; _regenerate = regenerate; _excludedSet = new HashSet(args.Exclude); + _generatedClasses = new GeneratedClasses(); } public void Generate(IEnumerable infos) @@ -434,17 +66,17 @@ public void Generate(IEnumerable infos) var writer = IndentingTextWriter.Wrap(sw, " "); // Generate header - GenerateHeader(writer); + CSharpGeneratorUtils.GenerateHeader(writer); foreach (var entryPointInfo in catalog.AllEntryPoints().Where(x => !_excludedSet.Contains(x.Name)).OrderBy(x => x.Name)) { // Generate method - GenerateMethod(writer, entryPointInfo, catalog); + CSharpGeneratorUtils.GenerateMethod(writer, entryPointInfo.Name, _defaultNamespace); } // Generate footer - GenerateFooter(writer); - GenerateFooter(writer); + CSharpGeneratorUtils.GenerateFooter(writer); + CSharpGeneratorUtils.GenerateFooter(writer); foreach (var entryPointInfo in catalog.AllEntryPoints().Where(x => !_excludedSet.Contains(x.Name)).OrderBy(x => x.Name)) { @@ -456,68 +88,28 @@ public void Generate(IEnumerable infos) writer.WriteLine("{"); writer.Indent(); - foreach (var kind in catalog.GetAllComponentKinds().OrderBy(x => x)) + foreach (var kind in catalog.GetAllComponentKinds()) { // Generate kind base class GenerateComponentKind(writer, kind); - foreach (var component in catalog.GetAllComponents(kind).OrderBy(x => x.Name)) + foreach (var component in catalog.GetAllComponents(kind)) { // Generate component GenerateComponent(writer, component, catalog); } } - GenerateFooter(writer); - GenerateFooter(writer); + CSharpGeneratorUtils.GenerateFooter(writer); + CSharpGeneratorUtils.GenerateFooter(writer); writer.WriteLine("#pragma warning restore"); } } - private void GenerateHeader(IndentingTextWriter writer) + private void GenerateInputOutput(IndentingTextWriter writer, ModuleCatalog.EntryPointInfo entryPointInfo, ModuleCatalog catalog) { - writer.WriteLine("//------------------------------------------------------------------------------"); - writer.WriteLine("// "); - writer.WriteLine("// This code was generated by a tool."); - writer.WriteLine("//"); - writer.WriteLine("// Changes to this file may cause incorrect behavior and will be lost if"); - writer.WriteLine("// the code is regenerated."); - writer.WriteLine("// "); - writer.WriteLine("//------------------------------------------------------------------------------"); - //writer.WriteLine($"// This file is auto generated. To regenerate it, run: {_regenerate}"); - writer.WriteLine("#pragma warning disable"); - writer.WriteLine("using System.Collections.Generic;"); - writer.WriteLine("using Microsoft.ML.Runtime;"); - writer.WriteLine("using Microsoft.ML.Runtime.Data;"); - writer.WriteLine("using Microsoft.ML.Runtime.EntryPoints;"); - writer.WriteLine("using Newtonsoft.Json;"); - writer.WriteLine("using System;"); - writer.WriteLine("using System.Linq;"); - writer.WriteLine("using Microsoft.ML.Runtime.CommandLine;"); - writer.WriteLine(); - writer.WriteLine("namespace Microsoft.ML"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine("namespace Runtime"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine("public sealed partial class Experiment"); - writer.WriteLine("{"); - writer.Indent(); - } - - private void GenerateFooter(IndentingTextWriter writer) - { - writer.Outdent(); - writer.WriteLine("}"); - } - - private void GenerateInputOutput(IndentingTextWriter writer, - ModuleCatalog.EntryPointInfo entryPointInfo, - ModuleCatalog catalog) - { - var classAndMethod = GeneratorUtils.GetClassAndMethodNames(entryPointInfo); - writer.WriteLine($"namespace {classAndMethod.Item1}"); + var classAndMethod = CSharpGeneratorUtils.GetEntryPointMetadata(entryPointInfo); + writer.WriteLine($"namespace {classAndMethod.Namespace}"); writer.WriteLine("{"); writer.Indent(); GenerateInput(writer, entryPointInfo, catalog); @@ -526,78 +118,6 @@ private void GenerateInputOutput(IndentingTextWriter writer, writer.WriteLine(); } - /// - /// This methods creates a unique name for a class/struct/enum, given a type and a namespace. - /// It generates the name based on the property of the type - /// (see description here https://msdn.microsoft.com/en-us/library/system.type.fullname(v=vs.110).aspx). - /// Example: Assume we have the following structure in namespace X.Y: - /// class A { - /// class B { - /// enum C { - /// Value1, - /// Value2 - /// } - /// } - /// } - /// The full name of C would be X.Y.A+B+C. This method will generate the name "ABC" from it. In case - /// A is generic with one generic type, then the full name of typeof(A<float>.B.C) would be X.Y.A`1+B+C[[System.Single]]. - /// In this case, this method will generate the name "ASingleBC". - /// - /// A dictionary containing the names of the classes already generated. - /// This parameter is only used to ensure that the newly generated name is unique. - /// The type for which to generate the new name. - /// The namespace prefix to the new name. - /// A unique name derived from the given type and namespace. - private static string GetSymbolFromType(Dictionary typesSymbolTable, Type type, string currentNamespace) - { - var fullTypeName = type.FullName; - string name = currentNamespace != "" ? currentNamespace + '.' : ""; - - int bracketIndex = fullTypeName.IndexOf('['); - Type[] genericTypes = null; - if (type.IsGenericType) - genericTypes = type.GetGenericArguments(); - if (bracketIndex > 0) - { - Contracts.AssertValue(genericTypes); - fullTypeName = fullTypeName.Substring(0, bracketIndex); - } - - // When the type is nested, the names of the outer types are concatenated with a '+'. - var nestedNames = fullTypeName.Split('+'); - var baseName = nestedNames[0]; - - // We currently only handle generic types in the outer most class, support for generic inner classes - // can be added if needed. - int backTickIndex = baseName.LastIndexOf('`'); - int dotIndex = baseName.LastIndexOf('.'); - Contracts.Assert(dotIndex >= 0); - if (backTickIndex < 0) - name += baseName.Substring(dotIndex + 1); - else - { - name += baseName.Substring(dotIndex + 1, backTickIndex - dotIndex - 1); - Contracts.AssertValue(genericTypes); - if (genericTypes != null) - { - foreach (var genType in genericTypes) - { - var splitNames = genType.FullName.Split('+'); - if (splitNames[0].LastIndexOf('.') >= 0) - splitNames[0] = splitNames[0].Substring(splitNames[0].LastIndexOf('.') + 1); - name += string.Join("", splitNames); - } - } - } - - for (int i = 1; i < nestedNames.Length; i++) - name += nestedNames[i]; - - Contracts.Assert(typesSymbolTable.Select(kvp => kvp.Value).All(str => string.Compare(str, name) != 0)); - - return "Microsoft.ML." + name; - } - private void GenerateEnums(IndentingTextWriter writer, Type inputType, string currentNamespace) { foreach (var fieldInfo in inputType.GetFields()) @@ -605,14 +125,8 @@ private void GenerateEnums(IndentingTextWriter writer, Type inputType, string cu var inputAttr = fieldInfo.GetCustomAttributes(typeof(ArgumentAttribute), false).FirstOrDefault() as ArgumentAttribute; if (inputAttr == null || inputAttr.Visibility == ArgumentAttribute.VisibilityType.CmdLineOnly) continue; - - var type = fieldInfo.FieldType; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - type = type.GetGenericArguments()[0]; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - type = type.GetGenericArguments()[0]; - - if (TypesSymbolTable.ContainsKey(type.FullName)) + var type = CSharpGeneratorUtils.ExtractOptionalOrNullableType(fieldInfo.FieldType); + if (_generatedClasses.IsGenerated(type.FullName)) continue; if (!type.IsEnum) @@ -625,15 +139,16 @@ private void GenerateEnums(IndentingTextWriter writer, Type inputType, string cu var enumType = Enum.GetUnderlyingType(type); - TypesSymbolTable[type.FullName] = GetSymbolFromType(TypesSymbolTable, type, currentNamespace); + var apiName = _generatedClasses.GetApiName(type, currentNamespace); if (enumType == typeof(int)) - writer.WriteLine($"public enum {TypesSymbolTable[type.FullName].Substring(TypesSymbolTable[type.FullName].LastIndexOf('.') + 1)}"); + writer.WriteLine($"public enum {apiName}"); else { Contracts.Assert(enumType == typeof(byte)); - writer.WriteLine($"public enum {TypesSymbolTable[type.FullName].Substring(TypesSymbolTable[type.FullName].LastIndexOf('.') + 1)} : byte"); + writer.WriteLine($"public enum {apiName} : byte"); } + _generatedClasses.MarkAsGenerated(type.FullName); writer.Write("{"); writer.Indent(); var names = Enum.GetNames(type); @@ -642,6 +157,8 @@ private void GenerateEnums(IndentingTextWriter writer, Type inputType, string cu for (int i = 0; i < names.Length; i++) { var name = names[i]; + if (type.GetField(name).GetCustomAttribute() != null) + continue; var value = values.GetValue(i); writer.WriteLine(prefix); if (enumType == typeof(int)) @@ -660,25 +177,7 @@ private void GenerateEnums(IndentingTextWriter writer, Type inputType, string cu } } - string GetFriendlyTypeName(string currentNameSpace, string typeName) - { - Contracts.Assert(typeName.Length >= currentNameSpace.Length); - - int index = 0; - for (index = 0; index < currentNameSpace.Length && currentNameSpace[index] == typeName[index]; index++) ; - - if (index == 0) - return typeName; - if (typeName[index - 1] == '.') - return typeName.Substring(index); - - return typeName; - } - - private void GenerateStructs(IndentingTextWriter writer, - Type inputType, - ModuleCatalog catalog, - string currentNamespace) + private void GenerateClasses(IndentingTextWriter writer, Type inputType, ModuleCatalog catalog, string currentNamespace) { foreach (var fieldInfo in inputType.GetFields()) { @@ -687,10 +186,7 @@ private void GenerateStructs(IndentingTextWriter writer, continue; var type = fieldInfo.FieldType; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - type = type.GetGenericArguments()[0]; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - type = type.GetGenericArguments()[0]; + type = CSharpGeneratorUtils.ExtractOptionalOrNullableType(type); if (type.IsArray) type = type.GetElementType(); if (type == typeof(JArray) || type == typeof(JObject)) @@ -707,265 +203,210 @@ private void GenerateStructs(IndentingTextWriter writer, if (typeEnum != TlcModule.DataKind.Unknown) continue; - if (TypesSymbolTable.ContainsKey(type.FullName)) + if (_generatedClasses.IsGenerated(type.FullName)) continue; + GenerateEnums(writer, type, currentNamespace); + GenerateClasses(writer, type, catalog, currentNamespace); - TypesSymbolTable[type.FullName] = GetSymbolFromType(TypesSymbolTable, type, currentNamespace); + var apiName = _generatedClasses.GetApiName(type, currentNamespace); string classBase = ""; if (type.IsSubclassOf(typeof(OneToOneColumn))) - classBase = $" : OneToOneColumn<{TypesSymbolTable[type.FullName].Substring(TypesSymbolTable[type.FullName].LastIndexOf('.') + 1)}>, IOneToOneColumn"; + classBase = $" : OneToOneColumn<{apiName}>, IOneToOneColumn"; else if (type.IsSubclassOf(typeof(ManyToOneColumn))) - classBase = $" : ManyToOneColumn<{TypesSymbolTable[type.FullName].Substring(TypesSymbolTable[type.FullName].LastIndexOf('.') + 1)}>, IManyToOneColumn"; - writer.WriteLine($"public sealed partial class {TypesSymbolTable[type.FullName].Substring(TypesSymbolTable[type.FullName].LastIndexOf('.') + 1)}{classBase}"); + classBase = $" : ManyToOneColumn<{apiName}>, IManyToOneColumn"; + writer.WriteLine($"public sealed partial class {apiName}{classBase}"); writer.WriteLine("{"); writer.Indent(); - GenerateInputFields(writer, type, catalog, TypesSymbolTable); + _generatedClasses.MarkAsGenerated(type.FullName); + GenerateInputFields(writer, type, catalog, currentNamespace); writer.Outdent(); writer.WriteLine("}"); writer.WriteLine(); - GenerateStructs(writer, type, catalog, currentNamespace); } } - private void GenerateLoaderAddInputMethod(IndentingTextWriter writer, string className) + private void GenerateColumnAddMethods(IndentingTextWriter writer, Type inputType, ModuleCatalog catalog, + string className, out Type columnType) { - //Constructor. - writer.WriteLine("[JsonIgnore]"); - writer.WriteLine("private string _inputFilePath = null;"); - writer.WriteLine($"public {className}(string filePath)"); + columnType = null; + foreach (var fieldInfo in inputType.GetFields()) + { + var inputAttr = fieldInfo.GetCustomAttributes(typeof(ArgumentAttribute), false).FirstOrDefault() as ArgumentAttribute; + if (inputAttr == null || inputAttr.Visibility == ArgumentAttribute.VisibilityType.CmdLineOnly) + continue; + var type = CSharpGeneratorUtils.ExtractOptionalOrNullableType(fieldInfo.FieldType); + var isArray = type.IsArray; + if (isArray) + type = type.GetElementType(); + if (type == typeof(JArray) || type == typeof(JObject)) + continue; + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Var<>)) + continue; + var typeEnum = TlcModule.GetDataType(type); + if (typeEnum != TlcModule.DataKind.Unknown) + continue; + + if (type.IsSubclassOf(typeof(OneToOneColumn))) + columnType = GenerateOneToOneColumn(writer, className, columnType, fieldInfo, inputAttr, type, isArray); + else if (type.IsSubclassOf(typeof(ManyToOneColumn))) + columnType = GenerateManyToOneColumn(writer, className, columnType, fieldInfo, inputAttr, type, isArray); + } + } + + private Type GenerateManyToOneColumn(IndentingTextWriter writer, string className, Type columnType, + System.Reflection.FieldInfo fieldInfo, ArgumentAttribute inputAttr, Type type, bool isArray) + { + var fieldName = CSharpGeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name); + var apiName = _generatedClasses.GetApiName(type, ""); + writer.WriteLine($"public {className}()"); + writer.WriteLine("{"); + writer.WriteLine("}"); + writer.WriteLine(""); + writer.WriteLine($"public {className}(string output{fieldName}, params string[] input{fieldName}s)"); writer.WriteLine("{"); writer.Indent(); - writer.WriteLine("_inputFilePath = filePath;"); + writer.WriteLine($"Add{fieldName}(output{fieldName}, input{fieldName}s);"); writer.Outdent(); writer.WriteLine("}"); writer.WriteLine(""); - - //SetInput. - writer.WriteLine($"public void SetInput(IHostEnvironment env, Experiment experiment)"); + writer.WriteLine($"public void Add{fieldName}(string name, params string[] source)"); writer.WriteLine("{"); writer.Indent(); - writer.WriteLine("IFileHandle inputFile = new SimpleFileHandle(env, _inputFilePath, false, false);"); - writer.WriteLine("experiment.SetInput(InputFile, inputFile);"); + if (isArray) + { + writer.WriteLine($"var list = {fieldName} == null ? new List<{apiName}>() : new List<{apiName}>({fieldName});"); + writer.WriteLine($"list.Add(ManyToOneColumn<{apiName}>.Create(name, source));"); + writer.WriteLine($"{fieldName} = list.ToArray();"); + } + else + writer.WriteLine($"{fieldName} = ManyToOneColumn<{apiName}>.Create(name, source);"); writer.Outdent(); writer.WriteLine("}"); - writer.WriteLine(""); + writer.WriteLine(); - //GetInputData - writer.WriteLine("public Var GetInputData() => null;"); - writer.WriteLine(""); + Contracts.Assert(columnType == null); + + columnType = type; + return columnType; + } - //Apply. - writer.WriteLine($"public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment)"); + private Type GenerateOneToOneColumn(IndentingTextWriter writer, string className, Type columnType, + System.Reflection.FieldInfo fieldInfo, ArgumentAttribute inputAttr, Type type, bool isArray) + { + var fieldName = CSharpGeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name); + var generatedType = _generatedClasses.GetApiName(type, ""); + writer.WriteLine($"public {className}()"); writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine("Contracts.Assert(previousStep == null);"); + writer.WriteLine("}"); writer.WriteLine(""); - writer.WriteLine($"return new {className}PipelineStep(experiment.Add(this));"); + writer.WriteLine($"public {className}(params string[] input{fieldName}s)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine($"if (input{fieldName}s != null)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine($"foreach (string input in input{fieldName}s)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine($"Add{fieldName}(input);"); + writer.Outdent(); + writer.WriteLine("}"); + writer.Outdent(); + writer.WriteLine("}"); writer.Outdent(); writer.WriteLine("}"); writer.WriteLine(""); - - //Pipelinestep class. - writer.WriteLine($"private class {className}PipelineStep : ILearningPipelineDataStep"); + writer.WriteLine($"public {className}(params (string inputColumn, string outputColumn)[] inputOutput{fieldName}s)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine($"if (inputOutput{fieldName}s != null)"); writer.WriteLine("{"); writer.Indent(); - writer.WriteLine($"public {className}PipelineStep (Output output)"); + writer.WriteLine($"foreach (var inputOutput in inputOutput{fieldName}s)"); writer.WriteLine("{"); writer.Indent(); - writer.WriteLine("Data = output.Data;"); - writer.WriteLine("Model = null;"); + writer.WriteLine($"Add{fieldName}(inputOutput.outputColumn, inputOutput.inputColumn);"); writer.Outdent(); writer.WriteLine("}"); - writer.WriteLine(); - writer.WriteLine("public Var Data { get; }"); - writer.WriteLine("public Var Model { get; }"); writer.Outdent(); writer.WriteLine("}"); - } - - private void GenerateColumnAddMethods(IndentingTextWriter writer, - Type inputType, - ModuleCatalog catalog, - string className, - out Type columnType) - { - columnType = null; - foreach (var fieldInfo in inputType.GetFields()) + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(""); + writer.WriteLine($"public void Add{fieldName}(string inputColumn)"); + writer.WriteLine("{"); + writer.Indent(); + if (isArray) { - var inputAttr = fieldInfo.GetCustomAttributes(typeof(ArgumentAttribute), false).FirstOrDefault() as ArgumentAttribute; - if (inputAttr == null || inputAttr.Visibility == ArgumentAttribute.VisibilityType.CmdLineOnly) - continue; - - var type = fieldInfo.FieldType; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - type = type.GetGenericArguments()[0]; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) - type = type.GetGenericArguments()[0]; - var isArray = type.IsArray; - if (isArray) - type = type.GetElementType(); - if (type == typeof(JArray) || type == typeof(JObject)) - continue; - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Var<>)) - continue; - var typeEnum = TlcModule.GetDataType(type); - if (typeEnum != TlcModule.DataKind.Unknown) - continue; - - if (type.IsSubclassOf(typeof(OneToOneColumn))) - { - var fieldName = GeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name); - writer.WriteLine($"public {className}()"); - writer.WriteLine("{"); - writer.WriteLine("}"); - writer.WriteLine(""); - writer.WriteLine($"public {className}(params string[] input{fieldName}s)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"if (input{fieldName}s != null)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"foreach (string input in input{fieldName}s)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"Add{fieldName}(input);"); - writer.Outdent(); - writer.WriteLine("}"); - writer.Outdent(); - writer.WriteLine("}"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(""); - writer.WriteLine($"public {className}(params ValueTuple[] inputOutput{fieldName}s)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"if (inputOutput{fieldName}s != null)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"foreach (ValueTuple inputOutput in inputOutput{fieldName}s)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"Add{fieldName}(inputOutput.Item2, inputOutput.Item1);"); - writer.Outdent(); - writer.WriteLine("}"); - writer.Outdent(); - writer.WriteLine("}"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(""); - writer.WriteLine($"public void Add{fieldName}(string source)"); - writer.WriteLine("{"); - writer.Indent(); - if (isArray) - { - writer.WriteLine($"var list = {fieldName} == null ? new List<{TypesSymbolTable[type.FullName]}>() : new List<{TypesSymbolTable[type.FullName]}>({fieldName});"); - writer.WriteLine($"list.Add(OneToOneColumn<{TypesSymbolTable[type.FullName]}>.Create(source));"); - writer.WriteLine($"{fieldName} = list.ToArray();"); - } - else - writer.WriteLine($"{fieldName} = OneToOneColumn<{TypesSymbolTable[type.FullName]}>.Create(source);"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(); - writer.WriteLine($"public void Add{fieldName}(string name, string source)"); - writer.WriteLine("{"); - writer.Indent(); - if (isArray) - { - writer.WriteLine($"var list = {fieldName} == null ? new List<{TypesSymbolTable[type.FullName]}>() : new List<{TypesSymbolTable[type.FullName]}>({fieldName});"); - writer.WriteLine($"list.Add(OneToOneColumn<{TypesSymbolTable[type.FullName]}>.Create(name, source));"); - writer.WriteLine($"{fieldName} = list.ToArray();"); - } - else - writer.WriteLine($"{fieldName} = OneToOneColumn<{TypesSymbolTable[type.FullName]}>.Create(name, source);"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(); - - Contracts.Assert(columnType == null); - - columnType = type; - } - else if (type.IsSubclassOf(typeof(ManyToOneColumn))) - { - var fieldName = GeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name); - writer.WriteLine($"public {className}()"); - writer.WriteLine("{"); - writer.WriteLine("}"); - writer.WriteLine(""); - writer.WriteLine($"public {className}(string output{fieldName}, params string[] input{fieldName}s)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"Add{fieldName}(output{fieldName}, input{fieldName}s);"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(""); - writer.WriteLine($"public void Add{fieldName}(string name, params string[] source)"); - writer.WriteLine("{"); - writer.Indent(); - if (isArray) - { - writer.WriteLine($"var list = {fieldName} == null ? new List<{TypesSymbolTable[type.FullName]}>() : new List<{TypesSymbolTable[type.FullName]}>({fieldName});"); - writer.WriteLine($"list.Add(ManyToOneColumn<{TypesSymbolTable[type.FullName]}>.Create(name, source));"); - writer.WriteLine($"{fieldName} = list.ToArray();"); - } - else - writer.WriteLine($"{fieldName} = ManyToOneColumn<{TypesSymbolTable[type.FullName]}>.Create(name, source);"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(); + writer.WriteLine($"var list = {fieldName} == null ? new List<{generatedType}>() : new List<{generatedType}>({fieldName});"); + writer.WriteLine($"list.Add(OneToOneColumn<{generatedType}>.Create(inputColumn));"); + writer.WriteLine($"{fieldName} = list.ToArray();"); + } + else + writer.WriteLine($"{fieldName} = OneToOneColumn<{generatedType}>.Create(inputColumn);"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(); + writer.WriteLine($"public void Add{fieldName}(string outputColumn, string inputColumn)"); + writer.WriteLine("{"); + writer.Indent(); + if (isArray) + { + writer.WriteLine($"var list = {fieldName} == null ? new List<{generatedType}>() : new List<{generatedType}>({fieldName});"); + writer.WriteLine($"list.Add(OneToOneColumn<{generatedType}>.Create(outputColumn, inputColumn));"); + writer.WriteLine($"{fieldName} = list.ToArray();"); + } + else + writer.WriteLine($"{fieldName} = OneToOneColumn<{generatedType}>.Create(outputColumn, inputColumn);"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(); - Contracts.Assert(columnType == null); + Contracts.Assert(columnType == null); - columnType = type; - } - } + columnType = type; + return columnType; } - private void GenerateInput(IndentingTextWriter writer, - ModuleCatalog.EntryPointInfo entryPointInfo, - ModuleCatalog catalog) + private void GenerateInput(IndentingTextWriter writer, ModuleCatalog.EntryPointInfo entryPointInfo, ModuleCatalog catalog) { - var classAndMethod = GeneratorUtils.GetClassAndMethodNames(entryPointInfo); + var entryPointMetadata = CSharpGeneratorUtils.GetEntryPointMetadata(entryPointInfo); string classBase = ""; if (entryPointInfo.InputKinds != null) { - classBase += $" : {string.Join(", ", entryPointInfo.InputKinds.Select(GeneratorUtils.GetCSharpTypeName))}"; + classBase += $" : {string.Join(", ", entryPointInfo.InputKinds.Select(CSharpGeneratorUtils.GetCSharpTypeName))}"; if (entryPointInfo.InputKinds.Any(t => typeof(ITrainerInput).IsAssignableFrom(t) || typeof(ITransformInput).IsAssignableFrom(t))) classBase += ", Microsoft.ML.ILearningPipelineItem"; } - GenerateEnums(writer, entryPointInfo.InputType, classAndMethod.Item1); + GenerateEnums(writer, entryPointInfo.InputType, _defaultNamespace + entryPointMetadata.Namespace); writer.WriteLine(); - GenerateStructs(writer, entryPointInfo.InputType, catalog, classAndMethod.Item1); - writer.WriteLine("/// "); - foreach (var line in entryPointInfo.Description.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) - writer.WriteLine($"/// {line}"); - writer.WriteLine("/// "); + GenerateClasses(writer, entryPointInfo.InputType, catalog, _defaultNamespace + entryPointMetadata.Namespace); + CSharpGeneratorUtils.GenerateSummary(writer, entryPointInfo.Description, entryPointInfo.XmlInclude); if (entryPointInfo.ObsoleteAttribute != null) writer.WriteLine($"[Obsolete(\"{entryPointInfo.ObsoleteAttribute.Message}\")]"); - writer.WriteLine($"public sealed partial class {classAndMethod.Item2}{classBase}"); + writer.WriteLine($"public sealed partial class {entryPointMetadata.ClassName}{classBase}"); writer.WriteLine("{"); writer.Indent(); writer.WriteLine(); if (entryPointInfo.InputKinds != null && entryPointInfo.InputKinds.Any(t => typeof(ILearningPipelineLoader).IsAssignableFrom(t))) - GenerateLoaderAddInputMethod(writer, classAndMethod.Item2); + CSharpGeneratorUtils.GenerateLoaderAddInputMethod(writer, entryPointMetadata.ClassName); - GenerateColumnAddMethods(writer, entryPointInfo.InputType, catalog, classAndMethod.Item2, out Type transformType); + GenerateColumnAddMethods(writer, entryPointInfo.InputType, catalog, entryPointMetadata.ClassName, out Type transformType); writer.WriteLine(); - GenerateInputFields(writer, entryPointInfo.InputType, catalog, TypesSymbolTable); + GenerateInputFields(writer, entryPointInfo.InputType, catalog, _defaultNamespace + entryPointMetadata.Namespace); writer.WriteLine(); GenerateOutput(writer, entryPointInfo, out HashSet outputVariableNames); - GenerateApplyFunction(writer, entryPointInfo, transformType, outputVariableNames, entryPointInfo.InputKinds); + GenerateApplyFunction(writer, entryPointMetadata.ClassName, transformType, outputVariableNames, entryPointInfo.InputKinds); writer.Outdent(); writer.WriteLine("}"); } - private static void GenerateApplyFunction(IndentingTextWriter writer, ModuleCatalog.EntryPointInfo entryPointInfo, - Type type, HashSet outputVariableNames, Type[] inputKinds) + private static void GenerateApplyFunction(IndentingTextWriter writer, string className, Type type, + HashSet outputVariableNames, Type[] inputKinds) { if (inputKinds == null) return; @@ -987,7 +428,6 @@ private static void GenerateApplyFunction(IndentingTextWriter writer, ModuleCata writer.WriteLine("public Var GetInputData() => TrainingData;"); writer.WriteLine(""); - string className = GeneratorUtils.GetClassAndMethodNames(entryPointInfo).Item2; writer.WriteLine("public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment)"); writer.WriteLine("{"); @@ -1057,8 +497,7 @@ private static void GenerateApplyFunction(IndentingTextWriter writer, ModuleCata writer.WriteLine("}"); } - private static void GenerateInputFields(IndentingTextWriter writer, - Type inputType, ModuleCatalog catalog, Dictionary typesSymbolTable, string rootNameSpace = "") + private void GenerateInputFields(IndentingTextWriter writer, Type inputType, ModuleCatalog catalog, string rootNameSpace) { var defaults = Activator.CreateInstance(inputType); foreach (var fieldInfo in inputType.GetFields()) @@ -1070,20 +509,18 @@ private static void GenerateInputFields(IndentingTextWriter writer, if (fieldInfo.FieldType == typeof(JObject)) continue; - writer.WriteLine("/// "); - writer.WriteLine($"/// {inputAttr.HelpText}"); - writer.WriteLine("/// "); + CSharpGeneratorUtils.GenerateSummary(writer, inputAttr.HelpText); if (fieldInfo.FieldType == typeof(JArray)) { - writer.WriteLine($"public Experiment {GeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name)} {{ get; set; }}"); + writer.WriteLine($"public Experiment {CSharpGeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name)} {{ get; set; }}"); writer.WriteLine(); continue; } - var inputTypeString = GeneratorUtils.GetInputType(catalog, fieldInfo.FieldType, typesSymbolTable, rootNameSpace); - if (GeneratorUtils.IsComponent(fieldInfo.FieldType)) + var inputTypeString = CSharpGeneratorUtils.GetInputType(catalog, fieldInfo.FieldType, _generatedClasses, rootNameSpace); + if (CSharpGeneratorUtils.IsComponent(fieldInfo.FieldType)) writer.WriteLine("[JsonConverter(typeof(ComponentSerializer))]"); - if (GeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name) != (inputAttr.Name ?? fieldInfo.Name)) + if (CSharpGeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name) != (inputAttr.Name ?? fieldInfo.Name)) writer.WriteLine($"[JsonProperty(\"{inputAttr.Name ?? fieldInfo.Name}\")]"); // For range attributes on properties @@ -1105,8 +542,8 @@ private static void GenerateInputFields(IndentingTextWriter writer, writer.WriteLine(sweepableParamAttr.ToString()); } - writer.Write($"public {inputTypeString} {GeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name)} {{ get; set; }}"); - var defaultValue = GeneratorUtils.GetValue(catalog, fieldInfo.FieldType, fieldInfo.GetValue(defaults), typesSymbolTable, rootNameSpace); + writer.Write($"public {inputTypeString} {CSharpGeneratorUtils.Capitalize(inputAttr.Name ?? fieldInfo.Name)} {{ get; set; }}"); + var defaultValue = CSharpGeneratorUtils.GetValue(catalog, fieldInfo.FieldType, fieldInfo.GetValue(defaults), _generatedClasses, rootNameSpace); if (defaultValue != null) writer.Write($" = {defaultValue};"); writer.WriteLine(); @@ -1114,14 +551,12 @@ private static void GenerateInputFields(IndentingTextWriter writer, } } - private void GenerateOutput(IndentingTextWriter writer, - ModuleCatalog.EntryPointInfo entryPointInfo, - out HashSet outputVariableNames) + private void GenerateOutput(IndentingTextWriter writer, ModuleCatalog.EntryPointInfo entryPointInfo, out HashSet outputVariableNames) { outputVariableNames = new HashSet(); string classBase = ""; if (entryPointInfo.OutputKinds != null) - classBase = $" : {string.Join(", ", entryPointInfo.OutputKinds.Select(GeneratorUtils.GetCSharpTypeName))}"; + classBase = $" : {string.Join(", ", entryPointInfo.OutputKinds.Select(CSharpGeneratorUtils.GetCSharpTypeName))}"; writer.WriteLine($"public sealed class Output{classBase}"); writer.WriteLine("{"); writer.Indent(); @@ -1136,12 +571,10 @@ private void GenerateOutput(IndentingTextWriter writer, if (outputAttr == null) continue; - writer.WriteLine("/// "); - writer.WriteLine($"/// {outputAttr.Desc}"); - writer.WriteLine("/// "); - var outputTypeString = GeneratorUtils.GetOutputType(fieldInfo.FieldType); - outputVariableNames.Add(GeneratorUtils.Capitalize(outputAttr.Name ?? fieldInfo.Name)); - writer.WriteLine($"public {outputTypeString} {GeneratorUtils.Capitalize(outputAttr.Name ?? fieldInfo.Name)} {{ get; set; }} = new {outputTypeString}();"); + CSharpGeneratorUtils.GenerateSummary(writer, outputAttr.Desc); + var outputTypeString = CSharpGeneratorUtils.GetOutputType(fieldInfo.FieldType); + outputVariableNames.Add(CSharpGeneratorUtils.Capitalize(outputAttr.Name ?? fieldInfo.Name)); + writer.WriteLine($"public {outputTypeString} {CSharpGeneratorUtils.Capitalize(outputAttr.Name ?? fieldInfo.Name)} {{ get; set; }} = new {outputTypeString}();"); writer.WriteLine(); } @@ -1149,30 +582,6 @@ private void GenerateOutput(IndentingTextWriter writer, writer.WriteLine("}"); } - private void GenerateMethod(IndentingTextWriter writer, - ModuleCatalog.EntryPointInfo entryPointInfo, - ModuleCatalog catalog) - { - var inputOuputClassName = GeneratorUtils.GetFullMethodName(entryPointInfo); - inputOuputClassName = "Microsoft.ML." + inputOuputClassName; - writer.WriteLine($"public {inputOuputClassName}.Output Add({inputOuputClassName} input)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"var output = new {inputOuputClassName}.Output();"); - writer.WriteLine("Add(input, output);"); - writer.WriteLine("return output;"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(); - writer.WriteLine($"public void Add({inputOuputClassName} input, {inputOuputClassName}.Output output)"); - writer.WriteLine("{"); - writer.Indent(); - writer.WriteLine($"_jsonNodes.Add(Serialize(\"{entryPointInfo.Name}\", input, output));"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(); - } - private void GenerateComponentKind(IndentingTextWriter writer, string kind) { writer.WriteLine($"public abstract class {kind} : ComponentKind {{}}"); @@ -1183,15 +592,13 @@ private void GenerateComponent(IndentingTextWriter writer, ModuleCatalog.Compone { GenerateEnums(writer, component.ArgumentType, "Runtime"); writer.WriteLine(); - GenerateStructs(writer, component.ArgumentType, catalog, "Runtime"); + GenerateClasses(writer, component.ArgumentType, catalog, "Runtime"); writer.WriteLine(); - writer.WriteLine("/// "); - writer.WriteLine($"/// {component.Description}"); - writer.WriteLine("/// "); - writer.WriteLine($"public sealed class {GeneratorUtils.GetComponentName(component)} : {component.Kind}"); + CSharpGeneratorUtils.GenerateSummary(writer, component.Description); + writer.WriteLine($"public sealed class {CSharpGeneratorUtils.GetComponentName(component)} : {component.Kind}"); writer.WriteLine("{"); writer.Indent(); - GenerateInputFields(writer, component.ArgumentType, catalog, TypesSymbolTable, "Microsoft.ML."); + GenerateInputFields(writer, component.ArgumentType, catalog, "Runtime"); writer.WriteLine($"internal override string ComponentName => \"{component.Name}\";"); writer.Outdent(); writer.WriteLine("}"); diff --git a/src/Microsoft.ML/Runtime/Internal/Tools/CSharpGeneratorUtils.cs b/src/Microsoft.ML/Runtime/Internal/Tools/CSharpGeneratorUtils.cs new file mode 100644 index 0000000000..00facba98e --- /dev/null +++ b/src/Microsoft.ML/Runtime/Internal/Tools/CSharpGeneratorUtils.cs @@ -0,0 +1,485 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.CodeDom; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Microsoft.CSharp; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.Internal.Utilities; +using Newtonsoft.Json.Linq; + +namespace Microsoft.ML.Runtime.Internal.Tools +{ + internal static class CSharpGeneratorUtils + { + public sealed class EntryPointGenerationMetadata + { + public string Namespace { get; } + public string ClassName { get; } + public EntryPointGenerationMetadata(string classNamespace, string className) + { + Namespace = classNamespace; + ClassName = className; + } + } + + public static EntryPointGenerationMetadata GetEntryPointMetadata(ModuleCatalog.EntryPointInfo entryPointInfo) + { + var split = entryPointInfo.Name.Split('.'); + Contracts.Check(split.Length == 2); + return new EntryPointGenerationMetadata(split[0], split[1]); + } + + public static Type ExtractOptionalOrNullableType(Type type) + { + if (type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(Optional<>) || type.GetGenericTypeDefinition() == typeof(Nullable<>))) + type = type.GetGenericArguments()[0]; + + return type; + } + + public static Type ExtractOptionalOrNullableType(Type type, out bool isNullable, out bool isOptional) + { + isNullable = false; + isOptional = false; + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + type = type.GetGenericArguments()[0]; + isNullable = true; + } + else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Optional<>)) + { + type = type.GetGenericArguments()[0]; + isOptional = true; + } + return type; + } + + public static string GetCSharpTypeName(Type type) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + return GetCSharpTypeName(type.GetGenericArguments()[0]) + "?"; + + using (var p = new CSharpCodeProvider()) + return p.GetTypeOutput(new CodeTypeReference(type)); + } + + public static string GetOutputType(Type outputType) + { + Contracts.Check(Var.CheckType(outputType)); + + if (outputType.IsArray) + return $"ArrayVar<{GetCSharpTypeName(outputType.GetElementType())}>"; + if (outputType.IsGenericType && outputType.GetGenericTypeDefinition() == typeof(Dictionary<,>) + && outputType.GetGenericTypeArgumentsEx()[0] == typeof(string)) + { + return $"DictionaryVar<{GetCSharpTypeName(outputType.GetGenericTypeArgumentsEx()[1])}>"; + } + + return $"Var<{GetCSharpTypeName(outputType)}>"; + } + + public static string GetInputType(ModuleCatalog catalog, Type inputType, GeneratedClasses generatedClasses, string rootNameSpace) + { + if (inputType.IsGenericType && inputType.GetGenericTypeDefinition() == typeof(Var<>)) + return $"Var<{GetCSharpTypeName(inputType.GetGenericTypeArgumentsEx()[0])}>"; + + if (inputType.IsArray && Var.CheckType(inputType.GetElementType())) + return $"ArrayVar<{GetCSharpTypeName(inputType.GetElementType())}>"; + + if (inputType.IsGenericType && inputType.GetGenericTypeDefinition() == typeof(Dictionary<,>) + && inputType.GetGenericTypeArgumentsEx()[0] == typeof(string)) + { + return $"DictionaryVar<{GetCSharpTypeName(inputType.GetGenericTypeArgumentsEx()[1])}>"; + } + + if (Var.CheckType(inputType)) + return $"Var<{GetCSharpTypeName(inputType)}>"; + + var type = ExtractOptionalOrNullableType(inputType, out bool isNullable, out bool isOptional); + var typeEnum = TlcModule.GetDataType(type); + switch (typeEnum) + { + case TlcModule.DataKind.Float: + case TlcModule.DataKind.Int: + case TlcModule.DataKind.UInt: + case TlcModule.DataKind.Char: + case TlcModule.DataKind.String: + case TlcModule.DataKind.Bool: + case TlcModule.DataKind.DataView: + case TlcModule.DataKind.TransformModel: + case TlcModule.DataKind.PredictorModel: + case TlcModule.DataKind.FileHandle: + return GetCSharpTypeName(inputType); + case TlcModule.DataKind.Array: + return GetInputType(catalog, inputType.GetElementType(), generatedClasses, rootNameSpace) + "[]"; + case TlcModule.DataKind.Component: + string kind; + bool success = catalog.TryGetComponentKind(type, out kind); + Contracts.Assert(success); + return $"{kind}"; + case TlcModule.DataKind.Enum: + var enumName = generatedClasses.GetApiName(type, rootNameSpace); + if (isNullable) + return $"{enumName}?"; + if (isOptional) + return $"Optional<{enumName}>"; + return $"{enumName}"; + default: + if (isNullable) + return generatedClasses.GetApiName(type, rootNameSpace) + "?"; + if (isOptional) + return $"Optional<{generatedClasses.GetApiName(type, rootNameSpace)}>"; + return generatedClasses.GetApiName(type, rootNameSpace); + } + } + + public static bool IsComponent(Type inputType) + { + if (inputType.IsArray && Var.CheckType(inputType.GetElementType())) + return false; + + if (inputType.IsGenericType && inputType.GetGenericTypeDefinition() == typeof(Dictionary<,>) + && inputType.GetGenericTypeArgumentsEx()[0] == typeof(string)) + { + return false; + } + + if (Var.CheckType(inputType)) + return false; + + var type = ExtractOptionalOrNullableType(inputType); + var typeEnum = TlcModule.GetDataType(type); + return typeEnum == TlcModule.DataKind.Component; + } + + public static string Capitalize(string s) + { + if (string.IsNullOrEmpty(s)) + return s; + return char.ToUpperInvariant(s[0]) + s.Substring(1); + } + + private static string GetCharAsString(char value) + { + switch (value) + { + case '\t': + return "\\t"; + case '\n': + return "\\n"; + case '\r': + return "\\r"; + case '\\': + return "\\"; + case '\"': + return "\""; + case '\'': + return "\\'"; + case '\0': + return "\\0"; + case '\a': + return "\\a"; + case '\b': + return "\\b"; + case '\f': + return "\\f"; + case '\v': + return "\\v"; + default: + return value.ToString(); + } + } + + public static string GetValue(ModuleCatalog catalog, Type fieldType, object fieldValue, + GeneratedClasses generatedClasses, string rootNameSpace) + { + if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Var<>)) + return $"new Var<{GetCSharpTypeName(fieldType.GetGenericTypeArgumentsEx()[0])}>()"; + + if (fieldType.IsArray && Var.CheckType(fieldType.GetElementType())) + return $"new ArrayVar<{GetCSharpTypeName(fieldType.GetElementType())}>()"; + + if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Dictionary<,>) + && fieldType.GetGenericTypeArgumentsEx()[0] == typeof(string)) + { + return $"new DictionaryVar<{GetCSharpTypeName(fieldType.GetGenericTypeArgumentsEx()[1])}>()"; + } + + if (Var.CheckType(fieldType)) + return $"new Var<{GetCSharpTypeName(fieldType)}>()"; + + if (fieldValue == null) + return null; + + if (!fieldType.IsInterface) + { + try + { + var defaultFieldValue = Activator.CreateInstance(fieldType); + if (defaultFieldValue == fieldValue) + return null; + } + catch (MissingMethodException) + { + // No parameterless constructor, ignore. + } + } + + var typeEnum = TlcModule.GetDataType(fieldType); + fieldType = ExtractOptionalOrNullableType(fieldType, out bool isNullable, out bool isOptional); + switch (typeEnum) + { + case TlcModule.DataKind.Array: + var arr = fieldValue as Array; + if (arr != null && arr.GetLength(0) > 0) + return $"{{ {string.Join(", ", arr.Cast().Select(item => GetValue(catalog, fieldType.GetElementType(), item, generatedClasses, rootNameSpace)))} }}"; + return null; + case TlcModule.DataKind.String: + var strval = fieldValue as string; + if (strval != null) + return Quote(strval); + return null; + case TlcModule.DataKind.Float: + if (fieldValue is double d) + { + if (double.IsPositiveInfinity(d)) + return "double.PositiveInfinity"; + if (double.IsNegativeInfinity(d)) + return "double.NegativeInfinity"; + if (d != 0) + return d.ToString("R") + "d"; + } + else if (fieldValue is float f) + { + if (float.IsPositiveInfinity(f)) + return "float.PositiveInfinity"; + if (float.IsNegativeInfinity(f)) + return "float.NegativeInfinity"; + if (f != 0) + return f.ToString("R") + "f"; + } + return null; + case TlcModule.DataKind.Int: + if (fieldValue is int i) + { + if (i != 0) + return i.ToString(); + } + else if (fieldValue is long l) + { + if (l != 0) + return l.ToString(); + } + return null; + case TlcModule.DataKind.Bool: + return (bool)fieldValue ? "true" : "false"; + case TlcModule.DataKind.Enum: + string enumAsString = fieldValue.ToString(); + if (fieldType.GetField(enumAsString).GetCustomAttribute() != null) + { + // The default value for the enum has the hiding attribute on it. We will search for + // alternate names. Regrettably I see no way beyond a manual scan. + + string unhiddenName = Enum.GetNames(fieldType).Zip(Enum.GetValues(fieldType).Cast(), (name, val) => (name, val)) + .Where(pair => pair.val.Equals(fieldValue)) + .Where(pair => fieldType.GetField(pair.name).GetCustomAttribute() == null) + .Select(pair => pair.name).FirstOrDefault(); + enumAsString = unhiddenName ?? throw Contracts.Except($"Could not find unhidden alternative for '{fieldValue}' in type '{fieldType}'"); + } + if (generatedClasses.IsGenerated(fieldType.FullName)) + return generatedClasses.GetApiName(fieldType, rootNameSpace) + "." + enumAsString; + else + return generatedClasses.GetApiName(fieldType, "Runtime") + "." + enumAsString; + case TlcModule.DataKind.Char: + return $"'{GetCharAsString((char)fieldValue)}'"; + case TlcModule.DataKind.Component: + var type = fieldValue.GetType(); + ModuleCatalog.ComponentInfo componentInfo; + if (!catalog.TryFindComponent(fieldType, type, out componentInfo)) + return null; + object defaultComponent = null; + try + { + defaultComponent = Activator.CreateInstance(componentInfo.ArgumentType); + } + catch (MissingMethodException) + { + // No parameterless constructor, ignore. + } + var propertyBag = new List(); + if (defaultComponent != null) + { + foreach (var fieldInfo in componentInfo.ArgumentType.GetFields()) + { + var inputAttr = fieldInfo.GetCustomAttributes(typeof(ArgumentAttribute), false).FirstOrDefault() as ArgumentAttribute; + if (inputAttr == null || inputAttr.Visibility == ArgumentAttribute.VisibilityType.CmdLineOnly) + continue; + if (fieldInfo.FieldType == typeof(JArray) || fieldInfo.FieldType == typeof(JObject)) + continue; + + var propertyValue = GetValue(catalog, fieldInfo.FieldType, fieldInfo.GetValue(fieldValue), generatedClasses, rootNameSpace); + var defaultPropertyValue = GetValue(catalog, fieldInfo.FieldType, fieldInfo.GetValue(defaultComponent), generatedClasses, rootNameSpace); + if (propertyValue != defaultPropertyValue) + propertyBag.Add($"{Capitalize(inputAttr.Name ?? fieldInfo.Name)} = {propertyValue}"); + } + } + var properties = propertyBag.Count > 0 ? $" {{ {string.Join(", ", propertyBag)} }}" : ""; + return $"new {GetComponentName(componentInfo)}(){properties}"; + case TlcModule.DataKind.Unknown: + return $"new {generatedClasses.GetApiName(fieldType, rootNameSpace)}()"; + default: + return fieldValue.ToString(); + } + } + + private static string Quote(string src) + { + var dst = src.Replace("\\", @"\\").Replace("\"", "\\\"").Replace("\n", @"\n").Replace("\r", @"\r"); + return "\"" + dst + "\""; + } + + public static string GetComponentName(ModuleCatalog.ComponentInfo component) + { + return $"{Capitalize(component.Name)}{component.Kind}"; + } + + public static void GenerateSummary(IndentingTextWriter writer, string summary, string[] xmlInclude = null) + { + // if the class has an XML it should contain the summary and everything else + if (xmlInclude != null) + { + foreach (var line in xmlInclude) + writer.WriteLine($"/// {line}"); + + return; + } + + if (string.IsNullOrEmpty(summary)) + return; + writer.WriteLine("/// "); + foreach (var line in summary.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) + writer.WriteLine($"/// {line}"); + writer.WriteLine("/// "); + } + + public static void GenerateHeader(IndentingTextWriter writer) + { + writer.WriteLine("//------------------------------------------------------------------------------"); + writer.WriteLine("// "); + writer.WriteLine("// This code was generated by a tool."); + writer.WriteLine("//"); + writer.WriteLine("// Changes to this file may cause incorrect behavior and will be lost if"); + writer.WriteLine("// the code is regenerated."); + writer.WriteLine("// "); + writer.WriteLine("//------------------------------------------------------------------------------"); + writer.WriteLine("#pragma warning disable"); + writer.WriteLine("using System.Collections.Generic;"); + writer.WriteLine("using Microsoft.ML.Runtime;"); + writer.WriteLine("using Microsoft.ML.Runtime.Data;"); + writer.WriteLine("using Microsoft.ML.Runtime.EntryPoints;"); + writer.WriteLine("using Newtonsoft.Json;"); + writer.WriteLine("using System;"); + writer.WriteLine("using System.Linq;"); + writer.WriteLine("using Microsoft.ML.Runtime.CommandLine;"); + writer.WriteLine(); + writer.WriteLine("namespace Microsoft.ML"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine("namespace Runtime"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine("public sealed partial class Experiment"); + writer.WriteLine("{"); + writer.Indent(); + } + + public static void GenerateFooter(IndentingTextWriter writer) + { + writer.Outdent(); + writer.WriteLine("}"); + } + + public static void GenerateMethod(IndentingTextWriter writer, string className, string defaultNamespace) + { + var inputOuputClassName = defaultNamespace + className; + writer.WriteLine($"public {inputOuputClassName}.Output Add({inputOuputClassName} input)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine($"var output = new {inputOuputClassName}.Output();"); + writer.WriteLine("Add(input, output);"); + writer.WriteLine("return output;"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(); + writer.WriteLine($"public void Add({inputOuputClassName} input, {inputOuputClassName}.Output output)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine($"_jsonNodes.Add(Serialize(\"{className}\", input, output));"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(); + } + + public static void GenerateLoaderAddInputMethod(IndentingTextWriter writer, string className) + { + //Constructor. + writer.WriteLine("[JsonIgnore]"); + writer.WriteLine("private string _inputFilePath = null;"); + writer.WriteLine($"public {className}(string filePath)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine("_inputFilePath = filePath;"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(""); + + //SetInput. + writer.WriteLine($"public void SetInput(IHostEnvironment env, Experiment experiment)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine("IFileHandle inputFile = new SimpleFileHandle(env, _inputFilePath, false, false);"); + writer.WriteLine("experiment.SetInput(InputFile, inputFile);"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(""); + + //GetInputData + writer.WriteLine("public Var GetInputData() => null;"); + writer.WriteLine(""); + + //Apply. + writer.WriteLine($"public ILearningPipelineStep ApplyStep(ILearningPipelineStep previousStep, Experiment experiment)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine("Contracts.Assert(previousStep == null);"); + writer.WriteLine(""); + writer.WriteLine($"return new {className}PipelineStep(experiment.Add(this));"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(""); + + //Pipelinestep class. + writer.WriteLine($"private class {className}PipelineStep : ILearningPipelineDataStep"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine($"public {className}PipelineStep (Output output)"); + writer.WriteLine("{"); + writer.Indent(); + writer.WriteLine("Data = output.Data;"); + writer.WriteLine("Model = null;"); + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(); + writer.WriteLine("public Var Data { get; }"); + writer.WriteLine("public Var Model { get; }"); + writer.Outdent(); + writer.WriteLine("}"); + } + } +} diff --git a/src/Microsoft.ML/Runtime/Internal/Tools/GeneratedClasses.cs b/src/Microsoft.ML/Runtime/Internal/Tools/GeneratedClasses.cs new file mode 100644 index 0000000000..fe8adf35fc --- /dev/null +++ b/src/Microsoft.ML/Runtime/Internal/Tools/GeneratedClasses.cs @@ -0,0 +1,102 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.ML.Runtime.Internal.Tools +{ + internal sealed class GeneratedClasses + { + private sealed class ApiClass + { + public string OriginalName { get; set; } + public string NewName { get; set; } + public bool Generated { get; set; } + } + + private readonly Dictionary _typesSymbolTable; + + public GeneratedClasses() + { + _typesSymbolTable = new Dictionary(); + } + + public string GetApiName(Type type, string rootNamespace) + { + string apiName = ""; + if (!_typesSymbolTable.TryGetValue(type.FullName, out ApiClass apiClass)) + apiName = GenerateIntenalName(type, rootNamespace); + else + apiName = apiClass.NewName; + + if (!string.IsNullOrEmpty(rootNamespace)&& apiName.StartsWith(rootNamespace)) + return apiName.Substring(rootNamespace.Length + 1); + else return apiName; + } + + private string GenerateIntenalName(Type type, string currentNamespace) + { + var fullTypeName = type.FullName; + string name = currentNamespace != "" ? currentNamespace + '.' : ""; + + int bracketIndex = fullTypeName.IndexOf('['); + Type[] genericTypes = null; + if (type.IsGenericType) + genericTypes = type.GetGenericArguments(); + if (bracketIndex > 0) + { + Contracts.AssertValue(genericTypes); + fullTypeName = fullTypeName.Substring(0, bracketIndex); + } + + // When the type is nested, the names of the outer types are concatenated with a '+'. + var nestedNames = fullTypeName.Split('+'); + var baseName = nestedNames[0]; + + // We currently only handle generic types in the outer most class, support for generic inner classes + // can be added if needed. + int backTickIndex = baseName.LastIndexOf('`'); + int dotIndex = baseName.LastIndexOf('.'); + Contracts.Assert(dotIndex >= 0); + if (backTickIndex < 0) + name += baseName.Substring(dotIndex + 1); + else + { + name += baseName.Substring(dotIndex + 1, backTickIndex - dotIndex - 1); + Contracts.AssertValue(genericTypes); + if (genericTypes != null) + { + foreach (var genType in genericTypes) + { + var splitNames = genType.FullName.Split('+'); + if (splitNames[0].LastIndexOf('.') >= 0) + splitNames[0] = splitNames[0].Substring(splitNames[0].LastIndexOf('.') + 1); + name += string.Join("", splitNames); + } + } + } + + for (int i = 1; i < nestedNames.Length; i++) + name += nestedNames[i]; + + Contracts.Assert(_typesSymbolTable.Values.All(apiclass => string.Compare(apiclass.NewName, name) != 0)); + _typesSymbolTable[type.FullName] = new ApiClass { OriginalName = type.FullName, Generated = false, NewName = name }; + return name; + } + + internal bool IsGenerated(string fullName) + { + if (!_typesSymbolTable.ContainsKey(fullName)) + return false; + return _typesSymbolTable[fullName].Generated; + } + + internal void MarkAsGenerated(string fullName) + { + _typesSymbolTable[fullName].Generated = true; + } + } +} diff --git a/src/Microsoft.ML/Trainers/LightGBM.cs b/src/Microsoft.ML/Trainers/LightGBM.cs new file mode 100644 index 0000000000..60c7a45177 --- /dev/null +++ b/src/Microsoft.ML/Trainers/LightGBM.cs @@ -0,0 +1,58 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace Microsoft.ML.Trainers +{ + /// + /// This API requires Microsoft.ML.LightGBM nuget. + /// + /// + /// + /// pipeline.Add(new LightGbmBinaryClassifier() { NumLeaves = 5, NumBoostRound = 5, MinDataPerLeaf = 2 }) + /// + /// + public sealed partial class LightGbmBinaryClassifier + { + + } + + /// + /// This API requires Microsoft.ML.LightGBM nuget. + /// + /// + /// + /// pipeline.Add(new LightGbmClassifier() { NumLeaves = 5, NumBoostRound = 5, MinDataPerLeaf = 2 }) + /// + /// + public sealed partial class LightGbmClassifier + { + + } + + /// + /// This API requires Microsoft.ML.LightGBM nuget. + /// + /// + /// + /// pipeline.Add(new LightGbmRanker() { NumLeaves = 5, NumBoostRound = 5, MinDataPerLeaf = 2 }) + /// + /// + public sealed partial class LightGbmRanker + { + + } + + /// + /// This API requires Microsoft.ML.LightGBM nuget. + /// + /// + /// + /// pipeline.Add(new LightGbmRegressor() { NumLeaves = 5, NumBoostRound = 5, MinDataPerLeaf = 2 }) + /// + /// + public sealed partial class LightGbmRegressor + { + + } +} diff --git a/src/Native/CMakeLists.txt b/src/Native/CMakeLists.txt index 947a664ab6..767f6151fa 100644 --- a/src/Native/CMakeLists.txt +++ b/src/Native/CMakeLists.txt @@ -179,4 +179,6 @@ function(install_library_and_symbols targetName) endfunction() add_subdirectory(CpuMathNative) -add_subdirectory(FastTreeNative) \ No newline at end of file +add_subdirectory(FastTreeNative) +add_subdirectory(LdaNative) +add_subdirectory(FactorizationMachineNative) diff --git a/src/Native/FactorizationMachineNative/CMakeLists.txt b/src/Native/FactorizationMachineNative/CMakeLists.txt new file mode 100644 index 0000000000..bef4cbc5e9 --- /dev/null +++ b/src/Native/FactorizationMachineNative/CMakeLists.txt @@ -0,0 +1,14 @@ +project (FactorizationMachineNative) + +set(SOURCES + FactorizationMachineCore.cpp +) + +if(WIN32) +else() + list(APPEND SOURCES ${VERSION_FILE_PATH}) +endif() + +add_library(FactorizationMachineNative SHARED ${SOURCES} ${RESOURCES}) + +install_library_and_symbols (FactorizationMachineNative) \ No newline at end of file diff --git a/src/Native/FactorizationMachineNative/FactorizationMachineCore.cpp b/src/Native/FactorizationMachineNative/FactorizationMachineCore.cpp new file mode 100644 index 0000000000..982b266683 --- /dev/null +++ b/src/Native/FactorizationMachineNative/FactorizationMachineCore.cpp @@ -0,0 +1,179 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include "../Stdafx.h" +#include +#include +#include +#include + +// Compute the output value of the field-aware factorization, as the sum of the linear part and the latent part. +// The linear part is the inner product of linearWeights and featureValues. +// The latent part is the sum of all intra-field interactions in one field f, for all fields possible. +EXPORT_API(void) CalculateIntermediateVariablesNative(int fieldCount, int latentDim, int count, _In_ int * fieldIndices, _In_ int * featureIndices, _In_ float * featureValues, + _In_ float * linearWeights, _In_ float * latentWeights, _Inout_ float * latentSum, _Out_ float * response) +{ + // The number of all possible fields. + const int m = fieldCount; + const int d = latentDim; + const int c = count; + const int * pf = fieldIndices; + const int * pi = featureIndices; + const float * px = featureValues; + const float * pw = linearWeights; + const float * pv = latentWeights; + float * pq = latentSum; + float linearResponse = 0; + float latentResponse = 0; + + memset(pq, 0, sizeof(float) * m * m * d); + __m128 _y = _mm_setzero_ps(); + __m128 _tmp = _mm_setzero_ps(); + + for (int i = 0; i < c; i++) + { + const int f = pf[i]; + const int j = pi[i]; + linearResponse += pw[j] * px[i]; + + const __m128 _x = _mm_load1_ps(px + i); + const __m128 _xx = _mm_mul_ps(_x, _x); + + // tmp -= * x * x + const int vBias = j * m * d + f * d; + + // j-th feature's latent vector in the f-th field hidden space. + const float * vjf = pv + vBias; + + for (int k = 0; k + 4 <= d; k += 4) + { + const __m128 _v = _mm_load_ps(vjf + k); + _tmp = _mm_sub_ps(_tmp, _mm_mul_ps(_mm_mul_ps(_v, _v), _xx)); + } + + for (int fprime = 0; fprime < m; fprime++) + { + const int vBias = j * m * d + fprime * d; + const int qBias = f * m * d + fprime * d; + const float * vjfprime = pv + vBias; + float * qffprime = pq + qBias; + + // q_f,f' += v_j,f' * x + for (int k = 0; k + 4 <= d; k += 4) + { + const __m128 _v = _mm_load_ps(vjfprime + k); + __m128 _q = _mm_load_ps(qffprime + k); + _q = _mm_add_ps(_q, _mm_mul_ps(_v, _x)); + _mm_store_ps(qffprime + k, _q); + } + } + } + + for (int f = 0; f < m; f++) + { + // tmp += + const float * qff = pq + f * m * d + f * d; + for (int k = 0; k + 4 <= d; k += 4) + { + __m128 _qff = _mm_load_ps(qff + k); + + // Intra-field interactions. + _tmp = _mm_add_ps(_tmp, _mm_mul_ps(_qff, _qff)); + } + + // y += , f != f' + // Whis loop handles inter - field interactions because f != f'. + for (int fprime = f + 1; fprime < m; fprime++) + { + const float * qffprime = pq + f * m * d + fprime * d; + const float * qfprimef = pq + fprime * m * d + f * d; + for (int k = 0; k + 4 <= d; k += 4) + { + // Inter-field interaction. + __m128 _qffprime = _mm_load_ps(qffprime + k); + __m128 _qfprimef = _mm_load_ps(qfprimef + k); + _y = _mm_add_ps(_y, _mm_mul_ps(_qffprime, _qfprimef)); + } + } + } + + _y = _mm_add_ps(_y, _mm_mul_ps(_mm_set_ps1(0.5f), _tmp)); + _tmp = _mm_add_ps(_y, _mm_movehl_ps(_y, _y)); + _y = _mm_add_ps(_tmp, _mm_shuffle_ps(_tmp, _tmp, 1)); // The lowest slot is the response value. + _mm_store_ss(&latentResponse, _y); + *response = linearResponse + latentResponse; +} + +// Calculate the stochastic gradient and update the model. +// The /*const*/ comment on the parameters of the function means that their values should not get altered by this function. +EXPORT_API(void) CalculateGradientAndUpdateNative(float lambdaLinear, float lambdaLatent, float learningRate, int fieldCount, int latentDim, float weight, int count, + _In_ int* /*const*/ fieldIndices, _In_ int* /*const*/ featureIndices, _In_ float* /*const*/ featureValues, _In_ float* /*const*/ latentSum, float slope, + _Inout_ float* linearWeights, _Inout_ float* latentWeights, _Inout_ float* linearAccumulatedSquaredGrads, _Inout_ float* latentAccumulatedSquaredGrads) +{ + const int m = fieldCount; + const int d = latentDim; + const int c = count; + const int * pf = fieldIndices; + const int * pi = featureIndices; + const float * px = featureValues; + const float * pq = latentSum; + float * pw = linearWeights; + float * pv = latentWeights; + float * phw = linearAccumulatedSquaredGrads; + float * phv = latentAccumulatedSquaredGrads; + + const __m128 _wei = _mm_set_ps1(weight); + const __m128 _s = _mm_set_ps1(slope); + const __m128 _lr = _mm_set_ps1(learningRate); + const __m128 _lambdav = _mm_set_ps1(lambdaLatent); + + for (int i = 0; i < count; i++) + { + const int f = pf[i]; + const int j = pi[i]; + + // Calculate gradient of linear term w_j. + float g = weight * (lambdaLinear * pw[j] + slope * px[i]); + + // Accumulate the gradient of the linear term. + phw[j] += g * g; + + // Perform ADAGRAD update rule to adjust linear term. + pw[j] -= learningRate / sqrt(phw[j]) * g; + + // Update latent term, v_j,f', f'=1,...,m. + const __m128 _x = _mm_load1_ps(px + i); + for (int fprime = 0; fprime < m; fprime++) + { + float * vjfprime = pv + j * m * d + fprime * d; + float * hvjfprime = phv + j * m * d + fprime * d; + const float * qfprimef = pq + fprime * m * d + f * d; + const __m128 _sx = _mm_mul_ps(_s, _x); + + for (int k = 0; k + 4 <= d; k += 4) + { + __m128 _v = _mm_load_ps(vjfprime + k); + __m128 _q = _mm_load_ps(qfprimef + k); + + // Calculate L2-norm regularization's gradient. + __m128 _g = _mm_mul_ps(_lambdav, _v); + + // Calculate loss function's gradient. + if (fprime != f) + _g = _mm_add_ps(_g, _mm_mul_ps(_sx, _q)); + else + _g = _mm_add_ps(_g, _mm_mul_ps(_sx, _mm_sub_ps(_q, _mm_mul_ps(_v, _x)))); + _g = _mm_mul_ps(_wei, _g); + + // Accumulate the gradient of latent vectors. + const __m128 _h = _mm_add_ps(_mm_load_ps(hvjfprime + k), _mm_mul_ps(_g, _g)); + + // Perform ADAGRAD update rule to adjust latent vector. + _v = _mm_sub_ps(_v, _mm_mul_ps(_lr, _mm_mul_ps(_mm_rsqrt_ps(_h), _g))); + _mm_store_ps(vjfprime + k, _v); + _mm_store_ps(hvjfprime + k, _h); + } + } + } +} diff --git a/src/Native/LdaNative/CMakeLists.txt b/src/Native/LdaNative/CMakeLists.txt new file mode 100644 index 0000000000..f2e1d340de --- /dev/null +++ b/src/Native/LdaNative/CMakeLists.txt @@ -0,0 +1,19 @@ +project (LdaNative) + +set(SOURCES + alias_multinomial_rng_int.cpp + data_block.cpp + hybrid_alias_map.cpp + hybrid_map.cpp + lda_document.cpp + lda_engine.cpp + lda_engine_export.cpp + light_doc_sampler.cpp + light_hash_map.cpp + model_block.cpp + utils.cpp +) + +add_library(LdaNative SHARED ${SOURCES} ${RESOURCES}) + +install_library_and_symbols (LdaNative) diff --git a/src/Native/LdaNative/alias_multinomial_rng_int.cpp b/src/Native/LdaNative/alias_multinomial_rng_int.cpp new file mode 100644 index 0000000000..a945feb6be --- /dev/null +++ b/src/Native/LdaNative/alias_multinomial_rng_int.cpp @@ -0,0 +1,49 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include "alias_multinomial_rng_int.hpp" +#include "rand_int_rng.h" +#include +#include +#include +#include + +namespace wood +{ + AliasMultinomialRNGInt::AliasMultinomialRNGInt() + : n_(-1), internal_memory_(nullptr) + { + + } + AliasMultinomialRNGInt::~AliasMultinomialRNGInt() + { + if (internal_memory_ != nullptr) + { + delete[]internal_memory_; + } + } + + int32_t AliasMultinomialRNGInt::Next(xorshift_rng& rng, std::vector& alias_kv) + { + // NOTE: stl uniform_real_distribution generates the highest quality random numbers + // yet, the other two are much faster + auto sample = rng.rand(); + + // NOTE: use std::floor is too slow + // here we guarantee sample * n_ is nonnegative, this makes cast work + int idx = sample / a_int_; + + if (n_ <= idx) + { + idx = n_ - 1; + } + + // the following code is equivalent to + // return sample < V_[idx] ? idx : K_[idx]; + // but faster, see + // http://stackoverflow.com/questions/6754454/speed-difference-between-if-else-and-ternary-operator-in-c + int m = -(sample < alias_kv[idx].v_); + return (idx & m) | (alias_kv[idx].k_ & ~m); + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/alias_multinomial_rng_int.hpp b/src/Native/LdaNative/alias_multinomial_rng_int.hpp new file mode 100644 index 0000000000..e25bc5bc17 --- /dev/null +++ b/src/Native/LdaNative/alias_multinomial_rng_int.hpp @@ -0,0 +1,454 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include "rand_int_rng.h" +#include +#include +/* +Algorithm described in +http://www.jstatsoft.org/v11/i03/paper +George Marsaglia +Fast generation of discrete random variables +*/ +namespace wood +{ + struct alias_k_v + { + int32_t k_; + int32_t v_; + }; + + class AliasMultinomialRNGInt + { + public: + AliasMultinomialRNGInt(); + ~AliasMultinomialRNGInt(); + + void Init(int K) + { + L_.resize(K); + H_.resize(K); + proportion_int_.resize(K); + internal_memory_ = new int32_t[2 * K]; + } + + void SetProportionMass(std::vector &proportion, + float mass, + std::vector &alias_kv, + int32_t *height, + xorshift_rng &rng) + { + n_ = (int32_t)proportion.size(); //proportion number should be kept within 2Billion + + mass_int_ = 0x7fffffff; + a_int_ = mass_int_ / n_; + mass_int_ = a_int_ * n_; + *height = a_int_; + + int64_t mass_sum = 0; //use int64_t to avoid overflowing + for (int i = 0; i < n_; ++i) + { + proportion[i] /= mass; + proportion_int_[i] = (int32_t)(proportion[i] * mass_int_); + mass_sum += proportion_int_[i]; + } + + if (mass_sum > mass_int_) + { + //Todo: is this data type safe? more is int and mass_sum is in64 + int32_t more = (int32_t)(mass_sum - mass_int_); + + int i = 0; + int id = 0; + int r = 0; + while (i < more) + { + if (proportion_int_[id] >= 1) + { + proportion_int_[id]--; + ++i; + } + id = (id + 1) % n_; + } + } + + if (mass_sum < mass_int_) + { + //Todo: is this data type safe? more is int and mass_sum is in64 + int32_t more = (int32_t)(mass_int_ - mass_sum); + + int i = 0; + int id = 0; + while (i < more) + { + proportion_int_[id]++; + id = (id + 1) % n_; + i++; + } + } + + for (int i = 0; i < n_; ++i) + { + alias_kv[i].k_ = i; + alias_kv[i].v_ = (i + 1) * a_int_; + } + + int32_t L_head = 0; + int32_t L_tail = 0; + + int32_t H_head = 0; + int32_t H_tail = 0; + + for (auto i = 0; i < proportion_int_.size(); ++i) + { + auto val = proportion_int_[i]; + if (val < a_int_) + { + L_[L_tail].first = i; + L_[L_tail].second = val; + ++L_tail; + } + else + { + H_[H_tail].first = i; + H_[H_tail].second = val; + ++H_tail; + } + } + + assert(L_tail + H_tail == n_); + + while (L_head != L_tail && H_head != H_tail) + { + auto &i_pi = L_[L_head++]; + auto &h_ph = H_[H_head++]; + + alias_kv[i_pi.first].k_ = h_ph.first; + alias_kv[i_pi.first].v_ = i_pi.first * a_int_ + i_pi.second; + + auto sum = h_ph.second + i_pi.second; + if (sum > 2 * a_int_) + { + H_[H_tail].first = h_ph.first; + H_[H_tail].second = sum - a_int_; + ++H_tail; + } + else + { + L_[L_tail].first = h_ph.first; + L_[L_tail].second = sum - a_int_; + ++L_tail; + } + } + while (L_head != L_tail) + { + auto first = L_[L_head].first; + auto second = L_[L_head].second; + alias_kv[first].k_ = first; + alias_kv[first].v_ = first * a_int_ + second; + ++L_head; + } + while (H_head != H_tail) + { + auto first = H_[H_head].first; + auto second = H_[H_head].second; + alias_kv[first].k_ = first; + alias_kv[first].v_ = first * a_int_ + second; + ++H_head; + } + + } + + inline void SetProportionMass(std::vector &proportion, + float mass, + int32_t* memory, + int32_t *height, + xorshift_rng &rng) + { + n_ = (int32_t)proportion.size(); + + mass_int_ = 0x7fffffff; + a_int_ = mass_int_ / n_; + mass_int_ = a_int_ * n_; + *height = a_int_; + + int64_t mass_sum = 0; + for (int i = 0; i < n_; ++i) + { + proportion[i] /= mass; + proportion_int_[i] = (int32_t)(proportion[i] * mass_int_); + mass_sum += proportion_int_[i]; + } + + if (mass_sum > mass_int_) + { + //Todo: is this data type safe? more is int and mass_sum is in64 + int32_t more = (int32_t)(mass_sum - mass_int_); + int i = 0; + int id = 0; + int r = 0; + while (i < more) + { + if (proportion_int_[id] >= 1) + { + proportion_int_[id]--; + ++i; + } + id = (id + 1) % n_; + } + } + + if (mass_sum < mass_int_) + { + //Todo: is this data type safe? more is int and mass_sum is in64 + int32_t more = (int32_t)(mass_int_ - mass_sum); + int i = 0; + int id = 0; + while (i < more) + { + proportion_int_[id]++; + id = (id + 1) % n_; + i++; + } + } + + for (int i = 0; i < n_; ++i) + { + int32_t *p = internal_memory_ + 2 * i; + *p = i; p++; + *p = (i + 1) * a_int_; + } + + int32_t L_head = 0; + int32_t L_tail = 0; + + int32_t H_head = 0; + int32_t H_tail = 0; + + for (auto i = 0; i < n_; ++i) + { + auto val = proportion_int_[i]; + if (val < a_int_) + { + L_[L_tail].first = i; + L_[L_tail].second = val; + ++L_tail; + } + else + { + H_[H_tail].first = i; + H_[H_tail].second = val; + ++H_tail; + } + } + + assert(L_tail + H_tail == n_); + + while (L_head != L_tail && H_head != H_tail) + { + auto &i_pi = L_[L_head++]; + auto &h_ph = H_[H_head++]; + + int32_t *p = internal_memory_ + 2 * i_pi.first; + *p = h_ph.first; p++; + *p = i_pi.first * a_int_ + i_pi.second; + + auto sum = h_ph.second + i_pi.second; + if (sum > 2 * a_int_) + { + H_[H_tail].first = h_ph.first; + H_[H_tail].second = sum - a_int_; + ++H_tail; + } + else + { + L_[L_tail].first = h_ph.first; + L_[L_tail].second = sum - a_int_; + ++L_tail; + } + } + while (L_head != L_tail) + { + auto first = L_[L_head].first; + auto second = L_[L_head].second; + + int32_t *p = internal_memory_ + 2 * first; + *p = first; p++; + *p = first * a_int_ + second; + ++L_head; + } + while (H_head != H_tail) + { + auto first = H_[H_head].first; + auto second = H_[H_head].second; + + int32_t *p = internal_memory_ + 2 * first; + *p = first; p++; + *p = first * a_int_ + second; + ++H_head; + } + memcpy(memory, internal_memory_, sizeof(int32_t)* 2 * n_); + } + + inline void SetProportionMass(std::vector &proportion, + int32_t size, + float mass, + int32_t* memory, + int32_t *height, + xorshift_rng &rng, + int32_t word_id) + { + n_ = size; + + mass_int_ = 0x7fffffff; + a_int_ = mass_int_ / n_; + mass_int_ = a_int_ * n_; + *height = a_int_; + + int64_t mass_sum = 0; + for (int i = 0; i < n_; ++i) + { + proportion[i] /= mass; + proportion_int_[i] = (int32_t)(proportion[i] * mass_int_); + mass_sum += proportion_int_[i]; + } + + if (mass_sum > mass_int_) + { + //Todo: is this data type safe? more is int and mass_sum is in64 + int32_t more = (int32_t)(mass_sum - mass_int_); + + int i = 0; + int id = 0; + int r = 0; + while (i < more) + { + if (proportion_int_[id] >= 1) + { + proportion_int_[id]--; + ++i; + } + id = (id + 1) % n_; + } + } + + if (mass_sum < mass_int_) + { + //Todo: is this data type safe? more is int and mass_sum is in64 + int32_t more = (int32_t)(mass_int_ - mass_sum); + + int i = 0; + int id = 0; + while (i < more) + { + proportion_int_[id]++; + id = (id + 1) % n_; + i++; + } + } + + int32_t L_head = 0; + int32_t L_tail = 0; + int32_t H_head = 0; + int32_t H_tail = 0; + + for (int i = 0; i < n_; ++i) + { + int32_t *p = memory + 2 * i; + *p = i; p++; + *p = (i + 1) * a_int_; + } + + for (auto i = 0; i < n_; ++i) + { + auto val = proportion_int_[i]; + if (val < a_int_) + { + L_[L_tail].first = i; + L_[L_tail].second = val; + ++L_tail; + } + else + { + H_[H_tail].first = i; + H_[H_tail].second = val; + ++H_tail; + } + } + + assert(L_tail + H_tail == n_); + + while (L_head != L_tail && H_head != H_tail) + { + auto &i_pi = L_[L_head++]; + auto &h_ph = H_[H_head++]; + + int32_t *p = memory + 2 * i_pi.first; + *p = h_ph.first; p++; + *p = i_pi.first * a_int_ + i_pi.second; + + auto sum = h_ph.second + i_pi.second; + if (sum > 2 * a_int_) + { + H_[H_tail].first = h_ph.first; + H_[H_tail].second = sum - a_int_; + ++H_tail; + } + else + { + L_[L_tail].first = h_ph.first; + L_[L_tail].second = sum - a_int_; + ++L_tail; + } + } + while (L_head != L_tail) + { + auto first = L_[L_head].first; + auto second = L_[L_head].second; + int32_t *p = memory + 2 * first; + *p = first; p++; + *p = first * a_int_ + second; + ++L_head; + } + while (H_head != H_tail) + { + auto first = H_[H_head].first; + auto second = H_[H_head].second; + int32_t *p = memory + 2 * first; + + *p = first; p++; + *p = first * a_int_ + second; + ++H_head; + } + } + + // Make sure to call SetProportion or SetProportionMass before calling Next + int32_t Next(xorshift_rng& rng, std::vector& alias_kv); + + private: + void GenerateAliasTable(std::vector& alias_kv); + + public: + AliasMultinomialRNGInt(const AliasMultinomialRNGInt &other) = delete; + AliasMultinomialRNGInt& operator=(const AliasMultinomialRNGInt &other) = delete; + + std::vector proportion_int_; + int32_t *internal_memory_; + + int32_t n_; + int32_t a_int_; + int32_t mass_int_; + + std::vector> L_; + std::vector> H_; + }; +} \ No newline at end of file diff --git a/src/Native/LdaNative/data_block.cpp b/src/Native/LdaNative/data_block.cpp new file mode 100644 index 0000000000..11b56b9ad7 --- /dev/null +++ b/src/Native/LdaNative/data_block.cpp @@ -0,0 +1,117 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include +#include "data_block.h" +#include "lda_document.h" + +namespace lda +{ + LDADataBlock::LDADataBlock(int32_t num_threads) : + num_threads_(num_threads), has_read_(false), index_document_(0), documents_buffer_(nullptr), offset_buffer_(nullptr) + { + } + + LDADataBlock::~LDADataBlock() + { + if (has_read_) + { + delete[] offset_buffer_; + delete[] documents_buffer_; + } + } + + void LDADataBlock::Clear() + { + has_read_ = false; + index_document_ = 0; + used_size_ = 0; + + num_documents_ = 0; + corpus_size_ = 0; + + if (offset_buffer_) + { + delete[]offset_buffer_; + offset_buffer_ = nullptr; + } + if (documents_buffer_) + { + delete[]documents_buffer_; + documents_buffer_ = nullptr; + } + } + + void LDADataBlock::Allocate(const int32_t num_document, const int64_t corpus_size) + { + num_documents_ = num_document; + corpus_size_ = corpus_size; + + offset_buffer_ = new int64_t[num_documents_ + 1]; // +1: one for the end of last document, + documents_buffer_ = new int32_t[corpus_size_]; + + index_document_ = 0; + used_size_ = 0; + + offset_buffer_[0] = 0; + } + + + //term_id, term_freq, term_num + int LDADataBlock::Add(int32_t* term_id, int32_t* term_freq, int32_t term_num) + { + int64_t data_length = 1; + + int64_t idx = offset_buffer_[index_document_] + 1; + for (int i = 0; i < term_num; ++i) + { + for (int j = 0; j < term_freq[i]; ++j) + { + documents_buffer_[idx++] = term_id[i]; + documents_buffer_[idx++] = 0; + data_length += 2; + } + } + + index_document_++; + used_size_ += data_length; + + offset_buffer_[index_document_] = used_size_; + has_read_ = true; + + return (int)data_length; + } + + int LDADataBlock::AddDense(int32_t* term_freq, int32_t term_num) + { + int64_t data_length = 1; + + int64_t idx = offset_buffer_[index_document_] + 1; + for (int i = 0; i < term_num; ++i) + { + for (int j = 0; j < term_freq[i]; ++j) + { + documents_buffer_[idx++] = i; + documents_buffer_[idx++] = 0; + data_length += 2; + } + } + + index_document_++; + used_size_ += data_length; + + offset_buffer_[index_document_] = used_size_; + has_read_ = true; + + return (int)data_length; + } + + std::shared_ptr LDADataBlock::GetOneDoc(int32_t index) const + { + std::shared_ptr returned_ptr( + new LDADocument(documents_buffer_ + offset_buffer_[index], + documents_buffer_ + offset_buffer_[index + 1])); + return returned_ptr; + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/data_block.h b/src/Native/LdaNative/data_block.h new file mode 100644 index 0000000000..9f0894a858 --- /dev/null +++ b/src/Native/LdaNative/data_block.h @@ -0,0 +1,70 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once + +#include +#include +#include +#include "light_hash_map.h" + +namespace lda +{ + class LDADocument; + class LDADataBlock + { + public: + explicit LDADataBlock(int32_t num_threads); + ~LDADataBlock(); + + void Clear(); + //in data feedin scenario + void Allocate(const int32_t num_document, const int64_t corpus_size); + //port the data from external process, e.g. c# + int AddDense(int32_t* term_freq, int32_t term_num); + int Add(int32_t* term_id, int32_t* term_freq, int32_t term_num); + std::shared_ptr GetOneDoc(int32_t index) const; + + inline int32_t num_documents() const; + // Return the first document for thread thread_id + inline int32_t Begin(int32_t thread_id) const; + // Return the next to last document for thread thread_i + inline int32_t End(int32_t thread_id) const; + + + private: + LDADataBlock(const LDADataBlock& other) = delete; + LDADataBlock& operator=(const LDADataBlock& other) = delete; + + int32_t num_threads_; + bool has_read_; // equal true if LDADataBlock holds memory + + int32_t index_document_; + int64_t used_size_; + + int32_t num_documents_; + int64_t corpus_size_; + + int64_t* offset_buffer_; // offset_buffer_ size = num_document_ + 1 + int32_t* documents_buffer_; // documents_buffer_ size = corpus_size_; + }; + + inline int32_t LDADataBlock::num_documents() const + { + return num_documents_; + } + inline int32_t LDADataBlock::Begin(int32_t thread_id) const + { + int32_t num_of_one_doc = num_documents_ / num_threads_; + return thread_id * num_of_one_doc; + } + + inline int32_t LDADataBlock::End(int32_t thread_id) const + { + if (thread_id == num_threads_ - 1) // last thread + return num_documents_; + int32_t num_of_one_doc = num_documents_ / num_threads_; + return (thread_id + 1) * num_of_one_doc; + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/hybrid_alias_map.cpp b/src/Native/LdaNative/hybrid_alias_map.cpp new file mode 100644 index 0000000000..fcbeee3806 --- /dev/null +++ b/src/Native/LdaNative/hybrid_alias_map.cpp @@ -0,0 +1,198 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include +#include +#include +#include "utils.hpp" +#include +#include "hybrid_alias_map.h" + +namespace lda +{ + hybrid_alias_map::hybrid_alias_map() + :memory_(nullptr), + is_dense_(1), + kv_(nullptr), + idx_(nullptr), + capacity_(0), + size_(0), + mass_(0), + n_kw_mass_(0.0), + beta_mass_(0.0) + { + } + hybrid_alias_map::hybrid_alias_map(int32_t *memory, int32_t is_dense, int32_t capacity) + :memory_(memory), + is_dense_(is_dense), + capacity_(capacity), + kv_(nullptr), + idx_(nullptr), + size_(0), + mass_(0), + n_kw_mass_(0.0), + beta_mass_(0.0) + { + if (is_dense_) + { + kv_ = memory_; + idx_ = nullptr; + } + else + { + kv_ = memory_; + idx_ = memory_ + capacity_ * 2; + } + } + + hybrid_alias_map::hybrid_alias_map(const hybrid_alias_map &other) + { + this->memory_ = other.memory_; + this->is_dense_ = other.is_dense_; + this->capacity_ = other.capacity_; + + this->kv_ = other.kv_; + this->idx_ = other.idx_; + this->height_ = other.height_; + this->size_ = other.size_; + + this->mass_ = other.mass_; + this->n_kw_mass_ = other.n_kw_mass_; + this->beta_mass_ = other.beta_mass_; + } + hybrid_alias_map& hybrid_alias_map::operator=(const hybrid_alias_map &other) + { + this->memory_ = other.memory_; + this->is_dense_ = other.is_dense_; + this->capacity_ = other.capacity_; + + this->kv_ = other.kv_; + this->idx_ = other.idx_; + this->height_ = other.height_; + this->size_ = other.size_; + + this->mass_ = other.mass_; + this->n_kw_mass_ = other.n_kw_mass_; + this->beta_mass_ = other.beta_mass_; + + return *this; + } + + void hybrid_alias_map::clear() + { + size_ = 0; + } + + std::string hybrid_alias_map::DebugString() + { + std::string str = ""; + + if (size_ == 0) + { + return str; + } + + str += "is_dense:" + std::to_string(is_dense_) + " height:" + std::to_string(height_) + " mass:" + std::to_string(n_kw_mass_); + if (is_dense_) + { + for (int i = 0; i < capacity_; ++i) + { + str += " " + std::to_string(i) + ":" + std::to_string(*(memory_ + 2 * i)) + ":" + std::to_string(*(memory_ + 2 * i + 1)); + } + } + else + { + for (int i = 0; i < size_; ++i) + { + str += " " + std::to_string(idx_[i]) + ":" + std::to_string(*(memory_ + 2 * i)) + ":" + std::to_string(*(memory_ + 2 * i + 1)); + } + } + + return str; + } + + void hybrid_alias_map::build_table( + wood::AliasMultinomialRNGInt &alias_rng, + const hybrid_map &word_topic_row, + const std::vector &summary_row, + std::vector &q_w_proportion, + float beta, + float beta_sum, + int word_id, + wood::xorshift_rng &rng) + { + if (is_dense_) + { + size_ = capacity_; + mass_ = 0.0; + for (int k = 0; k < capacity_; ++k) + { + int32_t n_kw = word_topic_row[k]; + float prop = (n_kw + beta) / (summary_row[k] + beta_sum); + q_w_proportion[k] = prop; + mass_ += prop; + } + if (size_ == 0) + { + return; + } + alias_rng.SetProportionMass(q_w_proportion, mass_, memory_, &height_, rng); + + } + else + { + if (word_topic_row.is_dense()) + { + size_ = 0; + n_kw_mass_ = 0.0; + for (int k = 0; k < word_topic_row.capacity_; ++k) + { + if (word_topic_row.memory_[k] == 0) continue; + int32_t n_tw = word_topic_row.memory_[k]; + int64_t n_t = summary_row[k]; + q_w_proportion[size_] = n_tw / (n_t + beta_sum); + idx_[size_] = k; + n_kw_mass_ += q_w_proportion[size_]; + ++size_; + } + + if (size_ == 0) + { + // it is possible that, the local tf of a word is zero + return; + } + alias_rng.SetProportionMass(q_w_proportion, size_, n_kw_mass_, memory_, &height_, rng, word_id); + } + else + { + size_ = 0; + n_kw_mass_ = 0.0; + int32_t row_capacity = word_topic_row.capacity_; + for (int k = 0; k < row_capacity; ++k) + { + int32_t key = word_topic_row.key_[k]; + if (key > 0) + { + int32_t n_kw = word_topic_row.value_[k]; + float prop = n_kw / (summary_row[key - 1] + beta_sum); + + + + q_w_proportion[size_] = prop; + idx_[size_] = word_topic_row.key_[k] - 1; // minus one from the the internal key + n_kw_mass_ += prop; + + ++size_; + } + } + if (size_ == 0) + { + // it is possible that, the local tf of a word is zero + return; + } + alias_rng.SetProportionMass(q_w_proportion, size_, n_kw_mass_, memory_, &height_, rng, word_id); + } + } + } +} diff --git a/src/Native/LdaNative/hybrid_alias_map.h b/src/Native/LdaNative/hybrid_alias_map.h new file mode 100644 index 0000000000..f62b1e33af --- /dev/null +++ b/src/Native/LdaNative/hybrid_alias_map.h @@ -0,0 +1,128 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once +#include +#include +#include +#include +#include +#include +#include "alias_multinomial_rng_int.hpp" +#include "hybrid_map.h" + +namespace lda +{ + class hybrid_alias_map + { + public: + + hybrid_alias_map(); + hybrid_alias_map(int32_t *memory, int32_t is_dense, int32_t capacity); + hybrid_alias_map(const hybrid_alias_map &other); + hybrid_alias_map& operator=(const hybrid_alias_map &other); + + void clear(); + inline int32_t size() const; + + std::string DebugString(); + void build_table( + wood::AliasMultinomialRNGInt &alias_rng, + const hybrid_map &word_topic_row, + const std::vector &summary_row, + std::vector &q_w_proportion, + float beta, + float beta_sum, + int word_id, + wood::xorshift_rng &rng); + + inline int32_t next(wood::xorshift_rng &rng, int32_t beta_height, float beta_mass, std::vector &beta_k_v, bool debug); + + private: + int32_t *memory_; + int32_t is_dense_; + int32_t *kv_; + int32_t *idx_; + int32_t height_; + int32_t capacity_; + int32_t size_; + + float mass_; + float n_kw_mass_; + float beta_mass_; + }; + + inline int32_t hybrid_alias_map::size() const + { + return size_; + } + + inline int32_t hybrid_alias_map::next(wood::xorshift_rng &rng, int32_t beta_height, float beta_mass, std::vector &beta_k_v, bool debug) + { + //NOTE: here we will set those unseen words' topic to 0. logicall we could set it to random as well. + if (capacity_ == 0) + { + return 0; + } + + if (is_dense_) + { + auto sample = rng.rand(); + int idx = sample / height_; + if (idx >= size_) + { + idx = size_ - 1; + } + + int32_t *p = memory_ + 2 * idx; + int32_t k = *p; + p++; + int32_t v = *p; + int32_t m = -(sample < v); + return (idx & m) | (k & ~m); + } + else + { + float sample = rng.rand_real() * (n_kw_mass_ + beta_mass); + if (sample < n_kw_mass_) + { + auto n_kw_sample = rng.rand(); + int32_t idx = n_kw_sample / height_; + + if (idx >= size_) + { + idx = size_ - 1; + } + + + int32_t *p = memory_ + 2 * idx; + int32_t k = *p; p++; + int32_t v = *p; + int32_t id = idx_[idx]; + int32_t k_id = idx_[k]; + + int32_t m = -(n_kw_sample < v); + return (id & m) | (k_id & ~m); + + } + else + { + auto sampleLocal = rng.rand(); + int idx = sampleLocal / beta_height; + int beta_size = (int)beta_k_v.size(); + + if (idx >= beta_size) + { + idx = beta_size - 1; + } + + int32_t k = beta_k_v[idx].k_; + int32_t v = beta_k_v[idx].v_; + int32_t m = -(sampleLocal < v); + return (idx & m) | (k & ~m); + } + } + } + +} \ No newline at end of file diff --git a/src/Native/LdaNative/hybrid_map.cpp b/src/Native/LdaNative/hybrid_map.cpp new file mode 100644 index 0000000000..e5c8252702 --- /dev/null +++ b/src/Native/LdaNative/hybrid_map.cpp @@ -0,0 +1,142 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include +#include +#include +#include "utils.hpp" +#include +#include "hybrid_map.h" + +namespace lda +{ + hybrid_map::hybrid_map() + :memory_(nullptr), + is_dense_(1), + capacity_(0), + empty_key_(0), + deleted_key_(-1), + key_(nullptr), + value_(nullptr), + num_deleted_key_(0), + external_rehash_buf_(nullptr) + { + } + hybrid_map::hybrid_map(int32_t *memory, int32_t is_dense, int32_t capacity, int32_t num_deleted_key + , int32_t *external_rehash_buf_) + : memory_(memory), + is_dense_(is_dense), + capacity_(capacity), + empty_key_(0), + deleted_key_(-1), + key_(nullptr), + value_(nullptr), + num_deleted_key_(num_deleted_key), + external_rehash_buf_(external_rehash_buf_) + { + if (is_dense_ == 0) { + key_ = memory_; + value_ = memory_ + capacity_; + } + } + + hybrid_map::hybrid_map(const hybrid_map &other) + { + this->memory_ = other.memory_; + this->is_dense_ = other.is_dense_; + this->capacity_ = other.capacity_; + empty_key_ = other.empty_key_; + deleted_key_ = other.deleted_key_; + num_deleted_key_ = other.num_deleted_key_; + external_rehash_buf_ = other.external_rehash_buf_; + if (this->is_dense_) + { + this->key_ = nullptr; + this->value_ = nullptr; + } + else + { + this->key_ = this->memory_; + this->value_ = this->memory_ + capacity_; + } + + } + hybrid_map& hybrid_map::operator=(const hybrid_map &other) + { + this->memory_ = other.memory_; + this->is_dense_ = other.is_dense_; + this->capacity_ = other.capacity_; + empty_key_ = other.empty_key_; + deleted_key_ = other.deleted_key_; + num_deleted_key_ = other.num_deleted_key_; + external_rehash_buf_ = other.external_rehash_buf_; + if (this->is_dense_) + { + this->key_ = nullptr; + this->value_ = nullptr; + } + else + { + this->key_ = this->memory_; + this->value_ = this->memory_ + capacity_; + } + return *this; + } + + void hybrid_map::clear() + { + int32_t memory_size = is_dense_ ? capacity_ : 2 * capacity_; + memset(memory_, 0, memory_size * sizeof(int32_t)); + } + + std::string hybrid_map::DumpString() const + { + if (is_dense_) + { + std::string result; + for (int i = 0; i < capacity_; ++i) + { + if (memory_[i] != 0) + { + result += std::to_string(i) + ":" + std::to_string(memory_[i]) + " "; + } + } + return result; + } + else + { + std::string result; + for (int i = 0; i < capacity_; ++i) + { + if (key_[i] > 0) + { + result += std::to_string(key_[i] - 1) + ":" + std::to_string(value_[i]) + " "; + } + } + return result; + } + } + + void hybrid_map::sorted_rehashing() + { + if (!is_dense_) + { + std::map rehash_buffer; + for (int i = 0; i < capacity_; ++i) + { + if (key_[i] > 0) + { + rehash_buffer[key_[i] - 1] = value_[i]; + } + } + memset(memory_, 0, 2 * capacity_ * sizeof(int32_t)); + for (auto it = rehash_buffer.begin(); + it != rehash_buffer.end(); ++it) + { + inc(it->first, it->second); + } + } + } + +} diff --git a/src/Native/LdaNative/hybrid_map.h b/src/Native/LdaNative/hybrid_map.h new file mode 100644 index 0000000000..88bbc82d5b --- /dev/null +++ b/src/Native/LdaNative/hybrid_map.h @@ -0,0 +1,238 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once +#include +#include +#include +#include +#include +#include +#include + +// The probing method: +// Linear probing +// #define JUMP_(key, num_probes) ( 1 ) + +// Quadratic probing +#define JUMP_(key, num_probes) ( num_probes ) +#define ILLEGAL_BUCKET -1 + +namespace lda +{ + class hybrid_alias_map; + + class hybrid_map + { + friend class hybrid_alias_map; + public: + hybrid_map(); + hybrid_map(int32_t *memory, int32_t is_dense, int32_t capacity, int32_t num_deleted_key + , int32_t *external_rehash_buf_); + hybrid_map(const hybrid_map &other); + hybrid_map& operator=(const hybrid_map &other); + + + void clear(); + std::string DumpString() const; + void sorted_rehashing(); + + inline int32_t nonzero_num() const; + inline bool is_dense() const; + inline int32_t capacity() const; + inline int32_t *memory() const; + inline int32_t* key() const; + inline int32_t* value() const; + inline void rehashing(); + inline void inc(int32_t key, int32_t delta); + // query the value of |key| + // if |key| is in the table, return the |value| corresonding to |key| + // if not, just return 0 + inline int32_t operator[](int32_t key) const; + + private: + inline std::pair find_position(const int32_t key) const; + + int32_t *memory_; + int32_t is_dense_; + int32_t *key_; + int32_t *value_; + + // if |is_dense_| == true, capactiy_ is the length of an array + // if |is dense_| == false, capacity_ is the size of a light hash table + int32_t capacity_; + int32_t empty_key_; + int32_t deleted_key_; + + int32_t num_deleted_key_; + int32_t* external_rehash_buf_; + }; + + inline int32_t hybrid_map::nonzero_num() const + { + if (is_dense_) + { + int32_t size = 0; + for (int i = 0; i < capacity_; ++i) + { + if (memory_[i] > 0) + { + ++size; + } + } + return size; + } + else + { + int32_t size = 0; + for (int i = 0; i < capacity_; ++i) + { + if (key_[i] > 0) + { + ++size; + } + } + return size; + } + } + + inline bool hybrid_map::is_dense() const + { + return is_dense_ != 0; + } + + inline int32_t hybrid_map::capacity() const + { + return capacity_; + } + + inline int32_t* hybrid_map::memory() const + { + return memory_; + } + inline int32_t* hybrid_map::key() const + { + return key_; + } + inline int32_t* hybrid_map::value() const + { + return value_; + } + inline void hybrid_map::rehashing() + { + if (!is_dense_) + { + memcpy(external_rehash_buf_, memory_, 2 * capacity_ * sizeof(int32_t)); + int32_t *key = external_rehash_buf_; + int32_t *value = external_rehash_buf_ + capacity_; + memset(memory_, 0, 2 * capacity_ * sizeof(int32_t)); + for (int i = 0; i < capacity_; ++i) + { + if (key[i] > 0) + { + inc(key[i] - 1, value[i]); + } + } + num_deleted_key_ = 0; + } + } + inline void hybrid_map::inc(int32_t key, int32_t delta) + { + if (is_dense_) + { + memory_[key] += delta; + } + else + { + int32_t internal_key = key + 1; + std::pair pos = find_position(internal_key); + if (pos.first != ILLEGAL_BUCKET) + { + value_[pos.first] += delta; + if (value_[pos.first] == 0) // the value becomes zero, delete the key + { + key_[pos.first] = deleted_key_; + + ++num_deleted_key_; // num_deleted_key ++ + if (num_deleted_key_ * 20 > capacity_) + { + rehashing(); + } + } + } + else // not found the key, insert it with delta as value + { + key_[pos.second] = internal_key; + value_[pos.second] = delta; + } + } + } + + // query the value of |key| + // if |key| is in the table, return the |value| corresonding to |key| + // if not, just return 0 + inline int32_t hybrid_map::operator[](int32_t key) const + { + if (is_dense_) + { + //return memory_[key]; + if (capacity_ > 0) + { + return memory_[key]; + } + else + { + return 0; + } + } + else + { + int32_t internal_key = key + 1; + std::pair pos = find_position(internal_key); + if (pos.first != ILLEGAL_BUCKET) + { + return value_[pos.first]; + } + else + { + return 0; + } + } + } + inline std::pair hybrid_map::find_position(const int32_t key) const + { + int num_probes = 0; + int32_t capacity_minus_one = capacity_ - 1; + int32_t idx = key % capacity_; + int32_t insert_pos = ILLEGAL_BUCKET; + while (1) // probe until something happens + { + if (key_[idx] == empty_key_) // bucket is empty + { + if (insert_pos == ILLEGAL_BUCKET) // found no prior place to insert + { + return std::pair(ILLEGAL_BUCKET, idx); + } + else // previously, there is a position to insert + { + return std::pair(ILLEGAL_BUCKET, insert_pos); + } + } + else if (key_[idx] == deleted_key_) // keep searching, but makr to insert + { + if (insert_pos == ILLEGAL_BUCKET) + { + insert_pos = idx; + } + } + else if (key_[idx] == key) + { + return std::pair(idx, ILLEGAL_BUCKET); + } + ++num_probes; // we are doing another probe + idx = (idx + JUMP_(key, num_probes) & capacity_minus_one); + assert(num_probes < capacity_); // && "Hashtable is full: an error in key_equal<> or hash<>"); + } + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/lda_document.cpp b/src/Native/LdaNative/lda_document.cpp new file mode 100644 index 0000000000..c2a3371020 --- /dev/null +++ b/src/Native/LdaNative/lda_document.cpp @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include "lda_document.h" + +namespace lda +{ + LDADocument::LDADocument(int32_t* memory_begin, int32_t* memory_end) : + memory_begin_(memory_begin), memory_end_(memory_end), cursor_(*memory_begin) {} + + // should be called when sweeped over all the tokens in a document + void LDADocument::ResetCursor() + { + cursor_ = 0; + } + void LDADocument::GetDocTopicCounter(lda::light_hash_map& doc_topic_counter) + { + int32_t* p = memory_begin_ + 2; + int32_t num = 0; + while (p < memory_end_) + { + doc_topic_counter.inc(*p, 1); + ++p; ++p; + if (++num == 512) + return; + } + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/lda_document.h b/src/Native/LdaNative/lda_document.h new file mode 100644 index 0000000000..45df42f06c --- /dev/null +++ b/src/Native/LdaNative/lda_document.h @@ -0,0 +1,60 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once + +#include +#include +#include +#include "light_hash_map.h" + +namespace lda +{ + class LDADocument + { + public: + const int32_t kMaxSizeLightHash = 512; // This is for the easy use of LightHashMap + + LDADocument(int32_t* memory_begin, int32_t* memory_end); + + inline int32_t size() const; + inline int32_t& get_cursor(); + inline int32_t Word(int32_t index) const; + inline int32_t Topic(int32_t index) const; + inline void SetTopic(int32_t index, int32_t topic); + + // should be called when sweeped over all the tokens in a document + void ResetCursor(); + void GetDocTopicCounter(lda::light_hash_map& doc_topic_counter); + + private: + LDADocument(const LDADocument &other) = delete; + LDADocument& operator=(const LDADocument &other) = delete; + + int32_t* memory_begin_; + int32_t* memory_end_; + int32_t& cursor_; // cursor_ is reference of *memory_begin_ + }; + + inline int32_t LDADocument::size() const + { + return (std::min)(static_cast((memory_end_ - memory_begin_) / 2), kMaxSizeLightHash); + } + inline int32_t& LDADocument::get_cursor() + { + return cursor_; + } + inline int32_t LDADocument::Word(int32_t index) const + { + return *(memory_begin_ + 1 + index * 2); + } + inline int32_t LDADocument::Topic(int32_t index) const + { + return *(memory_begin_ + 2 + index * 2); + } + inline void LDADocument::SetTopic(int32_t index, int32_t topic) + { + *(memory_begin_ + 2 + index * 2) = topic; + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/lda_engine.cpp b/src/Native/LdaNative/lda_engine.cpp new file mode 100644 index 0000000000..5650ce73b5 --- /dev/null +++ b/src/Native/LdaNative/lda_engine.cpp @@ -0,0 +1,1066 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "timer.h" +#include "rand_int_rng.h" +#include "lda_document.h" +#include "data_block.h" +#include "model_block.h" +#include "lda_engine.hpp" +#include "utils.hpp" +#include "simple_barrier.h" +#include "light_doc_sampler.hpp" + +#ifdef _MSC_VER +#include "windows.h" +#elif defined(__APPLE__) +#include +#include +#include +#else +#include "sched.h" +#endif + +namespace lda { + LdaEngine::LdaEngine(int numTopic, + int numVocab, + float alphaSum, + float beta, + int numIter, + int likelihoodInterval, + int numThread, + int mhstep, + int maxDocToken) + : K_(numTopic), + V_(numVocab), + compute_ll_interval_(likelihoodInterval), + beta_(beta), + num_iterations_(numIter), + mh_step_(mhstep), + alpha_sum_(alphaSum), + maxDocToken_(maxDocToken), + samplers_(nullptr), + document_buffer_(nullptr) + { + if (numThread > 0) + { + num_threads_ = numThread; + } + else + { + unsigned int uNumCPU = std::thread::hardware_concurrency(); + num_threads_ = std::max(1, (int)(uNumCPU - 2)); + } + printf("using %d thread(s) to do train/test\n", num_threads_); + + bAlphaSumMultiplied = false; + atomic_stats_ = new LDAEngineAtomics(); + model_block_ = new LDAModelBlock(); + data_block_ = new LDADataBlock(num_threads_); + process_barrier_ = new SimpleBarrier(num_threads_); + samplerQueue_ = new CBlockedIntQueue(); + + document_buffer_ = new int32_t*[num_threads_]; + for (int i = 0; i < num_threads_; i++) + document_buffer_[i] = new int32_t[maxDocToken_ * 2 + 1]; + + likelihood_in_iter_ = nullptr; + + beta_sum_ = beta_ * V_; + } + + LdaEngine::LdaEngine(int32_t K, int32_t V, int32_t num_threads, int32_t compute_ll_interval, float beta, int32_t num_iterations, int32_t mh_step, float alpha_sum, int maxDocToken) + : K_(K), + V_(V), + compute_ll_interval_(compute_ll_interval), + beta_(beta), + num_iterations_(num_iterations), + mh_step_(mh_step), + alpha_sum_(alpha_sum), + maxDocToken_(maxDocToken), + samplers_(nullptr), + document_buffer_(nullptr) + { + if (num_threads > 0) + { + num_threads_ = num_threads; + } + else + { + unsigned int uNumCPU = std::thread::hardware_concurrency(); + num_threads_ = std::max(1, (int)(uNumCPU - 2)); + } + bAlphaSumMultiplied = false; + process_barrier_ = new SimpleBarrier(num_threads_); + atomic_stats_ = new LDAEngineAtomics(); + data_block_ = new LDADataBlock(num_threads_); + model_block_ = new LDAModelBlock(); + samplerQueue_ = new CBlockedIntQueue(); + + document_buffer_ = new int32_t*[num_threads_]; + for (int i = 0; i < num_threads_; i++) + document_buffer_[i] = new int32_t[maxDocToken_ * 2 + 1]; + + likelihood_in_iter_ = nullptr; + beta_sum_ = beta_ * V_; + } + + + LdaEngine::~LdaEngine() + { + //delete memory space + delete process_barrier_; + process_barrier_ = nullptr; + + delete data_block_; + data_block_ = nullptr; + + delete atomic_stats_; + atomic_stats_ = nullptr; + + delete model_block_; + model_block_ = nullptr; + + delete samplerQueue_; + samplerQueue_ = nullptr; + + for (int i = 0; i < num_threads_; ++i) + { + delete samplers_[i]; + } + delete[] samplers_; + + if (document_buffer_) + { + for (int i = 0; i < num_threads_; ++i) + { + delete[]document_buffer_[i]; + document_buffer_[i] = nullptr; + } + delete[]document_buffer_; + document_buffer_ = nullptr; + } + + if (likelihood_in_iter_) + { + delete[] likelihood_in_iter_; + likelihood_in_iter_ = nullptr; + } + } + + bool LdaEngine::InitializeBeforeTrain() + { + CTimer tmDebug(true); + CheckFunction(0, tmDebug, "enter initializeBeforeTrain", false); + //allocate model memory from the data preloaded + AllocateModelMemory(data_block_); + CheckFunction(0, tmDebug, "allocate model memory", false); + + double alloc_start = lda::get_time(); + global_word_topic_table_.resize(V_); + alias_rng_int_.Init(K_); + beta_k_v_.resize(K_); + global_alias_k_v_.resize(V_); + + for (int i = 0; i < V_; ++i) + { + global_alias_k_v_[i] = model_block_->get_alias_row(i); + } + global_summary_row_.resize(K_); + CheckFunction(0, tmDebug, "initlaizing global tables used in sampling", false); + + word_range_for_each_thread_.resize(num_threads_ + 1); + int32_t word_num_each_thread = V_ / num_threads_; + word_range_for_each_thread_[0] = 0; + for (int32_t i = 0; i < num_threads_ - 1; ++i) + { + word_range_for_each_thread_[i + 1] = word_range_for_each_thread_[i] + word_num_each_thread; + } + word_range_for_each_thread_[num_threads_] = V_; + + //setup sampler + samplers_ = new LightDocSampler*[num_threads_]; + samplerQueue_->clear(); + + for (int i = 0; i < num_threads_; ++i) + { + samplers_[i] = new LightDocSampler( + K_, + V_, + num_threads_, + mh_step_, + beta_, + alpha_sum_, + global_word_topic_table_, + global_summary_row_, + global_alias_k_v_, + beta_height_, + beta_mass_, + beta_k_v_); + + samplerQueue_->push(i); + } + CheckFunction(0, tmDebug, "create samplers", false); + return true; + } + + void LdaEngine::InitializeBeforeTest() + { + // TODO: + // Allocating space for word-topic-table and alias table according to the input data of SetModel interface (done) + // Create multiple thread-specific sampler + // set word_range_for_each_thread_ + // Adjust the alpha_sum_ parameter for each thread-specific sampler + CTimer tmDebug(true); + CheckFunction(0, tmDebug, "enter initializeBeforeTest", false); + + global_word_topic_table_.resize(V_); + alias_rng_int_.Init(K_); + beta_k_v_.resize(K_); + global_alias_k_v_.resize(V_); + + for (int i = 0; i < V_; ++i) + { + global_alias_k_v_[i] = model_block_->get_alias_row(i); + } + CheckFunction(0, tmDebug, "initlaizing global tables used in sampling", false); + + // Set the word range for each thread + word_range_for_each_thread_.resize(num_threads_ + 1); + int32_t word_num_each_thread = V_ / num_threads_; + word_range_for_each_thread_[0] = 0; + for (int32_t i = 0; i < num_threads_ - 1; ++i) + { + word_range_for_each_thread_[i + 1] = word_range_for_each_thread_[i] + word_num_each_thread; + } + word_range_for_each_thread_[num_threads_] = V_; + + //setup sampler + if (samplers_) + { + for (int i = 0; i < num_threads_; ++i) + { + delete samplers_[i]; + } + delete[] samplers_; + } + if (document_buffer_) + { + for (int i = 0; i < num_threads_; ++i) + { + delete[]document_buffer_[i]; + document_buffer_[i] = nullptr; + } + delete[]document_buffer_; + document_buffer_ = nullptr; + } + + samplers_ = new LightDocSampler*[num_threads_]; + document_buffer_ = new int32_t*[num_threads_]; + samplerQueue_->clear(); + + for (int i = 0; i < num_threads_; ++i) + { + samplers_[i] = new LightDocSampler( + K_, + V_, + num_threads_, + mh_step_, + beta_, + alpha_sum_, + global_word_topic_table_, + global_summary_row_, + global_alias_k_v_, + beta_height_, + beta_mass_, + beta_k_v_); + + samplers_[i]->AdaptAlphaSum(false); + document_buffer_[i] = new int32_t[maxDocToken_ * 2 + 1]; + + samplerQueue_->push(i); + } + CheckFunction(0, tmDebug, "create samplers", false); + + // build alias table + // build alias table for the dense term, beta_k_v_, which is shared by all the words + beta_mass_ = 0; + std::vector proportion(K_); + for (int k = 0; k < K_; ++k) + { + proportion[k] = beta_ / (global_summary_row_[k] + beta_sum_); + beta_mass_ += proportion[k]; + } + alias_rng_int_.SetProportionMass(proportion, beta_mass_, beta_k_v_, &beta_height_, samplers_[0]->rng()); + + // build alias table for the sparse term + for (int thread_id = 0; thread_id < num_threads_; ++thread_id) + { + LightDocSampler &sampler = *(samplers_[thread_id]); + sampler.build_alias_table(word_range_for_each_thread_[thread_id], word_range_for_each_thread_[thread_id + 1], thread_id); + } + CheckFunction(0, tmDebug, "build alisa table", false); + } + + void LdaEngine::Train(const char* pTrainOutput) + { + std::vector threads(num_threads_); + atomic_stats_->thread_counter_ = 0; + + for (auto& thr : threads) { + thr = std::thread(&LdaEngine::Training_Thread, this); + } + + printf("started training with %d threads\n", num_threads_); + for (auto& thr : threads) { + thr.join(); + } + + if (pTrainOutput) + { + DumpDocTopicTable(pTrainOutput); + } + } + + void LdaEngine::Test(int32_t burnin_iter, float* pLoglikelihood) + { + std::vector threads(num_threads_); + atomic_stats_->thread_counter_ = 0; + burnin_iterations_ = burnin_iter; + + likelihood_in_iter_ = new float[burnin_iterations_]; + for (int i = 0; i < burnin_iterations_; i++) + { + likelihood_in_iter_[i] = 0.0; + } + + for (auto& thr : threads) { + thr = std::thread(&LdaEngine::Testing_Thread, this); + } + + printf("started testing with %d threads\n", num_threads_); + + for (auto& thr : threads) { + thr.join(); + } + + //get the loglikelihood of each burn in iteration + for (int i = 0; i < burnin_iterations_; i++) + { + pLoglikelihood[i] = likelihood_in_iter_[i]; //just set an arbitary value here for later update + } + } + + void LdaEngine::CheckFunction(int thread_id, CTimer &tmDebug, const char* msg, bool waitBarrier) + { + } + + void LdaEngine::Training_Thread() + { + CTimer tmDebug(true); + + int thread_id = atomic_stats_->thread_counter_++; + std::vector> llcontainer; + // Set core affinity which helps performance improvement +#ifdef _MSC_VER + long long maskLL = 0; + maskLL |= (1LL << (thread_id)); + DWORD_PTR mask = maskLL; + SetThreadAffinityMask(GetCurrentThread(), mask); +#elif defined(__APPLE__) + thread_port_t thread = pthread_mach_thread_np(pthread_self()); + thread_affinity_policy_data_t policy = { thread_id }; + thread_policy_set(thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1); +#else + cpu_set_t set; + CPU_ZERO(&set); + CPU_SET(thread_id, &set); + sched_setaffinity(0, sizeof(cpu_set_t), &set); +#endif + + // Each thread builds a portion of word-topic table. We do this way because each word-topic row + // has a thread-specific buffer for rehashing + process_barrier_->wait(); + LightDocSampler &sampler_ = *(samplers_[thread_id]); + sampler_.AdaptAlphaSum(true); + + sampler_.build_word_topic_table(thread_id, num_threads_, *model_block_); + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "intialize word_topic_table for sampler - in function train_thread"); + + int32_t token_num = 0; + int32_t doc_start = data_block_->Begin(thread_id); + int32_t doc_end = data_block_->End(thread_id); + + for (int32_t doc_index = doc_start; doc_index != doc_end; ++doc_index) + { + std::shared_ptr doc = data_block_->GetOneDoc(doc_index); + int doc_size = doc->size(); + for (int i = 0; i < doc_size; ++i) + { + int topic = sampler_.rand_k(); + doc->SetTopic(i, topic); + } + int cursor = doc->get_cursor(); + token_num += sampler_.GlobalInit(doc.get()); + } + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "intialize token topic before iterations - in function train_thread"); + + for (int i = 0; i < num_threads_; ++i) + { + std::vector& wtd_vec = samplers_[i]->get_word_topic_delta(thread_id); + for (auto& wtd : wtd_vec) + { + global_word_topic_table_[wtd.word].inc(wtd.topic, wtd.delta); + } + } + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "intialize word topic model before iterations - in function train_thread"); + + // use thread-private delta table to get global table + { + std::lock_guard lock(atomic_stats_->global_mutex_); + + std::vector &summary = sampler_.get_delta_summary_row(); + for (int i = 0; i < K_; ++i) + { + global_summary_row_[i] += summary[i]; + } + } + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "global summary & Complete setup train before iterations - in function train_thread"); + + for (int iter = 0; iter < num_iterations_; ++iter) + { + CheckFunction(thread_id, tmDebug, "----------------------iteration start - in function train_thread---------------------"); + int32_t token_sweeped = 0; + atomic_stats_->num_tokens_clock_ = 0; + // build alias table + // build alias table for the dense term, beta_k_v_, which is shared by all the words + if (thread_id == 0) + { + beta_mass_ = 0; + std::vector proportion(K_); + for (int k = 0; k < K_; ++k) + { + proportion[k] = beta_ / (global_summary_row_[k] + beta_sum_); + beta_mass_ += proportion[k]; + } + + alias_rng_int_.SetProportionMass(proportion, beta_mass_, beta_k_v_, &beta_height_, sampler_.rng()); + } + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "built alias table dense - in function train_thread"); + + // build alias table for the sparse term + sampler_.build_alias_table(word_range_for_each_thread_[thread_id], word_range_for_each_thread_[thread_id + 1], thread_id); + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "built alias table sparse - in function train_thread"); + + sampler_.EpocInit(); + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "EpochInit - in function train_thread"); + + // main part of the training - sampling over documents in this iteration + double iter_start = lda::get_time(); + int32_t doc_start_local = data_block_->Begin(thread_id); + int32_t doc_end_local = data_block_->End(thread_id); + + for (int32_t doc_index = doc_start_local; doc_index != doc_end_local; ++doc_index) + { + std::shared_ptr doc = data_block_->GetOneDoc(doc_index); + token_sweeped += sampler_.SampleOneDoc(doc.get()); + } + atomic_stats_->num_tokens_clock_ += token_sweeped; + + process_barrier_->wait(); + double iter_end = lda::get_time(); + + if (thread_id == 0) + { + double seconds_this_iter = iter_end - iter_start; + + printf("Iter: %04d", iter); + std::cout + << "\tThread = " << thread_id + << "\tTokens: " << atomic_stats_->num_tokens_clock_ + << "\tTook: " << seconds_this_iter << " sec" + << "\tThroughput: " + << static_cast(atomic_stats_->num_tokens_clock_) / (seconds_this_iter) << " token/(thread*sec)" + << std::endl; + } + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "train(gibbs sampling) - in function train_thread"); + + // syncup global table + double sync_start = lda::get_time(); + for (int i = 0; i < num_threads_; ++i) + { + std::vector & wtd_vec = samplers_[i]->get_word_topic_delta(thread_id); + for (auto& wtd : wtd_vec) + { + global_word_topic_table_[wtd.word].inc(wtd.topic, wtd.delta); + } + } + + // use thread-private delta table to update global table + { + std::lock_guard lock(atomic_stats_->global_mutex_); + std::vector &summary = sampler_.get_delta_summary_row(); + for (int i = 0; i < K_; ++i) + { + global_summary_row_[i] += summary[i]; + } + } + process_barrier_->wait(); + CheckFunction(thread_id, tmDebug, "syncup global word_topic table - in function train_thread"); + + if (compute_ll_interval_ != -1 && (iter % compute_ll_interval_ == 0 || iter == num_iterations_ - 1)) + { + double ll = EvalLogLikelihood(true, thread_id, iter, sampler_); + llcontainer.push_back(std::pair(iter, ll)); + } + + CheckFunction(thread_id, tmDebug, "----------------------iteration end - in function train_thread---------------------"); + } + + if (thread_id == 0) + { + //output the ll once + for (int i = 0; i < llcontainer.size(); i++) + { + printf("loglikelihood @iter%04d = %f\n", llcontainer[i].first, llcontainer[i].second); + } + } + + process_barrier_->wait(); + + snprintf(tmDebug.m_szMessage, 200, "thread_id = %d, training iterations", thread_id); + tmDebug.InnerTag(); + } + + void LdaEngine::Testing_Thread() + { + int thread_id = atomic_stats_->thread_counter_++; + + // Set core affinity which helps performance improvement +#ifdef _MSC_VER + long long maskLL = 0; + maskLL |= (1LL << (thread_id)); + DWORD_PTR mask = maskLL; + SetThreadAffinityMask(GetCurrentThread(), mask); +#elif defined(__APPLE__) + thread_port_t thread = pthread_mach_thread_np(pthread_self()); + thread_affinity_policy_data_t policy = { thread_id }; + thread_policy_set(thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1); +#else + cpu_set_t set; + CPU_ZERO(&set); + CPU_SET(thread_id, &set); + sched_setaffinity(0, sizeof(cpu_set_t), &set); +#endif + process_barrier_->wait(); + + //// Each thread builds a portion of word-topic table. We do this way because each word-topic row + //// has a thread-specific buffer for rehashing + LightDocSampler &sampler_ = *(samplers_[thread_id]); + sampler_.AdaptAlphaSum(false); + + double init_start = lda::get_time(); + int32_t token_num = 0; + int32_t doc_start = data_block_->Begin(thread_id); + int32_t doc_end = data_block_->End(thread_id); + + for (int32_t doc_index = doc_start; doc_index != doc_end; ++doc_index) + { + std::shared_ptr doc = data_block_->GetOneDoc(doc_index); + int doc_size = doc->size(); + for (int i = 0; i < doc_size; ++i) + { + int topic = sampler_.rand_k(); + doc->SetTopic(i, topic); + } + int cursor = doc->get_cursor(); + token_num += sampler_.GlobalInit(doc.get()); + } + + process_barrier_->wait(); + + // build alias table + // build alias table for the dense term, beta_k_v_, which is shared by all the words + if (thread_id == 0) + { + beta_mass_ = 0; + std::vector proportion(K_); + for (int k = 0; k < K_; ++k) + { + proportion[k] = beta_ / (global_summary_row_[k] + beta_sum_); + beta_mass_ += proportion[k]; + } + + alias_rng_int_.SetProportionMass(proportion, beta_mass_, beta_k_v_, &beta_height_, sampler_.rng()); + } + + // build alias table for the sparse term + double alias_start = lda::get_time(); + process_barrier_->wait(); + sampler_.build_alias_table(word_range_for_each_thread_[thread_id], word_range_for_each_thread_[thread_id + 1], thread_id); + process_barrier_->wait(); + + // print the log-likelihood before inference + EvalLogLikelihood(true, thread_id, 0, sampler_); + + double total_start = lda::get_time(); + for (int iter = 0; iter < burnin_iterations_; ++iter) + { + double iter_start = lda::get_time(); + int32_t token_sweeped = 0; + atomic_stats_->num_tokens_clock_ = 0; + int32_t doc_start_local = data_block_->Begin(thread_id); + int32_t doc_end_local = data_block_->End(thread_id); + + for (int32_t doc_index = doc_start_local; doc_index != doc_end_local; ++doc_index) + { + std::shared_ptr doc = data_block_->GetOneDoc(doc_index); + token_sweeped += sampler_.InferOneDoc(doc.get()); + } + atomic_stats_->num_tokens_clock_ += token_sweeped; + + process_barrier_->wait(); + double iter_end = lda::get_time(); + + if (thread_id == 0) + { + double seconds_this_iter = iter_end - iter_start; + + printf("Iter: %04d", iter); + std::cout + << "\tThread = " << thread_id + << "\tTokens: " << atomic_stats_->num_tokens_clock_ + << "\tTook: " << seconds_this_iter << " sec" + << "\tThroughput: " + << static_cast(atomic_stats_->num_tokens_clock_) / (seconds_this_iter) << " token/(thread*sec)" + << std::endl; + + } + + process_barrier_->wait(); + + if (compute_ll_interval_ != -1 && (iter % compute_ll_interval_ == 0 || iter == burnin_iterations_ - 1)) + { + EvalLogLikelihood(false, thread_id, iter, sampler_); + } + } + + double total_end = lda::get_time(); + printf("thread_id = %d, Total time for burnin iterations : %f sec.\n", thread_id, total_end - total_start); + } + + void LdaEngine::AllocateDataMemory(int num_document, int64_t corpus_size) + { + data_block_->Allocate(num_document, corpus_size); + } + + void LdaEngine::AllocateModelMemory(const LDADataBlock* data_block) + { + model_block_->InitFromDataBlock(data_block, V_, K_); + + global_word_topic_table_.resize(V_); + + for (int i = 0; i < V_; ++i) + { + global_word_topic_table_[i] = model_block_->get_row(i, nullptr); + } + } + + void LdaEngine::AllocateModelMemory(int num_vocabs, int num_topics, int64_t nonzero_num) + { + model_block_->Init(num_vocabs, num_topics, nonzero_num); + + global_word_topic_table_.resize(num_vocabs); + + for (int i = 0; i < num_vocabs; ++i) + { + global_word_topic_table_[i] = model_block_->get_row(i, nullptr); + } + } + + void LdaEngine::AllocateModelMemory(int num_vocabs, int num_topics, int64_t mem_block_size, int64_t alias_mem_block_size) + { + model_block_->Init(num_vocabs, num_topics, mem_block_size, alias_mem_block_size); //memory allocated here + + global_word_topic_table_.resize(num_vocabs); + global_summary_row_.resize(K_, 0); + + //each value inside the global_word_topic_table_ will be set while call SetWordTopic() + } + + int LdaEngine::FeedInData(int* term_id, int* term_freq, int32_t term_num, int32_t vocab_size) + { + if (V_ == 0) //number vocab could be set in allocating model memory function + V_ = vocab_size; + + //data_block represent for one doc + return data_block_->Add(term_id, term_freq, term_num); + } + + int LdaEngine::FeedInDataDense(int* term_freq, int32_t term_num, int32_t vocab_size) + { + if (V_ == 0) //number vocab could be set in allocating model memory function + V_ = vocab_size; + + //data_block represent for one doc + return data_block_->AddDense(term_freq, term_num); + } + + void LdaEngine::TestOneDoc(int* term_id, int* term_freq, int32_t term_num, int* pTopics, int* pProbs, int32_t& numTopicsMax, int32_t numBurnIter, bool reset) + { + //numTopicsMax initialy holds the max returned topic number in order to hold the pTopic/pProbs memory in outside function + //when data return, numTopicsMax should contains the real topic number returned. + int sampler_id = 0; + sampler_id = samplerQueue_->pop(); + + LightDocSampler &sampler = *(samplers_[sampler_id]); + int64_t data_length = 1; + for (int i = 0; i < term_num; ++i) + { + for (int j = 0; j < term_freq[i]; ++j) + { + data_length += 2; + } + } + + assert(data_length <= maxDocToken_ * 2 + 1); + + if (reset) + { + // restart the rng seeds, so that we always get consistent result for the same input + rng_.restart(); + sampler.rng_restart(); + } + + // NOTE: in multi-threaded implementation, the dynamic memory allocation + // may cause contention at OS heap lock + int64_t idx = 1; + for (int i = 0; i < term_num; ++i) + { + for (int j = 0; j < term_freq[i]; ++j) + { + document_buffer_[sampler_id][idx++] = term_id[i]; + document_buffer_[sampler_id][idx++] = rng_.rand_k(K_); + } + } + + std::shared_ptr doc(new LDADocument(document_buffer_[sampler_id], document_buffer_[sampler_id] + data_length)); + + for (int iter = 0; iter < numBurnIter; ++iter) + { + sampler.InferOneDoc(doc.get()); + } + sampler.GetDocTopic(doc.get(), pTopics, pProbs, numTopicsMax); + + samplerQueue_->push(sampler_id); + } + + void LdaEngine::TestOneDocDense(int* term_freq, int32_t term_num, int* pTopics, int* pProbs, int32_t& numTopicsMax, int32_t numBurnIter, bool reset) + { + //numTopicsMax initialy holds the max returned topic number in order to hold the pTopic/pProbs memory in outside function + //when data return, numTopicsMax should contains the real topic number returned. + int sampler_id = 0; + sampler_id = samplerQueue_->pop(); + + LightDocSampler &sampler = *(samplers_[sampler_id]); + int64_t data_length = 1; + for (int i = 0; i < term_num; ++i) + { + for (int j = 0; j < term_freq[i]; ++j) + { + data_length += 2; + } + } + + assert(data_length <= maxDocToken_ * 2 + 1); + + if (reset) + { + // restart the rng seeds, so that we always get consistent result for the same input + rng_.restart(); + sampler.rng_restart(); + } + + // NOTE: in multi-threaded implementation, the dynamic memory allocation + // may cause contention at OS heap lock + int64_t idx = 1; + for (int i = 0; i < term_num; ++i) + { + for (int j = 0; j < term_freq[i]; ++j) + { + document_buffer_[sampler_id][idx++] = i; + document_buffer_[sampler_id][idx++] = rng_.rand_k(K_); + } + } + + std::shared_ptr doc(new LDADocument(document_buffer_[sampler_id], document_buffer_[sampler_id] + data_length)); + + for (int iter = 0; iter < numBurnIter; ++iter) + { + sampler.InferOneDoc(doc.get()); + } + sampler.GetDocTopic(doc.get(), pTopics, pProbs, numTopicsMax); + + samplerQueue_->push(sampler_id); + } + + void LdaEngine::GetDocTopic(int docID, int* pTopic, int* pProb, int32_t& numTopicReturn) + { + //get the current topic vector of the document + int thread_id = 0; + LightDocSampler &sampler = *(samplers_[thread_id]); + + sampler.GetDocTopic(data_block_->GetOneDoc(docID).get(), pTopic, pProb, numTopicReturn); + } + + void LdaEngine::SetAlphaSum(float avgDocLength) + { + if (!bAlphaSumMultiplied) + { + alpha_sum_ = alpha_sum_ * avgDocLength; + bAlphaSumMultiplied = true; + } + printf("alpha_sum was set to %f", alpha_sum_); + } + + bool LdaEngine::ClearData() + { + data_block_->Clear(); + return true; + } + + bool LdaEngine::ClearModel() + { + model_block_->Clear(); + return true; + } + + //function to support dumping the topic_model model file + void LdaEngine::GetWordTopic(int32_t wordId, int32_t* pTopic, int32_t* pProb, int32_t& length) + { + //cap the topic number here according to inpassed value of length + int lengthCap = length; + + // NOTE: we MUST check whether the word-topic row is empty before get its value + if (global_word_topic_table_[wordId].capacity() == 0) + { + length = 0; + return; + } + + length = 0; + for (int i = 0; i < K_; ++i) + { + if (global_word_topic_table_[wordId][i] > 0) + { + pTopic[length] = i; + pProb[length] = global_word_topic_table_[wordId][i]; + length++; + + if (length >= lengthCap) + break; + } + } + } + + // Compare by frequencies in descending order. + bool CompareTerms(const std::pair &term1, const std::pair &term2) + { + // REVIEW: consider changing this to impose a total order, since quicksort is not stable. + return term2.second < term1.second; + } + + void LdaEngine::GetTopicSummary(int32_t topicId, int32_t* pWords, float* pProb, int32_t& length) + { + std::vector> allTermsVec; + int sumFreq = 0; + for (int i = 0; i < V_; i++) //for all the terms check the topic distribution + { + if (global_word_topic_table_[i][topicId] > 0) + { + std::pair p; + p.first = i; + p.second = global_word_topic_table_[i][topicId]; + allTermsVec.push_back(p); + sumFreq += global_word_topic_table_[i][topicId]; + } + } + + std::sort(allTermsVec.begin(), allTermsVec.end(), CompareTerms); + + int usedTerm = (int)allTermsVec.size(); + length = std::min(usedTerm, length); + for (int i = 0; i < length; i++) + { + pWords[i] = allTermsVec[i].first; + pProb[i] = (((float)(allTermsVec[i].second)) + beta_) / (sumFreq + beta_ * V_); + } + } + + //function to support loading the topic_model model file + void LdaEngine::SetWordTopic(int32_t wordId, int32_t* pTopic, int32_t* pProb, int32_t length) + { + //NOTE: whether we should really use the "true" here + model_block_->SetWordInfo(wordId, length, true); + global_word_topic_table_[wordId] = model_block_->get_row(wordId, nullptr); + + for (int i = 0; i < length; ++i) + { + global_word_topic_table_[wordId].inc(pTopic[i], pProb[i]); + global_summary_row_[pTopic[i]] += pProb[i]; + } + } + + void LdaEngine::GetModelStat(int64_t &memBlockSize, int64_t &aliasMemBlockSize) + { + //NOTE: get the model's value at the end of training stage. try to save these two numbers to disk file + model_block_->GetModelStat(memBlockSize, aliasMemBlockSize); + } + + double LdaEngine::EvalLogLikelihood(bool is_train, int thread_id, int iter, LightDocSampler &sampler) + { + double doc_ll = 0; + double word_ll = 0; + + if (thread_id == 0) + { + atomic_stats_->doc_ll_ = 0; + atomic_stats_->word_ll_ = 0; + } + process_barrier_->wait(); + + int doc_num = 0; + int32_t doc_start = data_block_->Begin(thread_id); + int32_t doc_end = data_block_->End(thread_id); + for (int32_t doc_index = doc_start; doc_index != doc_end; ++doc_index) + { + std::shared_ptr doc = data_block_->GetOneDoc(doc_index); + doc_ll += sampler.ComputeOneDocLLH(doc.get()); + doc_num++; + } + atomic_stats_->doc_ll_ = atomic_stats_->doc_ll_ + doc_ll; + process_barrier_->wait(); + + word_ll = sampler.ComputeWordLLH(word_range_for_each_thread_[thread_id], word_range_for_each_thread_[thread_id + 1]); + atomic_stats_->word_ll_ = atomic_stats_->word_ll_ + word_ll; + process_barrier_->wait(); + + double total_ll = 0; + if (thread_id == 0) + { + double normalized_ll = sampler.NormalizeWordLLH(); + + total_ll = 0; + total_ll += atomic_stats_->doc_ll_; + total_ll += atomic_stats_->word_ll_; + total_ll += normalized_ll; + + if (!is_train) + { + likelihood_in_iter_[iter] = (float)total_ll; + } + + std::cout << "Total likelihood: " << total_ll << "\t"; + std::cout << "..........[Nomralized word ll: " << normalized_ll << "\t" + << "Word likelihood: " << atomic_stats_->word_ll_ << "\t" + << "Doc likelihood: " << atomic_stats_->doc_ll_ << "]" << std::endl; + } + process_barrier_->wait(); + + return total_ll; + } + + void LdaEngine::DumpDocTopicTable(const std::string& doc_topic_file) + { + std::ofstream dt_stream; + dt_stream.open(doc_topic_file, std::ios::out); + assert(dt_stream.good()); + + int32_t num_documents = data_block_->num_documents(); + int32_t doc_start = 0; + int32_t doc_end = num_documents; + + lda::light_hash_map doc_topic_counter_(1024); + + for (int32_t doc_index = doc_start; doc_index != doc_end; ++doc_index) + { + std::shared_ptr doc = data_block_->GetOneDoc(doc_index); + doc_topic_counter_.clear(); + doc->GetDocTopicCounter(doc_topic_counter_); + + dt_stream << doc_index; + if (doc->size()) + { + int32_t capacity = doc_topic_counter_.capacity(); + int32_t *key = doc_topic_counter_.key(); + int32_t *value = doc_topic_counter_.value(); + int32_t nonzero_num = 0; + + for (int i = 0; i < capacity; ++i) + { + if (key[i] > 0) + { + dt_stream << " " << key[i] - 1 << ":" << value[i]; + } + } + } + dt_stream << std::endl; + } + dt_stream.close(); + } + + void LdaEngine::DumpFullModel(const std::string& word_topic_dump) + { + std::ofstream wt_stream; + wt_stream.open(word_topic_dump, std::ios::out); + assert(wt_stream.good()); + + for (int w = 0; w < V_; ++w) + { + int nonzero_num = global_word_topic_table_[w].nonzero_num(); + if (nonzero_num) + { + wt_stream << w; + for (int t = 0; t < K_; ++t) + { + if (global_word_topic_table_[w][t] > 0) + { + wt_stream << " " << t << ":" << global_word_topic_table_[w][t]; + } + } + wt_stream << std::endl; + } + } + wt_stream.close(); + + std::ofstream summary_stream; + summary_stream.open("summary_row.txt", std::ios::out); + for (int i = 0; i < K_; ++i) + { + summary_stream << global_summary_row_[i] << std::endl; + } + summary_stream.close(); + } +} // namespace lda diff --git a/src/Native/LdaNative/lda_engine.hpp b/src/Native/LdaNative/lda_engine.hpp new file mode 100644 index 0000000000..95a107f355 --- /dev/null +++ b/src/Native/LdaNative/lda_engine.hpp @@ -0,0 +1,144 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "lda_document.h" +#include "hybrid_map.h" +#include "hybrid_alias_map.h" + +#include "alias_multinomial_rng_int.hpp" + +#ifdef _MSC_VER +#define EXPORT_API(ret) extern "C" __declspec(dllexport) ret __stdcall +#else +#define EXPORT_API(ret) extern "C" __attribute__((visibility("default"))) ret +#endif + +//ignore all such warnings since our stl class will not used internally in the class as private member +#pragma warning(disable : 4251) +class CTimer; +namespace lda { + + class LDADataBlock; + class LDAModelBlock; + class SimpleBarrier; + struct LDAEngineAtomics; + class LightDocSampler; + class CBlockedIntQueue; + + // Engine takes care of the entire pipeline of LDA, from reading data to + // spawning threads, to recording execution time and loglikelihood. + class LdaEngine { + public: + LdaEngine(); + LdaEngine(int numTopic, + int numVocab, + float alphaSum, + float beta, + int numIter, + int likelihoodInterval, + int numThread, + int mhstep, + int maxDocToken); + + LdaEngine(int32_t K, int32_t V, int32_t num_threads, int32_t compute_ll_interval, float beta, int32_t num_iterations, int32_t mh_step, float alpha_sum, int maxDocToken); + + ~LdaEngine(); + + + void InitializeBeforeTest(); + bool InitializeBeforeTrain(); + void AllocateDataMemory(int num_document, int64_t corpus_size); + void AllocateModelMemory(const LDADataBlock* data_block); //in this case, model memory is allocated according to the datablock; + void AllocateModelMemory(int num_vocabs, int num_topics, int64_t nonzero_num); + void AllocateModelMemory(int num_vocabs, int num_topics, int64_t mem_block_size, int64_t alias_mem_block_size); + void SetAlphaSum(float avgDocLength); //alphasum parameter is set by avgdoclength * alpha + + //IO, data + bool ClearData(); //for clean up training data + bool ClearModel(); //for testing purpose, before calling SetWordTopic, please clear the old model + + int FeedInData(int* term_id, int* term_freq, int32_t term_num, int32_t vocab_size); + int FeedInDataDense(int* term_freq, int32_t term_num, int32_t vocab_size); + + //IO, model + // NOTE: assume pTopic and pProb are allocated outside the function + // the length returned will be capped by the pass-in initial value of length(usually it's the size of preallocated memory for pTopic&pProb + void GetWordTopic(int32_t wordId, int32_t* pTopic, int32_t* pProb, int32_t& length); + void SetWordTopic(int32_t wordId, int32_t* pTopic, int32_t* pProb, int32_t length); + void GetModelStat(int64_t &memBlockSize, int64_t &aliasMemBlockSize); + void GetTopicSummary(int32_t topicId, int32_t* pWords, float* pProb, int32_t& length); + + //mutlithread train/test with the data inside the engine + void Train(const char* pTrainOutput = nullptr); + void Test(int32_t burnin_iter, float* pLoglikelihood); + + //testing on single doc + void TestOneDoc(int* term_id, int* term_freq, int32_t term_num, int* pTopics, int* pProbs, int32_t& numTopicsMax, int32_t numBurnIter, bool reset); + void TestOneDocDense(int* term_freq, int32_t term_num, int* pTopics, int* pProbs, int32_t& numTopicsMax, int32_t numBurnIter, bool reset); + void GetDocTopic(int docID, int* pTopic, int* pProb, int32_t& numTopicReturn); // use this function to get the doc's topic output in batch testing scenario + + //output model(word topic) and doc topic + void DumpFullModel(const std::string& word_topic_dump); + void DumpDocTopicTable(const std::string& doc_topic_file); + + private: + double EvalLogLikelihood(bool is_train, int thread_id, int iter, LightDocSampler &sampler); + + private: // private data + void Training_Thread(); + void Testing_Thread(); + void CheckFunction(int thread_id, CTimer& tmDebug, const char* msg, bool waitBarrier = true); + + // Number of topics + int32_t K_; + // Number of vocabs. + int32_t V_; + + int32_t compute_ll_interval_; + int32_t num_threads_; + int32_t num_iterations_; + int32_t burnin_iterations_; + int32_t mh_step_; + float beta_; + float alpha_sum_; + float beta_sum_; + int maxDocToken_; + bool bAlphaSumMultiplied; //used to check whether alpha_sum_ is real alpha sum but not alpha + std::vector word_range_for_each_thread_; + + LDAEngineAtomics* atomic_stats_; + SimpleBarrier* process_barrier_; // Local barrier across threads. + + LDADataBlock* data_block_; + LDAModelBlock* model_block_; + + std::vector global_word_topic_table_; + std::vector global_alias_k_v_; + std::vector global_summary_row_; + + // for generating alias table of beta term + wood::AliasMultinomialRNGInt alias_rng_int_; + int32_t beta_height_; + float beta_mass_; + std::vector beta_k_v_; + + LightDocSampler **samplers_; + float* likelihood_in_iter_; + + // For TestDocSafe purpose + int32_t **document_buffer_; + + wood::xorshift_rng rng_; + CBlockedIntQueue *samplerQueue_; + }; +} // namespace lda diff --git a/src/Native/LdaNative/lda_engine_export.cpp b/src/Native/LdaNative/lda_engine_export.cpp new file mode 100644 index 0000000000..7f6bc62b70 --- /dev/null +++ b/src/Native/LdaNative/lda_engine_export.cpp @@ -0,0 +1,109 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include "lda_engine.hpp" + +/// This file use to expose public API to be consumed by ML.NET. +namespace lda { + + EXPORT_API(LdaEngine*) CreateEngine(int numTopic, int numVocab, float alphaSum, float beta, int numIter, int likelihoodInterval, int numThread, int mhstep, int maxDocToken) + { + return new LdaEngine(numTopic, numVocab, alphaSum, beta, numIter, likelihoodInterval, numThread, mhstep, maxDocToken); + } + + EXPORT_API(void) DestroyEngine(LdaEngine* engine) + { + delete engine; + } + + EXPORT_API(void) AllocateModelMemory(LdaEngine* engine, int numTopic, int numVocab, int64_t tableSize, int64_t aliasTableSize) + { + engine->AllocateModelMemory(numVocab, numTopic, tableSize, aliasTableSize); + } + + EXPORT_API(void) AllocateDataMemory(LdaEngine* engine, int num_document, int64_t corpus_size) + { + engine->AllocateDataMemory(num_document, corpus_size); + } + + EXPORT_API(void) Train(LdaEngine* engine, const char* trainOutput) + { + engine->Train(trainOutput); + } + + EXPORT_API(void) Test(LdaEngine* engine, int32_t burnin_iter, float* pLoglikelihood) + { + engine->Test(burnin_iter, pLoglikelihood); + } + + EXPORT_API(void) CleanData(LdaEngine* engine) + { + engine->ClearData(); + } + + EXPORT_API(void) CleanModel(LdaEngine* engine) + { + engine->ClearModel(); + } + + EXPORT_API(void) GetModelStat(LdaEngine* engine, int64_t &memBlockSize, int64_t &aliasMemBlockSize) + { + engine->GetModelStat(memBlockSize, aliasMemBlockSize); + } + + EXPORT_API(void) GetWordTopic(LdaEngine* engine, int32_t wordId, int32_t* pTopic, int32_t* pProb, int32_t& length) + { + engine->GetWordTopic(wordId, pTopic, pProb, length); + } + + EXPORT_API(void) SetWordTopic(LdaEngine* engine, int32_t wordId, int32_t* pTopic, int32_t* pProb, int32_t length) + { + engine->SetWordTopic(wordId, pTopic, pProb, length); + } + + EXPORT_API(void) GetTopicSummary(LdaEngine* engine, int32_t topicId, int32_t* pWords, float* pProb, int32_t& length) + { + engine->GetTopicSummary(topicId, pWords, pProb, length); + } + + EXPORT_API(void) SetAlphaSum(LdaEngine* engine, float avgDocLength) + { + engine->SetAlphaSum(avgDocLength); + } + + EXPORT_API(int) FeedInData(LdaEngine* engine, int* term_id, int* term_freq, int32_t term_num, int32_t vocab_size) + { + return engine->FeedInData(term_id, term_freq, term_num, vocab_size); + } + + EXPORT_API(int) FeedInDataDense(LdaEngine* engine, int* term_freq, int32_t term_num, int32_t vocab_size) + { + return engine->FeedInDataDense(term_freq, term_num, vocab_size); + } + + EXPORT_API(void) GetDocTopic(LdaEngine* engine, int docID, int* pTopic, int* pProb, int32_t& numTopicReturn) + { + engine->GetDocTopic(docID, pTopic, pProb, numTopicReturn); + } + + EXPORT_API(void) TestOneDoc(LdaEngine* engine, int* term_id, int* term_freq, int32_t term_num, int* pTopics, int* pProbs, int32_t& numTopicsMax, int32_t numBurnIter, bool reset) + { + engine->TestOneDoc(term_id, term_freq, term_num, pTopics, pProbs, numTopicsMax, numBurnIter, reset); + } + + EXPORT_API(void) TestOneDocDense(LdaEngine* engine, int* term_freq, int32_t term_num, int* pTopics, int* pProbs, int32_t& numTopicsMax, int32_t numBurnIter, bool reset) + { + engine->TestOneDocDense(term_freq, term_num, pTopics, pProbs, numTopicsMax, numBurnIter, reset); + } + + EXPORT_API(void) InitializeBeforeTrain(LdaEngine* engine) + { + engine->InitializeBeforeTrain(); + } + + EXPORT_API(void) InitializeBeforeTest(LdaEngine* engine) + { + engine->InitializeBeforeTest(); + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/light_doc_sampler.cpp b/src/Native/LdaNative/light_doc_sampler.cpp new file mode 100644 index 0000000000..ea628d3891 --- /dev/null +++ b/src/Native/LdaNative/light_doc_sampler.cpp @@ -0,0 +1,667 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include +#include +#include +#include +#include +#include + +#include "lda_document.h" +#include "light_doc_sampler.hpp" + + +namespace lda +{ + LightDocSampler::LightDocSampler( + int32_t K, + int32_t V, + int32_t num_threads, + int32_t mh_step, + float beta, + float alpha_sum, + std::vector &word_topic_table, + std::vector &summary_row, + std::vector &alias_kv, + int32_t &beta_height, + float& beta_mass, + std::vector &beta_k_v) + : doc_topic_counter_(1024), + word_topic_table_(word_topic_table), summary_row_(summary_row), + alias_k_v_(alias_kv), + beta_height_(beta_height), + beta_mass_(beta_mass), + beta_k_v_(beta_k_v), + K_(K), + V_(V), + num_threads_(num_threads), + mh_step_for_gs_(mh_step), + beta_(beta), + alpha_sum_(alpha_sum) + { + beta_sum_ = beta_ * V_; + alpha_ = alpha_sum_ / K_; + + ll_alpha_ = (lda::real_t)0.01; + ll_alpha_sum_ = ll_alpha_ * K_; + + // Precompute LLH parameters + log_doc_normalizer_ = LogGamma(ll_alpha_ * K_) - K_ * LogGamma(ll_alpha_); + log_topic_normalizer_ = LogGamma(beta_sum_) - V_ * LogGamma(beta_); + + alias_rng_.Init(K_); + + q_w_proportion_.resize(K_); + delta_summary_row_.resize(K_); + word_topic_delta_.resize(num_threads_); + + rehashing_buf_ = new int32_t[K_ * 2]; + } + + LightDocSampler::~LightDocSampler() + { + delete[] rehashing_buf_; + } + + // Initialize word_topic_table and doc_topic_counter for each doc + int32_t LightDocSampler::GlobalInit(LDADocument *doc) + { + int32_t token_num = 0; + int32_t doc_size = doc->size(); + for (int i = 0; i < doc_size; ++i) + { + int32_t w = doc->Word(i); + int32_t t = doc->Topic(i); + + word_topic_delta wtd; + int32_t shard_id = w % num_threads_; + wtd.word = w; + wtd.topic = t; + wtd.delta = 1; + word_topic_delta_[shard_id].push_back(wtd); + + ++delta_summary_row_[t]; + + ++token_num; + } + return token_num; + } + + int32_t LightDocSampler::DocInit(LDADocument *doc) + { + int num_words = doc->size(); + + // compute the doc_topic_counter on the fly + doc_topic_counter_.clear(); + doc->GetDocTopicCounter(doc_topic_counter_); + + doc_size_ = num_words; + n_td_sum_ = (lda::real_t)num_words; + + return 0; + } + + bool CompareFirstElement(const std::pair &p1, const std::pair &p2) + { + return p1.first < p2.first; + } + + void LightDocSampler::GetDocTopic(LDADocument *doc, int* pTopics, int* pProbs, int32_t& numTopicsMax) + { + doc_topic_counter_.clear(); + doc->GetDocTopicCounter(doc_topic_counter_); + + // NOTE: do we have to assume this? + // probably first sort the topic vector according to the probs and keep the first numTopicsMax topics + // We assume the numTopicsMax is not less than the length of current document?? or it should be maxiumly the toipc number + // assert(numTopicsMax >= doc->size()); + + int32_t capacity = doc_topic_counter_.capacity(); + int32_t *key = doc_topic_counter_.key(); + int32_t *value = doc_topic_counter_.value(); + + std::vector> vec; + int32_t idx = 0; + for (int i = 0; i < capacity; ++i) + { + if (key[i] > 0) + { + std::pair pair; + pair.first = key[i] - 1; + pair.second = value[i]; + vec.push_back(pair); + idx++; + + if (idx == numTopicsMax) + break; + } + } + numTopicsMax = idx; + std::sort(vec.begin(), vec.end(), CompareFirstElement); + for (int i = 0; i < idx; i++) + { + pTopics[i] = vec[i].first; + pProbs[i] = vec[i].second; + } + } + + void LightDocSampler::EpocInit() + { + std::fill(delta_summary_row_.begin(), delta_summary_row_.end(), 0); + for (auto &shard : word_topic_delta_) + { + shard.clear(); + } + } + + void LightDocSampler::AdaptAlphaSum(bool is_train) + { + rng_.restart(); //reset the sampler so that we will get deterministic result by different runs, train-test, train-save-test, etc. + + if (is_train) + { + if (alpha_sum_ < 10) + { + alpha_sum_ = 100; + } + } + else + { + if (alpha_sum_ > 10) + { + alpha_sum_ = 1; + } + } + alpha_ = alpha_sum_ / K_; + } + + void LightDocSampler::build_alias_table(int32_t lower, int32_t upper, int thread_id) + { + for (int w = lower; w < upper; ++w) + { + GenerateAliasTableforWord(w); + } + } + void LightDocSampler::build_word_topic_table(int32_t thread_id, int32_t num_threads, lda::LDAModelBlock &model_block) + { + for (int i = 0; i < V_; ++i) + { + if (i % num_threads == thread_id) + { + word_topic_table_[i] = model_block.get_row(i, rehashing_buf_); + } + } + } + + int32_t LightDocSampler::SampleOneDoc(LDADocument *doc) + { + return OldProposalFreshSample(doc); + } + + int32_t LightDocSampler::InferOneDoc(LDADocument *doc) + { + return OldProposalFreshSampleInfer(doc); + } + int32_t LightDocSampler::Sample2WordFirst(LDADocument *doc, int32_t w, int32_t s, int32_t old_topic) + { + int32_t w_t_cnt; + int32_t w_s_cnt; + + real_t n_td_alpha; + real_t n_sd_alpha; + real_t n_tw_beta; + real_t n_sw_beta; + real_t n_s_beta_sum; + real_t n_t_beta_sum; + + real_t proposal_s; + real_t proposal_t; + + real_t nominator; + real_t denominator; + + real_t rejection; + real_t pi; + int m; + + for (int i = 0; i < mh_step_for_gs_; ++i) + { + int32_t t; + + t = alias_k_v_[w].next(rng_, beta_height_, beta_mass_, beta_k_v_, false); + + rejection = rng_.rand_real(); + + n_td_alpha = doc_topic_counter_[t] + alpha_; + n_sd_alpha = doc_topic_counter_[s] + alpha_; + + + w_s_cnt = get_word_topic(w, s); + w_t_cnt = get_word_topic(w, t); + + if (s != old_topic && t != old_topic) + { + n_tw_beta = w_t_cnt + beta_; + n_t_beta_sum = summary_row_[t] + beta_sum_; + + n_sw_beta = w_s_cnt + beta_; + n_s_beta_sum = summary_row_[s] + beta_sum_; + } + else if (s != old_topic && t == old_topic) + { + n_td_alpha -= 1; + + n_tw_beta = w_t_cnt + beta_ - 1; + n_t_beta_sum = summary_row_[t] + beta_sum_ - 1; + + n_sw_beta = w_s_cnt + beta_; + n_s_beta_sum = summary_row_[s] + beta_sum_; + } + else if (s == old_topic && t != old_topic) + { + n_sd_alpha -= 1; + + n_tw_beta = w_t_cnt + beta_; + n_t_beta_sum = summary_row_[t] + beta_sum_; + + n_sw_beta = w_s_cnt + beta_ - 1; + n_s_beta_sum = summary_row_[s] + beta_sum_ - 1; + } + else + { + n_td_alpha -= 1; + n_sd_alpha -= 1; + + n_tw_beta = w_t_cnt + beta_ - 1; + n_t_beta_sum = summary_row_[t] + beta_sum_ - 1; + + n_sw_beta = w_s_cnt + beta_ - 1; + n_s_beta_sum = summary_row_[s] + beta_sum_ - 1; + } + + proposal_s = (w_s_cnt + beta_) / (summary_row_[s] + beta_sum_); + proposal_t = (w_t_cnt + beta_) / (summary_row_[t] + beta_sum_); + + nominator = n_td_alpha + * n_tw_beta + * n_s_beta_sum + * proposal_s; + + denominator = n_sd_alpha + * n_sw_beta + * n_t_beta_sum + * proposal_t; + + + pi = std::min((real_t)1.0, nominator / denominator); + + // s = rejection < pi ? t : s; + m = -(rejection < pi); + s = (t & m) | (s & ~m); + + real_t n_td_or_alpha = rng_.rand_real() * (n_td_sum_ + alpha_sum_); + if (n_td_or_alpha < n_td_sum_) + { + int32_t t_idx = rng_.rand_k(doc_size_); + t = doc->Topic(t_idx); + } + else + { + t = rng_.rand_k(K_); + } + + rejection = rng_.rand_real(); + + n_td_alpha = doc_topic_counter_[t] + alpha_; + n_sd_alpha = doc_topic_counter_[s] + alpha_; + + + if (s != old_topic && t != old_topic) + { + w_t_cnt = get_word_topic(w, t); + n_tw_beta = w_t_cnt + beta_; + n_t_beta_sum = summary_row_[t] + beta_sum_; + + w_s_cnt = get_word_topic(w, s); + n_sw_beta = w_s_cnt + beta_; + n_s_beta_sum = summary_row_[s] + beta_sum_; + } + else if (s != old_topic && t == old_topic) + { + n_td_alpha -= 1; + + w_t_cnt = get_word_topic(w, t) - 1; + n_tw_beta = w_t_cnt + beta_; + n_t_beta_sum = summary_row_[t] + beta_sum_ - 1; + + w_s_cnt = get_word_topic(w, s); + n_sw_beta = w_s_cnt + beta_; + n_s_beta_sum = summary_row_[s] + beta_sum_; + } + else if (s == old_topic && t != old_topic) + { + n_sd_alpha -= 1; + + w_t_cnt = get_word_topic(w, t); + n_tw_beta = w_t_cnt + beta_; + n_t_beta_sum = summary_row_[t] + beta_sum_; + + w_s_cnt = get_word_topic(w, s) - 1; + n_sw_beta = w_s_cnt + beta_; + n_s_beta_sum = summary_row_[s] + beta_sum_ - 1; + } + else + { + n_td_alpha -= 1; + n_sd_alpha -= 1; + + w_t_cnt = get_word_topic(w, t) - 1; + n_tw_beta = w_t_cnt + beta_; + n_t_beta_sum = summary_row_[t] + beta_sum_ - 1; + + w_s_cnt = get_word_topic(w, s) - 1; + n_sw_beta = w_s_cnt + beta_; + n_s_beta_sum = summary_row_[s] + beta_sum_ - 1; + } + + proposal_t = doc_topic_counter_[t] + alpha_; + proposal_s = doc_topic_counter_[s] + alpha_; + + nominator = n_td_alpha + * n_tw_beta + * n_s_beta_sum + * proposal_s; + + denominator = n_sd_alpha + * n_sw_beta + * n_t_beta_sum + * proposal_t; + + + pi = std::min((real_t)1.0, nominator / denominator); + + // s = rejection < pi ? t : s; + m = -(rejection < pi); + s = (t & m) | (s & ~m); + } + int32_t src = s; + return src; + } + + int32_t LightDocSampler::Sample2WordFirstInfer(LDADocument *doc, int32_t w, int32_t s, int32_t old_topic) + { + int32_t w_t_cnt; + int32_t w_s_cnt; + + float n_td_alpha; + float n_sd_alpha; + float n_tw_beta; + float n_sw_beta; + float n_s_beta_sum; + float n_t_beta_sum; + + float nominator; + float denominator; + + float rejection; + float pi; + int m; + + for (int i = 0; i < mh_step_for_gs_; ++i) + { + int32_t t; + t = alias_k_v_[w].next(rng_, beta_height_, beta_mass_, beta_k_v_, false); + + rejection = rng_.rand_real(); + + n_td_alpha = doc_topic_counter_[t] + alpha_; + n_sd_alpha = doc_topic_counter_[s] + alpha_; + + nominator = n_td_alpha; + denominator = n_sd_alpha; + + pi = std::min((float)1.0, nominator / denominator); + + m = -(rejection < pi); + s = (t & m) | (s & ~m); + + float n_td_or_alpha = rng_.rand_real() * (n_td_sum_ + alpha_sum_); + if (n_td_or_alpha < n_td_sum_) + { + int32_t t_idx = rng_.rand_k(doc_size_); + t = doc->Topic(t_idx); + } + else + { + t = rng_.rand_k(K_); + } + + rejection = rng_.rand_real(); + + + w_t_cnt = get_word_topic(w, t); + n_tw_beta = w_t_cnt + beta_; + n_t_beta_sum = summary_row_[t] + beta_sum_; + + w_s_cnt = get_word_topic(w, s); + n_sw_beta = w_s_cnt + beta_; + n_s_beta_sum = summary_row_[s] + beta_sum_; + + nominator = n_tw_beta + * n_s_beta_sum; + + + denominator = n_sw_beta + * n_t_beta_sum; + + pi = std::min((float)1.0, nominator / denominator); + + m = -(rejection < pi); + s = (t & m) | (s & ~m); + } + int32_t src = s; + return src; + } + + int32_t LightDocSampler::OldProposalFreshSample(LDADocument *doc) + { + DocInit(doc); + int num_token = doc->size(); + int32_t &cursor = doc->get_cursor(); + + int32_t token_sweeped = 0; + cursor = 0; + + while (cursor < num_token) + { + ++token_sweeped; + + int32_t w = doc->Word(cursor); + int32_t s = doc->Topic(cursor); // old topic + + int t = Sample2WordFirst(doc, w, s, s); // new topic + + if (s != t) + { + word_topic_delta wtd; + int32_t shard_id = w % num_threads_; + wtd.word = w; + wtd.topic = s; + wtd.delta = -1; + word_topic_delta_[shard_id].push_back(wtd); + + wtd.topic = t; + wtd.delta = +1; + word_topic_delta_[shard_id].push_back(wtd); + + --delta_summary_row_[s]; + ++delta_summary_row_[t]; + + doc->SetTopic(cursor, t); + doc_topic_counter_.inc(s, -1); + doc_topic_counter_.inc(t, 1); + } + cursor++; + } + return token_sweeped; + } + + int32_t LightDocSampler::OldProposalFreshSampleInfer(LDADocument *doc) + { + + DocInit(doc); + int num_token = doc->size(); + int32_t &cursor = doc->get_cursor(); + + int32_t token_sweeped = 0; + cursor = 0; + + while (cursor < num_token) + { + ++token_sweeped; + + int32_t w = doc->Word(cursor); + int32_t s = doc->Topic(cursor); // old topic + + int t = Sample2WordFirstInfer(doc, w, s, s); // new topic + + if (s != t) + { + doc->SetTopic(cursor, t); + doc_topic_counter_.inc(s, -1); + doc_topic_counter_.inc(t, 1); + } + cursor++; + } + return token_sweeped; + } + + double LightDocSampler::NormalizeWordLLH() + { + double word_llh = K_ * log_topic_normalizer_; + for (int k = 0; k < K_; ++k) + { + word_llh -= LogGamma(summary_row_[k] + beta_sum_); + } + return word_llh; + } + + + double LightDocSampler::ComputeOneDocLLH(LDADocument* doc) + { + double doc_ll = 0; + double one_doc_llh = log_doc_normalizer_; + + // Compute doc-topic vector on the fly. + int num_tokens = doc->size(); + + if (num_tokens == 0) + { + return doc_ll; + } + + doc_topic_counter_.clear(); + doc->GetDocTopicCounter(doc_topic_counter_); + + int32_t capacity = doc_topic_counter_.capacity(); + int32_t *key = doc_topic_counter_.key(); + int32_t *value = doc_topic_counter_.value(); + int32_t nonzero_num = 0; + + for (int i = 0; i < capacity; ++i) + { + if (key[i] > 0) + { + one_doc_llh += LogGamma(value[i] + ll_alpha_); + ++nonzero_num; + } + } + one_doc_llh += (K_ - nonzero_num) * LogGamma(ll_alpha_); + one_doc_llh -= LogGamma(num_tokens + ll_alpha_ * K_); + + doc_ll += one_doc_llh; + return doc_ll; + } + + double LightDocSampler::ComputeWordLLH(int32_t lower, int32_t upper) + { + // word_llh is P(w|z). + double word_llh = 0; + double zero_entry_llh = LogGamma(beta_); + + // Since some vocabs are not present in the corpus, use num_words_seen to + // count # of words in corpus. + int num_words_seen = 0; + for (int w = lower; w < upper; ++w) + { + auto word_topic_row = get_word_row(w); + int32_t total_count = 0; + double delta = 0; + if (word_topic_row.is_dense()) + { + int32_t* memory = word_topic_row.memory(); + int32_t capacity = word_topic_row.capacity(); + int32_t count; + for (int i = 0; i < capacity; ++i) + { + count = memory[i]; + total_count += count; + delta += LogGamma(count + beta_); + } + } + else + { + int32_t* key = word_topic_row.key(); + int32_t* value = word_topic_row.value(); + int32_t capacity = word_topic_row.capacity(); + int32_t count; + int32_t nonzero_num = 0; + for (int i = 0; i < capacity; ++i) + { + if (key[i] > 0) + { + count = value[i]; + total_count += count; + delta += LogGamma(count + beta_); + ++nonzero_num; + } + } + delta += (K_ - nonzero_num) * zero_entry_llh; + } + + if (total_count) + { + word_llh += delta; + } + } + + return word_llh; + } + + void LightDocSampler::Dump(const std::string &dump_name, int32_t lower, int32_t upper) + { + std::ofstream wt_stream; + wt_stream.open(dump_name, std::ios::out); + + for (int w = lower; w < upper; ++w) + { + //why not just a serialization of current hybrid_map? do we need to do a search? + int nonzero_num = word_topic_table_[w].nonzero_num(); + if (nonzero_num) + { + wt_stream << w; + for (int t = 0; t < K_; ++t) + { + if (word_topic_table_[w][t] > 0) + { + wt_stream << " " << t << ":" << word_topic_table_[w][t]; + } + } + wt_stream << std::endl; + } + } + wt_stream.close(); + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/light_doc_sampler.hpp b/src/Native/LdaNative/light_doc_sampler.hpp new file mode 100644 index 0000000000..82e37b3bc5 --- /dev/null +++ b/src/Native/LdaNative/light_doc_sampler.hpp @@ -0,0 +1,187 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once + +#include "type_common.h" +#include "lda_document.h" +#include "rand_int_rng.h" +#include +#include +#include +#include +#include +#include +#include "alias_multinomial_rng_int.hpp" +#include "light_hash_map.h" +#include "utils.hpp" +#include "hybrid_map.h" +#include "hybrid_alias_map.h" +#include "model_block.h" + +namespace lda +{ + struct word_topic_delta + { + int32_t word; + int32_t topic; + int32_t delta; + }; + + class LightDocSampler + { + public: + LightDocSampler( + int32_t K, + int32_t V, + int32_t num_threads, + int32_t mh_step, + float beta, + float alpha_sum, + std::vector &word_topic_table, + std::vector &summary_row, + std::vector &alias_kv, + int32_t &beta_height, + float &beta_mass, + std::vector &beta_k_v + ); + + ~LightDocSampler(); + + int32_t GlobalInit(LDADocument *doc); + int32_t DocInit(LDADocument *doc); + void EpocInit(); + void AdaptAlphaSum(bool is_train); + void GetDocTopic(LDADocument *doc, int* pTopics, int* pProbs, int32_t& numTopicsMax); + + + int32_t SampleOneDoc(LDADocument *doc); + int32_t InferOneDoc(LDADocument *doc); + + // The i-th complete-llh calculation will use row i in llh_able_. This is + // part of log P(z) in eq.[3]. + double ComputeOneDocLLH(LDADocument* doc); + double ComputeWordLLH(int32_t lower, int32_t upper); + double NormalizeWordLLH(); + + inline void rng_restart() + { + rng_.restart(); + } + + + void Dump(const std::string &dump_name, int32_t lower, int32_t upper); + + void build_alias_table(int32_t lower, int32_t upper, int thread_id); + void build_word_topic_table(int32_t thread_id, int32_t num_threads, lda::LDAModelBlock &model_block); + + inline int32_t rand_k(); + inline wood::xorshift_rng& rng(); + inline lda::hybrid_map& get_word_row(int32_t word); + inline std::vector &get_summary_row(); + inline std::vector& get_word_topic_delta(int32_t thread_id); + inline std::vector& get_delta_summary_row(); + + private: + int32_t Sample2WordFirst(LDADocument *doc, int32_t w, int32_t s, int32_t old_topic); + int32_t Sample2WordFirstInfer(LDADocument *doc, int32_t w, int32_t s, int32_t old_topic); + inline void GenerateAliasTableforWord(int32_t word); + inline int32_t get_word_topic(int32_t word, int32_t topic); + inline void word_topic_dec(int32_t word, int32_t topic); + inline void word_topic_inc(int32_t word, int32_t topic); + int32_t OldProposalFreshSample(LDADocument *doc); + int32_t OldProposalFreshSampleInfer(LDADocument *doc); + + private: + int32_t num_tokens_; + int32_t num_unique_words_; + + int32_t K_; + int32_t V_; + real_t beta_; + real_t beta_sum_; + real_t alpha_; + real_t alpha_sum_; + + real_t ll_alpha_; + real_t ll_alpha_sum_; + + real_t delta_alpha_sum_; + + std::vector q_w_proportion_; + wood::AliasMultinomialRNGInt alias_rng_; + wood::xorshift_rng rng_; + std::vector &alias_k_v_; + + int32_t doc_size_; + + // the number of Metropolis Hastings step + int32_t mh_step_for_gs_; + real_t n_td_sum_; + + // model + std::vector &summary_row_; + std::vector &word_topic_table_; + int32_t *rehashing_buf_; + + int32_t &beta_height_; + float &beta_mass_; + std::vector &beta_k_v_; + + // delta + std::vector delta_summary_row_; + + int32_t num_threads_; + std::vector> word_topic_delta_; + + // ================ Precompute LLH Parameters ================= + // Log of normalization constant (per docoument) from eq.[3]. + double log_doc_normalizer_; + + // Log of normalization constant (per topic) from eq.[2]. + double log_topic_normalizer_; + lda::light_hash_map doc_topic_counter_; + }; + + inline int32_t LightDocSampler::rand_k() + { + return rng_.rand_k(K_); + } + inline wood::xorshift_rng& LightDocSampler::rng() + { + return rng_; + } + inline lda::hybrid_map& LightDocSampler::get_word_row(int32_t word) + { + return word_topic_table_[word]; + } + inline std::vector& LightDocSampler::get_summary_row() + { + return summary_row_; + } + inline std::vector& LightDocSampler::get_word_topic_delta(int32_t thread_id) + { + return word_topic_delta_[thread_id]; + } + inline std::vector& LightDocSampler::get_delta_summary_row() + { + return delta_summary_row_; + } + inline int32_t LightDocSampler::get_word_topic(int32_t word, int32_t topic) + { + return word_topic_table_[word][topic]; + } + inline void LightDocSampler::word_topic_dec(int32_t word, int32_t topic) + { + word_topic_table_[word].inc(topic, -1); + } + inline void LightDocSampler::word_topic_inc(int32_t word, int32_t topic) + { + word_topic_table_[word].inc(topic, 1); + } + inline void LightDocSampler::GenerateAliasTableforWord(int32_t word) + { + alias_k_v_[word].build_table(alias_rng_, word_topic_table_[word], summary_row_, q_w_proportion_, beta_, beta_sum_, word, rng_); + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/light_hash_map.cpp b/src/Native/LdaNative/light_hash_map.cpp new file mode 100644 index 0000000000..ae070c5e1c --- /dev/null +++ b/src/Native/LdaNative/light_hash_map.cpp @@ -0,0 +1,76 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include +#include "light_hash_map.h" + +namespace lda +{ + light_hash_map::light_hash_map(int32_t *mem_block, int32_t capacity) : + own_memory_(false), + capacity_(capacity), + mem_block_(mem_block), + empty_key_(0), + deleted_key_(-2) + { + key_ = mem_block_; + value_ = mem_block_ + capacity_; + clear(); + } + + light_hash_map::light_hash_map(int32_t capacity) : + own_memory_(true), + capacity_(capacity), + empty_key_(0), + deleted_key_(-2) + { + mem_block_ = new int32_t[capacity_ * 2]; + key_ = mem_block_; + value_ = mem_block_ + capacity_; + clear(); + } + + // must call set_memory after construction before use + light_hash_map::light_hash_map() : + capacity_(1024), + own_memory_(false), + empty_key_(0), + deleted_key_(-2), + mem_block_(nullptr), + key_(nullptr), + value_(nullptr) + { + } + + light_hash_map::~light_hash_map() + { + capacity_ = 0; + if (own_memory_ && mem_block_ != nullptr) + { + delete[]mem_block_; + } + + mem_block_ = nullptr; + key_ = nullptr; + value_ = nullptr; + } + + void light_hash_map::clear() + { + memset(mem_block_, 0, capacity_ * 2 * sizeof(int32_t)); + } + + void light_hash_map::sort() + { + //key is probablly empty in key_, sort by value_ + //this is just for the output process like getting the topic of document or a topic of term + } + + void light_hash_map::set_memory(int32_t *mem_block) + { + mem_block_ = mem_block; + key_ = mem_block_; + value_ = mem_block_ + capacity_; + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/light_hash_map.h b/src/Native/LdaNative/light_hash_map.h new file mode 100644 index 0000000000..6e07c4ce58 --- /dev/null +++ b/src/Native/LdaNative/light_hash_map.h @@ -0,0 +1,189 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once +#include +#include +#include +#include + +/* +A light-weight hash table, borrowing the idea from google::dense_hash_map +0, pair must be +1, It can or can not own memory, +2, It has a fixed capacity, needless to resize or shrink, +3, capacity_ should at lease be twice of the maximum number of inserted items, guaranteeing a low load factor, +4, capacity_ should be an integer power of 2 +5, emptry_key_ is fixed to 0 +6, deleted_key_ is fixed to -2 +*/ + +namespace lda +{ +// The probing method: +// Linear probing +// #define JUMP_(key, num_probes) ( 1 ) + +// Quadratic probing +#define JUMP_(key, num_probes) ( num_probes ) + +#define ILLEGAL_BUCKET -1 + + class light_hash_map + { + public: + + // must call set_memory after construction before use + light_hash_map(); + // NOTE: the size of mem_block_ = 2 * capacity_ + light_hash_map(int32_t *mem_block, int32_t capacity); + light_hash_map(int32_t capacity); + + ~light_hash_map(); + + void clear(); + void set_memory(int32_t *mem_block); + void sort(); + + inline int32_t capacity() const; + inline int32_t size() const; + inline int32_t* key() const; + inline int32_t* value() const; + // whether we can find the |key| in this hash table + inline bool has(int32_t key) const; + + // if |key| is already in table, increase its coresponding |value| with |delta| + // if not, insert |key| into the table and set |delta| as the |value| of |key| + inline void inc(int32_t key, int32_t delta); + + // query the value of |key| + // if |key| is in the table, return the |value| corresonding to |key| + // if not, just return 0 + inline int32_t operator[](int32_t key); + + private: + + light_hash_map(const light_hash_map &other) = delete; + light_hash_map& operator=(const light_hash_map &other) = delete; + + // Returns a pair of positions: 1st where the object is, 2nd where + // it would go if you wanted to insert it. 1st is ILLEGAL_BUCKET + // if object is not found; 2nd is ILLEGAL_BUCKET if it is. + // NOTE: because of deletions where-to-insert is not trivial: it's the + // first deleted bucket we see, as long as we don't find the key later + inline std::pair find_position(const int32_t key) const; + + bool own_memory_; + int32_t capacity_; + int32_t *mem_block_; + int32_t *key_; + int32_t *value_; + + int32_t empty_key_; + int32_t deleted_key_; + }; + + inline int32_t light_hash_map::capacity() const + { + return capacity_; + } + inline int32_t light_hash_map::size() const + { + int32_t size = 0; + for (int i = 0; i < capacity_; ++i) + { + if (key_[i] > 0) + { + ++size; + } + } + return size; + } + + inline int32_t* light_hash_map::key() const + { + return key_; + } + inline int32_t* light_hash_map::value() const + { + return value_; + } + + inline bool light_hash_map::has(int32_t key) const + { + int32_t internal_key = key + 1; + std::pair pos = find_position(internal_key); + return pos.first != ILLEGAL_BUCKET; + } + + inline void light_hash_map::inc(int32_t key, int32_t delta) + { + int32_t internal_key = key + 1; + std::pair pos = find_position(internal_key); + if (pos.first != ILLEGAL_BUCKET) + { + value_[pos.first] += delta; + if (value_[pos.first] == 0) // the value becomes zero, delete the key + { + key_[pos.first] = deleted_key_; + } + } + else // not found the key, insert it with delta as value + { + key_[pos.second] = internal_key; + value_[pos.second] = delta; + } + } + + inline int32_t light_hash_map::operator[](int32_t key) + { + int32_t internal_key = key + 1; + std::pair pos = find_position(internal_key); + if (pos.first != ILLEGAL_BUCKET) + { + return value_[pos.first]; + } + else + { + return 0; + } + } + + inline std::pair light_hash_map::find_position(const int32_t key) const + { + int num_probes = 0; + int32_t capacity_minus_one = capacity_ - 1; + int32_t idx = key % capacity_; + int32_t insert_pos = ILLEGAL_BUCKET; + while (1) // probe until something happens + { + if (key_[idx] == empty_key_) // bucket is empty + { + if (insert_pos == ILLEGAL_BUCKET) // found no prior place to insert + { + return std::pair(ILLEGAL_BUCKET, idx); + } + else // previously, there is a position to insert + { + return std::pair(ILLEGAL_BUCKET, insert_pos); + } + } + else if (key_[idx] == deleted_key_) // keep searching, but makr to insert + { + if (insert_pos == ILLEGAL_BUCKET) + { + insert_pos = idx; + } + } + else if (key_[idx] == key) + { + return std::pair(idx, ILLEGAL_BUCKET); + } + ++num_probes; // we are doing another probe + idx = (idx + JUMP_(key, num_probes) & capacity_minus_one); + assert(num_probes < capacity_ + && "Hashtable is full: an error in key_equal<> or hash<>"); + } + } +} \ No newline at end of file diff --git a/src/Native/LdaNative/model_block.cpp b/src/Native/LdaNative/model_block.cpp new file mode 100644 index 0000000000..ec15834aca --- /dev/null +++ b/src/Native/LdaNative/model_block.cpp @@ -0,0 +1,463 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + + +#include +#include +#include +#include "utils.hpp" +#include +#include "model_block.h" +#include "lda_document.h" + +namespace lda +{ + int64_t upper_bound(int64_t x) + { + if (x == 0) + { + return 0; + } + int64_t shift = 0; + int64_t y = 1; + x--; + while (x) + { + x = x >> 1; + y = y << 1; + ++shift; + } + return y; + } + + int32_t align64(int32_t size) + { + if (size % 64 == 0) + { + return size; + } + else + { + size = 64 * (size / 64) + 64; + return size; + } + } + + + LDAModelBlock::LDAModelBlock() + : dict_(nullptr), + num_vocabs_(0), + mem_block_size_(0), + mem_block_(nullptr), + alias_mem_block_size_(0), + alias_mem_block_(nullptr) + { + } + LDAModelBlock::~LDAModelBlock() + { + Clear(); + } + + void LDAModelBlock::Clear() + { + if (dict_) + { + delete[]dict_; + dict_ = nullptr; + } + if (mem_block_) + { + delete[]mem_block_; + mem_block_ = nullptr; + } + if (alias_mem_block_) + { + delete[]alias_mem_block_; + alias_mem_block_ = nullptr; + } + + num_vocabs_ = -1; + num_topics_ = -1; + + mem_block_size_ = 0; + alias_mem_block_size_ = 0; + } + + void LDAModelBlock::Init(int32_t num_vocabs, int32_t num_topics, int64_t nonzero_num) + { + num_vocabs_ = num_vocabs; + num_topics_ = num_topics; + + dict_ = new WordEntry[num_vocabs_]; + for (int i = 0; i < num_vocabs_; ++i) + { + // This warning is a false positive. Supressing it similar to the existing one on Line 140 below. +#pragma warning(suppress: 6386) + dict_[i].is_dense_ = 0; + dict_[i].is_alias_dense_ = 0; + } + + mem_block_size_ = 2 * upper_bound(load_factor_ * nonzero_num); + alias_mem_block_size_ = nonzero_num * 3; + + mem_block_ = new int32_t[mem_block_size_](); // NOTE: force to initialize the values to be zero + alias_mem_block_ = new int32_t[alias_mem_block_size_](); // NOTE: force to initialize the values to be zero + } + + void LDAModelBlock::Init(int32_t num_vocabs, int32_t num_topics, int64_t mem_block_size, int64_t alias_mem_block_size) + { + num_vocabs_ = num_vocabs; + num_topics_ = num_topics; + + dict_ = new WordEntry[num_vocabs_]; + for (int i = 0; i < num_vocabs_; ++i) + { + // This warning is a false positive. Supressing it similar to the existing one on Line 140 below. +#pragma warning(suppress: 6386) + dict_[i].is_dense_ = 0; + dict_[i].is_alias_dense_ = 0; + } + + mem_block_size_ = mem_block_size; + mem_block_ = new int32_t[mem_block_size_](); // NOTE : force to initialize the values to be zero + + alias_mem_block_size_ = alias_mem_block_size; + alias_mem_block_ = new int32_t[alias_mem_block_size_](); //NOTE: force to initialize the values to be zero + + std::cout << "mem_block_size = " << mem_block_size_ * 4 << std::endl; + std::cout << "alias_mem_block_size = " << alias_mem_block_size_ * 4 << std::endl; + + offset_ = 0; + alias_offset_ = 0; + } + + void LDAModelBlock::Init(int32_t num_vocabs, int32_t num_topics) + { + num_vocabs_ = num_vocabs; + num_topics_ = num_topics; + + dict_ = new WordEntry[num_vocabs_]; + for (int i = 0; i < num_vocabs_; ++i) + { + // This warning is a false positive caused by an old bug in PREfast. It is fixed in VS 2015. +#pragma warning(suppress: 6386) + dict_[i].tf = 0; + dict_[i].is_dense_ = 0; + dict_[i].is_alias_dense_ = 0; + } + } + + void LDAModelBlock::SetWordInfo(int word_id, int32_t nonzero_num, bool fullSparse) + { + dict_[word_id].word_id_ = word_id; + dict_[word_id].tf = nonzero_num; + + int32_t hot_thresh; + if (fullSparse) + { + // use a very large threshold to ensure every row of word-topic-table using a sparse representation + hot_thresh = std::numeric_limits::max(); + } + else + { + hot_thresh = num_topics_ / (2 * load_factor_); //hybrid + } + int32_t alias_hot_thresh; + if (fullSparse) + { + // use a very large threshold to ensure every row of alias table using a sparse representation + alias_hot_thresh = std::numeric_limits::max(); + } + else + { + alias_hot_thresh = (num_topics_ * 2) / 3; + } + + int32_t capacity = 0; + int32_t row_size = 0; + int32_t alias_capacity = 0; + int32_t alias_row_size = 0; + + if (dict_[word_id].tf >= hot_thresh) + { + dict_[word_id].is_dense_ = 1; + capacity = num_topics_; + row_size = capacity; + } + else if (dict_[word_id].tf > 0) + { + dict_[word_id].is_dense_ = 0; + int capacity_lower_bound = load_factor_ * dict_[word_id].tf; + capacity = (int32_t)upper_bound(capacity_lower_bound); + row_size = capacity * 2; + } + else + { + dict_[word_id].is_dense_ = 1; + row_size = 0; + capacity = 0; + } + + dict_[word_id].offset_ = offset_; + dict_[word_id].end_offset_ = offset_ + row_size; + dict_[word_id].capacity_ = capacity; + + offset_ += row_size; + + if (dict_[word_id].tf >= alias_hot_thresh) + { + alias_capacity = num_topics_; + alias_row_size = 2 * num_topics_; + dict_[word_id].is_alias_dense_ = 1; + } + else if (dict_[word_id].tf > 0) + { + alias_capacity = dict_[word_id].tf; + alias_row_size = 3 * dict_[word_id].tf; + dict_[word_id].is_alias_dense_ = 0; + } + else + { + alias_capacity = 0; + alias_row_size = 0; + dict_[word_id].is_alias_dense_ = 1; + } + dict_[word_id].alias_capacity_ = alias_capacity; + dict_[word_id].alias_offset_ = alias_offset_; + dict_[word_id].alias_end_offset_ = alias_offset_ + alias_row_size; + + alias_offset_ += alias_row_size; + } + + // NOTE: sometimes, we use totally sparse representation (in testing phase), fullSparse == true + // in other times, we use hybrid structure (in training phase), fullSparse == false + void LDAModelBlock::InitModelBlockByTFS(bool fullSparse) + { + const int32_t max_tf_thresh = std::numeric_limits::max(); + int32_t hot_thresh; + if (fullSparse) + { + // totally sparse + // use a very large threshold to ensure every row of word-topic-table using a sparse representation + hot_thresh = std::numeric_limits::max(); + } + else + { + // hybrid + hot_thresh = num_topics_ / (2 * load_factor_); + } + int32_t alias_hot_thresh; + if (fullSparse) + { + // use a very large threshold to ensure every row of alias table using a sparse representation + alias_hot_thresh = std::numeric_limits::max(); + } + else + { + alias_hot_thresh = (num_topics_ * 2) / 3; + } + + int32_t word_id; + int32_t capacity = 0; + int32_t row_size = 0; + int32_t alias_capacity = 0; + int32_t alias_row_size = 0; + + int64_t offset = 0; + int64_t alias_offset = 0; + + for (word_id = 0; word_id < num_vocabs_; ++word_id) + { + int32_t tf = dict_[word_id].tf; + + dict_[word_id].word_id_ = word_id; + dict_[word_id].tf = tf; + + if (tf >= hot_thresh) + { + dict_[word_id].is_dense_ = 1; + capacity = num_topics_; + row_size = capacity; + } + else if (tf > 0) + { + dict_[word_id].is_dense_ = 0; + int capacity_lower_bound = load_factor_ * tf; + capacity = (int32_t)upper_bound(capacity_lower_bound); + row_size = capacity * 2; + } + else + { + dict_[word_id].is_dense_ = 1; + capacity = 0; + row_size = 0; + } + + dict_[word_id].offset_ = offset; + dict_[word_id].end_offset_ = offset + row_size; + dict_[word_id].capacity_ = capacity; + + offset += row_size; + + if (tf >= alias_hot_thresh) + { + alias_capacity = num_topics_; + alias_row_size = 2 * num_topics_; + dict_[word_id].is_alias_dense_ = 1; + } + else if (tf > 0) + { + alias_capacity = tf; + alias_row_size = 3 * tf; + dict_[word_id].is_alias_dense_ = 0; + } + else + { + alias_capacity = 0; + alias_row_size = 0; + dict_[word_id].is_alias_dense_ = 1; + } + dict_[word_id].alias_capacity_ = alias_capacity; + dict_[word_id].alias_offset_ = alias_offset; + dict_[word_id].alias_end_offset_ = alias_offset + alias_row_size; + alias_offset += alias_row_size; + } + + mem_block_size_ = dict_[num_vocabs_ - 1].end_offset_; + mem_block_ = new int32_t[mem_block_size_](); // NOTE: force to initialize the values to be zero + + alias_mem_block_size_ = dict_[num_vocabs_ - 1].alias_end_offset_; + alias_mem_block_ = new int32_t[alias_mem_block_size_](); //NOTE: force to initialize the values to be zero + + std::cout << "mem_block_size = " << mem_block_size_ * 4 << std::endl; + std::cout << "alias_mem_block_size = " << alias_mem_block_size_ * 4 << std::endl; + } + + void LDAModelBlock::InitFromDataBlock(const LDADataBlock *data_block, int32_t num_vocabs, int32_t num_topics) + { + num_vocabs_ = num_vocabs; + num_topics_ = num_topics; + + int32_t doc_num = data_block->num_documents(); + dict_ = new WordEntry[num_vocabs_]; + for (int i = 0; i < num_vocabs_; ++i) + { + dict_[i].tf = 0; + } + + for (int i = 0; i < doc_num; ++i) + { + std::shared_ptr doc = data_block->GetOneDoc(i); + int32_t doc_size = doc->size(); + for (int j = 0; j < doc_size; ++j) + { + int32_t w = doc->Word(j); + dict_[w].tf++; + } + } + + InitModelBlockByTFS(false); + } + // Count the number of nonzero values in each row + void LDAModelBlock::CountNonZero(std::vector &tfs) + { + for (int i = 0; i < num_vocabs_; ++i) + { + hybrid_map row(mem_block_ + dict_[i].offset_, + dict_[i].is_dense_, + dict_[i].capacity_, + 0, + nullptr); + tfs[i] = row.nonzero_num(); + } + } + + void LDAModelBlock::GetModelSizeByTFS(bool fullSparse, std::vector &tfs, int64_t &mem_block_size, int64_t &alias_mem_block_size) + { + const int32_t max_tf_thresh = std::numeric_limits::max(); + int32_t hot_thresh; + if (fullSparse) + { + // totally sparse + // use a very large threshold to ensure every row of word-topic-table using a sparse representation + hot_thresh = std::numeric_limits::max(); + } + else + { + // hybrid + hot_thresh = num_topics_ / (2 * load_factor_); + } + // hot_thresh = 0; // totally dense + int32_t alias_hot_thresh; + if (fullSparse) + { + // use a very large threshold to ensure every row of alias table using a sparse representation + alias_hot_thresh = std::numeric_limits::max(); + } + else + { + alias_hot_thresh = (num_topics_ * 2) / 3; + } + + int32_t word_id; + int32_t capacity = 0; + int32_t alias_capacity = 0; + int32_t row_size = 0; + int32_t alias_row_size = 0; + + mem_block_size = 0; + alias_mem_block_size = 0; + + for (word_id = 0; word_id < num_vocabs_; ++word_id) + { + int32_t tf = tfs[word_id]; + + if (tf >= hot_thresh) + { + capacity = num_topics_; + row_size = capacity; + } + else if (tf > 0) + { + int capacity_lower_bound = load_factor_ * tf; + capacity = (int32_t)upper_bound(capacity_lower_bound); + row_size = capacity * 2; + } + else + { + capacity = 0; + row_size = 0; + } + mem_block_size += row_size; + + if (tf >= alias_hot_thresh) + { + alias_capacity = num_topics_; + alias_row_size = 2 * num_topics_; + } + else if (tf > 0) + { + alias_capacity = tf; + alias_row_size = 3 * tf; + } + else + { + alias_capacity = 0; + alias_row_size = 0; + } + alias_mem_block_size += alias_row_size; + } + } + + // NOTE: we can re-use the dict_ variable here, but we deliberately not use it. + // This function should not change the internal state of model_block_ + void LDAModelBlock::GetModelStat(int64_t &mem_block_size, int64_t &alias_mem_block_size) + { + std::vector tfs(num_vocabs_, 0); + CountNonZero(tfs); + + // calculate the mem_block_size, alias_mem_block_size + GetModelSizeByTFS(true, tfs, mem_block_size, alias_mem_block_size); + } +} diff --git a/src/Native/LdaNative/model_block.h b/src/Native/LdaNative/model_block.h new file mode 100644 index 0000000000..2160be1d7f --- /dev/null +++ b/src/Native/LdaNative/model_block.h @@ -0,0 +1,93 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once +#include +#include +#include +#include +#include +#include +#include "data_block.h" +#include "hybrid_map.h" +#include "hybrid_alias_map.h" + +namespace lda +{ + struct WordEntry + { + int32_t word_id_; + int64_t offset_; + int64_t end_offset_; + int32_t capacity_; + int32_t is_dense_; + + int32_t tf; + int64_t alias_offset_; + int64_t alias_end_offset_; + int32_t alias_capacity_; + int32_t is_alias_dense_; + }; + + class LDAModelBlock + { + public: + LDAModelBlock(); + ~LDAModelBlock(); + + inline hybrid_map get_row(int word_id, int32_t *external_buf); + inline hybrid_alias_map get_alias_row(int word_id); + void SetWordInfo(int word_id, int32_t nonzero_num, bool fullSparse); + + void Clear(); + void Init(int32_t num_vocabs, int32_t num_topics); + void Init(int32_t num_vocabs, int32_t num_topics, int64_t nonzero_num); + void Init(int32_t num_vocabs, int32_t num_topics, int64_t mem_block_size, int64_t alias_mem_block_size); + + void InitFromDataBlock(const LDADataBlock *data_block, int32_t num_vocabs, int32_t num_topics); + + void GetModelStat(int64_t &mem_block_size, int64_t &alias_mem_block_size); + + private: + + LDAModelBlock(const LDAModelBlock &other) = delete; + LDAModelBlock& operator=(const LDAModelBlock &other) = delete; + + void CountNonZero(std::vector &tfs); + void InitModelBlockByTFS(bool fullSparse); + void GetModelSizeByTFS(bool fullSparse, std::vector &tfs, int64_t &mem_block_size, int64_t &alias_mem_block_size); + + int32_t num_vocabs_; + int32_t num_topics_; + WordEntry *dict_; + int32_t *mem_block_; + int64_t mem_block_size_; + + int32_t *alias_mem_block_; + int64_t alias_mem_block_size_; + + int64_t offset_; + int64_t alias_offset_; + + const int32_t load_factor_ = 2; + const int32_t sparse_factor_ = 5; + }; + inline hybrid_map LDAModelBlock::get_row(int word_id, int32_t *external_buf) + { + hybrid_map row(mem_block_ + dict_[word_id].offset_, + dict_[word_id].is_dense_, + dict_[word_id].capacity_, + 0, + external_buf); + return row; + } + inline hybrid_alias_map LDAModelBlock::get_alias_row(int word_id) + { + hybrid_alias_map row(alias_mem_block_ + dict_[word_id].alias_offset_, + dict_[word_id].is_alias_dense_, + dict_[word_id].alias_capacity_); + return row; + } + +} \ No newline at end of file diff --git a/src/Native/LdaNative/rand_int_rng.h b/src/Native/LdaNative/rand_int_rng.h new file mode 100644 index 0000000000..c51943e11f --- /dev/null +++ b/src/Native/LdaNative/rand_int_rng.h @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once +#include +#include + +namespace wood +{ + class xorshift_rng + { + public: + xorshift_rng() + { + jxr = 1234567; + } + ~xorshift_rng() {} + + inline void restart() + { + jxr = 1234567; + } + + inline int32_t rand() + { + jxr ^= (jxr << 13); jxr ^= (jxr >> 17); jxr ^= (jxr << 5); //get random (xorshift) 32-bit integer + return jxr & 0x7fffffff; + } + inline int32_t rand_k(int K) + { + return (int32_t)(rand() * 4.6566125e-10 * K); + } + inline float rand_real() + { + return (float)(rand() * 4.6566125e-10); + } + private: + + xorshift_rng(const xorshift_rng &other) = delete; + xorshift_rng& operator=(const xorshift_rng &other) = delete; + + unsigned int jxr; + }; +} \ No newline at end of file diff --git a/src/Native/LdaNative/simple_barrier.h b/src/Native/LdaNative/simple_barrier.h new file mode 100644 index 0000000000..55f8d601b9 --- /dev/null +++ b/src/Native/LdaNative/simple_barrier.h @@ -0,0 +1,66 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#ifndef _SIMPLE_BARRIER_H_ +#define _SIMPLE_BARRIER_H_ + +#include +#include +#include +namespace lda +{ + class SimpleBarrier + { + public: + SimpleBarrier(unsigned int n) :barrier_size_(n), num_of_waiting_(0), rounds_(0) + {}; + + void reset() + { + throw "not implemented yet."; + } + + bool wait() + { + std::unique_lock lock(mutex_); + if (num_of_waiting_.fetch_add(1) >= barrier_size_ - 1) + { + cond_.notify_all(); + num_of_waiting_.store(0); + rounds_.fetch_add(1); + return true; + } + else + { + + unsigned int i = rounds_.load(); + cond_.wait(lock, [&]{return i != rounds_.load(); }); + return false; + } + } + + ~SimpleBarrier() + { + num_of_waiting_ = 0; + rounds_ = 0; + } + + + + protected: + const unsigned int barrier_size_; + + std::atomic num_of_waiting_; + std::atomic rounds_; + std::condition_variable cond_; + std::mutex mutex_; + }; +} + + + + + +#endif // _SIMPLE_BARRIER_H_ + diff --git a/src/Native/LdaNative/timer.h b/src/Native/LdaNative/timer.h new file mode 100644 index 0000000000..ac9aff94b2 --- /dev/null +++ b/src/Native/LdaNative/timer.h @@ -0,0 +1,95 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once +#include +using namespace std::chrono; +class CTimer +{ + +private: + + steady_clock::time_point startPerfomanceCount; + steady_clock::time_point endPerfomanceCount; + duration totalElapsed; +public: + char m_szMessage[1024]; + +public: + CTimer() + { + Initialize(); + } + + CTimer(bool bStartOnCreate) + { + Initialize(); + + if (bStartOnCreate) + { + Start(); + } + } + + void Initialize() + { + totalElapsed = duration(); + } + + void Start() + { + startPerfomanceCount = std::chrono::steady_clock::now(); + } + + // time unit: seconds + void Tag(const char* pszMsg = NULL) + { + endPerfomanceCount = std::chrono::steady_clock::now(); + totalElapsed += duration_cast> (endPerfomanceCount - startPerfomanceCount); + OutputStatistics(pszMsg); + //start next round + Start(); + } + + // time unit: seconds + void InnerTag() + { + endPerfomanceCount = std::chrono::steady_clock::now(); + totalElapsed += duration_cast> (endPerfomanceCount - startPerfomanceCount); + + OutputStatistics(m_szMessage); + + //start next round + Start(); + } + + float GetTotalElaps() + { + return totalElapsed.count(); + } + float GetTimeSpan() + { + endPerfomanceCount = std::chrono::steady_clock::now(); + totalElapsed += duration_cast> (endPerfomanceCount - startPerfomanceCount); + float timespent = totalElapsed.count(); + + //start next round + Start(); + + return timespent; + } + + float GetTaggedTimeSpan() + { + return duration_cast> (endPerfomanceCount - startPerfomanceCount).count(); + } + + void OutputStatistics(const char* pszMsg = NULL) + { + printf("Time Cost totally: %f, last time span(%s): %f seconds.\n", GetTotalElaps(), pszMsg, GetTaggedTimeSpan()); + } + +private: + CTimer(const CTimer& obj); +}; \ No newline at end of file diff --git a/src/Native/LdaNative/type_common.h b/src/Native/LdaNative/type_common.h new file mode 100644 index 0000000000..a7043b28b1 --- /dev/null +++ b/src/Native/LdaNative/type_common.h @@ -0,0 +1,9 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once + +namespace lda { + typedef float real_t; +} \ No newline at end of file diff --git a/src/Native/LdaNative/utils.cpp b/src/Native/LdaNative/utils.cpp new file mode 100644 index 0000000000..c1c5cee076 --- /dev/null +++ b/src/Native/LdaNative/utils.cpp @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include "utils.hpp" + +#include "math.h" +#include + +namespace { + const double cof[6] = { 76.18009172947146, -86.50532032941677, + 24.01409824083091, -1.231739572450155, + 0.1208650973866179e-2, -0.5395239384953e-5 + }; +} + +namespace lda { + + double LogGamma(double xx) + { + int j; + double x, y, tmp1, ser; + y = xx; + x = xx; + tmp1 = x + 5.5; + tmp1 -= (x + 0.5)*log(tmp1); + ser = 1.000000000190015; + for (j = 0; j < 6; j++) ser += cof[j] / ++y; + return -tmp1 + log(2.5066282746310005*ser / x); + } + + + double get_time() { + auto start = std::chrono::high_resolution_clock::now(); + auto since_epoch = start.time_since_epoch(); + return std::chrono::duration_cast>>(since_epoch).count(); + } + + void CBlockedIntQueue::clear() + { + std::lock_guard lock(_mutex); + _queue.clear(); + } + + int CBlockedIntQueue::pop() + { + std::unique_lock lock(_mutex); + _condition.wait(lock, [this] { return !_queue.empty(); }); + auto val = _queue.front(); + _queue.pop_front(); + return val; + } + + void CBlockedIntQueue::push(int value) + { + { + std::lock_guard lock(_mutex); + _queue.push_back(value); + } + _condition.notify_one(); + } +} diff --git a/src/Native/LdaNative/utils.hpp b/src/Native/LdaNative/utils.hpp new file mode 100644 index 0000000000..7b71ec67da --- /dev/null +++ b/src/Native/LdaNative/utils.hpp @@ -0,0 +1,49 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#pragma once +#define NOMINMAX + +#include +#include +#include +#include +#include + + +namespace lda { + + double LogGamma(double xx); + double get_time(); + + struct LDAEngineAtomics + { + LDAEngineAtomics() :doc_ll_(0), word_ll_(0), num_tokens_clock_(0), thread_counter_(0){} + ~LDAEngineAtomics() {} + + std::atomic doc_ll_; + std::atomic word_ll_; + + // # of tokens processed in a Clock() call. + std::atomic num_tokens_clock_; + std::atomic thread_counter_; + + std::mutex global_mutex_; + }; + + class CBlockedIntQueue + { + public: + void clear(); + int pop(); + void push(int value); + + private: + std::mutex _mutex; + std::condition_variable _condition; + std::deque _queue; + }; + + +} diff --git a/src/Native/build.proj b/src/Native/build.proj index 5074517fda..41611a24ff 100644 --- a/src/Native/build.proj +++ b/src/Native/build.proj @@ -10,8 +10,12 @@ - + + + $(PkgDir)_._ + + true $(BaseIntermediateOutputPath)version.c @@ -68,16 +72,29 @@ $(PackageRid)-$(TargetArchitecture) - + + RelativePath="Microsoft.ML.CpuMath\runtimes\$(PackageRid)\native" /> + + + + + + + + - diff --git a/src/Source.ruleset b/src/Source.ruleset new file mode 100644 index 0000000000..0668aec49c --- /dev/null +++ b/src/Source.ruleset @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/BaselineOutput/Common/EntryPoints/core_ep-list.tsv b/test/BaselineOutput/Common/EntryPoints/core_ep-list.tsv index a6d1f50668..fe46ca26e1 100644 --- a/test/BaselineOutput/Common/EntryPoints/core_ep-list.tsv +++ b/test/BaselineOutput/Common/EntryPoints/core_ep-list.tsv @@ -5,18 +5,23 @@ Data.PredictorModelArrayConverter Create an array variable of IPredictorModel Mi Data.TextLoader Import a dataset from a text file Microsoft.ML.Runtime.EntryPoints.ImportTextData TextLoader Microsoft.ML.Runtime.EntryPoints.ImportTextData+LoaderInput Microsoft.ML.Runtime.EntryPoints.ImportTextData+Output Data.TransformModelArrayConverter Create an array variable of ITransformModel Microsoft.ML.Runtime.EntryPoints.CrossValidationBinaryMacro MakeArray Microsoft.ML.Runtime.EntryPoints.CrossValidationBinaryMacro+ArrayITransformModelInput Microsoft.ML.Runtime.EntryPoints.CrossValidationBinaryMacro+ArrayITransformModelOutput Models.AnomalyDetectionEvaluator Evaluates an anomaly detection scored dataset. Microsoft.ML.Runtime.Data.Evaluate AnomalyDetection Microsoft.ML.Runtime.Data.AnomalyDetectionMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CommonEvaluateOutput +Models.AnomalyPipelineEnsemble Combine anomaly detection models into an ensemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator CreateAnomalyPipelineEnsemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator+PipelineAnomalyInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+AnomalyDetectionOutput Models.BinaryClassificationEvaluator Evaluates a binary classification scored dataset. Microsoft.ML.Runtime.Data.Evaluate Binary Microsoft.ML.Runtime.Data.BinaryClassifierMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+ClassificationEvaluateOutput Models.BinaryCrossValidator Cross validation for binary classification Microsoft.ML.Runtime.EntryPoints.CrossValidationBinaryMacro CrossValidateBinary Microsoft.ML.Runtime.EntryPoints.CrossValidationBinaryMacro+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MacroOutput`1[Microsoft.ML.Runtime.EntryPoints.CrossValidationBinaryMacro+Output] +Models.BinaryEnsemble Combine binary classifiers into an ensemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator CreateBinaryEnsemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator+ClassifierInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput +Models.BinaryPipelineEnsemble Combine binary classification models into an ensemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator CreateBinaryPipelineEnsemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator+PipelineClassifierInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput Models.ClassificationEvaluator Evaluates a multi class classification scored dataset. Microsoft.ML.Runtime.Data.Evaluate MultiClass Microsoft.ML.Runtime.Data.MultiClassMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+ClassificationEvaluateOutput Models.ClusterEvaluator Evaluates a clustering scored dataset. Microsoft.ML.Runtime.Data.Evaluate Clustering Microsoft.ML.Runtime.Data.ClusteringMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CommonEvaluateOutput Models.CrossValidationResultsCombiner Combine the metric data views returned from cross validation. Microsoft.ML.Runtime.EntryPoints.CrossValidationMacro CombineMetrics Microsoft.ML.Runtime.EntryPoints.CrossValidationMacro+CombineMetricsInput Microsoft.ML.Runtime.EntryPoints.CrossValidationMacro+CombinedOutput Models.CrossValidator Cross validation for general learning Microsoft.ML.Runtime.EntryPoints.CrossValidationMacro CrossValidate Microsoft.ML.Runtime.EntryPoints.CrossValidationMacro+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MacroOutput`1[Microsoft.ML.Runtime.EntryPoints.CrossValidationMacro+Output] Models.CrossValidatorDatasetSplitter Split the dataset into the specified number of cross-validation folds (train and test sets) Microsoft.ML.Runtime.EntryPoints.CVSplit Split Microsoft.ML.Runtime.EntryPoints.CVSplit+Input Microsoft.ML.Runtime.EntryPoints.CVSplit+Output Models.DatasetTransformer Applies a TransformModel to a dataset. Microsoft.ML.Runtime.EntryPoints.ModelOperations Apply Microsoft.ML.Runtime.EntryPoints.ModelOperations+ApplyTransformModelInput Microsoft.ML.Runtime.EntryPoints.ModelOperations+ApplyTransformModelOutput +Models.EnsembleSummary Summarize a pipeline ensemble predictor. Microsoft.ML.Runtime.Ensemble.EntryPoints.PipelineEnsemble Summarize Microsoft.ML.Runtime.EntryPoints.SummarizePredictor+Input Microsoft.ML.Runtime.Ensemble.EntryPoints.PipelineEnsemble+SummaryOutput Models.FixedPlattCalibrator Apply a Platt calibrator with a fixed slope and offset to an input model Microsoft.ML.Runtime.Internal.Calibration.Calibrate FixedPlatt Microsoft.ML.Runtime.Internal.Calibration.Calibrate+FixedPlattInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CalibratorOutput +Models.MultiClassPipelineEnsemble Combine multiclass classifiers into an ensemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator CreateMultiClassPipelineEnsemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator+PipelineClassifierInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput Models.MultiOutputRegressionEvaluator Evaluates a multi output regression scored dataset. Microsoft.ML.Runtime.Data.Evaluate MultiOutputRegression Microsoft.ML.Runtime.Data.MultiOutputRegressionMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CommonEvaluateOutput Models.NaiveCalibrator Apply a Naive calibrator to an input model Microsoft.ML.Runtime.Internal.Calibration.Calibrate Naive Microsoft.ML.Runtime.Internal.Calibration.Calibrate+NoArgumentsInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CalibratorOutput -Models.OneVersusAll One-vs-All macro (OVA) Microsoft.ML.Runtime.EntryPoints.OneVersusAllMacro OVA Microsoft.ML.Runtime.EntryPoints.OneVersusAllMacro+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MacroOutput`1[Microsoft.ML.Runtime.EntryPoints.OneVersusAllMacro+Output] +Models.OneVersusAll One-vs-All macro (OVA) Microsoft.ML.Runtime.EntryPoints.OneVersusAllMacro OneVersusAll Microsoft.ML.Runtime.EntryPoints.OneVersusAllMacro+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MacroOutput`1[Microsoft.ML.Runtime.EntryPoints.OneVersusAllMacro+Output] Models.OnnxConverter Converts the model to ONNX format. Microsoft.ML.Runtime.Model.Onnx.SaveOnnxCommand Apply Microsoft.ML.Runtime.Model.Onnx.SaveOnnxCommand+Arguments Microsoft.ML.Runtime.Model.Onnx.SaveOnnxCommand+Output Models.OvaModelCombiner Combines a sequence of PredictorModels into a single model Microsoft.ML.Runtime.Learners.OvaPredictor CombineOvaModels Microsoft.ML.Runtime.EntryPoints.ModelOperations+CombineOvaPredictorModelsInput Microsoft.ML.Runtime.EntryPoints.ModelOperations+PredictorModelOutput Models.PAVCalibrator Apply a PAV calibrator to an input model Microsoft.ML.Runtime.Internal.Calibration.Calibrate Pav Microsoft.ML.Runtime.Internal.Calibration.Calibrate+NoArgumentsInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CalibratorOutput @@ -24,39 +29,49 @@ Models.PipelineSweeper AutoML pipeline sweeping optimzation macro. Microsoft.ML. Models.PlattCalibrator Apply a Platt calibrator to an input model Microsoft.ML.Runtime.Internal.Calibration.Calibrate Platt Microsoft.ML.Runtime.Internal.Calibration.Calibrate+NoArgumentsInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CalibratorOutput Models.QuantileRegressionEvaluator Evaluates a quantile regression scored dataset. Microsoft.ML.Runtime.Data.Evaluate QuantileRegression Microsoft.ML.Runtime.Data.QuantileRegressionMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CommonEvaluateOutput Models.RankerEvaluator Evaluates a ranking scored dataset. Microsoft.ML.Runtime.Data.Evaluate Ranking Microsoft.ML.Runtime.Data.RankerMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CommonEvaluateOutput +Models.RegressionEnsemble Combine regression models into an ensemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator CreateRegressionEnsemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator+RegressionInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Models.RegressionEvaluator Evaluates a regression scored dataset. Microsoft.ML.Runtime.Data.Evaluate Regression Microsoft.ML.Runtime.Data.RegressionMamlEvaluator+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+CommonEvaluateOutput +Models.RegressionPipelineEnsemble Combine regression models into an ensemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator CreateRegressionPipelineEnsemble Microsoft.ML.Runtime.EntryPoints.EnsembleCreator+PipelineRegressionInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Models.Summarizer Summarize a linear regression predictor. Microsoft.ML.Runtime.EntryPoints.SummarizePredictor Summarize Microsoft.ML.Runtime.EntryPoints.SummarizePredictor+Input Microsoft.ML.Runtime.EntryPoints.CommonOutputs+SummaryOutput Models.SweepResultExtractor Extracts the sweep result. Microsoft.ML.Runtime.EntryPoints.PipelineSweeperMacro ExtractSweepResult Microsoft.ML.Runtime.EntryPoints.PipelineSweeperMacro+ResultInput Microsoft.ML.Runtime.EntryPoints.PipelineSweeperMacro+Output Models.TrainTestBinaryEvaluator Train test for binary classification Microsoft.ML.Runtime.EntryPoints.TrainTestBinaryMacro TrainTestBinary Microsoft.ML.Runtime.EntryPoints.TrainTestBinaryMacro+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MacroOutput`1[Microsoft.ML.Runtime.EntryPoints.TrainTestBinaryMacro+Output] Models.TrainTestEvaluator General train test for any supported evaluator Microsoft.ML.Runtime.EntryPoints.TrainTestMacro TrainTest Microsoft.ML.Runtime.EntryPoints.TrainTestMacro+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MacroOutput`1[Microsoft.ML.Runtime.EntryPoints.TrainTestMacro+Output] -Trainers.AveragedPerceptronBinaryClassifier Train a Average perceptron. Microsoft.ML.Runtime.Learners.AveragedPerceptronTrainer TrainBinary Microsoft.ML.Runtime.Learners.AveragedPerceptronTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput +Trainers.AveragedPerceptronBinaryClassifier Averaged Perceptron Binary Classifier. Microsoft.ML.Runtime.Learners.AveragedPerceptronTrainer TrainBinary Microsoft.ML.Runtime.Learners.AveragedPerceptronTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput +Trainers.EnsembleBinaryClassifier Train binary ensemble. Microsoft.ML.Ensemble.EntryPoints.Ensemble CreateBinaryEnsemble Microsoft.ML.Runtime.Ensemble.EnsembleTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput +Trainers.EnsembleClassification Train multiclass ensemble. Microsoft.ML.Ensemble.EntryPoints.Ensemble CreateMultiClassEnsemble Microsoft.ML.Runtime.Ensemble.MulticlassDataPartitionEnsembleTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput +Trainers.EnsembleRegression Train regression ensemble. Microsoft.ML.Ensemble.EntryPoints.Ensemble CreateRegressionEnsemble Microsoft.ML.Runtime.Ensemble.RegressionEnsembleTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.FastForestBinaryClassifier Uses a random forest learner to perform binary classification. Microsoft.ML.Runtime.FastTree.FastForest TrainBinary Microsoft.ML.Runtime.FastTree.FastForestClassification+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput Trainers.FastForestRegressor Trains a random forest to fit target values using least-squares. Microsoft.ML.Runtime.FastTree.FastForest TrainRegression Microsoft.ML.Runtime.FastTree.FastForestRegression+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.FastTreeBinaryClassifier Uses a logit-boost boosted tree learner to perform binary classification. Microsoft.ML.Runtime.FastTree.FastTree TrainBinary Microsoft.ML.Runtime.FastTree.FastTreeBinaryClassificationTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput Trainers.FastTreeRanker Trains gradient boosted decision trees to the LambdaRank quasi-gradient. Microsoft.ML.Runtime.FastTree.FastTree TrainRanking Microsoft.ML.Runtime.FastTree.FastTreeRankingTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RankingOutput Trainers.FastTreeRegressor Trains gradient boosted decision trees to fit target values using least-squares. Microsoft.ML.Runtime.FastTree.FastTree TrainRegression Microsoft.ML.Runtime.FastTree.FastTreeRegressionTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.FastTreeTweedieRegressor Trains gradient boosted decision trees to fit target values using a Tweedie loss function. This learner is a generalization of Poisson, compound Poisson, and gamma regression. Microsoft.ML.Runtime.FastTree.FastTree TrainTweedieRegression Microsoft.ML.Runtime.FastTree.FastTreeTweedieTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput +Trainers.FieldAwareFactorizationMachineBinaryClassifier Train a field-aware factorization machine for binary classification Microsoft.ML.Runtime.FactorizationMachine.FieldAwareFactorizationMachineTrainer TrainBinary Microsoft.ML.Runtime.FactorizationMachine.FieldAwareFactorizationMachineTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput Trainers.GeneralizedAdditiveModelBinaryClassifier Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features. Microsoft.ML.Runtime.FastTree.Gam TrainBinary Microsoft.ML.Runtime.FastTree.BinaryClassificationGamTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput Trainers.GeneralizedAdditiveModelRegressor Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features. Microsoft.ML.Runtime.FastTree.Gam TrainRegression Microsoft.ML.Runtime.FastTree.RegressionGamTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.KMeansPlusPlusClusterer K-means is a popular clustering algorithm. With K-means, the data is clustered into a specified number of clusters in order to minimize the within-cluster sum of squares. K-means++ improves upon K-means by using a better method for choosing the initial cluster centers. Microsoft.ML.Runtime.KMeans.KMeansPlusPlusTrainer TrainKMeans Microsoft.ML.Runtime.KMeans.KMeansPlusPlusTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+ClusteringOutput +Trainers.LightGbmBinaryClassifier Train a LightGBM binary classification model. Microsoft.ML.Runtime.LightGBM.LightGbm TrainBinary Microsoft.ML.Runtime.LightGBM.LightGbmArguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput +Trainers.LightGbmClassifier Train a LightGBM multi class model. Microsoft.ML.Runtime.LightGBM.LightGbm TrainMultiClass Microsoft.ML.Runtime.LightGBM.LightGbmArguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput +Trainers.LightGbmRanker Train a LightGBM ranking model. Microsoft.ML.Runtime.LightGBM.LightGbm TrainRanking Microsoft.ML.Runtime.LightGBM.LightGbmArguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RankingOutput +Trainers.LightGbmRegressor LightGBM Regression Microsoft.ML.Runtime.LightGBM.LightGbm TrainRegression Microsoft.ML.Runtime.LightGBM.LightGbmArguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.LinearSvmBinaryClassifier Train a linear SVM. Microsoft.ML.Runtime.Learners.LinearSvm TrainLinearSvm Microsoft.ML.Runtime.Learners.LinearSvm+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput -Trainers.LogisticRegressionBinaryClassifier Train a logistic regression binary model Microsoft.ML.Runtime.Learners.LogisticRegression TrainBinary Microsoft.ML.Runtime.Learners.LogisticRegression+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput -Trainers.LogisticRegressionClassifier Train a logistic regression multi class model Microsoft.ML.Runtime.Learners.LogisticRegression TrainMultiClass Microsoft.ML.Runtime.Learners.MulticlassLogisticRegression+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput +Trainers.LogisticRegressionBinaryClassifier Logistic Regression is a method in statistics used to predict the probability of occurrence of an event and can be used as a classification algorithm. The algorithm predicts the probability of occurrence of an event by fitting data to a logistical function. Microsoft.ML.Runtime.Learners.LogisticRegression TrainBinary Microsoft.ML.Runtime.Learners.LogisticRegression+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput +Trainers.LogisticRegressionClassifier Logistic Regression is a method in statistics used to predict the probability of occurrence of an event and can be used as a classification algorithm. The algorithm predicts the probability of occurrence of an event by fitting data to a logistical function. Microsoft.ML.Runtime.Learners.LogisticRegression TrainMultiClass Microsoft.ML.Runtime.Learners.MulticlassLogisticRegression+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput Trainers.NaiveBayesClassifier Train a MultiClassNaiveBayesTrainer. Microsoft.ML.Runtime.Learners.MultiClassNaiveBayesTrainer TrainMultiClassNaiveBayesTrainer Microsoft.ML.Runtime.Learners.MultiClassNaiveBayesTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput Trainers.OnlineGradientDescentRegressor Train a Online gradient descent perceptron. Microsoft.ML.Runtime.Learners.OnlineGradientDescentTrainer TrainRegression Microsoft.ML.Runtime.Learners.OnlineGradientDescentTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.PcaAnomalyDetector Train an PCA Anomaly model. Microsoft.ML.Runtime.PCA.RandomizedPcaTrainer TrainPcaAnomaly Microsoft.ML.Runtime.PCA.RandomizedPcaTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+AnomalyDetectionOutput Trainers.PoissonRegressor Train an Poisson regression model. Microsoft.ML.Runtime.Learners.PoissonRegression TrainRegression Microsoft.ML.Runtime.Learners.PoissonRegression+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.StochasticDualCoordinateAscentBinaryClassifier Train an SDCA binary model. Microsoft.ML.Runtime.Learners.Sdca TrainBinary Microsoft.ML.Runtime.Learners.LinearClassificationTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput -Trainers.StochasticDualCoordinateAscentClassifier Train an SDCA multi class model Microsoft.ML.Runtime.Learners.Sdca TrainMultiClass Microsoft.ML.Runtime.Learners.SdcaMultiClassTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput -Trainers.StochasticDualCoordinateAscentRegressor Train an SDCA regression model Microsoft.ML.Runtime.Learners.Sdca TrainRegression Microsoft.ML.Runtime.Learners.SdcaRegressionTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput +Trainers.StochasticDualCoordinateAscentClassifier The SDCA linear multi-class classification trainer. Microsoft.ML.Runtime.Learners.Sdca TrainMultiClass Microsoft.ML.Runtime.Learners.SdcaMultiClassTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+MulticlassClassificationOutput +Trainers.StochasticDualCoordinateAscentRegressor The SDCA linear regression trainer. Microsoft.ML.Runtime.Learners.Sdca TrainRegression Microsoft.ML.Runtime.Learners.SdcaRegressionTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+RegressionOutput Trainers.StochasticGradientDescentBinaryClassifier Train an Hogwild SGD binary model. Microsoft.ML.Runtime.Learners.StochasticGradientDescentClassificationTrainer TrainBinary Microsoft.ML.Runtime.Learners.StochasticGradientDescentClassificationTrainer+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+BinaryClassificationOutput Transforms.ApproximateBootstrapSampler Approximate bootstrap sampling. Microsoft.ML.Runtime.Data.BootstrapSample GetSample Microsoft.ML.Runtime.Data.BootstrapSampleTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.BinaryPredictionScoreColumnsRenamer For binary prediction, it renames the PredictedLabel and Score columns to include the name of the positive class. Microsoft.ML.Runtime.EntryPoints.ScoreModel RenameBinaryPredictionScoreColumns Microsoft.ML.Runtime.EntryPoints.ScoreModel+RenameBinaryPredictionScoreColumnsInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.BinNormalizer The values are assigned into equidensity bins and a value is mapped to its bin_number/number_of_bins. Microsoft.ML.Runtime.Data.Normalize Bin Microsoft.ML.Runtime.Data.NormalizeTransform+BinArguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput -Transforms.CategoricalHashOneHotVectorizer Encodes the categorical variable with hash-based encoding Microsoft.ML.Runtime.Data.Categorical CatTransformHash Microsoft.ML.Runtime.Data.CategoricalHashTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput -Transforms.CategoricalOneHotVectorizer Encodes the categorical variable with one-hot encoding based on term dictionary Microsoft.ML.Runtime.Data.Categorical CatTransformDict Microsoft.ML.Runtime.Data.CategoricalTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput +Transforms.CategoricalHashOneHotVectorizer Converts the categorical value into an indicator array by hashing the value and using the hash as an index in the bag. If the input column is a vector, a single indicator bag is returned for it. Microsoft.ML.Runtime.Data.Categorical CatTransformHash Microsoft.ML.Runtime.Data.CategoricalHashTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput +Transforms.CategoricalOneHotVectorizer Converts the categorical value into an indicator array by building a dictionary of categories based on the data and using the id in the dictionary as the index in the array. Microsoft.ML.Runtime.Data.Categorical CatTransformDict Microsoft.ML.Runtime.Data.CategoricalTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.CharacterTokenizer Character-oriented tokenizer where text is considered a sequence of characters. Microsoft.ML.Runtime.Transforms.TextAnalytics CharTokenize Microsoft.ML.Runtime.TextAnalytics.CharTokenizeTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput -Transforms.ColumnConcatenator Concatenates two columns of the same item type. Microsoft.ML.Runtime.EntryPoints.SchemaManipulation ConcatColumns Microsoft.ML.Runtime.Data.ConcatTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput +Transforms.ColumnConcatenator Concatenates one or more columns of the same item type. Microsoft.ML.Runtime.EntryPoints.SchemaManipulation ConcatColumns Microsoft.ML.Runtime.Data.ConcatTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.ColumnCopier Duplicates columns from the dataset Microsoft.ML.Runtime.EntryPoints.SchemaManipulation CopyColumns Microsoft.ML.Runtime.Data.CopyColumnsTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.ColumnDropper Drops columns from the dataset Microsoft.ML.Runtime.EntryPoints.SchemaManipulation DropColumns Microsoft.ML.Runtime.Data.DropColumnsTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.ColumnSelector Selects a set of columns, dropping all others Microsoft.ML.Runtime.EntryPoints.SchemaManipulation SelectColumns Microsoft.ML.Runtime.Data.DropColumnsTransform+KeepArguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput @@ -76,6 +91,7 @@ Transforms.KeyToTextConverter KeyToValueTransform utilizes KeyValues metadata to Transforms.LabelColumnKeyBooleanConverter Transforms the label to either key or bool (if needed) to make it suitable for classification. Microsoft.ML.Runtime.EntryPoints.FeatureCombiner PrepareClassificationLabel Microsoft.ML.Runtime.EntryPoints.FeatureCombiner+ClassificationLabelInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.LabelIndicator Label remapper used by OVA Microsoft.ML.Runtime.Data.LabelIndicatorTransform LabelIndicator Microsoft.ML.Runtime.Data.LabelIndicatorTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.LabelToFloatConverter Transforms the label to float to make it suitable for regression. Microsoft.ML.Runtime.EntryPoints.FeatureCombiner PrepareRegressionLabel Microsoft.ML.Runtime.EntryPoints.FeatureCombiner+RegressionLabelInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput +Transforms.LightLda The LDA transform implements LightLDA, a state-of-the-art implementation of Latent Dirichlet Allocation. Microsoft.ML.Runtime.Transforms.TextAnalytics LightLda Microsoft.ML.Runtime.TextAnalytics.LdaTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.LogMeanVarianceNormalizer Normalizes the data based on the computed mean and variance of the logarithm of the data. Microsoft.ML.Runtime.Data.Normalize LogMeanVar Microsoft.ML.Runtime.Data.NormalizeTransform+LogMeanVarArguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.LpNormalizer Normalize vectors (rows) individually by rescaling them to unit norm (L2, L1 or LInf). Performs the following operation on a vector X: Y = (X - M) / D, where M is mean and D is either L2 norm, L1 norm or LInf norm. Microsoft.ML.Runtime.Data.LpNormalization Normalize Microsoft.ML.Runtime.Data.LpNormNormalizerTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.ManyHeterogeneousModelCombiner Combines a sequence of TransformModels and a PredictorModel into a single PredictorModel. Microsoft.ML.Runtime.EntryPoints.ModelOperations CombineModels Microsoft.ML.Runtime.EntryPoints.ModelOperations+PredictorModelInput Microsoft.ML.Runtime.EntryPoints.ModelOperations+PredictorModelOutput @@ -90,7 +106,7 @@ Transforms.ModelCombiner Combines a sequence of TransformModels into a single mo Transforms.NGramTranslator Produces a bag of counts of ngrams (sequences of consecutive values of length 1-n) in a given vector of keys. It does so by building a dictionary of ngrams and using the id in the dictionary as the index in the bag. Microsoft.ML.Runtime.Transforms.TextAnalytics NGramTransform Microsoft.ML.Runtime.Data.NgramTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.NoOperation Does nothing. Microsoft.ML.Runtime.Data.NopTransform Nop Microsoft.ML.Runtime.Data.NopTransform+NopInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.OptionalColumnCreator If the source column does not exist after deserialization, create a column with the right type and default values. Microsoft.ML.Runtime.DataPipe.OptionalColumnTransform MakeOptional Microsoft.ML.Runtime.DataPipe.OptionalColumnTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput -Transforms.PcaCalculator Train an PCA Anomaly model. Microsoft.ML.Runtime.Data.PcaTransform Calculate Microsoft.ML.Runtime.Data.PcaTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput +Transforms.PcaCalculator PCA is a dimensionality-reduction transform which computes the projection of a numeric vector onto a low-rank subspace. Microsoft.ML.Runtime.Data.PcaTransform Calculate Microsoft.ML.Runtime.Data.PcaTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.PredictedLabelColumnOriginalValueConverter Transforms a predicted label column to its original values, unless it is of type bool. Microsoft.ML.Runtime.EntryPoints.FeatureCombiner ConvertPredictedLabel Microsoft.ML.Runtime.EntryPoints.FeatureCombiner+PredictedLabelInput Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.RandomNumberGenerator Adds a column with a generated number sequence. Microsoft.ML.Runtime.Data.RandomNumberGenerator Generate Microsoft.ML.Runtime.Data.GenerateNumberTransform+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput Transforms.RowRangeFilter Filters a dataview on a column of type Single, Double or Key (contiguous). Keeps the values that are in the specified min/max range. NaNs are always filtered out. If the input is a Key type, the min/max are considered percentages of the number of values. Microsoft.ML.Runtime.EntryPoints.SelectRows FilterByRange Microsoft.ML.Runtime.Data.RangeFilter+Arguments Microsoft.ML.Runtime.EntryPoints.CommonOutputs+TransformOutput diff --git a/test/BaselineOutput/Common/EntryPoints/core_manifest.json b/test/BaselineOutput/Common/EntryPoints/core_manifest.json index ea1a86a2e8..36bdd0f62a 100644 --- a/test/BaselineOutput/Common/EntryPoints/core_manifest.json +++ b/test/BaselineOutput/Common/EntryPoints/core_manifest.json @@ -654,6 +654,57 @@ "IEvaluatorOutput" ] }, + { + "Name": "Models.AnomalyPipelineEnsemble", + "Desc": "Combine anomaly detection models into an ensemble", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "Models", + "Type": { + "Kind": "Array", + "ItemType": "PredictorModel" + }, + "Desc": "The models to combine into an ensemble", + "Aliases": [ + "models" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ModelCombiner", + "Type": { + "Kind": "Enum", + "Values": [ + "Median", + "Average" + ] + }, + "Desc": "The combiner used to combine the scores", + "Aliases": [ + "combiner" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Average" + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "OutputKind": [ + "IAnomalyDetectionOutput", + "ITrainerOutput" + ] + }, { "Name": "Models.BinaryClassificationEvaluator", "Desc": "Evaluates a binary classification scored dataset.", @@ -967,6 +1018,122 @@ } ] }, + { + "Name": "Models.BinaryEnsemble", + "Desc": "Combine binary classifiers into an ensemble", + "FriendlyName": "Parallel Ensemble (bagging, stacking, etc)", + "ShortName": null, + "Inputs": [ + { + "Name": "Models", + "Type": { + "Kind": "Array", + "ItemType": "PredictorModel" + }, + "Desc": "The models to combine into an ensemble", + "Aliases": [ + "models" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ModelCombiner", + "Type": { + "Kind": "Enum", + "Values": [ + "Median", + "Average", + "Vote" + ] + }, + "Desc": "The combiner used to combine the scores", + "Aliases": [ + "combiner" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Median" + }, + { + "Name": "ValidatePipelines", + "Type": "Bool", + "Desc": "Whether to validate that all the pipelines are identical", + "Aliases": [ + "validate" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": true + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "OutputKind": [ + "IBinaryClassificationOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Models.BinaryPipelineEnsemble", + "Desc": "Combine binary classification models into an ensemble", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "Models", + "Type": { + "Kind": "Array", + "ItemType": "PredictorModel" + }, + "Desc": "The models to combine into an ensemble", + "Aliases": [ + "models" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ModelCombiner", + "Type": { + "Kind": "Enum", + "Values": [ + "Median", + "Average", + "Vote" + ] + }, + "Desc": "The combiner used to combine the scores", + "Aliases": [ + "combiner" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Median" + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "OutputKind": [ + "IBinaryClassificationOutput", + "ITrainerOutput" + ] + }, { "Name": "Models.ClassificationEvaluator", "Desc": "Evaluates a multi class classification scored dataset.", @@ -1321,6 +1488,26 @@ "IsNullable": false, "Default": null }, + { + "Name": "Kind", + "Type": { + "Kind": "Enum", + "Values": [ + "SignatureBinaryClassifierTrainer", + "SignatureMultiClassClassifierTrainer", + "SignatureRankerTrainer", + "SignatureRegressorTrainer", + "SignatureMultiOutputRegressorTrainer", + "SignatureAnomalyDetectorTrainer", + "SignatureClusteringTrainer" + ] + }, + "Desc": "Specifies the trainer kind, which determines the evaluator to be used.", + "Required": true, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "SignatureBinaryClassifierTrainer" + }, { "Name": "LabelColumn", "Type": "String", @@ -1329,7 +1516,7 @@ "Label" ], "Required": false, - "SortOrder": 5.0, + "SortOrder": 6.0, "IsNullable": false, "Default": "Label" }, @@ -1341,30 +1528,10 @@ "weight" ], "Required": false, - "SortOrder": 6.0, + "SortOrder": 7.0, "IsNullable": false, "Default": "Weight" }, - { - "Name": "Kind", - "Type": { - "Kind": "Enum", - "Values": [ - "SignatureBinaryClassifierTrainer", - "SignatureMultiClassClassifierTrainer", - "SignatureRankerTrainer", - "SignatureRegressorTrainer", - "SignatureMultiOutputRegressorTrainer", - "SignatureAnomalyDetectorTrainer", - "SignatureClusteringTrainer" - ] - }, - "Desc": "Specifies the trainer kind, which determines the evaluator to be used.", - "Required": true, - "SortOrder": 6.0, - "IsNullable": false, - "Default": "SignatureBinaryClassifierTrainer" - }, { "Name": "GroupColumn", "Type": "String", @@ -1373,9 +1540,21 @@ "group" ], "Required": false, - "SortOrder": 12.0, + "SortOrder": 8.0, "IsNullable": false, "Default": "GroupId" + }, + { + "Name": "NameColumn", + "Type": "String", + "Desc": "Name column name", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 9.0, + "IsNullable": false, + "Default": "Name" } ], "Outputs": [ @@ -1537,7 +1716,7 @@ "lab" ], "Required": false, - "SortOrder": 10.0, + "SortOrder": 9.0, "IsNullable": false, "Default": "Label" }, @@ -1549,7 +1728,7 @@ "weight" ], "Required": false, - "SortOrder": 11.0, + "SortOrder": 10.0, "IsNullable": false, "Default": "Weight" }, @@ -1561,9 +1740,21 @@ "group" ], "Required": false, - "SortOrder": 12.0, + "SortOrder": 11.0, "IsNullable": false, "Default": "GroupId" + }, + { + "Name": "NameColumn", + "Type": "String", + "Desc": "Name column name", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 12.0, + "IsNullable": false, + "Default": "Name" } ], "Outputs": [ @@ -1694,6 +1885,43 @@ "ITransformInput" ] }, + { + "Name": "Models.EnsembleSummary", + "Desc": "Summarize a pipeline ensemble predictor.", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The predictor to summarize", + "Aliases": [ + "predictorModel" + ], + "Required": true, + "SortOrder": 150.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "Summaries", + "Type": { + "Kind": "Array", + "ItemType": "DataView" + }, + "Desc": "The summaries of the individual predictors" + }, + { + "Name": "Stats", + "Type": { + "Kind": "Array", + "ItemType": "DataView" + }, + "Desc": "The model statistics of the individual predictors" + } + ] + }, { "Name": "Models.FixedPlattCalibrator", "Desc": "Apply a Platt calibrator with a fixed slope and offset to an input model", @@ -1777,26 +2005,78 @@ ] }, { - "Name": "Models.MultiOutputRegressionEvaluator", - "Desc": "Evaluates a multi output regression scored dataset.", + "Name": "Models.MultiClassPipelineEnsemble", + "Desc": "Combine multiclass classifiers into an ensemble", "FriendlyName": null, "ShortName": null, "Inputs": [ { - "Name": "Data", - "Type": "DataView", - "Desc": "The data to be used for evaluation.", + "Name": "Models", + "Type": { + "Kind": "Array", + "ItemType": "PredictorModel" + }, + "Desc": "The models to combine into an ensemble", "Aliases": [ - "data" + "models" ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "NameColumn", - "Type": "String", - "Desc": "Name column name.", + "Name": "ModelCombiner", + "Type": { + "Kind": "Enum", + "Values": [ + "Median", + "Average", + "Vote" + ] + }, + "Desc": "The combiner used to combine the scores", + "Aliases": [ + "combiner" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Median" + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "OutputKind": [ + "IMulticlassClassificationOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Models.MultiOutputRegressionEvaluator", + "Desc": "Evaluates a multi output regression scored dataset.", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "The data to be used for evaluation.", + "Aliases": [ + "data" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "NameColumn", + "Type": "String", + "Desc": "Name column name.", "Aliases": [ "name" ], @@ -2471,6 +2751,102 @@ "SortOrder": 7.0, "IsNullable": false, "Default": null + }, + { + "Name": "LabelColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'Label'", + "Required": false, + "SortOrder": 8.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "GroupColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'Group'", + "Required": false, + "SortOrder": 9.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "WeightColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'Weight'", + "Required": false, + "SortOrder": 10.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "NameColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'Name'", + "Required": false, + "SortOrder": 11.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "NumericFeatureColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'NumericFeature'", + "Required": false, + "SortOrder": 12.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "CategoricalFeatureColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'CategoricalFeature'", + "Required": false, + "SortOrder": 13.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "TextFeatureColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'TextFeature'", + "Required": false, + "SortOrder": 14.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "ImagePathColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column(s) to use as Role 'ImagePath'", + "Required": false, + "SortOrder": 15.0, + "IsNullable": false, + "Default": null } ], "Outputs": [ @@ -2822,6 +3198,69 @@ "IEvaluatorOutput" ] }, + { + "Name": "Models.RegressionEnsemble", + "Desc": "Combine regression models into an ensemble", + "FriendlyName": "Regression Ensemble (bagging, stacking, etc)", + "ShortName": null, + "Inputs": [ + { + "Name": "Models", + "Type": { + "Kind": "Array", + "ItemType": "PredictorModel" + }, + "Desc": "The models to combine into an ensemble", + "Aliases": [ + "models" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ModelCombiner", + "Type": { + "Kind": "Enum", + "Values": [ + "Median", + "Average" + ] + }, + "Desc": "The combiner used to combine the scores", + "Aliases": [ + "combiner" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Median" + }, + { + "Name": "ValidatePipelines", + "Type": "Bool", + "Desc": "Whether to validate that all the pipelines are identical", + "Aliases": [ + "validate" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": true + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "OutputKind": [ + "IRegressionOutput", + "ITrainerOutput" + ] + }, { "Name": "Models.RegressionEvaluator", "Desc": "Evaluates a regression scored dataset.", @@ -2944,6 +3383,57 @@ "IEvaluatorOutput" ] }, + { + "Name": "Models.RegressionPipelineEnsemble", + "Desc": "Combine regression models into an ensemble", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "Models", + "Type": { + "Kind": "Array", + "ItemType": "PredictorModel" + }, + "Desc": "The models to combine into an ensemble", + "Aliases": [ + "models" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ModelCombiner", + "Type": { + "Kind": "Enum", + "Values": [ + "Median", + "Average" + ] + }, + "Desc": "The combiner used to combine the scores", + "Aliases": [ + "combiner" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Median" + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "OutputKind": [ + "IRegressionOutput", + "ITrainerOutput" + ] + }, { "Name": "Models.Summarizer", "Desc": "Summarize a linear regression predictor.", @@ -3292,6 +3782,18 @@ "SortOrder": 12.0, "IsNullable": false, "Default": "GroupId" + }, + { + "Name": "NameColumn", + "Type": "String", + "Desc": "Name column name", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 13.0, + "IsNullable": false, + "Default": "Name" } ], "Outputs": [ @@ -3349,7 +3851,7 @@ }, { "Name": "Trainers.AveragedPerceptronBinaryClassifier", - "Desc": "Train a Average perceptron.", + "Desc": "Averaged Perceptron Binary Classifier.", "FriendlyName": "Averaged Perceptron", "ShortName": "ap", "Inputs": [ @@ -3499,7 +4001,7 @@ "SweepRange": { "RangeType": "Float", "Min": 0.0, - "Max": 0.5 + "Max": 0.4 } }, { @@ -3695,31 +4197,11 @@ ] }, { - "Name": "Trainers.FastForestBinaryClassifier", - "Desc": "Uses a random forest learner to perform binary classification.", - "FriendlyName": "Fast Forest Classification", - "ShortName": "ff", + "Name": "Trainers.EnsembleBinaryClassifier", + "Desc": "Train binary ensemble.", + "FriendlyName": "Parallel Ensemble (bagging, stacking, etc)", + "ShortName": null, "Inputs": [ - { - "Name": "NumTrees", - "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", - "Aliases": [ - "iter" - ], - "Required": false, - "SortOrder": 1.0, - "IsNullable": false, - "Default": 100, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 20, - 100, - 500 - ] - } - }, { "Name": "TrainingData", "Type": "DataView", @@ -3732,22 +4214,25 @@ "IsNullable": false }, { - "Name": "NumLeaves", - "Type": "Int", - "Desc": "The max number of leaves in each regression tree", + "Name": "SamplingType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleSubsetSelector" + }, + "Desc": "Sampling Type", "Aliases": [ - "nl" + "st" ], "Required": false, "SortOrder": 2.0, "IsNullable": false, - "Default": 20, - "SweepRange": { - "RangeType": "Long", - "Min": 2, - "Max": 128, - "StepSize": 4.0, - "IsLogScale": true + "Default": { + "Name": "BootstrapSelector", + "Settings": { + "FeatureSelector": { + "Name": "AllFeatureSelector" + } + } } }, { @@ -3763,24 +4248,16 @@ "Default": "Features" }, { - "Name": "MinDocumentsInLeafs", + "Name": "NumModels", "Type": "Int", - "Desc": "The minimal number of documents allowed in a leaf of a regression tree, out of the subsampled data", + "Desc": "Number of models per batch. If not specified, will default to 50 if there is only one base predictor, or the number of base predictors otherwise.", "Aliases": [ - "mil" + "nm" ], "Required": false, "SortOrder": 3.0, - "IsNullable": false, - "Default": 10, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 1, - 10, - 50 - ] - } + "IsNullable": true, + "Default": null }, { "Name": "LabelColumn", @@ -3795,28 +4272,38 @@ "Default": "Label" }, { - "Name": "WeightColumn", - "Type": "String", - "Desc": "Column to use for example weight", + "Name": "SubModelSelectorType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleBinarySubModelSelector" + }, + "Desc": "Algorithm to prune the base learners for selective Ensemble", "Aliases": [ - "weight" + "pt" ], "Required": false, "SortOrder": 4.0, "IsNullable": false, - "Default": "Weight" + "Default": { + "Name": "AllSelector" + } }, { - "Name": "GroupIdColumn", - "Type": "String", - "Desc": "Column to use for example groupId", + "Name": "OutputCombiner", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleBinaryOutputCombiner" + }, + "Desc": "Output combiner", "Aliases": [ - "groupId" + "oc" ], "Required": false, "SortOrder": 5.0, "IsNullable": false, - "Default": "GroupId" + "Default": { + "Name": "Median" + } }, { "Name": "NormalizeFeatures", @@ -3859,547 +4346,517 @@ "Default": "Auto" }, { - "Name": "MaxTreeOutput", - "Type": "Float", - "Desc": "Upper bound on absolute value of single tree output", + "Name": "TrainParallel", + "Type": "Bool", + "Desc": "All the base learners will run asynchronously if the value is true", "Aliases": [ - "mo" + "tp" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 100.0 - }, - { - "Name": "Calibrator", - "Type": { - "Kind": "Component", - "ComponentKind": "CalibratorTrainer" - }, - "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", - "Required": false, - "SortOrder": 150.0, + "SortOrder": 106.0, "IsNullable": false, - "Default": { - "Name": "PlattCalibrator" - } + "Default": false }, { - "Name": "MaxCalibrationExamples", + "Name": "BatchSize", "Type": "Int", - "Desc": "The maximum number of examples to use when training the calibrator", + "Desc": "Batch size", + "Aliases": [ + "bs" + ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 107.0, "IsNullable": false, - "Default": 1000000 + "Default": -1 }, { - "Name": "QuantileSampleCount", - "Type": "Int", - "Desc": "Number of labels to be sampled from each leaf to make the distribtuion", + "Name": "ShowMetrics", + "Type": "Bool", + "Desc": "True, if metrics for each model need to be evaluated and shown in comparison table. This is done by using validation set if available or the training set", "Aliases": [ - "qsc" + "sm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 108.0, "IsNullable": false, - "Default": 100 + "Default": false + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "InputKind": [ + "ITrainerInputWithLabel", + "ITrainerInput" + ], + "OutputKind": [ + "IBinaryClassificationOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Trainers.EnsembleClassification", + "Desc": "Train multiclass ensemble.", + "FriendlyName": "Parallel Ensemble (bagging, stacking, etc)", + "ShortName": null, + "Inputs": [ + { + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false }, { - "Name": "ParallelTrainer", + "Name": "SamplingType", "Type": { "Kind": "Component", - "ComponentKind": "ParallelTraining" + "ComponentKind": "EnsembleSubsetSelector" }, - "Desc": "Allows to choose Parallel FastTree Learning Algorithm", + "Desc": "Sampling Type", "Aliases": [ - "parag" + "st" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 2.0, "IsNullable": false, "Default": { - "Name": "Single" + "Name": "BootstrapSelector", + "Settings": { + "FeatureSelector": { + "Name": "AllFeatureSelector" + } + } } }, { - "Name": "NumThreads", - "Type": "Int", - "Desc": "The number of threads to use", + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", "Aliases": [ - "t" + "feat" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Features" }, { - "Name": "RngSeed", + "Name": "NumModels", "Type": "Int", - "Desc": "The seed of the random number generator", + "Desc": "Number of models per batch. If not specified, will default to 50 if there is only one base predictor, or the number of base predictors otherwise.", "Aliases": [ - "r1" + "nm" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 123 + "SortOrder": 3.0, + "IsNullable": true, + "Default": null }, { - "Name": "FeatureSelectSeed", - "Type": "Int", - "Desc": "The seed of the active feature selection", + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", "Aliases": [ - "r3" + "lab" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": 123 + "Default": "Label" }, { - "Name": "EntropyCoefficient", - "Type": "Float", - "Desc": "The entropy (regularization) coefficient between 0 and 1", + "Name": "SubModelSelectorType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleMulticlassSubModelSelector" + }, + "Desc": "Algorithm to prune the base learners for selective Ensemble", "Aliases": [ - "e" + "pt" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 4.0, "IsNullable": false, - "Default": 0.0 + "Default": { + "Name": "AllSelectorMultiClass" + } }, { - "Name": "HistogramPoolSize", - "Type": "Int", - "Desc": "The number of histograms in the pool (between 2 and numLeaves)", + "Name": "OutputCombiner", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleMulticlassOutputCombiner" + }, + "Desc": "Output combiner", "Aliases": [ - "ps" + "oc" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": -1 + "Default": { + "Name": "MultiMedian" + } }, { - "Name": "DiskTranspose", - "Type": "Bool", - "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", "Aliases": [ - "dt" + "norm" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "SortOrder": 5.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "FeatureFlocks", - "Type": "Bool", - "Desc": "Whether to collectivize features during dataset preparation to speed up training", + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", "Aliases": [ - "flocks" + "cache" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 6.0, "IsNullable": false, - "Default": true + "Default": "Auto" }, { - "Name": "CategoricalSplit", + "Name": "TrainParallel", "Type": "Bool", - "Desc": "Whether to do split based on multiple categorical feature values.", + "Desc": "All the base learners will run asynchronously if the value is true", "Aliases": [ - "cat" + "tp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 106.0, "IsNullable": false, "Default": false }, { - "Name": "MaxCategoricalGroupsPerNode", + "Name": "BatchSize", "Type": "Int", - "Desc": "Maximum categorical split groups to consider when splitting on a categorical feature. Split groups are a collection of split points. This is used to reduce overfitting when there many categorical features.", + "Desc": "Batch size", "Aliases": [ - "mcg" + "bs" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 107.0, "IsNullable": false, - "Default": 64 + "Default": -1 }, { - "Name": "MaxCategoricalSplitPoints", - "Type": "Int", - "Desc": "Maximum categorical split points to consider when splitting on a categorical feature.", + "Name": "ShowMetrics", + "Type": "Bool", + "Desc": "True, if metrics for each model need to be evaluated and shown in comparison table. This is done by using validation set if available or the training set", "Aliases": [ - "maxcat" + "sm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 108.0, "IsNullable": false, - "Default": 64 - }, + "Default": false + } + ], + "Outputs": [ { - "Name": "MinDocsPercentageForCategoricalSplit", - "Type": "Float", - "Desc": "Minimum categorical docs percentage in a bin to consider for a split.", - "Aliases": [ - "mdop" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.001 - }, + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "InputKind": [ + "ITrainerInputWithLabel", + "ITrainerInput" + ], + "OutputKind": [ + "IMulticlassClassificationOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Trainers.EnsembleRegression", + "Desc": "Train regression ensemble.", + "FriendlyName": "Parallel Ensemble (bagging, stacking, etc)", + "ShortName": null, + "Inputs": [ { - "Name": "MinDocsForCategoricalSplit", - "Type": "Int", - "Desc": "Minimum categorical doc count in a bin to consider for a split.", + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", "Aliases": [ - "mdo" + "data" ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 100 + "Required": true, + "SortOrder": 1.0, + "IsNullable": false }, { - "Name": "Bias", - "Type": "Float", - "Desc": "Bias for calculating gradient for each feature bin for a categorical feature.", + "Name": "SamplingType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleSubsetSelector" + }, + "Desc": "Sampling Type", "Aliases": [ - "bias" + "st" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": 0.0 + "Default": { + "Name": "BootstrapSelector", + "Settings": { + "FeatureSelector": { + "Name": "AllFeatureSelector" + } + } + } }, { - "Name": "Bundling", - "Type": { - "Kind": "Enum", - "Values": [ - "None", - "AggregateLowPopulation", - "Adjacent" - ] - }, - "Desc": "Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle.", + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", "Aliases": [ - "bundle" + "feat" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": "None" + "Default": "Features" }, { - "Name": "MaxBins", + "Name": "NumModels", "Type": "Int", - "Desc": "Maximum number of distinct values (bins) per feature", + "Desc": "Number of models per batch. If not specified, will default to 50 if there is only one base predictor, or the number of base predictors otherwise.", "Aliases": [ - "mb" + "nm" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 255 + "SortOrder": 3.0, + "IsNullable": true, + "Default": null }, { - "Name": "SparsifyThreshold", - "Type": "Float", - "Desc": "Sparsity level needed to use sparse feature representation", + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", "Aliases": [ - "sp" + "lab" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": 0.7 + "Default": "Label" }, { - "Name": "FeatureFirstUsePenalty", - "Type": "Float", - "Desc": "The feature first use penalty coefficient", + "Name": "SubModelSelectorType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleRegressionSubModelSelector" + }, + "Desc": "Algorithm to prune the base learners for selective Ensemble", "Aliases": [ - "ffup" + "pt" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 4.0, "IsNullable": false, - "Default": 0.0 + "Default": { + "Name": "AllSelector" + } }, { - "Name": "FeatureReusePenalty", - "Type": "Float", - "Desc": "The feature re-use penalty (regularization) coefficient", + "Name": "OutputCombiner", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleRegressionOutputCombiner" + }, + "Desc": "Output combiner", "Aliases": [ - "frup" + "oc" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": 0.0 + "Default": { + "Name": "Median" + } }, { - "Name": "GainConfidenceLevel", - "Type": "Float", - "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", "Aliases": [ - "gainconf" + "norm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": 0.0 + "Default": "Auto" }, { - "Name": "SoftmaxTemperature", - "Type": "Float", - "Desc": "The temperature of the randomized softmax distribution for choosing the feature", + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", "Aliases": [ - "smtemp" + "cache" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 6.0, "IsNullable": false, - "Default": 0.0 + "Default": "Auto" }, { - "Name": "ExecutionTimes", + "Name": "TrainParallel", "Type": "Bool", - "Desc": "Print execution time breakdown to stdout", + "Desc": "All the base learners will run asynchronously if the value is true", "Aliases": [ - "et" + "tp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 106.0, "IsNullable": false, "Default": false }, { - "Name": "FeatureFraction", - "Type": "Float", - "Desc": "The fraction of features (chosen randomly) to use on each iteration", + "Name": "BatchSize", + "Type": "Int", + "Desc": "Batch size", "Aliases": [ - "ff" + "bs" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 107.0, "IsNullable": false, - "Default": 0.7 + "Default": -1 }, { - "Name": "BaggingSize", - "Type": "Int", - "Desc": "Number of trees in each bag (0 for disabling bagging)", + "Name": "ShowMetrics", + "Type": "Bool", + "Desc": "True, if metrics for each model need to be evaluated and shown in comparison table. This is done by using validation set if available or the training set", "Aliases": [ - "bag" + "sm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 108.0, "IsNullable": false, - "Default": 1 - }, + "Default": false + } + ], + "Outputs": [ { - "Name": "BaggingTrainFraction", - "Type": "Float", - "Desc": "Percentage of training examples used in each bag", + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "InputKind": [ + "ITrainerInputWithLabel", + "ITrainerInput" + ], + "OutputKind": [ + "IRegressionOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Trainers.FastForestBinaryClassifier", + "Desc": "Uses a random forest learner to perform binary classification.", + "FriendlyName": "Fast Forest Classification", + "ShortName": "ff", + "Inputs": [ + { + "Name": "NumTrees", + "Type": "Int", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ - "bagfrac" + "iter" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 1.0, "IsNullable": false, - "Default": 0.7 + "Default": 100, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 20, + 100, + 500 + ] + } }, { - "Name": "SplitFraction", - "Type": "Float", - "Desc": "The fraction of features (chosen randomly) to use on each split", + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", "Aliases": [ - "sf" + "data" ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.7 + "Required": true, + "SortOrder": 1.0, + "IsNullable": false }, { - "Name": "Smoothing", - "Type": "Float", - "Desc": "Smoothing paramter for tree regularization", + "Name": "NumLeaves", + "Type": "Int", + "Desc": "The max number of leaves in each regression tree", "Aliases": [ - "s" + "nl" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "AllowEmptyTrees", - "Type": "Bool", - "Desc": "When a root split is impossible, allow training to proceed", - "Aliases": [ - "allowempty", - "dummies" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true - }, - { - "Name": "FeatureCompressionLevel", - "Type": "Int", - "Desc": "The level of feature compression to use", - "Aliases": [ - "fcomp" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 1 - }, - { - "Name": "CompressEnsemble", - "Type": "Bool", - "Desc": "Compress the tree Ensemble", - "Aliases": [ - "cmp" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "MaxTreesAfterCompression", - "Type": "Int", - "Desc": "Maximum Number of trees after compression", - "Aliases": [ - "cmpmax" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": -1 - }, - { - "Name": "PrintTestGraph", - "Type": "Bool", - "Desc": "Print metrics graph for the first test set", - "Aliases": [ - "graph" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "PrintTrainValidGraph", - "Type": "Bool", - "Desc": "Print Train and Validation metrics in graph", - "Aliases": [ - "graphtv" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "TestFrequency", - "Type": "Int", - "Desc": "Calculate metric values for train/valid/test every k rounds", - "Aliases": [ - "tf" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 2147483647 - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The trained model" - } - ], - "InputKind": [ - "ITrainerInputWithGroupId", - "ITrainerInputWithWeight", - "ITrainerInputWithLabel", - "ITrainerInput" - ], - "OutputKind": [ - "IBinaryClassificationOutput", - "ITrainerOutput" - ] - }, - { - "Name": "Trainers.FastForestRegressor", - "Desc": "Trains a random forest to fit target values using least-squares.", - "FriendlyName": "FastForestRegression", - "ShortName": "ffr", - "Inputs": [ - { - "Name": "NumTrees", - "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", - "Aliases": [ - "iter" - ], - "Required": false, - "SortOrder": 1.0, - "IsNullable": false, - "Default": 100, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 20, - 100, - 500 - ] - } - }, - { - "Name": "TrainingData", - "Type": "DataView", - "Desc": "The data to be used for training", - "Aliases": [ - "data" - ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, - { - "Name": "NumLeaves", - "Type": "Int", - "Desc": "The max number of leaves in each regression tree", - "Aliases": [ - "nl" - ], - "Required": false, - "SortOrder": 2.0, - "IsNullable": false, - "Default": 20, - "SweepRange": { - "RangeType": "Long", - "Min": 2, - "Max": 128, - "StepSize": 4.0, - "IsLogScale": true - } + "Default": 20, + "SweepRange": { + "RangeType": "Long", + "Min": 2, + "Max": 128, + "StepSize": 4.0, + "IsLogScale": true + } }, { "Name": "FeatureColumn", @@ -4510,13 +4967,39 @@ "Default": "Auto" }, { - "Name": "ShuffleLabels", - "Type": "Bool", - "Desc": "Shuffle the labels on every iteration. Useful probably only if using this tree as a tree leaf featurizer for multiclass.", + "Name": "MaxTreeOutput", + "Type": "Float", + "Desc": "Upper bound on absolute value of single tree output", + "Aliases": [ + "mo" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": 100.0 + }, + { + "Name": "Calibrator", + "Type": { + "Kind": "Component", + "ComponentKind": "CalibratorTrainer" + }, + "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": { + "Name": "PlattCalibrator" + } + }, + { + "Name": "MaxCalibrationExamples", + "Type": "Int", + "Desc": "The maximum number of examples to use when training the calibrator", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000 }, { "Name": "QuantileSampleCount", @@ -4966,20 +5449,20 @@ "ITrainerInput" ], "OutputKind": [ - "IRegressionOutput", + "IBinaryClassificationOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.FastTreeBinaryClassifier", - "Desc": "Uses a logit-boost boosted tree learner to perform binary classification.", - "FriendlyName": "FastTree (Boosted Trees) Classification", - "ShortName": "ftc", + "Name": "Trainers.FastForestRegressor", + "Desc": "Trains a random forest to fit target values using least-squares.", + "FriendlyName": "FastForestRegression", + "ShortName": "ffr", "Inputs": [ { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -5070,24 +5553,6 @@ "IsNullable": false, "Default": "Label" }, - { - "Name": "LearningRates", - "Type": "Float", - "Desc": "The learning rate", - "Aliases": [ - "lr" - ], - "Required": false, - "SortOrder": 4.0, - "IsNullable": false, - "Default": 0.2, - "SweepRange": { - "RangeType": "Float", - "Min": 0.025, - "Max": 0.4, - "IsLogScale": true - } - }, { "Name": "WeightColumn", "Type": "String", @@ -5153,597 +5618,328 @@ "Default": "Auto" }, { - "Name": "UnbalancedSets", + "Name": "ShuffleLabels", "Type": "Bool", - "Desc": "Should we use derivatives optimized for unbalanced sets", - "Aliases": [ - "us" - ], + "Desc": "Shuffle the labels on every iteration. Useful probably only if using this tree as a tree leaf featurizer for multiclass.", "Required": false, "SortOrder": 150.0, "IsNullable": false, "Default": false }, { - "Name": "BestStepRankingRegressionTrees", - "Type": "Bool", - "Desc": "Use best regression step trees?", + "Name": "QuantileSampleCount", + "Type": "Int", + "Desc": "Number of labels to be sampled from each leaf to make the distribtuion", "Aliases": [ - "bsr" + "qsc" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": 100 }, { - "Name": "UseLineSearch", - "Type": "Bool", - "Desc": "Should we use line search for a step size", + "Name": "ParallelTrainer", + "Type": { + "Kind": "Component", + "ComponentKind": "ParallelTraining" + }, + "Desc": "Allows to choose Parallel FastTree Learning Algorithm", "Aliases": [ - "ls" + "parag" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": { + "Name": "Single" + } }, { - "Name": "NumPostBracketSteps", + "Name": "NumThreads", "Type": "Int", - "Desc": "Number of post-bracket line search steps", + "Desc": "The number of threads to use", "Aliases": [ - "lssteps" + "t" ], "Required": false, "SortOrder": 150.0, - "IsNullable": false, - "Default": 0 + "IsNullable": true, + "Default": null }, { - "Name": "MinStepSize", - "Type": "Float", - "Desc": "Minimum line search step size", + "Name": "RngSeed", + "Type": "Int", + "Desc": "The seed of the random number generator", "Aliases": [ - "minstep" + "r1" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0 + "Default": 123 }, { - "Name": "OptimizationAlgorithm", - "Type": { - "Kind": "Enum", - "Values": [ - "GradientDescent", - "AcceleratedGradientDescent", - "ConjugateGradientDescent" - ] - }, - "Desc": "Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent)", + "Name": "FeatureSelectSeed", + "Type": "Int", + "Desc": "The seed of the active feature selection", "Aliases": [ - "oa" + "r3" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": "GradientDescent" + "Default": 123 }, { - "Name": "EarlyStoppingRule", - "Type": { - "Kind": "Component", - "ComponentKind": "EarlyStoppingCriterion" - }, - "Desc": "Early stopping rule. (Validation set (/valid) is required.)", + "Name": "EntropyCoefficient", + "Type": "Float", + "Desc": "The entropy (regularization) coefficient between 0 and 1", "Aliases": [ - "esr" + "e" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": null + "Default": 0.0 }, { - "Name": "EarlyStoppingMetrics", + "Name": "HistogramPoolSize", "Type": "Int", - "Desc": "Early stopping metrics. (For regression, 1: L1, 2:L2; for ranking, 1:NDCG@1, 3:NDCG@3)", + "Desc": "The number of histograms in the pool (between 2 and numLeaves)", "Aliases": [ - "esmt" + "ps" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0 + "Default": -1 }, { - "Name": "EnablePruning", + "Name": "DiskTranspose", "Type": "Bool", - "Desc": "Enable post-training pruning to avoid overfitting. (a validation set is required)", + "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", "Aliases": [ - "pruning" + "dt" ], "Required": false, "SortOrder": 150.0, - "IsNullable": false, - "Default": false + "IsNullable": true, + "Default": null }, { - "Name": "UseTolerantPruning", + "Name": "FeatureFlocks", "Type": "Bool", - "Desc": "Use window and tolerance for pruning", + "Desc": "Whether to collectivize features during dataset preparation to speed up training", "Aliases": [ - "prtol" + "flocks" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": true }, { - "Name": "PruningThreshold", - "Type": "Float", - "Desc": "The tolerance threshold for pruning", + "Name": "CategoricalSplit", + "Type": "Bool", + "Desc": "Whether to do split based on multiple categorical feature values.", "Aliases": [ - "prth" + "cat" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.004 + "Default": false }, { - "Name": "PruningWindowSize", + "Name": "MaxCategoricalGroupsPerNode", "Type": "Int", - "Desc": "The moving window size for pruning", + "Desc": "Maximum categorical split groups to consider when splitting on a categorical feature. Split groups are a collection of split points. This is used to reduce overfitting when there many categorical features.", "Aliases": [ - "prws" + "mcg" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 5 + "Default": 64 }, { - "Name": "Shrinkage", - "Type": "Float", - "Desc": "Shrinkage", + "Name": "MaxCategoricalSplitPoints", + "Type": "Int", + "Desc": "Maximum categorical split points to consider when splitting on a categorical feature.", "Aliases": [ - "shrk" + "maxcat" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.025, - "Max": 4.0, - "IsLogScale": true - } + "Default": 64 }, { - "Name": "DropoutRate", + "Name": "MinDocsPercentageForCategoricalSplit", "Type": "Float", - "Desc": "Dropout rate for tree regularization", + "Desc": "Minimum categorical docs percentage in a bin to consider for a split.", "Aliases": [ - "tdrop" + "mdop" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 0.0, - 1E-09, - 0.05, - 0.1, - 0.2 - ] - } + "Default": 0.001 }, { - "Name": "GetDerivativesSampleRate", + "Name": "MinDocsForCategoricalSplit", "Type": "Int", - "Desc": "Sample each query 1 in k times in the GetDerivatives function", + "Desc": "Minimum categorical doc count in a bin to consider for a split.", "Aliases": [ - "sr" + "mdo" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1 + "Default": 100 }, { - "Name": "WriteLastEnsemble", - "Type": "Bool", - "Desc": "Write the last ensemble instead of the one determined by early stopping", + "Name": "Bias", + "Type": "Float", + "Desc": "Bias for calculating gradient for each feature bin for a categorical feature.", "Aliases": [ - "hl" + "bias" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": 0.0 }, { - "Name": "MaxTreeOutput", - "Type": "Float", - "Desc": "Upper bound on absolute value of single tree output", + "Name": "Bundling", + "Type": { + "Kind": "Enum", + "Values": [ + "None", + "AggregateLowPopulation", + "Adjacent" + ] + }, + "Desc": "Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle.", "Aliases": [ - "mo" + "bundle" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 100.0 + "Default": "None" }, { - "Name": "RandomStart", - "Type": "Bool", - "Desc": "Training starts from random ordering (determined by /r1)", + "Name": "MaxBins", + "Type": "Int", + "Desc": "Maximum number of distinct values (bins) per feature", "Aliases": [ - "rs" + "mb" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": 255 }, { - "Name": "FilterZeroLambdas", - "Type": "Bool", - "Desc": "Filter zero lambdas during training", + "Name": "SparsifyThreshold", + "Type": "Float", + "Desc": "Sparsity level needed to use sparse feature representation", "Aliases": [ - "fzl" + "sp" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": 0.7 }, { - "Name": "BaselineScoresFormula", - "Type": "String", - "Desc": "Freeform defining the scores that should be used as the baseline ranker", + "Name": "FeatureFirstUsePenalty", + "Type": "Float", + "Desc": "The feature first use penalty coefficient", "Aliases": [ - "basescores" + "ffup" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": null + "Default": 0.0 }, { - "Name": "BaselineAlphaRisk", - "Type": "String", - "Desc": "Baseline alpha for tradeoffs of risk (0 is normal training)", + "Name": "FeatureReusePenalty", + "Type": "Float", + "Desc": "The feature re-use penalty (regularization) coefficient", "Aliases": [ - "basealpha" + "frup" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": null + "Default": 0.0 }, { - "Name": "PositionDiscountFreeform", - "Type": "String", - "Desc": "The discount freeform which specifies the per position discounts of documents in a query (uses a single variable P for position where P=0 is first position)", + "Name": "GainConfidenceLevel", + "Type": "Float", + "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", "Aliases": [ - "pdff" + "gainconf" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": null + "Default": 0.0 }, { - "Name": "ParallelTrainer", - "Type": { - "Kind": "Component", - "ComponentKind": "ParallelTraining" - }, - "Desc": "Allows to choose Parallel FastTree Learning Algorithm", + "Name": "SoftmaxTemperature", + "Type": "Float", + "Desc": "The temperature of the randomized softmax distribution for choosing the feature", "Aliases": [ - "parag" + "smtemp" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": { - "Name": "Single" - } + "Default": 0.0 }, { - "Name": "NumThreads", - "Type": "Int", - "Desc": "The number of threads to use", + "Name": "ExecutionTimes", + "Type": "Bool", + "Desc": "Print execution time breakdown to stdout", "Aliases": [ - "t" + "et" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": false }, { - "Name": "RngSeed", - "Type": "Int", - "Desc": "The seed of the random number generator", + "Name": "FeatureFraction", + "Type": "Float", + "Desc": "The fraction of features (chosen randomly) to use on each iteration", "Aliases": [ - "r1" + "ff" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 123 + "Default": 0.7 }, { - "Name": "FeatureSelectSeed", + "Name": "BaggingSize", "Type": "Int", - "Desc": "The seed of the active feature selection", + "Desc": "Number of trees in each bag (0 for disabling bagging)", "Aliases": [ - "r3" + "bag" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 123 + "Default": 1 }, { - "Name": "EntropyCoefficient", - "Type": "Float", - "Desc": "The entropy (regularization) coefficient between 0 and 1", - "Aliases": [ - "e" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "HistogramPoolSize", - "Type": "Int", - "Desc": "The number of histograms in the pool (between 2 and numLeaves)", - "Aliases": [ - "ps" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": -1 - }, - { - "Name": "DiskTranspose", - "Type": "Bool", - "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", - "Aliases": [ - "dt" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "FeatureFlocks", - "Type": "Bool", - "Desc": "Whether to collectivize features during dataset preparation to speed up training", - "Aliases": [ - "flocks" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true - }, - { - "Name": "CategoricalSplit", - "Type": "Bool", - "Desc": "Whether to do split based on multiple categorical feature values.", - "Aliases": [ - "cat" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "MaxCategoricalGroupsPerNode", - "Type": "Int", - "Desc": "Maximum categorical split groups to consider when splitting on a categorical feature. Split groups are a collection of split points. This is used to reduce overfitting when there many categorical features.", - "Aliases": [ - "mcg" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 64 - }, - { - "Name": "MaxCategoricalSplitPoints", - "Type": "Int", - "Desc": "Maximum categorical split points to consider when splitting on a categorical feature.", - "Aliases": [ - "maxcat" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 64 - }, - { - "Name": "MinDocsPercentageForCategoricalSplit", - "Type": "Float", - "Desc": "Minimum categorical docs percentage in a bin to consider for a split.", - "Aliases": [ - "mdop" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.001 - }, - { - "Name": "MinDocsForCategoricalSplit", - "Type": "Int", - "Desc": "Minimum categorical doc count in a bin to consider for a split.", - "Aliases": [ - "mdo" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 100 - }, - { - "Name": "Bias", - "Type": "Float", - "Desc": "Bias for calculating gradient for each feature bin for a categorical feature.", - "Aliases": [ - "bias" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "Bundling", - "Type": { - "Kind": "Enum", - "Values": [ - "None", - "AggregateLowPopulation", - "Adjacent" - ] - }, - "Desc": "Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle.", - "Aliases": [ - "bundle" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": "None" - }, - { - "Name": "MaxBins", - "Type": "Int", - "Desc": "Maximum number of distinct values (bins) per feature", - "Aliases": [ - "mb" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 255 - }, - { - "Name": "SparsifyThreshold", - "Type": "Float", - "Desc": "Sparsity level needed to use sparse feature representation", - "Aliases": [ - "sp" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.7 - }, - { - "Name": "FeatureFirstUsePenalty", - "Type": "Float", - "Desc": "The feature first use penalty coefficient", - "Aliases": [ - "ffup" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "FeatureReusePenalty", - "Type": "Float", - "Desc": "The feature re-use penalty (regularization) coefficient", - "Aliases": [ - "frup" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "GainConfidenceLevel", - "Type": "Float", - "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", - "Aliases": [ - "gainconf" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "SoftmaxTemperature", - "Type": "Float", - "Desc": "The temperature of the randomized softmax distribution for choosing the feature", - "Aliases": [ - "smtemp" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "ExecutionTimes", - "Type": "Bool", - "Desc": "Print execution time breakdown to stdout", - "Aliases": [ - "et" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "FeatureFraction", - "Type": "Float", - "Desc": "The fraction of features (chosen randomly) to use on each iteration", - "Aliases": [ - "ff" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 1.0 - }, - { - "Name": "BaggingSize", - "Type": "Int", - "Desc": "Number of trees in each bag (0 for disabling bagging)", - "Aliases": [ - "bag" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0 - }, - { - "Name": "BaggingTrainFraction", + "Name": "BaggingTrainFraction", "Type": "Float", "Desc": "Percentage of training examples used in each bag", "Aliases": [ @@ -5764,7 +5960,7 @@ "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0 + "Default": 0.7 }, { "Name": "Smoothing", @@ -5878,20 +6074,20 @@ "ITrainerInput" ], "OutputKind": [ - "IBinaryClassificationOutput", + "IRegressionOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.FastTreeRanker", - "Desc": "Trains gradient boosted decision trees to the LambdaRank quasi-gradient.", - "FriendlyName": "FastTree (Boosted Trees) Ranking", - "ShortName": "ftrank", - "Inputs": [ - { + "Name": "Trainers.FastTreeBinaryClassifier", + "Desc": "Uses a logit-boost boosted tree learner to perform binary classification.", + "FriendlyName": "FastTree (Boosted Trees) Classification", + "ShortName": "ftc", + "Inputs": [ + { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -6065,92 +6261,11 @@ "Default": "Auto" }, { - "Name": "CustomGains", - "Type": "String", - "Desc": "Comma seperated list of gains associated to each relevance label.", - "Aliases": [ - "gains" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": "0,3,7,15,31" - }, - { - "Name": "TrainDcg", - "Type": "Bool", - "Desc": "Train DCG instead of NDCG", - "Aliases": [ - "dcg" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "SortingAlgorithm", - "Type": "String", - "Desc": "The sorting algorithm to use for DCG and LambdaMart calculations [DescendingStablePessimistic/DescendingStable/DescendingReverse/DescendingDotNet]", - "Aliases": [ - "sort" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": "DescendingStablePessimistic" - }, - { - "Name": "LambdaMartMaxTruncation", - "Type": "Int", - "Desc": "max-NDCG truncation to use in the Lambda Mart algorithm", - "Aliases": [ - "n" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 100 - }, - { - "Name": "ShiftedNdcg", - "Type": "Bool", - "Desc": "Use shifted NDCG", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "CostFunctionParam", - "Type": "Char", - "Desc": "Cost function parameter (w/c)", - "Aliases": [ - "cf" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": "w" - }, - { - "Name": "DistanceWeight2", - "Type": "Bool", - "Desc": "Distance weight 2 adjustment to cost", - "Aliases": [ - "dw" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "NormalizeQueryLambdas", + "Name": "UnbalancedSets", "Type": "Bool", - "Desc": "Normalize query lambdas", + "Desc": "Should we use derivatives optimized for unbalanced sets", "Aliases": [ - "nql" + "us" ], "Required": false, "SortOrder": 150.0, @@ -6249,7 +6364,7 @@ "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1 + "Default": 0 }, { "Name": "EnablePruning", @@ -6871,20 +6986,20 @@ "ITrainerInput" ], "OutputKind": [ - "IRankingOutput", + "IBinaryClassificationOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.FastTreeRegressor", - "Desc": "Trains gradient boosted decision trees to fit target values using least-squares.", - "FriendlyName": "FastTree (Boosted Trees) Regression", - "ShortName": "ftr", + "Name": "Trainers.FastTreeRanker", + "Desc": "Trains gradient boosted decision trees to the LambdaRank quasi-gradient.", + "FriendlyName": "FastTree (Boosted Trees) Ranking", + "ShortName": "ftrank", "Inputs": [ { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -7057,6 +7172,99 @@ "IsNullable": false, "Default": "Auto" }, + { + "Name": "CustomGains", + "Type": "String", + "Desc": "Comma seperated list of gains associated to each relevance label.", + "Aliases": [ + "gains" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "0,3,7,15,31" + }, + { + "Name": "TrainDcg", + "Type": "Bool", + "Desc": "Train DCG instead of NDCG", + "Aliases": [ + "dcg" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "SortingAlgorithm", + "Type": "String", + "Desc": "The sorting algorithm to use for DCG and LambdaMart calculations [DescendingStablePessimistic/DescendingStable/DescendingReverse/DescendingDotNet]", + "Aliases": [ + "sort" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "DescendingStablePessimistic" + }, + { + "Name": "LambdaMartMaxTruncation", + "Type": "Int", + "Desc": "max-NDCG truncation to use in the Lambda Mart algorithm", + "Aliases": [ + "n" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 100 + }, + { + "Name": "ShiftedNdcg", + "Type": "Bool", + "Desc": "Use shifted NDCG", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "CostFunctionParam", + "Type": "Char", + "Desc": "Cost function parameter (w/c)", + "Aliases": [ + "cf" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "w" + }, + { + "Name": "DistanceWeight2", + "Type": "Bool", + "Desc": "Distance weight 2 adjustment to cost", + "Aliases": [ + "dw" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "NormalizeQueryLambdas", + "Type": "Bool", + "Desc": "Normalize query lambdas", + "Aliases": [ + "nql" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, { "Name": "BestStepRankingRegressionTrees", "Type": "Bool", @@ -7771,20 +7979,20 @@ "ITrainerInput" ], "OutputKind": [ - "IRegressionOutput", + "IRankingOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.FastTreeTweedieRegressor", - "Desc": "Trains gradient boosted decision trees to fit target values using a Tweedie loss function. This learner is a generalization of Poisson, compound Poisson, and gamma regression.", - "FriendlyName": "FastTree (Boosted Trees) Tweedie Regression", - "ShortName": "fttweedie", + "Name": "Trainers.FastTreeRegressor", + "Desc": "Trains gradient boosted decision trees to fit target values using least-squares.", + "FriendlyName": "FastTree (Boosted Trees) Regression", + "ShortName": "ftr", "Inputs": [ { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -7957,15 +8165,6 @@ "IsNullable": false, "Default": "Auto" }, - { - "Name": "Index", - "Type": "Float", - "Desc": "Index parameter for the Tweedie distribution, in the range [1, 2]. 1 is Poisson loss, 2 is gamma loss, and intermediate values are compound Poisson loss.", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 1.5 - }, { "Name": "BestStepRankingRegressionTrees", "Type": "Bool", @@ -8058,7 +8257,7 @@ "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0 + "Default": 1 }, { "Name": "EnablePruning", @@ -8685,28 +8884,28 @@ ] }, { - "Name": "Trainers.GeneralizedAdditiveModelBinaryClassifier", - "Desc": "Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features.", - "FriendlyName": "Generalized Additive Model for Binary Classification", - "ShortName": "gam", + "Name": "Trainers.FastTreeTweedieRegressor", + "Desc": "Trains gradient boosted decision trees to fit target values using a Tweedie loss function. This learner is a generalization of Poisson, compound Poisson, and gamma regression.", + "FriendlyName": "FastTree (Boosted Trees) Tweedie Regression", + "ShortName": "fttweedie", "Inputs": [ { - "Name": "NumIterations", + "Name": "NumTrees", "Type": "Int", - "Desc": "Total number of iterations over all features", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], "Required": false, "SortOrder": 1.0, "IsNullable": false, - "Default": 9500, + "Default": 100, "SweepRange": { "RangeType": "Discrete", "Values": [ - 200, - 1500, - 9500 + 20, + 100, + 500 ] } }, @@ -8722,23 +8921,42 @@ "IsNullable": false }, { - "Name": "FeatureColumn", - "Type": "String", - "Desc": "Column to use for features", + "Name": "NumLeaves", + "Type": "Int", + "Desc": "The max number of leaves in each regression tree", "Aliases": [ - "feat" + "nl" ], "Required": false, "SortOrder": 2.0, "IsNullable": false, - "Default": "Features" + "Default": 20, + "SweepRange": { + "RangeType": "Long", + "Min": 2, + "Max": 128, + "StepSize": 4.0, + "IsLogScale": true + } }, { - "Name": "MinDocuments", + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Features" + }, + { + "Name": "MinDocumentsInLeafs", "Type": "Int", - "Desc": "Minimum number of training instances required to form a partition", + "Desc": "The minimal number of documents allowed in a leaf of a regression tree, out of the subsampled data", "Aliases": [ - "mi" + "mil" ], "Required": false, "SortOrder": 3.0, @@ -8775,11 +8993,11 @@ "Required": false, "SortOrder": 4.0, "IsNullable": false, - "Default": 0.002, + "Default": 0.2, "SweepRange": { "RangeType": "Float", - "Min": 0.001, - "Max": 0.1, + "Min": 0.025, + "Max": 0.4, "IsLogScale": true } }, @@ -8795,6 +9013,18 @@ "IsNullable": false, "Default": "Weight" }, + { + "Name": "GroupIdColumn", + "Type": "String", + "Desc": "Column to use for example groupId", + "Aliases": [ + "groupId" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "GroupId" + }, { "Name": "NormalizeFeatures", "Type": { @@ -8836,11 +9066,20 @@ "Default": "Auto" }, { - "Name": "UnbalancedSets", + "Name": "Index", + "Type": "Float", + "Desc": "Index parameter for the Tweedie distribution, in the range [1, 2]. 1 is Poisson loss, 2 is gamma loss, and intermediate values are compound Poisson loss.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.5 + }, + { + "Name": "BestStepRankingRegressionTrees", "Type": "Bool", - "Desc": "Should we use derivatives optimized for unbalanced sets", + "Desc": "Use best regression step trees?", "Aliases": [ - "us" + "bsr" ], "Required": false, "SortOrder": 150.0, @@ -8848,34 +9087,35 @@ "Default": false }, { - "Name": "Calibrator", - "Type": { - "Kind": "Component", - "ComponentKind": "CalibratorTrainer" - }, - "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", + "Name": "UseLineSearch", + "Type": "Bool", + "Desc": "Should we use line search for a step size", + "Aliases": [ + "ls" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": { - "Name": "PlattCalibrator" - } + "Default": false }, { - "Name": "MaxCalibrationExamples", + "Name": "NumPostBracketSteps", "Type": "Int", - "Desc": "The maximum number of examples to use when training the calibrator", + "Desc": "Number of post-bracket line search steps", + "Aliases": [ + "lssteps" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000000 + "Default": 0 }, { - "Name": "EntropyCoefficient", + "Name": "MinStepSize", "Type": "Float", - "Desc": "The entropy (regularization) coefficient between 0 and 1", + "Desc": "Minimum line search step size", "Aliases": [ - "e" + "minstep" ], "Required": false, "SortOrder": 150.0, @@ -8883,293 +9123,251 @@ "Default": 0.0 }, { - "Name": "GainConfidenceLevel", - "Type": "Int", - "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", + "Name": "OptimizationAlgorithm", + "Type": { + "Kind": "Enum", + "Values": [ + "GradientDescent", + "AcceleratedGradientDescent", + "ConjugateGradientDescent" + ] + }, + "Desc": "Optimization algorithm to be used (GradientDescent, AcceleratedGradientDescent)", "Aliases": [ - "gainconf" + "oa" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0 + "Default": "GradientDescent" }, { - "Name": "NumThreads", - "Type": "Int", - "Desc": "The number of threads to use", + "Name": "EarlyStoppingRule", + "Type": { + "Kind": "Component", + "ComponentKind": "EarlyStoppingCriterion" + }, + "Desc": "Early stopping rule. (Validation set (/valid) is required.)", "Aliases": [ - "t" + "esr" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, + "IsNullable": false, "Default": null }, { - "Name": "DiskTranspose", - "Type": "Bool", - "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", + "Name": "EarlyStoppingMetrics", + "Type": "Int", + "Desc": "Early stopping metrics. (For regression, 1: L1, 2:L2; for ranking, 1:NDCG@1, 3:NDCG@3)", "Aliases": [ - "dt" + "esmt" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": 0 }, { - "Name": "MaxBins", - "Type": "Int", - "Desc": "Maximum number of distinct values (bins) per feature", + "Name": "EnablePruning", + "Type": "Bool", + "Desc": "Enable post-training pruning to avoid overfitting. (a validation set is required)", "Aliases": [ - "mb" + "pruning" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 255 + "Default": false }, { - "Name": "MaxOutput", - "Type": "Float", - "Desc": "Upper bound on absolute value of single output", + "Name": "UseTolerantPruning", + "Type": "Bool", + "Desc": "Use window and tolerance for pruning", "Aliases": [ - "mo" + "prtol" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": "Infinity" + "Default": false }, { - "Name": "GetDerivativesSampleRate", - "Type": "Int", - "Desc": "Sample each query 1 in k times in the GetDerivatives function", + "Name": "PruningThreshold", + "Type": "Float", + "Desc": "The tolerance threshold for pruning", "Aliases": [ - "sr" + "prth" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1 + "Default": 0.004 }, { - "Name": "RngSeed", + "Name": "PruningWindowSize", "Type": "Int", - "Desc": "The seed of the random number generator", + "Desc": "The moving window size for pruning", "Aliases": [ - "r1" + "prws" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 123 + "Default": 5 }, { - "Name": "FeatureFlocks", - "Type": "Bool", - "Desc": "Whether to collectivize features during dataset preparation to speed up training", + "Name": "Shrinkage", + "Type": "Float", + "Desc": "Shrinkage", "Aliases": [ - "flocks" + "shrk" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The trained model" - } - ], - "InputKind": [ - "ITrainerInputWithWeight", - "ITrainerInputWithLabel", - "ITrainerInput" - ], - "OutputKind": [ - "IBinaryClassificationOutput", - "ITrainerOutput" - ] - }, - { - "Name": "Trainers.GeneralizedAdditiveModelRegressor", - "Desc": "Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features.", - "FriendlyName": "Generalized Additive Model for Regression", - "ShortName": "gamr", - "Inputs": [ + "Default": 1.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.025, + "Max": 4.0, + "IsLogScale": true + } + }, { - "Name": "NumIterations", - "Type": "Int", - "Desc": "Total number of iterations over all features", + "Name": "DropoutRate", + "Type": "Float", + "Desc": "Dropout rate for tree regularization", "Aliases": [ - "iter" + "tdrop" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 9500, + "Default": 0.0, "SweepRange": { "RangeType": "Discrete", "Values": [ - 200, - 1500, - 9500 + 0.0, + 1E-09, + 0.05, + 0.1, + 0.2 ] } }, { - "Name": "TrainingData", - "Type": "DataView", - "Desc": "The data to be used for training", + "Name": "GetDerivativesSampleRate", + "Type": "Int", + "Desc": "Sample each query 1 in k times in the GetDerivatives function", "Aliases": [ - "data" + "sr" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1 }, { - "Name": "FeatureColumn", - "Type": "String", - "Desc": "Column to use for features", + "Name": "WriteLastEnsemble", + "Type": "Bool", + "Desc": "Write the last ensemble instead of the one determined by early stopping", "Aliases": [ - "feat" + "hl" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Features" + "Default": false }, { - "Name": "MinDocuments", - "Type": "Int", - "Desc": "Minimum number of training instances required to form a partition", + "Name": "MaxTreeOutput", + "Type": "Float", + "Desc": "Upper bound on absolute value of single tree output", "Aliases": [ - "mi" + "mo" ], "Required": false, - "SortOrder": 3.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 10, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 1, - 10, - 50 - ] - } + "Default": 100.0 }, { - "Name": "LabelColumn", - "Type": "String", - "Desc": "Column to use for labels", + "Name": "RandomStart", + "Type": "Bool", + "Desc": "Training starts from random ordering (determined by /r1)", "Aliases": [ - "lab" + "rs" ], "Required": false, - "SortOrder": 3.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Label" + "Default": false }, { - "Name": "LearningRates", - "Type": "Float", - "Desc": "The learning rate", + "Name": "FilterZeroLambdas", + "Type": "Bool", + "Desc": "Filter zero lambdas during training", "Aliases": [ - "lr" + "fzl" ], "Required": false, - "SortOrder": 4.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 0.002, - "SweepRange": { - "RangeType": "Float", - "Min": 0.001, - "Max": 0.1, - "IsLogScale": true - } + "Default": false }, { - "Name": "WeightColumn", + "Name": "BaselineScoresFormula", "Type": "String", - "Desc": "Column to use for example weight", - "Aliases": [ - "weight" - ], - "Required": false, - "SortOrder": 4.0, - "IsNullable": false, - "Default": "Weight" - }, - { - "Name": "NormalizeFeatures", - "Type": { - "Kind": "Enum", - "Values": [ - "No", - "Warn", - "Auto", - "Yes" - ] - }, - "Desc": "Normalize option for the feature column", + "Desc": "Freeform defining the scores that should be used as the baseline ranker", "Aliases": [ - "norm" + "basescores" ], "Required": false, - "SortOrder": 5.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Auto" + "Default": null }, { - "Name": "Caching", - "Type": { - "Kind": "Enum", - "Values": [ - "Auto", - "Memory", - "Disk", - "None" - ] - }, - "Desc": "Whether learner should cache input training data", + "Name": "BaselineAlphaRisk", + "Type": "String", + "Desc": "Baseline alpha for tradeoffs of risk (0 is normal training)", "Aliases": [ - "cache" + "basealpha" ], "Required": false, - "SortOrder": 6.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Auto" + "Default": null }, { - "Name": "EntropyCoefficient", - "Type": "Float", - "Desc": "The entropy (regularization) coefficient between 0 and 1", + "Name": "PositionDiscountFreeform", + "Type": "String", + "Desc": "The discount freeform which specifies the per position discounts of documents in a query (uses a single variable P for position where P=0 is first position)", "Aliases": [ - "e" + "pdff" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0 + "Default": null }, { - "Name": "GainConfidenceLevel", - "Type": "Int", - "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", + "Name": "ParallelTrainer", + "Type": { + "Kind": "Component", + "ComponentKind": "ParallelTraining" + }, + "Desc": "Allows to choose Parallel FastTree Learning Algorithm", "Aliases": [ - "gainconf" + "parag" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0 + "Default": { + "Name": "Single" + } }, { "Name": "NumThreads", @@ -9184,64 +9382,64 @@ "Default": null }, { - "Name": "DiskTranspose", - "Type": "Bool", - "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", + "Name": "RngSeed", + "Type": "Int", + "Desc": "The seed of the random number generator", "Aliases": [ - "dt" + "r1" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": 123 }, { - "Name": "MaxBins", + "Name": "FeatureSelectSeed", "Type": "Int", - "Desc": "Maximum number of distinct values (bins) per feature", + "Desc": "The seed of the active feature selection", "Aliases": [ - "mb" + "r3" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 255 + "Default": 123 }, { - "Name": "MaxOutput", + "Name": "EntropyCoefficient", "Type": "Float", - "Desc": "Upper bound on absolute value of single output", + "Desc": "The entropy (regularization) coefficient between 0 and 1", "Aliases": [ - "mo" + "e" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": "Infinity" + "Default": 0.0 }, { - "Name": "GetDerivativesSampleRate", + "Name": "HistogramPoolSize", "Type": "Int", - "Desc": "Sample each query 1 in k times in the GetDerivatives function", + "Desc": "The number of histograms in the pool (between 2 and numLeaves)", "Aliases": [ - "sr" + "ps" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1 + "Default": -1 }, { - "Name": "RngSeed", - "Type": "Int", - "Desc": "The seed of the random number generator", + "Name": "DiskTranspose", + "Type": "Bool", + "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", "Aliases": [ - "r1" + "dt" ], "Required": false, "SortOrder": 150.0, - "IsNullable": false, - "Default": 123 + "IsNullable": true, + "Default": null }, { "Name": "FeatureFlocks", @@ -9254,459 +9452,326 @@ "SortOrder": 150.0, "IsNullable": false, "Default": true - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The trained model" - } - ], - "InputKind": [ - "ITrainerInputWithWeight", - "ITrainerInputWithLabel", - "ITrainerInput" - ], - "OutputKind": [ - "IRegressionOutput", - "ITrainerOutput" - ] - }, - { - "Name": "Trainers.KMeansPlusPlusClusterer", - "Desc": "K-means is a popular clustering algorithm. With K-means, the data is clustered into a specified number of clusters in order to minimize the within-cluster sum of squares. K-means++ improves upon K-means by using a better method for choosing the initial cluster centers.", - "FriendlyName": "KMeans++ Clustering", - "ShortName": "KM", - "Inputs": [ + }, { - "Name": "TrainingData", - "Type": "DataView", - "Desc": "The data to be used for training", + "Name": "CategoricalSplit", + "Type": "Bool", + "Desc": "Whether to do split based on multiple categorical feature values.", "Aliases": [ - "data" + "cat" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false }, { - "Name": "FeatureColumn", - "Type": "String", - "Desc": "Column to use for features", + "Name": "MaxCategoricalGroupsPerNode", + "Type": "Int", + "Desc": "Maximum categorical split groups to consider when splitting on a categorical feature. Split groups are a collection of split points. This is used to reduce overfitting when there many categorical features.", "Aliases": [ - "feat" + "mcg" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Features" + "Default": 64 }, { - "Name": "WeightColumn", - "Type": "String", - "Desc": "Column to use for example weight", + "Name": "MaxCategoricalSplitPoints", + "Type": "Int", + "Desc": "Maximum categorical split points to consider when splitting on a categorical feature.", "Aliases": [ - "weight" + "maxcat" ], "Required": false, - "SortOrder": 4.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Weight" + "Default": 64 }, { - "Name": "NormalizeFeatures", - "Type": { - "Kind": "Enum", - "Values": [ - "No", - "Warn", - "Auto", - "Yes" - ] - }, - "Desc": "Normalize option for the feature column", + "Name": "MinDocsPercentageForCategoricalSplit", + "Type": "Float", + "Desc": "Minimum categorical docs percentage in a bin to consider for a split.", "Aliases": [ - "norm" + "mdop" ], "Required": false, - "SortOrder": 5.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Auto" + "Default": 0.001 }, { - "Name": "Caching", - "Type": { - "Kind": "Enum", - "Values": [ - "Auto", - "Memory", - "Disk", - "None" - ] - }, - "Desc": "Whether learner should cache input training data", + "Name": "MinDocsForCategoricalSplit", + "Type": "Int", + "Desc": "Minimum categorical doc count in a bin to consider for a split.", "Aliases": [ - "cache" + "mdo" ], "Required": false, - "SortOrder": 6.0, - "IsNullable": false, - "Default": "Auto" - }, - { - "Name": "K", - "Type": "Int", - "Desc": "The number of clusters", - "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 5, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 5, - 10, - 20, - 40 - ] - } + "Default": 100 }, { - "Name": "NumThreads", - "Type": "Int", - "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", + "Name": "Bias", + "Type": "Float", + "Desc": "Bias for calculating gradient for each feature bin for a categorical feature.", "Aliases": [ - "nt", - "t", - "threads" + "bias" ], "Required": false, - "SortOrder": 50.0, - "IsNullable": true, - "Default": null + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0 }, { - "Name": "InitAlgorithm", + "Name": "Bundling", "Type": { "Kind": "Enum", "Values": [ - "KMeansPlusPlus", - "Random", - "KMeansParallel" + "None", + "AggregateLowPopulation", + "Adjacent" ] }, - "Desc": "Cluster initialization algorithm", + "Desc": "Bundle low population bins. Bundle.None(0): no bundling, Bundle.AggregateLowPopulation(1): Bundle low population, Bundle.Adjacent(2): Neighbor low population bundle.", "Aliases": [ - "init" + "bundle" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": "KMeansParallel" + "Default": "None" }, { - "Name": "OptTol", - "Type": "Float", - "Desc": "Tolerance parameter for trainer convergence. Lower = slower, more accurate", + "Name": "MaxBins", + "Type": "Int", + "Desc": "Maximum number of distinct values (bins) per feature", "Aliases": [ - "ot" + "mb" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1E-07 + "Default": 255 }, { - "Name": "MaxIterations", - "Type": "Int", - "Desc": "Maximum number of iterations.", + "Name": "SparsifyThreshold", + "Type": "Float", + "Desc": "Sparsity level needed to use sparse feature representation", "Aliases": [ - "maxiter" + "sp" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000 + "Default": 0.7 }, { - "Name": "AccelMemBudgetMb", - "Type": "Int", - "Desc": "Memory budget (in MBs) to use for KMeans acceleration", + "Name": "FeatureFirstUsePenalty", + "Type": "Float", + "Desc": "The feature first use penalty coefficient", "Aliases": [ - "accelMemBudgetMb" + "ffup" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 4096 - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The trained model" - } - ], - "InputKind": [ - "IUnsupervisedTrainerWithWeight", - "ITrainerInput" - ], - "OutputKind": [ - "IClusteringOutput", - "ITrainerOutput" - ] - }, - { - "Name": "Trainers.LinearSvmBinaryClassifier", - "Desc": "Train a linear SVM.", - "FriendlyName": "SVM (Pegasos-Linear)", - "ShortName": "svm", - "Inputs": [ - { - "Name": "TrainingData", - "Type": "DataView", - "Desc": "The data to be used for training", - "Aliases": [ - "data" - ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Default": 0.0 }, { - "Name": "FeatureColumn", - "Type": "String", - "Desc": "Column to use for features", + "Name": "FeatureReusePenalty", + "Type": "Float", + "Desc": "The feature re-use penalty (regularization) coefficient", "Aliases": [ - "feat" + "frup" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Features" + "Default": 0.0 }, { - "Name": "LabelColumn", - "Type": "String", - "Desc": "Column to use for labels", + "Name": "GainConfidenceLevel", + "Type": "Float", + "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", "Aliases": [ - "lab" + "gainconf" ], "Required": false, - "SortOrder": 3.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Label" + "Default": 0.0 }, { - "Name": "NormalizeFeatures", - "Type": { - "Kind": "Enum", - "Values": [ - "No", - "Warn", - "Auto", - "Yes" - ] - }, - "Desc": "Normalize option for the feature column", + "Name": "SoftmaxTemperature", + "Type": "Float", + "Desc": "The temperature of the randomized softmax distribution for choosing the feature", "Aliases": [ - "norm" + "smtemp" ], "Required": false, - "SortOrder": 5.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Auto" + "Default": 0.0 }, { - "Name": "Caching", - "Type": { - "Kind": "Enum", - "Values": [ - "Auto", - "Memory", - "Disk", - "None" - ] - }, - "Desc": "Whether learner should cache input training data", + "Name": "ExecutionTimes", + "Type": "Bool", + "Desc": "Print execution time breakdown to stdout", "Aliases": [ - "cache" + "et" ], "Required": false, - "SortOrder": 6.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Auto" + "Default": false }, { - "Name": "Lambda", + "Name": "FeatureFraction", "Type": "Float", - "Desc": "Regularizer constant", + "Desc": "The fraction of features (chosen randomly) to use on each iteration", "Aliases": [ - "lambda" + "ff" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 0.001, - "SweepRange": { - "RangeType": "Float", - "Min": 1E-05, - "Max": 0.1, - "StepSize": 10.0, - "IsLogScale": true - } + "Default": 1.0 }, { - "Name": "PerformProjection", - "Type": "Bool", - "Desc": "Perform projection to unit-ball? Typically used with batch size > 1.", + "Name": "BaggingSize", + "Type": "Int", + "Desc": "Number of trees in each bag (0 for disabling bagging)", "Aliases": [ - "project" + "bag" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": false, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - false, - true - ] - } + "Default": 0 }, { - "Name": "NumIterations", - "Type": "Int", - "Desc": "Number of iterations", + "Name": "BaggingTrainFraction", + "Type": "Float", + "Desc": "Percentage of training examples used in each bag", "Aliases": [ - "iter" + "bagfrac" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1, - "SweepRange": { - "RangeType": "Long", - "Min": 1, - "Max": 100, - "StepSize": 10.0, - "IsLogScale": true - } + "Default": 0.7 }, { - "Name": "InitWtsDiameter", + "Name": "SplitFraction", "Type": "Float", - "Desc": "Init weights diameter", + "Desc": "The fraction of features (chosen randomly) to use on each split", "Aliases": [ - "initwts" + "sf" ], "Required": false, - "SortOrder": 140.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 5 - } + "Default": 1.0 }, { - "Name": "NoBias", - "Type": "Bool", - "Desc": "No bias", + "Name": "Smoothing", + "Type": "Float", + "Desc": "Smoothing paramter for tree regularization", + "Aliases": [ + "s" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - false, - true - ] - } + "Default": 0.0 }, { - "Name": "Calibrator", - "Type": { - "Kind": "Component", - "ComponentKind": "CalibratorTrainer" - }, - "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", + "Name": "AllowEmptyTrees", + "Type": "Bool", + "Desc": "When a root split is impossible, allow training to proceed", + "Aliases": [ + "allowempty", + "dummies" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": { - "Name": "PlattCalibrator" - } + "Default": true }, { - "Name": "MaxCalibrationExamples", + "Name": "FeatureCompressionLevel", "Type": "Int", - "Desc": "The maximum number of examples to use when training the calibrator", + "Desc": "The level of feature compression to use", + "Aliases": [ + "fcomp" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000000 + "Default": 1 }, { - "Name": "InitialWeights", - "Type": "String", - "Desc": "Initial Weights and bias, comma-separated", + "Name": "CompressEnsemble", + "Type": "Bool", + "Desc": "Compress the tree Ensemble", "Aliases": [ - "initweights" + "cmp" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": null + "Default": false }, { - "Name": "Shuffle", + "Name": "MaxTreesAfterCompression", + "Type": "Int", + "Desc": "Maximum Number of trees after compression", + "Aliases": [ + "cmpmax" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": -1 + }, + { + "Name": "PrintTestGraph", "Type": "Bool", - "Desc": "Whether to shuffle for each training iteration", + "Desc": "Print metrics graph for the first test set", "Aliases": [ - "shuf" + "graph" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - false, - true - ] - } + "Default": false }, { - "Name": "StreamingCacheSize", - "Type": "Int", - "Desc": "Size of cache when trained in Scope", + "Name": "PrintTrainValidGraph", + "Type": "Bool", + "Desc": "Print Train and Validation metrics in graph", "Aliases": [ - "cache" + "graphtv" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000000 + "Default": false }, { - "Name": "BatchSize", + "Name": "TestFrequency", "Type": "Int", - "Desc": "Batch size", + "Desc": "Calculate metric values for train/valid/test every k rounds", "Aliases": [ - "batch" + "tf" ], "Required": false, - "SortOrder": 190.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1 + "Default": 2147483647 } ], "Outputs": [ @@ -9717,20 +9782,40 @@ } ], "InputKind": [ + "ITrainerInputWithGroupId", + "ITrainerInputWithWeight", "ITrainerInputWithLabel", "ITrainerInput" ], "OutputKind": [ - "IBinaryClassificationOutput", + "IRegressionOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.LogisticRegressionBinaryClassifier", - "Desc": "Train a logistic regression binary model", - "FriendlyName": "Logistic Regression", - "ShortName": "lr", + "Name": "Trainers.FieldAwareFactorizationMachineBinaryClassifier", + "Desc": "Train a field-aware factorization machine for binary classification", + "FriendlyName": "Field-aware Factorization Machine", + "ShortName": "ffm", "Inputs": [ + { + "Name": "LearningRate", + "Type": "Float", + "Desc": "Initial learning rate", + "Aliases": [ + "lr" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": 0.1, + "SweepRange": { + "RangeType": "Float", + "Min": 0.001, + "Max": 1.0, + "IsLogScale": true + } + }, { "Name": "TrainingData", "Type": "DataView", @@ -9742,6 +9827,23 @@ "SortOrder": 1.0, "IsNullable": false }, + { + "Name": "Iters", + "Type": "Int", + "Desc": "Number of training iterations", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": 5, + "SweepRange": { + "RangeType": "Long", + "Min": 1, + "Max": 100 + } + }, { "Name": "FeatureColumn", "Type": "String", @@ -9754,6 +9856,23 @@ "IsNullable": false, "Default": "Features" }, + { + "Name": "LatentDim", + "Type": "Int", + "Desc": "Latent space dimension", + "Aliases": [ + "d" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": 20, + "SweepRange": { + "RangeType": "Long", + "Min": 4, + "Max": 100 + } + }, { "Name": "LabelColumn", "Type": "String", @@ -9767,16 +9886,40 @@ "Default": "Label" }, { - "Name": "WeightColumn", - "Type": "String", - "Desc": "Column to use for example weight", + "Name": "LambdaLinear", + "Type": "Float", + "Desc": "Regularization coefficient of linear weights", "Aliases": [ - "weight" + "lambdaLinear" ], "Required": false, "SortOrder": 4.0, "IsNullable": false, - "Default": "Weight" + "Default": 0.0001, + "SweepRange": { + "RangeType": "Float", + "Min": 1E-08, + "Max": 1.0, + "IsLogScale": true + } + }, + { + "Name": "LambdaLatent", + "Type": "Float", + "Desc": "Regularization coefficient of latent weights", + "Aliases": [ + "lambdaLatent" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": 0.0001, + "SweepRange": { + "RangeType": "Float", + "Min": 1E-08, + "Max": 1.0, + "IsLogScale": true + } }, { "Name": "NormalizeFeatures", @@ -9798,6 +9941,18 @@ "IsNullable": false, "Default": "Auto" }, + { + "Name": "Norm", + "Type": "Bool", + "Desc": "Whether to normalize the input vectors so that the concatenation of all fields' feature vectors is unit-length", + "Aliases": [ + "norm" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": true + }, { "Name": "Caching", "Type": { @@ -9819,208 +9974,48 @@ "Default": "Auto" }, { - "Name": "ShowTrainingStats", + "Name": "Shuffle", "Type": "Bool", - "Desc": "Show statistics of training examples.", + "Desc": "Whether to shuffle for each training iteration", "Aliases": [ - "stat" + "shuf" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 90.0, "IsNullable": false, - "Default": false + "Default": true }, { - "Name": "L2Weight", - "Type": "Float", - "Desc": "L2 regularization weight", + "Name": "Verbose", + "Type": "Bool", + "Desc": "Report traning progress or not", "Aliases": [ - "l2" + "verbose" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 91.0, "IsNullable": false, - "Default": 1.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 4 - } + "Default": true }, { - "Name": "L1Weight", + "Name": "Radius", "Type": "Float", - "Desc": "L1 regularization weight", + "Desc": "Radius of initial latent factors", "Aliases": [ - "l1" + "rad" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 110.0, "IsNullable": false, - "Default": 1.0, + "Default": 0.5, "SweepRange": { "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 4 - } - }, - { - "Name": "OptTol", - "Type": "Float", - "Desc": "Tolerance parameter for optimization convergence. Lower = slower, more accurate", - "Aliases": [ - "ot" - ], - "Required": false, - "SortOrder": 50.0, - "IsNullable": false, - "Default": 1E-07, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 0.0001, - 1E-07 - ] + "Min": 0.1, + "Max": 1.0 } - }, - { - "Name": "MemorySize", - "Type": "Int", - "Desc": "Memory size for L-BFGS. Lower=faster, less accurate", - "Aliases": [ - "m" - ], - "Required": false, - "SortOrder": 50.0, - "IsNullable": false, - "Default": 20, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 5, - 20, - 50 - ] - } - }, - { - "Name": "EnforceNonNegativity", - "Type": "Bool", - "Desc": "Enforce non-negative weights", - "Aliases": [ - "nn" - ], - "Required": false, - "SortOrder": 90.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "InitWtsDiameter", - "Type": "Float", - "Desc": "Init weights diameter", - "Aliases": [ - "initwts" - ], - "Required": false, - "SortOrder": 140.0, - "IsNullable": false, - "Default": 0.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 5 - } - }, - { - "Name": "MaxIterations", - "Type": "Int", - "Desc": "Maximum iterations.", - "Aliases": [ - "maxiter" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 2147483647, - "SweepRange": { - "RangeType": "Long", - "Min": 1, - "Max": 2147483647 - } - }, - { - "Name": "SgdInitializationTolerance", - "Type": "Float", - "Desc": "Run SGD to initialize LR weights, converging to this tolerance", - "Aliases": [ - "sgd" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "Quiet", - "Type": "Bool", - "Desc": "If set to true, produce no output during training.", - "Aliases": [ - "q" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "UseThreads", - "Type": "Bool", - "Desc": "Whether or not to use threads. Default is true", - "Aliases": [ - "t" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true - }, - { - "Name": "NumThreads", - "Type": "Int", - "Desc": "Number of threads", - "Aliases": [ - "nt" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "DenseOptimizer", - "Type": "Bool", - "Desc": "Force densification of the internal optimization vectors", - "Aliases": [ - "do" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - false, - true - ] - } - } - ], - "Outputs": [ + } + ], + "Outputs": [ { "Name": "PredictorModel", "Type": "PredictorModel", @@ -10028,7 +10023,6 @@ } ], "InputKind": [ - "ITrainerInputWithWeight", "ITrainerInputWithLabel", "ITrainerInput" ], @@ -10038,11 +10032,31 @@ ] }, { - "Name": "Trainers.LogisticRegressionClassifier", - "Desc": "Train a logistic regression multi class model", - "FriendlyName": "Multi-class Logistic Regression", - "ShortName": "mlr", + "Name": "Trainers.GeneralizedAdditiveModelBinaryClassifier", + "Desc": "Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features.", + "FriendlyName": "Generalized Additive Model for Binary Classification", + "ShortName": "gam", "Inputs": [ + { + "Name": "NumIterations", + "Type": "Int", + "Desc": "Total number of iterations over all features", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": 9500, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 200, + 1500, + 9500 + ] + } + }, { "Name": "TrainingData", "Type": "DataView", @@ -10066,6 +10080,26 @@ "IsNullable": false, "Default": "Features" }, + { + "Name": "MinDocuments", + "Type": "Int", + "Desc": "Minimum number of training instances required to form a partition", + "Aliases": [ + "mi" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": 10, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 10, + 50 + ] + } + }, { "Name": "LabelColumn", "Type": "String", @@ -10078,6 +10112,24 @@ "IsNullable": false, "Default": "Label" }, + { + "Name": "LearningRates", + "Type": "Float", + "Desc": "The learning rate", + "Aliases": [ + "lr" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": 0.002, + "SweepRange": { + "RangeType": "Float", + "Min": 0.001, + "Max": 0.1, + "IsLogScale": true + } + }, { "Name": "WeightColumn", "Type": "String", @@ -10131,205 +10183,147 @@ "Default": "Auto" }, { - "Name": "ShowTrainingStats", + "Name": "UnbalancedSets", "Type": "Bool", - "Desc": "Show statistics of training examples.", + "Desc": "Should we use derivatives optimized for unbalanced sets", "Aliases": [ - "stat" + "us" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, "Default": false }, { - "Name": "L2Weight", - "Type": "Float", - "Desc": "L2 regularization weight", - "Aliases": [ - "l2" - ], + "Name": "Calibrator", + "Type": { + "Kind": "Component", + "ComponentKind": "CalibratorTrainer" + }, + "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 4 + "Default": { + "Name": "PlattCalibrator" } }, { - "Name": "L1Weight", - "Type": "Float", - "Desc": "L1 regularization weight", - "Aliases": [ - "l1" - ], + "Name": "MaxCalibrationExamples", + "Type": "Int", + "Desc": "The maximum number of examples to use when training the calibrator", "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 4 - } + "Default": 1000000 }, { - "Name": "OptTol", + "Name": "EntropyCoefficient", "Type": "Float", - "Desc": "Tolerance parameter for optimization convergence. Lower = slower, more accurate", + "Desc": "The entropy (regularization) coefficient between 0 and 1", "Aliases": [ - "ot" + "e" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1E-07, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 0.0001, - 1E-07 - ] - } + "Default": 0.0 }, { - "Name": "MemorySize", + "Name": "GainConfidenceLevel", "Type": "Int", - "Desc": "Memory size for L-BFGS. Lower=faster, less accurate", + "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", "Aliases": [ - "m" + "gainconf" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 20, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 5, - 20, - 50 - ] - } + "Default": 0 }, { - "Name": "EnforceNonNegativity", - "Type": "Bool", - "Desc": "Enforce non-negative weights", + "Name": "NumThreads", + "Type": "Int", + "Desc": "The number of threads to use", "Aliases": [ - "nn" + "t" ], "Required": false, - "SortOrder": 90.0, - "IsNullable": false, - "Default": false + "SortOrder": 150.0, + "IsNullable": true, + "Default": null }, { - "Name": "InitWtsDiameter", - "Type": "Float", - "Desc": "Init weights diameter", + "Name": "DiskTranspose", + "Type": "Bool", + "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", "Aliases": [ - "initwts" + "dt" ], "Required": false, - "SortOrder": 140.0, - "IsNullable": false, - "Default": 0.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 5 - } + "SortOrder": 150.0, + "IsNullable": true, + "Default": null }, { - "Name": "MaxIterations", + "Name": "MaxBins", "Type": "Int", - "Desc": "Maximum iterations.", + "Desc": "Maximum number of distinct values (bins) per feature", "Aliases": [ - "maxiter" + "mb" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 2147483647, - "SweepRange": { - "RangeType": "Long", - "Min": 1, - "Max": 2147483647 - } + "Default": 255 }, { - "Name": "SgdInitializationTolerance", + "Name": "MaxOutput", "Type": "Float", - "Desc": "Run SGD to initialize LR weights, converging to this tolerance", - "Aliases": [ - "sgd" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "Quiet", - "Type": "Bool", - "Desc": "If set to true, produce no output during training.", + "Desc": "Upper bound on absolute value of single output", "Aliases": [ - "q" + "mo" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": "Infinity" }, { - "Name": "UseThreads", - "Type": "Bool", - "Desc": "Whether or not to use threads. Default is true", + "Name": "GetDerivativesSampleRate", + "Type": "Int", + "Desc": "Sample each query 1 in k times in the GetDerivatives function", "Aliases": [ - "t" + "sr" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true + "Default": 1 }, { - "Name": "NumThreads", + "Name": "RngSeed", "Type": "Int", - "Desc": "Number of threads", + "Desc": "The seed of the random number generator", "Aliases": [ - "nt" + "r1" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": 123 }, { - "Name": "DenseOptimizer", + "Name": "FeatureFlocks", "Type": "Bool", - "Desc": "Force densification of the internal optimization vectors", + "Desc": "Whether to collectivize features during dataset preparation to speed up training", "Aliases": [ - "do" + "flocks" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - false, - true - ] - } + "Default": true } ], "Outputs": [ @@ -10345,16 +10339,36 @@ "ITrainerInput" ], "OutputKind": [ - "IMulticlassClassificationOutput", + "IBinaryClassificationOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.NaiveBayesClassifier", - "Desc": "Train a MultiClassNaiveBayesTrainer.", - "FriendlyName": "Multiclass Naive Bayes", - "ShortName": "MNB", + "Name": "Trainers.GeneralizedAdditiveModelRegressor", + "Desc": "Trains a gradient boosted stump per feature, on all features simultaneously, to fit target values using least-squares. It mantains no interactions between features.", + "FriendlyName": "Generalized Additive Model for Regression", + "ShortName": "gamr", "Inputs": [ + { + "Name": "NumIterations", + "Type": "Int", + "Desc": "Total number of iterations over all features", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": 9500, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 200, + 1500, + 9500 + ] + } + }, { "Name": "TrainingData", "Type": "DataView", @@ -10378,6 +10392,26 @@ "IsNullable": false, "Default": "Features" }, + { + "Name": "MinDocuments", + "Type": "Int", + "Desc": "Minimum number of training instances required to form a partition", + "Aliases": [ + "mi" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": 10, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 10, + 50 + ] + } + }, { "Name": "LabelColumn", "Type": "String", @@ -10390,6 +10424,36 @@ "IsNullable": false, "Default": "Label" }, + { + "Name": "LearningRates", + "Type": "Float", + "Desc": "The learning rate", + "Aliases": [ + "lr" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": 0.002, + "SweepRange": { + "RangeType": "Float", + "Min": 0.001, + "Max": 0.1, + "IsLogScale": true + } + }, + { + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": "Weight" + }, { "Name": "NormalizeFeatures", "Type": { @@ -10429,64 +10493,173 @@ "SortOrder": 6.0, "IsNullable": false, "Default": "Auto" - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The trained model" - } - ], - "InputKind": [ - "ITrainerInputWithLabel", - "ITrainerInput" - ], - "OutputKind": [ - "IMulticlassClassificationOutput", - "ITrainerOutput" - ] - }, - { - "Name": "Trainers.OnlineGradientDescentRegressor", - "Desc": "Train a Online gradient descent perceptron.", - "FriendlyName": "Stochastic Gradient Descent (Regression)", - "ShortName": "ogd", - "Inputs": [ + }, { - "Name": "TrainingData", - "Type": "DataView", - "Desc": "The data to be used for training", + "Name": "EntropyCoefficient", + "Type": "Float", + "Desc": "The entropy (regularization) coefficient between 0 and 1", "Aliases": [ - "data" + "e" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0 }, { - "Name": "FeatureColumn", - "Type": "String", - "Desc": "Column to use for features", + "Name": "GainConfidenceLevel", + "Type": "Int", + "Desc": "Tree fitting gain confidence requirement (should be in the range [0,1) ).", "Aliases": [ - "feat" + "gainconf" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Features" + "Default": 0 }, { - "Name": "LabelColumn", + "Name": "NumThreads", + "Type": "Int", + "Desc": "The number of threads to use", + "Aliases": [ + "t" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "DiskTranspose", + "Type": "Bool", + "Desc": "Whether to utilize the disk or the data's native transposition facilities (where applicable) when performing the transpose", + "Aliases": [ + "dt" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "MaxBins", + "Type": "Int", + "Desc": "Maximum number of distinct values (bins) per feature", + "Aliases": [ + "mb" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 255 + }, + { + "Name": "MaxOutput", + "Type": "Float", + "Desc": "Upper bound on absolute value of single output", + "Aliases": [ + "mo" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "Infinity" + }, + { + "Name": "GetDerivativesSampleRate", + "Type": "Int", + "Desc": "Sample each query 1 in k times in the GetDerivatives function", + "Aliases": [ + "sr" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1 + }, + { + "Name": "RngSeed", + "Type": "Int", + "Desc": "The seed of the random number generator", + "Aliases": [ + "r1" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 123 + }, + { + "Name": "FeatureFlocks", + "Type": "Bool", + "Desc": "Whether to collectivize features during dataset preparation to speed up training", + "Aliases": [ + "flocks" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "InputKind": [ + "ITrainerInputWithWeight", + "ITrainerInputWithLabel", + "ITrainerInput" + ], + "OutputKind": [ + "IRegressionOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Trainers.KMeansPlusPlusClusterer", + "Desc": "K-means is a popular clustering algorithm. With K-means, the data is clustered into a specified number of clusters in order to minimize the within-cluster sum of squares. K-means++ improves upon K-means by using a better method for choosing the initial cluster centers.", + "FriendlyName": "KMeans++ Clustering", + "ShortName": "KM", + "Inputs": [ + { + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "FeatureColumn", "Type": "String", - "Desc": "Column to use for labels", + "Desc": "Column to use for features", "Aliases": [ - "lab" + "feat" ], "Required": false, - "SortOrder": 3.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": "Label" + "Default": "Features" + }, + { + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": "Weight" }, { "Name": "NormalizeFeatures", @@ -10529,276 +10702,244 @@ "Default": "Auto" }, { - "Name": "LossFunction", - "Type": { - "Kind": "Component", - "ComponentKind": "RegressionLossFunction" - }, - "Desc": "Loss Function", - "Aliases": [ - "loss" - ], - "Required": false, - "SortOrder": 50.0, - "IsNullable": false, - "Default": { - "Name": "SquaredLoss" - } - }, - { - "Name": "LearningRate", - "Type": "Float", - "Desc": "Learning rate", - "Aliases": [ - "lr" - ], + "Name": "K", + "Type": "Int", + "Desc": "The number of clusters", "Required": false, "SortOrder": 50.0, "IsNullable": false, - "Default": 0.1, + "Default": 5, "SweepRange": { "RangeType": "Discrete", "Values": [ - 0.01, - 0.1, - 0.5, - 1.0 + 5, + 10, + 20, + 40 ] } }, { - "Name": "DecreaseLearningRate", - "Type": "Bool", - "Desc": "Decrease learning rate", + "Name": "NumThreads", + "Type": "Int", + "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", "Aliases": [ - "decreaselr" + "nt", + "t", + "threads" ], "Required": false, "SortOrder": 50.0, - "IsNullable": false, - "Default": true, - "SweepRange": { - "RangeType": "Discrete", + "IsNullable": true, + "Default": null + }, + { + "Name": "InitAlgorithm", + "Type": { + "Kind": "Enum", "Values": [ - false, - true + "KMeansPlusPlus", + "Random", + "KMeansParallel" ] - } + }, + "Desc": "Cluster initialization algorithm", + "Aliases": [ + "init" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "KMeansParallel" }, { - "Name": "L2RegularizerWeight", + "Name": "OptTol", "Type": "Float", - "Desc": "L2 Regularization Weight", + "Desc": "Tolerance parameter for trainer convergence. Lower = slower, more accurate", "Aliases": [ - "reg" + "ot" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 0.5 - } + "Default": 1E-07 }, { - "Name": "NumIterations", + "Name": "MaxIterations", "Type": "Int", - "Desc": "Number of iterations", + "Desc": "Maximum number of iterations.", "Aliases": [ - "iter" + "maxiter" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1, - "SweepRange": { - "RangeType": "Long", - "Min": 1, - "Max": 100, - "StepSize": 10.0, - "IsLogScale": true - } + "Default": 1000 }, { - "Name": "InitWtsDiameter", - "Type": "Float", - "Desc": "Init weights diameter", + "Name": "AccelMemBudgetMb", + "Type": "Int", + "Desc": "Memory budget (in MBs) to use for KMeans acceleration", "Aliases": [ - "initwts" + "accelMemBudgetMb" ], "Required": false, - "SortOrder": 140.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0, - "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 5 - } - }, - { - "Name": "ResetWeightsAfterXExamples", - "Type": "Int", - "Desc": "Number of examples after which weights will be reset to the current average", - "Aliases": [ - "numreset" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "DoLazyUpdates", - "Type": "Bool", - "Desc": "Instead of updating averaged weights on every example, only update when loss is nonzero", - "Aliases": [ - "lazy" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true - }, + "Default": 4096 + } + ], + "Outputs": [ { - "Name": "RecencyGain", - "Type": "Float", - "Desc": "Extra weight given to more recent updates", - "Aliases": [ - "rg" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "InputKind": [ + "IUnsupervisedTrainerWithWeight", + "ITrainerInput" + ], + "OutputKind": [ + "IClusteringOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Trainers.LightGbmBinaryClassifier", + "Desc": "Train a LightGBM binary classification model.", + "FriendlyName": "LightGBM Binary Classifier", + "ShortName": "LightGBM", + "Inputs": [ { - "Name": "RecencyGainMulti", - "Type": "Bool", - "Desc": "Whether Recency Gain is multiplicative (vs. additive)", + "Name": "NumBoostRound", + "Type": "Int", + "Desc": "Number of iterations.", "Aliases": [ - "rgm" + "iter" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 1.0, "IsNullable": false, - "Default": false + "Default": 100, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 10, + 20, + 50, + 100, + 150, + 200 + ] + } }, { - "Name": "Averaged", - "Type": "Bool", - "Desc": "Do averaging?", + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", "Aliases": [ - "avg" + "data" ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true + "Required": true, + "SortOrder": 1.0, + "IsNullable": false }, { - "Name": "AveragedTolerance", + "Name": "LearningRate", "Type": "Float", - "Desc": "The inexactness tolerance for averaging", + "Desc": "Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1].", "Aliases": [ - "avgtol" + "lr" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.01 + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Float", + "Min": 0.025, + "Max": 0.4, + "IsLogScale": true + } }, { - "Name": "InitialWeights", - "Type": "String", - "Desc": "Initial Weights and bias, comma-separated", + "Name": "NumLeaves", + "Type": "Int", + "Desc": "Maximum leaves for trees.", "Aliases": [ - "initweights" + "nl" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Long", + "Min": 2, + "Max": 128, + "StepSize": 4.0, + "IsLogScale": true + } }, { - "Name": "Shuffle", - "Type": "Bool", - "Desc": "Whether to shuffle for each training iteration", + "Name": "MinDataPerLeaf", + "Type": "Int", + "Desc": "Minimum number of instances needed in a child.", "Aliases": [ - "shuf" + "mil" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, "SweepRange": { "RangeType": "Discrete", "Values": [ - false, - true + 1, + 10, + 20, + 50 ] } }, { - "Name": "StreamingCacheSize", - "Type": "Int", - "Desc": "Size of cache when trained in Scope", + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", "Aliases": [ - "cache" + "feat" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": 1000000 - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The trained model" - } - ], - "InputKind": [ - "ITrainerInputWithLabel", - "ITrainerInput" - ], - "OutputKind": [ - "IRegressionOutput", - "ITrainerOutput" - ] - }, - { - "Name": "Trainers.PcaAnomalyDetector", - "Desc": "Train an PCA Anomaly model.", - "FriendlyName": "PCA Anomaly Detector", - "ShortName": "pcaAnom", - "Inputs": [ + "Default": "Features" + }, { - "Name": "TrainingData", - "Type": "DataView", - "Desc": "The data to be used for training", - "Aliases": [ - "data" - ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "Booster", + "Type": { + "Kind": "Component", + "ComponentKind": "BoosterParameterFunction" + }, + "Desc": "Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function.", + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": { + "Name": "gbdt" + } }, { - "Name": "FeatureColumn", + "Name": "LabelColumn", "Type": "String", - "Desc": "Column to use for features", + "Desc": "Column to use for labels", "Aliases": [ - "feat" + "lab" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": "Features" + "Default": "Label" }, { "Name": "WeightColumn", @@ -10812,6 +10953,18 @@ "IsNullable": false, "Default": "Weight" }, + { + "Name": "GroupIdColumn", + "Type": "String", + "Desc": "Column to use for example groupId", + "Aliases": [ + "groupId" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "GroupId" + }, { "Name": "NormalizeFeatures", "Type": { @@ -10853,371 +11006,267 @@ "Default": "Auto" }, { - "Name": "Rank", + "Name": "MaxBin", "Type": "Int", - "Desc": "The number of components in the PCA", + "Desc": "Max number of bucket bin for features.", "Aliases": [ - "k" + "mb" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 20, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 10, - 20, - 40, - 80 - ] - } + "Default": 255 }, { - "Name": "Oversampling", - "Type": "Int", - "Desc": "Oversampling parameter for randomized PCA training", + "Name": "VerboseEval", + "Type": "Bool", + "Desc": "Verbose", + "Aliases": [ + "v" + ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 20, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 10, - 20, - 40 - ] - } + "Default": false }, { - "Name": "Center", + "Name": "Silent", "Type": "Bool", - "Desc": "If enabled, data is centered to be zero mean", - "Aliases": [ - "center" - ], + "Desc": "Printing running messages.", "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - false, - true - ] - } + "Default": true }, { - "Name": "Seed", + "Name": "NThread", "Type": "Int", - "Desc": "The seed for random number generation", + "Desc": "Number of parallel threads used to run LightGBM.", "Aliases": [ - "seed" + "nt" ], "Required": false, "SortOrder": 150.0, "IsNullable": true, "Default": null - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The trained model" - } - ], - "InputKind": [ - "IUnsupervisedTrainerWithWeight", - "ITrainerInput" - ], - "OutputKind": [ - "IAnomalyDetectionOutput", - "ITrainerOutput" - ] - }, - { - "Name": "Trainers.PoissonRegressor", - "Desc": "Train an Poisson regression model.", - "FriendlyName": "Poisson Regression", - "ShortName": "PR", - "Inputs": [ - { - "Name": "TrainingData", - "Type": "DataView", - "Desc": "The data to be used for training", - "Aliases": [ - "data" - ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false }, { - "Name": "FeatureColumn", - "Type": "String", - "Desc": "Column to use for features", + "Name": "EvalMetric", + "Type": { + "Kind": "Enum", + "Values": [ + "DefaultMetric", + "Rmse", + "Mae", + "Logloss", + "Error", + "Merror", + "Mlogloss", + "Auc", + "Ndcg", + "Map" + ] + }, + "Desc": "Evaluation metrics.", "Aliases": [ - "feat" + "em" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Features" + "Default": "DefaultMetric" }, { - "Name": "LabelColumn", - "Type": "String", - "Desc": "Column to use for labels", - "Aliases": [ - "lab" - ], + "Name": "UseSoftmax", + "Type": "Bool", + "Desc": "Use softmax loss for the multi classification.", "Required": false, - "SortOrder": 3.0, - "IsNullable": false, - "Default": "Label" + "SortOrder": 150.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + true, + false + ] + } }, { - "Name": "WeightColumn", - "Type": "String", - "Desc": "Column to use for example weight", + "Name": "EarlyStoppingRound", + "Type": "Int", + "Desc": "Rounds of early stopping, 0 will disable it.", "Aliases": [ - "weight" + "es" ], "Required": false, - "SortOrder": 4.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Weight" + "Default": 0 }, { - "Name": "NormalizeFeatures", - "Type": { - "Kind": "Enum", - "Values": [ - "No", - "Warn", - "Auto", - "Yes" - ] - }, - "Desc": "Normalize option for the feature column", + "Name": "CustomGains", + "Type": "String", + "Desc": "Comma seperated list of gains associated to each relevance label.", "Aliases": [ - "norm" + "gains" ], "Required": false, - "SortOrder": 5.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Auto" + "Default": "0,3,7,15,31,63,127,255,511,1023,2047,4095" }, { - "Name": "Caching", - "Type": { - "Kind": "Enum", - "Values": [ - "Auto", - "Memory", - "Disk", - "None" - ] - }, - "Desc": "Whether learner should cache input training data", - "Aliases": [ - "cache" - ], + "Name": "BatchSize", + "Type": "Int", + "Desc": "Number of entries in a batch when loading data.", "Required": false, - "SortOrder": 6.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Auto" + "Default": 1048576 }, { - "Name": "L2Weight", - "Type": "Float", - "Desc": "L2 regularization weight", + "Name": "UseCat", + "Type": "Bool", + "Desc": "Enable categorical split or not.", "Aliases": [ - "l2" + "cat" ], "Required": false, - "SortOrder": 50.0, - "IsNullable": false, - "Default": 1.0, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null, "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 4 + "RangeType": "Discrete", + "Values": [ + true, + false + ] } }, { - "Name": "L1Weight", - "Type": "Float", - "Desc": "L1 regularization weight", - "Aliases": [ - "l1" - ], + "Name": "UseMissing", + "Type": "Bool", + "Desc": "Enable missing value auto infer or not.", "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0, + "Default": false, "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 4 + "RangeType": "Discrete", + "Values": [ + true, + false + ] } }, { - "Name": "OptTol", - "Type": "Float", - "Desc": "Tolerance parameter for optimization convergence. Lower = slower, more accurate", + "Name": "MinDataPerGroup", + "Type": "Int", + "Desc": "Min number of instances per categorical group.", "Aliases": [ - "ot" + "mdpg" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1E-07, + "Default": 100, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - 0.0001, - 1E-07 + 10, + 50, + 100, + 200 ] } }, { - "Name": "MemorySize", + "Name": "MaxCatThreshold", "Type": "Int", - "Desc": "Memory size for L-BFGS. Lower=faster, less accurate", + "Desc": "Max number of categorical thresholds.", "Aliases": [ - "m" + "maxcat" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 20, + "Default": 32, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - 5, - 20, - 50 + 8, + 16, + 32, + 64 ] } }, { - "Name": "EnforceNonNegativity", - "Type": "Bool", - "Desc": "Enforce non-negative weights", - "Aliases": [ - "nn" - ], + "Name": "CatSmooth", + "Type": "Float", + "Desc": "Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories.", "Required": false, - "SortOrder": 90.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": 10.0, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 10, + 20 + ] + } }, { - "Name": "InitWtsDiameter", + "Name": "CatL2", "Type": "Float", - "Desc": "Init weights diameter", - "Aliases": [ - "initwts" - ], + "Desc": "L2 Regularization for categorical split.", "Required": false, - "SortOrder": 140.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0, + "Default": 10.0, + "Range": { + "Min": 0.0 + }, "SweepRange": { - "RangeType": "Float", - "Min": 0.0, - "Max": 1.0, - "NumSteps": 5 + "RangeType": "Discrete", + "Values": [ + 0.1, + 0.5, + 1, + 5, + 10 + ] } }, { - "Name": "MaxIterations", - "Type": "Int", - "Desc": "Maximum iterations.", + "Name": "ParallelTrainer", + "Type": { + "Kind": "Component", + "ComponentKind": "ParallelLightGBM" + }, + "Desc": "Parallel LightGBM Learning Algorithm", "Aliases": [ - "maxiter" + "parag" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 2147483647, - "SweepRange": { - "RangeType": "Long", - "Min": 1, - "Max": 2147483647 - } - }, - { - "Name": "SgdInitializationTolerance", - "Type": "Float", - "Desc": "Run SGD to initialize LR weights, converging to this tolerance", - "Aliases": [ - "sgd" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0.0 - }, - { - "Name": "Quiet", - "Type": "Bool", - "Desc": "If set to true, produce no output during training.", - "Aliases": [ - "q" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "UseThreads", - "Type": "Bool", - "Desc": "Whether or not to use threads. Default is true", - "Aliases": [ - "t" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true - }, - { - "Name": "NumThreads", - "Type": "Int", - "Desc": "Number of threads", - "Aliases": [ - "nt" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "DenseOptimizer", - "Type": "Bool", - "Desc": "Force densification of the internal optimization vectors", - "Aliases": [ - "do" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - false, - true - ] + "Default": { + "Name": "Single" } } ], @@ -11229,42 +11278,42 @@ } ], "InputKind": [ + "ITrainerInputWithGroupId", "ITrainerInputWithWeight", "ITrainerInputWithLabel", "ITrainerInput" ], "OutputKind": [ - "IRegressionOutput", + "IBinaryClassificationOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.StochasticDualCoordinateAscentBinaryClassifier", - "Desc": "Train an SDCA binary model.", - "FriendlyName": "Fast Linear (SA-SDCA)", - "ShortName": "SDCA", + "Name": "Trainers.LightGbmClassifier", + "Desc": "Train a LightGBM multi class model.", + "FriendlyName": "LightGBM Multi Class Classifier", + "ShortName": "LightGBMMC", "Inputs": [ { - "Name": "L2Const", - "Type": "Float", - "Desc": "L2 regularizer constant. By default the l2 constant is automatically inferred based on data set.", + "Name": "NumBoostRound", + "Type": "Int", + "Desc": "Number of iterations.", "Aliases": [ - "l2" + "iter" ], "Required": false, "SortOrder": 1.0, - "IsNullable": true, - "Default": null, + "IsNullable": false, + "Default": 100, "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 1E-07, - 1E-06, - 1E-05, - 0.0001, - 0.001, - 0.01 + 10, + 20, + 50, + 100, + 150, + 200 ] } }, @@ -11280,11 +11329,48 @@ "IsNullable": false }, { - "Name": "L1Threshold", + "Name": "LearningRate", "Type": "Float", - "Desc": "L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set.", + "Desc": "Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1].", "Aliases": [ - "l1" + "lr" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Float", + "Min": 0.025, + "Max": 0.4, + "IsLogScale": true + } + }, + { + "Name": "NumLeaves", + "Type": "Int", + "Desc": "Maximum leaves for trees.", + "Aliases": [ + "nl" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Long", + "Min": 2, + "Max": 128, + "StepSize": 4.0, + "IsLogScale": true + } + }, + { + "Name": "MinDataPerLeaf", + "Type": "Int", + "Desc": "Minimum number of instances needed in a child.", + "Aliases": [ + "mil" ], "Required": false, "SortOrder": 2.0, @@ -11293,12 +11379,10 @@ "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 0.0, - 0.25, - 0.5, - 0.75, - 1.0 + 1, + 10, + 20, + 50 ] } }, @@ -11314,6 +11398,20 @@ "IsNullable": false, "Default": "Features" }, + { + "Name": "Booster", + "Type": { + "Kind": "Component", + "ComponentKind": "BoosterParameterFunction" + }, + "Desc": "Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function.", + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": { + "Name": "gbdt" + } + }, { "Name": "LabelColumn", "Type": "String", @@ -11326,6 +11424,30 @@ "IsNullable": false, "Default": "Label" }, + { + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": "Weight" + }, + { + "Name": "GroupIdColumn", + "Type": "String", + "Desc": "Column to use for example groupId", + "Aliases": [ + "groupId" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "GroupId" + }, { "Name": "NormalizeFeatures", "Type": { @@ -11367,98 +11489,131 @@ "Default": "Auto" }, { - "Name": "LossFunction", - "Type": { - "Kind": "Component", - "ComponentKind": "SDCAClassificationLossFunction" - }, - "Desc": "Loss Function", + "Name": "MaxBin", + "Type": "Int", + "Desc": "Max number of bucket bin for features.", "Aliases": [ - "loss" + "mb" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": { - "Name": "LogLoss" - } + "Default": 255 }, { - "Name": "NumThreads", - "Type": "Int", - "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", + "Name": "VerboseEval", + "Type": "Bool", + "Desc": "Verbose", "Aliases": [ - "nt", - "t", - "threads" + "v" ], "Required": false, - "SortOrder": 50.0, - "IsNullable": true, - "Default": null + "SortOrder": 150.0, + "IsNullable": false, + "Default": false }, { - "Name": "PositiveInstanceWeight", - "Type": "Float", - "Desc": "Apply weight to the positive class, for imbalanced data", + "Name": "Silent", + "Type": "Bool", + "Desc": "Printing running messages.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "NThread", + "Type": "Int", + "Desc": "Number of parallel threads used to run LightGBM.", "Aliases": [ - "piw" + "nt" ], "Required": false, "SortOrder": 150.0, - "IsNullable": false, - "Default": 1.0 + "IsNullable": true, + "Default": null }, { - "Name": "Calibrator", + "Name": "EvalMetric", "Type": { - "Kind": "Component", - "ComponentKind": "CalibratorTrainer" + "Kind": "Enum", + "Values": [ + "DefaultMetric", + "Rmse", + "Mae", + "Logloss", + "Error", + "Merror", + "Mlogloss", + "Auc", + "Ndcg", + "Map" + ] }, - "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", + "Desc": "Evaluation metrics.", + "Aliases": [ + "em" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": { - "Name": "PlattCalibrator" - } + "Default": "DefaultMetric" }, { - "Name": "MaxCalibrationExamples", - "Type": "Int", - "Desc": "The maximum number of examples to use when training the calibrator", + "Name": "UseSoftmax", + "Type": "Bool", + "Desc": "Use softmax loss for the multi classification.", "Required": false, "SortOrder": 150.0, - "IsNullable": false, - "Default": 1000000 + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + true, + false + ] + } }, { - "Name": "ConvergenceTolerance", - "Type": "Float", - "Desc": "The tolerance for the ratio between duality gap and primal loss for convergence checking.", + "Name": "EarlyStoppingRound", + "Type": "Int", + "Desc": "Rounds of early stopping, 0 will disable it.", "Aliases": [ - "tol" + "es" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.1, - "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 0.001, - 0.01, - 0.1, - 0.2 - ] - } + "Default": 0 }, { - "Name": "MaxIterations", + "Name": "CustomGains", + "Type": "String", + "Desc": "Comma seperated list of gains associated to each relevance label.", + "Aliases": [ + "gains" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "0,3,7,15,31,63,127,255,511,1023,2047,4095" + }, + { + "Name": "BatchSize", "Type": "Int", - "Desc": "Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic.", + "Desc": "Number of entries in a batch when loading data.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1048576 + }, + { + "Name": "UseCat", + "Type": "Bool", + "Desc": "Enable categorical split or not.", "Aliases": [ - "iter" + "cat" ], "Required": false, "SortOrder": 150.0, @@ -11467,64 +11622,135 @@ "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 10, - 20, - 100 + true, + false ] } }, { - "Name": "Shuffle", + "Name": "UseMissing", "Type": "Bool", - "Desc": "Shuffle data every epoch?", + "Desc": "Enable missing value auto infer or not.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + true, + false + ] + } + }, + { + "Name": "MinDataPerGroup", + "Type": "Int", + "Desc": "Min number of instances per categorical group.", "Aliases": [ - "shuf" + "mdpg" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true, + "Default": 100, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - false, - true + 10, + 50, + 100, + 200 ] } }, { - "Name": "CheckFrequency", + "Name": "MaxCatThreshold", "Type": "Int", - "Desc": "Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations.", + "Desc": "Max number of categorical thresholds.", "Aliases": [ - "checkFreq" + "maxcat" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": 32, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 8, + 16, + 32, + 64 + ] + } }, { - "Name": "BiasLearningRate", + "Name": "CatSmooth", "Type": "Float", - "Desc": "The learning rate for adjusting bias from being regularized.", - "Aliases": [ - "blr" - ], + "Desc": "Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories.", "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0, + "Default": 10.0, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 10, + 20 + ] + } + }, + { + "Name": "CatL2", + "Type": "Float", + "Desc": "L2 Regularization for categorical split.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 10.0, + "Range": { + "Min": 0.0 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - 0.0, - 0.01, 0.1, - 1.0 + 0.5, + 1, + 5, + 10 ] } + }, + { + "Name": "ParallelTrainer", + "Type": { + "Kind": "Component", + "ComponentKind": "ParallelLightGBM" + }, + "Desc": "Parallel LightGBM Learning Algorithm", + "Aliases": [ + "parag" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": { + "Name": "Single" + } } ], "Outputs": [ @@ -11535,41 +11761,42 @@ } ], "InputKind": [ + "ITrainerInputWithGroupId", + "ITrainerInputWithWeight", "ITrainerInputWithLabel", "ITrainerInput" ], "OutputKind": [ - "IBinaryClassificationOutput", + "IMulticlassClassificationOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.StochasticDualCoordinateAscentClassifier", - "Desc": "Train an SDCA multi class model", - "FriendlyName": "Fast Linear Multi-class Classification (SA-SDCA)", - "ShortName": "sasdcamc", + "Name": "Trainers.LightGbmRanker", + "Desc": "Train a LightGBM ranking model.", + "FriendlyName": "LightGBM Ranking", + "ShortName": "LightGBMRank", "Inputs": [ { - "Name": "L2Const", - "Type": "Float", - "Desc": "L2 regularizer constant. By default the l2 constant is automatically inferred based on data set.", + "Name": "NumBoostRound", + "Type": "Int", + "Desc": "Number of iterations.", "Aliases": [ - "l2" + "iter" ], "Required": false, "SortOrder": 1.0, - "IsNullable": true, - "Default": null, + "IsNullable": false, + "Default": 100, "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 1E-07, - 1E-06, - 1E-05, - 0.0001, - 0.001, - 0.01 + 10, + 20, + 50, + 100, + 150, + 200 ] } }, @@ -11585,11 +11812,48 @@ "IsNullable": false }, { - "Name": "L1Threshold", + "Name": "LearningRate", "Type": "Float", - "Desc": "L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set.", + "Desc": "Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1].", "Aliases": [ - "l1" + "lr" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Float", + "Min": 0.025, + "Max": 0.4, + "IsLogScale": true + } + }, + { + "Name": "NumLeaves", + "Type": "Int", + "Desc": "Maximum leaves for trees.", + "Aliases": [ + "nl" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Long", + "Min": 2, + "Max": 128, + "StepSize": 4.0, + "IsLogScale": true + } + }, + { + "Name": "MinDataPerLeaf", + "Type": "Int", + "Desc": "Minimum number of instances needed in a child.", + "Aliases": [ + "mil" ], "Required": false, "SortOrder": 2.0, @@ -11598,12 +11862,10 @@ "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 0.0, - 0.25, - 0.5, - 0.75, - 1.0 + 1, + 10, + 20, + 50 ] } }, @@ -11619,6 +11881,20 @@ "IsNullable": false, "Default": "Features" }, + { + "Name": "Booster", + "Type": { + "Kind": "Component", + "ComponentKind": "BoosterParameterFunction" + }, + "Desc": "Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function.", + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": { + "Name": "gbdt" + } + }, { "Name": "LabelColumn", "Type": "String", @@ -11631,6 +11907,30 @@ "IsNullable": false, "Default": "Label" }, + { + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": "Weight" + }, + { + "Name": "GroupIdColumn", + "Type": "String", + "Desc": "Column to use for example groupId", + "Aliases": [ + "groupId" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "GroupId" + }, { "Name": "NormalizeFeatures", "Type": { @@ -11672,63 +11972,131 @@ "Default": "Auto" }, { - "Name": "LossFunction", - "Type": { - "Kind": "Component", - "ComponentKind": "SDCAClassificationLossFunction" - }, - "Desc": "Loss Function", + "Name": "MaxBin", + "Type": "Int", + "Desc": "Max number of bucket bin for features.", "Aliases": [ - "loss" + "mb" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": { - "Name": "LogLoss" - } + "Default": 255 }, { - "Name": "NumThreads", - "Type": "Int", - "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", + "Name": "VerboseEval", + "Type": "Bool", + "Desc": "Verbose", "Aliases": [ - "nt", - "t", - "threads" + "v" ], "Required": false, - "SortOrder": 50.0, - "IsNullable": true, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "Silent", + "Type": "Bool", + "Desc": "Printing running messages.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "NThread", + "Type": "Int", + "Desc": "Number of parallel threads used to run LightGBM.", + "Aliases": [ + "nt" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, "Default": null }, { - "Name": "ConvergenceTolerance", - "Type": "Float", - "Desc": "The tolerance for the ratio between duality gap and primal loss for convergence checking.", + "Name": "EvalMetric", + "Type": { + "Kind": "Enum", + "Values": [ + "DefaultMetric", + "Rmse", + "Mae", + "Logloss", + "Error", + "Merror", + "Mlogloss", + "Auc", + "Ndcg", + "Map" + ] + }, + "Desc": "Evaluation metrics.", "Aliases": [ - "tol" + "em" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.1, + "Default": "DefaultMetric" + }, + { + "Name": "UseSoftmax", + "Type": "Bool", + "Desc": "Use softmax loss for the multi classification.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null, "SweepRange": { "RangeType": "Discrete", "Values": [ - 0.001, - 0.01, - 0.1, - 0.2 + true, + false ] } }, { - "Name": "MaxIterations", + "Name": "EarlyStoppingRound", "Type": "Int", - "Desc": "Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic.", + "Desc": "Rounds of early stopping, 0 will disable it.", "Aliases": [ - "iter" + "es" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0 + }, + { + "Name": "CustomGains", + "Type": "String", + "Desc": "Comma seperated list of gains associated to each relevance label.", + "Aliases": [ + "gains" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "0,3,7,15,31,63,127,255,511,1023,2047,4095" + }, + { + "Name": "BatchSize", + "Type": "Int", + "Desc": "Number of entries in a batch when loading data.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1048576 + }, + { + "Name": "UseCat", + "Type": "Bool", + "Desc": "Enable categorical split or not.", + "Aliases": [ + "cat" ], "Required": false, "SortOrder": 150.0, @@ -11737,64 +12105,135 @@ "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 10, - 20, - 100 + true, + false ] } }, { - "Name": "Shuffle", + "Name": "UseMissing", "Type": "Bool", - "Desc": "Shuffle data every epoch?", + "Desc": "Enable missing value auto infer or not.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + true, + false + ] + } + }, + { + "Name": "MinDataPerGroup", + "Type": "Int", + "Desc": "Min number of instances per categorical group.", "Aliases": [ - "shuf" + "mdpg" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true, + "Default": 100, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - false, - true + 10, + 50, + 100, + 200 ] } }, { - "Name": "CheckFrequency", + "Name": "MaxCatThreshold", "Type": "Int", - "Desc": "Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations.", + "Desc": "Max number of categorical thresholds.", "Aliases": [ - "checkFreq" + "maxcat" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": 32, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 8, + 16, + 32, + 64 + ] + } }, { - "Name": "BiasLearningRate", + "Name": "CatSmooth", "Type": "Float", - "Desc": "The learning rate for adjusting bias from being regularized.", - "Aliases": [ - "blr" - ], + "Desc": "Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories.", "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.0, + "Default": 10.0, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 10, + 20 + ] + } + }, + { + "Name": "CatL2", + "Type": "Float", + "Desc": "L2 Regularization for categorical split.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 10.0, + "Range": { + "Min": 0.0 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - 0.0, - 0.01, 0.1, - 1.0 + 0.5, + 1, + 5, + 10 ] } + }, + { + "Name": "ParallelTrainer", + "Type": { + "Kind": "Component", + "ComponentKind": "ParallelLightGBM" + }, + "Desc": "Parallel LightGBM Learning Algorithm", + "Aliases": [ + "parag" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": { + "Name": "Single" + } } ], "Outputs": [ @@ -11805,41 +12244,42 @@ } ], "InputKind": [ + "ITrainerInputWithGroupId", + "ITrainerInputWithWeight", "ITrainerInputWithLabel", "ITrainerInput" ], "OutputKind": [ - "IMulticlassClassificationOutput", + "IRankingOutput", "ITrainerOutput" ] }, { - "Name": "Trainers.StochasticDualCoordinateAscentRegressor", - "Desc": "Train an SDCA regression model", - "FriendlyName": "Fast Linear Regression (SA-SDCA)", - "ShortName": "sasdcar", + "Name": "Trainers.LightGbmRegressor", + "Desc": "LightGBM Regression", + "FriendlyName": "LightGBM Regressor", + "ShortName": "LightGBMR", "Inputs": [ { - "Name": "L2Const", - "Type": "Float", - "Desc": "L2 regularizer constant. By default the l2 constant is automatically inferred based on data set.", + "Name": "NumBoostRound", + "Type": "Int", + "Desc": "Number of iterations.", "Aliases": [ - "l2" + "iter" ], "Required": false, "SortOrder": 1.0, - "IsNullable": true, - "Default": null, + "IsNullable": false, + "Default": 100, "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 1E-07, - 1E-06, - 1E-05, - 0.0001, - 0.001, - 0.01 + 10, + 20, + 50, + 100, + 150, + 200 ] } }, @@ -11855,11 +12295,48 @@ "IsNullable": false }, { - "Name": "L1Threshold", + "Name": "LearningRate", "Type": "Float", - "Desc": "L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set.", + "Desc": "Shrinkage rate for trees, used to prevent over-fitting. Range: (0,1].", "Aliases": [ - "l1" + "lr" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Float", + "Min": 0.025, + "Max": 0.4, + "IsLogScale": true + } + }, + { + "Name": "NumLeaves", + "Type": "Int", + "Desc": "Maximum leaves for trees.", + "Aliases": [ + "nl" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Long", + "Min": 2, + "Max": 128, + "StepSize": 4.0, + "IsLogScale": true + } + }, + { + "Name": "MinDataPerLeaf", + "Type": "Int", + "Desc": "Minimum number of instances needed in a child.", + "Aliases": [ + "mil" ], "Required": false, "SortOrder": 2.0, @@ -11868,12 +12345,10 @@ "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 0.0, - 0.25, - 0.5, - 0.75, - 1.0 + 1, + 10, + 20, + 50 ] } }, @@ -11889,6 +12364,20 @@ "IsNullable": false, "Default": "Features" }, + { + "Name": "Booster", + "Type": { + "Kind": "Component", + "ComponentKind": "BoosterParameterFunction" + }, + "Desc": "Which booster to use, can be gbtree, gblinear or dart. gbtree and dart use tree based model while gblinear uses linear function.", + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": { + "Name": "gbdt" + } + }, { "Name": "LabelColumn", "Type": "String", @@ -11902,15 +12391,39 @@ "Default": "Label" }, { - "Name": "NormalizeFeatures", - "Type": { - "Kind": "Enum", - "Values": [ - "No", - "Warn", - "Auto", - "Yes" - ] + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": "Weight" + }, + { + "Name": "GroupIdColumn", + "Type": "String", + "Desc": "Column to use for example groupId", + "Aliases": [ + "groupId" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "GroupId" + }, + { + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] }, "Desc": "Normalize option for the feature column", "Aliases": [ @@ -11942,63 +12455,131 @@ "Default": "Auto" }, { - "Name": "LossFunction", - "Type": { - "Kind": "Component", - "ComponentKind": "SDCARegressionLossFunction" - }, - "Desc": "Loss Function", + "Name": "MaxBin", + "Type": "Int", + "Desc": "Max number of bucket bin for features.", "Aliases": [ - "loss" + "mb" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": { - "Name": "SquaredLoss" - } + "Default": 255 }, { - "Name": "NumThreads", + "Name": "VerboseEval", + "Type": "Bool", + "Desc": "Verbose", + "Aliases": [ + "v" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "Silent", + "Type": "Bool", + "Desc": "Printing running messages.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "NThread", "Type": "Int", - "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", + "Desc": "Number of parallel threads used to run LightGBM.", "Aliases": [ - "nt", - "t", - "threads" + "nt" ], "Required": false, - "SortOrder": 50.0, + "SortOrder": 150.0, "IsNullable": true, "Default": null }, { - "Name": "ConvergenceTolerance", - "Type": "Float", - "Desc": "The tolerance for the ratio between duality gap and primal loss for convergence checking.", + "Name": "EvalMetric", + "Type": { + "Kind": "Enum", + "Values": [ + "DefaultMetric", + "Rmse", + "Mae", + "Logloss", + "Error", + "Merror", + "Mlogloss", + "Auc", + "Ndcg", + "Map" + ] + }, + "Desc": "Evaluation metrics.", "Aliases": [ - "tol" + "em" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.01, + "Default": "DefaultMetric" + }, + { + "Name": "UseSoftmax", + "Type": "Bool", + "Desc": "Use softmax loss for the multi classification.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null, "SweepRange": { "RangeType": "Discrete", "Values": [ - 0.001, - 0.01, - 0.1, - 0.2 + true, + false ] } }, { - "Name": "MaxIterations", + "Name": "EarlyStoppingRound", "Type": "Int", - "Desc": "Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic.", + "Desc": "Rounds of early stopping, 0 will disable it.", "Aliases": [ - "iter" + "es" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0 + }, + { + "Name": "CustomGains", + "Type": "String", + "Desc": "Comma seperated list of gains associated to each relevance label.", + "Aliases": [ + "gains" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "0,3,7,15,31,63,127,255,511,1023,2047,4095" + }, + { + "Name": "BatchSize", + "Type": "Int", + "Desc": "Number of entries in a batch when loading data.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1048576 + }, + { + "Name": "UseCat", + "Type": "Bool", + "Desc": "Enable categorical split or not.", + "Aliases": [ + "cat" ], "Required": false, "SortOrder": 150.0, @@ -12007,64 +12588,135 @@ "SweepRange": { "RangeType": "Discrete", "Values": [ - "", - 10, - 20, - 100 + true, + false ] } }, { - "Name": "Shuffle", + "Name": "UseMissing", "Type": "Bool", - "Desc": "Shuffle data every epoch?", + "Desc": "Enable missing value auto infer or not.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + true, + false + ] + } + }, + { + "Name": "MinDataPerGroup", + "Type": "Int", + "Desc": "Min number of instances per categorical group.", "Aliases": [ - "shuf" + "mdpg" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true, + "Default": 100, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - false, - true + 10, + 50, + 100, + 200 ] } }, { - "Name": "CheckFrequency", + "Name": "MaxCatThreshold", "Type": "Int", - "Desc": "Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations.", + "Desc": "Max number of categorical thresholds.", "Aliases": [ - "checkFreq" + "maxcat" ], "Required": false, "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": 32, + "Range": { + "Inf": 0, + "Max": 2147483647 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 8, + 16, + 32, + 64 + ] + } }, { - "Name": "BiasLearningRate", + "Name": "CatSmooth", "Type": "Float", - "Desc": "The learning rate for adjusting bias from being regularized.", - "Aliases": [ - "blr" - ], + "Desc": "Lapalace smooth term in categorical feature spilt. Avoid the bias of small categories.", "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0, + "Default": 10.0, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 10, + 20 + ] + } + }, + { + "Name": "CatL2", + "Type": "Float", + "Desc": "L2 Regularization for categorical split.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 10.0, + "Range": { + "Min": 0.0 + }, "SweepRange": { "RangeType": "Discrete", "Values": [ - 0.0, - 0.01, 0.1, - 1.0 + 0.5, + 1, + 5, + 10 ] } + }, + { + "Name": "ParallelTrainer", + "Type": { + "Kind": "Component", + "ComponentKind": "ParallelLightGBM" + }, + "Desc": "Parallel LightGBM Learning Algorithm", + "Aliases": [ + "parag" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": { + "Name": "Single" + } } ], "Outputs": [ @@ -12075,6 +12727,8 @@ } ], "InputKind": [ + "ITrainerInputWithGroupId", + "ITrainerInputWithWeight", "ITrainerInputWithLabel", "ITrainerInput" ], @@ -12084,10 +12738,10 @@ ] }, { - "Name": "Trainers.StochasticGradientDescentBinaryClassifier", - "Desc": "Train an Hogwild SGD binary model.", - "FriendlyName": "Hogwild SGD (binary)", - "ShortName": "HogwildSGD", + "Name": "Trainers.LinearSvmBinaryClassifier", + "Desc": "Train a linear SVM.", + "FriendlyName": "SVM (Pegasos-Linear)", + "ShortName": "svm", "Inputs": [ { "Name": "TrainingData", @@ -12124,18 +12778,6 @@ "IsNullable": false, "Default": "Label" }, - { - "Name": "WeightColumn", - "Type": "String", - "Desc": "Column to use for example weight", - "Aliases": [ - "weight" - ], - "Required": false, - "SortOrder": 4.0, - "IsNullable": false, - "Default": "Weight" - }, { "Name": "NormalizeFeatures", "Type": { @@ -12177,117 +12819,135 @@ "Default": "Auto" }, { - "Name": "LossFunction", - "Type": { - "Kind": "Component", - "ComponentKind": "ClassificationLossFunction" - }, - "Desc": "Loss Function", + "Name": "Lambda", + "Type": "Float", + "Desc": "Regularizer constant", "Aliases": [ - "loss" + "lambda" ], "Required": false, "SortOrder": 50.0, "IsNullable": false, - "Default": { - "Name": "LogLoss" + "Default": 0.001, + "SweepRange": { + "RangeType": "Float", + "Min": 1E-05, + "Max": 0.1, + "StepSize": 10.0, + "IsLogScale": true } }, { - "Name": "L2Const", - "Type": "Float", - "Desc": "L2 regularizer constant", + "Name": "PerformProjection", + "Type": "Bool", + "Desc": "Perform projection to unit-ball? Typically used with batch size > 1.", "Aliases": [ - "l2" + "project" ], "Required": false, "SortOrder": 50.0, "IsNullable": false, - "Default": 1E-06, + "Default": false, "SweepRange": { "RangeType": "Discrete", "Values": [ - 1E-07, - 5E-07, - 1E-06, - 5E-06, - 1E-05 + false, + true ] } }, { - "Name": "NumThreads", + "Name": "NumIterations", "Type": "Int", - "Desc": "Degree of lock-free parallelism. Defaults to automatic depending on data sparseness. Determinism not guaranteed.", + "Desc": "Number of iterations", "Aliases": [ - "nt", - "t", - "threads" + "iter" ], "Required": false, "SortOrder": 50.0, - "IsNullable": true, - "Default": null + "IsNullable": false, + "Default": 1, + "SweepRange": { + "RangeType": "Long", + "Min": 1, + "Max": 100, + "StepSize": 10.0, + "IsLogScale": true + } }, { - "Name": "ConvergenceTolerance", + "Name": "InitWtsDiameter", "Type": "Float", - "Desc": "Exponential moving averaged improvement tolerance for convergence", + "Desc": "Init weights diameter", "Aliases": [ - "tol" + "initwts" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 140.0, "IsNullable": false, - "Default": 0.0001, + "Default": 0.0, "SweepRange": { - "RangeType": "Discrete", - "Values": [ - 0.01, - 0.001, - 0.0001, - 1E-05 - ] + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 5 } }, { - "Name": "MaxIterations", - "Type": "Int", - "Desc": "Maximum number of iterations; set to 1 to simulate online learning.", - "Aliases": [ - "iter" - ], + "Name": "NoBias", + "Type": "Bool", + "Desc": "No bias", "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 20, + "Default": false, "SweepRange": { "RangeType": "Discrete", "Values": [ - 1, - 5, - 10, - 20 + false, + true ] } }, { - "Name": "InitLearningRate", - "Type": "Float", - "Desc": "Initial learning rate (only used by SGD)", + "Name": "Calibrator", + "Type": { + "Kind": "Component", + "ComponentKind": "CalibratorTrainer" + }, + "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": { + "Name": "PlattCalibrator" + } + }, + { + "Name": "MaxCalibrationExamples", + "Type": "Int", + "Desc": "The maximum number of examples to use when training the calibrator", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000 + }, + { + "Name": "InitialWeights", + "Type": "String", + "Desc": "Initial Weights and bias, comma-separated", "Aliases": [ - "ilr", - "lr" + "initweights" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0.01 + "Default": null }, { "Name": "Shuffle", "Type": "Bool", - "Desc": "Shuffle data every epoch?", + "Desc": "Whether to shuffle for each training iteration", "Aliases": [ "shuf" ], @@ -12304,51 +12964,28 @@ } }, { - "Name": "PositiveInstanceWeight", - "Type": "Float", - "Desc": "Apply weight to the positive class, for imbalanced data", + "Name": "StreamingCacheSize", + "Type": "Int", + "Desc": "Size of cache when trained in Scope", "Aliases": [ - "piw" + "cache" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0 + "Default": 1000000 }, { - "Name": "CheckFrequency", + "Name": "BatchSize", "Type": "Int", - "Desc": "Convergence check frequency (in terms of number of iterations). Default equals number of threads", + "Desc": "Batch size", "Aliases": [ - "checkFreq" + "batch" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Calibrator", - "Type": { - "Kind": "Component", - "ComponentKind": "CalibratorTrainer" - }, - "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": { - "Name": "PlattCalibrator" - } - }, - { - "Name": "MaxCalibrationExamples", - "Type": "Int", - "Desc": "The maximum number of examples to use when training the calibrator", - "Required": false, - "SortOrder": 150.0, + "SortOrder": 190.0, "IsNullable": false, - "Default": 1000000 + "Default": 1 } ], "Outputs": [ @@ -12359,7 +12996,6 @@ } ], "InputKind": [ - "ITrainerInputWithWeight", "ITrainerInputWithLabel", "ITrainerInput" ], @@ -12369,443 +13005,262 @@ ] }, { - "Name": "Transforms.ApproximateBootstrapSampler", - "Desc": "Approximate bootstrap sampling.", - "FriendlyName": "Bootstrap Sample Transform", - "ShortName": "BootstrapSample", + "Name": "Trainers.LogisticRegressionBinaryClassifier", + "Desc": "Logistic Regression is a method in statistics used to predict the probability of occurrence of an event and can be used as a classification algorithm. The algorithm predicts the probability of occurrence of an event by fitting data to a logistical function.", + "FriendlyName": "Logistic Regression", + "ShortName": "lr", "Inputs": [ { - "Name": "Data", + "Name": "TrainingData", "Type": "DataView", - "Desc": "Input dataset", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "Complement", - "Type": "Bool", - "Desc": "Whether this is the out-of-bag sample, that is, all those rows that are not selected by the transform.", + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", "Aliases": [ - "comp" + "feat" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": false + "Default": "Features" }, { - "Name": "Seed", - "Type": "UInt", - "Desc": "The random seed. If unspecified random state will be instead derived from the environment.", + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", + "Aliases": [ + "lab" + ], "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "SortOrder": 3.0, + "IsNullable": false, + "Default": "Label" }, { - "Name": "ShuffleInput", - "Type": "Bool", - "Desc": "Whether we should attempt to shuffle the source data. By default on, but can be turned off for efficiency.", + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", "Aliases": [ - "si" + "weight" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 4.0, "IsNullable": false, - "Default": true + "Default": "Weight" }, { - "Name": "PoolSize", - "Type": "Int", - "Desc": "When shuffling the output, the number of output rows to keep in that pool. Note that shuffling of output is completely distinct from shuffling of input.", + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", "Aliases": [ - "pool" + "norm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": 1000 - } - ], - "Outputs": [ + "Default": "Auto" + }, { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.BinaryPredictionScoreColumnsRenamer", - "Desc": "For binary prediction, it renames the PredictedLabel and Score columns to include the name of the positive class.", - "FriendlyName": "Rename Binary Prediction Score Columns", - "ShortName": null, - "Inputs": [ - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "ShowTrainingStats", + "Type": "Bool", + "Desc": "Show statistics of training examples.", + "Aliases": [ + "stat" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": false }, { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The predictor model used in scoring", - "Required": true, - "SortOrder": 2.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Name": "L2Weight", + "Type": "Float", + "Desc": "L2 regularization weight", + "Aliases": [ + "l2" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 4 + } }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.BinNormalizer", - "Desc": "The values are assigned into equidensity bins and a value is mapped to its bin_number/number_of_bins.", - "FriendlyName": "Binning Normalizer", - "ShortName": "Bin", - "Inputs": [ - { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "NumBins", - "Type": "Int", - "Desc": "Max number of bins, power of 2 recommended", - "Aliases": [ - "bins" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "FixZero", - "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", - "Aliases": [ - "zero" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "MaxTrainingExamples", - "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", - "Aliases": [ - "maxtrain" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:src)", + "Name": "L1Weight", + "Type": "Float", + "Desc": "L1 regularization weight", "Aliases": [ - "col" + "l1" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": null + "Default": 1.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 4 + } }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "OptTol", + "Type": "Float", + "Desc": "Tolerance parameter for optimization convergence. Lower = slower, more accurate", + "Aliases": [ + "ot" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1E-07, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0001, + 1E-07 + ] + } }, { - "Name": "NumBins", + "Name": "MemorySize", "Type": "Int", - "Desc": "Max number of bins, power of 2 recommended", + "Desc": "Memory size for L-BFGS. Lower=faster, less accurate", "Aliases": [ - "bins" + "m" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 1024 + "Default": 20, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 5, + 20, + 50 + ] + } }, { - "Name": "FixZero", + "Name": "EnforceNonNegativity", "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", + "Desc": "Enforce non-negative weights", "Aliases": [ - "zero" + "nn" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 90.0, "IsNullable": false, - "Default": true + "Default": false }, { - "Name": "MaxTrainingExamples", + "Name": "InitWtsDiameter", + "Type": "Float", + "Desc": "Init weights diameter", + "Aliases": [ + "initwts" + ], + "Required": false, + "SortOrder": 140.0, + "IsNullable": false, + "Default": 0.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 5 + } + }, + { + "Name": "MaxIterations", "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", + "Desc": "Maximum iterations.", "Aliases": [ - "maxtrain" + "maxiter" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000000000 - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": 2147483647, + "SweepRange": { + "RangeType": "Long", + "Min": 1, + "Max": 2147483647 + } }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.CategoricalHashOneHotVectorizer", - "Desc": "Encodes the categorical variable with hash-based encoding", - "FriendlyName": "Categorical Hash Transform", - "ShortName": null, - "Inputs": [ - { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "OutputKind", - "Type": { - "Kind": "Enum", - "Values": [ - "Bag", - "Ind", - "Key", - "Bin" - ] - }, - "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", - "Aliases": [ - "kind" - ], - "Required": false, - "SortOrder": 102.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "HashBits", - "Type": "Int", - "Desc": "The number of bits to hash into. Must be between 1 and 30, inclusive.", - "Aliases": [ - "bits" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Seed", - "Type": "UInt", - "Desc": "Hashing seed", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Ordered", - "Type": "Bool", - "Desc": "Whether the position of each term should be included in the hash", - "Aliases": [ - "ord" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "InvertHash", - "Type": "Int", - "Desc": "Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit.", - "Aliases": [ - "ih" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:hashBits:src)", - "Aliases": [ - "col" - ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, - { - "Name": "HashBits", - "Type": "Int", - "Desc": "Number of bits to hash into. Must be between 1 and 30, inclusive.", + "Name": "SgdInitializationTolerance", + "Type": "Float", + "Desc": "Run SGD to initialize LR weights, converging to this tolerance", "Aliases": [ - "bits" + "sgd" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": 16 + "Default": 0.0 }, { - "Name": "OutputKind", - "Type": { - "Kind": "Enum", - "Values": [ - "Bag", - "Ind", - "Key", - "Bin" - ] - }, - "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", + "Name": "Quiet", + "Type": "Bool", + "Desc": "If set to true, produce no output during training.", "Aliases": [ - "kind" + "q" ], "Required": false, - "SortOrder": 102.0, - "IsNullable": false, - "Default": "Bag" - }, - { - "Name": "Seed", - "Type": "UInt", - "Desc": "Hashing seed", - "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 314489979 + "Default": false }, { - "Name": "Ordered", + "Name": "UseThreads", "Type": "Bool", - "Desc": "Whether the position of each term should be included in the hash", + "Desc": "Whether or not to use threads. Default is true", "Aliases": [ - "ord" + "t" ], "Required": false, "SortOrder": 150.0, @@ -12813,924 +13268,710 @@ "Default": true }, { - "Name": "InvertHash", + "Name": "NumThreads", "Type": "Int", - "Desc": "Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit.", + "Desc": "Number of threads", "Aliases": [ - "ih" + "nt" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "DenseOptimizer", + "Type": "Bool", + "Desc": "Force densification of the internal optimization vectors", + "Aliases": [ + "do" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0 + "Default": false, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" + "ITrainerInputWithWeight", + "ITrainerInputWithLabel", + "ITrainerInput" ], "OutputKind": [ - "ITransformOutput" + "IBinaryClassificationOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.CategoricalOneHotVectorizer", - "Desc": "Encodes the categorical variable with one-hot encoding based on term dictionary", - "FriendlyName": "Categorical Transform", - "ShortName": null, + "Name": "Trainers.LogisticRegressionClassifier", + "Desc": "Logistic Regression is a method in statistics used to predict the probability of occurrence of an event and can be used as a classification algorithm. The algorithm predicts the probability of occurrence of an event by fitting data to a logistical function.", + "FriendlyName": "Multi-class Logistic Regression", + "ShortName": "mlr", "Inputs": [ { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "OutputKind", - "Type": { - "Kind": "Enum", - "Values": [ - "Bag", - "Ind", - "Key", - "Bin" - ] - }, - "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), Key (index), or Binary encoded indicator vector", - "Aliases": [ - "kind" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "MaxNumTerms", - "Type": "Int", - "Desc": "Maximum number of terms to keep when auto-training", - "Aliases": [ - "max" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Term", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "List of terms", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Sort", - "Type": { - "Kind": "Enum", - "Values": [ - "Occurrence", - "Value" - ] - }, - "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "TextKeyValues", - "Type": "Bool", - "Desc": "Whether key value metadata should be text, regardless of the actual input type", - "Aliases": [ - "textkv" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:src)", + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", "Aliases": [ - "col" + "data" ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Features" }, { - "Name": "MaxNumTerms", - "Type": "Int", - "Desc": "Maximum number of terms to keep per column when auto-training", + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", "Aliases": [ - "max" + "lab" ], "Required": false, - "SortOrder": 5.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": 1000000 + "Default": "Label" }, { - "Name": "OutputKind", - "Type": { - "Kind": "Enum", - "Values": [ - "Bag", - "Ind", - "Key", - "Bin" - ] - }, - "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", "Aliases": [ - "kind" + "weight" ], "Required": false, - "SortOrder": 102.0, + "SortOrder": 4.0, "IsNullable": false, - "Default": "Ind" + "Default": "Weight" }, { - "Name": "Term", + "Name": "NormalizeFeatures", "Type": { - "Kind": "Array", - "ItemType": "String" + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] }, - "Desc": "List of terms", + "Desc": "Normalize option for the feature column", + "Aliases": [ + "norm" + ], "Required": false, - "SortOrder": 106.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": null + "Default": "Auto" }, { - "Name": "Sort", + "Name": "Caching", "Type": { "Kind": "Enum", "Values": [ - "Occurrence", - "Value" + "Auto", + "Memory", + "Disk", + "None" ] }, - "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], "Required": false, - "SortOrder": 113.0, + "SortOrder": 6.0, "IsNullable": false, - "Default": "Occurrence" + "Default": "Auto" }, { - "Name": "TextKeyValues", + "Name": "ShowTrainingStats", "Type": "Bool", - "Desc": "Whether key value metadata should be text, regardless of the actual input type", + "Desc": "Show statistics of training examples.", "Aliases": [ - "textkv" + "stat" ], "Required": false, - "SortOrder": 114.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": true - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": false }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.CharacterTokenizer", - "Desc": "Character-oriented tokenizer where text is considered a sequence of characters.", - "FriendlyName": "Character Tokenizer Transform", - "ShortName": "CharToken", - "Inputs": [ - { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:src)", + "Name": "L2Weight", + "Type": "Float", + "Desc": "L2 regularization weight", "Aliases": [ - "col" + "l2" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 4 + } }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "L1Weight", + "Type": "Float", + "Desc": "L1 regularization weight", + "Aliases": [ + "l1" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 4 + } }, { - "Name": "UseMarkerChars", + "Name": "OptTol", + "Type": "Float", + "Desc": "Tolerance parameter for optimization convergence. Lower = slower, more accurate", + "Aliases": [ + "ot" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1E-07, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0001, + 1E-07 + ] + } + }, + { + "Name": "MemorySize", + "Type": "Int", + "Desc": "Memory size for L-BFGS. Lower=faster, less accurate", + "Aliases": [ + "m" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 20, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 5, + 20, + 50 + ] + } + }, + { + "Name": "EnforceNonNegativity", "Type": "Bool", - "Desc": "Whether to mark the beginning/end of each row/slot with start of text character (0x02)/end of text character (0x03)", + "Desc": "Enforce non-negative weights", "Aliases": [ - "mark" + "nn" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 90.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "InitWtsDiameter", + "Type": "Float", + "Desc": "Init weights diameter", + "Aliases": [ + "initwts" + ], + "Required": false, + "SortOrder": 140.0, + "IsNullable": false, + "Default": 0.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 5 + } + }, + { + "Name": "MaxIterations", + "Type": "Int", + "Desc": "Maximum iterations.", + "Aliases": [ + "maxiter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 2147483647, + "SweepRange": { + "RangeType": "Long", + "Min": 1, + "Max": 2147483647 + } + }, + { + "Name": "SgdInitializationTolerance", + "Type": "Float", + "Desc": "Run SGD to initialize LR weights, converging to this tolerance", + "Aliases": [ + "sgd" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0 + }, + { + "Name": "Quiet", + "Type": "Bool", + "Desc": "If set to true, produce no output during training.", + "Aliases": [ + "q" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "UseThreads", + "Type": "Bool", + "Desc": "Whether or not to use threads. Default is true", + "Aliases": [ + "t" + ], + "Required": false, + "SortOrder": 150.0, "IsNullable": false, "Default": true + }, + { + "Name": "NumThreads", + "Type": "Int", + "Desc": "Number of threads", + "Aliases": [ + "nt" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "DenseOptimizer", + "Type": "Bool", + "Desc": "Force densification of the internal optimization vectors", + "Aliases": [ + "do" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" + "ITrainerInputWithWeight", + "ITrainerInputWithLabel", + "ITrainerInput" ], "OutputKind": [ - "ITransformOutput" + "IMulticlassClassificationOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.ColumnConcatenator", - "Desc": "Concatenates two columns of the same item type.", - "FriendlyName": "Concat Transform", - "ShortName": "Concat", + "Name": "Trainers.NaiveBayesClassifier", + "Desc": "Train a MultiClassNaiveBayesTrainer.", + "FriendlyName": "Multiclass Naive Bayes", + "ShortName": "MNB", "Inputs": [ { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:srcs)", + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", "Aliases": [ - "col" + "data" ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - } - ], - "Outputs": [ + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Features" + }, { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", + "Aliases": [ + "lab" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": "Label" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.ColumnCopier", - "Desc": "Duplicates columns from the dataset", - "FriendlyName": "Copy Columns Transform", - "ShortName": "Copy", - "Inputs": [ - { - "Name": "Column", + "Name": "NormalizeFeatures", "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "Normalize option for the feature column", "Aliases": [ - "col" + "norm" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" + "ITrainerInputWithLabel", + "ITrainerInput" ], "OutputKind": [ - "ITransformOutput" + "IMulticlassClassificationOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.ColumnDropper", - "Desc": "Drops columns from the dataset", - "FriendlyName": "Drop Columns Transform", - "ShortName": "Drop", + "Name": "Trainers.OnlineGradientDescentRegressor", + "Desc": "Train a Online gradient descent perceptron.", + "FriendlyName": "Stochastic Gradient Descent (Regression)", + "ShortName": "ogd", "Inputs": [ { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Column name to drop", + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", "Aliases": [ - "col" + "data" ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Features" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.ColumnSelector", - "Desc": "Selects a set of columns, dropping all others", - "FriendlyName": "Select Columns", - "ShortName": null, - "Inputs": [ + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", + "Aliases": [ + "lab" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": "Label" + }, { - "Name": "Column", + "Name": "NormalizeFeatures", "Type": { - "Kind": "Array", - "ItemType": "String" + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] }, - "Desc": "Column name to keep", + "Desc": "Normalize option for the feature column", "Aliases": [ - "col" + "norm" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": null + "Default": "Auto" }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.ColumnTypeConverter", - "Desc": "Converts a column to a different type, using standard conversions.", - "FriendlyName": "Convert Transform", - "ShortName": "Convert", - "Inputs": [ - { - "Name": "Column", + "Name": "LossFunction", "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "ResultType", - "Type": { - "Kind": "Enum", - "Values": [ - "I1", - "U1", - "I2", - "U2", - "I4", - "U4", - "I8", - "U8", - "R4", - "Num", - "R8", - "TX", - "Text", - "TXT", - "BL", - "Bool", - "TimeSpan", - "TS", - "DT", - "DateTime", - "DZ", - "DateTimeZone", - "UG", - "U16" - ] - }, - "Desc": "The result type", - "Aliases": [ - "type" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Range", - "Type": "String", - "Desc": "For a key column, this defines the range of values", - "Aliases": [ - "key" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "Kind": "Component", + "ComponentKind": "RegressionLossFunction" }, - "Desc": "New column definition(s) (optional form: name:type:src)", + "Desc": "Loss Function", "Aliases": [ - "col" + "loss" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": { + "Name": "SquaredLoss" + } }, { - "Name": "ResultType", - "Type": { - "Kind": "Enum", - "Values": [ - "I1", - "U1", - "I2", - "U2", - "I4", - "U4", - "I8", - "U8", - "R4", - "Num", - "R8", - "TX", - "Text", - "TXT", - "BL", - "Bool", - "TimeSpan", - "TS", - "DT", - "DateTime", - "DZ", - "DateTimeZone", - "UG", - "U16" - ] - }, - "Desc": "The result type", + "Name": "LearningRate", + "Type": "Float", + "Desc": "Learning rate", "Aliases": [ - "type" + "lr" ], "Required": false, - "SortOrder": 2.0, - "IsNullable": true, - "Default": null + "SortOrder": 50.0, + "IsNullable": false, + "Default": 0.1, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.01, + 0.1, + 0.5, + 1.0 + ] + } }, { - "Name": "Range", - "Type": "String", - "Desc": "For a key column, this defines the range of values", + "Name": "DecreaseLearningRate", + "Type": "Bool", + "Desc": "Decrease learning rate", "Aliases": [ - "key" + "decreaselr" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": null - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": true, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.CombinerByContiguousGroupId", - "Desc": "Groups values of a scalar column into a vector, by a contiguous group ID", - "FriendlyName": "Group Transform", - "ShortName": "Group", - "Inputs": [ - { - "Name": "GroupKey", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Columns to group by", + "Name": "L2RegularizerWeight", + "Type": "Float", + "Desc": "L2 Regularization Weight", "Aliases": [ - "g" + "reg" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": null - }, - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Default": 0.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 0.4 + } }, { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Columns to group together", + "Name": "NumIterations", + "Type": "Int", + "Desc": "Number of iterations", "Aliases": [ - "col" + "iter" ], - "Required": true, - "SortOrder": 2.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1, + "SweepRange": { + "RangeType": "Long", + "Min": 1, + "Max": 100, + "StepSize": 10.0, + "IsLogScale": true + } }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.ConditionalNormalizer", - "Desc": "Normalize the columns only if needed", - "FriendlyName": "Normalize If Needed", - "ShortName": null, - "Inputs": [ + "Name": "InitWtsDiameter", + "Type": "Float", + "Desc": "Init weights diameter", + "Aliases": [ + "initwts" + ], + "Required": false, + "SortOrder": 140.0, + "IsNullable": false, + "Default": 0.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 5 + } + }, { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "FixZero", - "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", - "Aliases": [ - "zero" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "MaxTrainingExamples", - "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", - "Aliases": [ - "maxtrain" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:src)", + "Name": "ResetWeightsAfterXExamples", + "Type": "Int", + "Desc": "Number of examples after which weights will be reset to the current average", "Aliases": [ - "col" + "numreset" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "DoLazyUpdates", + "Type": "Bool", + "Desc": "Instead of updating averaged weights on every example, only update when loss is nonzero", + "Aliases": [ + "lazy" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true }, { - "Name": "FixZero", + "Name": "RecencyGain", + "Type": "Float", + "Desc": "Extra weight given to more recent updates", + "Aliases": [ + "rg" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0 + }, + { + "Name": "RecencyGainMulti", "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", + "Desc": "Whether Recency Gain is multiplicative (vs. additive)", "Aliases": [ - "zero" + "rgm" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "Averaged", + "Type": "Bool", + "Desc": "Do averaging?", + "Aliases": [ + "avg" ], "Required": false, "SortOrder": 150.0, @@ -13738,481 +13979,619 @@ "Default": true }, { - "Name": "MaxTrainingExamples", + "Name": "AveragedTolerance", + "Type": "Float", + "Desc": "The inexactness tolerance for averaging", + "Aliases": [ + "avgtol" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01 + }, + { + "Name": "InitialWeights", + "Type": "String", + "Desc": "Initial Weights and bias, comma-separated", + "Aliases": [ + "initweights" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Shuffle", + "Type": "Bool", + "Desc": "Whether to shuffle for each training iteration", + "Aliases": [ + "shuf" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } + }, + { + "Name": "StreamingCacheSize", "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", + "Desc": "Size of cache when trained in Scope", "Aliases": [ - "maxtrain" + "cache" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000000000 + "Default": 1000000 } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" + "ITrainerInputWithLabel", + "ITrainerInput" + ], + "OutputKind": [ + "IRegressionOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.DataCache", - "Desc": "Caches using the specified cache option.", - "FriendlyName": "Cache Data", - "ShortName": null, + "Name": "Trainers.PcaAnomalyDetector", + "Desc": "Train an PCA Anomaly model.", + "FriendlyName": "PCA Anomaly Detector", + "ShortName": "pcaAnom", "Inputs": [ { - "Name": "Data", + "Name": "TrainingData", "Type": "DataView", - "Desc": "Input dataset", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "Caching", - "Type": { - "Kind": "Enum", - "Values": [ - "Memory", - "Disk" - ] - }, - "Desc": "Caching strategy", - "Required": true, + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, "SortOrder": 2.0, "IsNullable": false, - "Default": "Memory" - } - ], - "Outputs": [ + "Default": "Features" + }, { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Dataset" - } - ], - "InputKind": [ - "ITransformInput" - ] - }, - { - "Name": "Transforms.DatasetScorer", - "Desc": "Score a dataset with a predictor model", - "FriendlyName": null, - "ShortName": null, - "Inputs": [ + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": "Weight" + }, { - "Name": "Data", - "Type": "DataView", - "Desc": "The dataset to be scored", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", + "Aliases": [ + "norm" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The predictor model to apply to data", - "Required": true, - "SortOrder": 2.0, - "IsNullable": false + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "Suffix", - "Type": "String", - "Desc": "Suffix to append to the score columns", + "Name": "Rank", + "Type": "Int", + "Desc": "The number of components in the PCA", + "Aliases": [ + "k" + ], "Required": false, - "SortOrder": 3.0, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 20, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 10, + 20, + 40, + 80 + ] + } + }, + { + "Name": "Oversampling", + "Type": "Int", + "Desc": "Oversampling parameter for randomized PCA training", + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 20, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 10, + 20, + 40 + ] + } + }, + { + "Name": "Center", + "Type": "Bool", + "Desc": "If enabled, data is centered to be zero mean", + "Aliases": [ + "center" + ], + "Required": false, + "SortOrder": 150.0, "IsNullable": false, + "Default": true, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } + }, + { + "Name": "Seed", + "Type": "Int", + "Desc": "The seed for random number generation", + "Aliases": [ + "seed" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, "Default": null } ], "Outputs": [ { - "Name": "ScoredData", - "Type": "DataView", - "Desc": "The scored dataset" - }, - { - "Name": "ScoringTransform", - "Type": "TransformModel", - "Desc": "The scoring transform" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } + ], + "InputKind": [ + "IUnsupervisedTrainerWithWeight", + "ITrainerInput" + ], + "OutputKind": [ + "IAnomalyDetectionOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.DatasetTransformScorer", - "Desc": "Score a dataset with a transform model", - "FriendlyName": null, - "ShortName": null, + "Name": "Trainers.PoissonRegressor", + "Desc": "Train an Poisson regression model.", + "FriendlyName": "Poisson Regression", + "ShortName": "PR", "Inputs": [ { - "Name": "Data", + "Name": "TrainingData", "Type": "DataView", - "Desc": "The dataset to be scored", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "TransformModel", - "Type": "TransformModel", - "Desc": "The transform model to apply to data", - "Required": true, + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, "SortOrder": 2.0, - "IsNullable": false - } - ], - "Outputs": [ + "IsNullable": false, + "Default": "Features" + }, { - "Name": "ScoredData", - "Type": "DataView", - "Desc": "The scored dataset" + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", + "Aliases": [ + "lab" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": "Label" }, { - "Name": "ScoringTransform", - "Type": "TransformModel", - "Desc": "The scoring transform" - } - ] - }, - { - "Name": "Transforms.Dictionarizer", - "Desc": "Converts input values (words, numbers, etc.) to index in a dictionary.", - "FriendlyName": "Term Transform", - "ShortName": "TermTransform", - "Inputs": [ + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": "Weight" + }, { - "Name": "Column", + "Name": "NormalizeFeatures", "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "MaxNumTerms", - "Type": "Int", - "Desc": "Maximum number of terms to keep when auto-training", - "Aliases": [ - "max" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Term", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "List of terms", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Sort", - "Type": { - "Kind": "Enum", - "Values": [ - "Occurrence", - "Value" - ] - }, - "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "TextKeyValues", - "Type": "Bool", - "Desc": "Whether key value metadata should be text, regardless of the actual input type", - "Aliases": [ - "textkv" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "Normalize option for the feature column", "Aliases": [ - "col" + "norm" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": null + "Default": "Auto" }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "MaxNumTerms", - "Type": "Int", - "Desc": "Maximum number of terms to keep per column when auto-training", + "Name": "L2Weight", + "Type": "Float", + "Desc": "L2 regularization weight", "Aliases": [ - "max" + "l2" ], "Required": false, - "SortOrder": 5.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 1000000 + "Default": 1.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 4 + } }, { - "Name": "Term", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "List of terms", + "Name": "L1Weight", + "Type": "Float", + "Desc": "L1 regularization weight", + "Aliases": [ + "l1" + ], "Required": false, - "SortOrder": 106.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": null + "Default": 1.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 4 + } }, { - "Name": "Sort", - "Type": { - "Kind": "Enum", + "Name": "OptTol", + "Type": "Float", + "Desc": "Tolerance parameter for optimization convergence. Lower = slower, more accurate", + "Aliases": [ + "ot" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1E-07, + "SweepRange": { + "RangeType": "Discrete", "Values": [ - "Occurrence", - "Value" + 0.0001, + 1E-07 ] - }, - "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + } + }, + { + "Name": "MemorySize", + "Type": "Int", + "Desc": "Memory size for L-BFGS. Lower=faster, less accurate", + "Aliases": [ + "m" + ], "Required": false, - "SortOrder": 113.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": "Occurrence" + "Default": 20, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 5, + 20, + 50 + ] + } }, { - "Name": "TextKeyValues", + "Name": "EnforceNonNegativity", "Type": "Bool", - "Desc": "Whether key value metadata should be text, regardless of the actual input type", + "Desc": "Enforce non-negative weights", "Aliases": [ - "textkv" + "nn" ], "Required": false, - "SortOrder": 114.0, + "SortOrder": 90.0, "IsNullable": false, "Default": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.FeatureCombiner", - "Desc": "Combines all the features into one feature column.", - "FriendlyName": "Feature Combiner", - "ShortName": "fc", - "Inputs": [ - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false }, { - "Name": "Features", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Features", + "Name": "InitWtsDiameter", + "Type": "Float", + "Desc": "Init weights diameter", + "Aliases": [ + "initwts" + ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 140.0, "IsNullable": false, - "Default": null - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": 0.0, + "SweepRange": { + "RangeType": "Float", + "Min": 0.0, + "Max": 1.0, + "NumSteps": 5 + } }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.FeatureSelectorByCount", - "Desc": "Selects the slots for which the count of non-default values is greater than or equal to a threshold.", - "FriendlyName": "Count Feature Selection Transform", - "ShortName": null, - "Inputs": [ + "Name": "MaxIterations", + "Type": "Int", + "Desc": "Maximum iterations.", + "Aliases": [ + "maxiter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 2147483647, + "SweepRange": { + "RangeType": "Long", + "Min": 1, + "Max": 2147483647 + } + }, { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Columns to use for feature selection", + "Name": "SgdInitializationTolerance", + "Type": "Float", + "Desc": "Run SGD to initialize LR weights, converging to this tolerance", "Aliases": [ - "col" + "sgd" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0 }, { - "Name": "Count", - "Type": "Int", - "Desc": "If the count of non-default values for a slot is greater than or equal to this threshold, the slot is preserved", + "Name": "Quiet", + "Type": "Bool", + "Desc": "If set to true, produce no output during training.", "Aliases": [ - "c" + "q" ], - "Required": true, - "SortOrder": 1.0, + "Required": false, + "SortOrder": 150.0, "IsNullable": false, - "Default": 1 + "Default": false }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "UseThreads", + "Type": "Bool", + "Desc": "Whether or not to use threads. Default is true", + "Aliases": [ + "t" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "NumThreads", + "Type": "Int", + "Desc": "Number of threads", + "Aliases": [ + "nt" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "DenseOptimizer", + "Type": "Bool", + "Desc": "Force densification of the internal optimization vectors", + "Aliases": [ + "do" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" + "ITrainerInputWithWeight", + "ITrainerInputWithLabel", + "ITrainerInput" ], "OutputKind": [ - "ITransformOutput" + "IRegressionOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.FeatureSelectorByMutualInformation", - "Desc": "Selects the top k slots across all specified columns ordered by their mutual information with the label column.", - "FriendlyName": "Mutual Information Feature Selection Transform", - "ShortName": "MIFeatureSelection", + "Name": "Trainers.StochasticDualCoordinateAscentBinaryClassifier", + "Desc": "Train an SDCA binary model.", + "FriendlyName": "Fast Linear (SA-SDCA)", + "ShortName": "SDCA", "Inputs": [ { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Columns to use for feature selection", + "Name": "L2Const", + "Type": "Float", + "Desc": "L2 regularizer constant. By default the l2 constant is automatically inferred based on data set.", "Aliases": [ - "col" + "l2" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 1E-07, + 1E-06, + 1E-05, + 0.0001, + 0.001, + 0.01 + ] + } + }, + { + "Name": "TrainingData", + "Type": "DataView", + "Desc": "The data to be used for training", + "Aliases": [ + "data" ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "SlotsInOutput", - "Type": "Int", - "Desc": "The maximum number of slots to preserve in output", + "Name": "L1Threshold", + "Type": "Float", + "Desc": "L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set.", "Aliases": [ - "topk", - "numSlotsToKeep" + "l1" ], "Required": false, - "SortOrder": 1.0, - "IsNullable": false, - "Default": 1000 + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 0.0, + 0.25, + 0.5, + 0.75, + 1.0 + ] + } }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Features" }, { "Name": "LabelColumn", @@ -14222,841 +14601,1110 @@ "lab" ], "Required": false, - "SortOrder": 4.0, + "SortOrder": 3.0, "IsNullable": false, "Default": "Label" }, { - "Name": "NumBins", - "Type": "Int", - "Desc": "Max number of bins for R4/R8 columns, power of 2 recommended", + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", "Aliases": [ - "bins" + "norm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": 256 - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": "Auto" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.GlobalContrastNormalizer", - "Desc": "Performs a global contrast normalization on input values: Y = (s * X - M) / D, where s is a scale, M is mean and D is either L2 norm or standard deviation.", - "FriendlyName": "Global Contrast Normalization Transform", - "ShortName": "Gcn", - "Inputs": [ + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" + }, { - "Name": "Column", + "Name": "LossFunction", "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "UseStdDev", - "Type": "Bool", - "Desc": "Normalize by standard deviation rather than L2 norm", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Scale", - "Type": "Float", - "Desc": "Scale features by this value", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "SubMean", - "Type": "Bool", - "Desc": "Subtract mean from each value before normalizing", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "Kind": "Component", + "ComponentKind": "SDCAClassificationLossFunction" }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "Loss Function", "Aliases": [ - "col" + "loss" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 50.0, "IsNullable": false, + "Default": { + "Name": "LogLoss" + } + }, + { + "Name": "NumThreads", + "Type": "Int", + "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", + "Aliases": [ + "nt", + "t", + "threads" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": true, "Default": null }, { - "Name": "SubMean", - "Type": "Bool", - "Desc": "Subtract mean from each value before normalizing", + "Name": "PositiveInstanceWeight", + "Type": "Float", + "Desc": "Apply weight to the positive class, for imbalanced data", + "Aliases": [ + "piw" + ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": true + "Default": 1.0 }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "Calibrator", + "Type": { + "Kind": "Component", + "ComponentKind": "CalibratorTrainer" + }, + "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": { + "Name": "PlattCalibrator" + } }, { - "Name": "UseStdDev", + "Name": "MaxCalibrationExamples", + "Type": "Int", + "Desc": "The maximum number of examples to use when training the calibrator", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000 + }, + { + "Name": "ConvergenceTolerance", + "Type": "Float", + "Desc": "The tolerance for the ratio between duality gap and primal loss for convergence checking.", + "Aliases": [ + "tol" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.1, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.001, + 0.01, + 0.1, + 0.2 + ] + } + }, + { + "Name": "MaxIterations", + "Type": "Int", + "Desc": "Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic.", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 10, + 20, + 100 + ] + } + }, + { + "Name": "Shuffle", "Type": "Bool", - "Desc": "Normalize by standard deviation rather than L2 norm", + "Desc": "Shuffle data every epoch?", "Aliases": [ - "useStd" + "shuf" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": true, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } }, { - "Name": "Scale", + "Name": "CheckFrequency", + "Type": "Int", + "Desc": "Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations.", + "Aliases": [ + "checkFreq" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "BiasLearningRate", "Type": "Float", - "Desc": "Scale features by this value", + "Desc": "The learning rate for adjusting bias from being regularized.", + "Aliases": [ + "blr" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1.0 + "Default": 0.0, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.01, + 0.1, + 1.0 + ] + } } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" - ], + "ITrainerInputWithLabel", + "ITrainerInput" + ], "OutputKind": [ - "ITransformOutput" + "IBinaryClassificationOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.HashConverter", - "Desc": "Converts column values into hashes. This transform accepts both numeric and text inputs, both single and vector-valued columns. This is a part of the Dracula transform.", - "FriendlyName": "Hash Join Transform", - "ShortName": "HashJoin", + "Name": "Trainers.StochasticDualCoordinateAscentClassifier", + "Desc": "The SDCA linear multi-class classification trainer.", + "FriendlyName": "Fast Linear Multi-class Classification (SA-SDCA)", + "ShortName": "sasdcamc", "Inputs": [ { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Join", - "Type": "Bool", - "Desc": "Whether the values need to be combined for a single hash", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "CustomSlotMap", - "Type": "String", - "Desc": "Which slots should be combined together. Example: 0,3,5;0,1;3;2,1,0. Overrides 'join'.", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "HashBits", - "Type": "Int", - "Desc": "Number of bits to hash into. Must be between 1 and 31, inclusive.", - "Aliases": [ - "bits" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Seed", - "Type": "UInt", - "Desc": "Hashing seed", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Ordered", - "Type": "Bool", - "Desc": "Whether the position of each term should be included in the hash", - "Aliases": [ - "ord" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:src)", + "Name": "L2Const", + "Type": "Float", + "Desc": "L2 regularizer constant. By default the l2 constant is automatically inferred based on data set.", "Aliases": [ - "col" + "l2" ], - "Required": true, + "Required": false, "SortOrder": 1.0, - "IsNullable": false + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 1E-07, + 1E-06, + 1E-05, + 0.0001, + 0.001, + 0.01 + ] + } }, { - "Name": "Data", + "Name": "TrainingData", "Type": "DataView", - "Desc": "Input dataset", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "HashBits", - "Type": "Int", - "Desc": "Number of bits to hash into. Must be between 1 and 31, inclusive.", + "Name": "L1Threshold", + "Type": "Float", + "Desc": "L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set.", "Aliases": [ - "bits" + "l1" ], "Required": false, "SortOrder": 2.0, - "IsNullable": false, - "Default": 31 + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 0.0, + 0.25, + 0.5, + 0.75, + 1.0 + ] + } }, { - "Name": "Join", - "Type": "Bool", - "Desc": "Whether the values need to be combined for a single hash", + "Name": "FeatureColumn", + "Type": "String", + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": true + "Default": "Features" }, { - "Name": "Seed", - "Type": "UInt", - "Desc": "Hashing seed", + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", + "Aliases": [ + "lab" + ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": 314489979 + "Default": "Label" }, { - "Name": "Ordered", - "Type": "Bool", - "Desc": "Whether the position of each term should be included in the hash", + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", "Aliases": [ - "ord" + "norm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": true - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": "Auto" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.KeyToTextConverter", - "Desc": "KeyToValueTransform utilizes KeyValues metadata to map key indices to the corresponding values in the KeyValues metadata.", - "FriendlyName": "Key To Value Transform", - "ShortName": null, - "Inputs": [ + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] + }, + "Desc": "Whether learner should cache input training data", + "Aliases": [ + "cache" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" + }, { - "Name": "Column", + "Name": "LossFunction", "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "Kind": "Component", + "ComponentKind": "SDCAClassificationLossFunction" }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "Loss Function", "Aliases": [ - "col" + "loss" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": { + "Name": "LogLoss" + } }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "NumThreads", + "Type": "Int", + "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", + "Aliases": [ + "nt", + "t", + "threads" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "ConvergenceTolerance", + "Type": "Float", + "Desc": "The tolerance for the ratio between duality gap and primal loss for convergence checking.", + "Aliases": [ + "tol" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.1, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.001, + 0.01, + 0.1, + 0.2 + ] + } + }, + { + "Name": "MaxIterations", + "Type": "Int", + "Desc": "Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic.", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 10, + 20, + 100 + ] + } + }, + { + "Name": "Shuffle", + "Type": "Bool", + "Desc": "Shuffle data every epoch?", + "Aliases": [ + "shuf" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } + }, + { + "Name": "CheckFrequency", + "Type": "Int", + "Desc": "Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations.", + "Aliases": [ + "checkFreq" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "BiasLearningRate", + "Type": "Float", + "Desc": "The learning rate for adjusting bias from being regularized.", + "Aliases": [ + "blr" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.01, + 0.1, + 1.0 + ] + } } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" + "ITrainerInputWithLabel", + "ITrainerInput" ], "OutputKind": [ - "ITransformOutput" + "IMulticlassClassificationOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.LabelColumnKeyBooleanConverter", - "Desc": "Transforms the label to either key or bool (if needed) to make it suitable for classification.", - "FriendlyName": "Prepare Classification Label", - "ShortName": null, + "Name": "Trainers.StochasticDualCoordinateAscentRegressor", + "Desc": "The SDCA linear regression trainer.", + "FriendlyName": "Fast Linear Regression (SA-SDCA)", + "ShortName": "sasdcar", "Inputs": [ { - "Name": "Data", + "Name": "L2Const", + "Type": "Float", + "Desc": "L2 regularizer constant. By default the l2 constant is automatically inferred based on data set.", + "Aliases": [ + "l2" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 1E-07, + 1E-06, + 1E-05, + 0.0001, + 0.001, + 0.01 + ] + } + }, + { + "Name": "TrainingData", "Type": "DataView", - "Desc": "Input dataset", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "LabelColumn", + "Name": "L1Threshold", + "Type": "Float", + "Desc": "L1 soft threshold (L1/L2). Note that it is easier to control and sweep using the threshold parameter than the raw L1-regularizer constant. By default the l1 threshold is automatically inferred based on data set.", + "Aliases": [ + "l1" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 0.0, + 0.25, + 0.5, + 0.75, + 1.0 + ] + } + }, + { + "Name": "FeatureColumn", "Type": "String", - "Desc": "The label column", - "Required": true, + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, "SortOrder": 2.0, - "IsNullable": false + "IsNullable": false, + "Default": "Features" }, { - "Name": "TextKeyValues", - "Type": "Bool", - "Desc": "Convert the key values to text", + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", + "Aliases": [ + "lab" + ], "Required": false, "SortOrder": 3.0, "IsNullable": false, - "Default": true - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": "Label" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.LabelIndicator", - "Desc": "Label remapper used by OVA", - "FriendlyName": "LabelIndicator", - "ShortName": "LabelIndictator", - "Inputs": [ + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", + "Aliases": [ + "norm" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "Auto" + }, { - "Name": "Column", + "Name": "Caching", "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "ClassIndex", - "Type": "Int", - "Desc": "The positive example class for binary classification.", - "Aliases": [ - "index" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "Whether learner should cache input training data", "Aliases": [ - "col" + "cache" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" + }, + { + "Name": "LossFunction", + "Type": { + "Kind": "Component", + "ComponentKind": "SDCARegressionLossFunction" + }, + "Desc": "Loss Function", + "Aliases": [ + "loss" + ], + "Required": false, + "SortOrder": 50.0, "IsNullable": false, + "Default": { + "Name": "SquaredLoss" + } + }, + { + "Name": "NumThreads", + "Type": "Int", + "Desc": "Degree of lock-free parallelism. Defaults to automatic. Determinism not guaranteed.", + "Aliases": [ + "nt", + "t", + "threads" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": true, "Default": null }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Name": "ConvergenceTolerance", + "Type": "Float", + "Desc": "The tolerance for the ratio between duality gap and primal loss for convergence checking.", + "Aliases": [ + "tol" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.001, + 0.01, + 0.1, + 0.2 + ] + } }, { - "Name": "ClassIndex", + "Name": "MaxIterations", "Type": "Int", - "Desc": "Label of the positive class.", + "Desc": "Maximum number of iterations; set to 1 to simulate online learning. Defaults to automatic.", "Aliases": [ - "index" + "iter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + "", + 10, + 20, + 100 + ] + } + }, + { + "Name": "Shuffle", + "Type": "Bool", + "Desc": "Shuffle data every epoch?", + "Aliases": [ + "shuf" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 0 + "Default": true, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } + }, + { + "Name": "CheckFrequency", + "Type": "Int", + "Desc": "Convergence check frequency (in terms of number of iterations). Set as negative or zero for not checking at all. If left blank, it defaults to check after every 'numThreads' iterations.", + "Aliases": [ + "checkFreq" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "BiasLearningRate", + "Type": "Float", + "Desc": "The learning rate for adjusting bias from being regularized.", + "Aliases": [ + "blr" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.01, + 0.1, + 1.0 + ] + } } ], "Outputs": [ { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" } ], "InputKind": [ - "ITransformInput" + "ITrainerInputWithLabel", + "ITrainerInput" ], "OutputKind": [ - "ITransformOutput" + "IRegressionOutput", + "ITrainerOutput" ] }, { - "Name": "Transforms.LabelToFloatConverter", - "Desc": "Transforms the label to float to make it suitable for regression.", - "FriendlyName": "Prepare Regression Label", - "ShortName": null, + "Name": "Trainers.StochasticGradientDescentBinaryClassifier", + "Desc": "Train an Hogwild SGD binary model.", + "FriendlyName": "Hogwild SGD (binary)", + "ShortName": "HogwildSGD", "Inputs": [ { - "Name": "Data", + "Name": "TrainingData", "Type": "DataView", - "Desc": "Input dataset", + "Desc": "The data to be used for training", + "Aliases": [ + "data" + ], "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "LabelColumn", + "Name": "FeatureColumn", "Type": "String", - "Desc": "The label column", - "Required": true, + "Desc": "Column to use for features", + "Aliases": [ + "feat" + ], + "Required": false, "SortOrder": 2.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "IsNullable": false, + "Default": "Features" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.LogMeanVarianceNormalizer", - "Desc": "Normalizes the data based on the computed mean and variance of the logarithm of the data.", - "FriendlyName": "LogMeanVar Normalizer", - "ShortName": "LogMeanVar", - "Inputs": [ - { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "MaxTrainingExamples", - "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", - "Aliases": [ - "maxtrain" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:src)", + "Name": "LabelColumn", + "Type": "String", + "Desc": "Column to use for labels", "Aliases": [ - "col" + "lab" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": null - }, - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Default": "Label" }, { - "Name": "UseCdf", - "Type": "Bool", - "Desc": "Whether to use CDF as the output", + "Name": "WeightColumn", + "Type": "String", + "Desc": "Column to use for example weight", "Aliases": [ - "cdf" + "weight" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 4.0, "IsNullable": false, - "Default": true + "Default": "Weight" }, { - "Name": "MaxTrainingExamples", - "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", + "Name": "NormalizeFeatures", + "Type": { + "Kind": "Enum", + "Values": [ + "No", + "Warn", + "Auto", + "Yes" + ] + }, + "Desc": "Normalize option for the feature column", "Aliases": [ - "maxtrain" + "norm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": 1000000000 - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": "Auto" }, { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.LpNormalizer", - "Desc": "Normalize vectors (rows) individually by rescaling them to unit norm (L2, L1 or LInf). Performs the following operation on a vector X: Y = (X - M) / D, where M is mean and D is either L2 norm, L1 norm or LInf norm.", - "FriendlyName": "Lp-Norm Normalizer", - "ShortName": "lpnorm", - "Inputs": [ - { - "Name": "Column", + "Name": "Caching", "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "NormKind", - "Type": { - "Kind": "Enum", - "Values": [ - "L2Norm", - "StdDev", - "L1Norm", - "LInf" - ] - }, - "Desc": "The norm to use to normalize each sample", - "Aliases": [ - "norm" - ], - "Required": false, - "SortOrder": 1.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "SubMean", - "Type": "Bool", - "Desc": "Subtract mean from each value before normalizing", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "Kind": "Enum", + "Values": [ + "Auto", + "Memory", + "Disk", + "None" + ] }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "Whether learner should cache input training data", "Aliases": [ - "col" + "cache" ], - "Required": true, - "SortOrder": 1.0, - "IsNullable": false + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": "Auto" }, { - "Name": "NormKind", + "Name": "LossFunction", "Type": { - "Kind": "Enum", - "Values": [ - "L2Norm", - "StdDev", - "L1Norm", - "LInf" - ] + "Kind": "Component", + "ComponentKind": "ClassificationLossFunction" }, - "Desc": "The norm to use to normalize each sample", + "Desc": "Loss Function", "Aliases": [ - "norm" + "loss" ], "Required": false, - "SortOrder": 1.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": "L2Norm" + "Default": { + "Name": "LogLoss" + } }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, + "Name": "L2Const", + "Type": "Float", + "Desc": "L2 regularizer constant", + "Aliases": [ + "l2" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 1E-06, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1E-07, + 5E-07, + 1E-06, + 5E-06, + 1E-05 + ] + } + }, { - "Name": "SubMean", + "Name": "NumThreads", + "Type": "Int", + "Desc": "Degree of lock-free parallelism. Defaults to automatic depending on data sparseness. Determinism not guaranteed.", + "Aliases": [ + "nt", + "t", + "threads" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "ConvergenceTolerance", + "Type": "Float", + "Desc": "Exponential moving averaged improvement tolerance for convergence", + "Aliases": [ + "tol" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0001, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.01, + 0.001, + 0.0001, + 1E-05 + ] + } + }, + { + "Name": "MaxIterations", + "Type": "Int", + "Desc": "Maximum number of iterations; set to 1 to simulate online learning.", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 20, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 5, + 10, + 20 + ] + } + }, + { + "Name": "InitLearningRate", + "Type": "Float", + "Desc": "Initial learning rate (only used by SGD)", + "Aliases": [ + "ilr", + "lr" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01 + }, + { + "Name": "Shuffle", "Type": "Bool", - "Desc": "Subtract mean from each value before normalizing", + "Desc": "Shuffle data every epoch?", + "Aliases": [ + "shuf" + ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + false, + true + ] + } + }, + { + "Name": "PositiveInstanceWeight", + "Type": "Float", + "Desc": "Apply weight to the positive class, for imbalanced data", + "Aliases": [ + "piw" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + }, + { + "Name": "CheckFrequency", + "Type": "Int", + "Desc": "Convergence check frequency (in terms of number of iterations). Default equals number of threads", + "Aliases": [ + "checkFreq" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Calibrator", + "Type": { + "Kind": "Component", + "ComponentKind": "CalibratorTrainer" + }, + "Desc": "The calibrator kind to apply to the predictor. Specify null for no calibration", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": { + "Name": "PlattCalibrator" + } + }, + { + "Name": "MaxCalibrationExamples", + "Type": "Int", + "Desc": "The maximum number of examples to use when training the calibrator", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000 + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The trained model" + } + ], + "InputKind": [ + "ITrainerInputWithWeight", + "ITrainerInputWithLabel", + "ITrainerInput" + ], + "OutputKind": [ + "IBinaryClassificationOutput", + "ITrainerOutput" + ] + }, + { + "Name": "Transforms.ApproximateBootstrapSampler", + "Desc": "Approximate bootstrap sampling.", + "FriendlyName": "Bootstrap Sample Transform", + "ShortName": "BootstrapSample", + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Complement", + "Type": "Bool", + "Desc": "Whether this is the out-of-bag sample, that is, all those rows that are not selected by the transform.", + "Aliases": [ + "comp" + ], + "Required": false, + "SortOrder": 150.0, "IsNullable": false, "Default": false + }, + { + "Name": "Seed", + "Type": "UInt", + "Desc": "The random seed. If unspecified random state will be instead derived from the environment.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "ShuffleInput", + "Type": "Bool", + "Desc": "Whether we should attempt to shuffle the source data. By default on, but can be turned off for efficiency.", + "Aliases": [ + "si" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "PoolSize", + "Type": "Int", + "Desc": "When shuffling the output, the number of output rows to keep in that pool. Note that shuffling of output is completely distinct from shuffling of input.", + "Aliases": [ + "pool" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000 } ], "Outputs": [ @@ -15079,18 +15727,15 @@ ] }, { - "Name": "Transforms.ManyHeterogeneousModelCombiner", - "Desc": "Combines a sequence of TransformModels and a PredictorModel into a single PredictorModel.", - "FriendlyName": null, + "Name": "Transforms.BinaryPredictionScoreColumnsRenamer", + "Desc": "For binary prediction, it renames the PredictedLabel and Score columns to include the name of the positive class.", + "FriendlyName": "Rename Binary Prediction Score Columns", "ShortName": null, "Inputs": [ { - "Name": "TransformModels", - "Type": { - "Kind": "Array", - "ItemType": "TransformModel" - }, - "Desc": "Transform model", + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", "Required": true, "SortOrder": 1.0, "IsNullable": false @@ -15098,7 +15743,7 @@ { "Name": "PredictorModel", "Type": "PredictorModel", - "Desc": "Predictor model", + "Desc": "The predictor model used in scoring", "Required": true, "SortOrder": 2.0, "IsNullable": false @@ -15106,17 +15751,28 @@ ], "Outputs": [ { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "Predictor model" - } - ] - }, - { - "Name": "Transforms.MeanVarianceNormalizer", - "Desc": "Normalizes the data based on the computed mean and variance of the data.", - "FriendlyName": "MeanVar Normalizer", - "ShortName": "MeanVar", + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.BinNormalizer", + "Desc": "The values are assigned into equidensity bins and a value is mapped to its bin_number/number_of_bins.", + "FriendlyName": "Binning Normalizer", + "ShortName": "Bin", "Inputs": [ { "Name": "Column", @@ -15125,6 +15781,18 @@ "ItemType": { "Kind": "Struct", "Fields": [ + { + "Name": "NumBins", + "Type": "Int", + "Desc": "Max number of bins, power of 2 recommended", + "Aliases": [ + "bins" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, { "Name": "FixZero", "Type": "Bool", @@ -15180,9 +15848,10 @@ "Aliases": [ "col" ], - "Required": true, + "Required": false, "SortOrder": 1.0, - "IsNullable": false + "IsNullable": false, + "Default": null }, { "Name": "Data", @@ -15193,16 +15862,16 @@ "IsNullable": false }, { - "Name": "UseCdf", - "Type": "Bool", - "Desc": "Whether to use CDF as the output", + "Name": "NumBins", + "Type": "Int", + "Desc": "Max number of bins, power of 2 recommended", "Aliases": [ - "cdf" + "bins" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": false + "Default": 1024 }, { "Name": "FixZero", @@ -15249,10 +15918,10 @@ ] }, { - "Name": "Transforms.MinMaxNormalizer", - "Desc": "Normalizes the data based on the observed minimum and maximum values of the data.", - "FriendlyName": "Min-Max Normalizer", - "ShortName": "MinMax", + "Name": "Transforms.CategoricalHashOneHotVectorizer", + "Desc": "Converts the categorical value into an indicator array by hashing the value and using the hash as an index in the bag. If the input column is a vector, a single indicator bag is returned for it.", + "FriendlyName": "Categorical Hash Transform", + "ShortName": null, "Inputs": [ { "Name": "Column", @@ -15262,11 +15931,52 @@ "Kind": "Struct", "Fields": [ { - "Name": "FixZero", + "Name": "OutputKind", + "Type": { + "Kind": "Enum", + "Values": [ + "Bag", + "Ind", + "Key", + "Bin" + ] + }, + "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", + "Aliases": [ + "kind" + ], + "Required": false, + "SortOrder": 102.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "HashBits", + "Type": "Int", + "Desc": "The number of bits to hash into. Must be between 1 and 30, inclusive.", + "Aliases": [ + "bits" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Seed", + "Type": "UInt", + "Desc": "Hashing seed", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Ordered", "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", + "Desc": "Whether the position of each term should be included in the hash", "Aliases": [ - "zero" + "ord" ], "Required": false, "SortOrder": 150.0, @@ -15274,11 +15984,11 @@ "Default": null }, { - "Name": "MaxTrainingExamples", + "Name": "InvertHash", "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", + "Desc": "Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit.", "Aliases": [ - "maxtrain" + "ih" ], "Required": false, "SortOrder": 150.0, @@ -15312,7 +16022,7 @@ ] } }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "New column definition(s) (optional form: name:hashBits:src)", "Aliases": [ "col" ], @@ -15329,11 +16039,52 @@ "IsNullable": false }, { - "Name": "FixZero", + "Name": "HashBits", + "Type": "Int", + "Desc": "Number of bits to hash into. Must be between 1 and 30, inclusive.", + "Aliases": [ + "bits" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": 16 + }, + { + "Name": "OutputKind", + "Type": { + "Kind": "Enum", + "Values": [ + "Bag", + "Ind", + "Key", + "Bin" + ] + }, + "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", + "Aliases": [ + "kind" + ], + "Required": false, + "SortOrder": 102.0, + "IsNullable": false, + "Default": "Bag" + }, + { + "Name": "Seed", + "Type": "UInt", + "Desc": "Hashing seed", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 314489979 + }, + { + "Name": "Ordered", "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", + "Desc": "Whether the position of each term should be included in the hash", "Aliases": [ - "zero" + "ord" ], "Required": false, "SortOrder": 150.0, @@ -15341,16 +16092,16 @@ "Default": true }, { - "Name": "MaxTrainingExamples", + "Name": "InvertHash", "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", + "Desc": "Limit the number of keys used to generate the slot name to this many. 0 means no invert hashing, -1 means no limit.", "Aliases": [ - "maxtrain" + "ih" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000000000 + "Default": 0 } ], "Outputs": [ @@ -15373,10 +16124,10 @@ ] }, { - "Name": "Transforms.MissingValueHandler", - "Desc": "Handle missing values by replacing them with either the default value or the mean/min/max value (for non-text columns only). An indicator column can optionally be concatenated, if theinput column type is numeric.", - "FriendlyName": "NA Handle Transform", - "ShortName": "NAHandle", + "Name": "Transforms.CategoricalOneHotVectorizer", + "Desc": "Converts the categorical value into an indicator array by building a dictionary of categories based on the data and using the id in the dictionary as the index in the array.", + "FriendlyName": "Categorical Transform", + "ShortName": null, "Inputs": [ { "Name": "Column", @@ -15386,32 +16137,31 @@ "Kind": "Struct", "Fields": [ { - "Name": "Kind", + "Name": "OutputKind", "Type": { "Kind": "Enum", "Values": [ - "Default", - "Def", - "DefaultValue", - "Mean", - "Minimum", - "Min", - "Maximum", - "Max" + "Bag", + "Ind", + "Key", + "Bin" ] }, - "Desc": "The replacement method to utilize", + "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), Key (index), or Binary encoded indicator vector", + "Aliases": [ + "kind" + ], "Required": false, "SortOrder": 150.0, "IsNullable": true, "Default": null }, { - "Name": "ImputeBySlot", - "Type": "Bool", - "Desc": "Whether to impute values by slot", + "Name": "MaxNumTerms", + "Type": "Int", + "Desc": "Maximum number of terms to keep when auto-training", "Aliases": [ - "slot" + "max" ], "Required": false, "SortOrder": 150.0, @@ -15419,11 +16169,38 @@ "Default": null }, { - "Name": "ConcatIndicator", + "Name": "Term", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "List of terms", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Sort", + "Type": { + "Kind": "Enum", + "Values": [ + "Occurrence", + "Value" + ] + }, + "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "TextKeyValues", "Type": "Bool", - "Desc": "Whether or not to concatenate an indicator vector column to the value column", + "Desc": "Whether key value metadata should be text, regardless of the actual input type", "Aliases": [ - "ind" + "textkv" ], "Required": false, "SortOrder": 150.0, @@ -15457,7 +16234,7 @@ ] } }, - "Desc": "New column definition(s) (optional form: name:rep:src)", + "Desc": "New column definition(s) (optional form: name:src)", "Aliases": [ "col" ], @@ -15474,50 +16251,73 @@ "IsNullable": false }, { - "Name": "ReplaceWith", - "Type": { - "Kind": "Enum", - "Values": [ - "Default", - "Def", - "DefaultValue", - "Mean", - "Minimum", - "Min", - "Maximum", - "Max" - ] - }, - "Desc": "The replacement method to utilize", + "Name": "MaxNumTerms", + "Type": "Int", + "Desc": "Maximum number of terms to keep per column when auto-training", "Aliases": [ - "kind" + "max" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 5.0, "IsNullable": false, - "Default": "Def" + "Default": 1000000 }, { - "Name": "ImputeBySlot", - "Type": "Bool", - "Desc": "Whether to impute values by slot", + "Name": "OutputKind", + "Type": { + "Kind": "Enum", + "Values": [ + "Bag", + "Ind", + "Key", + "Bin" + ] + }, + "Desc": "Output kind: Bag (multi-set vector), Ind (indicator vector), or Key (index)", "Aliases": [ - "slot" + "kind" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 102.0, "IsNullable": false, - "Default": true + "Default": "Ind" }, { - "Name": "Concat", + "Name": "Term", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "List of terms", + "Required": false, + "SortOrder": 106.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Sort", + "Type": { + "Kind": "Enum", + "Values": [ + "Occurrence", + "Value" + ] + }, + "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + "Required": false, + "SortOrder": 113.0, + "IsNullable": false, + "Default": "Occurrence" + }, + { + "Name": "TextKeyValues", "Type": "Bool", - "Desc": "Whether or not to concatenate an indicator vector column to the value column", + "Desc": "Whether key value metadata should be text, regardless of the actual input type", "Aliases": [ - "ind" + "textkv" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 114.0, "IsNullable": false, "Default": true } @@ -15542,10 +16342,10 @@ ] }, { - "Name": "Transforms.MissingValueIndicator", - "Desc": "Create a boolean output column with the same number of slots as the input column, where the output value is true if the value in the input column is missing.", - "FriendlyName": "NA Indicator Transform", - "ShortName": "NAInd", + "Name": "Transforms.CharacterTokenizer", + "Desc": "Character-oriented tokenizer where text is considered a sequence of characters.", + "FriendlyName": "Character Tokenizer Transform", + "ShortName": "CharToken", "Inputs": [ { "Name": "Column", @@ -15596,6 +16396,18 @@ "Required": true, "SortOrder": 1.0, "IsNullable": false + }, + { + "Name": "UseMarkerChars", + "Type": "Bool", + "Desc": "Whether to mark the beginning/end of each row/slot with start of text character (0x02)/end of text character (0x03)", + "Aliases": [ + "mark" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": true } ], "Outputs": [ @@ -15618,10 +16430,10 @@ ] }, { - "Name": "Transforms.MissingValuesDropper", - "Desc": "Removes NAs from vector columns.", - "FriendlyName": "NA Drop Transform", - "ShortName": "NADrop", + "Name": "Transforms.ColumnConcatenator", + "Desc": "Concatenates one or more columns of the same item type.", + "FriendlyName": "Concat Transform", + "ShortName": "Concat", "Inputs": [ { "Name": "Column", @@ -15644,7 +16456,10 @@ }, { "Name": "Source", - "Type": "String", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, "Desc": "Name of the source column", "Aliases": [ "src" @@ -15657,7 +16472,7 @@ ] } }, - "Desc": "Columns to drop the NAs for", + "Desc": "New column definition(s) (optional form: name:srcs)", "Aliases": [ "col" ], @@ -15694,18 +16509,46 @@ ] }, { - "Name": "Transforms.MissingValuesRowDropper", - "Desc": "Filters out rows that contain missing values.", - "FriendlyName": "NA Filter", - "ShortName": "NAFilter", + "Name": "Transforms.ColumnCopier", + "Desc": "Duplicates columns from the dataset", + "FriendlyName": "Copy Columns Transform", + "ShortName": "Copy", "Inputs": [ { "Name": "Column", "Type": { "Kind": "Array", - "ItemType": "String" + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } }, - "Desc": "Column", + "Desc": "New column definition(s) (optional form: name:src)", "Aliases": [ "col" ], @@ -15720,15 +16563,6 @@ "Required": true, "SortOrder": 1.0, "IsNullable": false - }, - { - "Name": "Complement", - "Type": "Bool", - "Desc": "If true, keep only rows that contain NA values, and filter the rest.", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": false } ], "Outputs": [ @@ -15751,91 +16585,18 @@ ] }, { - "Name": "Transforms.MissingValueSubstitutor", - "Desc": "Create an output column of the same type and size of the input column, where missing values are replaced with either the default value or the mean/min/max value (for non-text columns only).", - "FriendlyName": "NA Replace Transform", - "ShortName": "NARep", + "Name": "Transforms.ColumnDropper", + "Desc": "Drops columns from the dataset", + "FriendlyName": "Drop Columns Transform", + "ShortName": "Drop", "Inputs": [ { "Name": "Column", "Type": { "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "ReplacementString", - "Type": "String", - "Desc": "Replacement value for NAs (uses default value if not given)", - "Aliases": [ - "rep" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Kind", - "Type": { - "Kind": "Enum", - "Values": [ - "Default", - "DefaultValue", - "Def", - "Mean", - "Min", - "Minimum", - "Max", - "Maximum", - "SpecifiedValue", - "Val", - "Value" - ] - }, - "Desc": "The replacement method to utilize", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Slot", - "Type": "Bool", - "Desc": "Whether to impute values by slot", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] - } + "ItemType": "String" }, - "Desc": "New column definition(s) (optional form: name:rep:src)", + "Desc": "Column name to drop", "Aliases": [ "col" ], @@ -15850,45 +16611,6 @@ "Required": true, "SortOrder": 1.0, "IsNullable": false - }, - { - "Name": "ReplacementKind", - "Type": { - "Kind": "Enum", - "Values": [ - "Default", - "DefaultValue", - "Def", - "Mean", - "Min", - "Minimum", - "Max", - "Maximum", - "SpecifiedValue", - "Val", - "Value" - ] - }, - "Desc": "The replacement method to utilize", - "Aliases": [ - "kind" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": "Def" - }, - { - "Name": "ImputeBySlot", - "Type": "Bool", - "Desc": "Whether to impute values by slot", - "Aliases": [ - "slot" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true } ], "Outputs": [ @@ -15911,37 +16633,59 @@ ] }, { - "Name": "Transforms.ModelCombiner", - "Desc": "Combines a sequence of TransformModels into a single model", - "FriendlyName": null, + "Name": "Transforms.ColumnSelector", + "Desc": "Selects a set of columns, dropping all others", + "FriendlyName": "Select Columns", "ShortName": null, "Inputs": [ { - "Name": "Models", + "Name": "Column", "Type": { "Kind": "Array", - "ItemType": "TransformModel" + "ItemType": "String" }, - "Desc": "Input models", + "Desc": "Column name to keep", + "Aliases": [ + "col" + ], "Required": false, "SortOrder": 1.0, "IsNullable": false, "Default": null + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false } ], "Outputs": [ { - "Name": "OutputModel", + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", "Type": "TransformModel", - "Desc": "Combined model" + "Desc": "Transform model" } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" ] }, { - "Name": "Transforms.NGramTranslator", - "Desc": "Produces a bag of counts of ngrams (sequences of consecutive values of length 1-n) in a given vector of keys. It does so by building a dictionary of ngrams and using the id in the dictionary as the index in the bag.", - "FriendlyName": "NGram Transform", - "ShortName": "NgramTransform", + "Name": "Transforms.ColumnTypeConverter", + "Desc": "Converts a column to a different type, using standard conversions.", + "FriendlyName": "Convert Transform", + "ShortName": "Convert", "Inputs": [ { "Name": "Column", @@ -15951,35 +16695,39 @@ "Kind": "Struct", "Fields": [ { - "Name": "NgramLength", - "Type": "Int", - "Desc": "Maximum ngram length", - "Aliases": [ - "ngram" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "AllLengths", - "Type": "Bool", - "Desc": "Whether to include all ngram lengths up to NgramLength or only NgramLength", - "Aliases": [ - "all" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "SkipLength", - "Type": "Int", - "Desc": "Maximum number of tokens to skip when constructing an ngram", + "Name": "ResultType", + "Type": { + "Kind": "Enum", + "Values": [ + "I1", + "U1", + "I2", + "U2", + "I4", + "U4", + "I8", + "U8", + "R4", + "Num", + "R8", + "TX", + "Text", + "TXT", + "BL", + "Bool", + "TimeSpan", + "TS", + "DT", + "DateTime", + "DZ", + "DateTimeZone", + "UG", + "U16" + ] + }, + "Desc": "The result type", "Aliases": [ - "skips" + "type" ], "Required": false, "SortOrder": 150.0, @@ -15987,36 +16735,17 @@ "Default": null }, { - "Name": "MaxNumTerms", - "Type": { - "Kind": "Array", - "ItemType": "Int" - }, - "Desc": "Maximum number of ngrams to store in the dictionary", + "Name": "Range", + "Type": "String", + "Desc": "For a key column, this defines the range of values", "Aliases": [ - "max" + "key" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, "Default": null }, - { - "Name": "Weighting", - "Type": { - "Kind": "Enum", - "Values": [ - "Tf", - "Idf", - "TfIdf" - ] - }, - "Desc": "Statistical measure used to evaluate how important a word is to a document in a corpus", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, { "Name": "Name", "Type": "String", @@ -16044,14 +16773,13 @@ ] } }, - "Desc": "New column definition(s) (optional form: name:src)", + "Desc": "New column definition(s) (optional form: name:type:src)", "Aliases": [ "col" ], - "Required": false, + "Required": true, "SortOrder": 1.0, - "IsNullable": false, - "Default": null + "IsNullable": false }, { "Name": "Data", @@ -16062,73 +16790,56 @@ "IsNullable": false }, { - "Name": "NgramLength", - "Type": "Int", - "Desc": "Maximum ngram length", - "Aliases": [ - "ngram" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 2 - }, - { - "Name": "AllLengths", - "Type": "Bool", - "Desc": "Whether to store all ngram lengths up to ngramLength, or only ngramLength", - "Aliases": [ - "all" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true - }, - { - "Name": "SkipLength", - "Type": "Int", - "Desc": "Maximum number of tokens to skip when constructing an ngram", - "Aliases": [ - "skips" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0 - }, - { - "Name": "MaxNumTerms", + "Name": "ResultType", "Type": { - "Kind": "Array", - "ItemType": "Int" + "Kind": "Enum", + "Values": [ + "I1", + "U1", + "I2", + "U2", + "I4", + "U4", + "I8", + "U8", + "R4", + "Num", + "R8", + "TX", + "Text", + "TXT", + "BL", + "Bool", + "TimeSpan", + "TS", + "DT", + "DateTime", + "DZ", + "DateTimeZone", + "UG", + "U16" + ] }, - "Desc": "Maximum number of ngrams to store in the dictionary", + "Desc": "The result type", "Aliases": [ - "max" + "type" ], "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": [ - 10000000 - ] + "SortOrder": 2.0, + "IsNullable": true, + "Default": null }, { - "Name": "Weighting", - "Type": { - "Kind": "Enum", - "Values": [ - "Tf", - "Idf", - "TfIdf" - ] - }, - "Desc": "The weighting criteria", + "Name": "Range", + "Type": "String", + "Desc": "For a key column, this defines the range of values", + "Aliases": [ + "key" + ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": "Tf" + "Default": null } ], "Outputs": [ @@ -16151,11 +16862,26 @@ ] }, { - "Name": "Transforms.NoOperation", - "Desc": "Does nothing.", - "FriendlyName": "No Op", - "ShortName": "Nop", + "Name": "Transforms.CombinerByContiguousGroupId", + "Desc": "Groups values of a scalar column into a vector, by a contiguous group ID", + "FriendlyName": "Group Transform", + "ShortName": "Group", "Inputs": [ + { + "Name": "GroupKey", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Columns to group by", + "Aliases": [ + "g" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + }, { "Name": "Data", "Type": "DataView", @@ -16163,53 +16889,19 @@ "Required": true, "SortOrder": 1.0, "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.OptionalColumnCreator", - "Desc": "If the source column does not exist after deserialization, create a column with the right type and default values.", - "FriendlyName": "Optional Column Transform", - "ShortName": "optional", - "Inputs": [ + }, { "Name": "Column", "Type": { "Kind": "Array", "ItemType": "String" }, - "Desc": "New column definition(s)", + "Desc": "Columns to group together", "Aliases": [ "col" ], "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, + "SortOrder": 2.0, "IsNullable": false } ], @@ -16233,10 +16925,10 @@ ] }, { - "Name": "Transforms.PcaCalculator", - "Desc": "Train an PCA Anomaly model.", - "FriendlyName": "Principal Component Analysis Transform", - "ShortName": "Pca", + "Name": "Transforms.ConditionalNormalizer", + "Desc": "Normalize the columns only if needed", + "FriendlyName": "Normalize If Needed", + "ShortName": null, "Inputs": [ { "Name": "Column", @@ -16246,47 +16938,11 @@ "Kind": "Struct", "Fields": [ { - "Name": "WeightColumn", - "Type": "String", - "Desc": "The name of the weight column", - "Aliases": [ - "weight" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Rank", - "Type": "Int", - "Desc": "The number of components in the PCA", - "Aliases": [ - "k" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Oversampling", - "Type": "Int", - "Desc": "Oversampling parameter for randomized PCA training", - "Aliases": [ - "over" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Center", + "Name": "FixZero", "Type": "Bool", - "Desc": "If enabled, data is centered to be zero mean", + "Desc": "Whether to map zero to zero, preserving sparsity", "Aliases": [ - "center" + "zero" ], "Required": false, "SortOrder": 150.0, @@ -16294,11 +16950,11 @@ "Default": null }, { - "Name": "Seed", + "Name": "MaxTrainingExamples", "Type": "Int", - "Desc": "The seed for random number generation", + "Desc": "Max number of examples used to train the normalizer", "Aliases": [ - "seed" + "maxtrain" ], "Required": false, "SortOrder": 150.0, @@ -16349,58 +17005,28 @@ "IsNullable": false }, { - "Name": "WeightColumn", - "Type": "String", - "Desc": "The name of the weight column", - "Aliases": [ - "weight" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Rank", - "Type": "Int", - "Desc": "The number of components in the PCA", + "Name": "FixZero", + "Type": "Bool", + "Desc": "Whether to map zero to zero, preserving sparsity", "Aliases": [ - "k" + "zero" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 20 + "Default": true }, { - "Name": "Oversampling", + "Name": "MaxTrainingExamples", "Type": "Int", - "Desc": "Oversampling parameter for randomized PCA training", + "Desc": "Max number of examples used to train the normalizer", "Aliases": [ - "over" + "maxtrain" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 20 - }, - { - "Name": "Center", - "Type": "Bool", - "Desc": "If enabled, data is centered to be zero mean", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": true - }, - { - "Name": "Seed", - "Type": "Int", - "Desc": "The seed for random number generation", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 0 + "Default": 1000000000 } ], "Outputs": [ @@ -16417,15 +17043,12 @@ ], "InputKind": [ "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" ] }, { - "Name": "Transforms.PredictedLabelColumnOriginalValueConverter", - "Desc": "Transforms a predicted label column to its original values, unless it is of type bool.", - "FriendlyName": "Convert Predicted Label", + "Name": "Transforms.DataCache", + "Desc": "Caches using the specified cache option.", + "FriendlyName": "Cache Data", "ShortName": null, "Inputs": [ { @@ -16437,155 +17060,212 @@ "IsNullable": false }, { - "Name": "PredictedLabelColumn", - "Type": "String", - "Desc": "The predicted label column", + "Name": "Caching", + "Type": { + "Kind": "Enum", + "Values": [ + "Memory", + "Disk" + ] + }, + "Desc": "Caching strategy", "Required": true, "SortOrder": 2.0, - "IsNullable": false + "IsNullable": false, + "Default": "Memory" } ], "Outputs": [ { "Name": "OutputData", "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" + "Desc": "Dataset" } ], "InputKind": [ "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" ] }, { - "Name": "Transforms.RandomNumberGenerator", - "Desc": "Adds a column with a generated number sequence.", - "FriendlyName": "Generate Number Transform", - "ShortName": "Generate", + "Name": "Transforms.DatasetScorer", + "Desc": "Score a dataset with a predictor model", + "FriendlyName": null, + "ShortName": null, "Inputs": [ { - "Name": "Column", - "Type": { - "Kind": "Array", - "ItemType": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "UseCounter", - "Type": "Bool", - "Desc": "Use an auto-incremented integer starting at zero instead of a random number", - "Aliases": [ - "cnt" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Seed", - "Type": "UInt", - "Desc": "The random seed", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - } - ] - } - }, - "Desc": "New column definition(s) (optional form: name:seed)", - "Aliases": [ - "col" - ], + "Name": "Data", + "Type": "DataView", + "Desc": "The dataset to be scored", "Required": true, "SortOrder": 1.0, "IsNullable": false }, { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The predictor model to apply to data", "Required": true, - "SortOrder": 1.0, + "SortOrder": 2.0, "IsNullable": false }, { - "Name": "UseCounter", - "Type": "Bool", - "Desc": "Use an auto-incremented integer starting at zero instead of a random number", - "Aliases": [ - "cnt" - ], + "Name": "Suffix", + "Type": "String", + "Desc": "Suffix to append to the score columns", "Required": false, - "SortOrder": 150.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": false - }, + "Default": null + } + ], + "Outputs": [ { - "Name": "Seed", - "Type": "UInt", - "Desc": "The random seed", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 42 + "Name": "ScoredData", + "Type": "DataView", + "Desc": "The scored dataset" + }, + { + "Name": "ScoringTransform", + "Type": "TransformModel", + "Desc": "The scoring transform" + } + ] + }, + { + "Name": "Transforms.DatasetTransformScorer", + "Desc": "Score a dataset with a transform model", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "The dataset to be scored", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "TransformModel", + "Type": "TransformModel", + "Desc": "The transform model to apply to data", + "Required": true, + "SortOrder": 2.0, + "IsNullable": false } ], "Outputs": [ { - "Name": "OutputData", + "Name": "ScoredData", "Type": "DataView", - "Desc": "Transformed dataset" + "Desc": "The scored dataset" }, { - "Name": "Model", + "Name": "ScoringTransform", "Type": "TransformModel", - "Desc": "Transform model" + "Desc": "The scoring transform" } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" ] }, { - "Name": "Transforms.RowRangeFilter", - "Desc": "Filters a dataview on a column of type Single, Double or Key (contiguous). Keeps the values that are in the specified min/max range. NaNs are always filtered out. If the input is a Key type, the min/max are considered percentages of the number of values.", - "FriendlyName": "Range Filter", - "ShortName": "RangeFilter", + "Name": "Transforms.Dictionarizer", + "Desc": "Converts input values (words, numbers, etc.) to index in a dictionary.", + "FriendlyName": "Term Transform", + "ShortName": "TermTransform", "Inputs": [ { "Name": "Column", - "Type": "String", - "Desc": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "MaxNumTerms", + "Type": "Int", + "Desc": "Maximum number of terms to keep when auto-training", + "Aliases": [ + "max" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Term", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "List of terms", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Sort", + "Type": { + "Kind": "Enum", + "Values": [ + "Occurrence", + "Value" + ] + }, + "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "TextKeyValues", + "Type": "Bool", + "Desc": "Whether key value metadata should be text, regardless of the actual input type", + "Aliases": [ + "textkv" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", "Aliases": [ "col" ], - "Required": true, + "Required": false, "SortOrder": 1.0, - "IsNullable": false + "IsNullable": false, + "Default": null }, { "Name": "Data", @@ -16596,49 +17276,55 @@ "IsNullable": false }, { - "Name": "Min", - "Type": "Float", - "Desc": "Minimum value (0 to 1 for key types)", + "Name": "MaxNumTerms", + "Type": "Int", + "Desc": "Maximum number of terms to keep per column when auto-training", + "Aliases": [ + "max" + ], "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "SortOrder": 5.0, + "IsNullable": false, + "Default": 1000000 }, { - "Name": "Max", - "Type": "Float", - "Desc": "Maximum value (0 to 1 for key types)", + "Name": "Term", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "List of terms", "Required": false, - "SortOrder": 150.0, - "IsNullable": true, + "SortOrder": 106.0, + "IsNullable": false, "Default": null }, { - "Name": "Complement", - "Type": "Bool", - "Desc": "If true, keep the values that fall outside the range.", + "Name": "Sort", + "Type": { + "Kind": "Enum", + "Values": [ + "Occurrence", + "Value" + ] + }, + "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", "Required": false, - "SortOrder": 150.0, + "SortOrder": 113.0, "IsNullable": false, - "Default": false + "Default": "Occurrence" }, { - "Name": "IncludeMin", + "Name": "TextKeyValues", "Type": "Bool", - "Desc": "If true, include in the range the values that are equal to min.", + "Desc": "Whether key value metadata should be text, regardless of the actual input type", + "Aliases": [ + "textkv" + ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 114.0, "IsNullable": false, - "Default": true - }, - { - "Name": "IncludeMax", - "Type": "Bool", - "Desc": "If true, include in the range the values that are equal to max.", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null + "Default": false } ], "Outputs": [ @@ -16661,23 +17347,11 @@ ] }, { - "Name": "Transforms.RowSkipAndTakeFilter", - "Desc": "Allows limiting input to a subset of rows at an optional offset. Can be used to implement data paging.", - "FriendlyName": "Skip and Take Filter", - "ShortName": "SkipTake", + "Name": "Transforms.FeatureCombiner", + "Desc": "Combines all the features into one feature column.", + "FriendlyName": "Feature Combiner", + "ShortName": "fc", "Inputs": [ - { - "Name": "Skip", - "Type": "Int", - "Desc": "Number of items to skip", - "Aliases": [ - "s" - ], - "Required": false, - "SortOrder": 1.0, - "IsNullable": true, - "Default": null - }, { "Name": "Data", "Type": "DataView", @@ -16687,15 +17361,15 @@ "IsNullable": false }, { - "Name": "Take", - "Type": "Int", - "Desc": "Number of items to take", - "Aliases": [ - "t" - ], + "Name": "Features", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Features", "Required": false, "SortOrder": 2.0, - "IsNullable": true, + "IsNullable": false, "Default": null } ], @@ -16719,107 +17393,37 @@ ] }, { - "Name": "Transforms.RowSkipFilter", - "Desc": "Allows limiting input to a subset of rows by skipping a number of rows.", - "FriendlyName": "Skip Filter", - "ShortName": "Skip", - "Inputs": [ - { - "Name": "Count", - "Type": "Int", - "Desc": "Number of items to skip", + "Name": "Transforms.FeatureSelectorByCount", + "Desc": "Selects the slots for which the count of non-default values is greater than or equal to a threshold.", + "FriendlyName": "Count Feature Selection Transform", + "ShortName": null, + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Columns to use for feature selection", "Aliases": [ - "c", - "n", - "s" + "col" ], "Required": true, "SortOrder": 1.0, - "IsNullable": false, - "Default": 0 - }, - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.RowTakeFilter", - "Desc": "Allows limiting input to a subset of rows by taking N first rows.", - "FriendlyName": "Take Filter", - "ShortName": "Take", - "Inputs": [ { "Name": "Count", "Type": "Int", - "Desc": "Number of items to take", + "Desc": "If the count of non-default values for a slot is greater than or equal to this threshold, the slot is preserved", "Aliases": [ - "c", - "n", - "t" + "c" ], "Required": true, "SortOrder": 1.0, "IsNullable": false, - "Default": 9223372036854775807 - }, - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Default": 1 }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.ScoreColumnSelector", - "Desc": "Selects only the last score columns and the extra columns specified in the arguments.", - "FriendlyName": "Choose Columns By Index", - "ShortName": null, - "Inputs": [ { "Name": "Data", "Type": "DataView", @@ -16827,18 +17431,6 @@ "Required": true, "SortOrder": 1.0, "IsNullable": false - }, - { - "Name": "ExtraColumns", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Extra columns to write", - "Required": false, - "SortOrder": 2.0, - "IsNullable": false, - "Default": null } ], "Outputs": [ @@ -16861,113 +17453,37 @@ ] }, { - "Name": "Transforms.Scorer", - "Desc": "Turn the predictor model into a transform model", - "FriendlyName": null, - "ShortName": null, - "Inputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "The predictor model to turn into a transform", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "ScoredData", - "Type": "DataView", - "Desc": "The scored dataset" - }, - { - "Name": "ScoringTransform", - "Type": "TransformModel", - "Desc": "The scoring transform" - } - ] - }, - { - "Name": "Transforms.Segregator", - "Desc": "Un-groups vector columns into sequences of rows, inverse of Group transform", - "FriendlyName": "Un-group Transform", - "ShortName": "Ungroup", + "Name": "Transforms.FeatureSelectorByMutualInformation", + "Desc": "Selects the top k slots across all specified columns ordered by their mutual information with the label column.", + "FriendlyName": "Mutual Information Feature Selection Transform", + "ShortName": "MIFeatureSelection", "Inputs": [ - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, { "Name": "Column", "Type": { "Kind": "Array", "ItemType": "String" }, - "Desc": "Columns to unroll, or 'pivot'", + "Desc": "Columns to use for feature selection", "Aliases": [ "col" ], "Required": true, - "SortOrder": 150.0, + "SortOrder": 1.0, "IsNullable": false }, { - "Name": "Mode", - "Type": { - "Kind": "Enum", - "Values": [ - "Inner", - "Outer", - "First" - ] - }, - "Desc": "Specifies how to unroll multiple pivot columns of different size.", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": "Inner" - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" - }, - { - "Name": "Model", - "Type": "TransformModel", - "Desc": "Transform model" - } - ], - "InputKind": [ - "ITransformInput" - ], - "OutputKind": [ - "ITransformOutput" - ] - }, - { - "Name": "Transforms.SentimentAnalyzer", - "Desc": "Uses a pretrained sentiment model to score input strings", - "FriendlyName": "Sentiment Analyzing Transform", - "ShortName": "Senti", - "Inputs": [ - { - "Name": "Source", - "Type": "String", - "Desc": "Name of the source column.", + "Name": "SlotsInOutput", + "Type": "Int", + "Desc": "The maximum number of slots to preserve in output", "Aliases": [ - "col" + "topk", + "numSlotsToKeep" ], - "Required": true, + "Required": false, "SortOrder": 1.0, - "IsNullable": false + "IsNullable": false, + "Default": 1000 }, { "Name": "Data", @@ -16978,16 +17494,28 @@ "IsNullable": false }, { - "Name": "Name", + "Name": "LabelColumn", "Type": "String", - "Desc": "Name of the new column.", + "Desc": "Column to use for labels", "Aliases": [ - "dst" + "lab" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 4.0, "IsNullable": false, - "Default": null + "Default": "Label" + }, + { + "Name": "NumBins", + "Type": "Int", + "Desc": "Max number of bins for R4/R8 columns, power of 2 recommended", + "Aliases": [ + "bins" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 256 } ], "Outputs": [ @@ -17010,10 +17538,10 @@ ] }, { - "Name": "Transforms.SupervisedBinNormalizer", - "Desc": "Similar to BinNormalizer, but calculates bins based on correlation with the label column, not equi-density. The new value is bin_number / number_of_bins.", - "FriendlyName": "Supervised Binning Normalizer", - "ShortName": "SupBin", + "Name": "Transforms.GlobalContrastNormalizer", + "Desc": "Performs a global contrast normalization on input values: Y = (s * X - M) / D, where s is a scale, M is mean and D is either L2 norm or standard deviation.", + "FriendlyName": "Global Contrast Normalization Transform", + "ShortName": "Gcn", "Inputs": [ { "Name": "Column", @@ -17023,36 +17551,27 @@ "Kind": "Struct", "Fields": [ { - "Name": "NumBins", - "Type": "Int", - "Desc": "Max number of bins, power of 2 recommended", - "Aliases": [ - "bins" - ], + "Name": "UseStdDev", + "Type": "Bool", + "Desc": "Normalize by standard deviation rather than L2 norm", "Required": false, "SortOrder": 150.0, "IsNullable": true, "Default": null }, { - "Name": "FixZero", - "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", - "Aliases": [ - "zero" - ], + "Name": "Scale", + "Type": "Float", + "Desc": "Scale features by this value", "Required": false, "SortOrder": 150.0, "IsNullable": true, "Default": null }, { - "Name": "MaxTrainingExamples", - "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", - "Aliases": [ - "maxtrain" - ], + "Name": "SubMean", + "Type": "Bool", + "Desc": "Subtract mean from each value before normalizing", "Required": false, "SortOrder": 150.0, "IsNullable": true, @@ -17094,6 +17613,15 @@ "IsNullable": false, "Default": null }, + { + "Name": "SubMean", + "Type": "Bool", + "Desc": "Subtract mean from each value before normalizing", + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": true + }, { "Name": "Data", "Type": "DataView", @@ -17103,61 +17631,25 @@ "IsNullable": false }, { - "Name": "LabelColumn", - "Type": "String", - "Desc": "Label column for supervised binning", - "Aliases": [ - "label", - "lab" - ], - "Required": true, - "SortOrder": 150.0, - "IsNullable": false - }, - { - "Name": "MinBinSize", - "Type": "Int", - "Desc": "Minimum number of examples per bin", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 10 - }, - { - "Name": "NumBins", - "Type": "Int", - "Desc": "Max number of bins, power of 2 recommended", - "Aliases": [ - "bins" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": 1024 - }, - { - "Name": "FixZero", + "Name": "UseStdDev", "Type": "Bool", - "Desc": "Whether to map zero to zero, preserving sparsity", + "Desc": "Normalize by standard deviation rather than L2 norm", "Aliases": [ - "zero" + "useStd" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": true + "Default": false }, { - "Name": "MaxTrainingExamples", - "Type": "Int", - "Desc": "Max number of examples used to train the normalizer", - "Aliases": [ - "maxtrain" - ], + "Name": "Scale", + "Type": "Float", + "Desc": "Scale features by this value", "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": 1000000000 + "Default": 1.0 } ], "Outputs": [ @@ -17180,46 +17672,97 @@ ] }, { - "Name": "Transforms.TextFeaturizer", - "Desc": "A transform that turns a collection of text documents into numerical feature vectors. The feature vectors are normalized counts of (word and/or character) ngrams in a given tokenized text.", - "FriendlyName": "Text Transform", - "ShortName": "Text", + "Name": "Transforms.HashConverter", + "Desc": "Converts column values into hashes. This transform accepts both numeric and text inputs, both single and vector-valued columns. This is a part of the Dracula transform.", + "FriendlyName": "Hash Join Transform", + "ShortName": "HashJoin", "Inputs": [ { "Name": "Column", "Type": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Name", - "Type": "String", - "Desc": "Name of the new column", - "Aliases": [ - "name" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Source", - "Type": { - "Kind": "Array", - "ItemType": "String" + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Join", + "Type": "Bool", + "Desc": "Whether the values need to be combined for a single hash", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null }, - "Desc": "Name of the source column", - "Aliases": [ - "src" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - } - ] + { + "Name": "CustomSlotMap", + "Type": "String", + "Desc": "Which slots should be combined together. Example: 0,3,5;0,1;3;2,1,0. Overrides 'join'.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "HashBits", + "Type": "Int", + "Desc": "Number of bits to hash into. Must be between 1 and 31, inclusive.", + "Aliases": [ + "bits" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Seed", + "Type": "UInt", + "Desc": "Hashing seed", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Ordered", + "Type": "Bool", + "Desc": "Whether the position of each term should be included in the hash", + "Aliases": [ + "ord" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } }, - "Desc": "New column definition (optional form: name:srcs).", + "Desc": "New column definition(s) (optional form: name:src)", "Aliases": [ "col" ], @@ -17236,232 +17779,46 @@ "IsNullable": false }, { - "Name": "Language", - "Type": { - "Kind": "Enum", - "Values": [ - "English", - "French", - "German", - "Dutch", - "Italian", - "Spanish", - "Japanese" - ] - }, - "Desc": "Dataset language or 'AutoDetect' to detect language per row.", + "Name": "HashBits", + "Type": "Int", + "Desc": "Number of bits to hash into. Must be between 1 and 31, inclusive.", "Aliases": [ - "lang" + "bits" ], "Required": false, - "SortOrder": 3.0, + "SortOrder": 2.0, "IsNullable": false, - "Default": "English" + "Default": 31 }, { - "Name": "StopWordsRemover", - "Type": { - "Kind": "Component", - "ComponentKind": "StopWordsRemover" - }, - "Desc": "Stopwords remover.", - "Aliases": [ - "remover" - ], + "Name": "Join", + "Type": "Bool", + "Desc": "Whether the values need to be combined for a single hash", "Required": false, - "SortOrder": 4.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": null + "Default": true }, { - "Name": "TextCase", - "Type": { - "Kind": "Enum", - "Values": [ - "Lower", - "Upper", - "None" - ] - }, - "Desc": "Casing text using the rules of the invariant culture.", - "Aliases": [ - "case" - ], + "Name": "Seed", + "Type": "UInt", + "Desc": "Hashing seed", "Required": false, - "SortOrder": 5.0, + "SortOrder": 150.0, "IsNullable": false, - "Default": "Lower" + "Default": 314489979 }, { - "Name": "KeepDiacritics", + "Name": "Ordered", "Type": "Bool", - "Desc": "Whether to keep diacritical marks or remove them.", + "Desc": "Whether the position of each term should be included in the hash", "Aliases": [ - "diac" - ], - "Required": false, - "SortOrder": 6.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "KeepPunctuations", - "Type": "Bool", - "Desc": "Whether to keep punctuation marks or remove them.", - "Aliases": [ - "punc" - ], - "Required": false, - "SortOrder": 7.0, - "IsNullable": false, - "Default": true - }, - { - "Name": "KeepNumbers", - "Type": "Bool", - "Desc": "Whether to keep numbers or remove them.", - "Aliases": [ - "num" + "ord" ], "Required": false, - "SortOrder": 8.0, + "SortOrder": 150.0, "IsNullable": false, "Default": true - }, - { - "Name": "OutputTokens", - "Type": "Bool", - "Desc": "Whether to output the transformed text tokens as an additional column.", - "Aliases": [ - "tokens", - "showtext", - "showTransformedText" - ], - "Required": false, - "SortOrder": 9.0, - "IsNullable": false, - "Default": false - }, - { - "Name": "Dictionary", - "Type": { - "Kind": "Struct", - "Fields": [ - { - "Name": "Term", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "List of terms", - "Required": false, - "SortOrder": 1.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Sort", - "Type": { - "Kind": "Enum", - "Values": [ - "Occurrence", - "Value" - ] - }, - "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", - "Required": false, - "SortOrder": 5.0, - "IsNullable": false, - "Default": "Occurrence" - }, - { - "Name": "DropUnknowns", - "Type": "Bool", - "Desc": "Drop unknown terms instead of mapping them to NA term.", - "Aliases": [ - "dropna" - ], - "Required": false, - "SortOrder": 6.0, - "IsNullable": false, - "Default": false - } - ] - }, - "Desc": "A dictionary of whitelisted terms.", - "Aliases": [ - "dict" - ], - "Required": false, - "SortOrder": 10.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "WordFeatureExtractor", - "Type": { - "Kind": "Component", - "ComponentKind": "NgramExtractor" - }, - "Desc": "Ngram feature extractor to use for words (WordBag/WordHashBag).", - "Aliases": [ - "wordExtractor" - ], - "Required": false, - "SortOrder": 11.0, - "IsNullable": false, - "Default": { - "Name": "NGram", - "Settings": { - "MaxNumTerms": [ - 10000000 - ] - } - } - }, - { - "Name": "CharFeatureExtractor", - "Type": { - "Kind": "Component", - "ComponentKind": "NgramExtractor" - }, - "Desc": "Ngram feature extractor to use for characters (WordBag/WordHashBag).", - "Aliases": [ - "charExtractor" - ], - "Required": false, - "SortOrder": 12.0, - "IsNullable": false, - "Default": { - "Name": "NGram", - "Settings": { - "NgramLength": 3, - "AllLengths": false, - "MaxNumTerms": [ - 10000000 - ] - } - } - }, - { - "Name": "VectorNormalizer", - "Type": { - "Kind": "Enum", - "Values": [ - "None", - "L1", - "L2", - "LInf" - ] - }, - "Desc": "Normalize vectors (rows) individually by rescaling them to unit norm.", - "Aliases": [ - "norm" - ], - "Required": false, - "SortOrder": 13.0, - "IsNullable": false, - "Default": "L2" } ], "Outputs": [ @@ -17484,9 +17841,9 @@ ] }, { - "Name": "Transforms.TextToKeyConverter", - "Desc": "Converts input values (words, numbers, etc.) to index in a dictionary.", - "FriendlyName": "Term Transform", + "Name": "Transforms.KeyToTextConverter", + "Desc": "KeyToValueTransform utilizes KeyValues metadata to map key indices to the corresponding values in the KeyValues metadata.", + "FriendlyName": "Key To Value Transform", "ShortName": null, "Inputs": [ { @@ -17496,57 +17853,6 @@ "ItemType": { "Kind": "Struct", "Fields": [ - { - "Name": "MaxNumTerms", - "Type": "Int", - "Desc": "Maximum number of terms to keep when auto-training", - "Aliases": [ - "max" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "Term", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "List of terms", - "Required": false, - "SortOrder": 150.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Sort", - "Type": { - "Kind": "Enum", - "Values": [ - "Occurrence", - "Value" - ] - }, - "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, - { - "Name": "TextKeyValues", - "Type": "Bool", - "Desc": "Whether key value metadata should be text, regardless of the actual input type", - "Aliases": [ - "textkv" - ], - "Required": false, - "SortOrder": 150.0, - "IsNullable": true, - "Default": null - }, { "Name": "Name", "Type": "String", @@ -17578,10 +17884,9 @@ "Aliases": [ "col" ], - "Required": false, + "Required": true, "SortOrder": 1.0, - "IsNullable": false, - "Default": null + "IsNullable": false }, { "Name": "Data", @@ -17590,64 +17895,13 @@ "Required": true, "SortOrder": 1.0, "IsNullable": false - }, - { - "Name": "MaxNumTerms", - "Type": "Int", - "Desc": "Maximum number of terms to keep per column when auto-training", - "Aliases": [ - "max" - ], - "Required": false, - "SortOrder": 5.0, - "IsNullable": false, - "Default": 1000000 - }, + } + ], + "Outputs": [ { - "Name": "Term", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "List of terms", - "Required": false, - "SortOrder": 106.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "Sort", - "Type": { - "Kind": "Enum", - "Values": [ - "Occurrence", - "Value" - ] - }, - "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", - "Required": false, - "SortOrder": 113.0, - "IsNullable": false, - "Default": "Occurrence" - }, - { - "Name": "TextKeyValues", - "Type": "Bool", - "Desc": "Whether key value metadata should be text, regardless of the actual input type", - "Aliases": [ - "textkv" - ], - "Required": false, - "SortOrder": 114.0, - "IsNullable": false, - "Default": false - } - ], - "Outputs": [ - { - "Name": "OutputData", - "Type": "DataView", - "Desc": "Transformed dataset" + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" }, { "Name": "Model", @@ -17663,9 +17917,9 @@ ] }, { - "Name": "Transforms.TrainTestDatasetSplitter", - "Desc": "Split the dataset into train and test sets", - "FriendlyName": "Dataset Train-Test Split", + "Name": "Transforms.LabelColumnKeyBooleanConverter", + "Desc": "Transforms the label to either key or bool (if needed) to make it suitable for classification.", + "FriendlyName": "Prepare Classification Label", "ShortName": null, "Inputs": [ { @@ -17677,85 +17931,21 @@ "IsNullable": false }, { - "Name": "Fraction", - "Type": "Float", - "Desc": "Fraction of training data", - "Required": false, - "SortOrder": 2.0, - "IsNullable": false, - "Default": 0.8 - }, - { - "Name": "StratificationColumn", + "Name": "LabelColumn", "Type": "String", - "Desc": "Stratification column", - "Aliases": [ - "strat" - ], - "Required": false, - "SortOrder": 3.0, - "IsNullable": false, - "Default": null - } - ], - "Outputs": [ - { - "Name": "TrainData", - "Type": "DataView", - "Desc": "Training data" - }, - { - "Name": "TestData", - "Type": "DataView", - "Desc": "Testing data" - } - ] - }, - { - "Name": "Transforms.TreeLeafFeaturizer", - "Desc": "Trains a tree ensemble, or loads it from a file, then maps a numeric feature vector to three outputs: 1. A vector containing the individual tree outputs of the tree ensemble. 2. A vector indicating the leaves that the feature vector falls on in the tree ensemble. 3. A vector indicating the paths that the feature vector falls on in the tree ensemble. If a both a model file and a trainer are specified - will use the model file. If neither are specified, will train a default FastTree model. This can handle key labels by training a regression model towards their optionally permuted indices.", - "FriendlyName": "Tree Ensemble Featurization Transform", - "ShortName": "TreeFeat", - "Inputs": [ - { - "Name": "Data", - "Type": "DataView", - "Desc": "Input dataset", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "Trainer to use", + "Desc": "The label column", "Required": true, - "SortOrder": 10.0, + "SortOrder": 2.0, "IsNullable": false }, { - "Name": "Suffix", - "Type": "String", - "Desc": "Output column: The suffix to append to the default column names", - "Aliases": [ - "ex" - ], - "Required": false, - "SortOrder": 101.0, - "IsNullable": false, - "Default": null - }, - { - "Name": "LabelPermutationSeed", - "Type": "Int", - "Desc": "If specified, determines the permutation seed for applying this featurizer to a multiclass problem.", - "Aliases": [ - "lps" - ], + "Name": "TextKeyValues", + "Type": "Bool", + "Desc": "Convert the key values to text", "Required": false, - "SortOrder": 102.0, + "SortOrder": 3.0, "IsNullable": false, - "Default": 0 + "Default": true } ], "Outputs": [ @@ -17771,7 +17961,6 @@ } ], "InputKind": [ - "IFeaturizerInput", "ITransformInput" ], "OutputKind": [ @@ -17779,41 +17968,10 @@ ] }, { - "Name": "Transforms.TwoHeterogeneousModelCombiner", - "Desc": "Combines a TransformModel and a PredictorModel into a single PredictorModel.", - "FriendlyName": null, - "ShortName": null, - "Inputs": [ - { - "Name": "TransformModel", - "Type": "TransformModel", - "Desc": "Transform model", - "Required": true, - "SortOrder": 1.0, - "IsNullable": false - }, - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "Predictor model", - "Required": true, - "SortOrder": 2.0, - "IsNullable": false - } - ], - "Outputs": [ - { - "Name": "PredictorModel", - "Type": "PredictorModel", - "Desc": "Predictor model" - } - ] - }, - { - "Name": "Transforms.WordTokenizer", - "Desc": "The input to this transform is text, and the output is a vector of text containing the words (tokens) in the original text. The separator is space, but can be specified as any other character (or multiple characters) if needed.", - "FriendlyName": "Tokenize Text Transform", - "ShortName": "TokenizeTextTransform", + "Name": "Transforms.LabelIndicator", + "Desc": "Label remapper used by OVA", + "FriendlyName": "LabelIndicator", + "ShortName": "LabelIndictator", "Inputs": [ { "Name": "Column", @@ -17823,15 +17981,15 @@ "Kind": "Struct", "Fields": [ { - "Name": "TermSeparators", - "Type": "String", - "Desc": "Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character.", + "Name": "ClassIndex", + "Type": "Int", + "Desc": "The positive example class for binary classification.", "Aliases": [ - "sep" + "index" ], "Required": false, "SortOrder": 150.0, - "IsNullable": false, + "IsNullable": true, "Default": null }, { @@ -17861,7 +18019,7 @@ ] } }, - "Desc": "New column definition(s)", + "Desc": "New column definition(s) (optional form: name:src)", "Aliases": [ "col" ], @@ -17879,16 +18037,16 @@ "IsNullable": false }, { - "Name": "TermSeparators", - "Type": "String", - "Desc": "Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character.", + "Name": "ClassIndex", + "Type": "Int", + "Desc": "Label of the positive class.", "Aliases": [ - "sep" + "index" ], "Required": false, "SortOrder": 150.0, "IsNullable": false, - "Default": "space" + "Default": 0 } ], "Outputs": [ @@ -17909,494 +18067,5214 @@ "OutputKind": [ "ITransformOutput" ] - } - ], - "Components": [ + }, + { + "Name": "Transforms.LabelToFloatConverter", + "Desc": "Transforms the label to float to make it suitable for regression.", + "FriendlyName": "Prepare Regression Label", + "ShortName": null, + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "LabelColumn", + "Type": "String", + "Desc": "The label column", + "Required": true, + "SortOrder": 2.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.LightLda", + "Desc": "The LDA transform implements LightLDA, a state-of-the-art implementation of Latent Dirichlet Allocation.", + "FriendlyName": "Latent Dirichlet Allocation Transform", + "ShortName": "LightLda", + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "NumTopic", + "Type": "Int", + "Desc": "The number of topics in the LDA", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "AlphaSum", + "Type": "Float", + "Desc": "Dirichlet prior on document-topic vectors", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Beta", + "Type": "Float", + "Desc": "Dirichlet prior on vocab-topic vectors", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Mhstep", + "Type": "Int", + "Desc": "Number of Metropolis Hasting step", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "NumIterations", + "Type": "Int", + "Desc": "Number of iterations", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "LikelihoodInterval", + "Type": "Int", + "Desc": "Compute log likelihood over local dataset on this iteration interval", + "Aliases": [ + "llInterval" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "NumThreads", + "Type": "Int", + "Desc": "The number of training threads", + "Aliases": [ + "t" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "NumMaxDocToken", + "Type": "Int", + "Desc": "The threshold of maximum count of tokens per doc", + "Aliases": [ + "maxNumToken" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "NumSummaryTermPerTopic", + "Type": "Int", + "Desc": "The number of words to summarize the topic", + "Aliases": [ + "ns" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "NumBurninIterations", + "Type": "Int", + "Desc": "The number of burn-in iterations", + "Aliases": [ + "burninIter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": 10 + }, + { + "Name": "ResetRandomGenerator", + "Type": "Bool", + "Desc": "Reset the random number generator for each document", + "Aliases": [ + "reset" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:srcs)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 49.0, + "IsNullable": false + }, + { + "Name": "NumTopic", + "Type": "Int", + "Desc": "The number of topics in the LDA", + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 100, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 20, + 40, + 100, + 200 + ] + } + }, + { + "Name": "NumMaxDocToken", + "Type": "Int", + "Desc": "The threshold of maximum count of tokens per doc", + "Aliases": [ + "maxNumToken" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 512 + }, + { + "Name": "NumThreads", + "Type": "Int", + "Desc": "The number of training threads. Default value depends on number of logical processors.", + "Aliases": [ + "t" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "AlphaSum", + "Type": "Float", + "Desc": "Dirichlet prior on document-topic vectors", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 100.0, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 1, + 10, + 100, + 200 + ] + } + }, + { + "Name": "Beta", + "Type": "Float", + "Desc": "Dirichlet prior on vocab-topic vectors", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.01, + 0.015, + 0.07, + 0.02 + ] + } + }, + { + "Name": "Mhstep", + "Type": "Int", + "Desc": "Number of Metropolis Hasting step", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 4, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 2, + 4, + 8, + 16 + ] + } + }, + { + "Name": "NumIterations", + "Type": "Int", + "Desc": "Number of iterations", + "Aliases": [ + "iter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 200, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 100, + 200, + 300, + 400 + ] + } + }, + { + "Name": "LikelihoodInterval", + "Type": "Int", + "Desc": "Compute log likelihood over local dataset on this iteration interval", + "Aliases": [ + "llInterval" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 5 + }, + { + "Name": "NumSummaryTermPerTopic", + "Type": "Int", + "Desc": "The number of words to summarize the topic", + "Aliases": [ + "ns" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 10 + }, + { + "Name": "NumBurninIterations", + "Type": "Int", + "Desc": "The number of burn-in iterations", + "Aliases": [ + "burninIter" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 10, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 10, + 20, + 30, + 40 + ] + } + }, + { + "Name": "ResetRandomGenerator", + "Type": "Bool", + "Desc": "Reset the random number generator for each document", + "Aliases": [ + "reset" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "OutputTopicWordSummary", + "Type": "Bool", + "Desc": "Whether to output the topic-word summary in text format", + "Aliases": [ + "summary" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.LogMeanVarianceNormalizer", + "Desc": "Normalizes the data based on the computed mean and variance of the logarithm of the data.", + "FriendlyName": "LogMeanVar Normalizer", + "ShortName": "LogMeanVar", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "UseCdf", + "Type": "Bool", + "Desc": "Whether to use CDF as the output", + "Aliases": [ + "cdf" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000000 + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.LpNormalizer", + "Desc": "Normalize vectors (rows) individually by rescaling them to unit norm (L2, L1 or LInf). Performs the following operation on a vector X: Y = (X - M) / D, where M is mean and D is either L2 norm, L1 norm or LInf norm.", + "FriendlyName": "Lp-Norm Normalizer", + "ShortName": "lpnorm", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "NormKind", + "Type": { + "Kind": "Enum", + "Values": [ + "L2Norm", + "StdDev", + "L1Norm", + "LInf" + ] + }, + "Desc": "The norm to use to normalize each sample", + "Aliases": [ + "norm" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "SubMean", + "Type": "Bool", + "Desc": "Subtract mean from each value before normalizing", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "NormKind", + "Type": { + "Kind": "Enum", + "Values": [ + "L2Norm", + "StdDev", + "L1Norm", + "LInf" + ] + }, + "Desc": "The norm to use to normalize each sample", + "Aliases": [ + "norm" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": "L2Norm" + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "SubMean", + "Type": "Bool", + "Desc": "Subtract mean from each value before normalizing", + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.ManyHeterogeneousModelCombiner", + "Desc": "Combines a sequence of TransformModels and a PredictorModel into a single PredictorModel.", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "TransformModels", + "Type": { + "Kind": "Array", + "ItemType": "TransformModel" + }, + "Desc": "Transform model", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "Predictor model", + "Required": true, + "SortOrder": 2.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "Predictor model" + } + ] + }, + { + "Name": "Transforms.MeanVarianceNormalizer", + "Desc": "Normalizes the data based on the computed mean and variance of the data.", + "FriendlyName": "MeanVar Normalizer", + "ShortName": "MeanVar", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "FixZero", + "Type": "Bool", + "Desc": "Whether to map zero to zero, preserving sparsity", + "Aliases": [ + "zero" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "UseCdf", + "Type": "Bool", + "Desc": "Whether to use CDF as the output", + "Aliases": [ + "cdf" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "FixZero", + "Type": "Bool", + "Desc": "Whether to map zero to zero, preserving sparsity", + "Aliases": [ + "zero" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000000 + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.MinMaxNormalizer", + "Desc": "Normalizes the data based on the observed minimum and maximum values of the data.", + "FriendlyName": "Min-Max Normalizer", + "ShortName": "MinMax", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "FixZero", + "Type": "Bool", + "Desc": "Whether to map zero to zero, preserving sparsity", + "Aliases": [ + "zero" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "FixZero", + "Type": "Bool", + "Desc": "Whether to map zero to zero, preserving sparsity", + "Aliases": [ + "zero" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000000 + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.MissingValueHandler", + "Desc": "Handle missing values by replacing them with either the default value or the mean/min/max value (for non-text columns only). An indicator column can optionally be concatenated, if theinput column type is numeric.", + "FriendlyName": "NA Handle Transform", + "ShortName": "NAHandle", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Kind", + "Type": { + "Kind": "Enum", + "Values": [ + "DefaultValue", + "Mean", + "Minimum", + "Maximum" + ] + }, + "Desc": "The replacement method to utilize", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "ImputeBySlot", + "Type": "Bool", + "Desc": "Whether to impute values by slot", + "Aliases": [ + "slot" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "ConcatIndicator", + "Type": "Bool", + "Desc": "Whether or not to concatenate an indicator vector column to the value column", + "Aliases": [ + "ind" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:rep:src)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ReplaceWith", + "Type": { + "Kind": "Enum", + "Values": [ + "DefaultValue", + "Mean", + "Minimum", + "Maximum" + ] + }, + "Desc": "The replacement method to utilize", + "Aliases": [ + "kind" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": "Def" + }, + { + "Name": "ImputeBySlot", + "Type": "Bool", + "Desc": "Whether to impute values by slot", + "Aliases": [ + "slot" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "Concat", + "Type": "Bool", + "Desc": "Whether or not to concatenate an indicator vector column to the value column", + "Aliases": [ + "ind" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.MissingValueIndicator", + "Desc": "Create a boolean output column with the same number of slots as the input column, where the output value is true if the value in the input column is missing.", + "FriendlyName": "NA Indicator Transform", + "ShortName": "NAInd", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.MissingValuesDropper", + "Desc": "Removes NAs from vector columns.", + "FriendlyName": "NA Drop Transform", + "ShortName": "NADrop", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "Columns to drop the NAs for", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.MissingValuesRowDropper", + "Desc": "Filters out rows that contain missing values.", + "FriendlyName": "NA Filter", + "ShortName": "NAFilter", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Column", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Complement", + "Type": "Bool", + "Desc": "If true, keep only rows that contain NA values, and filter the rest.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.MissingValueSubstitutor", + "Desc": "Create an output column of the same type and size of the input column, where missing values are replaced with either the default value or the mean/min/max value (for non-text columns only).", + "FriendlyName": "NA Replace Transform", + "ShortName": "NARep", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "ReplacementString", + "Type": "String", + "Desc": "Replacement value for NAs (uses default value if not given)", + "Aliases": [ + "rep" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Kind", + "Type": { + "Kind": "Enum", + "Values": [ + "DefaultValue", + "Mean", + "Minimum", + "Maximum", + "SpecifiedValue" + ] + }, + "Desc": "The replacement method to utilize", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Slot", + "Type": "Bool", + "Desc": "Whether to impute values by slot", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:rep:src)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ReplacementKind", + "Type": { + "Kind": "Enum", + "Values": [ + "DefaultValue", + "Mean", + "Minimum", + "Maximum", + "SpecifiedValue" + ] + }, + "Desc": "The replacement method to utilize", + "Aliases": [ + "kind" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "Default" + }, + { + "Name": "ImputeBySlot", + "Type": "Bool", + "Desc": "Whether to impute values by slot", + "Aliases": [ + "slot" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.ModelCombiner", + "Desc": "Combines a sequence of TransformModels into a single model", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "Models", + "Type": { + "Kind": "Array", + "ItemType": "TransformModel" + }, + "Desc": "Input models", + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + } + ], + "Outputs": [ + { + "Name": "OutputModel", + "Type": "TransformModel", + "Desc": "Combined model" + } + ] + }, + { + "Name": "Transforms.NGramTranslator", + "Desc": "Produces a bag of counts of ngrams (sequences of consecutive values of length 1-n) in a given vector of keys. It does so by building a dictionary of ngrams and using the id in the dictionary as the index in the bag.", + "FriendlyName": "NGram Transform", + "ShortName": "NgramTransform", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "NgramLength", + "Type": "Int", + "Desc": "Maximum ngram length", + "Aliases": [ + "ngram" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "AllLengths", + "Type": "Bool", + "Desc": "Whether to include all ngram lengths up to NgramLength or only NgramLength", + "Aliases": [ + "all" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "SkipLength", + "Type": "Int", + "Desc": "Maximum number of tokens to skip when constructing an ngram", + "Aliases": [ + "skips" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "MaxNumTerms", + "Type": { + "Kind": "Array", + "ItemType": "Int" + }, + "Desc": "Maximum number of ngrams to store in the dictionary", + "Aliases": [ + "max" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Weighting", + "Type": { + "Kind": "Enum", + "Values": [ + "Tf", + "Idf", + "TfIdf" + ] + }, + "Desc": "Statistical measure used to evaluate how important a word is to a document in a corpus", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "NgramLength", + "Type": "Int", + "Desc": "Maximum ngram length", + "Aliases": [ + "ngram" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 2 + }, + { + "Name": "AllLengths", + "Type": "Bool", + "Desc": "Whether to store all ngram lengths up to ngramLength, or only ngramLength", + "Aliases": [ + "all" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "SkipLength", + "Type": "Int", + "Desc": "Maximum number of tokens to skip when constructing an ngram", + "Aliases": [ + "skips" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0 + }, + { + "Name": "MaxNumTerms", + "Type": { + "Kind": "Array", + "ItemType": "Int" + }, + "Desc": "Maximum number of ngrams to store in the dictionary", + "Aliases": [ + "max" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": [ + 10000000 + ] + }, + { + "Name": "Weighting", + "Type": { + "Kind": "Enum", + "Values": [ + "Tf", + "Idf", + "TfIdf" + ] + }, + "Desc": "The weighting criteria", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "Tf" + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.NoOperation", + "Desc": "Does nothing.", + "FriendlyName": "No Op", + "ShortName": "Nop", + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.OptionalColumnCreator", + "Desc": "If the source column does not exist after deserialization, create a column with the right type and default values.", + "FriendlyName": "Optional Column Transform", + "ShortName": "optional", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "New column definition(s)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.PcaCalculator", + "Desc": "PCA is a dimensionality-reduction transform which computes the projection of a numeric vector onto a low-rank subspace.", + "FriendlyName": "Principal Component Analysis Transform", + "ShortName": "Pca", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "WeightColumn", + "Type": "String", + "Desc": "The name of the weight column", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Rank", + "Type": "Int", + "Desc": "The number of components in the PCA", + "Aliases": [ + "k" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Oversampling", + "Type": "Int", + "Desc": "Oversampling parameter for randomized PCA training", + "Aliases": [ + "over" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Center", + "Type": "Bool", + "Desc": "If enabled, data is centered to be zero mean", + "Aliases": [ + "center" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Seed", + "Type": "Int", + "Desc": "The seed for random number generation", + "Aliases": [ + "seed" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "WeightColumn", + "Type": "String", + "Desc": "The name of the weight column", + "Aliases": [ + "weight" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Rank", + "Type": "Int", + "Desc": "The number of components in the PCA", + "Aliases": [ + "k" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 20 + }, + { + "Name": "Oversampling", + "Type": "Int", + "Desc": "Oversampling parameter for randomized PCA training", + "Aliases": [ + "over" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 20 + }, + { + "Name": "Center", + "Type": "Bool", + "Desc": "If enabled, data is centered to be zero mean", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "Seed", + "Type": "Int", + "Desc": "The seed for random number generation", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0 + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.PredictedLabelColumnOriginalValueConverter", + "Desc": "Transforms a predicted label column to its original values, unless it is of type bool.", + "FriendlyName": "Convert Predicted Label", + "ShortName": null, + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "PredictedLabelColumn", + "Type": "String", + "Desc": "The predicted label column", + "Required": true, + "SortOrder": 2.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.RandomNumberGenerator", + "Desc": "Adds a column with a generated number sequence.", + "FriendlyName": "Generate Number Transform", + "ShortName": "Generate", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "UseCounter", + "Type": "Bool", + "Desc": "Use an auto-incremented integer starting at zero instead of a random number", + "Aliases": [ + "cnt" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Seed", + "Type": "UInt", + "Desc": "The random seed", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:seed)", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "UseCounter", + "Type": "Bool", + "Desc": "Use an auto-incremented integer starting at zero instead of a random number", + "Aliases": [ + "cnt" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "Seed", + "Type": "UInt", + "Desc": "The random seed", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 42 + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.RowRangeFilter", + "Desc": "Filters a dataview on a column of type Single, Double or Key (contiguous). Keeps the values that are in the specified min/max range. NaNs are always filtered out. If the input is a Key type, the min/max are considered percentages of the number of values.", + "FriendlyName": "Range Filter", + "ShortName": "RangeFilter", + "Inputs": [ + { + "Name": "Column", + "Type": "String", + "Desc": "Column", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Min", + "Type": "Float", + "Desc": "Minimum value (0 to 1 for key types)", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Max", + "Type": "Float", + "Desc": "Maximum value (0 to 1 for key types)", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Complement", + "Type": "Bool", + "Desc": "If true, keep the values that fall outside the range.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "IncludeMin", + "Type": "Bool", + "Desc": "If true, include in the range the values that are equal to min.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "IncludeMax", + "Type": "Bool", + "Desc": "If true, include in the range the values that are equal to max.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.RowSkipAndTakeFilter", + "Desc": "Allows limiting input to a subset of rows at an optional offset. Can be used to implement data paging.", + "FriendlyName": "Skip and Take Filter", + "ShortName": "SkipTake", + "Inputs": [ + { + "Name": "Skip", + "Type": "Int", + "Desc": "Number of items to skip", + "Aliases": [ + "s" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Take", + "Type": "Int", + "Desc": "Number of items to take", + "Aliases": [ + "t" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": true, + "Default": null + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.RowSkipFilter", + "Desc": "Allows limiting input to a subset of rows by skipping a number of rows.", + "FriendlyName": "Skip Filter", + "ShortName": "Skip", + "Inputs": [ + { + "Name": "Count", + "Type": "Int", + "Desc": "Number of items to skip", + "Aliases": [ + "c", + "n", + "s" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false, + "Default": 0 + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.RowTakeFilter", + "Desc": "Allows limiting input to a subset of rows by taking N first rows.", + "FriendlyName": "Take Filter", + "ShortName": "Take", + "Inputs": [ + { + "Name": "Count", + "Type": "Int", + "Desc": "Number of items to take", + "Aliases": [ + "c", + "n", + "t" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false, + "Default": 9223372036854775807 + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.ScoreColumnSelector", + "Desc": "Selects only the last score columns and the extra columns specified in the arguments.", + "FriendlyName": "Choose Columns By Index", + "ShortName": null, + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "ExtraColumns", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Extra columns to write", + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": null + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.Scorer", + "Desc": "Turn the predictor model into a transform model", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "The predictor model to turn into a transform", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "ScoredData", + "Type": "DataView", + "Desc": "The scored dataset" + }, + { + "Name": "ScoringTransform", + "Type": "TransformModel", + "Desc": "The scoring transform" + } + ] + }, + { + "Name": "Transforms.Segregator", + "Desc": "Un-groups vector columns into sequences of rows, inverse of Group transform", + "FriendlyName": "Un-group Transform", + "ShortName": "Ungroup", + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Columns to unroll, or 'pivot'", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 150.0, + "IsNullable": false + }, + { + "Name": "Mode", + "Type": { + "Kind": "Enum", + "Values": [ + "Inner", + "Outer", + "First" + ] + }, + "Desc": "Specifies how to unroll multiple pivot columns of different size.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "Inner" + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.SentimentAnalyzer", + "Desc": "Uses a pretrained sentiment model to score input strings", + "FriendlyName": "Sentiment Analyzing Transform", + "ShortName": "Senti", + "Inputs": [ + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column.", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column.", + "Aliases": [ + "dst" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": null + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.SupervisedBinNormalizer", + "Desc": "Similar to BinNormalizer, but calculates bins based on correlation with the label column, not equi-density. The new value is bin_number / number_of_bins.", + "FriendlyName": "Supervised Binning Normalizer", + "ShortName": "SupBin", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "NumBins", + "Type": "Int", + "Desc": "Max number of bins, power of 2 recommended", + "Aliases": [ + "bins" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "FixZero", + "Type": "Bool", + "Desc": "Whether to map zero to zero, preserving sparsity", + "Aliases": [ + "zero" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "LabelColumn", + "Type": "String", + "Desc": "Label column for supervised binning", + "Aliases": [ + "label", + "lab" + ], + "Required": true, + "SortOrder": 150.0, + "IsNullable": false + }, + { + "Name": "MinBinSize", + "Type": "Int", + "Desc": "Minimum number of examples per bin", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 10 + }, + { + "Name": "NumBins", + "Type": "Int", + "Desc": "Max number of bins, power of 2 recommended", + "Aliases": [ + "bins" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1024 + }, + { + "Name": "FixZero", + "Type": "Bool", + "Desc": "Whether to map zero to zero, preserving sparsity", + "Aliases": [ + "zero" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "MaxTrainingExamples", + "Type": "Int", + "Desc": "Max number of examples used to train the normalizer", + "Aliases": [ + "maxtrain" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1000000000 + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.TextFeaturizer", + "Desc": "A transform that turns a collection of text documents into numerical feature vectors. The feature vectors are normalized counts of (word and/or character) ngrams in a given tokenized text.", + "FriendlyName": "Text Transform", + "ShortName": "Text", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + }, + "Desc": "New column definition (optional form: name:srcs).", + "Aliases": [ + "col" + ], + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Language", + "Type": { + "Kind": "Enum", + "Values": [ + "English", + "French", + "German", + "Dutch", + "Italian", + "Spanish", + "Japanese" + ] + }, + "Desc": "Dataset language or 'AutoDetect' to detect language per row.", + "Aliases": [ + "lang" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": "English" + }, + { + "Name": "StopWordsRemover", + "Type": { + "Kind": "Component", + "ComponentKind": "StopWordsRemover" + }, + "Desc": "Stopwords remover.", + "Aliases": [ + "remover" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "TextCase", + "Type": { + "Kind": "Enum", + "Values": [ + "Lower", + "Upper", + "None" + ] + }, + "Desc": "Casing text using the rules of the invariant culture.", + "Aliases": [ + "case" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "Lower" + }, + { + "Name": "KeepDiacritics", + "Type": "Bool", + "Desc": "Whether to keep diacritical marks or remove them.", + "Aliases": [ + "diac" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "KeepPunctuations", + "Type": "Bool", + "Desc": "Whether to keep punctuation marks or remove them.", + "Aliases": [ + "punc" + ], + "Required": false, + "SortOrder": 7.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "KeepNumbers", + "Type": "Bool", + "Desc": "Whether to keep numbers or remove them.", + "Aliases": [ + "num" + ], + "Required": false, + "SortOrder": 8.0, + "IsNullable": false, + "Default": true + }, + { + "Name": "OutputTokens", + "Type": "Bool", + "Desc": "Whether to output the transformed text tokens as an additional column.", + "Aliases": [ + "tokens", + "showtext", + "showTransformedText" + ], + "Required": false, + "SortOrder": 9.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "Dictionary", + "Type": { + "Kind": "Struct", + "Fields": [ + { + "Name": "Term", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "List of terms", + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Sort", + "Type": { + "Kind": "Enum", + "Values": [ + "Occurrence", + "Value" + ] + }, + "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": "Occurrence" + }, + { + "Name": "DropUnknowns", + "Type": "Bool", + "Desc": "Drop unknown terms instead of mapping them to NA term.", + "Aliases": [ + "dropna" + ], + "Required": false, + "SortOrder": 6.0, + "IsNullable": false, + "Default": false + } + ] + }, + "Desc": "A dictionary of whitelisted terms.", + "Aliases": [ + "dict" + ], + "Required": false, + "SortOrder": 10.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "WordFeatureExtractor", + "Type": { + "Kind": "Component", + "ComponentKind": "NgramExtractor" + }, + "Desc": "Ngram feature extractor to use for words (WordBag/WordHashBag).", + "Aliases": [ + "wordExtractor" + ], + "Required": false, + "SortOrder": 11.0, + "IsNullable": false, + "Default": { + "Name": "NGram", + "Settings": { + "MaxNumTerms": [ + 10000000 + ] + } + } + }, + { + "Name": "CharFeatureExtractor", + "Type": { + "Kind": "Component", + "ComponentKind": "NgramExtractor" + }, + "Desc": "Ngram feature extractor to use for characters (WordBag/WordHashBag).", + "Aliases": [ + "charExtractor" + ], + "Required": false, + "SortOrder": 12.0, + "IsNullable": false, + "Default": { + "Name": "NGram", + "Settings": { + "NgramLength": 3, + "AllLengths": false, + "MaxNumTerms": [ + 10000000 + ] + } + } + }, + { + "Name": "VectorNormalizer", + "Type": { + "Kind": "Enum", + "Values": [ + "None", + "L1", + "L2", + "LInf" + ] + }, + "Desc": "Normalize vectors (rows) individually by rescaling them to unit norm.", + "Aliases": [ + "norm" + ], + "Required": false, + "SortOrder": 13.0, + "IsNullable": false, + "Default": "L2" + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.TextToKeyConverter", + "Desc": "Converts input values (words, numbers, etc.) to index in a dictionary.", + "FriendlyName": "Term Transform", + "ShortName": null, + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "MaxNumTerms", + "Type": "Int", + "Desc": "Maximum number of terms to keep when auto-training", + "Aliases": [ + "max" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Term", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "List of terms", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Sort", + "Type": { + "Kind": "Enum", + "Values": [ + "Occurrence", + "Value" + ] + }, + "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "TextKeyValues", + "Type": "Bool", + "Desc": "Whether key value metadata should be text, regardless of the actual input type", + "Aliases": [ + "textkv" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": true, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s) (optional form: name:src)", + "Aliases": [ + "col" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "MaxNumTerms", + "Type": "Int", + "Desc": "Maximum number of terms to keep per column when auto-training", + "Aliases": [ + "max" + ], + "Required": false, + "SortOrder": 5.0, + "IsNullable": false, + "Default": 1000000 + }, + { + "Name": "Term", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "List of terms", + "Required": false, + "SortOrder": 106.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Sort", + "Type": { + "Kind": "Enum", + "Values": [ + "Occurrence", + "Value" + ] + }, + "Desc": "How items should be ordered when vectorized. By default, they will be in the order encountered. If by value items are sorted according to their default comparison, e.g., text sorting will be case sensitive (e.g., 'A' then 'Z' then 'a').", + "Required": false, + "SortOrder": 113.0, + "IsNullable": false, + "Default": "Occurrence" + }, + { + "Name": "TextKeyValues", + "Type": "Bool", + "Desc": "Whether key value metadata should be text, regardless of the actual input type", + "Aliases": [ + "textkv" + ], + "Required": false, + "SortOrder": 114.0, + "IsNullable": false, + "Default": false + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.TrainTestDatasetSplitter", + "Desc": "Split the dataset into train and test sets", + "FriendlyName": "Dataset Train-Test Split", + "ShortName": null, + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "Fraction", + "Type": "Float", + "Desc": "Fraction of training data", + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": 0.8 + }, + { + "Name": "StratificationColumn", + "Type": "String", + "Desc": "Stratification column", + "Aliases": [ + "strat" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": null + } + ], + "Outputs": [ + { + "Name": "TrainData", + "Type": "DataView", + "Desc": "Training data" + }, + { + "Name": "TestData", + "Type": "DataView", + "Desc": "Testing data" + } + ] + }, + { + "Name": "Transforms.TreeLeafFeaturizer", + "Desc": "Trains a tree ensemble, or loads it from a file, then maps a numeric feature vector to three outputs: 1. A vector containing the individual tree outputs of the tree ensemble. 2. A vector indicating the leaves that the feature vector falls on in the tree ensemble. 3. A vector indicating the paths that the feature vector falls on in the tree ensemble. If a both a model file and a trainer are specified - will use the model file. If neither are specified, will train a default FastTree model. This can handle key labels by training a regression model towards their optionally permuted indices.", + "FriendlyName": "Tree Ensemble Featurization Transform", + "ShortName": "TreeFeat", + "Inputs": [ + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "Trainer to use", + "Required": true, + "SortOrder": 10.0, + "IsNullable": false + }, + { + "Name": "Suffix", + "Type": "String", + "Desc": "Output column: The suffix to append to the default column names", + "Aliases": [ + "ex" + ], + "Required": false, + "SortOrder": 101.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "LabelPermutationSeed", + "Type": "Int", + "Desc": "If specified, determines the permutation seed for applying this featurizer to a multiclass problem.", + "Aliases": [ + "lps" + ], + "Required": false, + "SortOrder": 102.0, + "IsNullable": false, + "Default": 0 + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "IFeaturizerInput", + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + }, + { + "Name": "Transforms.TwoHeterogeneousModelCombiner", + "Desc": "Combines a TransformModel and a PredictorModel into a single PredictorModel.", + "FriendlyName": null, + "ShortName": null, + "Inputs": [ + { + "Name": "TransformModel", + "Type": "TransformModel", + "Desc": "Transform model", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "Predictor model", + "Required": true, + "SortOrder": 2.0, + "IsNullable": false + } + ], + "Outputs": [ + { + "Name": "PredictorModel", + "Type": "PredictorModel", + "Desc": "Predictor model" + } + ] + }, + { + "Name": "Transforms.WordTokenizer", + "Desc": "The input to this transform is text, and the output is a vector of text containing the words (tokens) in the original text. The separator is space, but can be specified as any other character (or multiple characters) if needed.", + "FriendlyName": "Tokenize Text Transform", + "ShortName": "TokenizeTextTransform", + "Inputs": [ + { + "Name": "Column", + "Type": { + "Kind": "Array", + "ItemType": { + "Kind": "Struct", + "Fields": [ + { + "Name": "TermSeparators", + "Type": "String", + "Desc": "Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character.", + "Aliases": [ + "sep" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Name", + "Type": "String", + "Desc": "Name of the new column", + "Aliases": [ + "name" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Source", + "Type": "String", + "Desc": "Name of the source column", + "Aliases": [ + "src" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + }, + "Desc": "New column definition(s)", + "Aliases": [ + "col" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": null + }, + { + "Name": "Data", + "Type": "DataView", + "Desc": "Input dataset", + "Required": true, + "SortOrder": 1.0, + "IsNullable": false + }, + { + "Name": "TermSeparators", + "Type": "String", + "Desc": "Comma separated set of term separator(s). Commonly: 'space', 'comma', 'semicolon' or other single character.", + "Aliases": [ + "sep" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "space" + } + ], + "Outputs": [ + { + "Name": "OutputData", + "Type": "DataView", + "Desc": "Transformed dataset" + }, + { + "Name": "Model", + "Type": "TransformModel", + "Desc": "Transform model" + } + ], + "InputKind": [ + "ITransformInput" + ], + "OutputKind": [ + "ITransformOutput" + ] + } + ], + "Components": [ + { + "Kind": "AutoMlEngine", + "Components": [ + { + "Name": "Defaults", + "Desc": "AutoML engine that returns learners with default settings.", + "FriendlyName": "Defaults Engine", + "Settings": [] + }, + { + "Name": "Rocket", + "Desc": "AutoML engine that consists of distinct, hierarchical stages of operation.", + "FriendlyName": "Rocket Engine", + "Settings": [ + { + "Name": "TopKLearners", + "Type": "Int", + "Desc": "Number of learners to retain for second stage.", + "Aliases": [ + "topk" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": 2 + }, + { + "Name": "SecondRoundTrialsPerLearner", + "Type": "Int", + "Desc": "Number of trials for retained second stage learners.", + "Aliases": [ + "stage2num" + ], + "Required": false, + "SortOrder": 2.0, + "IsNullable": false, + "Default": 5 + }, + { + "Name": "RandomInitialization", + "Type": "Bool", + "Desc": "Use random initialization only.", + "Aliases": [ + "randinit" + ], + "Required": false, + "SortOrder": 3.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "NumInitializationPipelines", + "Type": "Int", + "Desc": "Number of initilization pipelines, used for random initialization only.", + "Aliases": [ + "numinitseeds" + ], + "Required": false, + "SortOrder": 4.0, + "IsNullable": false, + "Default": 20 + } + ] + }, + { + "Name": "UniformRandom", + "Desc": "AutoML engine using uniform random sampling.", + "FriendlyName": "Uniform Random Engine", + "Settings": [] + } + ] + }, + { + "Kind": "AutoMlStateBase", + "Components": [ + { + "Name": "AutoMlState", + "Desc": "State of an AutoML search and search space.", + "FriendlyName": "AutoML State", + "Aliases": [ + "automlst" + ], + "Settings": [ + { + "Name": "Metric", + "Type": { + "Kind": "Enum", + "Values": [ + "Auc", + "AccuracyMicro", + "AccuracyMacro", + "L1", + "L2", + "F1", + "AuPrc", + "TopKAccuracy", + "Rms", + "LossFn", + "RSquared", + "LogLoss", + "LogLossReduction", + "Ndcg", + "Dcg", + "PositivePrecision", + "PositiveRecall", + "NegativePrecision", + "NegativeRecall", + "DrAtK", + "DrAtPFpr", + "DrAtNumPos", + "NumAnomalies", + "ThreshAtK", + "ThreshAtP", + "ThreshAtNumPos", + "Nmi", + "AvgMinScore", + "Dbi" + ] + }, + "Desc": "Supported metric for evaluator.", + "Aliases": [ + "metric" + ], + "Required": true, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "Auc" + }, + { + "Name": "Engine", + "Type": { + "Kind": "Component", + "ComponentKind": "AutoMlEngine" + }, + "Desc": "AutoML engine (pipeline optimizer) that generates next candidates.", + "Aliases": [ + "engine" + ], + "Required": true, + "SortOrder": 150.0, + "IsNullable": false + }, + { + "Name": "TrainerKind", + "Type": { + "Kind": "Enum", + "Values": [ + "SignatureBinaryClassifierTrainer", + "SignatureMultiClassClassifierTrainer", + "SignatureRankerTrainer", + "SignatureRegressorTrainer", + "SignatureMultiOutputRegressorTrainer", + "SignatureAnomalyDetectorTrainer", + "SignatureClusteringTrainer" + ] + }, + "Desc": "Kind of trainer for task, such as binary classification trainer, multiclass trainer, etc.", + "Aliases": [ + "tk" + ], + "Required": true, + "SortOrder": 150.0, + "IsNullable": false, + "Default": "SignatureBinaryClassifierTrainer" + }, + { + "Name": "TerminatorArgs", + "Type": { + "Kind": "Component", + "ComponentKind": "SearchTerminator" + }, + "Desc": "Arguments for creating terminator, which determines when to stop search.", + "Aliases": [ + "term" + ], + "Required": true, + "SortOrder": 150.0, + "IsNullable": false + }, + { + "Name": "RequestedLearners", + "Type": { + "Kind": "Array", + "ItemType": "String" + }, + "Desc": "Learner set to sweep over (if available).", + "Aliases": [ + "learners" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": null + } + ] + } + ] + }, + { + "Kind": "BoosterParameterFunction", + "Components": [ + { + "Name": "dart", + "Desc": "Dropouts meet Multiple Additive Regresion Trees. See https://arxiv.org/abs/1505.01866", + "FriendlyName": "Tree Dropout Tree Booster", + "Settings": [ + { + "Name": "DropRate", + "Type": "Float", + "Desc": "Drop ratio for trees. Range:(0,1).", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.1, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "MaxDrop", + "Type": "Int", + "Desc": "Max number of dropped tree in a boosting round.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1, + "Range": { + "Inf": 0, + "Max": 2147483647 + } + }, + { + "Name": "SkipDrop", + "Type": "Float", + "Desc": "Probability for not perform dropping in a boosting round.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.5, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "XgboostDartMode", + "Type": "Bool", + "Desc": "True will enable xgboost dart mode.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "UniformDrop", + "Type": "Bool", + "Desc": "True will enable uniform drop.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "UnbalancedSets", + "Type": "Bool", + "Desc": "Use for binary classification when classes are not balanced.", + "Aliases": [ + "us" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "MinSplitGain", + "Type": "Float", + "Desc": "Minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0, + "Range": { + "Min": 0.0 + } + }, + { + "Name": "MaxDepth", + "Type": "Int", + "Desc": "Maximum depth of a tree. 0 means no limit. However, tree still grows by best-first.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0, + "Range": { + "Max": 2147483647, + "Min": 0 + } + }, + { + "Name": "MinChildWeight", + "Type": "Float", + "Desc": "Minimum sum of instance weight(hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will be.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.1, + "Range": { + "Min": 0.0 + } + }, + { + "Name": "SubsampleFreq", + "Type": "Int", + "Desc": "Subsample frequency. 0 means no subsample. If subsampleFreq > 0, it will use a subset(ratio=subsample) to train. And the subset will be updated on every Subsample iteratinos.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0, + "Range": { + "Max": 2147483647, + "Min": 0 + } + }, + { + "Name": "Subsample", + "Type": "Float", + "Desc": "Subsample ratio of the training instance. Setting it to 0.5 means that LightGBM randomly collected half of the data instances to grow trees and this will prevent overfitting. Range: (0,1].", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "FeatureFraction", + "Type": "Float", + "Desc": "Subsample ratio of columns when constructing each tree. Range: (0,1].", + "Aliases": [ + "ff" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "RegLambda", + "Type": "Float", + "Desc": "L2 regularization term on weights, increasing this value will make model more conservative.", + "Aliases": [ + "l2" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.5, + 1.0 + ] + } + }, + { + "Name": "RegAlpha", + "Type": "Float", + "Desc": "L1 regularization term on weights, increase this value will make model more conservative.", + "Aliases": [ + "l1" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.5, + 1.0 + ] + } + }, + { + "Name": "ScalePosWeight", + "Type": "Float", + "Desc": "Control the balance of positive and negative weights, useful for unbalanced classes. A typical value to consider: sum(negative cases) / sum(positive cases).", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + } + ] + }, + { + "Name": "gbdt", + "Desc": "Traditional Gradient Boosting Decision Tree.", + "FriendlyName": "Tree Booster", + "Settings": [ + { + "Name": "UnbalancedSets", + "Type": "Bool", + "Desc": "Use for binary classification when classes are not balanced.", + "Aliases": [ + "us" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "MinSplitGain", + "Type": "Float", + "Desc": "Minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0, + "Range": { + "Min": 0.0 + } + }, + { + "Name": "MaxDepth", + "Type": "Int", + "Desc": "Maximum depth of a tree. 0 means no limit. However, tree still grows by best-first.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0, + "Range": { + "Max": 2147483647, + "Min": 0 + } + }, + { + "Name": "MinChildWeight", + "Type": "Float", + "Desc": "Minimum sum of instance weight(hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will be.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.1, + "Range": { + "Min": 0.0 + } + }, + { + "Name": "SubsampleFreq", + "Type": "Int", + "Desc": "Subsample frequency. 0 means no subsample. If subsampleFreq > 0, it will use a subset(ratio=subsample) to train. And the subset will be updated on every Subsample iteratinos.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0, + "Range": { + "Max": 2147483647, + "Min": 0 + } + }, + { + "Name": "Subsample", + "Type": "Float", + "Desc": "Subsample ratio of the training instance. Setting it to 0.5 means that LightGBM randomly collected half of the data instances to grow trees and this will prevent overfitting. Range: (0,1].", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "FeatureFraction", + "Type": "Float", + "Desc": "Subsample ratio of columns when constructing each tree. Range: (0,1].", + "Aliases": [ + "ff" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "RegLambda", + "Type": "Float", + "Desc": "L2 regularization term on weights, increasing this value will make model more conservative.", + "Aliases": [ + "l2" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.5, + 1.0 + ] + } + }, + { + "Name": "RegAlpha", + "Type": "Float", + "Desc": "L1 regularization term on weights, increase this value will make model more conservative.", + "Aliases": [ + "l1" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.5, + 1.0 + ] + } + }, + { + "Name": "ScalePosWeight", + "Type": "Float", + "Desc": "Control the balance of positive and negative weights, useful for unbalanced classes. A typical value to consider: sum(negative cases) / sum(positive cases).", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + } + ] + }, + { + "Name": "goss", + "Desc": "Gradient-based One-Side Sampling.", + "FriendlyName": "Gradient-based One-Size Sampling", + "Settings": [ + { + "Name": "TopRate", + "Type": "Float", + "Desc": "Retain ratio for large gradient instances.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.2, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "OtherRate", + "Type": "Float", + "Desc": "Retain ratio for small gradient instances.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.1, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "UnbalancedSets", + "Type": "Bool", + "Desc": "Use for binary classification when classes are not balanced.", + "Aliases": [ + "us" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": false + }, + { + "Name": "MinSplitGain", + "Type": "Float", + "Desc": "Minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0, + "Range": { + "Min": 0.0 + } + }, + { + "Name": "MaxDepth", + "Type": "Int", + "Desc": "Maximum depth of a tree. 0 means no limit. However, tree still grows by best-first.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0, + "Range": { + "Max": 2147483647, + "Min": 0 + } + }, + { + "Name": "MinChildWeight", + "Type": "Float", + "Desc": "Minimum sum of instance weight(hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will be.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.1, + "Range": { + "Min": 0.0 + } + }, + { + "Name": "SubsampleFreq", + "Type": "Int", + "Desc": "Subsample frequency. 0 means no subsample. If subsampleFreq > 0, it will use a subset(ratio=subsample) to train. And the subset will be updated on every Subsample iteratinos.", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0, + "Range": { + "Max": 2147483647, + "Min": 0 + } + }, + { + "Name": "Subsample", + "Type": "Float", + "Desc": "Subsample ratio of the training instance. Setting it to 0.5 means that LightGBM randomly collected half of the data instances to grow trees and this will prevent overfitting. Range: (0,1].", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "FeatureFraction", + "Type": "Float", + "Desc": "Subsample ratio of columns when constructing each tree. Range: (0,1].", + "Aliases": [ + "ff" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0, + "Range": { + "Inf": 0.0, + "Max": 1.0 + } + }, + { + "Name": "RegLambda", + "Type": "Float", + "Desc": "L2 regularization term on weights, increasing this value will make model more conservative.", + "Aliases": [ + "l2" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.5, + 1.0 + ] + } + }, + { + "Name": "RegAlpha", + "Type": "Float", + "Desc": "L1 regularization term on weights, increase this value will make model more conservative.", + "Aliases": [ + "l1" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0, + "Range": { + "Min": 0.0 + }, + "SweepRange": { + "RangeType": "Discrete", + "Values": [ + 0.0, + 0.5, + 1.0 + ] + } + }, + { + "Name": "ScalePosWeight", + "Type": "Float", + "Desc": "Control the balance of positive and negative weights, useful for unbalanced classes. A typical value to consider: sum(negative cases) / sum(positive cases).", + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + } + ] + } + ] + }, + { + "Kind": "CalibratorTrainer", + "Components": [ + { + "Name": "FixedPlattCalibrator", + "Desc": null, + "FriendlyName": "Fixed Platt Calibrator", + "Aliases": [ + "FixedPlatt", + "FixedSigmoid" + ], + "Settings": [ + { + "Name": "Slope", + "Type": "Float", + "Desc": "The slope parameter of f(x) = 1 / (1 + exp(-slope * x + offset)", + "Aliases": [ + "a" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + }, + { + "Name": "Offset", + "Type": "Float", + "Desc": "The offset parameter of f(x) = 1 / (1 + exp(-slope * x + offset)", + "Aliases": [ + "b" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.0 + } + ] + }, + { + "Name": "NaiveCalibrator", + "Desc": null, + "FriendlyName": "Naive Calibrator", + "Aliases": [ + "Naive" + ], + "Settings": [] + }, + { + "Name": "PavCalibrator", + "Desc": null, + "FriendlyName": "PAV Calibrator", + "Aliases": [ + "Pav" + ], + "Settings": [] + }, + { + "Name": "PlattCalibrator", + "Desc": "Platt calibration.", + "FriendlyName": "Platt Calibrator", + "Aliases": [ + "Platt", + "Sigmoid" + ], + "Settings": [] + } + ] + }, + { + "Kind": "ClassificationLossFunction", + "Components": [ + { + "Name": "ExpLoss", + "Desc": "Exponential loss.", + "FriendlyName": "Exponential Loss", + "Settings": [ + { + "Name": "Beta", + "Type": "Float", + "Desc": "Beta (dilation)", + "Aliases": [ + "beta" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + } + ] + }, + { + "Name": "HingeLoss", + "Desc": "Hinge loss.", + "FriendlyName": "Hinge loss", + "Aliases": [ + "Hinge" + ], + "Settings": [ + { + "Name": "Margin", + "Type": "Float", + "Desc": "Margin value", + "Aliases": [ + "marg" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + } + ] + }, + { + "Name": "LogLoss", + "Desc": "Log loss.", + "FriendlyName": "Log loss", + "Aliases": [ + "Logistic", + "CrossEntropy" + ], + "Settings": [] + }, + { + "Name": "SmoothedHingeLoss", + "Desc": "Smoothed Hinge loss.", + "FriendlyName": "Smoothed Hinge Loss", + "Aliases": [ + "SmoothedHinge" + ], + "Settings": [ + { + "Name": "SmoothingConst", + "Type": "Float", + "Desc": "Smoothing constant", + "Aliases": [ + "smooth" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 1.0 + } + ] + } + ] + }, + { + "Kind": "EarlyStoppingCriterion", + "Components": [ + { + "Name": "GL", + "Desc": "Stop in case of loss of generality.", + "FriendlyName": "Loss of Generality (GL)", + "Settings": [ + { + "Name": "Threshold", + "Type": "Float", + "Desc": "Threshold in range [0,1].", + "Aliases": [ + "th" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "Range": { + "Max": 1.0, + "Min": 0.0 + } + } + ] + }, + { + "Name": "LP", + "Desc": "Stops in case of low progress.", + "FriendlyName": "Low Progress (LP)", + "Settings": [ + { + "Name": "Threshold", + "Type": "Float", + "Desc": "Threshold in range [0,1].", + "Aliases": [ + "th" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "Range": { + "Max": 1.0, + "Min": 0.0 + } + }, + { + "Name": "WindowSize", + "Type": "Int", + "Desc": "The window size.", + "Aliases": [ + "w" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 5, + "Range": { + "Inf": 0 + } + } + ] + }, + { + "Name": "PQ", + "Desc": "Stops in case of generality to progress ration exceeds threshold.", + "FriendlyName": "Generality to Progress Ratio (PQ)", + "Settings": [ + { + "Name": "Threshold", + "Type": "Float", + "Desc": "Threshold in range [0,1].", + "Aliases": [ + "th" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "Range": { + "Max": 1.0, + "Min": 0.0 + } + }, + { + "Name": "WindowSize", + "Type": "Int", + "Desc": "The window size.", + "Aliases": [ + "w" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 5, + "Range": { + "Inf": 0 + } + } + ] + }, + { + "Name": "TR", + "Desc": "Stop if validation score exceeds threshold value.", + "FriendlyName": "Tolerant (TR)", + "Settings": [ + { + "Name": "Threshold", + "Type": "Float", + "Desc": "Tolerance threshold. (Non negative value)", + "Aliases": [ + "th" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 0.01, + "Range": { + "Min": 0.0 + } + } + ] + }, + { + "Name": "UP", + "Desc": "Stops in case of consecutive loss in generality.", + "FriendlyName": "Consecutive Loss in Generality (UP)", + "Settings": [ + { + "Name": "WindowSize", + "Type": "Int", + "Desc": "The window size.", + "Aliases": [ + "w" + ], + "Required": false, + "SortOrder": 150.0, + "IsNullable": false, + "Default": 5, + "Range": { + "Inf": 0 + } + } + ] + } + ] + }, + { + "Kind": "EnsembleBinaryDiversityMeasure", + "Components": [ + { + "Name": "DisagreementDiversityMeasure", + "Desc": null, + "FriendlyName": "Disagreement Diversity Measure", + "Settings": [] + } + ] + }, + { + "Kind": "EnsembleBinaryOutputCombiner", + "Components": [ + { + "Name": "Average", + "Desc": null, + "FriendlyName": "Average", + "Settings": [] + }, + { + "Name": "Median", + "Desc": null, + "FriendlyName": "Median", + "Settings": [] + }, + { + "Name": "Stacking", + "Desc": null, + "FriendlyName": "Stacking", + "Settings": [ + { + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", + "Aliases": [ + "vp" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 0.3 + } + ] + }, + { + "Name": "Voting", + "Desc": null, + "FriendlyName": "Voting", + "Settings": [] + }, + { + "Name": "WeightedAverage", + "Desc": null, + "FriendlyName": "Weighted Average", + "Settings": [ + { + "Name": "WeightageName", + "Type": { + "Kind": "Enum", + "Values": [ + "Accuracy", + "Auc", + "PosPrecision", + "PosRecall", + "NegPrecision", + "NegRecall" + ] + }, + "Desc": "The metric type to be used to find the weights for each model", + "Aliases": [ + "wn" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": "Auc" + } + ] + } + ] + }, { - "Kind": "AutoMlEngine", + "Kind": "EnsembleBinarySubModelSelector", "Components": [ { - "Name": "Defaults", - "Desc": "AutoML engine that returns learners with default settings.", - "FriendlyName": "Defaults Engine", + "Name": "AllSelector", + "Desc": null, + "FriendlyName": "All Selector", "Settings": [] }, { - "Name": "Rocket", - "Desc": "AutoML engine that consists of distinct, hierarchical stages of operation.", - "FriendlyName": "Rocket Engine", + "Name": "BestDiverseSelector", + "Desc": null, + "FriendlyName": "Best Diverse Selector", "Settings": [ { - "Name": "TopKLearners", - "Type": "Int", - "Desc": "Number of learners to retain for second stage.", - "Aliases": [ - "topk" - ], - "Required": false, - "SortOrder": 1.0, - "IsNullable": false, - "Default": 2 - }, - { - "Name": "SecondRoundTrialsPerLearner", - "Type": "Int", - "Desc": "Number of trials for retained second stage learners.", + "Name": "DiversityMetricType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleBinaryDiversityMeasure" + }, + "Desc": "The metric type to be used to find the diversity among base learners", "Aliases": [ - "stage2num" + "dm" ], "Required": false, - "SortOrder": 2.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 5 + "Default": { + "Name": "DisagreementDiversityMeasure" + } }, { - "Name": "RandomInitialization", - "Type": "Bool", - "Desc": "Use random initialization only.", + "Name": "LearnersSelectionProportion", + "Type": "Float", + "Desc": "The proportion of best base learners to be selected. The range is 0.0-1.0", "Aliases": [ - "randinit" + "lp" ], "Required": false, - "SortOrder": 3.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": false + "Default": 0.5 }, { - "Name": "NumInitializationPipelines", - "Type": "Int", - "Desc": "Number of initilization pipelines, used for random initialization only.", + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", "Aliases": [ - "numinitseeds" + "vp" ], "Required": false, - "SortOrder": 4.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 20 + "Default": 0.3 } ] }, { - "Name": "UniformRandom", - "Desc": "AutoML engine using uniform random sampling.", - "FriendlyName": "Uniform Random Engine", - "Settings": [] - } - ] - }, - { - "Kind": "AutoMlStateBase", - "Components": [ - { - "Name": "AutoMlState", - "Desc": "State of an AutoML search and search space.", - "FriendlyName": "AutoML State", - "Aliases": [ - "automlst" - ], + "Name": "BestPerformanceSelector", + "Desc": null, + "FriendlyName": "Best Performance Selector", "Settings": [ { - "Name": "Metric", + "Name": "MetricName", "Type": { "Kind": "Enum", "Values": [ + "Accuracy", + "PosPrecName", + "PosRecallName", + "NegPrecName", + "NegRecallName", "Auc", - "AccuracyMicro", - "AccuracyMacro", - "L2", - "F1", - "AuPrc", - "TopKAccuracy", - "Rms", - "LossFn", - "RSquared", "LogLoss", "LogLossReduction", - "Ndcg", - "Dcg", - "PositivePrecision", - "PositiveRecall", - "NegativePrecision", - "NegativeRecall", - "DrAtK", - "DrAtPFpr", - "DrAtNumPos", - "NumAnomalies", - "ThreshAtK", - "ThreshAtP", - "ThreshAtNumPos", - "Nmi", - "AvgMinScore", - "Dbi" + "F1", + "AuPrc" ] }, - "Desc": "Supported metric for evaluator.", + "Desc": "The metric type to be used to find the best performance", "Aliases": [ - "metric" + "mn" ], - "Required": true, - "SortOrder": 150.0, + "Required": false, + "SortOrder": 50.0, "IsNullable": false, "Default": "Auc" }, { - "Name": "Engine", - "Type": { - "Kind": "Component", - "ComponentKind": "AutoMlEngine" - }, - "Desc": "AutoML engine (pipeline optimizer) that generates next candidates.", - "Aliases": [ - "engine" - ], - "Required": true, - "SortOrder": 150.0, - "IsNullable": false - }, - { - "Name": "TrainerKind", - "Type": { - "Kind": "Enum", - "Values": [ - "SignatureBinaryClassifierTrainer", - "SignatureMultiClassClassifierTrainer", - "SignatureRankerTrainer", - "SignatureRegressorTrainer", - "SignatureMultiOutputRegressorTrainer", - "SignatureAnomalyDetectorTrainer", - "SignatureClusteringTrainer" - ] - }, - "Desc": "Kind of trainer for task, such as binary classification trainer, multiclass trainer, etc.", + "Name": "LearnersSelectionProportion", + "Type": "Float", + "Desc": "The proportion of best base learners to be selected. The range is 0.0-1.0", "Aliases": [ - "tk" + "lp" ], - "Required": true, - "SortOrder": 150.0, + "Required": false, + "SortOrder": 50.0, "IsNullable": false, - "Default": "SignatureBinaryClassifierTrainer" + "Default": 0.5 }, { - "Name": "TerminatorArgs", - "Type": { - "Kind": "Component", - "ComponentKind": "SearchTerminator" - }, - "Desc": "Arguments for creating terminator, which determines when to stop search.", + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", "Aliases": [ - "term" + "vp" ], - "Required": true, - "SortOrder": 150.0, - "IsNullable": false - }, + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 0.3 + } + ] + } + ] + }, + { + "Kind": "EnsembleFeatureSelector", + "Components": [ + { + "Name": "AllFeatureSelector", + "Desc": null, + "FriendlyName": "All Feature Selector", + "Settings": [] + }, + { + "Name": "RandomFeatureSelector", + "Desc": null, + "FriendlyName": "Random Feature Selector", + "Settings": [ { - "Name": "RequestedLearners", - "Type": { - "Kind": "Array", - "ItemType": "String" - }, - "Desc": "Learner set to sweep over (if available).", + "Name": "FeaturesSelectionProportion", + "Type": "Float", + "Desc": "The proportion of features to be selected. The range is 0.0-1.0", "Aliases": [ - "learners" + "fp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": null + "Default": 0.8 } ] } ] }, { - "Kind": "CalibratorTrainer", + "Kind": "EnsembleMulticlassDiversityMeasure", "Components": [ { - "Name": "FixedPlattCalibrator", + "Name": "MultiDisagreementDiversityMeasure", "Desc": null, - "FriendlyName": "Fixed Platt Calibrator", - "Aliases": [ - "FixedPlatt", - "FixedSigmoid" - ], + "FriendlyName": "Disagreement Diversity Measure", + "Settings": [] + } + ] + }, + { + "Kind": "EnsembleMulticlassOutputCombiner", + "Components": [ + { + "Name": "MultiAverage", + "Desc": null, + "FriendlyName": "Average", "Settings": [ { - "Name": "Slope", - "Type": "Float", - "Desc": "The slope parameter of f(x) = 1 / (1 + exp(-slope * x + offset)", + "Name": "Normalize", + "Type": "Bool", + "Desc": "Whether to normalize the output of base models before combining them", "Aliases": [ - "a" + "norm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 1.0 - }, + "Default": true + } + ] + }, + { + "Name": "MultiMedian", + "Desc": null, + "FriendlyName": "Median", + "Settings": [ { - "Name": "Offset", - "Type": "Float", - "Desc": "The offset parameter of f(x) = 1 / (1 + exp(-slope * x + offset)", + "Name": "Normalize", + "Type": "Bool", + "Desc": "Whether to normalize the output of base models before combining them", "Aliases": [ - "b" + "norm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 0.0 + "Default": true } ] }, { - "Name": "NaiveCalibrator", + "Name": "MultiStacking", "Desc": null, - "FriendlyName": "Naive Calibrator", - "Aliases": [ - "Naive" - ], - "Settings": [] + "FriendlyName": "Stacking", + "Settings": [ + { + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", + "Aliases": [ + "vp" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 0.3 + } + ] }, { - "Name": "PavCalibrator", + "Name": "MultiVoting", "Desc": null, - "FriendlyName": "PAV Calibrator", - "Aliases": [ - "Pav" - ], + "FriendlyName": "Voting", "Settings": [] }, { - "Name": "PlattCalibrator", - "Desc": "Platt calibration.", - "FriendlyName": "Platt Calibrator", - "Aliases": [ - "Platt", - "Sigmoid" - ], - "Settings": [] + "Name": "MultiWeightedAverage", + "Desc": null, + "FriendlyName": "Multi Weighted Average", + "Settings": [ + { + "Name": "WeightageName", + "Type": { + "Kind": "Enum", + "Values": [ + "AccuracyMicroAvg", + "AccuracyMacroAvg" + ] + }, + "Desc": "The metric type to be used to find the weights for each model", + "Aliases": [ + "wn" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": "AccuracyMicroAvg" + }, + { + "Name": "Normalize", + "Type": "Bool", + "Desc": "Whether to normalize the output of base models before combining them", + "Aliases": [ + "norm" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": true + } + ] } ] }, { - "Kind": "ClassificationLossFunction", + "Kind": "EnsembleMulticlassSubModelSelector", "Components": [ { - "Name": "ExpLoss", - "Desc": "Exponential loss.", - "FriendlyName": "Exponential Loss", + "Name": "AllSelectorMultiClass", + "Desc": null, + "FriendlyName": "All Selector", + "Settings": [] + }, + { + "Name": "BestDiverseSelectorMultiClass", + "Desc": null, + "FriendlyName": "Best Diverse Selector", "Settings": [ { - "Name": "Beta", + "Name": "DiversityMetricType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleMulticlassDiversityMeasure" + }, + "Desc": "The metric type to be used to find the diversity among base learners", + "Aliases": [ + "dm" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": { + "Name": "MultiDisagreementDiversityMeasure" + } + }, + { + "Name": "LearnersSelectionProportion", "Type": "Float", - "Desc": "Beta (dilation)", + "Desc": "The proportion of best base learners to be selected. The range is 0.0-1.0", "Aliases": [ - "beta" + "lp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 1.0 + "Default": 0.5 + }, + { + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", + "Aliases": [ + "vp" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 0.3 } ] }, { - "Name": "HingeLoss", - "Desc": "Hinge loss.", - "FriendlyName": "Hinge loss", - "Aliases": [ - "Hinge" - ], + "Name": "BestPerformanceSelectorMultiClass", + "Desc": null, + "FriendlyName": "Best Performance Selector", "Settings": [ { - "Name": "Margin", + "Name": "MetricName", + "Type": { + "Kind": "Enum", + "Values": [ + "AccuracyMicro", + "AccuracyMacro", + "LogLoss", + "LogLossReduction" + ] + }, + "Desc": "The metric type to be used to find the best performance", + "Aliases": [ + "mn" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": "AccuracyMicro" + }, + { + "Name": "LearnersSelectionProportion", "Type": "Float", - "Desc": "Margin value", + "Desc": "The proportion of best base learners to be selected. The range is 0.0-1.0", "Aliases": [ - "marg" + "lp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 1.0 + "Default": 0.5 + }, + { + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", + "Aliases": [ + "vp" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": 0.3 } ] + } + ] + }, + { + "Kind": "EnsembleRegressionDiversityMeasure", + "Components": [ + { + "Name": "RegressionDisagreementDiversityMeasure", + "Desc": null, + "FriendlyName": "Disagreement Diversity Measure", + "Settings": [] + } + ] + }, + { + "Kind": "EnsembleRegressionOutputCombiner", + "Components": [ + { + "Name": "Average", + "Desc": null, + "FriendlyName": "Average", + "Settings": [] }, { - "Name": "LogLoss", - "Desc": "Log loss.", - "FriendlyName": "Log loss", - "Aliases": [ - "Logistic", - "CrossEntropy" - ], + "Name": "Median", + "Desc": null, + "FriendlyName": "Median", "Settings": [] }, { - "Name": "SmoothedHingeLoss", - "Desc": "Smoothed Hinge loss.", - "FriendlyName": "Smoothed Hinge Loss", - "Aliases": [ - "SmoothedHinge" - ], + "Name": "RegressionStacking", + "Desc": null, + "FriendlyName": "Stacking", "Settings": [ { - "Name": "SmoothingConst", + "Name": "ValidationDatasetProportion", "Type": "Float", - "Desc": "Smoothing constant", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", "Aliases": [ - "smooth" + "vp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 1.0 + "Default": 0.3 } ] } ] }, { - "Kind": "EarlyStoppingCriterion", + "Kind": "EnsembleRegressionSubModelSelector", "Components": [ { - "Name": "GL", - "Desc": "Stop in case of loss of generality.", - "FriendlyName": "Loss of Generality (GL)", + "Name": "AllSelector", + "Desc": null, + "FriendlyName": "All Selector", + "Settings": [] + }, + { + "Name": "BestDiverseSelectorRegression", + "Desc": null, + "FriendlyName": "Best Diverse Selector", "Settings": [ { - "Name": "Threshold", - "Type": "Float", - "Desc": "Threshold in range [0,1].", + "Name": "DiversityMetricType", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleRegressionDiversityMeasure" + }, + "Desc": "The metric type to be used to find the diversity among base learners", "Aliases": [ - "th" + "dm" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 0.01, - "Range": { - "Max": 1.0, - "Min": 0.0 + "Default": { + "Name": "RegressionDisagreementDiversityMeasure" } - } - ] - }, - { - "Name": "LP", - "Desc": "Stops in case of low progress.", - "FriendlyName": "Low Progress (LP)", - "Settings": [ + }, { - "Name": "Threshold", + "Name": "LearnersSelectionProportion", "Type": "Float", - "Desc": "Threshold in range [0,1].", + "Desc": "The proportion of best base learners to be selected. The range is 0.0-1.0", "Aliases": [ - "th" + "lp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 0.01, - "Range": { - "Max": 1.0, - "Min": 0.0 - } + "Default": 0.5 }, { - "Name": "WindowSize", - "Type": "Int", - "Desc": "The window size.", + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", "Aliases": [ - "w" + "vp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 5, - "Range": { - "Inf": 0 - } + "Default": 0.3 } ] }, { - "Name": "PQ", - "Desc": "Stops in case of generality to progress ration exceeds threshold.", - "FriendlyName": "Generality to Progress Ratio (PQ)", + "Name": "BestPerformanceRegressionSelector", + "Desc": null, + "FriendlyName": "Best Performance Selector", "Settings": [ { - "Name": "Threshold", + "Name": "MetricName", + "Type": { + "Kind": "Enum", + "Values": [ + "L1", + "L2", + "Rms", + "Loss", + "RSquared" + ] + }, + "Desc": "The metric type to be used to find the best performance", + "Aliases": [ + "mn" + ], + "Required": false, + "SortOrder": 50.0, + "IsNullable": false, + "Default": "L1" + }, + { + "Name": "LearnersSelectionProportion", "Type": "Float", - "Desc": "Threshold in range [0,1].", + "Desc": "The proportion of best base learners to be selected. The range is 0.0-1.0", "Aliases": [ - "th" + "lp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 0.01, - "Range": { - "Max": 1.0, - "Min": 0.0 - } + "Default": 0.5 }, { - "Name": "WindowSize", - "Type": "Int", - "Desc": "The window size.", + "Name": "ValidationDatasetProportion", + "Type": "Float", + "Desc": "The proportion of instances to be selected to test the individual base learner. If it is 0, it uses training set", "Aliases": [ - "w" + "vp" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 50.0, "IsNullable": false, - "Default": 5, - "Range": { - "Inf": 0 + "Default": 0.3 + } + ] + } + ] + }, + { + "Kind": "EnsembleSubsetSelector", + "Components": [ + { + "Name": "AllInstanceSelector", + "Desc": null, + "FriendlyName": "All Instance Selector", + "Settings": [ + { + "Name": "FeatureSelector", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleFeatureSelector" + }, + "Desc": "The Feature selector", + "Aliases": [ + "fs" + ], + "Required": false, + "SortOrder": 1.0, + "IsNullable": false, + "Default": { + "Name": "AllFeatureSelector" } } ] }, { - "Name": "TR", - "Desc": "Stop if validation score exceeds threshold value.", - "FriendlyName": "Tolerant (TR)", + "Name": "BootstrapSelector", + "Desc": null, + "FriendlyName": "Bootstrap Selector", "Settings": [ { - "Name": "Threshold", - "Type": "Float", - "Desc": "Tolerance threshold. (Non negative value)", + "Name": "FeatureSelector", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleFeatureSelector" + }, + "Desc": "The Feature selector", "Aliases": [ - "th" + "fs" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 1.0, "IsNullable": false, - "Default": 0.01, - "Range": { - "Min": 0.0 + "Default": { + "Name": "AllFeatureSelector" } } ] }, { - "Name": "UP", - "Desc": "Stops in case of consecutive loss in generality.", - "FriendlyName": "Consecutive Loss in Generality (UP)", + "Name": "RandomPartitionSelector", + "Desc": null, + "FriendlyName": "Random Partition Selector", "Settings": [ { - "Name": "WindowSize", - "Type": "Int", - "Desc": "The window size.", + "Name": "FeatureSelector", + "Type": { + "Kind": "Component", + "ComponentKind": "EnsembleFeatureSelector" + }, + "Desc": "The Feature selector", "Aliases": [ - "w" + "fs" ], "Required": false, - "SortOrder": 150.0, + "SortOrder": 1.0, "IsNullable": false, - "Default": 5, - "Range": { - "Inf": 0 + "Default": { + "Name": "AllFeatureSelector" } } ] @@ -18414,7 +23292,7 @@ { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -19308,7 +24186,7 @@ { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -20283,7 +25161,7 @@ { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -21165,7 +26043,7 @@ { "Name": "NumTrees", "Type": "Int", - "Desc": "Number of weak hypotheses in the ensemble", + "Desc": "Total number of decision trees to create in the ensemble", "Aliases": [ "iter" ], @@ -22227,6 +27105,17 @@ } ] }, + { + "Kind": "ParallelLightGBM", + "Components": [ + { + "Name": "Single", + "Desc": "Single node machine learning process.", + "FriendlyName": "Single", + "Settings": [] + } + ] + }, { "Kind": "ParallelTraining", "Components": [ diff --git a/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationFastTreeSaveModelToOnnxTest.json b/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationFastTreeSaveModelToOnnxTest.json new file mode 100644 index 0000000000..920aa1d728 --- /dev/null +++ b/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationFastTreeSaveModelToOnnxTest.json @@ -0,0 +1,542 @@ +{ + "irVersion": "3", + "producerName": "ML.NET", + "producerVersion": "##VERSION##", + "domain": "Onnx", + "graph": { + "node": [ + { + "input": [ + "F1" + ], + "output": [ + "F10" + ], + "name": "Imputer", + "opType": "Imputer", + "attribute": [ + { + "name": "replaced_value_float", + "f": "NaN", + "type": "FLOAT" + }, + { + "name": "imputed_value_floats", + "floats": [ + 0 + ], + "type": "FLOATS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "F10" + ], + "output": [ + "F11" + ], + "name": "Scaler", + "opType": "Scaler", + "attribute": [ + { + "name": "offset", + "floats": [ + 0 + ], + "type": "FLOATS" + }, + { + "name": "scale", + "floats": [ + 0.1 + ], + "type": "FLOATS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "F2" + ], + "output": [ + "F20" + ], + "name": "LabelEncoder", + "opType": "LabelEncoder", + "attribute": [ + { + "name": "classes_strings", + "strings": [ + "NA==", + "MQ==", + "OA==", + "MTA=", + "Mg==", + "Mw==", + "Nw==", + "NQ==", + "Ng==", + "OQ==" + ], + "type": "STRINGS" + }, + { + "name": "default_int64", + "i": "-1", + "type": "INT" + }, + { + "name": "default_string", + "s": "IA==", + "type": "STRING" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "F20" + ], + "output": [ + "F21" + ], + "name": "OneHotEncoder", + "opType": "OneHotEncoder", + "attribute": [ + { + "name": "cats_int64s", + "ints": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10" + ], + "type": "INTS" + }, + { + "name": "zeros", + "i": "1", + "type": "INT" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "F11", + "F21" + ], + "output": [ + "Features" + ], + "name": "FeatureVectorizer", + "opType": "FeatureVectorizer", + "attribute": [ + { + "name": "inputdimensions", + "ints": [ + "1", + "10" + ], + "type": "INTS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "Features" + ], + "output": [ + "Score" + ], + "name": "TreeEnsembleRegressor", + "opType": "TreeEnsembleRegressor", + "attribute": [ + { + "name": "post_transform", + "s": "Tk9ORQ==", + "type": "STRING" + }, + { + "name": "n_targets", + "i": "1", + "type": "INT" + }, + { + "name": "base_values", + "floats": [ + 0 + ], + "type": "FLOATS" + }, + { + "name": "aggregate_function", + "s": "U1VN", + "type": "STRING" + }, + { + "name": "nodes_treeids", + "ints": [ + "0", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_nodeids", + "ints": [ + "0", + "1", + "2" + ], + "type": "INTS" + }, + { + "name": "nodes_featureids", + "ints": [ + "2", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_modes", + "strings": [ + "QlJBTkNIX0xFUQ==", + "TEVBRg==", + "TEVBRg==" + ], + "type": "STRINGS" + }, + { + "name": "nodes_values", + "floats": [ + 0.5, + 0, + 0 + ], + "type": "FLOATS" + }, + { + "name": "nodes_truenodeids", + "ints": [ + "1", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_falsenodeids", + "ints": [ + "2", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_missing_value_tracks_true", + "ints": [ + "0", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "target_treeids", + "ints": [ + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "target_nodeids", + "ints": [ + "1", + "2" + ], + "type": "INTS" + }, + { + "name": "target_ids", + "ints": [ + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "target_weights", + "floats": [ + 0.504761934, + -0.979112267 + ], + "type": "FLOATS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "Score" + ], + "output": [ + "linearOutput" + ], + "name": "Affine", + "opType": "Affine", + "attribute": [ + { + "name": "alpha", + "f": 0.4, + "type": "FLOAT" + }, + { + "name": "beta", + "f": -1E-07, + "type": "FLOAT" + } + ] + }, + { + "input": [ + "linearOutput" + ], + "output": [ + "Probability" + ], + "name": "Sigmoid", + "opType": "Sigmoid" + }, + { + "input": [ + "Probability" + ], + "output": [ + "PredictedLabel" + ], + "name": "Binarizer", + "opType": "Binarizer", + "attribute": [ + { + "name": "threshold", + "f": 0.5, + "type": "FLOAT" + } + ], + "domain": "ai.onnx.ml" + } + ], + "name": "BinaryClassificationFastTreeSaveModelToOnnxTest", + "input": [ + { + "name": "F1", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "F2", + "type": { + "tensorType": { + "elemType": "STRING", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + } + ], + "output": [ + { + "name": "PredictedLabel", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "Score", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "Probability", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + } + ], + "valueInfo": [ + { + "name": "F10", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "F11", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "F20", + "type": { + "tensorType": { + "elemType": "INT64", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "F21", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "10" + } + ] + } + } + } + }, + { + "name": "Features", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "11" + } + ] + } + } + } + } + ] + }, + "opsetImport": [ + { + "domain": "ai.onnx.ml", + "version": "1" + }, + { + "version": "7" + } + ] +} \ No newline at end of file diff --git a/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationLRSaveModelToOnnxTest.json b/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationLRSaveModelToOnnxTest.json new file mode 100644 index 0000000000..92d9816c37 --- /dev/null +++ b/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationLRSaveModelToOnnxTest.json @@ -0,0 +1,254 @@ +{ + "irVersion": "3", + "producerName": "ML.NET", + "producerVersion": "##VERSION##", + "domain": "Onnx", + "graph": { + "node": [ + { + "input": [ + "Features" + ], + "output": [ + "Features0" + ], + "name": "Scaler", + "opType": "Scaler", + "attribute": [ + { + "name": "offset", + "floats": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "type": "FLOATS" + }, + { + "name": "scale", + "floats": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + "type": "FLOATS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "Features0" + ], + "output": [ + "Score" + ], + "name": "LinearRegressor", + "opType": "LinearRegressor", + "attribute": [ + { + "name": "post_transform", + "s": "Tk9ORQ==", + "type": "STRING" + }, + { + "name": "targets", + "i": "1", + "type": "INT" + }, + { + "name": "coefficients", + "floats": [ + 2.6596148, + 1.67937, + 1.94177353, + 1.42409551, + 0.852847636, + 2.93048549, + 1.74959826, + 1.58030283, + 0.5948697 + ], + "type": "FLOATS" + }, + { + "name": "intercepts", + "floats": [ + -6.183617 + ], + "type": "FLOATS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "Score" + ], + "output": [ + "linearOutput" + ], + "name": "Affine", + "opType": "Affine", + "attribute": [ + { + "name": "alpha", + "f": 1, + "type": "FLOAT" + }, + { + "name": "beta", + "f": -1E-07, + "type": "FLOAT" + } + ] + }, + { + "input": [ + "linearOutput" + ], + "output": [ + "Probability" + ], + "name": "Sigmoid", + "opType": "Sigmoid" + }, + { + "input": [ + "Probability" + ], + "output": [ + "PredictedLabel" + ], + "name": "Binarizer", + "opType": "Binarizer", + "attribute": [ + { + "name": "threshold", + "f": 0.5, + "type": "FLOAT" + } + ], + "domain": "ai.onnx.ml" + } + ], + "name": "BinaryClassificationLRSaveModelToOnnxTest", + "input": [ + { + "name": "Features", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "9" + } + ] + } + } + } + } + ], + "output": [ + { + "name": "PredictedLabel", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "Score", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "Probability", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + } + ], + "valueInfo": [ + { + "name": "Features0", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "9" + } + ] + } + } + } + } + ] + }, + "opsetImport": [ + { + "domain": "ai.onnx.ml", + "version": "1" + }, + { + "version": "7" + } + ] +} \ No newline at end of file diff --git a/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationLightGBMSaveModelToOnnxTest.json b/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationLightGBMSaveModelToOnnxTest.json new file mode 100644 index 0000000000..3989a39903 --- /dev/null +++ b/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/BinaryClassificationLightGBMSaveModelToOnnxTest.json @@ -0,0 +1,285 @@ +{ + "irVersion": "3", + "producerName": "ML.NET", + "producerVersion": "##VERSION##", + "domain": "Onnx", + "graph": { + "node": [ + { + "input": [ + "Features" + ], + "output": [ + "Score" + ], + "name": "TreeEnsembleRegressor", + "opType": "TreeEnsembleRegressor", + "attribute": [ + { + "name": "post_transform", + "s": "Tk9ORQ==", + "type": "STRING" + }, + { + "name": "n_targets", + "i": "1", + "type": "INT" + }, + { + "name": "base_values", + "floats": [ + 0 + ], + "type": "FLOATS" + }, + { + "name": "aggregate_function", + "s": "U1VN", + "type": "STRING" + }, + { + "name": "nodes_treeids", + "ints": [ + "0", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_nodeids", + "ints": [ + "0", + "1", + "2" + ], + "type": "INTS" + }, + { + "name": "nodes_featureids", + "ints": [ + "1", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_modes", + "strings": [ + "QlJBTkNIX0xFUQ==", + "TEVBRg==", + "TEVBRg==" + ], + "type": "STRINGS" + }, + { + "name": "nodes_values", + "floats": [ + 2.5, + 0, + 0 + ], + "type": "FLOATS" + }, + { + "name": "nodes_truenodeids", + "ints": [ + "1", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_falsenodeids", + "ints": [ + "2", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "nodes_missing_value_tracks_true", + "ints": [ + "0", + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "target_treeids", + "ints": [ + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "target_nodeids", + "ints": [ + "1", + "2" + ], + "type": "INTS" + }, + { + "name": "target_ids", + "ints": [ + "0", + "0" + ], + "type": "INTS" + }, + { + "name": "target_weights", + "floats": [ + -1.799208, + -0.34535858 + ], + "type": "FLOATS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "Score" + ], + "output": [ + "linearOutput" + ], + "name": "Affine", + "opType": "Affine", + "attribute": [ + { + "name": "alpha", + "f": 0.5, + "type": "FLOAT" + }, + { + "name": "beta", + "f": -1E-07, + "type": "FLOAT" + } + ] + }, + { + "input": [ + "linearOutput" + ], + "output": [ + "Probability" + ], + "name": "Sigmoid", + "opType": "Sigmoid" + }, + { + "input": [ + "Probability" + ], + "output": [ + "PredictedLabel" + ], + "name": "Binarizer", + "opType": "Binarizer", + "attribute": [ + { + "name": "threshold", + "f": 0.5, + "type": "FLOAT" + } + ], + "domain": "ai.onnx.ml" + } + ], + "name": "BinaryClassificationLightGBMSaveModelToOnnxTest", + "input": [ + { + "name": "Features", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "9" + } + ] + } + } + } + } + ], + "output": [ + { + "name": "PredictedLabel", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "Score", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "Probability", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + } + ] + }, + "opsetImport": [ + { + "domain": "ai.onnx.ml", + "version": "1" + }, + { + "version": "7" + } + ] +} \ No newline at end of file diff --git a/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/SaveModelToOnnxTest.json b/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/SaveModelToOnnxTest.json deleted file mode 100644 index 3afd6dc171..0000000000 --- a/test/BaselineOutput/Common/Onnx/BinaryClassification/BreastCancer/SaveModelToOnnxTest.json +++ /dev/null @@ -1,716 +0,0 @@ -{ - "irVersion": "3", - "producerName": "ML.NET", - "producerVersion": "0.2.0.0000", - "domain": "Onnx", - "graph": { - "node": [ - { - "input": [ - "Features" - ], - "output": [ - "Score" - ], - "name": "TreeEnsembleRegressor", - "opType": "TreeEnsembleRegressor", - "attribute": [ - { - "name": "post_transform", - "s": "Tk9ORQ==", - "type": "STRING" - }, - { - "name": "n_targets", - "i": "1", - "type": "INT" - }, - { - "name": "base_values", - "floats": [ - 0 - ], - "type": "FLOATS" - }, - { - "name": "aggregate_function", - "s": "U1VN", - "type": "STRING" - }, - { - "name": "nodes_treeids", - "ints": [ - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "1", - "1", - "1", - "1", - "1", - "1", - "1", - "1", - "1", - "2", - "2", - "2", - "2", - "2", - "2", - "2", - "2", - "2", - "3", - "3", - "3", - "3", - "3", - "3", - "3", - "3", - "3", - "4", - "4", - "4", - "4", - "4", - "4", - "4", - "4", - "4" - ], - "type": "INTS" - }, - { - "name": "nodes_nodeids", - "ints": [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8" - ], - "type": "INTS" - }, - { - "name": "nodes_featureids", - "ints": [ - "1", - "2", - "5", - "0", - "0", - "0", - "0", - "0", - "0", - "1", - "5", - "2", - "0", - "0", - "0", - "0", - "0", - "0", - "1", - "5", - "2", - "0", - "0", - "0", - "0", - "0", - "0", - "2", - "6", - "5", - "1", - "0", - "0", - "0", - "0", - "0", - "1", - "5", - "0", - "1", - "0", - "0", - "0", - "0", - "0" - ], - "type": "INTS" - }, - { - "name": "nodes_modes", - "strings": [ - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "QlJBTkNIX0xFUQ==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==", - "TEVBRg==" - ], - "type": "STRINGS" - }, - { - "name": "nodes_values", - "floats": [ - 2.5, - 2.5, - 5.5, - 5.5, - 0, - 0, - 0, - 0, - 0, - 3.5, - 3.5, - 1.5, - 3.5, - 0, - 0, - 0, - 0, - 0, - 3.5, - 2.5, - 2.5, - 5.5, - 0, - 0, - 0, - 0, - 0, - 3.5, - 3.5, - 2.5, - 4.5, - 0, - 0, - 0, - 0, - 0, - 2.5, - 1.5, - 6.5, - 5.5, - 0, - 0, - 0, - 0, - 0 - ], - "type": "FLOATS" - }, - { - "name": "nodes_truenodeids", - "ints": [ - "2", - "3", - "4", - "5", - "0", - "0", - "0", - "0", - "0", - "1", - "4", - "3", - "6", - "0", - "0", - "0", - "0", - "0", - "1", - "4", - "3", - "6", - "0", - "0", - "0", - "0", - "0", - "1", - "4", - "6", - "5", - "0", - "0", - "0", - "0", - "0", - "2", - "3", - "4", - "5", - "0", - "0", - "0", - "0", - "0" - ], - "type": "INTS" - }, - { - "name": "nodes_falsenodeids", - "ints": [ - "1", - "6", - "7", - "8", - "0", - "0", - "0", - "0", - "0", - "5", - "2", - "7", - "8", - "0", - "0", - "0", - "0", - "0", - "5", - "2", - "7", - "8", - "0", - "0", - "0", - "0", - "0", - "3", - "2", - "7", - "8", - "0", - "0", - "0", - "0", - "0", - "1", - "6", - "7", - "8", - "0", - "0", - "0", - "0", - "0" - ], - "type": "INTS" - }, - { - "name": "nodes_missing_value_tracks_true", - "ints": [ - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ], - "type": "INTS" - }, - { - "name": "target_treeids", - "ints": [ - "0", - "0", - "0", - "0", - "0", - "1", - "1", - "1", - "1", - "1", - "2", - "2", - "2", - "2", - "2", - "3", - "3", - "3", - "3", - "3", - "4", - "4", - "4", - "4", - "4" - ], - "type": "INTS" - }, - { - "name": "target_nodeids", - "ints": [ - "4", - "5", - "6", - "7", - "8", - "4", - "5", - "6", - "7", - "8", - "4", - "5", - "6", - "7", - "8", - "4", - "5", - "6", - "7", - "8", - "4", - "5", - "6", - "7", - "8" - ], - "type": "INTS" - }, - { - "name": "target_ids", - "ints": [ - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ], - "type": "INTS" - }, - { - "name": "target_weights", - "floats": [ - -0.9755501, - -0.8947368, - 0.8347107, - 0.75, - 1, - -0.8157646, - 0.75331986, - -0.8725711, - 0.6149202, - 1.05311215, - -0.739901066, - 0.65209645, - -0.618561566, - 0.6576947, - 0.7696665, - -0.663163662, - 0.229835972, - -0.49779135, - 0.670133352, - 0.660453737, - -0.620322645, - -0.634804964, - 0.513690054, - 0.650555968, - 0.6567067 - ], - "type": "FLOATS" - } - ], - "domain": "ai.onnx.ml" - }, - { - "input": [ - "Score" - ], - "output": [ - "linearOutput" - ], - "name": "Affine", - "opType": "Affine", - "attribute": [ - { - "name": "alpha", - "f": 0.4, - "type": "FLOAT" - }, - { - "name": "beta", - "f": -1E-07, - "type": "FLOAT" - } - ], - "domain": "ai.onnx" - }, - { - "input": [ - "linearOutput" - ], - "output": [ - "Probability" - ], - "name": "Sigmoid", - "opType": "Sigmoid", - "domain": "ai.onnx" - }, - { - "input": [ - "Probability" - ], - "output": [ - "PredictedLabel" - ], - "name": "Binarizer", - "opType": "Binarizer", - "attribute": [ - { - "name": "threshold", - "f": 0.5, - "type": "FLOAT" - } - ], - "domain": "ai.onnx.ml" - } - ], - "name": "SaveModelToOnnxTest", - "input": [ - { - "name": "Features", - "type": { - "tensorType": { - "elemType": "FLOAT", - "shape": { - "dim": [ - { - "dimValue": "1" - }, - { - "dimValue": "9" - } - ] - } - } - } - } - ], - "output": [ - { - "name": "PredictedLabel", - "type": { - "tensorType": { - "elemType": "FLOAT", - "shape": { - "dim": [ - { - "dimValue": "1" - }, - { - "dimValue": "1" - } - ] - } - } - } - }, - { - "name": "Score", - "type": { - "tensorType": { - "elemType": "FLOAT", - "shape": { - "dim": [ - { - "dimValue": "1" - }, - { - "dimValue": "1" - } - ] - } - } - } - }, - { - "name": "Probability", - "type": { - "tensorType": { - "elemType": "FLOAT", - "shape": { - "dim": [ - { - "dimValue": "1" - }, - { - "dimValue": "1" - } - ] - } - } - } - } - ] - }, - "opsetImport": [ - { - "domain": "ai.onnx.ml", - "version": "1" - }, - { - "domain": "ai.onnx", - "version": "6" - } - ] -} \ No newline at end of file diff --git a/test/BaselineOutput/Common/Onnx/MultiClassClassification/BreastCancer/MultiClassificationLRSaveModelToOnnxTest.json b/test/BaselineOutput/Common/Onnx/MultiClassClassification/BreastCancer/MultiClassificationLRSaveModelToOnnxTest.json new file mode 100644 index 0000000000..b21412a2bb --- /dev/null +++ b/test/BaselineOutput/Common/Onnx/MultiClassClassification/BreastCancer/MultiClassificationLRSaveModelToOnnxTest.json @@ -0,0 +1,205 @@ +{ + "irVersion": "3", + "producerName": "ML.NET", + "producerVersion": "##VERSION##", + "domain": "Onnx", + "graph": { + "node": [ + { + "input": [ + "Features" + ], + "output": [ + "Features0" + ], + "name": "Scaler", + "opType": "Scaler", + "attribute": [ + { + "name": "offset", + "floats": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "type": "FLOATS" + }, + { + "name": "scale", + "floats": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + "type": "FLOATS" + } + ], + "domain": "ai.onnx.ml" + }, + { + "input": [ + "Features0" + ], + "output": [ + "PredictedLabel", + "Score" + ], + "name": "LinearClassifier", + "opType": "LinearClassifier", + "attribute": [ + { + "name": "post_transform", + "s": "Tk9ORQ==", + "type": "STRING" + }, + { + "name": "multi_class", + "i": "1", + "type": "INT" + }, + { + "name": "coefficients", + "floats": [ + -1.58059466, + -0.82541883, + -1.05039084, + -0.792811334, + -0.385914773, + -1.59029973, + -1.01633251, + -0.8349969, + -0.3322066, + 1.58059633, + 0.8254174, + 1.05039155, + 0.7928113, + 0.385914057, + 1.59029937, + 1.01633251, + 0.8349978, + 0.332206637 + ], + "type": "FLOATS" + }, + { + "name": "intercepts", + "floats": [ + 3.36230779, + -3.36230469 + ], + "type": "FLOATS" + }, + { + "name": "classlabels_ints", + "ints": [ + "0", + "1" + ], + "type": "INTS" + } + ], + "domain": "ai.onnx.ml" + } + ], + "name": "MultiClassificationLRSaveModelToOnnxTest", + "input": [ + { + "name": "Features", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "9" + } + ] + } + } + } + } + ], + "output": [ + { + "name": "PredictedLabel", + "type": { + "tensorType": { + "elemType": "INT64", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "1" + } + ] + } + } + } + }, + { + "name": "Score", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "2" + } + ] + } + } + } + } + ], + "valueInfo": [ + { + "name": "Features0", + "type": { + "tensorType": { + "elemType": "FLOAT", + "shape": { + "dim": [ + { + "dimValue": "1" + }, + { + "dimValue": "9" + } + ] + } + } + } + } + ] + }, + "opsetImport": [ + { + "domain": "ai.onnx.ml", + "version": "1" + }, + { + "version": "7" + } + ] +} \ No newline at end of file diff --git a/test/BaselineOutput/SingleDebug/Command/CommandCrossValidationKeyLabelWithFloatKeyValues-out.txt b/test/BaselineOutput/SingleDebug/Command/CommandCrossValidationKeyLabelWithFloatKeyValues-out.txt new file mode 100644 index 0000000000..3608e165c9 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/Command/CommandCrossValidationKeyLabelWithFloatKeyValues-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=FastRankRanking{t=1} strat=Strat threads=- norm=Warn prexf=rangefilter{col=Label min=20 max=25} prexf=term{col=Strat:Label} dout=%Output% loader=text{col=Features:R4:10-14 col=Label:R4:9 col=GroupId:TX:1 header+} data=%Data% out=%Output% xf=term{col=Label} xf=hash{col=GroupId} +Not adding a normalizer. +Making per-feature arrays +Changing data from row-wise to column-wise +Processed 40 instances +Binning and forming Feature objects +Reserved memory for tree learner: 10764 bytes +Starting to train ... +Not training a calibrator because it is not needed. +Not adding a normalizer. +Making per-feature arrays +Changing data from row-wise to column-wise +Processed 32 instances +Binning and forming Feature objects +Reserved memory for tree learner: 6396 bytes +Starting to train ... +Not training a calibrator because it is not needed. +NDCG@1: 0.000000 +NDCG@2: 0.000000 +NDCG@3: 0.000000 +DCG@1: 0.000000 +DCG@2: 0.000000 +DCG@3: 0.000000 +NDCG@1: 0.000000 +NDCG@2: 0.000000 +NDCG@3: 0.000000 +DCG@1: 0.000000 +DCG@2: 0.000000 +DCG@3: 0.000000 + +OVERALL RESULTS +--------------------------------------- +NDCG@1: 0.000000 (0.0000) +NDCG@2: 0.000000 (0.0000) +NDCG@3: 0.000000 (0.0000) +DCG@1: 0.000000 (0.0000) +DCG@2: 0.000000 (0.0000) +DCG@3: 0.000000 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + diff --git a/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-out.txt b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-out.txt new file mode 100644 index 0000000000..d05c1b0b1c --- /dev/null +++ b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-out.txt @@ -0,0 +1,77 @@ +maml.exe CV tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures threads=- norm=No dout=%Output% data=%Data% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} +Not adding a normalizer. +Warning: Skipped 8 examples with bad label/weight/features in training set +Not training a calibrator because it is not needed. +Not adding a normalizer. +Warning: Skipped 8 examples with bad label/weight/features in training set +Not training a calibrator because it is not needed. +Warning: The predictor produced non-finite prediction values on 8 instances during testing. Possible causes: abnormal data or the predictor is numerically unstable. +TEST POSITIVE RATIO: 0.3785 (134.0/(134.0+220.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 122 | 12 | 0.9104 + negative || 4 | 216 | 0.9818 + ||====================== +Precision || 0.9683 | 0.9474 | +OVERALL 0/1 ACCURACY: 0.954802 +LOG LOSS/instance: 0.259660 +Test-set entropy (prior Log-Loss/instance): 0.956998 +LOG-LOSS REDUCTION (RIG): 72.867233 +AUC: 0.984973 +Warning: The predictor produced non-finite prediction values on 8 instances during testing. Possible causes: abnormal data or the predictor is numerically unstable. +TEST POSITIVE RATIO: 0.3191 (105.0/(105.0+224.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 92 | 13 | 0.8762 + negative || 2 | 222 | 0.9911 + ||====================== +Precision || 0.9787 | 0.9447 | +OVERALL 0/1 ACCURACY: 0.954407 +LOG LOSS/instance: 0.260480 +Test-set entropy (prior Log-Loss/instance): 0.903454 +LOG-LOSS REDUCTION (RIG): 71.168362 +AUC: 0.967049 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.976011 (0.0090) +Accuracy: 0.954605 (0.0002) +Positive precision: 0.973489 (0.0052) +Positive recall: 0.893319 (0.0171) +Negative precision: 0.946025 (0.0013) +Negative recall: 0.986445 (0.0046) +Log-loss: 0.260070 (0.0004) +Log-loss reduction: 72.017798 (0.8494) +F1 Score: 0.931542 (0.0069) +AUPRC: 0.974115 (0.0054) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Normalize' started. +[1] (%Time%) 337 examples +[1] 'Normalize' finished in %Time%. +[2] 'Training' started. +[2] (%Time%) 1 iterations, 329 examples Training-loss: 0.371414389819699 +[2] (%Time%) 2 iterations, 329 examples Training-loss: 0.225137821503565 +[2] (%Time%) 3 iterations, 329 examples Training-loss: 0.197323119398265 +[2] (%Time%) 4 iterations, 329 examples Training-loss: 0.183649426646222 +[2] (%Time%) 5 iterations, 329 examples Training-loss: 0.174400635825405 +[2] 'Training' finished in %Time%. +[3] 'Normalize #2' started. +[3] (%Time%) 362 examples +[3] 'Normalize #2' finished in %Time%. +[4] 'Training #2' started. +[4] (%Time%) 1 iterations, 354 examples Training-loss: 0.35872800705401 +[4] (%Time%) 2 iterations, 354 examples Training-loss: 0.239609312114266 +[4] (%Time%) 3 iterations, 354 examples Training-loss: 0.210775498912242 +[4] (%Time%) 4 iterations, 354 examples Training-loss: 0.19625903089058 +[4] (%Time%) 5 iterations, 354 examples Training-loss: 0.187121580244397 +[4] 'Training #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-rp.txt b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-rp.txt new file mode 100644 index 0000000000..b826c5ae0d --- /dev/null +++ b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-rp.txt @@ -0,0 +1,4 @@ +FieldAwareFactorizationMachine +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /d /norm /shuf Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.976011 0.954605 0.973489 0.893319 0.946025 0.986445 0.26007 72.0178 0.931542 0.974115 5 - - FieldAwareFactorizationMachine %Data% %Output% 99 0 0 maml.exe CV tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures threads=- norm=No dout=%Output% data=%Data% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} /d:5;/norm:-;/shuf:- + diff --git a/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer.txt b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer.txt new file mode 100644 index 0000000000..c1977a346f --- /dev/null +++ b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +5 1 14.8638926 0.999999642 5.1594804484713121E-07 1 +6 0 -0.8998656 0.289078116 0.49223705031518167 0 +8 0 -2.48059678 0.0772296637 0.11595646754997578 0 +9 0 -2.373167 0.08524186 0.12853774899383463 0 +10 0 -1.8267622 0.138624445 0.2152857123445632 0 +11 0 -2.03787947 0.115282834 0.17671177846463382 0 +18 1 5.347374 0.9952619 0.0068518676812505449 1 +20 1 2.93836784 0.949710846 0.074439765251190851 1 +21 1 4.537781 0.989416063 0.015350773539417332 1 +25 1 0.214011192 0.5532995 0.85386750966876357 1 +28 0 -2.03787947 0.115282834 0.17671177846463382 0 +31 0 -2.22085452 0.09789331 0.14863003134088387 0 +32 1 2.94516468 0.9500345 0.073948191048563552 1 +35 0 -2.03787947 0.115282834 0.17671177846463382 0 +37 0 -3.201078 0.039125178 0.057579598806254788 0 +40 0 +41 1 -1.51869583 0.179653645 2.476709891872058 0 +44 1 6.41933727 0.9983729 0.0023493029812132662 1 +45 0 -2.01876 0.117247269 0.17991871486127162 0 +46 1 5.507395 0.9959597 0.005840729107190099 1 +48 0 -2.64206457 0.0664797947 0.099246846085645518 0 +50 1 -0.7729988 0.315830767 1.6627763744194746 0 +51 1 -1.07958174 0.2535852 1.9794576062795608 0 +52 1 1.92737579 0.87295866 0.196014759754012 1 +54 1 2.360999 0.9138046 0.13004240462108896 1 +56 1 6.64605141 0.9987025 0.0018730745676176913 1 +60 1 0.586817265 0.6426345 0.6379296358599772 1 +63 1 -1.3297224 0.209205285 2.2570087990606815 0 +64 0 -1.85676885 0.135080114 0.20936158691636991 0 +66 0 -2.56239128 0.0715984255 0.10717912551116054 0 +68 1 6.963379 0.999054968 0.0013640370953882713 1 +69 0 -2.07254 0.111794561 0.1710346893319066 0 +70 0 -2.4900763 0.0765568 0.11490487237984263 0 +71 1 2.84816265 0.94522357 0.081272490426858024 1 +72 0 -2.398419 0.08329334 0.12546794171530753 0 +73 1 7.05520535 0.999137759 0.0012444871146033098 1 +74 1 -1.02989769 0.263103932 1.926295284848996 0 +76 0 -1.87518346 0.1329431 0.20580141213002087 0 +77 0 -2.51152325 0.0750542954 0.11255941460668487 0 +79 0 -2.256354 0.09480278 0.14369594410546618 0 +82 0 -2.68407941 0.06391936 0.095295273554898599 0 +88 0 -2.56239128 0.0715984255 0.10717912551116054 0 +90 0 -2.04771137 0.114283845 0.17508366149751475 0 +91 0 -2.108456 0.108277671 0.16533355177618697 0 +92 0 -2.56239128 0.0715984255 0.10717912551116054 0 +93 0 -1.85676885 0.135080114 0.20936158691636991 0 +95 0 -2.04771137 0.114283845 0.17508366149751475 0 +96 0 -1.93042636 0.1267034 0.19545636564796123 0 +97 0 -2.730785 0.0611810647 0.091081154608133083 0 +98 1 5.869131 0.9971826 0.0040703745878533431 1 +99 1 9.67402649 0.999937057 9.0809697580461105E-05 1 +100 1 0.9169636 0.714423 0.48514956618634053 1 +102 0 -2.528028 0.0739165246 0.11078585383424393 0 +104 1 9.67022 0.9999368 9.1153684574596215E-05 1 +105 1 -1.82901669 0.138355449 2.8535486322723087 0 +106 1 9.469551 0.9999229 0.00011127706647502522 1 +108 0 -1.91807806 0.128076032 0.1977257574643819 0 +109 1 4.250736 0.9859466 0.020418590525940875 1 +111 1 1.28113461 0.782642841 0.35357401033762303 1 +112 1 3.845829 0.9790785 0.030503600596017547 1 +113 1 7.44737339 0.9994174 0.00084072413131743907 1 +115 0 -1.45452547 0.18930608 0.30277077223301041 0 +117 1 6.50040436 0.9984994 0.00216654358065164 1 +120 0 -2.10977483 0.108150378 0.16512762206914725 0 +121 0 -2.40890312 0.0824963 0.12421411952463637 0 +122 1 9.287441 0.9999074 0.0001336367089073252 1 +123 1 0.991513252 0.7293867 0.45524422695477623 1 +125 0 -1.85676885 0.135080114 0.20936158691636991 0 +128 1 2.86968613 0.946327448 0.079588624104640571 1 +129 0 -3.50972271 0.0290368516 0.042511553752884852 0 +131 0 -2.22085452 0.09789331 0.14863003134088387 0 +132 1 10.8694086 0.9999809 2.7517486566085523E-05 1 +133 0 -2.231102 0.09699208 0.1471894583221901 0 +137 0 -2.03968573 0.115098737 0.17641160645683859 0 +138 0 -2.37357259 0.08521025 0.12848789225109375 0 +141 0 -1.85219073 0.135615885 0.21025553563894767 0 +144 0 -2.03787947 0.115282834 0.17671177846463382 0 +145 0 +147 0 -2.03505254 0.115571469 0.17718252883609134 0 +150 0 -1.8267622 0.138624445 0.2152857123445632 0 +151 1 0.872104645 0.7051834 0.50392960783522212 1 +152 1 9.204662 0.9998994 0.00014516065994930907 1 +154 0 -1.66311264 0.1593446 0.25041355795755704 0 +156 0 -1.869329 0.133619383 0.20692712807027863 0 +161 0 -2.555451 0.0720611438 0.10789834857071755 0 +164 0 +167 1 3.16309261 0.9594215 0.059763301891325865 1 +169 0 -1.52618456 0.178552613 0.28375991953883767 0 +171 0 -2.04771137 0.114283845 0.17508366149751475 0 +173 1 19.4496174 1 0 1 +174 1 3.02353477 0.9536261 0.068504378788065867 1 +176 0 -2.22085452 0.09789331 0.14863003134088387 0 +177 1 4.302659 0.986648142 0.01939241122666641 1 +179 1 9.584427E-05 0.500023961 0.9999308646308972 1 +180 0 -1.8267622 0.138624445 0.2152857123445632 0 +181 0 -1.66311264 0.1593446 0.25041355795755704 0 +183 1 10.4648762 0.9999715 4.1104439112694392E-05 1 +187 1 10.78104 0.999979258 2.9925291612631146E-05 1 +188 1 8.408628 0.999777138 0.00032155739854406422 1 +189 0 -2.01109338 0.11804311 0.18121995585967673 0 +191 1 12.5877247 0.999996543 4.987505496102727E-06 1 +192 0 -2.57171249 0.0709812939 0.10622044886941406 0 +196 0 3.01742458 0.953355134 4.4221378767752633 1 +198 0 -1.66311264 0.1593446 0.25041355795755704 0 +199 0 -2.21740723 0.0981981754 0.14911766597757717 0 +201 1 6.942314 0.9990349 0.001393043875711089 1 +202 0 -2.04771137 0.114283845 0.17508366149751475 0 +204 0 -2.04771137 0.114283845 0.17508366149751475 0 +205 1 16.2102318 0.9999999 1.7198266111377426E-07 1 +206 1 4.939949 0.9928959 0.010285626570319192 1 +207 0 -1.8267622 0.138624445 0.2152857123445632 0 +209 0 -2.537307 0.07328385 0.109800582737096 0 +210 1 18.7023277 1 0 1 +211 1 10.281146 0.999965668 4.9531853723975585E-05 1 +212 0 -2.04771137 0.114283845 0.17508366149751475 0 +216 0 -1.85676885 0.135080114 0.20936158691636991 0 +218 1 7.263891 0.9993001 0.0010100636449898702 1 +219 0 -2.76439142 0.059279006 0.088161193635133334 0 +223 1 2.7308712 0.9388239 0.091073557949706299 1 +226 1 8.248712 0.9997385 0.00037729327519243937 1 +228 0 -1.8267622 0.138624445 0.2152857123445632 0 +233 1 2.361946 0.913879156 0.12992468715671707 1 +237 1 4.39291763 0.9877864 0.01772897141308883 1 +239 1 1.52190113 0.820818245 0.28486529489841783 1 +240 0 -2.17585921 0.10193938 0.15511526353124511 0 +241 0 -2.29227257 0.09176497 0.13886241586083783 0 +242 0 -2.22085452 0.09789331 0.14863003134088387 0 +244 0 -2.04771137 0.114283845 0.17508366149751475 0 +246 1 14.4728222 0.9999995 6.8793076746672365E-07 1 +247 1 0.83739996 0.697917342 0.51887191386761078 1 +248 0 -2.44329524 0.0799302459 0.12018485315955793 0 +249 0 +250 0 -1.70150161 0.154269248 0.24172965723606502 0 +252 0 1.9876461 0.879493833 3.0528211105339298 1 +254 1 6.02062225 0.9975777 0.0034988407610739244 1 +257 0 -2.21740723 0.0981981754 0.14911766597757717 0 +258 0 -2.39241457 0.08375295 0.12619145057643072 0 +259 0 2.59828758 0.930751264 3.8520684539295051 1 +260 1 6.64796829 0.998705 0.001869458244391086 1 +262 1 10.2717314 0.9999654 4.9875830876224796E-05 1 +267 1 0.8395891 0.6983786 0.51791869634276033 1 +268 1 4.901437 0.992619 0.010688056896805 1 +269 0 -2.04771137 0.114283845 0.17508366149751475 0 +271 0 -2.730785 0.0611810647 0.091081154608133083 0 +272 1 0.8395891 0.6983786 0.51791869634276033 1 +275 0 +276 0 -2.21740723 0.0981981754 0.14911766597757717 0 +277 0 -1.85676885 0.135080114 0.20936158691636991 0 +278 0 -2.04771137 0.114283845 0.17508366149751475 0 +279 1 2.53177547 0.926339567 0.11038695820005974 1 +280 0 -2.39241457 0.08375295 0.12619145057643072 0 +283 1 2.58736229 0.930043757 0.10462950074543359 1 +284 1 6.315773 0.9981957 0.0026053945661372192 1 +285 1 17.0703163 1 0 1 +288 1 -0.602478 0.353776962 1.4990879940554545 0 +290 0 -1.66311264 0.1593446 0.25041355795755704 0 +291 0 -2.04771137 0.114283845 0.17508366149751475 0 +293 1 2.63869476 0.933310747 0.099570586451478413 1 +296 0 -0.04219532 0.48945272 0.96988352376951226 0 +297 0 +299 1 2.437027 0.9196076 0.1209097376152837 1 +300 1 4.886091 0.9925057 0.010852664710009398 1 +301 0 -2.04771137 0.114283845 0.17508366149751475 0 +303 0 -2.04771137 0.114283845 0.17508366149751475 0 +304 1 2.90765285 0.9482235 0.076700989946081224 1 +308 1 4.42898655 0.988214 0.017104577035971798 1 +309 0 -2.17276287 0.102223195 0.15557127190119621 0 +311 0 -1.66311264 0.1593446 0.25041355795755704 0 +312 1 -0.368750572 0.408842951 1.2903813280998107 0 +314 0 -1.63186324 0.163575277 0.25769238876050721 0 +316 1 2.07395124 0.8883455 0.1708072411711142 1 +317 1 9.236988 0.9999026 0.00014051666860547148 1 +319 0 -0.6327839 0.346879572 0.61457906126809736 0 +321 0 +323 1 3.56552029 0.9724956 0.040236349195893271 1 +327 0 -1.85676885 0.135080114 0.20936158691636991 0 +328 1 2.31613636 0.910204649 0.13573713983693664 1 +329 1 3.052658 0.9548971 0.066582810014138891 1 +331 0 -2.85865283 0.0542357638 0.080447507227237577 0 +332 0 -2.45453167 0.0791077837 0.11889578564930094 0 +333 1 3.224123 0.9617321 0.056293037640751442 1 +336 1 4.161271 0.984651566 0.022314800350329005 1 +338 0 -1.63186324 0.163575277 0.25769238876050721 0 +343 0 -1.66311264 0.1593446 0.25041355795755704 0 +344 1 6.48078156 0.99846977 0.0022093461331651669 1 +346 0 -2.4612627 0.07861882 0.11812996027828425 0 +347 0 -1.5268147 0.178460211 0.28359764431931689 0 +348 1 -1.55794716 0.173941419 2.5233265901272413 0 +349 1 0.96990633 0.7251008 0.46374649890978753 1 +350 0 -2.50478745 0.07552324 0.11329104572942034 0 +352 0 -0.8905029 0.291006058 0.49615479540511881 0 +353 1 11.4202032 0.999989033 1.5822490644178947E-05 1 +354 0 -1.85676885 0.135080114 0.20936158691636991 0 +355 0 -2.59761286 0.06929221 0.10359981233578254 0 +358 1 4.168295 0.9847573 0.02215988217787071 1 +360 1 19.7173061 1 0 1 +361 1 4.88178444 0.9924736 0.01089936476746209 1 +366 1 18.082119 1 0 1 +368 0 -1.71223855 0.152873591 0.23935082825368728 0 +370 0 -2.466129 0.07826703 0.11757923930621997 0 +371 0 -1.71223855 0.152873591 0.23935082825368728 0 +373 0 -2.61302185 0.0683050454 0.10207041412114773 0 +376 0 -1.85676885 0.135080114 0.20936158691636991 0 +377 0 -1.63186324 0.163575277 0.25769238876050721 0 +378 0 -2.55687785 0.0719657838 0.1077500970966577 0 +379 0 -2.64790964 0.0661179647 0.098687769592959287 0 +381 1 6.70689869 0.998779 0.0017626085941359387 1 +383 0 -1.85219073 0.135615885 0.21025553563894767 0 +384 0 -1.85219073 0.135615885 0.21025553563894767 0 +387 0 -2.587854 0.06992423 0.10457983932319151 0 +388 0 -2.062164 0.11282903 0.17271593575335431 0 +389 0 -2.63233638 0.06708608 0.10018412244865801 0 +391 1 9.797784 0.999944448 8.0146141443027661E-05 1 +392 0 -2.21740723 0.0981981754 0.14911766597757717 0 +395 0 -2.21740723 0.0981981754 0.14911766597757717 0 +396 0 -2.39241457 0.08375295 0.12619145057643072 0 +398 0 -2.20704079 0.09912 0.15059314510991556 0 +399 0 -1.70332181 0.1540319 0.24132483641316704 0 +404 0 -1.84161174 0.136860788 0.21233483043736184 0 +406 0 -2.33448553 0.08830687 0.13337978519080357 0 +409 0 -2.2088275 0.09896057 0.15033785589508675 0 +413 0 -2.68322229 0.0639706552 0.095374335452958092 0 +414 1 4.470516 0.988688052 0.016412697518568688 1 +415 0 -1.37697363 0.201495469 0.32462750016760433 0 +416 1 6.49479866 0.9984909 0.0021787727517901165 1 +418 0 -2.47054315 0.07794919 0.11708183960876384 0 +419 0 -2.491969 0.07642309 0.11469599534527423 0 +422 0 -2.202886 0.09949162 0.15118839089802541 0 +423 0 -2.4900763 0.0765568 0.11490487237984263 0 +428 0 -1.85676885 0.135080114 0.20936158691636991 0 +429 0 -2.03787947 0.115282834 0.17671177846463382 0 +430 0 -1.88024449 0.1323608 0.20483286117168037 0 +434 0 4.23710155 0.985756457 6.1335481216812706 1 +436 1 2.84663773 0.9451446 0.081393036792859863 1 +439 0 -2.40992618 0.0824188963 0.12409241344887624 0 +440 1 3.80452919 0.9782154 0.031775923054351646 1 +441 0 -1.8284502 0.138423011 0.21494837550204221 0 +442 0 -1.70252347 0.154135972 0.24150232548215611 0 +449 1 12.0930557 0.9999944 8.083207235017858E-06 1 +450 0 -2.296249 0.0914341062 0.13833694513157324 0 +451 0 -2.40992618 0.0824188963 0.12409241344887624 0 +452 0 -2.17240882 0.102255695 0.1556234982659298 0 +453 1 6.529911 0.998543 0.0021035047090949962 1 +454 0 -2.07757616 0.111295484 0.17022427557546105 0 +455 1 -1.9901104 0.120245181 3.0559490175405211 0 +456 1 7.704238 0.9995492 0.00065049902446028007 1 +457 1 7.00719738 0.99909544 0.0013055949383471309 1 +464 0 -2.22559762 0.09747525 0.14796160408536918 0 +465 1 8.38367748 0.999771535 0.00032964240762353795 1 +466 1 6.553727 0.998577237 0.0020540745152688254 1 +467 1 6.02119255 0.997579157 0.0034967719595408674 1 +474 0 -2.40992618 0.0824188963 0.12409241344887624 0 +480 0 -2.20853472 0.09898668 0.15037965733571257 0 +482 1 16.26332 0.9999999 1.7198266111377426E-07 1 +483 1 11.1233063 0.9999852 2.1326006327376515E-05 1 +484 0 -2.38753271 0.08412834 0.1267826495786491 0 +487 1 13.0827723 0.999998 2.9237080272005804E-06 1 +489 1 -2.25294924 0.09509537 3.3944810328808703 0 +492 0 -2.191049 0.100557171 0.15289651175735539 0 +493 1 12.4391136 0.999996066 5.6754386418026423E-06 1 +495 0 -2.006237 0.11854963 0.18204875397128145 0 +497 0 -2.21665764 0.09826457 0.14922388345357948 0 +501 0 -2.39535141 0.0835278556 0.12583706323377797 0 +502 0 -2.446126 0.07972231 0.11985883701567156 0 +504 0 -1.66311264 0.1593446 0.25041355795755704 0 +507 0 -1.5343039 0.177364841 0.28167536187524722 0 +510 0 -1.66311264 0.1593446 0.25041355795755704 0 +513 0 -2.006237 0.11854963 0.18204875397128145 0 +514 1 11.0994911 0.99998486 2.1841961999056935E-05 1 +517 0 -1.63186324 0.163575277 0.25769238876050721 0 +519 1 4.549981 0.9895431 0.01516557768494084 1 +520 0 -1.89241147 0.130969763 0.20252171957783308 0 +521 0 -2.43429351 0.08059475 0.12122718788029851 0 +522 1 0.357010841 0.5883166 0.76533530327012156 1 +523 1 5.51915169 0.9960068 0.0057725219886650735 1 +527 0 -2.56239128 0.0715984255 0.10717912551116054 0 +528 0 -2.52255535 0.07429201 0.11137092307285647 0 +529 0 -2.191049 0.100557171 0.15289651175735539 0 +531 0 -2.33448553 0.08830687 0.13337978519080357 0 +532 0 -1.8267622 0.138624445 0.2152857123445632 0 +533 0 -2.21740723 0.0981981754 0.14911766597757717 0 +534 0 -2.03787947 0.115282834 0.17671177846463382 0 +535 0 -2.08951616 0.110119984 0.16831726594009194 0 +538 0 -2.39535141 0.0835278556 0.12583706323377797 0 +539 0 -2.74649048 0.0602851622 0.089705066266029906 0 +540 0 -2.47341466 0.07774305 0.11675934435269709 0 +541 0 -2.03968573 0.115098737 0.17641160645683859 0 +544 0 -2.07751942 0.111301087 0.17023337107337447 0 +546 1 15.9298019 0.9999999 1.7198266111377426E-07 1 +547 0 -1.63019609 0.1638035 0.25808609509773911 0 +548 0 -1.82455885 0.138887748 0.21572677983014757 0 +549 1 3.53455734 0.9716552 0.04148365754326467 1 +557 0 -2.50478745 0.07552324 0.11329104572942034 0 +558 0 -2.03787947 0.115282834 0.17671177846463382 0 +559 0 -2.57171249 0.0709812939 0.10622044886941406 0 +560 0 -2.730785 0.0611810647 0.091081154608133083 0 +561 0 -2.730785 0.0611810647 0.091081154608133083 0 +563 0 -2.21740723 0.0981981754 0.14911766597757717 0 +565 1 14.4914665 0.9999995 6.8793076746672365E-07 1 +566 0 -2.37125015 0.08539145 0.12877368417465981 0 +569 1 7.86107731 0.9996147 0.00055595503487491883 1 +577 0 -1.85676885 0.135080114 0.20936158691636991 0 +578 0 -1.85676885 0.135080114 0.20936158691636991 0 +581 1 8.679046 0.9998299 0.00024544011948576707 1 +582 1 9.267637 0.9999056 0.00013621668994928923 1 +584 0 -2.791611 0.0577791929 0.085862903474618182 0 +586 1 18.3650551 1 0 1 +590 1 0.8902283 0.7089373 0.49627008273810297 1 +593 0 -2.38753271 0.08412834 0.1267826495786491 0 +594 1 3.65131 0.9746996 0.036970418233996383 1 +600 0 -2.21740723 0.0981981754 0.14911766597757717 0 +602 0 -2.39535141 0.0835278556 0.12583706323377797 0 +604 1 1.157403 0.7608605 0.3942961227380975 1 +606 0 -2.284902 0.0923811048 0.13984145096224598 0 +607 0 -1.66311264 0.1593446 0.25041355795755704 0 +609 0 -2.40992618 0.0824188963 0.12409241344887624 0 +612 1 20.9893341 1 0 1 +613 0 -2.030234 0.1160649 0.17798764430460248 0 +614 0 -1.8198415 0.13945289 0.21667392047737177 0 +617 0 +618 0 -2.39535141 0.0835278556 0.12583706323377797 0 +619 0 -2.57171249 0.0709812939 0.10622044886941406 0 +621 0 -2.57282734 0.07090781 0.10610633667562216 0 +622 0 -2.87062454 0.0536249466 0.079516050420504789 0 +624 0 -2.41982079 0.0816737 0.12292122599990905 0 +627 0 -1.58449054 0.170160457 0.26909569048429549 0 +629 0 -2.22559762 0.09747525 0.14796160408536918 0 +633 1 1.851265 0.8642755 0.21043680463191686 1 +634 0 -2.03968573 0.115098737 0.17641160645683859 0 +638 0 -2.22559762 0.09747525 0.14796160408536918 0 +639 0 -2.50478745 0.07552324 0.11329104572942034 0 +641 0 -2.21740723 0.0981981754 0.14911766597757717 0 +642 0 -2.21740723 0.0981981754 0.14911766597757717 0 +644 0 -1.85219073 0.135615885 0.21025553563894767 0 +645 0 -2.21740723 0.0981981754 0.14911766597757717 0 +649 0 -2.21740723 0.0981981754 0.14911766597757717 0 +652 0 -2.564228 0.07147643 0.10698956187034971 0 +653 0 -2.39535141 0.0835278556 0.12583706323377797 0 +654 0 -2.39241457 0.08375295 0.12619145057643072 0 +656 0 -2.57171249 0.0709812939 0.10622044886941406 0 +657 0 -2.0722928 0.111819126 0.17107458963369743 0 +660 0 -1.85676885 0.135080114 0.20936158691636991 0 +661 0 -2.56239128 0.0715984255 0.10717912551116054 0 +665 0 -1.66311264 0.1593446 0.25041355795755704 0 +668 1 -0.192660332 0.451983333 1.1456585221797912 0 +670 1 6.66539 0.9987274 0.0018371700459368042 1 +678 0 -1.66311264 0.1593446 0.25041355795755704 0 +679 0 -1.85219073 0.135615885 0.21025553563894767 0 +680 1 20.8869 1 0 1 +681 1 12.674202 0.9999969 4.4715558520995569E-06 1 +682 0 -2.713255 0.0621957332 0.092641251857392207 0 +683 0 -1.66311264 0.1593446 0.25041355795755704 0 +685 0 -1.66311264 0.1593446 0.25041355795755704 0 +688 0 -2.22559762 0.09747525 0.14796160408536918 0 +689 0 -2.78634024 0.0580668 0.086303344802401927 0 +691 1 4.852685 0.9922531 0.011219894450214495 1 +692 0 -2.03968573 0.115098737 0.17641160645683859 0 +693 0 -2.36527443 0.08585931 0.12951188152740967 0 +694 0 -2.19330382 0.10035342 0.15256973467024601 0 +696 1 6.44385242 0.998412251 0.0022924573316975153 1 +697 1 2.56533623 0.9285971 0.1068753309513874 1 +698 1 3.769271 0.977451265 0.032903322595354806 1 +0 0 -2.301516 0.09099748 0.13764380069439297 0 +1 0 1.08247185 0.7469615 1.9825710402688395 1 +2 0 -2.0523982 0.113810278 0.17431250107108243 0 +3 0 3.463801 0.96964 5.0416851857458864 1 +4 0 -2.25727749 0.09472357 0.14356969816808129 0 +7 0 -2.013621 0.117780194 0.18078994480689475 0 +12 1 -0.8284931 0.30396378 1.7180286690667717 0 +13 0 -1.81933558 0.139513627 0.21677574901409538 0 +14 1 7.468815 0.999429643 0.00082308574166617431 1 +15 1 -0.935884 0.2817325 1.8276020977115841 0 +16 0 -2.098476 0.109245047 0.16689949442685795 0 +17 0 -2.22533417 0.09749843 0.14799865604012269 0 +19 0 -2.36852455 0.08560456 0.12910989118919178 0 +22 0 -2.00196 0.118997283 0.18278162694192454 0 +23 1 +24 0 -1.941751 0.125455618 0.19339649381178925 0 +26 0 -1.70507562 0.153803527 0.24093542302960627 0 +27 0 -2.18581915 0.101031184 0.15365702371483531 0 +29 0 -1.6321876 0.1635309 0.25761585008130428 0 +30 0 -1.73291934 0.150214538 0.23482943239457851 0 +33 0 -2.09316373 0.109763056 0.16773872242540308 0 +34 0 -1.966197 0.122797951 0.18901891314128982 0 +36 1 10.6047812 0.9999752 3.5772834884537144E-05 1 +38 1 5.09487247 0.99390924 0.0088139788276411432 1 +39 1 0.138988018 0.534691155 0.90322228350613509 1 +42 1 8.104832 0.999698043 0.00043569783898110006 1 +43 1 -2.051857 0.113864884 3.1346052100634472 0 +47 0 -1.78140879 0.144129261 0.22453517072067464 0 +49 1 6.031123 0.997603 0.0034622923707363488 1 +53 1 2.5970068 0.930668652 0.10366048147588253 1 +55 1 3.37955284 0.967059433 0.048323537425725815 1 +57 1 -2.29733229 0.09134414 3.4525440037349249 0 +58 1 -0.8062577 0.308688521 1.6957762577022222 0 +59 1 -0.20775795 0.448246568 1.1576355563258656 0 +61 0 -1.73861909 0.149488419 0.23359721489187701 0 +62 1 5.937831 0.99736917 0.0038004865334286451 1 +65 1 -1.92219067 0.127617478 2.9701021620868731 0 +67 1 1.6232996 0.835249662 0.25972060045188861 1 +75 0 -1.96936083 0.122457556 0.18845918980961393 0 +78 0 -1.95251036 0.124279886 0.19145824716485596 0 +80 0 -2.1607275 0.103333026 0.15735583372897294 0 +81 0 -2.12950277 0.106262207 0.16207646288515981 0 +83 0 -2.52023387 0.07445183 0.11162001257935196 0 +84 1 7.28208447 0.999312758 0.00099182083151890563 1 +85 1 3.20175552 0.9609003 0.057541335571880493 1 +86 1 1.07764864 0.746048748 0.42265819240738722 1 +87 1 6.03411 0.9976101 0.0034520348521077638 1 +89 0 -2.220188 0.0979522 0.14872421333055375 0 +94 0 -2.045452 0.114512727 0.17545652289353517 0 +101 1 -0.09225035 0.4769538 1.0680785545608487 0 +103 1 -2.52788973 0.07392599 3.7577745918272321 0 +107 1 6.7885294 0.9988746 0.0016245164986375925 1 +110 0 -2.08183551 0.110874891 0.16954166005159219 0 +114 0 -1.657285 0.16012679 0.25175654520308971 0 +116 0 -1.4446578 0.1908251 0.30547653402158781 0 +118 0 -2.08073568 0.110983357 0.16971766707069735 0 +119 0 -1.99037921 0.120216757 0.18477997210748806 0 +124 1 4.98317528 0.993194342 0.0098520525459535446 1 +126 1 4.85608768 0.9922792 0.011182023351539032 1 +127 0 -2.13997936 0.105271339 0.16047786433454483 0 +130 0 -2.02583027 0.116517484 0.17872651087564395 0 +134 0 -2.27046967 0.0935983658 0.14177763258855564 0 +135 0 -2.082193 0.110839657 0.16948449080217048 0 +136 0 -2.098476 0.109245047 0.16689949442685795 0 +139 0 +140 0 -1.860422 0.134653866 0.20865077658844469 0 +142 1 1.5520792 0.82521385 0.2771600607430223 1 +143 0 -1.42160451 0.19441016 0.31188260684972846 0 +146 1 -0.379899025 0.406151235 1.2999110632727831 0 +148 0 -3.333778 0.03443041 0.050547855906756659 0 +149 1 9.453949 0.9999217 0.0001129970266666251 1 +153 0 -1.79716134 0.142196968 0.22128167987188255 0 +155 1 2.7138834 0.9378409 0.092584929720156431 1 +157 0 -2.045452 0.114512727 0.17545652289353517 0 +158 0 +159 1 14.5143137 0.9999995 6.8793076746672365E-07 1 +160 1 8.880978 0.999861 0.0002005457089583406 1 +162 0 -2.13997936 0.105271339 0.16047786433454483 0 +163 0 -2.36457872 0.0859139338 0.12959808560549185 0 +165 0 -2.09007239 0.110065483 0.16822891030896434 0 +166 1 8.115719 0.9997012 0.00043113892933886136 1 +168 0 -2.13997936 0.105271339 0.16047786433454483 0 +170 0 -1.860422 0.134653866 0.20865077658844469 0 +172 0 -1.78140879 0.144129261 0.22453517072067464 0 +175 1 7.61374569 0.9995066 0.00071201186227698389 1 +178 0 -2.22533417 0.09749843 0.14799865604012269 0 +182 0 -2.36852455 0.08560456 0.12910989118919178 0 +184 1 4.644288 0.990475237 0.013807187789500337 1 +185 0 -1.77662516 0.144720361 0.22553189902602172 0 +186 1 5.66861629 0.9965592 0.0049725809792141133 1 +190 1 16.6872864 1 0 1 +193 0 -1.941751 0.125455618 0.19339649381178925 0 +194 0 -2.13997936 0.105271339 0.16047786433454483 0 +195 0 -2.22533417 0.09749843 0.14799865604012269 0 +197 0 -2.29312468 0.091693975 0.13874964503480286 0 +200 1 10.1933537 0.999962568 5.4003563100270837E-05 1 +203 0 -2.301516 0.09099748 0.13764380069439297 0 +208 0 -1.67101777 0.158288538 0.24860233230888198 0 +213 1 20.2759647 1 0 1 +214 1 18.7733364 1 0 1 +215 1 8.191004 0.9997229 0.00039982907120573395 1 +217 0 -1.941751 0.125455618 0.19339649381178925 0 +220 0 -2.00243449 0.118947558 0.18270020126928377 0 +221 1 7.44619 0.9994167 0.00084175662910008565 1 +222 1 -1.34953451 0.205946475 2.2796586599059694 0 +224 1 9.052607 0.999882936 0.00016889684917020562 1 +225 0 -1.78140879 0.144129261 0.22453517072067464 0 +227 1 8.601936 0.999816358 0.00026496360361006585 1 +229 1 15.556097 0.9999999 1.7198266111377426E-07 1 +230 1 4.348646 0.9872406 0.018526350463759503 1 +231 1 8.508919 0.999798357 0.00029093798765384679 1 +232 0 -0.296713352 0.426361144 0.80178534411673164 0 +234 0 -1.87558413 0.132896915 0.20572457748992548 0 +235 0 +236 1 9.828637 0.9999461 7.7738252578338893E-05 1 +238 1 15.6847239 0.9999999 1.7198266111377426E-07 1 +243 0 -1.85970509 0.134737432 0.20879010310197682 0 +245 0 -2.17634916 0.101894535 0.15504322373043186 0 +251 1 6.219199 0.998013139 0.00286928622354919 1 +253 1 8.104832 0.999698043 0.00043569783898110006 1 +255 1 3.94488955 0.9810141 0.027654262469072717 1 +256 0 -1.860422 0.134653866 0.20865077658844469 0 +261 1 12.4782257 0.9999962 5.5034553246245386E-06 1 +263 1 6.391608 0.9983272 0.0024153673304377296 1 +264 1 2.26732063 0.906134069 0.14220357185362809 1 +265 0 -1.91125607 0.1288398 0.19899006005896697 0 +266 1 7.600045 0.9994998 0.00072181974597906125 1 +270 1 5.563095 0.9961778 0.0055248450255732757 1 +273 1 -1.02924967 0.263229579 1.925606483115087 0 +274 0 -2.136303 0.105618112 0.16103712188187333 0 +281 0 -2.09316373 0.109763056 0.16773872242540308 0 +282 1 3.098658 0.9568373 0.06365446955853514 1 +286 1 19.419363 1 0 1 +287 0 -2.27046967 0.0935983658 0.14177763258855564 0 +289 1 8.124609 0.999703944 0.00042718215151575466 1 +292 1 +294 0 +295 1 5.98761 0.997496545 0.0036162501096248033 1 +298 0 -2.98175526 0.04825695 0.071355963047900345 0 +302 1 18.99006 1 0 1 +305 1 8.560013 0.9998085 0.00027631658811241448 1 +306 0 -1.941751 0.125455618 0.19339649381178925 0 +307 0 -1.941751 0.125455618 0.19339649381178925 0 +310 0 -2.16668749 0.1027821 0.1564696923073676 0 +313 0 -1.6175487 0.165543213 0.26109075530209375 0 +315 0 +318 0 -2.750764 0.0600435175 0.089334129517283936 0 +320 1 2.96006584 0.950737059 0.072881698029347464 1 +322 0 -2.13997936 0.105271339 0.16047786433454483 0 +324 0 -1.941751 0.125455618 0.19339649381178925 0 +325 0 -1.86101615 0.13458465 0.20853538526771875 0 +326 1 0.5836396 0.6419045 0.6395694800066366 1 +330 1 3.19974613 0.9608247 0.05765481382577594 1 +334 1 5.354478 0.995295346 0.0068033977028160051 1 +335 0 -1.6175487 0.165543213 0.26109075530209375 0 +337 0 -1.941751 0.125455618 0.19339649381178925 0 +339 1 4.42046261 0.9881143 0.01725016366406085 1 +340 1 3.32619667 0.9653167 0.050925737892124082 1 +341 0 -1.941751 0.125455618 0.19339649381178925 0 +342 0 -1.74357152 0.148859844 0.23253137628148873 0 +345 0 -1.6175487 0.165543213 0.26109075530209375 0 +351 0 -2.045452 0.114512727 0.17545652289353517 0 +356 1 -1.66799617 0.158691525 2.6557030083293012 0 +357 1 12.1684132 0.999994755 7.5672564839008544E-06 1 +359 1 2.620923 0.9321961 0.10129464764951893 1 +362 0 -2.19840622 0.0998937041 0.15183271169511453 0 +363 0 -1.04904556 0.2594084 0.43324993672264289 0 +364 0 -2.045452 0.114512727 0.17545652289353517 0 +365 0 -1.89627123 0.130531073 0.20179362469978843 0 +367 1 13.7444353 0.9999989 1.5478446880940214E-06 1 +369 0 -1.49699593 0.182874 0.29136952685596818 0 +372 0 -2.04446387 0.114612974 0.17561986216689546 0 +374 0 -1.966197 0.122797951 0.18901891314128982 0 +375 0 -1.6175487 0.165543213 0.26109075530209375 0 +380 0 -1.6175487 0.165543213 0.26109075530209375 0 +382 0 -1.98493266 0.120794 0.18572686024059626 0 +385 0 -2.27838588 0.09292892 0.14071249291381016 0 +386 1 4.234085 0.985713959 0.020759038727296567 1 +390 0 -1.85135007 0.135714456 0.21042006464991661 0 +393 0 -1.342573 0.207087249 0.33476596791809693 0 +394 0 -1.731577 0.150385961 0.23512048938573521 0 +397 0 -1.96809924 0.122593194 0.1886821979796787 0 +400 1 8.218968 0.9997305 0.00038881917268506155 1 +401 0 -1.860422 0.134653866 0.20865077658844469 0 +402 0 -1.81246018 0.140341058 0.21816369183653808 0 +403 0 -1.63434482 0.163236037 0.25710737448281606 0 +405 0 -1.78140879 0.144129261 0.22453517072067464 0 +407 0 -1.78140879 0.144129261 0.22453517072067464 0 +408 0 -1.77392912 0.145054385 0.22609544513509036 0 +410 0 -1.78140879 0.144129261 0.22453517072067464 0 +411 0 +412 1 9.160485 0.999894857 0.00015169667309156297 1 +417 0 -1.78140879 0.144129261 0.22453517072067464 0 +420 0 -1.71119952 0.1530082 0.23958008015495064 0 +421 1 12.2299891 0.9999951 7.0513059173031522E-06 1 +424 0 -1.860422 0.134653866 0.20865077658844469 0 +425 1 20.1651058 1 0 1 +426 0 -1.3227582 0.210359767 0.34073259653634197 0 +427 1 4.300104 0.9866145 0.019441567487860585 1 +431 0 -2.75610447 0.0597428158 0.088872670403648199 0 +432 0 -2.164125 0.103018656 0.15685011613830954 0 +433 0 -1.83914936 0.137151927 0.21282153695787007 0 +435 1 7.36268234 0.999365866 0.00091515190632679476 1 +437 0 -1.96809924 0.122593194 0.1886821979796787 0 +438 0 -1.880899 0.132285655 0.2047079142247506 0 +443 0 -1.58702278 0.169803187 0.26847470165960907 0 +444 0 -2.40749931 0.08260262 0.12438130785824263 0 +445 0 -1.74357152 0.148859844 0.23253137628148873 0 +446 0 -1.6175487 0.165543213 0.26109075530209375 0 +447 0 -2.06660366 0.1123854 0.17199469628631101 0 +448 0 -1.342573 0.207087249 0.33476596791809693 0 +458 0 -2.00865936 0.118296735 0.18163489276241526 0 +459 0 -1.93524909 0.126170725 0.19457665456288356 0 +460 0 -2.10963583 0.108163789 0.16514931652661516 0 +461 0 -1.5343715 0.177354991 0.2816580881405864 0 +462 0 -2.17302465 0.102199174 0.15553267206171928 0 +463 0 -1.97221267 0.12215142 0.18795598317957285 0 +468 0 -1.96809924 0.122593194 0.1886821979796787 0 +469 0 -1.78214443 0.144038543 0.22438225994148536 0 +470 0 -1.73291934 0.150214538 0.23482943239457851 0 +471 0 -2.17302465 0.102199174 0.15553267206171928 0 +472 0 -1.89049411 0.131188139 0.20288429650077927 0 +473 0 -1.96809924 0.122593194 0.1886821979796787 0 +475 0 -1.860422 0.134653866 0.20865077658844469 0 +476 0 -1.92840433 0.1269273 0.19582630620444338 0 +477 0 -1.96809924 0.122593194 0.1886821979796787 0 +478 0 -2.01690173 0.117439739 0.18023330693767575 0 +479 1 9.129778 0.999891639 0.00015634070042369144 1 +481 0 -1.77698469 0.144675866 0.2254568465498844 0 +485 0 -1.37343407 0.202065587 0.32565792737640359 0 +486 0 -1.73291934 0.150214538 0.23482943239457851 0 +488 1 1.15169907 0.7598212 0.39626817381950297 1 +490 0 -1.6175487 0.165543213 0.26109075530209375 0 +491 1 6.43022442 0.998390555 0.0023238082916929833 1 +494 0 -1.0844636 0.252662241 0.42016767992874143 0 +496 0 -1.342573 0.207087249 0.33476596791809693 0 +498 0 -2.098476 0.109245047 0.16689949442685795 0 +499 0 -2.098476 0.109245047 0.16689949442685795 0 +500 0 -2.36852455 0.08560456 0.12910989118919178 0 +503 0 -2.22533417 0.09749843 0.14799865604012269 0 +505 0 -1.81462574 0.14007999 0.21772562877705068 0 +506 1 12.0963869 0.9999944 8.083207235017858E-06 1 +508 0 -2.06660366 0.1123854 0.17199469628631101 0 +509 0 -1.74357152 0.148859844 0.23253137628148873 0 +511 0 -2.18581915 0.101031184 0.15365702371483531 0 +512 0 -2.06660366 0.1123854 0.17199469628631101 0 +515 1 10.156889 0.999961138 5.6067433641037978E-05 1 +516 0 -1.342573 0.207087249 0.33476596791809693 0 +518 0 -1.87690234 0.132745087 0.20547198672775793 0 +524 0 -2.00196 0.118997283 0.18278162694192454 0 +525 0 -1.91367817 0.128568187 0.19854031339238309 0 +526 0 -1.96809924 0.122593194 0.1886821979796787 0 +530 1 4.653802 0.9905646 0.013677053104199231 1 +536 0 -2.301516 0.09099748 0.13764380069439297 0 +537 0 -2.21493769 0.09841708 0.14946791169661081 0 +542 0 -1.95570588 0.123932526 0.19088610479236329 0 +543 0 -2.098476 0.109245047 0.16689949442685795 0 +545 0 -2.18581915 0.101031184 0.15365702371483531 0 +550 0 -2.00196 0.118997283 0.18278162694192454 0 +551 0 -1.941751 0.125455618 0.19339649381178925 0 +552 0 -2.07113647 0.111934021 0.17126122926502999 0 +553 0 -1.193924 0.232557878 0.38187014349940485 0 +554 0 -1.860422 0.134653866 0.20865077658844469 0 +555 0 -1.62672949 0.16427888 0.25890649895897555 0 +556 0 -1.76245427 0.146483228 0.22850859107163557 0 +562 0 -1.941751 0.125455618 0.19339649381178925 0 +564 0 -2.20704937 0.09911924 0.15059192808996283 0 +567 0 -1.90300918 0.129768282 0.20052849433295125 0 +568 1 1.72357225 0.8485884 0.23686312545110236 1 +570 1 5.530344 0.996051 0.0057084620367186976 1 +571 1 12.7975969 0.999997258 3.955606392614897E-06 1 +572 0 -2.00196 0.118997283 0.18278162694192454 0 +573 0 -1.78140879 0.144129261 0.22453517072067464 0 +574 1 5.131028 0.994124234 0.0085019411118018116 1 +575 0 -2.21493769 0.09841708 0.14946791169661081 0 +576 0 -2.18581915 0.101031184 0.15365702371483531 0 +579 0 -1.941751 0.125455618 0.19339649381178925 0 +580 0 -2.11355782 0.107786037 0.1645383687069783 0 +583 0 -1.860422 0.134653866 0.20865077658844469 0 +585 0 -1.6175487 0.165543213 0.26109075530209375 0 +587 0 -2.164125 0.103018656 0.15685011613830954 0 +588 1 3.97299385 0.9815305 0.026895014627516617 1 +589 0 -2.06660366 0.1123854 0.17199469628631101 0 +591 1 5.15082 0.994238734 0.008335784993429584 1 +592 1 2.59083414 0.930269361 0.10427958420150241 1 +595 0 -2.18581915 0.101031184 0.15365702371483531 0 +596 0 -2.04446387 0.114612974 0.17561986216689546 0 +597 0 -2.112893 0.107849985 0.16464177579708919 0 +598 0 -2.00196 0.118997283 0.18278162694192454 0 +599 0 -1.47923768 0.1855426 0.29608885109001915 0 +601 0 -1.5085547 0.181153089 0.28833433912434342 0 +603 1 2.79953 0.9426504 0.085205310002869877 1 +605 1 9.113677 0.999889851 0.00015892072206770877 1 +608 1 11.1271286 0.999985337 2.1154021144488122E-05 1 +610 1 4.917906 0.992738664 0.010514112839565644 1 +611 1 7.66873455 0.999533057 0.00067381337182235643 1 +615 0 -1.9749856 0.121854387 0.18746790978262812 0 +616 0 -2.00196 0.118997283 0.18278162694192454 0 +620 0 -2.00196 0.118997283 0.18278162694192454 0 +623 0 -1.6175487 0.165543213 0.26109075530209375 0 +625 0 -1.72655845 0.15102832 0.23621166606060956 0 +626 1 3.22024632 0.9615891 0.056507555310947317 1 +628 0 -1.74357152 0.148859844 0.23253137628148873 0 +630 0 -1.88439143 0.131885275 0.20404238182768375 0 +631 0 -2.18581915 0.101031184 0.15365702371483531 0 +632 0 -1.6175487 0.165543213 0.26109075530209375 0 +635 0 -1.74968672 0.148086727 0.23122152652399849 0 +636 1 9.544065 0.999928355 0.00010336527600414941 1 +637 0 -1.525428 0.178663611 0.28395487805787722 0 +640 0 -2.03707385 0.115365021 0.17684580637902217 0 +643 0 -1.6175487 0.165543213 0.26109075530209375 0 +646 0 -1.62914348 0.163947731 0.25833495461491246 0 +647 0 -1.76435113 0.146246225 0.22810804177334876 0 +648 1 11.25837 0.9999871 1.8574245861463165E-05 1 +650 0 -1.90433264 0.1296189 0.20028086228354752 0 +651 0 -1.88349569 0.13198787 0.20421289076099527 0 +655 0 -2.00196 0.118997283 0.18278162694192454 0 +658 1 8.6298 0.999821365 0.00025773902362411926 1 +659 0 -1.6175487 0.165543213 0.26109075530209375 0 +662 0 -1.76741409 0.1458642 0.22746263715138998 0 +663 0 -1.76741409 0.1458642 0.22746263715138998 0 +664 0 -2.07836151 0.111217827 0.17009821449285314 0 +666 0 -2.084568 0.110605806 0.16910510831886344 0 +667 0 -2.13997936 0.105271339 0.16047786433454483 0 +669 1 11.2461758 0.9999869 1.8918215632667518E-05 1 +671 0 -2.11648464 0.1075049 0.16408384130497666 0 +672 0 -2.045452 0.114512727 0.17545652289353517 0 +673 0 -2.11998677 0.107169338 0.1635415204810986 0 +674 0 -1.78140879 0.144129261 0.22453517072067464 0 +675 0 -1.80261636 0.141532868 0.22016519609417487 0 +676 0 -1.78214443 0.144038543 0.22438225994148536 0 +677 0 -2.06660366 0.1123854 0.17199469628631101 0 +684 0 -1.6175487 0.165543213 0.26109075530209375 0 +686 0 -1.6175487 0.165543213 0.26109075530209375 0 +687 0 -2.00984144 0.11817351 0.18143327856658856 0 +690 0 -1.76435113 0.146246225 0.22810804177334876 0 +695 0 -1.74357152 0.148859844 0.23253137628148873 0 diff --git a/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-out.txt b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-out.txt new file mode 100644 index 0000000000..3805af6e7c --- /dev/null +++ b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-out.txt @@ -0,0 +1,51 @@ +maml.exe TrainTest test=%Data% tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures norm=No dout=%Output% data=%Data% out=%Output% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} +Not adding a normalizer. +Warning: Skipped 16 examples with bad label/weight/features in training set +Not training a calibrator because it is not needed. +Warning: The predictor produced non-finite prediction values on 16 instances during testing. Possible causes: abnormal data or the predictor is numerically unstable. +TEST POSITIVE RATIO: 0.3499 (239.0/(239.0+444.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 215 | 24 | 0.8996 + negative || 7 | 437 | 0.9842 + ||====================== +Precision || 0.9685 | 0.9479 | +OVERALL 0/1 ACCURACY: 0.954612 +LOG LOSS/instance: 0.228754 +Test-set entropy (prior Log-Loss/instance): 0.934003 +LOG-LOSS REDUCTION (RIG): 75.508177 +AUC: 0.982029 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.982029 (0.0000) +Accuracy: 0.954612 (0.0000) +Positive precision: 0.968468 (0.0000) +Positive recall: 0.899582 (0.0000) +Negative precision: 0.947939 (0.0000) +Negative recall: 0.984234 (0.0000) +Log-loss: 0.228754 (0.0000) +Log-loss reduction: 75.508177 (0.0000) +F1 Score: 0.932755 (0.0000) +AUPRC: 0.980228 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Normalize' started. +[1] (%Time%) 699 examples +[1] 'Normalize' finished in %Time%. +[2] 'Training' started. +[2] (%Time%) 1 iterations, 683 examples Training-loss: 0.306117119945184 +[2] (%Time%) 2 iterations, 683 examples Training-loss: 0.193084570883075 +[2] (%Time%) 3 iterations, 683 examples Training-loss: 0.173782368769797 +[2] (%Time%) 4 iterations, 683 examples Training-loss: 0.163879262610855 +[2] (%Time%) 5 iterations, 683 examples Training-loss: 0.157117446501075 +[2] 'Training' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-rp.txt b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-rp.txt new file mode 100644 index 0000000000..4a01e926c6 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-rp.txt @@ -0,0 +1,4 @@ +FieldAwareFactorizationMachine +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /d /norm /shuf Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.982029 0.954612 0.968468 0.899582 0.947939 0.984234 0.228754 75.50818 0.932755 0.980228 5 - - FieldAwareFactorizationMachine %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures norm=No dout=%Output% data=%Data% out=%Output% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} /d:5;/norm:-;/shuf:- + diff --git a/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer.txt b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer.txt new file mode 100644 index 0000000000..e142c5c952 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -2.79334736 0.0576847345 0.085718279282943594 0 +1 0 1.188056 0.7663932 2.0978457302965743 1 +2 0 -2.51387787 0.074891 0.11230473674761222 0 +3 0 2.8827734 0.9469883 4.2375449640754628 1 +4 0 -2.73850226 0.0607392974 0.090402444870538778 0 +5 1 17.67403 1 0 1 +6 0 -1.42012978 0.194641247 0.31229651002770953 0 +7 0 -2.48911548 0.07662476 0.11501104509053926 0 +8 0 -3.05736852 0.0449004173 0.066276932485278203 0 +9 0 -2.49013543 0.07655262 0.11489834233223327 0 +10 0 -2.08552837 0.110511363 0.16895191862826214 0 +11 0 -2.303132 0.0908639 0.1374318066173198 0 +12 1 -1.27195454 0.218922853 2.1915055288260206 0 +13 0 -2.25197268 0.09517944 0.14429638095999855 0 +14 1 8.572502 0.9998109 0.00027287628034393304 1 +15 1 -1.27670574 0.218111485 2.196862353947556 0 +16 0 -2.546958 0.07263111 0.10878476978943961 0 +17 0 -2.70365119 0.06275825 0.09350687664921721 0 +18 1 6.88258553 0.998975635 0.0014786043638188881 1 +19 0 -2.87238669 0.0535355881 0.079379834832595766 0 +20 1 3.6811657 0.975425541 0.035896345222225338 1 +21 1 6.199198 0.997973 0.0029272747638287261 1 +22 0 -2.43037367 0.08088568 0.12168377661511501 0 +23 1 +24 0 -2.37061882 0.08544078 0.12885149942120921 0 +25 1 0.301486969 0.574806 0.79885303657013707 1 +26 0 -2.121753 0.107000455 0.16326865504132451 0 +27 0 -2.652885 0.06581142 0.098214282791589516 0 +28 0 -2.303132 0.0908639 0.1374318066173198 0 +29 0 -2.03972268 0.115094975 0.17640547222344355 0 +30 0 -2.15111279 0.104227282 0.15879536747436127 0 +31 0 -2.49228716 0.07640065 0.11466094104662786 0 +32 1 4.41975975 0.988106 0.017262260285248437 1 +33 0 -2.54244328 0.0729358 0.10925884045202583 0 +34 0 -2.4251883 0.08127202 0.12229032950777963 0 +35 0 -2.303132 0.0908639 0.1374318066173198 0 +36 1 11.464077 0.9999895 1.5134552659953847E-05 1 +37 0 -2.90807438 0.05175586 0.076669544650713642 0 +38 1 5.226836 0.9946582 0.0077272859162861246 1 +39 1 0.192784309 0.548047364 0.86762751464658039 1 +40 0 +41 1 -0.340168953 0.415768445 1.266147828359969 0 +42 1 8.853592 0.9998572 0.00020604992936022588 1 +43 1 -2.117641 0.107394 3.2190146693586854 0 +44 1 9.450965 0.999921441 0.0001133410189510066 1 +45 0 -2.40569448 0.0827394947 0.12459657233005934 0 +46 1 5.376622 0.995397866 0.0066548011445776789 1 +47 0 -2.16523314 0.1029163 0.15668549713042432 0 +48 0 -2.73850226 0.0607392974 0.090402444870538778 0 +49 1 5.89553928 0.997255862 0.0039643965487975831 1 +50 1 -0.227107048 0.443465978 1.1731046676718506 0 +51 1 -0.8415785 0.301202446 1.7311946079503711 0 +52 1 3.04452515 0.9545456 0.067113950169056663 1 +53 1 3.61555958 0.9738029 0.038298262118380257 1 +54 1 3.77800655 0.977643 0.032620334610649768 1 +55 1 3.194067 0.9606104 0.057976682417311451 1 +56 1 7.91791248 0.999635935 0.00052533064883456481 1 +57 1 -2.86445379 0.0539389737 4.2125281183154604 0 +58 1 -0.969594 0.274961442 1.8626987732996008 0 +59 1 -0.6607013 0.3405821 1.553925470966943 0 +60 1 1.0063467 0.732304633 0.44948417232333177 1 +61 0 -2.1292522 0.106286012 0.16211488941610727 0 +62 1 6.41300774 0.9983626 0.0023642038022797952 1 +63 1 -1.33857679 0.207744211 2.2671198197586828 0 +64 0 -2.16523314 0.1029163 0.15668549713042432 0 +65 1 -2.526939 0.073991105 3.7565043460709084 0 +66 0 -2.70365119 0.06275825 0.09350687664921721 0 +67 1 1.78247547 0.8560023 0.22431347044655056 1 +68 1 7.800373 0.9995906 0.00059079536563381421 1 +69 0 -2.402561 0.08297762 0.12497115587899781 0 +70 0 -2.56230116 0.0716044158 0.10718843415121884 0 +71 1 3.8944397 0.9800513 0.029070857780294054 1 +72 0 -2.60696554 0.06869147 0.10266890201899616 0 +73 1 8.50068 0.9997967 0.00029334623238004185 1 +74 1 -0.107892036 0.473053157 1.0799257855156403 0 +75 0 -2.46654248 0.07823721 0.11753257018815799 0 +76 0 -2.22932768 0.0971476 0.14743794057217838 0 +77 0 -2.47708964 0.077479966 0.11634785291703036 0 +78 0 -2.41123319 0.08232011 0.1239371005276802 0 +79 0 -2.58705831 0.06997599 0.10466012826020632 0 +80 0 -2.76758575 0.0591011234 0.087888417643977923 0 +81 0 -2.58375478 0.07019129 0.10499414907116332 0 +82 0 -2.69794416 0.06309478 0.094024986527322621 0 +83 0 -3.1041286 0.042937275 0.06331461422116523 0 +84 1 8.480363 0.9997925 0.00029936686178311424 1 +85 1 3.62424469 0.9740235 0.0379714836237331 1 +86 1 0.873991 0.705575466 0.50312769764048526 1 +87 1 6.5370903 0.998553336 0.0020886065803920047 1 +88 0 -2.70365119 0.06275825 0.09350687664921721 0 +89 0 -2.64684486 0.06618374 0.098789382822258742 0 +90 0 -2.37061882 0.08544078 0.12885149942120921 0 +91 0 -2.31983972 0.08949312 0.13525817349750544 0 +92 0 -2.70365119 0.06275825 0.09350687664921721 0 +93 0 -2.16523314 0.1029163 0.15668549713042432 0 +94 0 -2.49228716 0.07640065 0.11466094104662786 0 +95 0 -2.37061882 0.08544078 0.12885149942120921 0 +96 0 -2.19050217 0.10060665 0.15297587812753632 0 +97 0 -2.79334736 0.0576847345 0.085718279282943594 0 +98 1 5.520876 0.996013641 0.0057625933731902997 1 +99 1 11.3165894 0.999987841 1.7542337039908934E-05 1 +100 1 1.017416 0.734468937 0.44522661908047623 1 +101 1 -0.5716233 0.360862345 1.4704794870706024 0 +102 0 -2.66489172 0.0650770739 0.097080658952617693 0 +103 1 -2.88350773 0.05297488 4.2385477822371218 0 +104 1 13.1776581 0.9999981 2.751725038055267E-06 1 +105 1 -1.78037786 0.144256487 2.7932918938163764 0 +106 1 12.0229883 0.99999404 8.5991581706542968E-06 1 +107 1 7.51091671 0.999453247 0.00078901414592929902 1 +108 0 -2.25749826 0.0947046354 0.14353952759458233 0 +109 1 5.029805 0.993502438 0.0094045870149739464 1 +110 0 -2.56023145 0.07174213 0.10740245681394917 0 +111 1 1.76195621 0.85345453 0.22861380249667038 1 +112 1 5.949276 0.9973991 0.0037572056709905387 1 +113 1 9.109059 0.9998894 0.00015960872861869104 1 +114 0 -2.12039614 0.107130177 0.16347824413516199 0 +115 0 -1.8000406 0.14184612 0.22069172747506174 0 +116 0 -1.96252012 0.123194568 0.18967135852054179 0 +117 1 7.06990051 0.9991504 0.0012262413366360865 1 +118 0 -2.46007347 0.07870501 0.11826493158533567 0 +119 0 -2.44013214 0.0801631659 0.1205501245335563 0 +120 0 -2.431875 0.08077414 0.12150871514409342 0 +121 0 -2.50224543 0.07570092 0.11356834207574736 0 +122 1 10.23144 0.999964 5.1939695512002597E-05 1 +123 1 0.452518463 0.6112378 0.71019427344485664 1 +124 1 5.87042236 0.997186244 0.0040651143062878699 1 +125 0 -2.16523314 0.1029163 0.15668549713042432 0 +126 1 5.55969334 0.9961648 0.0055436631836815291 1 +127 0 -2.60329771 0.06892648 0.10303300888915028 0 +128 1 2.87807369 0.9467519 0.07894169481269693 1 +129 0 -4.29203844 0.0134924809 0.019598047692599548 0 +130 0 -2.56230116 0.0716044158 0.10718843415121884 0 +131 0 -2.49228716 0.07640065 0.11466094104662786 0 +132 1 11.527173 0.9999901 1.4274630640975531E-05 1 +133 0 -2.447955 0.0795882344 0.11964866931231606 0 +134 0 -2.709362 0.0624231733 0.092991182628501673 0 +135 0 -2.57368875 0.07085109 0.10601826253397174 0 +136 0 -2.546958 0.07263111 0.10878476978943961 0 +137 0 -2.253997 0.095005244 0.14401866240282399 0 +138 0 -2.52397871 0.0741941854 0.11121847131930589 0 +139 0 +140 0 -2.253997 0.095005244 0.14401866240282399 0 +141 0 -2.11052465 0.108078077 0.16501067045825779 0 +142 1 1.40640354 0.8031981 0.31617223990371063 1 +143 0 -1.8000406 0.14184612 0.22069172747506174 0 +144 0 -2.303132 0.0908639 0.1374318066173198 0 +145 0 +146 1 -0.608948231 0.352299154 1.5051270852918262 0 +147 0 -2.410581 0.08236938 0.12401456162100966 0 +148 0 -3.790462 0.0220863409 0.032221001014681734 0 +149 1 11.1856136 0.9999862 1.9950125438339949E-05 1 +150 0 -2.08552837 0.110511363 0.16895191862826214 0 +151 1 0.7081995 0.6700032 0.57776016109760775 1 +152 1 12.8261318 0.999997258 3.955606392614897E-06 1 +153 0 -2.22495723 0.0975316 0.14805168093637969 0 +154 0 -1.95639491 0.123857722 0.19076292420475424 0 +155 1 2.53439236 0.9265179 0.11010924008025842 1 +156 0 -2.179071 0.10164573 0.15464360520785025 0 +157 0 -2.49228716 0.07640065 0.11466094104662786 0 +158 0 +159 1 15.6741524 0.9999999 1.7198266111377426E-07 1 +160 1 9.474756 0.9999232 0.00011076107881739477 1 +161 0 -2.68982267 0.06357657 0.094767065231191869 0 +162 0 -2.60329771 0.06892648 0.10303300888915028 0 +163 0 -2.98970175 0.0478932858 0.070804811806733092 0 +164 0 +165 0 -2.566331 0.07133699 0.10677292670868219 0 +166 1 8.84706 0.999856234 0.00020742598774193681 1 +167 1 4.890644 0.992539465 0.010803626944692387 1 +168 0 -2.60329771 0.06892648 0.10303300888915028 0 +169 0 -1.76260591 0.146464273 0.22847655310970594 0 +170 0 -2.253997 0.095005244 0.14401866240282399 0 +171 0 -2.37061882 0.08544078 0.12885149942120921 0 +172 0 -2.16523314 0.1029163 0.15668549713042432 0 +173 1 22.0507126 1 0 1 +174 1 4.101033 0.9837141 0.023689008090051845 1 +175 1 8.803769 0.9998498 0.00021671441614871164 1 +176 0 -2.49228716 0.07640065 0.11466094104662786 0 +177 1 5.009384 0.9933693 0.0095979609700506362 1 +178 0 -2.70365119 0.06275825 0.09350687664921721 0 +179 1 -0.333506584 0.417387664 1.2605401318838831 0 +180 0 -2.08552837 0.110511363 0.16895191862826214 0 +181 0 -1.95639491 0.123857722 0.19076292420475424 0 +182 0 -2.87238669 0.0535355881 0.079379834832595766 0 +183 1 11.7801619 0.9999924 1.1006931643385188E-05 1 +184 1 4.80740261 0.991897166 0.011737536892369548 1 +185 0 -2.212134 0.09866614 0.14986650442098268 0 +186 1 5.877905 0.9972071 0.0040349327336088392 1 +187 1 12.8788414 0.9999975 3.6116401888020084E-06 1 +188 1 10.4632988 0.9999714 4.1276426673909545E-05 1 +189 0 -2.33616543 0.08817172 0.13316594116300465 0 +190 1 18.1290474 1 0 1 +191 1 13.2267113 0.9999982 2.5797420694119618E-06 1 +192 0 -2.652885 0.06581142 0.098214282791589516 0 +193 0 -2.37061882 0.08544078 0.12885149942120921 0 +194 0 -2.60329771 0.06892648 0.10303300888915028 0 +195 0 -2.70365119 0.06275825 0.09350687664921721 0 +196 0 4.31835938 0.986853361 6.249162189120602 1 +197 0 -2.78983569 0.0578759126 0.086011004864571042 0 +198 0 -1.95639491 0.123857722 0.19076292420475424 0 +199 0 -2.43037367 0.08088568 0.12168377661511501 0 +200 1 11.15968 0.9999858 2.0466080617959804E-05 1 +201 1 8.401458 0.999775469 0.00032396569438284837 1 +202 0 -2.37061882 0.08544078 0.12885149942120921 0 +203 0 -2.79334736 0.0576847345 0.085718279282943594 0 +204 0 -2.37061882 0.08544078 0.12885149942120921 0 +205 1 17.8429222 1 0 1 +206 1 6.46274567 0.998442 0.0022494800623383254 1 +207 0 -2.08552837 0.110511363 0.16895191862826214 0 +208 0 -2.08552837 0.110511363 0.16895191862826214 0 +209 0 -2.52800727 0.07391794 0.11078805913818714 0 +210 1 21.9436874 1 0 1 +211 1 13.0268564 0.999997854 3.0956910368479058E-06 1 +212 0 -2.37061882 0.08544078 0.12885149942120921 0 +213 1 22.5284481 1 0 1 +214 1 20.4712334 1 0 1 +215 1 8.525514 0.9998017 0.00028612151026144098 1 +216 0 -2.16523314 0.1029163 0.15668549713042432 0 +217 0 -2.37061882 0.08544078 0.12885149942120921 0 +218 1 9.455612 0.9999218 0.00011282503055519205 1 +219 0 -2.714654 0.0621141754 0.092515790827243469 0 +220 0 -2.43490982 0.08054909 0.12115554621880931 0 +221 1 9.159876 0.999894857 0.00015169667309156297 1 +222 1 -1.80774 0.14091149 2.8271388431147284 0 +223 1 3.70435333 0.9759753 0.035083495285141632 1 +224 1 9.788629 0.999944 8.0834110428232468E-05 1 +225 0 -2.16523314 0.1029163 0.15668549713042432 0 +226 1 10.3669252 0.9999685 4.5404134294015166E-05 1 +227 1 8.810473 0.999850869 0.00021516634059471509 1 +228 0 -2.08552837 0.110511363 0.16895191862826214 0 +229 1 17.6545982 1 0 1 +230 1 4.3147707 0.9868068 0.019160423251940339 1 +231 1 9.426738 0.9999194 0.00011626495667983538 1 +232 0 -0.812353134 0.3073893 0.52988339666190787 0 +233 1 3.34824562 0.9660473 0.049834285709967709 1 +234 0 -2.38382244 0.08441466 0.12723373315285244 0 +235 0 +236 1 10.7871552 0.9999794 2.9753305404609972E-05 1 +237 1 6.06969929 0.9976935 0.0033314498282712543 1 +238 1 16.8129368 1 0 1 +239 1 2.5463686 0.9273292 0.10884653830325543 1 +240 0 -2.16806126 0.102655485 0.15626611390641998 0 +241 0 -2.40176368 0.08303831 0.12506663099210433 0 +242 0 -2.49228716 0.07640065 0.11466094104662786 0 +243 0 -2.34700274 0.0873043 0.13179416296824689 0 +244 0 -2.37061882 0.08544078 0.12885149942120921 0 +245 0 -2.65912771 0.06542865 0.097623286813018989 0 +246 1 17.1139336 1 0 1 +247 1 1.33216 0.7911977 0.33788983133296008 1 +248 0 -2.59526634 0.0694436952 0.10383464946038788 0 +249 0 +250 0 -2.00470734 0.118709572 0.18231055874000973 0 +251 1 6.54015732 0.998557866 0.0020820617863629202 1 +252 0 2.0749712 0.8884466 3.1641939848631071 1 +253 1 8.853592 0.9998572 0.00020604992936022588 1 +254 1 6.41300774 0.9983626 0.0023642038022797952 1 +255 1 3.7826376 0.977744043 0.032471253848047714 1 +256 0 -2.253997 0.095005244 0.14401866240282399 0 +257 0 -2.43037367 0.08088568 0.12168377661511501 0 +258 0 -2.60329771 0.06892648 0.10303300888915028 0 +259 0 2.46353149 0.9215453 3.6719968033606416 1 +260 1 8.69649 0.999832869 0.0002411398280924362 1 +261 1 14.626255 0.9999995 6.8793076746672365E-07 1 +262 1 11.909255 0.9999933 9.6310605954860058E-06 1 +263 1 7.177536 0.999237061 0.0011011090587247259 1 +264 1 3.13080788 0.958145857 0.061682803281407773 1 +265 0 -2.517743 0.0746236444 0.111887857908842 0 +266 1 7.81477261 0.9995964 0.00058236478868097896 1 +267 1 0.570395947 0.638854563 0.64644055930061062 1 +268 1 7.142889 0.9992101 0.0011400073388397399 1 +269 0 -2.37061882 0.08544078 0.12885149942120921 0 +270 1 5.226963 0.9946589 0.0077262484789402371 1 +271 0 -2.79334736 0.0576847345 0.085718279282943594 0 +272 1 0.570395947 0.638854563 0.64644055930061062 1 +273 1 -1.541533 0.176312521 2.5037931614232587 0 +274 0 -2.60472631 0.06883486 0.10289105134144588 0 +275 0 +276 0 -2.43037367 0.08088568 0.12168377661511501 0 +277 0 -2.16523314 0.1029163 0.15668549713042432 0 +278 0 -2.37061882 0.08544078 0.12885149942120921 0 +279 1 3.33338261 0.9655565 0.050567409752020474 1 +280 0 -2.60329771 0.06892648 0.10303300888915028 0 +281 0 -2.54244328 0.0729358 0.10925884045202583 0 +282 1 3.29053974 0.964102864 0.052741012904588061 1 +283 1 3.700367 0.9758816 0.035222007864660711 1 +284 1 7.36733246 0.999368846 0.00091084961823976909 1 +285 1 20.352438 1 0 1 +286 1 21.9562721 1 0 1 +287 0 -2.709362 0.0624231733 0.092991182628501673 0 +288 1 -0.586700439 0.357392281 1.4844196184802794 0 +289 1 8.823527 0.9998528 0.0002124142103781059 1 +290 0 -1.95639491 0.123857722 0.19076292420475424 0 +291 0 -2.37061882 0.08544078 0.12885149942120921 0 +292 1 +293 1 3.77584267 0.9775957 0.032690174791706848 1 +294 0 +295 1 6.63497543 0.998688161 0.0018938255499461618 1 +296 0 0.0507936478 0.51269567 1.0371050534420929 1 +297 0 +298 0 -3.44531822 0.0309087858 0.045295631375104138 0 +299 1 3.52736 0.971456349 0.041778923210622917 1 +300 1 6.63810539 0.9986922 0.00188797047076344 1 +301 0 -2.37061882 0.08544078 0.12885149942120921 0 +302 1 21.63637 1 0 1 +303 0 -2.37061882 0.08544078 0.12885149942120921 0 +304 1 3.82702637 0.97868973 0.031076534032479262 1 +305 1 9.007427 0.999877453 0.00017680899902768678 1 +306 0 -2.37061882 0.08544078 0.12885149942120921 0 +307 0 -2.37061882 0.08544078 0.12885149942120921 0 +308 1 6.49249649 0.9984875 0.0021837677951713447 1 +309 0 -2.367922 0.08565173 0.12918431538000874 0 +310 0 -2.58705831 0.06997599 0.10466012826020632 0 +311 0 -1.95639491 0.123857722 0.19076292420475424 0 +312 1 0.721348763 0.672903955 0.571527494298949 1 +313 0 -1.95639491 0.123857722 0.19076292420475424 0 +314 0 -1.876097 0.132837832 0.20562627776187412 0 +315 0 +316 1 1.90932846 0.870943666 0.19934868964045313 1 +317 1 11.0919495 0.999984741 2.2013947263955502E-05 1 +318 0 -3.22425485 0.0382631 0.056285823149524759 0 +319 0 -0.5100851 0.375173569 0.67847261153874627 0 +320 1 3.40061569 0.9677238 0.047332770769414431 1 +321 0 +322 0 -2.60329771 0.06892648 0.10303300888915028 0 +323 1 4.2277 0.985623837 0.020890948016973505 1 +324 0 -2.37061882 0.08544078 0.12885149942120921 0 +325 0 -2.33610034 0.08817695 0.13317421658132386 0 +326 1 0.397289276 0.59803617 0.74169535175171442 1 +327 0 -2.16523314 0.1029163 0.15668549713042432 0 +328 1 3.29097939 0.964118063 0.052718268842774099 1 +329 1 4.33795357 0.98710525 0.018724174263564545 1 +330 1 2.89053345 0.947376549 0.077990134080806572 1 +331 0 -2.99748755 0.0475395061 0.070268841071409238 0 +332 0 -2.44493961 0.0798094 0.11999537191367729 0 +333 1 3.38947582 0.967374 0.047854291800112088 1 +334 1 5.177353 0.994388759 0.0081181070550104366 1 +335 0 -1.95639491 0.123857722 0.19076292420475424 0 +336 1 4.698082 0.9909696 0.013087296874456903 1 +337 0 -2.37061882 0.08544078 0.12885149942120921 0 +338 0 -1.876097 0.132837832 0.20562627776187412 0 +339 1 4.343502 0.987175643 0.018621295533697572 1 +340 1 3.39017 0.9673959 0.047821668989543743 1 +341 0 -2.37061882 0.08544078 0.12885149942120921 0 +342 0 -2.11052465 0.108078077 0.16501067045825779 0 +343 0 -1.95639491 0.123857722 0.19076292420475424 0 +344 1 7.7177906 0.9995553 0.00064172398023939646 1 +345 0 -1.95639491 0.123857722 0.19076292420475424 0 +346 0 -2.565462 0.07139457 0.10686237809729705 0 +347 0 -1.79727888 0.142182633 0.22125757090956827 0 +348 1 -1.28854942 0.216098443 2.2102394195203448 0 +349 1 1.21367073 0.770947754 0.37529500004713245 1 +350 0 -2.57519341 0.0707521 0.10586457082203461 0 +351 0 -2.49228716 0.07640065 0.11466094104662786 0 +352 0 -1.23204327 0.225824 0.36926650823776686 0 +353 1 11.2146692 0.9999865 1.9434170443242565E-05 1 +354 0 -2.16523314 0.1029163 0.15668549713042432 0 +355 0 -2.8185854 0.0563280769 0.083642715320436059 0 +356 1 -2.201137 0.09964843 3.3270091010964316 0 +357 1 14.1900883 0.9999993 1.031896274211761E-06 1 +358 1 5.223918 0.9946426 0.0077498503631306228 1 +359 1 2.35608578 0.9134167 0.13065495391893572 1 +360 1 21.4813557 1 0 1 +361 1 5.294572 0.9950063 0.0072224014614089942 1 +362 0 -2.63699365 0.06679519 0.099734355600720456 0 +363 0 -1.5586791 0.173836261 0.27550035442459786 0 +364 0 -2.49228716 0.07640065 0.11466094104662786 0 +365 0 -2.303132 0.0908639 0.1374318066173198 0 +366 1 19.947937 1 0 1 +367 1 15.1915445 0.999999762 3.4396534272948301E-07 1 +368 0 -2.03972268 0.115094975 0.17640547222344355 0 +369 0 -1.93949687 0.125703141 0.19380487905648439 0 +370 0 -2.61506629 0.0681750551 0.10186914304032915 0 +371 0 -2.03972268 0.115094975 0.17640547222344355 0 +372 0 -2.52397871 0.0741941854 0.11121847131930589 0 +373 0 -2.67554665 0.06443181 0.096085283332132315 0 +374 0 -2.4251883 0.08127202 0.12229032950777963 0 +375 0 -1.95639491 0.123857722 0.19076292420475424 0 +376 0 -2.16523314 0.1029163 0.15668549713042432 0 +377 0 -1.876097 0.132837832 0.20562627776187412 0 +378 0 -2.79220486 0.0577468649 0.085813404732194079 0 +379 0 -2.74447179 0.06039962 0.089880800720694584 0 +380 0 -1.95639491 0.123857722 0.19076292420475424 0 +381 1 8.746121 0.999841 0.00022944310035113074 1 +382 0 -2.4639585 0.07842376 0.11782457436958683 0 +383 0 -2.11052465 0.108078077 0.16501067045825779 0 +384 0 -2.11052465 0.108078077 0.16501067045825779 0 +385 0 -2.79314542 0.05769571 0.085735081775246871 0 +386 1 4.176774 0.984884 0.021974246797932556 1 +387 0 -2.563189 0.0715454146 0.10709675129529037 0 +388 0 -2.33597 0.08818744 0.13319081471442681 0 +389 0 -2.77166653 0.0588746034 0.087541132766088936 0 +390 0 -2.24443483 0.09583059 0.14533498514227941 0 +391 1 12.28669 0.999995351 6.7073389754153415E-06 1 +392 0 -2.43037367 0.08088568 0.12168377661511501 0 +393 0 -1.663213 0.159331158 0.25039049156336257 0 +394 0 -2.18103456 0.101466566 0.15435590868043605 0 +395 0 -2.43037367 0.08088568 0.12168377661511501 0 +396 0 -2.60329771 0.06892648 0.10303300888915028 0 +397 0 -2.386812 0.0841838941 0.12687015785045277 0 +398 0 -2.39560652 0.0835083351 0.12580633468481714 0 +399 0 -2.0224514 0.116865739 0.17929531088912914 0 +400 1 9.442846 0.9999207 0.00011437299629627494 1 +401 0 -2.253997 0.095005244 0.14401866240282399 0 +402 0 -2.32173133 0.0893391 0.13501415250433074 0 +403 0 -2.04644132 0.114412457 0.17529316569822423 0 +404 0 -2.143785 0.104913421 0.15990085822156069 0 +405 0 -2.16523314 0.1029163 0.15668549713042432 0 +406 0 -2.44775438 0.07960292 0.11967168757719346 0 +407 0 -2.16523314 0.1029163 0.15668549713042432 0 +408 0 -2.22424483 0.09759433 0.14815195953491689 0 +409 0 -2.4251883 0.08127202 0.12229032950777963 0 +410 0 -2.16523314 0.1029163 0.15668549713042432 0 +411 0 +412 1 10.2703123 0.9999653 5.0047819483104426E-05 1 +413 0 -2.73679447 0.0608368 0.090552214775961787 0 +414 1 5.42697239 0.9956228 0.0063288062748059282 1 +415 0 -1.37955284 0.201080829 0.32387854587592818 0 +416 1 7.32360268 0.9993406 0.00095163582501576051 1 +417 0 -2.16523314 0.1029163 0.15668549713042432 0 +418 0 -2.48652363 0.07680834 0.11529790529919315 0 +419 0 -2.92190623 0.05108122 0.075643488086837282 0 +420 0 -2.17014742 0.102463476 0.15595744686821872 0 +421 1 14.1832743 0.9999993 1.031896274211761E-06 1 +422 0 -2.21935058 0.09802621 0.14884258107085416 0 +423 0 -2.56230116 0.0716044158 0.10718843415121884 0 +424 0 -2.253997 0.095005244 0.14401866240282399 0 +425 1 23.2536659 1 0 1 +426 0 -1.97403908 0.121955715 0.18763438978981944 0 +427 1 3.93143272 0.9807618 0.028025268445269182 1 +428 0 -2.16523314 0.1029163 0.15668549713042432 0 +429 0 -2.303132 0.0908639 0.1374318066173198 0 +430 0 -2.1786294 0.10168606 0.15470837385047881 0 +431 0 -3.24330187 0.0375683233 0.055243967912172835 0 +432 0 -2.63995266 0.06661098 0.099449594195521407 0 +433 0 -2.278904 0.09288526 0.14064305278762584 0 +434 0 4.94386959 0.9929235 7.1427479209872091 1 +435 1 7.12867451 0.999198854 0.0011562726386102314 1 +436 1 4.3324194 0.9870346 0.018827408813728724 1 +437 0 -2.386812 0.0841838941 0.12687015785045277 0 +438 0 -2.38723946 0.08415094 0.12681824612014014 0 +439 0 -2.50897 0.07523173 0.11283619840279428 0 +440 1 6.34583759 0.998249054 0.0025282952766864627 1 +441 0 -1.81499052 0.140036061 0.21765193123843524 0 +442 0 -2.020601 0.117056854 0.17960755137882647 0 +443 0 -1.93714356 0.125962 0.19423209736428568 0 +444 0 -2.91968775 0.0511888638 0.075807152007862255 0 +445 0 -2.11052465 0.108078077 0.16501067045825779 0 +446 0 -1.95639491 0.123857722 0.19076292420475424 0 +447 0 -2.50897 0.07523173 0.11283619840279428 0 +448 0 -1.663213 0.159331158 0.25039049156336257 0 +449 1 13.44416 0.999998569 2.0637932864940443E-06 1 +450 0 -2.347867 0.08723546 0.13168534659555281 0 +451 0 -2.50897 0.07523173 0.11283619840279428 0 +452 0 -2.37676024 0.08496209 0.12809658311879946 0 +453 1 7.50886631 0.999452055 0.00079073491429955357 1 +454 0 -2.37708616 0.08493676 0.12805664400028163 0 +455 1 -1.54050016 0.176462576 2.5025658459084399 0 +456 1 10.2714491 0.9999654 4.9875830876224796E-05 1 +457 1 9.928566 0.999951243 7.0342619050273796E-05 1 +458 0 -2.483977 0.07698911 0.11558042055485453 0 +459 0 -2.44994617 0.0794424862 0.11942023498557051 0 +460 0 -2.57519341 0.0707521 0.10586457082203461 0 +461 0 -1.95080662 0.124465436 0.19176396054905676 0 +462 0 -2.65842414 0.06547169 0.097689720656269172 0 +463 0 -2.40528941 0.0827702358 0.12464492366430695 0 +464 0 -2.386812 0.0841838941 0.12687015785045277 0 +465 1 11.50494 0.999989867 1.4618599387059818E-05 1 +466 1 8.586574 0.9998135 0.00026909195127407725 1 +467 1 6.92544365 0.999018431 0.0014168006049970199 1 +468 0 -2.386812 0.0841838941 0.12687015785045277 0 +469 0 -2.1956358 0.100143082 0.15223247204165077 0 +470 0 -2.15111279 0.104227282 0.15879536747436127 0 +471 0 -2.65842414 0.06547169 0.097689720656269172 0 +472 0 -2.35197687 0.0869087651 0.13116907530431268 0 +473 0 -2.386812 0.0841838941 0.12687015785045277 0 +474 0 -2.50897 0.07523173 0.11283619840279428 0 +475 0 -2.253997 0.095005244 0.14401866240282399 0 +476 0 -2.379613 0.08474059 0.12774738819728162 0 +477 0 -2.386812 0.0841838941 0.12687015785045277 0 +478 0 -2.45095563 0.0793686956 0.11930459528595055 0 +479 1 9.896286 0.9999497 7.2578504258149067E-05 1 +480 0 -2.23553848 0.09660421 0.14656990931584829 0 +481 0 -2.2461 0.0956864059 0.14510494370298066 0 +482 1 19.90526 1 0 1 +483 1 13.2226048 0.9999982 2.5797420694119618E-06 1 +484 0 -2.483977 0.07698911 0.11558042055485453 0 +485 0 -1.75304985 0.147662938 0.23050402825087019 0 +486 0 -2.15111279 0.104227282 0.15879536747436127 0 +487 1 16.2562943 0.9999999 1.7198266111377426E-07 1 +488 1 0.896533 0.710236549 0.49362849030318379 1 +489 1 -2.11052513 0.108078033 3.2098547752295934 0 +490 0 -1.95639491 0.123857722 0.19076292420475424 0 +491 1 6.42460346 0.9983815 0.0023369001030092021 1 +492 0 -2.27263451 0.09341486 0.14148557773460221 0 +493 1 13.9223871 0.999999046 1.3758618629646341E-06 1 +494 0 -1.544085 0.175942212 0.27918258388346984 0 +495 0 -2.15111279 0.104227282 0.15879536747436127 0 +496 0 -1.663213 0.159331158 0.25039049156336257 0 +497 0 -2.34868431 0.08717041 0.13158253208596138 0 +498 0 -2.546958 0.07263111 0.10878476978943961 0 +499 0 -2.546958 0.07263111 0.10878476978943961 0 +500 0 -2.87238669 0.0535355881 0.079379834832595766 0 +501 0 -2.546958 0.07263111 0.10878476978943961 0 +502 0 -2.58375478 0.07019129 0.10499414907116332 0 +503 0 -2.70365119 0.06275825 0.09350687664921721 0 +504 0 -1.95639491 0.123857722 0.19076292420475424 0 +505 0 -2.207967 0.09903733 0.15046075844804158 0 +506 1 13.1352835 0.999998 2.9237080272005804E-06 1 +507 0 -1.85896659 0.134823546 0.20893369205937654 0 +508 0 -2.50897 0.07523173 0.11283619840279428 0 +509 0 -2.11052465 0.108078077 0.16501067045825779 0 +510 0 -1.95639491 0.123857722 0.19076292420475424 0 +511 0 -2.652885 0.06581142 0.098214282791589516 0 +512 0 -2.50897 0.07523173 0.11283619840279428 0 +513 0 -2.15111279 0.104227282 0.15879536747436127 0 +514 1 13.1494493 0.9999981 2.751725038055267E-06 1 +515 1 11.2234116 0.999986649 1.926218548588174E-05 1 +516 0 -1.663213 0.159331158 0.25039049156336257 0 +517 0 -1.876097 0.132837832 0.20562627776187412 0 +518 0 -2.3127768 0.09007031 0.1361730175390829 0 +519 1 4.88246536 0.9924787 0.010891913451001586 1 +520 0 -2.249304 0.09540951 0.14466326997414256 0 +521 0 -2.66490865 0.0650760457 0.097079072351726234 0 +522 1 2.02141762 0.883027554 0.17946963916334691 1 +523 1 6.809782 0.998898268 0.0015903398846003496 1 +524 0 -2.43037367 0.08088568 0.12168377661511501 0 +525 0 -2.31983972 0.08949312 0.13525817349750544 0 +526 0 -2.386812 0.0841838941 0.12687015785045277 0 +527 0 -2.70365119 0.06275825 0.09350687664921721 0 +528 0 -2.51398182 0.0748837963 0.11229350114078318 0 +529 0 -2.27263451 0.09341486 0.14148557773460221 0 +530 1 4.92369843 0.992780268 0.010453653133861311 1 +531 0 -2.44775438 0.07960292 0.11967168757719346 0 +532 0 -2.08552837 0.110511363 0.16895191862826214 0 +533 0 -2.43037367 0.08088568 0.12168377661511501 0 +534 0 -2.303132 0.0908639 0.1374318066173198 0 +535 0 -2.41980267 0.08167506 0.12292336799782667 0 +536 0 -2.79334736 0.0576847345 0.085718279282943594 0 +537 0 -2.73679447 0.0608368 0.090552214775961787 0 +538 0 -2.546958 0.07263111 0.10878476978943961 0 +539 0 -2.74815464 0.0601909533 0.089560439570368855 0 +540 0 -2.543486 0.0728653148 0.10914915993929039 0 +541 0 -2.253997 0.095005244 0.14401866240282399 0 +542 0 -2.38339472 0.08444773 0.12728583594126508 0 +543 0 -2.546958 0.07263111 0.10878476978943961 0 +544 0 -2.34906387 0.08714021 0.13153480725866068 0 +545 0 -2.652885 0.06581142 0.098214282791589516 0 +546 1 18.4379044 1 0 1 +547 0 -1.82228041 0.139160469 0.21618376511481502 0 +548 0 -1.97069025 0.122314766 0.18822445904268387 0 +549 1 5.37553024 0.9953929 0.0066619714409914422 1 +550 0 -2.43037367 0.08088568 0.12168377661511501 0 +551 0 -2.37061882 0.08544078 0.12885149942120921 0 +552 0 -2.567891 0.07123372 0.10661249990663338 0 +553 0 -1.67024612 0.158391356 0.24877857334123982 0 +554 0 -2.253997 0.095005244 0.14401866240282399 0 +555 0 -2.15087152 0.104249813 0.15883165472574934 0 +556 0 -2.25254679 0.09513001 0.14421757377759611 0 +557 0 -2.57519341 0.0707521 0.10586457082203461 0 +558 0 -2.303132 0.0908639 0.1374318066173198 0 +559 0 -2.652885 0.06581142 0.098214282791589516 0 +560 0 -2.79334736 0.0576847345 0.085718279282943594 0 +561 0 -2.79334736 0.0576847345 0.085718279282943594 0 +562 0 -2.37061882 0.08544078 0.12885149942120921 0 +563 0 -2.43037367 0.08088568 0.12168377661511501 0 +564 0 -2.68982267 0.06357657 0.094767065231191869 0 +565 1 16.7462845 1 0 1 +566 0 -2.58233213 0.07028419 0.10513830229728056 0 +567 0 -2.35164356 0.08693522 0.13121087830396089 0 +568 1 1.66488457 0.840892553 0.25000662577655486 1 +569 1 11.8811359 0.9999931 9.9750282344474815E-06 1 +570 1 6.743778 0.9988232 0.001698726443122326 1 +571 1 13.4375887 0.999998569 2.0637932864940443E-06 1 +572 0 -2.43037367 0.08088568 0.12168377661511501 0 +573 0 -2.16523314 0.1029163 0.15668549713042432 0 +574 1 5.289529 0.9949812 0.0072587859583563598 1 +575 0 -2.73679447 0.0608368 0.090552214775961787 0 +576 0 -2.652885 0.06581142 0.098214282791589516 0 +577 0 -2.16523314 0.1029163 0.15668549713042432 0 +578 0 -2.16523314 0.1029163 0.15668549713042432 0 +579 0 -2.37061882 0.08544078 0.12885149942120921 0 +580 0 -2.61211181 0.06836298 0.10216012821346472 0 +581 1 9.491055 0.9999244 0.00010904112129145599 1 +582 1 10.5543289 0.9999739 3.7664692194035506E-05 1 +583 0 -2.253997 0.095005244 0.14401866240282399 0 +584 0 -2.854372 0.0544557646 0.080783141512571238 0 +585 0 -1.95639491 0.123857722 0.19076292420475424 0 +586 1 22.14612 1 0 1 +587 0 -2.63995266 0.06661098 0.099449594195521407 0 +588 1 4.183667 0.984986365 0.021824341396277779 1 +589 0 -2.50897 0.07523173 0.11283619840279428 0 +590 1 2.24761486 0.904444635 0.14489590312889089 1 +591 1 5.37478161 0.995389462 0.0066669820307222651 1 +592 1 2.52463913 0.925851166 0.11114780094090568 1 +593 0 -2.483977 0.07698911 0.11558042055485453 0 +594 1 3.883813 0.9798425 0.029378249558157231 1 +595 0 -2.652885 0.06581142 0.098214282791589516 0 +596 0 -2.52397871 0.0741941854 0.11121847131930589 0 +597 0 -2.67120314 0.06469413 0.096489851264687398 0 +598 0 -2.43037367 0.08088568 0.12168377661511501 0 +599 0 -2.042253 0.114837505 0.17598577040139771 0 +600 0 -2.43037367 0.08088568 0.12168377661511501 0 +601 0 -1.876097 0.132837832 0.20562627776187412 0 +602 0 -2.546958 0.07263111 0.10878476978943961 0 +603 1 2.76534462 0.9407741 0.088079778169719514 1 +604 1 1.64908409 0.8387672 0.25365769899634338 1 +605 1 9.463315 0.9999224 0.00011196505030560377 1 +606 0 -2.43851948 0.08028216 0.12073676854570529 0 +607 0 -1.95639491 0.123857722 0.19076292420475424 0 +608 1 13.1060286 0.999998 2.9237080272005804E-06 1 +609 0 -2.50897 0.07523173 0.11283619840279428 0 +610 1 5.4565506 0.995749831 0.0061447648647644489 1 +611 1 8.201106 0.999725759 0.00039570034941416836 1 +612 1 24.51187 1 0 1 +613 0 -2.25948548 0.0945344046 0.14326827011600504 0 +614 0 -2.0189333 0.117229328 0.1798893939370643 0 +615 0 -2.491962 0.0764236 0.11469678675361461 0 +616 0 -2.43037367 0.08088568 0.12168377661511501 0 +617 0 +618 0 -2.546958 0.07263111 0.10878476978943961 0 +619 0 -2.652885 0.06581142 0.098214282791589516 0 +620 0 -2.43037367 0.08088568 0.12168377661511501 0 +621 0 -2.19200563 0.100470684 0.15275779542018131 0 +622 0 -2.700953 0.06291714 0.093751478225403542 0 +623 0 -1.95639491 0.123857722 0.19076292420475424 0 +624 0 -2.41144156 0.0823043659 0.1239123508690735 0 +625 0 -2.19398546 0.1002919 0.15247108397309578 0 +626 1 3.657977 0.9748635 0.03672782424977717 1 +627 0 -1.88075233 0.1323025 0.20473591051784815 0 +628 0 -2.11052465 0.108078077 0.16501067045825779 0 +629 0 -2.386812 0.0841838941 0.12687015785045277 0 +630 0 -2.40915632 0.08247714 0.12418398785058164 0 +631 0 -2.652885 0.06581142 0.098214282791589516 0 +632 0 -1.95639491 0.123857722 0.19076292420475424 0 +633 1 3.20818138 0.961141 0.057180018700639101 1 +634 0 -2.253997 0.095005244 0.14401866240282399 0 +635 0 -2.25866842 0.09460436 0.14337973262597348 0 +636 1 11.0438576 0.999984 2.3045859283900738E-05 1 +637 0 -2.06156754 0.112888753 0.17281306044669567 0 +638 0 -2.386812 0.0841838941 0.12687015785045277 0 +639 0 -2.57519341 0.0707521 0.10586457082203461 0 +640 0 -2.48130536 0.07717918 0.11587753928641568 0 +641 0 -2.43037367 0.08088568 0.12168377661511501 0 +642 0 -2.43037367 0.08088568 0.12168377661511501 0 +643 0 -1.95639491 0.123857722 0.19076292420475424 0 +644 0 -2.11052465 0.108078077 0.16501067045825779 0 +645 0 -2.43037367 0.08088568 0.12168377661511501 0 +646 0 -2.00470734 0.118709572 0.18231055874000973 0 +647 0 -2.135698 0.105675265 0.16112931691390375 0 +648 1 13.45014 0.999998569 2.0637932864940443E-06 1 +649 0 -2.43037367 0.08088568 0.12168377661511501 0 +650 0 -2.31990623 0.0894877 0.13524959098307188 0 +651 0 -2.28205872 0.09261979 0.14022090268098497 0 +652 0 -2.63995266 0.06661098 0.099449594195521407 0 +653 0 -2.546958 0.07263111 0.10878476978943961 0 +654 0 -2.60329771 0.06892648 0.10303300888915028 0 +655 0 -2.43037367 0.08088568 0.12168377661511501 0 +656 0 -2.652885 0.06581142 0.098214282791589516 0 +657 0 -2.3856678 0.0842721462 0.12700918908215508 0 +658 1 9.13554 0.999892235 0.00015548069423433847 1 +659 0 -1.95639491 0.123857722 0.19076292420475424 0 +660 0 -2.16523314 0.1029163 0.15668549713042432 0 +661 0 -2.70365119 0.06275825 0.09350687664921721 0 +662 0 -2.21700072 0.09823417 0.14917524963571913 0 +663 0 -2.21700072 0.09823417 0.14917524963571913 0 +664 0 -2.52331543 0.07423976 0.11128949348681842 0 +665 0 -1.95639491 0.123857722 0.19076292420475424 0 +666 0 -2.6012094 0.06906062 0.10324087369927021 0 +667 0 -2.60329771 0.06892648 0.10303300888915028 0 +668 1 0.230495453 0.557370067 0.84329256977903522 1 +669 1 11.8682785 0.999992967 1.0147012084681539E-05 1 +670 1 7.613348 0.9995065 0.00071218392983748437 1 +671 0 -2.56594157 0.071362786 0.10681299857820942 0 +672 0 -2.49228716 0.07640065 0.11466094104662786 0 +673 0 -2.57178926 0.07097623 0.10621258116698419 0 +674 0 -2.16523314 0.1029163 0.15668549713042432 0 +675 0 -2.33810186 0.08801616 0.13291983400253021 0 +676 0 -2.1956358 0.100143082 0.15223247204165077 0 +677 0 -2.50897 0.07523173 0.11283619840279428 0 +678 0 -1.95639491 0.123857722 0.19076292420475424 0 +679 0 -2.11052465 0.108078077 0.16501067045825779 0 +680 1 25.43999 1 0 1 +681 1 14.1827745 0.9999993 1.031896274211761E-06 1 +682 0 -2.7642622 0.05928621 0.088172242863683387 0 +683 0 -1.95639491 0.123857722 0.19076292420475424 0 +684 0 -1.95639491 0.123857722 0.19076292420475424 0 +685 0 -1.95639491 0.123857722 0.19076292420475424 0 +686 0 -1.95639491 0.123857722 0.19076292420475424 0 +687 0 -2.46161175 0.07859354 0.11809037777838542 0 +688 0 -2.386812 0.0841838941 0.12687015785045277 0 +689 0 -3.64467454 0.0254645254 0.037213392183878896 0 +690 0 -2.135698 0.105675265 0.16112931691390375 0 +691 1 5.792588 0.9969592 0.0043936168831631463 1 +692 0 -2.253997 0.095005244 0.14401866240282399 0 +693 0 -2.65598679 0.06562097 0.097920204018736551 0 +694 0 -2.47353578 0.0777343661 0.11674575467283718 0 +695 0 -2.11052465 0.108078077 0.16501067045825779 0 +696 1 7.72577858 0.999558866 0.00063656221445328599 1 +697 1 3.85642529 0.97929436 0.030185519608588427 1 +698 1 5.01899147 0.993432164 0.009506637452477578 1 diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart-out.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart-out.txt new file mode 100644 index 0000000000..44635aa70a --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart-out.txt @@ -0,0 +1,65 @@ +maml.exe CV tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3702 (134.0/(134.0+228.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 128 | 6 | 0.9552 + negative || 10 | 218 | 0.9561 + ||====================== +Precision || 0.9275 | 0.9732 | +OVERALL 0/1 ACCURACY: 0.955801 +LOG LOSS/instance: 0.301908 +Test-set entropy (prior Log-Loss/instance): 0.950799 +LOG-LOSS REDUCTION (RIG): 68.246963 +AUC: 0.982473 +TEST POSITIVE RATIO: 0.3175 (107.0/(107.0+230.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 100 | 7 | 0.9346 + negative || 8 | 222 | 0.9652 + ||====================== +Precision || 0.9259 | 0.9694 | +OVERALL 0/1 ACCURACY: 0.955490 +LOG LOSS/instance: 0.290926 +Test-set entropy (prior Log-Loss/instance): 0.901650 +LOG-LOSS REDUCTION (RIG): 67.734017 +AUC: 0.992076 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.987274 (0.0048) +Accuracy: 0.955645 (0.0002) +Positive precision: 0.926731 (0.0008) +Positive recall: 0.944902 (0.0103) +Negative precision: 0.971323 (0.0019) +Negative recall: 0.960679 (0.0045) +Log-loss: 0.296417 (0.0055) +Log-loss reduction: 67.990490 (0.2565) +F1 Score: 0.935705 (0.0055) +AUPRC: 0.969894 (0.0121) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart-rp.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart-rp.txt new file mode 100644 index 0000000000..e91ca11d6f --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.987274 0.955645 0.926731 0.944902 0.971323 0.960679 0.296417 67.99049 0.935705 0.969894 10 0.2 20 10 dart 1 LightGBM %Data% %Output% 99 0 0 maml.exe CV tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:dart;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart.txt new file mode 100644 index 0000000000..d69c5c6cb2 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-CV-breast-cancer.dart.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +5 1 3.77653313 0.868557751 0.20330631668376986 1 +6 0 -2.74509573 0.202208519 0.32591637677515645 0 +8 0 -4.4950676 0.0955624059 0.14490713407046754 0 +9 0 -4.4950676 0.0955624059 0.14490713407046754 0 +10 0 -3.95260167 0.12171372 0.18723682820261706 0 +11 0 -4.4950676 0.0955624059 0.14490713407046754 0 +18 1 3.28788471 0.8380707 0.25485615558954922 1 +20 1 -0.3835451 0.452203244 1.1449567532979168 0 +21 1 3.795565 0.86964035 0.20150921352918599 1 +25 1 2.431195 0.771287858 0.37465869453483419 1 +28 0 -4.4950676 0.0955624059 0.14490713407046754 0 +31 0 -4.4950676 0.0955624059 0.14490713407046754 0 +32 1 3.795565 0.86964035 0.20150921352918599 1 +35 0 -4.4950676 0.0955624059 0.14490713407046754 0 +37 0 -3.2884233 0.1618928 0.25479331060492399 0 +40 0 3.71898818 0.865237951 2.8915138285634061 1 +41 1 2.85972857 0.8068802 0.30957364967249296 1 +44 1 2.818191 0.803623259 0.31540877464917566 1 +45 0 -4.4950676 0.0955624059 0.14490713407046754 0 +46 1 3.64076519 0.860612035 0.2165650798143455 1 +48 0 -4.4950676 0.0955624059 0.14490713407046754 0 +50 1 -0.241797015 0.469812125 1.089844147810425 0 +51 1 0.876064658 0.607790053 0.71835503102185272 1 +52 1 3.17948556 0.830579937 0.26780907245677338 1 +54 1 3.43507361 0.8478113 0.238184930668183 1 +56 1 2.81186 0.803123236 0.31630671499593227 1 +60 1 1.62435508 0.6925733 0.52996130624785442 1 +63 1 0.6347586 0.578685462 0.78914869318271175 1 +64 0 -4.4950676 0.0955624059 0.14490713407046754 0 +66 0 -4.4950676 0.0955624059 0.14490713407046754 0 +68 1 2.81988215 0.803756654 0.31516931839473161 1 +69 0 -4.4950676 0.0955624059 0.14490713407046754 0 +70 0 -4.10267258 0.113917425 0.17448694396780215 0 +71 1 0.4324849 0.553850949 0.85243032140019048 1 +72 0 -1.42108059 0.329479456 0.5766465594047967 0 +73 1 3.45060849 0.8488108 0.23648509577227655 1 +74 1 1.8917346 0.7202833 0.47336358049787608 1 +76 0 -4.10267258 0.113917425 0.17448694396780215 0 +77 0 -4.4950676 0.0955624059 0.14490713407046754 0 +79 0 -4.4950676 0.0955624059 0.14490713407046754 0 +82 0 -4.4950676 0.0955624059 0.14490713407046754 0 +88 0 -4.4950676 0.0955624059 0.14490713407046754 0 +90 0 -4.4950676 0.0955624059 0.14490713407046754 0 +91 0 -4.4950676 0.0955624059 0.14490713407046754 0 +92 0 -4.4950676 0.0955624059 0.14490713407046754 0 +93 0 -4.4950676 0.0955624059 0.14490713407046754 0 +95 0 -4.4950676 0.0955624059 0.14490713407046754 0 +96 0 -4.4950676 0.0955624059 0.14490713407046754 0 +97 0 -4.4950676 0.0955624059 0.14490713407046754 0 +98 1 0.430126518 0.553559542 0.85318959107180636 1 +99 1 3.795565 0.86964035 0.20150921352918599 1 +100 1 3.05687475 0.8217776 0.28318012010746291 1 +102 0 -4.4950676 0.0955624059 0.14490713407046754 0 +104 1 2.818191 0.803623259 0.31540877464917566 1 +105 1 0.3356665 0.5418601 0.88400766744784764 1 +106 1 3.28788471 0.8380707 0.25485615558954922 1 +108 0 -3.60867739 0.141323745 0.21981379787184632 0 +109 1 3.71898818 0.865237951 0.20883114835681491 1 +111 1 2.595313 0.7854403 0.34842642475764418 1 +112 1 2.90513015 0.8103929 0.30330653156287818 1 +113 1 3.43507361 0.8478113 0.238184930668183 1 +115 0 -2.74509573 0.202208519 0.32591637677515645 0 +117 1 3.787954 0.869208336 0.20222608457666785 1 +120 0 -4.4950676 0.0955624059 0.14490713407046754 0 +121 0 -3.98729 0.11987178 0.18421437967775695 0 +122 1 3.65162063 0.861261845 0.21547617605018932 1 +123 1 2.90513015 0.8103929 0.30330653156287818 1 +125 0 -4.4950676 0.0955624059 0.14490713407046754 0 +128 1 0.6344999 0.5786539 0.789227452110421 1 +129 0 -4.4950676 0.0955624059 0.14490713407046754 0 +131 0 -4.4950676 0.0955624059 0.14490713407046754 0 +132 1 2.234516 0.7534797 0.40835941446199947 1 +133 0 -4.4950676 0.0955624059 0.14490713407046754 0 +137 0 -4.4950676 0.0955624059 0.14490713407046754 0 +138 0 -4.4950676 0.0955624059 0.14490713407046754 0 +141 0 -4.4950676 0.0955624059 0.14490713407046754 0 +144 0 -4.4950676 0.0955624059 0.14490713407046754 0 +145 0 -1.71691072 0.297662169 0.50976294720103688 0 +147 0 -4.521502 0.09442613 0.14309576891318682 0 +150 0 -3.95260167 0.12171372 0.18723682820261706 0 +151 1 3.17948556 0.830579937 0.26780907245677338 1 +152 1 3.77653313 0.868557751 0.20330631668376986 1 +154 0 -4.4950676 0.0955624059 0.14490713407046754 0 +156 0 -4.4950676 0.0955624059 0.14490713407046754 0 +161 0 -4.4950676 0.0955624059 0.14490713407046754 0 +164 0 -2.21088362 0.248721659 0.41258058459205305 0 +167 1 2.35764241 0.764735758 0.38696676020378701 1 +169 0 -3.95260167 0.12171372 0.18723682820261706 0 +171 0 -4.4950676 0.0955624059 0.14490713407046754 0 +173 1 3.69995618 0.864124537 0.21068884816509187 1 +174 1 3.43507361 0.8478113 0.238184930668183 1 +176 0 -4.4950676 0.0955624059 0.14490713407046754 0 +177 1 2.818191 0.803623259 0.31540877464917566 1 +179 1 1.7039789 0.7009843 0.51254596412458053 1 +180 0 -3.95260167 0.12171372 0.18723682820261706 0 +181 0 -4.4950676 0.0955624059 0.14490713407046754 0 +183 1 3.45175433 0.8488843 0.23636018841312478 1 +187 1 3.795565 0.86964035 0.20150921352918599 1 +188 1 3.71898818 0.865237951 0.20883114835681491 1 +189 0 -1.97142136 0.271760136 0.45751437830016045 0 +191 1 3.38114214 0.844299257 0.24417365071625674 1 +192 0 -4.4950676 0.0955624059 0.14490713407046754 0 +196 0 3.59779739 0.8580148 2.8161877619952271 1 +198 0 -4.4950676 0.0955624059 0.14490713407046754 0 +199 0 -4.4950676 0.0955624059 0.14490713407046754 0 +201 1 3.43507361 0.8478113 0.238184930668183 1 +202 0 -4.4950676 0.0955624059 0.14490713407046754 0 +204 0 -4.4950676 0.0955624059 0.14490713407046754 0 +205 1 3.69995618 0.864124537 0.21068884816509187 1 +206 1 2.93677235 0.812812 0.29900644528974929 1 +207 0 -3.95260167 0.12171372 0.18723682820261706 0 +209 0 -3.95260167 0.12171372 0.18723682820261706 0 +210 1 3.77653313 0.868557751 0.20330631668376986 1 +211 1 3.77653313 0.868557751 0.20330631668376986 1 +212 0 -4.4950676 0.0955624059 0.14490713407046754 0 +216 0 -4.4950676 0.0955624059 0.14490713407046754 0 +218 1 3.744044 0.866692066 0.2064085968137431 1 +219 0 -2.53679466 0.21953173 0.35758811403677548 0 +223 1 3.795565 0.86964035 0.20150921352918599 1 +226 1 3.795565 0.86964035 0.20150921352918599 1 +228 0 -3.95260167 0.12171372 0.18723682820261706 0 +233 1 2.99774766 0.8174065 0.29087442236537497 1 +237 1 2.67100215 0.7917491 0.33688473657529261 1 +239 1 3.59779739 0.8580148 0.22092552472643659 1 +240 0 -3.21628237 0.166846842 0.26334636449315257 0 +241 0 -3.95260167 0.12171372 0.18723682820261706 0 +242 0 -4.4950676 0.0955624059 0.14490713407046754 0 +244 0 -4.4950676 0.0955624059 0.14490713407046754 0 +246 1 3.77653313 0.868557751 0.20330631668376986 1 +247 1 2.75803661 0.7988333 0.32403360181334279 1 +248 0 -2.652012 0.209820777 0.33974818267134177 0 +249 0 -2.74509573 0.202208519 0.32591637677515645 0 +250 0 -4.4950676 0.0955624059 0.14490713407046754 0 +252 0 2.431195 0.771287858 2.1283951395582803 1 +254 1 2.81186 0.803123236 0.31630671499593227 1 +257 0 -4.4950676 0.0955624059 0.14490713407046754 0 +258 0 -4.4950676 0.0955624059 0.14490713407046754 0 +259 0 2.12863541 0.7435148 1.9630523809754465 1 +260 1 3.43507361 0.8478113 0.238184930668183 1 +262 1 3.528331 0.8537306 0.22814717259064166 1 +267 1 2.45226932 0.7731413 0.3711959426407867 1 +268 1 2.66535 0.7912828 0.3377347461710663 1 +269 0 -4.4950676 0.0955624059 0.14490713407046754 0 +271 0 -4.4950676 0.0955624059 0.14490713407046754 0 +272 1 2.45226932 0.7731413 0.3711959426407867 1 +275 0 -1.71691072 0.297662169 0.50976294720103688 0 +276 0 -4.4950676 0.0955624059 0.14490713407046754 0 +277 0 -4.4950676 0.0955624059 0.14490713407046754 0 +278 0 -4.4950676 0.0955624059 0.14490713407046754 0 +279 1 2.95580435 0.814255536 0.29644647227204318 1 +280 0 -4.4950676 0.0955624059 0.14490713407046754 0 +283 1 3.59779739 0.8580148 0.22092552472643659 1 +284 1 2.75803661 0.7988333 0.32403360181334279 1 +285 1 3.77653313 0.868557751 0.20330631668376986 1 +288 1 1.10243011 0.6344175 0.65649558599035307 1 +290 0 -4.4950676 0.0955624059 0.14490713407046754 0 +291 0 -4.4950676 0.0955624059 0.14490713407046754 0 +293 1 0.6245051 0.577435 0.79226949720321194 1 +296 0 3.17948556 0.830579937 2.561323359581714 1 +297 0 0.6245051 0.577435 1.2427548742651005 1 +299 1 -0.3835451 0.452203244 1.1449567532979168 0 +300 1 3.26324987 0.8363921 0.25774865164842609 1 +301 0 -4.4950676 0.0955624059 0.14490713407046754 0 +303 0 -4.4950676 0.0955624059 0.14490713407046754 0 +304 1 2.78251958 0.8007933 0.32049820903118192 1 +308 1 3.820621 0.871054053 0.19916584676621468 1 +309 0 -1.7676115 0.29238975 0.49897314970856355 0 +311 0 -4.4950676 0.0955624059 0.14490713407046754 0 +312 1 2.35764241 0.764735758 0.38696676020378701 1 +314 0 -3.95260167 0.12171372 0.18723682820261706 0 +316 1 3.446887 0.848571837 0.23689129673139883 1 +317 1 3.71898818 0.865237951 0.20883114835681491 1 +319 0 3.59018636 0.857550561 2.8114781592283267 1 +321 0 -2.74509573 0.202208519 0.32591637677515645 0 +323 1 2.92117071 0.8116222 0.30111976349282671 1 +327 0 -4.4950676 0.0955624059 0.14490713407046754 0 +328 1 2.855948 0.806585431 0.31010074750104261 1 +329 1 3.14493656 0.8281352 0.27206178914860835 1 +331 0 -4.4950676 0.0955624059 0.14490713407046754 0 +332 0 -4.4950676 0.0955624059 0.14490713407046754 0 +333 1 3.37403178 0.8438313 0.24497349159377674 1 +336 1 2.25354767 0.755243 0.40498718111455023 1 +338 0 -3.95260167 0.12171372 0.18723682820261706 0 +343 0 -4.4950676 0.0955624059 0.14490713407046754 0 +344 1 3.795565 0.86964035 0.20150921352918599 1 +346 0 -3.60867739 0.141323745 0.21981379787184632 0 +347 0 -3.06621146 0.177539736 0.28198211617544272 0 +348 1 1.44182539 0.672808 0.57173325309382417 1 +349 1 3.17948556 0.830579937 0.26780907245677338 1 +350 0 -4.4950676 0.0955624059 0.14490713407046754 0 +352 0 3.46805358 0.84992677 2.7362614397541081 1 +353 1 3.37353134 0.843798339 0.24502984661603949 1 +354 0 -4.4950676 0.0955624059 0.14490713407046754 0 +355 0 -4.4950676 0.0955624059 0.14490713407046754 0 +358 1 3.673432 0.862559855 0.21330352275518588 1 +360 1 3.69995618 0.864124537 0.21068884816509187 1 +361 1 3.42746258 0.8473196 0.23902184830068046 1 +366 1 3.69995618 0.864124537 0.21068884816509187 1 +368 0 -4.10267258 0.113917425 0.17448694396780215 0 +370 0 -4.4950676 0.0955624059 0.14490713407046754 0 +371 0 -4.10267258 0.113917425 0.17448694396780215 0 +373 0 -4.4950676 0.0955624059 0.14490713407046754 0 +376 0 -4.4950676 0.0955624059 0.14490713407046754 0 +377 0 -3.95260167 0.12171372 0.18723682820261706 0 +378 0 -4.4950676 0.0955624059 0.14490713407046754 0 +379 0 -1.20829666 0.3533952 0.62904386389543054 0 +381 1 3.795565 0.86964035 0.20150921352918599 1 +383 0 -4.4950676 0.0955624059 0.14490713407046754 0 +384 0 -4.4950676 0.0955624059 0.14490713407046754 0 +387 0 -1.97142136 0.271760136 0.45751437830016045 0 +388 0 -4.4950676 0.0955624059 0.14490713407046754 0 +389 0 -3.98729 0.11987178 0.18421437967775695 0 +391 1 3.795565 0.86964035 0.20150921352918599 1 +392 0 -4.4950676 0.0955624059 0.14490713407046754 0 +395 0 -4.4950676 0.0955624059 0.14490713407046754 0 +396 0 -4.4950676 0.0955624059 0.14490713407046754 0 +398 0 -4.4950676 0.0955624059 0.14490713407046754 0 +399 0 -3.27428269 0.162854418 0.25644956179242817 0 +404 0 -4.4950676 0.0955624059 0.14490713407046754 0 +406 0 -4.4950676 0.0955624059 0.14490713407046754 0 +409 0 -4.4950676 0.0955624059 0.14490713407046754 0 +413 0 -4.4950676 0.0955624059 0.14490713407046754 0 +414 1 3.67065263 0.862395048 0.21357920070492295 1 +415 0 -2.712303 0.2048665 0.33073098860199474 0 +416 1 3.43507361 0.8478113 0.238184930668183 1 +418 0 -3.98729 0.11987178 0.18421437967775695 0 +419 0 -4.4950676 0.0955624059 0.14490713407046754 0 +422 0 -1.08503139 0.367602557 0.66109656036269859 0 +423 0 -4.10267258 0.113917425 0.17448694396780215 0 +428 0 -4.4950676 0.0955624059 0.14490713407046754 0 +429 0 -4.4950676 0.0955624059 0.14490713407046754 0 +430 0 -4.4950676 0.0955624059 0.14490713407046754 0 +434 0 3.211308 0.8328071 2.5804147157065942 1 +436 1 0.304188818 0.537950456 0.89445478450125759 1 +439 0 -4.4950676 0.0955624059 0.14490713407046754 0 +440 1 3.14493656 0.8281352 0.27206178914860835 1 +441 0 -3.313727 0.160183489 0.25185394324912214 0 +442 0 -4.423438 0.09870304 0.14992557295436484 0 +449 1 3.45175433 0.8488843 0.23636018841312478 1 +450 0 -3.95260167 0.12171372 0.18723682820261706 0 +451 0 -4.4950676 0.0955624059 0.14490713407046754 0 +452 0 -4.4950676 0.0955624059 0.14490713407046754 0 +453 1 3.787954 0.869208336 0.20222608457666785 1 +454 0 -4.4950676 0.0955624059 0.14490713407046754 0 +455 1 -1.63538456 0.306253731 1.7072006735503433 0 +456 1 3.795565 0.86964035 0.20150921352918599 1 +457 1 3.55338717 0.8552881 0.22551764730107363 1 +464 0 -4.4950676 0.0955624059 0.14490713407046754 0 +465 1 3.55338717 0.8552881 0.22551764730107363 1 +466 1 3.67065263 0.862395048 0.21357920070492295 1 +467 1 3.71898818 0.865237951 0.20883114835681491 1 +474 0 -4.4950676 0.0955624059 0.14490713407046754 0 +480 0 -3.95260167 0.12171372 0.18723682820261706 0 +482 1 3.77653313 0.868557751 0.20330631668376986 1 +483 1 3.528331 0.8537306 0.22814717259064166 1 +484 0 -4.4950676 0.0955624059 0.14490713407046754 0 +487 1 3.43507361 0.8478113 0.238184930668183 1 +489 1 -2.07322645 0.261804 1.9334408754706964 0 +492 0 -3.95260167 0.12171372 0.18723682820261706 0 +493 1 3.69995618 0.864124537 0.21068884816509187 1 +495 0 -3.95260167 0.12171372 0.18723682820261706 0 +497 0 -4.4950676 0.0955624059 0.14490713407046754 0 +501 0 -4.4950676 0.0955624059 0.14490713407046754 0 +502 0 -4.4950676 0.0955624059 0.14490713407046754 0 +504 0 -4.4950676 0.0955624059 0.14490713407046754 0 +507 0 -4.423438 0.09870304 0.14992557295436484 0 +510 0 -4.4950676 0.0955624059 0.14490713407046754 0 +513 0 -3.95260167 0.12171372 0.18723682820261706 0 +514 1 3.71898818 0.865237951 0.20883114835681491 1 +517 0 -3.95260167 0.12171372 0.18723682820261706 0 +519 1 3.42746258 0.8473196 0.23902184830068046 1 +520 0 -4.4950676 0.0955624059 0.14490713407046754 0 +521 0 -4.4950676 0.0955624059 0.14490713407046754 0 +522 1 3.59779739 0.8580148 0.22092552472643659 1 +523 1 3.795565 0.86964035 0.20150921352918599 1 +527 0 -4.4950676 0.0955624059 0.14490713407046754 0 +528 0 -3.839656 0.127880737 0.19740265701142998 0 +529 0 -3.95260167 0.12171372 0.18723682820261706 0 +531 0 -4.4950676 0.0955624059 0.14490713407046754 0 +532 0 -3.95260167 0.12171372 0.18723682820261706 0 +533 0 -4.4950676 0.0955624059 0.14490713407046754 0 +534 0 -4.4950676 0.0955624059 0.14490713407046754 0 +535 0 -2.79981112 0.1978311 0.31802205046433563 0 +538 0 -4.4950676 0.0955624059 0.14490713407046754 0 +539 0 -4.23205137 0.107548937 0.16415503318941782 0 +540 0 -3.98729 0.11987178 0.18421437967775695 0 +541 0 -4.4950676 0.0955624059 0.14490713407046754 0 +544 0 -4.10267258 0.113917425 0.17448694396780215 0 +546 1 3.69995618 0.864124537 0.21068884816509187 1 +547 0 -3.95260167 0.12171372 0.18723682820261706 0 +548 0 -3.95260167 0.12171372 0.18723682820261706 0 +549 1 3.795565 0.86964035 0.20150921352918599 1 +557 0 -4.4950676 0.0955624059 0.14490713407046754 0 +558 0 -4.4950676 0.0955624059 0.14490713407046754 0 +559 0 -4.4950676 0.0955624059 0.14490713407046754 0 +560 0 -4.4950676 0.0955624059 0.14490713407046754 0 +561 0 -4.4950676 0.0955624059 0.14490713407046754 0 +563 0 -4.4950676 0.0955624059 0.14490713407046754 0 +565 1 3.45175433 0.8488843 0.23636018841312478 1 +566 0 -4.4950676 0.0955624059 0.14490713407046754 0 +569 1 3.77653313 0.868557751 0.20330631668376986 1 +577 0 -4.4950676 0.0955624059 0.14490713407046754 0 +578 0 -4.4950676 0.0955624059 0.14490713407046754 0 +581 1 3.45175433 0.8488843 0.23636018841312478 1 +582 1 3.71898818 0.865237951 0.20883114835681491 1 +584 0 -4.4950676 0.0955624059 0.14490713407046754 0 +586 1 3.77653313 0.868557751 0.20330631668376986 1 +590 1 2.818191 0.803623259 0.31540877464917566 1 +593 0 -4.4950676 0.0955624059 0.14490713407046754 0 +594 1 3.42746258 0.8473196 0.23902184830068046 1 +600 0 -4.4950676 0.0955624059 0.14490713407046754 0 +602 0 -4.4950676 0.0955624059 0.14490713407046754 0 +604 1 -0.657900333 0.418496072 1.2567140121618541 0 +606 0 -4.4950676 0.0955624059 0.14490713407046754 0 +607 0 -4.4950676 0.0955624059 0.14490713407046754 0 +609 0 -4.4950676 0.0955624059 0.14490713407046754 0 +612 1 3.77653313 0.868557751 0.20330631668376986 1 +613 0 -4.4950676 0.0955624059 0.14490713407046754 0 +614 0 -3.95260167 0.12171372 0.18723682820261706 0 +617 0 -2.16877365 0.252676755 0.42019569817193675 0 +618 0 -4.4950676 0.0955624059 0.14490713407046754 0 +619 0 -4.4950676 0.0955624059 0.14490713407046754 0 +621 0 -1.15806425 0.359155327 0.64195337418302356 0 +622 0 -4.23205137 0.107548937 0.16415503318941782 0 +624 0 -3.95260167 0.12171372 0.18723682820261706 0 +627 0 -2.74509573 0.202208519 0.32591637677515645 0 +629 0 -4.4950676 0.0955624059 0.14490713407046754 0 +633 1 3.820621 0.871054053 0.19916584676621468 1 +634 0 -4.4950676 0.0955624059 0.14490713407046754 0 +638 0 -4.4950676 0.0955624059 0.14490713407046754 0 +639 0 -4.4950676 0.0955624059 0.14490713407046754 0 +641 0 -4.4950676 0.0955624059 0.14490713407046754 0 +642 0 -4.4950676 0.0955624059 0.14490713407046754 0 +644 0 -4.4950676 0.0955624059 0.14490713407046754 0 +645 0 -4.4950676 0.0955624059 0.14490713407046754 0 +649 0 -4.4950676 0.0955624059 0.14490713407046754 0 +652 0 -4.4950676 0.0955624059 0.14490713407046754 0 +653 0 -4.4950676 0.0955624059 0.14490713407046754 0 +654 0 -4.4950676 0.0955624059 0.14490713407046754 0 +656 0 -4.4950676 0.0955624059 0.14490713407046754 0 +657 0 1.44182539 0.672808 1.6117905832976551 1 +660 0 -4.4950676 0.0955624059 0.14490713407046754 0 +661 0 -4.4950676 0.0955624059 0.14490713407046754 0 +665 0 -4.4950676 0.0955624059 0.14490713407046754 0 +668 1 2.69327879 0.793579638 0.33355308595577504 1 +670 1 3.787954 0.869208336 0.20222608457666785 1 +678 0 -4.4950676 0.0955624059 0.14490713407046754 0 +679 0 -4.4950676 0.0955624059 0.14490713407046754 0 +680 1 3.77653313 0.868557751 0.20330631668376986 1 +681 1 3.69995618 0.864124537 0.21068884816509187 1 +682 0 -4.4950676 0.0955624059 0.14490713407046754 0 +683 0 -4.4950676 0.0955624059 0.14490713407046754 0 +685 0 -4.4950676 0.0955624059 0.14490713407046754 0 +688 0 -4.4950676 0.0955624059 0.14490713407046754 0 +689 0 -4.4950676 0.0955624059 0.14490713407046754 0 +691 1 3.55276728 0.855249763 0.22558229646652059 1 +692 0 -4.4950676 0.0955624059 0.14490713407046754 0 +693 0 -4.4950676 0.0955624059 0.14490713407046754 0 +694 0 -4.521502 0.09442613 0.14309576891318682 0 +696 1 3.7250123 0.8655888 0.20824628918166951 1 +697 1 3.04988527 0.821265161 0.2840799962083847 1 +698 1 3.52072024 0.853254735 0.22895157874240141 1 +0 0 -4.21722126 0.108262725 0.16530937144173291 0 +1 0 2.242379 0.7542093 2.0244976481880586 1 +2 0 -4.21722126 0.108262725 0.16530937144173291 0 +3 0 3.291724 0.838331 2.6288848843078343 1 +4 0 -4.21722126 0.108262725 0.16530937144173291 0 +7 0 -4.21722126 0.108262725 0.16530937144173291 0 +12 1 0.192972839 0.5241029 0.93207793080613099 1 +13 0 -4.21722126 0.108262725 0.16530937144173291 0 +14 1 3.79336572 0.869515657 0.20171608841827862 1 +15 1 0.672540247 0.5832842 0.77772910180887356 1 +16 0 -4.21722126 0.108262725 0.16530937144173291 0 +17 0 -4.21722126 0.108262725 0.16530937144173291 0 +19 0 -4.21722126 0.108262725 0.16530937144173291 0 +22 0 -4.21722126 0.108262725 0.16530937144173291 0 +23 1 3.89545536 0.875198662 0.19231756187799642 1 +24 0 -4.21722126 0.108262725 0.16530937144173291 0 +26 0 -4.10339737 0.11388085 0.1744273949600901 0 +27 0 -4.21722126 0.108262725 0.16530937144173291 0 +29 0 -4.18209457 0.109970026 0.16807417114596343 0 +30 0 -4.21722126 0.108262725 0.16530937144173291 0 +33 0 -4.21722126 0.108262725 0.16530937144173291 0 +34 0 -4.21722126 0.108262725 0.16530937144173291 0 +36 1 3.387487 0.844715834 0.24346200120048986 1 +38 1 2.892688 0.8094351 0.30501263212502633 1 +39 1 2.133622 0.74399 0.42664485686872977 1 +42 1 3.45910358 0.8493551 0.23556024760083163 1 +43 1 2.8631916 0.8071498 0.30909159573419437 1 +47 0 -4.21722126 0.108262725 0.16530937144173291 0 +49 1 2.0843153 0.7392661 0.43583434146379191 1 +53 1 2.133622 0.74399 0.42664485686872977 1 +55 1 2.615832 0.7871642 0.34526346540991143 1 +57 1 -1.69778919 0.2996648 1.7385784888034808 0 +58 1 0.7341723 0.5907547 0.75936892249707788 1 +59 1 1.86702275 0.717787147 0.47837200587687095 1 +61 0 -4.21722126 0.108262725 0.16530937144173291 0 +62 1 2.63165426 0.7884866 0.3428418578044744 1 +65 1 2.10306644 0.7410692 0.43231983379717087 1 +67 1 2.54302025 0.781001151 0.3566034210715503 1 +75 0 -4.21722126 0.108262725 0.16530937144173291 0 +78 0 -4.21722126 0.108262725 0.16530937144173291 0 +80 0 -4.10339737 0.11388085 0.1744273949600901 0 +81 0 -4.21722126 0.108262725 0.16530937144173291 0 +83 0 -4.21722126 0.108262725 0.16530937144173291 0 +84 1 3.63569522 0.860307634 0.21707545541356971 1 +85 1 2.67464828 0.7920495 0.3363374494738513 1 +86 1 -0.0406887233 0.494914085 1.0147499946936755 0 +87 1 3.82580924 0.8713451 0.19868387265079065 1 +89 0 -3.984275 0.1200309 0.18447523410951036 0 +94 0 -4.21722126 0.108262725 0.16530937144173291 0 +101 1 0.6893744 0.585328639 0.77268122731014166 1 +103 1 -2.89849544 0.190117374 2.3950377147761603 0 +107 1 3.63569522 0.860307634 0.21707545541356971 1 +110 0 0.183634937 0.522938251 1.0677520812857926 1 +114 0 -1.03915036 0.372951567 0.67335121469776826 0 +116 0 0.915407538 0.6124693 1.3676175481605792 1 +118 0 -3.984275 0.1200309 0.18447523410951036 0 +119 0 -4.10339737 0.11388085 0.1744273949600901 0 +124 1 0.88354665 0.6086815 0.71624057714850642 1 +126 1 3.68252015 0.863097668 0.212404271606807 1 +127 0 -4.21722126 0.108262725 0.16530937144173291 0 +130 0 -4.18209457 0.109970026 0.16807417114596343 0 +134 0 -3.984275 0.1200309 0.18447523410951036 0 +135 0 -3.47422075 0.149680346 0.2339228110632727 0 +136 0 -4.21722126 0.108262725 0.16530937144173291 0 +139 0 -1.16332841 0.358549744 0.64059070493812753 0 +140 0 -4.21722126 0.108262725 0.16530937144173291 0 +142 1 2.615832 0.7871642 0.34526346540991143 1 +143 0 -1.16332841 0.358549744 0.64059070493812753 0 +146 1 0.331296444 0.541317642 0.88545268812251376 1 +148 0 -3.24127483 0.165116981 0.26035402814879488 0 +149 1 3.79336572 0.869515657 0.20171608841827862 1 +153 0 -4.21722126 0.108262725 0.16530937144173291 0 +155 1 2.11217237 0.7419419 0.43062182208330113 1 +157 0 -4.21722126 0.108262725 0.16530937144173291 0 +158 0 -0.9303825 0.385755032 0.7031139617632729 0 +159 1 3.79336572 0.869515657 0.20171608841827862 1 +160 1 3.79336572 0.869515657 0.20171608841827862 1 +162 0 -4.21722126 0.108262725 0.16530937144173291 0 +163 0 -2.99443579 0.182840839 0.29131099034624791 0 +165 0 -4.21722126 0.108262725 0.16530937144173291 0 +166 1 2.11217237 0.7419419 0.43062182208330113 1 +168 0 -4.21722126 0.108262725 0.16530937144173291 0 +170 0 -4.21722126 0.108262725 0.16530937144173291 0 +172 0 -4.21722126 0.108262725 0.16530937144173291 0 +175 1 3.63569522 0.860307634 0.21707545541356971 1 +178 0 -4.21722126 0.108262725 0.16530937144173291 0 +182 0 -4.21722126 0.108262725 0.16530937144173291 0 +184 1 3.79336572 0.869515657 0.20171608841827862 1 +185 0 -4.21722126 0.108262725 0.16530937144173291 0 +186 1 2.98406219 0.816382945 0.2926820521802056 1 +190 1 3.80796957 0.870341837 0.20034594649006462 1 +193 0 -4.21722126 0.108262725 0.16530937144173291 0 +194 0 -4.21722126 0.108262725 0.16530937144173291 0 +195 0 -4.21722126 0.108262725 0.16530937144173291 0 +197 0 -4.21722126 0.108262725 0.16530937144173291 0 +200 1 3.79336572 0.869515657 0.20171608841827862 1 +203 0 -4.21722126 0.108262725 0.16530937144173291 0 +208 0 -4.21722126 0.108262725 0.16530937144173291 0 +213 1 3.79336572 0.869515657 0.20171608841827862 1 +214 1 3.79336572 0.869515657 0.20171608841827862 1 +215 1 3.80796957 0.870341837 0.20034594649006462 1 +217 0 -4.21722126 0.108262725 0.16530937144173291 0 +220 0 -4.21722126 0.108262725 0.16530937144173291 0 +221 1 3.68252015 0.863097668 0.212404271606807 1 +222 1 -1.16332841 0.358549744 1.4797548077982274 0 +224 1 3.79336572 0.869515657 0.20171608841827862 1 +225 0 -4.21722126 0.108262725 0.16530937144173291 0 +227 1 3.87770653 0.8742261 0.19392165556324487 1 +229 1 3.79336572 0.869515657 0.20171608841827862 1 +230 1 2.554106 0.781947732 0.35485591874262995 1 +231 1 3.47036862 0.850074351 0.23433906435670246 1 +232 0 -0.8675968 0.39321968 0.72075379920540494 0 +234 0 -3.49895358 0.1481132 0.23126636939853412 0 +235 0 0.160153255 0.520008445 1.0589190710497358 1 +236 1 3.27737665 0.8373564 0.25608631370171175 1 +238 1 3.08109069 0.823543966 0.2800824229900386 1 +243 0 -1.16332841 0.358549744 0.64059070493812753 0 +245 0 -4.21722126 0.108262725 0.16530937144173291 0 +251 1 3.329408 0.8408685 0.25004794020224513 1 +253 1 3.45910358 0.8493551 0.23556024760083163 1 +255 1 2.11217237 0.7419419 0.43062182208330113 1 +256 0 -4.21722126 0.108262725 0.16530937144173291 0 +261 1 3.63569522 0.860307634 0.21707545541356971 1 +263 1 3.12823987 0.826943755 0.27413888752933768 1 +264 1 3.036798 0.8203026 0.28577188380723062 1 +265 0 -4.18209457 0.109970026 0.16807417114596343 0 +266 1 2.73003769 0.7965742 0.32811938607044011 1 +270 1 3.6991694 0.864078343 0.21076597253285964 1 +273 1 -1.539256 0.316559583 1.6594510251409518 0 +274 0 -4.21722126 0.108262725 0.16530937144173291 0 +281 0 -4.21722126 0.108262725 0.16530937144173291 0 +282 1 2.892688 0.8094351 0.30501263212502633 1 +286 1 3.27737665 0.8373564 0.25608631370171175 1 +287 0 -3.984275 0.1200309 0.18447523410951036 0 +289 1 2.308458 0.7602825 0.39539247977003106 1 +292 1 3.79336572 0.869515657 0.20171608841827862 1 +294 0 -1.16332841 0.358549744 0.64059070493812753 0 +295 1 3.63569522 0.860307634 0.21707545541356971 1 +298 0 -3.87045121 0.126173317 0.19458093529404152 0 +302 1 3.79336572 0.869515657 0.20171608841827862 1 +305 1 2.4229064 0.770556 0.37602833722195828 1 +306 0 -4.21722126 0.108262725 0.16530937144173291 0 +307 0 -4.21722126 0.108262725 0.16530937144173291 0 +310 0 -3.984275 0.1200309 0.18447523410951036 0 +313 0 -4.21722126 0.108262725 0.16530937144173291 0 +315 0 2.308458 0.7602825 2.0605929607501619 1 +318 0 -3.984275 0.1200309 0.18447523410951036 0 +320 1 3.68252015 0.863097668 0.212404271606807 1 +322 0 -4.21722126 0.108262725 0.16530937144173291 0 +324 0 -4.21722126 0.108262725 0.16530937144173291 0 +325 0 -3.47422075 0.149680346 0.2339228110632727 0 +326 1 -0.420327961 0.447651535 1.159551960712597 0 +330 1 2.92609119 0.811998069 0.30045179781474934 1 +334 1 2.533752 0.7802075 0.35807020078158219 1 +335 0 -4.21722126 0.108262725 0.16530937144173291 0 +337 0 -4.21722126 0.108262725 0.16530937144173291 0 +339 1 2.73003769 0.7965742 0.32811938607044011 1 +340 1 3.52560353 0.8535602 0.22843517179518252 1 +341 0 -4.21722126 0.108262725 0.16530937144173291 0 +342 0 -4.21722126 0.108262725 0.16530937144173291 0 +345 0 -4.21722126 0.108262725 0.16530937144173291 0 +351 0 -4.21722126 0.108262725 0.16530937144173291 0 +356 1 0.564958 0.5701539 0.8105767206667458 1 +357 1 3.79336572 0.869515657 0.20171608841827862 1 +359 1 2.554106 0.781947732 0.35485591874262995 1 +362 0 -3.87045121 0.126173317 0.19458093529404152 0 +363 0 0.564958 0.5701539 1.2181078514025263 1 +364 0 -4.21722126 0.108262725 0.16530937144173291 0 +365 0 -4.21722126 0.108262725 0.16530937144173291 0 +367 1 3.82580924 0.8713451 0.19868387265079065 1 +369 0 -4.18209457 0.109970026 0.16807417114596343 0 +372 0 -4.21722126 0.108262725 0.16530937144173291 0 +374 0 -4.21722126 0.108262725 0.16530937144173291 0 +375 0 -4.21722126 0.108262725 0.16530937144173291 0 +380 0 -4.21722126 0.108262725 0.16530937144173291 0 +382 0 -4.10339737 0.11388085 0.1744273949600901 0 +385 0 -2.50911427 0.22191228 0.36199528354268984 0 +386 1 3.79336572 0.869515657 0.20171608841827862 1 +390 0 -4.21722126 0.108262725 0.16530937144173291 0 +393 0 -4.21722126 0.108262725 0.16530937144173291 0 +394 0 -4.06827068 0.115665257 0.17733552539892772 0 +397 0 -4.21722126 0.108262725 0.16530937144173291 0 +400 1 3.63569522 0.860307634 0.21707545541356971 1 +401 0 -4.21722126 0.108262725 0.16530937144173291 0 +402 0 -3.696773 0.136062443 0.21100105313733619 0 +403 0 -4.21722126 0.108262725 0.16530937144173291 0 +405 0 -4.21722126 0.108262725 0.16530937144173291 0 +407 0 -4.21722126 0.108262725 0.16530937144173291 0 +408 0 -1.03915036 0.372951567 0.67335121469776826 0 +410 0 -4.21722126 0.108262725 0.16530937144173291 0 +411 0 -1.16332841 0.358549744 0.64059070493812753 0 +412 1 3.14764333 0.8283277 0.27172643363767274 1 +417 0 -4.21722126 0.108262725 0.16530937144173291 0 +420 0 -4.10339737 0.11388085 0.1744273949600901 0 +421 1 3.79336572 0.869515657 0.20171608841827862 1 +424 0 -4.21722126 0.108262725 0.16530937144173291 0 +425 1 3.79336572 0.869515657 0.20171608841827862 1 +426 0 -3.696773 0.136062443 0.21100105313733619 0 +427 1 2.77488971 0.800184 0.32159629252070843 1 +431 0 -3.984275 0.1200309 0.18447523410951036 0 +432 0 -4.21722126 0.108262725 0.16530937144173291 0 +433 0 -4.10339737 0.11388085 0.1744273949600901 0 +435 1 3.79336572 0.869515657 0.20171608841827862 1 +437 0 -4.21722126 0.108262725 0.16530937144173291 0 +438 0 -4.18209457 0.109970026 0.16807417114596343 0 +443 0 -4.21722126 0.108262725 0.16530937144173291 0 +444 0 -3.984275 0.1200309 0.18447523410951036 0 +445 0 -4.21722126 0.108262725 0.16530937144173291 0 +446 0 -4.21722126 0.108262725 0.16530937144173291 0 +447 0 -4.21722126 0.108262725 0.16530937144173291 0 +448 0 -4.21722126 0.108262725 0.16530937144173291 0 +458 0 -4.21722126 0.108262725 0.16530937144173291 0 +459 0 -4.18209457 0.109970026 0.16807417114596343 0 +460 0 -4.21722126 0.108262725 0.16530937144173291 0 +461 0 -1.16332841 0.358549744 0.64059070493812753 0 +462 0 -4.21722126 0.108262725 0.16530937144173291 0 +463 0 -4.21722126 0.108262725 0.16530937144173291 0 +468 0 -4.21722126 0.108262725 0.16530937144173291 0 +469 0 -4.21722126 0.108262725 0.16530937144173291 0 +470 0 -4.21722126 0.108262725 0.16530937144173291 0 +471 0 -4.21722126 0.108262725 0.16530937144173291 0 +472 0 -4.21722126 0.108262725 0.16530937144173291 0 +473 0 -4.21722126 0.108262725 0.16530937144173291 0 +475 0 -4.21722126 0.108262725 0.16530937144173291 0 +476 0 -4.21722126 0.108262725 0.16530937144173291 0 +477 0 -4.21722126 0.108262725 0.16530937144173291 0 +478 0 -4.10339737 0.11388085 0.1744273949600901 0 +479 1 3.82580924 0.8713451 0.19868387265079065 1 +481 0 -3.7318995 0.13401106 0.20757949523359986 0 +485 0 -4.21722126 0.108262725 0.16530937144173291 0 +486 0 -4.21722126 0.108262725 0.16530937144173291 0 +488 1 2.06796455 0.73768723 0.43891883309176066 1 +490 0 -4.21722126 0.108262725 0.16530937144173291 0 +491 1 3.82580924 0.8713451 0.19868387265079065 1 +494 0 -0.9303825 0.385755032 0.7031139617632729 0 +496 0 -4.21722126 0.108262725 0.16530937144173291 0 +498 0 -4.21722126 0.108262725 0.16530937144173291 0 +499 0 -4.21722126 0.108262725 0.16530937144173291 0 +500 0 -4.21722126 0.108262725 0.16530937144173291 0 +503 0 -4.21722126 0.108262725 0.16530937144173291 0 +505 0 -3.7318995 0.13401106 0.20757949523359986 0 +506 1 3.163171 0.829429 0.26980965540888258 1 +508 0 -4.21722126 0.108262725 0.16530937144173291 0 +509 0 -4.21722126 0.108262725 0.16530937144173291 0 +511 0 -4.21722126 0.108262725 0.16530937144173291 0 +512 0 -4.21722126 0.108262725 0.16530937144173291 0 +515 1 3.82580924 0.8713451 0.19868387265079065 1 +516 0 -4.21722126 0.108262725 0.16530937144173291 0 +518 0 -4.21722126 0.108262725 0.16530937144173291 0 +524 0 -4.21722126 0.108262725 0.16530937144173291 0 +525 0 -4.21722126 0.108262725 0.16530937144173291 0 +526 0 -4.21722126 0.108262725 0.16530937144173291 0 +530 1 3.13503218 0.827429235 0.2732921626735505 1 +536 0 -4.21722126 0.108262725 0.16530937144173291 0 +537 0 -4.21722126 0.108262725 0.16530937144173291 0 +542 0 -3.7318995 0.13401106 0.20757949523359986 0 +543 0 -4.21722126 0.108262725 0.16530937144173291 0 +545 0 -4.21722126 0.108262725 0.16530937144173291 0 +550 0 -4.21722126 0.108262725 0.16530937144173291 0 +551 0 -4.21722126 0.108262725 0.16530937144173291 0 +552 0 -4.10339737 0.11388085 0.1744273949600901 0 +553 0 0.6800365 0.584194958 1.2660208433737543 1 +554 0 -4.21722126 0.108262725 0.16530937144173291 0 +555 0 -3.7318995 0.13401106 0.20757949523359986 0 +556 0 -4.10339737 0.11388085 0.1744273949600901 0 +562 0 -4.21722126 0.108262725 0.16530937144173291 0 +564 0 -4.21722126 0.108262725 0.16530937144173291 0 +567 0 -4.21722126 0.108262725 0.16530937144173291 0 +568 1 3.12814975 0.8269373 0.27415011815927626 1 +570 1 3.68252015 0.863097668 0.212404271606807 1 +571 1 3.79336572 0.869515657 0.20171608841827862 1 +572 0 -4.21722126 0.108262725 0.16530937144173291 0 +573 0 -4.21722126 0.108262725 0.16530937144173291 0 +574 1 2.77488971 0.800184 0.32159629252070843 1 +575 0 -4.21722126 0.108262725 0.16530937144173291 0 +576 0 -4.21722126 0.108262725 0.16530937144173291 0 +579 0 -4.21722126 0.108262725 0.16530937144173291 0 +580 0 -4.21722126 0.108262725 0.16530937144173291 0 +583 0 -4.21722126 0.108262725 0.16530937144173291 0 +585 0 -4.21722126 0.108262725 0.16530937144173291 0 +587 0 -4.21722126 0.108262725 0.16530937144173291 0 +588 1 3.163171 0.829429 0.26980965540888258 1 +589 0 -4.21722126 0.108262725 0.16530937144173291 0 +591 1 3.82580924 0.8713451 0.19868387265079065 1 +592 1 3.329408 0.8408685 0.25004794020224513 1 +595 0 -4.21722126 0.108262725 0.16530937144173291 0 +596 0 -4.21722126 0.108262725 0.16530937144173291 0 +597 0 -4.18209457 0.109970026 0.16807417114596343 0 +598 0 -4.21722126 0.108262725 0.16530937144173291 0 +599 0 -4.06827068 0.115665257 0.17733552539892772 0 +601 0 -4.21722126 0.108262725 0.16530937144173291 0 +603 1 -0.8155857 0.399441481 1.3239439353620859 0 +605 1 3.14764333 0.8283277 0.27172643363767274 1 +608 1 3.63569522 0.860307634 0.21707545541356971 1 +610 1 3.329408 0.8408685 0.25004794020224513 1 +611 1 3.44851971 0.848676741 0.23671295546199683 1 +615 0 -4.18209457 0.109970026 0.16807417114596343 0 +616 0 -4.21722126 0.108262725 0.16530937144173291 0 +620 0 -4.21722126 0.108262725 0.16530937144173291 0 +623 0 -4.21722126 0.108262725 0.16530937144173291 0 +625 0 -2.613113 0.213063642 0.34568113039026332 0 +626 1 2.133622 0.74399 0.42664485686872977 1 +628 0 -4.21722126 0.108262725 0.16530937144173291 0 +630 0 -4.06827068 0.115665257 0.17733552539892772 0 +631 0 -4.21722126 0.108262725 0.16530937144173291 0 +632 0 -4.21722126 0.108262725 0.16530937144173291 0 +635 0 -4.18209457 0.109970026 0.16807417114596343 0 +636 1 3.387487 0.844715834 0.24346200120048986 1 +637 0 -4.06827068 0.115665257 0.17733552539892772 0 +640 0 -4.21722126 0.108262725 0.16530937144173291 0 +643 0 -4.21722126 0.108262725 0.16530937144173291 0 +646 0 -4.10339737 0.11388085 0.1744273949600901 0 +647 0 -4.21722126 0.108262725 0.16530937144173291 0 +648 1 3.44851971 0.848676741 0.23671295546199683 1 +650 0 -3.984275 0.1200309 0.18447523410951036 0 +651 0 -4.10339737 0.11388085 0.1744273949600901 0 +655 0 -4.21722126 0.108262725 0.16530937144173291 0 +658 1 3.79336572 0.869515657 0.20171608841827862 1 +659 0 -4.21722126 0.108262725 0.16530937144173291 0 +662 0 -4.18209457 0.109970026 0.16807417114596343 0 +663 0 -4.18209457 0.109970026 0.16807417114596343 0 +664 0 -4.21722126 0.108262725 0.16530937144173291 0 +666 0 -2.880612 0.191497982 0.30667671944864872 0 +667 0 -4.21722126 0.108262725 0.16530937144173291 0 +669 1 3.66048265 0.8617905 0.21459093643319149 1 +671 0 -4.10339737 0.11388085 0.1744273949600901 0 +672 0 -4.21722126 0.108262725 0.16530937144173291 0 +673 0 -3.49895358 0.1481132 0.23126636939853412 0 +674 0 -4.21722126 0.108262725 0.16530937144173291 0 +675 0 -4.18209457 0.109970026 0.16807417114596343 0 +676 0 -4.21722126 0.108262725 0.16530937144173291 0 +677 0 -4.21722126 0.108262725 0.16530937144173291 0 +684 0 -4.21722126 0.108262725 0.16530937144173291 0 +686 0 -4.21722126 0.108262725 0.16530937144173291 0 +687 0 -3.47422075 0.149680346 0.2339228110632727 0 +690 0 -4.21722126 0.108262725 0.16530937144173291 0 +695 0 -4.21722126 0.108262725 0.16530937144173291 0 diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-out.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-out.txt new file mode 100644 index 0000000000..232f6326d4 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-out.txt @@ -0,0 +1,45 @@ +maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3448 (241.0/(241.0+458.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 239 | 2 | 0.9917 + negative || 12 | 446 | 0.9738 + ||====================== +Precision || 0.9522 | 0.9955 | +OVERALL 0/1 ACCURACY: 0.979971 +LOG LOSS/instance: 0.198312 +Test-set entropy (prior Log-Loss/instance): 0.929318 +LOG-LOSS REDUCTION (RIG): 78.660434 +AUC: 0.995996 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.995996 (0.0000) +Accuracy: 0.979971 (0.0000) +Positive precision: 0.952191 (0.0000) +Positive recall: 0.991701 (0.0000) +Negative precision: 0.995536 (0.0000) +Negative recall: 0.973799 (0.0000) +Log-loss: 0.198312 (0.0000) +Log-loss reduction: 78.660434 (0.0000) +F1 Score: 0.971545 (0.0000) +AUPRC: 0.983584 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-rp.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-rp.txt new file mode 100644 index 0000000000..a29ae4cd9c --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.995996 0.979971 0.952191 0.991701 0.995536 0.973799 0.198312 78.66043 0.971545 0.983584 10 0.2 20 10 dart 1 LightGBM %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:dart;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart.txt new file mode 100644 index 0000000000..80e77323e6 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -5.06709051 0.0735397339 0.11019899139311135 0 +1 0 0.9656145 0.6184105 1.3899067256376549 1 +2 0 -5.06709051 0.0735397339 0.11019899139311135 0 +3 0 0.586611152 0.5728052 1.2270340961595763 1 +4 0 -4.53108168 0.09401735 0.14244467134955621 0 +5 1 4.762709 0.9153944 0.12753458870756793 1 +6 0 -2.32187271 0.238497183 0.39307872073754024 0 +7 0 -5.06709051 0.0735397339 0.11019899139311135 0 +8 0 -4.47418737 0.09646857 0.14635330428919666 0 +9 0 -5.06709051 0.0735397339 0.11019899139311135 0 +10 0 -5.06709051 0.0735397339 0.11019899139311135 0 +11 0 -5.06709051 0.0735397339 0.11019899139311135 0 +12 1 1.81928742 0.7129272 0.48817328533637305 1 +13 0 -4.96936464 0.07693901 0.11550211839374386 0 +14 1 4.762709 0.9153944 0.12753458870756793 1 +15 1 1.44990551 0.6736967 0.5698288693073752 1 +16 0 -5.06709051 0.0735397339 0.11019899139311135 0 +17 0 -5.06709051 0.0735397339 0.11019899139311135 0 +18 1 4.408904 0.9006486 0.15096377544546791 1 +19 0 -3.06499958 0.177628234 0.28213736074538492 0 +20 1 1.49515009 0.6786501 0.55926019685756201 1 +21 1 4.75751543 0.9151931 0.12785194987984716 1 +22 0 -5.06709051 0.0735397339 0.11019899139311135 0 +23 1 4.92465067 0.9214581 0.11800948959829184 1 +24 0 -5.06709051 0.0735397339 0.11019899139311135 0 +25 1 1.14471579 0.6393071 0.64541902001011708 1 +26 0 -5.06709051 0.0735397339 0.11019899139311135 0 +27 0 -5.06709051 0.0735397339 0.11019899139311135 0 +28 0 -5.06709051 0.0735397339 0.11019899139311135 0 +29 0 -5.06528139 0.07360139 0.11029500224239923 0 +30 0 -5.06709051 0.0735397339 0.11019899139311135 0 +31 0 -5.06709051 0.0735397339 0.11019899139311135 0 +32 1 4.77333546 0.915805 0.12688768126860211 1 +33 0 -5.06709051 0.0735397339 0.11019899139311135 0 +34 0 -5.06709051 0.0735397339 0.11019899139311135 0 +35 0 -5.06709051 0.0735397339 0.11019899139311135 0 +36 1 4.97487545 0.923256457 0.11519664784290429 1 +37 0 -1.48606789 0.322341055 0.56136872372208557 0 +38 1 4.033858 0.882563055 0.18022873972886377 1 +39 1 3.797926 0.8697741 0.20128734054858682 1 +40 0 4.79215431 0.9165277 3.5825584675275528 1 +41 1 3.73647714 0.8662543 0.20713743679275598 1 +42 1 4.58626652 0.9083067 0.1387485444709517 1 +43 1 3.63648176 0.8603549 0.21699619394337738 1 +44 1 4.97487545 0.923256457 0.11519664784290429 1 +45 0 -4.47418737 0.09646857 0.14635330428919666 0 +46 1 3.44935179 0.848730147 0.23662217201089117 1 +47 0 -5.06709051 0.0735397339 0.11019899139311135 0 +48 0 -4.53108168 0.09401735 0.14244467134955621 0 +49 1 4.528306 0.905864358 0.14263305429099798 1 +50 1 3.15229177 0.828658 0.27115131951268323 1 +51 1 1.74701333 0.705474854 0.50333343567200772 1 +52 1 3.63053226 0.859997153 0.21759621059878945 1 +53 1 4.505171 0.9048733 0.14421227577053336 1 +54 1 4.69192743 0.912612855 0.13192511857382089 1 +55 1 4.76587534 0.9155169 0.1273415567782486 1 +56 1 3.354113 0.8425144 0.24722675761662352 1 +57 1 2.07040358 0.737923145 0.43845752748612049 1 +58 1 2.767017 0.7995539 0.32273285414040775 1 +59 1 2.415158 0.7698703 0.37731271454330823 1 +60 1 2.496118 0.7769637 0.36408087784159321 1 +61 0 -5.06709051 0.0735397339 0.11019899139311135 0 +62 1 3.50176024 0.8520638 0.23096667790677894 1 +63 1 0.4726046 0.5588022 0.83959042666920336 1 +64 0 -5.06709051 0.0735397339 0.11019899139311135 0 +65 1 0.8255027 0.6017474 0.73277010702318957 1 +66 0 -5.06709051 0.0735397339 0.11019899139311135 0 +67 1 3.26110649 0.8362454 0.25800169470123085 1 +68 1 4.39076948 0.8998343 0.15226877377483761 1 +69 0 -5.06709051 0.0735397339 0.11019899139311135 0 +70 0 -4.67087936 0.08823008 0.13325828196111109 0 +71 1 1.41394949 0.669732332 0.57834347711149325 1 +72 0 -2.89953566 0.1900373 0.30407261512586925 0 +73 1 4.32910728 0.897020936 0.15678643758162616 1 +74 1 3.36993313 0.843561053 0.24543560661037336 1 +75 0 -4.435475 0.09816893 0.14907088318245851 0 +76 0 -5.06528139 0.07360139 0.11029500224239923 0 +77 0 -4.477027 0.09634489 0.14615583491211775 0 +78 0 -4.96936464 0.07693901 0.11550211839374386 0 +79 0 -5.07516241 0.07326523 0.10977159730236945 0 +80 0 -3.48815918 0.148795485 0.23242229245696552 0 +81 0 -5.06709051 0.0735397339 0.11019899139311135 0 +82 0 -5.06709051 0.0735397339 0.11019899139311135 0 +83 0 -3.48815918 0.148795485 0.23242229245696552 0 +84 1 4.79215431 0.9165277 0.12574962932901551 1 +85 1 1.47313929 0.6762453 0.56438149224110934 1 +86 1 2.882103 0.8086174 0.30647082345472848 1 +87 1 4.79215431 0.9165277 0.12574962932901551 1 +88 0 -5.06709051 0.0735397339 0.11019899139311135 0 +89 0 -5.07516241 0.07326523 0.10977159730236945 0 +90 0 -5.06709051 0.0735397339 0.11019899139311135 0 +91 0 -5.06709051 0.0735397339 0.11019899139311135 0 +92 0 -5.06709051 0.0735397339 0.11019899139311135 0 +93 0 -5.06709051 0.0735397339 0.11019899139311135 0 +94 0 -5.06709051 0.0735397339 0.11019899139311135 0 +95 0 -5.06709051 0.0735397339 0.11019899139311135 0 +96 0 -5.06709051 0.0735397339 0.11019899139311135 0 +97 0 -5.06709051 0.0735397339 0.11019899139311135 0 +98 1 4.40058661 0.9002758 0.15156101289846632 1 +99 1 4.746889 0.9147798 0.12850361403582561 1 +100 1 4.12806368 0.8873578 0.17241219672840219 1 +101 1 1.9220736 0.723329365 0.46727537244523693 1 +102 0 -5.06709051 0.0735397339 0.11019899139311135 0 +103 1 1.83467329 0.7144991 0.48499586862453209 1 +104 1 4.97487545 0.923256457 0.11519664784290429 1 +105 1 3.07081413 0.822796047 0.28139323268611288 1 +106 1 4.277077 0.8945929 0.16069681686502538 1 +107 1 4.79215431 0.9165277 0.12574962932901551 1 +108 0 -4.25203848 0.10659349 0.16261132712788906 0 +109 1 4.79128361 0.91649437 0.12580207730770884 1 +110 0 -2.34683728 0.2362376 0.3888041978542367 0 +111 1 4.393726 0.899967432 0.1520553006787865 1 +112 1 4.775628 0.9158933 0.12674853264953564 1 +113 1 4.69192743 0.912612855 0.13192511857382089 1 +114 0 -4.043996 0.116912559 0.17937179753410915 0 +115 0 -2.74227285 0.2024363 0.32632834253161519 0 +116 0 -2.15360236 0.254111826 0.42296874257633776 0 +117 1 4.79215431 0.9165277 0.12574962932901551 1 +118 0 -4.977436 0.0766528845 0.11505499014436699 0 +119 0 -5.06709051 0.0735397339 0.11019899139311135 0 +120 0 -5.06709051 0.0735397339 0.11019899139311135 0 +121 0 -5.06709051 0.0735397339 0.11019899139311135 0 +122 1 4.762709 0.9153944 0.12753458870756793 1 +123 1 4.658702 0.9112789 0.13403542604890845 1 +124 1 2.51770449 0.778828442 0.36062252397422589 1 +125 0 -5.06709051 0.0735397339 0.11019899139311135 0 +126 1 4.76183844 0.9153607 0.12758775921607857 1 +127 0 -5.06709051 0.0735397339 0.11019899139311135 0 +128 1 3.344656 0.841886 0.24830323159161757 1 +129 0 -5.07516241 0.07326523 0.10977159730236945 0 +130 0 -4.67087936 0.08823008 0.13325828196111109 0 +131 0 -5.06709051 0.0735397339 0.11019899139311135 0 +132 1 4.22635651 0.892177463 0.16459739044084723 1 +133 0 -5.06709051 0.0735397339 0.11019899139311135 0 +134 0 -5.07516241 0.07326523 0.10977159730236945 0 +135 0 -4.25203848 0.10659349 0.16261132712788906 0 +136 0 -5.06709051 0.0735397339 0.11019899139311135 0 +137 0 -5.06709051 0.0735397339 0.11019899139311135 0 +138 0 -5.06709051 0.0735397339 0.11019899139311135 0 +139 0 -2.32187271 0.238497183 0.39307872073754024 0 +140 0 -5.06709051 0.0735397339 0.11019899139311135 0 +141 0 -5.06709051 0.0735397339 0.11019899139311135 0 +142 1 4.53071642 0.9059671 0.14246940877837144 1 +143 0 -2.74227285 0.2024363 0.32632834253161519 0 +144 0 -5.06709051 0.0735397339 0.11019899139311135 0 +145 0 -1.21307468 0.352849483 0.62782679662951402 0 +146 1 0.92821 0.613987565 0.70371865759148688 1 +147 0 -5.07516241 0.07326523 0.10977159730236945 0 +148 0 -2.42044783 0.229661435 0.3764354427750301 0 +149 1 4.52514 0.9057293 0.14284817575998529 1 +150 0 -5.06709051 0.0735397339 0.11019899139311135 0 +151 1 3.56729722 0.8561468 0.22406988305493591 1 +152 1 4.75751543 0.9151931 0.12785194987984716 1 +153 0 -4.586527 0.09168242 0.13873129057968608 0 +154 0 -5.06709051 0.0735397339 0.11019899139311135 0 +155 1 3.56202054 0.85582155 0.22461808789195339 1 +156 0 -5.06709051 0.0735397339 0.11019899139311135 0 +157 0 -5.06709051 0.0735397339 0.11019899139311135 0 +158 0 -2.32187271 0.238497183 0.39307872073754024 0 +159 1 4.746889 0.9147798 0.12850361403582561 1 +160 1 4.762709 0.9153944 0.12753458870756793 1 +161 0 -5.06709051 0.0735397339 0.11019899139311135 0 +162 0 -5.06709051 0.0735397339 0.11019899139311135 0 +163 0 -4.376461 0.100812383 0.1533059269998425 0 +164 0 -2.32187271 0.238497183 0.39307872073754024 0 +165 0 -5.06709051 0.0735397339 0.11019899139311135 0 +166 1 4.22635651 0.892177463 0.16459739044084723 1 +167 1 4.595266 0.9086808 0.13815450454307449 1 +168 0 -5.06709051 0.0735397339 0.11019899139311135 0 +169 0 -5.06709051 0.0735397339 0.11019899139311135 0 +170 0 -5.06709051 0.0735397339 0.11019899139311135 0 +171 0 -5.06709051 0.0735397339 0.11019899139311135 0 +172 0 -5.06709051 0.0735397339 0.11019899139311135 0 +173 1 4.79215431 0.9165277 0.12574962932901551 1 +174 1 4.681301 0.912188232 0.13259653664526669 1 +175 1 4.79215431 0.9165277 0.12574962932901551 1 +176 0 -5.06709051 0.0735397339 0.11019899139311135 0 +177 1 4.436872 0.9018929 0.14897197087347003 1 +178 0 -5.06709051 0.0735397339 0.11019899139311135 0 +179 1 1.02219725 0.625063956 0.67792428275805094 1 +180 0 -5.06709051 0.0735397339 0.11019899139311135 0 +181 0 -5.06709051 0.0735397339 0.11019899139311135 0 +182 0 -3.06499958 0.177628234 0.28213736074538492 0 +183 1 4.79215431 0.9165277 0.12574962932901551 1 +184 1 4.39055967 0.899824858 0.15228387288907483 1 +185 0 -5.06709051 0.0735397339 0.11019899139311135 0 +186 1 4.711059 0.913372755 0.13072433860609423 1 +187 1 4.762709 0.9153944 0.12753458870756793 1 +188 1 3.797926 0.8697741 0.20128734054858682 1 +189 0 -4.828518 0.08209182 0.12357825446206985 0 +190 1 4.75751543 0.9151931 0.12785194987984716 1 +191 1 4.76523352 0.9154921 0.12738063074324699 1 +192 0 -5.06709051 0.0735397339 0.11019899139311135 0 +193 0 -5.06709051 0.0735397339 0.11019899139311135 0 +194 0 -5.06709051 0.0735397339 0.11019899139311135 0 +195 0 -5.06709051 0.0735397339 0.11019899139311135 0 +196 0 2.13257957 0.7438907 1.9651684683094377 1 +197 0 -4.53108168 0.09401735 0.14244467134955621 0 +198 0 -5.06709051 0.0735397339 0.11019899139311135 0 +199 0 -5.06709051 0.0735397339 0.11019899139311135 0 +200 1 4.52514 0.9057293 0.14284817575998529 1 +201 1 4.681301 0.912188232 0.13259653664526669 1 +202 0 -5.06709051 0.0735397339 0.11019899139311135 0 +203 0 -5.06709051 0.0735397339 0.11019899139311135 0 +204 0 -5.06709051 0.0735397339 0.11019899139311135 0 +205 1 4.79215431 0.9165277 0.12574962932901551 1 +206 1 4.76587534 0.9155169 0.1273415567782486 1 +207 0 -5.06709051 0.0735397339 0.11019899139311135 0 +208 0 -5.06709051 0.0735397339 0.11019899139311135 0 +209 0 -5.06709051 0.0735397339 0.11019899139311135 0 +210 1 4.746889 0.9147798 0.12850361403582561 1 +211 1 4.77333546 0.915805 0.12688768126860211 1 +212 0 -5.06709051 0.0735397339 0.11019899139311135 0 +213 1 4.746889 0.9147798 0.12850361403582561 1 +214 1 4.762709 0.9153944 0.12753458870756793 1 +215 1 4.75751543 0.9151931 0.12785194987984716 1 +216 0 -5.06709051 0.0735397339 0.11019899139311135 0 +217 0 -5.06709051 0.0735397339 0.11019899139311135 0 +218 1 4.711059 0.913372755 0.13072433860609423 1 +219 0 -4.480684 0.09618582 0.14590190047332427 0 +220 0 -5.06709051 0.0735397339 0.11019899139311135 0 +221 1 4.74601841 0.9147458 0.12855719629318343 1 +222 1 -1.62423491 0.307439476 1.7016256711214062 0 +223 1 4.77333546 0.915805 0.12688768126860211 1 +224 1 4.746889 0.9147798 0.12850361403582561 1 +225 0 -5.06709051 0.0735397339 0.11019899139311135 0 +226 1 4.746889 0.9147798 0.12850361403582561 1 +227 1 4.77333546 0.915805 0.12688768126860211 1 +228 0 -5.06709051 0.0735397339 0.11019899139311135 0 +229 1 4.746889 0.9147798 0.12850361403582561 1 +230 1 3.65319085 0.861355662 0.21531903107074454 1 +231 1 4.711059 0.913372755 0.13072433860609423 1 +232 0 -0.8694895 0.3929939 0.72021707357021347 0 +233 1 4.45700455 0.90278 0.14755364292971973 1 +234 0 -4.439581 0.097987324 0.14878038704451294 0 +235 0 -1.125464 0.362915576 0.65044352816605155 0 +236 1 4.54348469 0.9065096 0.14160583124553194 1 +237 1 4.73225641 0.9142077 0.12940612952900263 1 +238 1 4.75005531 0.9149031 0.12830913656228091 1 +239 1 4.80769873 0.917120337 0.12481704928484323 1 +240 0 -3.855827 0.1269817 0.19591620825721698 0 +241 0 -5.086604 0.07287775 0.10916850994405589 0 +242 0 -5.06709051 0.0735397339 0.11019899139311135 0 +243 0 -1.8382057 0.285140723 0.48426882550157935 0 +244 0 -5.06709051 0.0735397339 0.11019899139311135 0 +245 0 -5.06709051 0.0735397339 0.11019899139311135 0 +246 1 4.52514 0.9057293 0.14284817575998529 1 +247 1 4.072646 0.8845583 0.17697083013255438 1 +248 0 -3.97179437 0.1206916 0.1855588398969503 0 +249 0 -2.32187271 0.238497183 0.39307872073754024 0 +250 0 -5.06709051 0.0735397339 0.11019899139311135 0 +251 1 4.917371 0.921194255 0.11842268050106061 1 +252 0 2.10006452 0.740781069 1.9477570103519279 1 +253 1 4.58626652 0.9083067 0.1387485444709517 1 +254 1 3.50176024 0.8520638 0.23096667790677894 1 +255 1 2.621632 0.7876497 0.34437396428629469 1 +256 0 -5.06709051 0.0735397339 0.11019899139311135 0 +257 0 -5.06709051 0.0735397339 0.11019899139311135 0 +258 0 -5.06709051 0.0735397339 0.11019899139311135 0 +259 0 0.586611152 0.5728052 1.2270340961595763 1 +260 1 4.39055967 0.899824858 0.15228387288907483 1 +261 1 4.79215431 0.9165277 0.12574962932901551 1 +262 1 4.52514 0.9057293 0.14284817575998529 1 +263 1 4.547461 0.9066779 0.14133797201266374 1 +264 1 3.86020255 0.8732606 0.19551581662055781 1 +265 0 -4.58326864 0.0918181762 0.13894693171059244 0 +266 1 4.649226 0.91089505 0.13464325401510344 1 +267 1 4.513293 0.9052223 0.14365597452948417 1 +268 1 4.77333546 0.915805 0.12688768126860211 1 +269 0 -5.06709051 0.0735397339 0.11019899139311135 0 +270 1 4.056826 0.8837481 0.17829286362834104 1 +271 0 -5.06709051 0.0735397339 0.11019899139311135 0 +272 1 4.513293 0.9052223 0.14365597452948417 1 +273 1 2.07283378 0.738158047 0.43799834974155005 1 +274 0 -5.06709051 0.0735397339 0.11019899139311135 0 +275 0 -1.21307468 0.352849483 0.62782679662951402 0 +276 0 -5.06709051 0.0735397339 0.11019899139311135 0 +277 0 -5.06709051 0.0735397339 0.11019899139311135 0 +278 0 -5.06709051 0.0735397339 0.11019899139311135 0 +279 1 4.634048 0.9102772 0.13562216868919963 1 +280 0 -5.06709051 0.0735397339 0.11019899139311135 0 +281 0 -5.06709051 0.0735397339 0.11019899139311135 0 +282 1 3.32898331 0.840840042 0.25009672138147615 1 +283 1 5.09356928 0.9273572 0.10880295581577505 1 +284 1 3.47843766 0.850587845 0.2334678563143473 1 +285 1 4.762709 0.9153944 0.12753458870756793 1 +286 1 4.76523352 0.9154921 0.12738063074324699 1 +287 0 -5.07516241 0.07326523 0.10977159730236945 0 +288 1 1.4611814 0.674934864 0.56717981621238545 1 +289 1 4.409973 0.9006964 0.15088720483476636 1 +290 0 -5.06709051 0.0735397339 0.11019899139311135 0 +291 0 -5.06709051 0.0735397339 0.11019899139311135 0 +292 1 3.63722825 0.8603997 0.21692103450360697 1 +293 1 3.49836516 0.8518497 0.23132923252189919 1 +294 0 -2.32187271 0.238497183 0.39307872073754024 0 +295 1 4.79215431 0.9165277 0.12574962932901551 1 +296 0 1.114413 0.635805964 1.4572207996501014 1 +297 0 1.1827414 0.643679559 1.488752847030872 1 +298 0 -2.64863157 0.210101157 0.34026018673991759 0 +299 1 1.44006455 0.6726141 0.57214907766788337 1 +300 1 3.26746154 0.836680055 0.25725205131358203 1 +301 0 -5.06709051 0.0735397339 0.11019899139311135 0 +302 1 4.746889 0.9147798 0.12850361403582561 1 +303 0 -5.06709051 0.0735397339 0.11019899139311135 0 +304 1 3.596441 0.8579322 0.2210644380785613 1 +305 1 4.75005531 0.9149031 0.12830913656228091 1 +306 0 -5.06709051 0.0735397339 0.11019899139311135 0 +307 0 -5.06709051 0.0735397339 0.11019899139311135 0 +308 1 4.5357666 0.906182 0.14212727497894229 1 +309 0 -1.8382057 0.285140723 0.48426882550157935 0 +310 0 -5.07516241 0.07326523 0.10977159730236945 0 +311 0 -5.06709051 0.0735397339 0.11019899139311135 0 +312 1 4.967415 0.922991753 0.11561033813318858 1 +313 0 -5.06709051 0.0735397339 0.11019899139311135 0 +314 0 -5.06709051 0.0735397339 0.11019899139311135 0 +315 0 4.409973 0.9006964 3.332010123738069 1 +316 1 3.75849748 0.8675248 0.20502308970503244 1 +317 1 4.711059 0.913372755 0.13072433860609423 1 +318 0 -5.07516241 0.07326523 0.10977159730236945 0 +319 0 0.720623851 0.5891159 1.2831966534220296 1 +320 1 4.76183844 0.9153607 0.12758775921607857 1 +321 0 -2.32187271 0.238497183 0.39307872073754024 0 +322 0 -5.06709051 0.0735397339 0.11019899139311135 0 +323 1 3.89754 0.875312448 0.1921300081520497 1 +324 0 -5.06709051 0.0735397339 0.11019899139311135 0 +325 0 -4.25203848 0.10659349 0.16261132712788906 0 +326 1 1.08230472 0.632080436 0.66181993383020321 1 +327 0 -5.06709051 0.0735397339 0.11019899139311135 0 +328 1 4.75005531 0.9149031 0.12830913656228091 1 +329 1 4.26974154 0.8942465 0.1612554982071048 1 +330 1 4.727664 0.9140274 0.12969069223292137 1 +331 0 -4.47418737 0.09646857 0.14635330428919666 0 +332 0 -5.06709051 0.0735397339 0.11019899139311135 0 +333 1 3.19266582 0.831505239 0.26620274145331585 1 +334 1 4.634048 0.9102772 0.13562216868919963 1 +335 0 -5.06709051 0.0735397339 0.11019899139311135 0 +336 1 4.22635651 0.892177463 0.16459739044084723 1 +337 0 -5.06709051 0.0735397339 0.11019899139311135 0 +338 0 -5.06709051 0.0735397339 0.11019899139311135 0 +339 1 4.649226 0.91089505 0.13464325401510344 1 +340 1 5.061498 0.926269531 0.11049603658852435 1 +341 0 -5.06709051 0.0735397339 0.11019899139311135 0 +342 0 -5.06709051 0.0735397339 0.11019899139311135 0 +343 0 -5.06709051 0.0735397339 0.11019899139311135 0 +344 1 4.76183844 0.9153607 0.12758775921607857 1 +345 0 -5.06709051 0.0735397339 0.11019899139311135 0 +346 0 -3.83567047 0.128103167 0.19777065605817651 0 +347 0 -4.25203848 0.10659349 0.16261132712788906 0 +348 1 1.05764711 0.6292087 0.66838951276929492 1 +349 1 2.31751466 0.761106849 0.39382909281031847 1 +350 0 -4.53108168 0.09401735 0.14244467134955621 0 +351 0 -5.06709051 0.0735397339 0.11019899139311135 0 +352 0 0.250423938 0.531262159 1.0931468283016983 1 +353 1 4.409973 0.9006964 0.15088720483476636 1 +354 0 -5.06709051 0.0735397339 0.11019899139311135 0 +355 0 -4.650723 0.0890442 0.13454703685394367 0 +356 1 1.11063206 0.635368049 0.65433555204938332 1 +357 1 4.762709 0.9153944 0.12753458870756793 1 +358 1 4.51489639 0.9052911 0.14354635480411143 1 +359 1 3.66055751 0.861794949 0.21458345278972704 1 +360 1 4.79215431 0.9165277 0.12574962932901551 1 +361 1 3.92105961 0.876590252 0.19002545935254803 1 +362 0 -4.977436 0.0766528845 0.11505499014436699 0 +363 0 -0.8199894 0.398913383 0.73435519677224237 0 +364 0 -5.06709051 0.0735397339 0.11019899139311135 0 +365 0 -5.06709051 0.0735397339 0.11019899139311135 0 +366 1 4.79215431 0.9165277 0.12574962932901551 1 +367 1 4.79215431 0.9165277 0.12574962932901551 1 +368 0 -5.06528139 0.07360139 0.11029500224239923 0 +369 0 -5.06528139 0.07360139 0.11029500224239923 0 +370 0 -4.15225935 0.111438632 0.17045667627503791 0 +371 0 -5.06528139 0.07360139 0.11029500224239923 0 +372 0 -5.06709051 0.0735397339 0.11019899139311135 0 +373 0 -5.06709051 0.0735397339 0.11019899139311135 0 +374 0 -5.06709051 0.0735397339 0.11019899139311135 0 +375 0 -5.06709051 0.0735397339 0.11019899139311135 0 +376 0 -5.06709051 0.0735397339 0.11019899139311135 0 +377 0 -5.06709051 0.0735397339 0.11019899139311135 0 +378 0 -5.09467554 0.07260554 0.10874499082924705 0 +379 0 -1.32017863 0.340719551 0.60103579576585831 0 +380 0 -5.06709051 0.0735397339 0.11019899139311135 0 +381 1 4.52426958 0.9056921 0.14290742049149191 1 +382 0 -5.06709051 0.0735397339 0.11019899139311135 0 +383 0 -5.06709051 0.0735397339 0.11019899139311135 0 +384 0 -5.06709051 0.0735397339 0.11019899139311135 0 +385 0 -4.3209815 0.103354961 0.15739112575571262 0 +386 1 4.38911438 0.89975965 0.1523884242559575 1 +387 0 -2.96974325 0.184692711 0.29458418120802426 0 +388 0 -5.06709051 0.0735397339 0.11019899139311135 0 +389 0 -4.650723 0.0890442 0.13454703685394367 0 +390 0 -5.06709051 0.0735397339 0.11019899139311135 0 +391 1 4.746889 0.9147798 0.12850361403582561 1 +392 0 -5.06709051 0.0735397339 0.11019899139311135 0 +393 0 -5.06709051 0.0735397339 0.11019899139311135 0 +394 0 -4.91612864 0.07885082 0.1184932763939283 0 +395 0 -5.06709051 0.0735397339 0.11019899139311135 0 +396 0 -5.06709051 0.0735397339 0.11019899139311135 0 +397 0 -5.06709051 0.0735397339 0.11019899139311135 0 +398 0 -5.06709051 0.0735397339 0.11019899139311135 0 +399 0 -4.91612864 0.07885082 0.1184932763939283 0 +400 1 4.58626652 0.9083067 0.1387485444709517 1 +401 0 -5.06709051 0.0735397339 0.11019899139311135 0 +402 0 -3.22995162 0.165898934 0.26170589278405587 0 +403 0 -4.258548 0.10628394 0.16211154584631315 0 +404 0 -5.086604 0.07287775 0.10916850994405589 0 +405 0 -5.06709051 0.0735397339 0.11019899139311135 0 +406 0 -5.06709051 0.0735397339 0.11019899139311135 0 +407 0 -5.06709051 0.0735397339 0.11019899139311135 0 +408 0 -4.054418 0.116375618 0.17849486659413633 0 +409 0 -5.06709051 0.0735397339 0.11019899139311135 0 +410 0 -5.06709051 0.0735397339 0.11019899139311135 0 +411 0 -2.32187271 0.238497183 0.39307872073754024 0 +412 1 4.77333546 0.915805 0.12688768126860211 1 +413 0 -5.06709051 0.0735397339 0.11019899139311135 0 +414 1 4.762709 0.9153944 0.12753458870756793 1 +415 0 -3.27486 0.162815079 0.25638176839715521 0 +416 1 4.681301 0.912188232 0.13259653664526669 1 +417 0 -5.06709051 0.0735397339 0.11019899139311135 0 +418 0 -4.47418737 0.09646857 0.14635330428919666 0 +419 0 -4.913885 0.07893233 0.11862094120998633 0 +420 0 -4.988878 0.07624896 0.11442400935782022 0 +421 1 4.681301 0.912188232 0.13259653664526669 1 +422 0 -2.92195082 0.188318178 0.30101379095532071 0 +423 0 -4.67087936 0.08823008 0.13325828196111109 0 +424 0 -5.06709051 0.0735397339 0.11019899139311135 0 +425 1 4.746889 0.9147798 0.12850361403582561 1 +426 0 -3.22995162 0.165898934 0.26170589278405587 0 +427 1 4.97487545 0.923256457 0.11519664784290429 1 +428 0 -5.06709051 0.0735397339 0.11019899139311135 0 +429 0 -5.06709051 0.0735397339 0.11019899139311135 0 +430 0 -5.238652 0.0679049343 0.10145098996675742 0 +431 0 -4.114714 0.1133111 0.17350007475982571 0 +432 0 -5.06709051 0.0735397339 0.11019899139311135 0 +433 0 -5.086604 0.07287775 0.10916850994405589 0 +434 0 1.9130224 0.7224227 1.8490386030968793 1 +435 1 3.65304828 0.861347139 0.21533330719490018 1 +436 1 3.21424055 0.8330112 0.26359218458857103 1 +437 0 -5.06709051 0.0735397339 0.11019899139311135 0 +438 0 -5.06528139 0.07360139 0.11029500224239923 0 +439 0 -5.06709051 0.0735397339 0.11019899139311135 0 +440 1 4.378543 0.8992819 0.1531546327764497 1 +441 0 -3.14050961 0.172180071 0.27261111517536707 0 +442 0 -4.988878 0.07624896 0.11442400935782022 0 +443 0 -5.06709051 0.0735397339 0.11019899139311135 0 +444 0 -4.114714 0.1133111 0.17350007475982571 0 +445 0 -5.06709051 0.0735397339 0.11019899139311135 0 +446 0 -5.06709051 0.0735397339 0.11019899139311135 0 +447 0 -5.06709051 0.0735397339 0.11019899139311135 0 +448 0 -5.06709051 0.0735397339 0.11019899139311135 0 +449 1 4.79215431 0.9165277 0.12574962932901551 1 +450 0 -4.53108168 0.09401735 0.14244467134955621 0 +451 0 -5.06709051 0.0735397339 0.11019899139311135 0 +452 0 -5.086604 0.07287775 0.10916850994405589 0 +453 1 4.79215431 0.9165277 0.12574962932901551 1 +454 0 -4.913885 0.07893233 0.11862094120998633 0 +455 1 -0.09499055 0.488128424 1.0346673326582805 0 +456 1 4.762709 0.9153944 0.12753458870756793 1 +457 1 4.75751543 0.9151931 0.12785194987984716 1 +458 0 -5.06709051 0.0735397339 0.11019899139311135 0 +459 0 -4.67087936 0.08823008 0.13325828196111109 0 +460 0 -4.53108168 0.09401735 0.14244467134955621 0 +461 0 -2.74227285 0.2024363 0.32632834253161519 0 +462 0 -3.06499958 0.177628234 0.28213736074538492 0 +463 0 -5.06709051 0.0735397339 0.11019899139311135 0 +464 0 -5.06709051 0.0735397339 0.11019899139311135 0 +465 1 4.75751543 0.9151931 0.12785194987984716 1 +466 1 4.762709 0.9153944 0.12753458870756793 1 +467 1 4.79215431 0.9165277 0.12574962932901551 1 +468 0 -5.06709051 0.0735397339 0.11019899139311135 0 +469 0 -5.06709051 0.0735397339 0.11019899139311135 0 +470 0 -5.06709051 0.0735397339 0.11019899139311135 0 +471 0 -3.06499958 0.177628234 0.28213736074538492 0 +472 0 -3.06499958 0.177628234 0.28213736074538492 0 +473 0 -5.06709051 0.0735397339 0.11019899139311135 0 +474 0 -5.06709051 0.0735397339 0.11019899139311135 0 +475 0 -5.06709051 0.0735397339 0.11019899139311135 0 +476 0 -5.06709051 0.0735397339 0.11019899139311135 0 +477 0 -5.06709051 0.0735397339 0.11019899139311135 0 +478 0 -5.06709051 0.0735397339 0.11019899139311135 0 +479 1 4.79215431 0.9165277 0.12574962932901551 1 +480 0 -5.06709051 0.0735397339 0.11019899139311135 0 +481 0 -3.941018 0.12233422 0.18825643603031542 0 +482 1 4.75751543 0.9151931 0.12785194987984716 1 +483 1 4.746889 0.9147798 0.12850361403582561 1 +484 0 -5.06709051 0.0735397339 0.11019899139311135 0 +485 0 -4.988878 0.07624896 0.11442400935782022 0 +486 0 -5.06709051 0.0735397339 0.11019899139311135 0 +487 1 4.681301 0.912188232 0.13259653664526669 1 +488 1 3.59504175 0.857846856 0.22120797588077992 1 +489 1 0.191501051 0.523919344 0.93258336526600449 1 +490 0 -5.06709051 0.0735397339 0.11019899139311135 0 +491 1 4.21267176 0.89151746 0.16566504161563095 1 +492 0 -5.06709051 0.0735397339 0.11019899139311135 0 +493 1 4.79215431 0.9165277 0.12574962932901551 1 +494 0 -1.62423491 0.307439476 0.52998793925452881 0 +495 0 -5.06709051 0.0735397339 0.11019899139311135 0 +496 0 -5.06709051 0.0735397339 0.11019899139311135 0 +497 0 -5.06709051 0.0735397339 0.11019899139311135 0 +498 0 -5.06709051 0.0735397339 0.11019899139311135 0 +499 0 -5.06709051 0.0735397339 0.11019899139311135 0 +500 0 -3.06499958 0.177628234 0.28213736074538492 0 +501 0 -5.06709051 0.0735397339 0.11019899139311135 0 +502 0 -5.06709051 0.0735397339 0.11019899139311135 0 +503 0 -5.06709051 0.0735397339 0.11019899139311135 0 +504 0 -5.06709051 0.0735397339 0.11019899139311135 0 +505 0 -5.238652 0.0679049343 0.10145098996675742 0 +506 1 4.29314756 0.8953482 0.15947925483764089 1 +507 0 -4.258548 0.10628394 0.16211154584631315 0 +508 0 -5.06709051 0.0735397339 0.11019899139311135 0 +509 0 -5.06709051 0.0735397339 0.11019899139311135 0 +510 0 -5.06709051 0.0735397339 0.11019899139311135 0 +511 0 -5.06709051 0.0735397339 0.11019899139311135 0 +512 0 -5.06709051 0.0735397339 0.11019899139311135 0 +513 0 -5.06709051 0.0735397339 0.11019899139311135 0 +514 1 4.79215431 0.9165277 0.12574962932901551 1 +515 1 4.79128361 0.91649437 0.12580207730770884 1 +516 0 -5.06709051 0.0735397339 0.11019899139311135 0 +517 0 -5.06709051 0.0735397339 0.11019899139311135 0 +518 0 -5.06709051 0.0735397339 0.11019899139311135 0 +519 1 4.21267176 0.89151746 0.16566504161563095 1 +520 0 -5.07516241 0.07326523 0.10977159730236945 0 +521 0 -4.650723 0.0890442 0.13454703685394367 0 +522 1 3.65319085 0.861355662 0.21531903107074454 1 +523 1 4.762709 0.9153944 0.12753458870756793 1 +524 0 -5.06709051 0.0735397339 0.11019899139311135 0 +525 0 -5.06709051 0.0735397339 0.11019899139311135 0 +526 0 -5.06709051 0.0735397339 0.11019899139311135 0 +527 0 -5.06709051 0.0735397339 0.11019899139311135 0 +528 0 -4.56829453 0.09244441 0.13994208430347921 0 +529 0 -5.06709051 0.0735397339 0.11019899139311135 0 +530 1 4.42197 0.901231647 0.15003012052673442 1 +531 0 -5.06709051 0.0735397339 0.11019899139311135 0 +532 0 -5.06709051 0.0735397339 0.11019899139311135 0 +533 0 -5.06709051 0.0735397339 0.11019899139311135 0 +534 0 -5.06709051 0.0735397339 0.11019899139311135 0 +535 0 -4.97767067 0.07664458 0.11504201020771486 0 +536 0 -5.06709051 0.0735397339 0.11019899139311135 0 +537 0 -5.06709051 0.0735397339 0.11019899139311135 0 +538 0 -5.06709051 0.0735397339 0.11019899139311135 0 +539 0 -3.06499958 0.177628234 0.28213736074538492 0 +540 0 -5.06709051 0.0735397339 0.11019899139311135 0 +541 0 -5.06709051 0.0735397339 0.11019899139311135 0 +542 0 -4.477027 0.09634489 0.14615583491211775 0 +543 0 -5.06709051 0.0735397339 0.11019899139311135 0 +544 0 -5.06528139 0.07360139 0.11029500224239923 0 +545 0 -5.06709051 0.0735397339 0.11019899139311135 0 +546 1 4.79215431 0.9165277 0.12574962932901551 1 +547 0 -5.06709051 0.0735397339 0.11019899139311135 0 +548 0 -5.06709051 0.0735397339 0.11019899139311135 0 +549 1 3.62263346 0.8595209 0.21839535394199591 1 +550 0 -5.06709051 0.0735397339 0.11019899139311135 0 +551 0 -5.06709051 0.0735397339 0.11019899139311135 0 +552 0 -4.435475 0.09816893 0.14907088318245851 0 +553 0 -2.29392338 0.241044477 0.39791275218627792 0 +554 0 -5.06709051 0.0735397339 0.11019899139311135 0 +555 0 -3.04633975 0.1789952 0.28453745036752404 0 +556 0 -5.06709051 0.0735397339 0.11019899139311135 0 +557 0 -4.53108168 0.09401735 0.14244467134955621 0 +558 0 -5.06709051 0.0735397339 0.11019899139311135 0 +559 0 -5.06709051 0.0735397339 0.11019899139311135 0 +560 0 -5.06709051 0.0735397339 0.11019899139311135 0 +561 0 -5.06709051 0.0735397339 0.11019899139311135 0 +562 0 -5.06709051 0.0735397339 0.11019899139311135 0 +563 0 -5.06709051 0.0735397339 0.11019899139311135 0 +564 0 -5.06709051 0.0735397339 0.11019899139311135 0 +565 1 4.79215431 0.9165277 0.12574962932901551 1 +566 0 -5.06709051 0.0735397339 0.11019899139311135 0 +567 0 -4.586527 0.09168242 0.13873129057968608 0 +568 1 3.85500479 0.8729727 0.19599151261732156 1 +569 1 4.77333546 0.915805 0.12688768126860211 1 +570 1 4.68043041 0.9121533 0.1326517794994434 1 +571 1 4.746889 0.9147798 0.12850361403582561 1 +572 0 -5.06709051 0.0735397339 0.11019899139311135 0 +573 0 -5.06709051 0.0735397339 0.11019899139311135 0 +574 1 4.97487545 0.923256457 0.11519664784290429 1 +575 0 -5.06709051 0.0735397339 0.11019899139311135 0 +576 0 -5.06709051 0.0735397339 0.11019899139311135 0 +577 0 -5.06709051 0.0735397339 0.11019899139311135 0 +578 0 -5.06709051 0.0735397339 0.11019899139311135 0 +579 0 -5.06709051 0.0735397339 0.11019899139311135 0 +580 0 -5.06709051 0.0735397339 0.11019899139311135 0 +581 1 4.79215431 0.9165277 0.12574962932901551 1 +582 1 4.79215431 0.9165277 0.12574962932901551 1 +583 0 -5.06709051 0.0735397339 0.11019899139311135 0 +584 0 -4.114714 0.1133111 0.17350007475982571 0 +585 0 -5.06709051 0.0735397339 0.11019899139311135 0 +586 1 4.746889 0.9147798 0.12850361403582561 1 +587 0 -5.06709051 0.0735397339 0.11019899139311135 0 +588 1 4.158567 0.8888733 0.16995033685902611 1 +589 0 -5.06709051 0.0735397339 0.11019899139311135 0 +590 1 4.06327724 0.8840791 0.17775264133485008 1 +591 1 4.79215431 0.9165277 0.12574962932901551 1 +592 1 4.685193 0.912344 0.1323502320499686 1 +593 0 -5.06709051 0.0735397339 0.11019899139311135 0 +594 1 4.21267176 0.89151746 0.16566504161563095 1 +595 0 -5.06709051 0.0735397339 0.11019899139311135 0 +596 0 -5.06709051 0.0735397339 0.11019899139311135 0 +597 0 -4.58326864 0.0918181762 0.13894693171059244 0 +598 0 -5.06709051 0.0735397339 0.11019899139311135 0 +599 0 -4.91612864 0.07885082 0.1184932763939283 0 +600 0 -5.06709051 0.0735397339 0.11019899139311135 0 +601 0 -5.06709051 0.0735397339 0.11019899139311135 0 +602 0 -5.06709051 0.0735397339 0.11019899139311135 0 +603 1 1.193701 0.6449354 0.63277336967845355 1 +604 1 0.36122784 0.54503113 0.87558946083848666 1 +605 1 4.5357666 0.906182 0.14212727497894229 1 +606 0 -5.06709051 0.0735397339 0.11019899139311135 0 +607 0 -5.06709051 0.0735397339 0.11019899139311135 0 +608 1 4.21267176 0.89151746 0.16566504161563095 1 +609 0 -5.06709051 0.0735397339 0.11019899139311135 0 +610 1 4.748452 0.9148407 0.1284075469710346 1 +611 1 4.436872 0.9018929 0.14897197087347003 1 +612 1 4.746889 0.9147798 0.12850361403582561 1 +613 0 -5.238652 0.0679049343 0.10145098996675742 0 +614 0 -5.06709051 0.0735397339 0.11019899139311135 0 +615 0 -5.06528139 0.07360139 0.11029500224239923 0 +616 0 -5.06709051 0.0735397339 0.11019899139311135 0 +617 0 -2.32187271 0.238497183 0.39307872073754024 0 +618 0 -5.06709051 0.0735397339 0.11019899139311135 0 +619 0 -5.06709051 0.0735397339 0.11019899139311135 0 +620 0 -5.06709051 0.0735397339 0.11019899139311135 0 +621 0 -2.10559 0.258688748 0.43184868514469865 0 +622 0 -3.06499958 0.177628234 0.28213736074538492 0 +623 0 -5.06709051 0.0735397339 0.11019899139311135 0 +624 0 -5.06709051 0.0735397339 0.11019899139311135 0 +625 0 -2.92824578 0.187837556 0.30015977916686465 0 +626 1 4.711059 0.913372755 0.13072433860609423 1 +627 0 -2.74227285 0.2024363 0.32632834253161519 0 +628 0 -5.06709051 0.0735397339 0.11019899139311135 0 +629 0 -5.06709051 0.0735397339 0.11019899139311135 0 +630 0 -4.813544 0.08265776 0.12446802613061553 0 +631 0 -5.06709051 0.0735397339 0.11019899139311135 0 +632 0 -5.06709051 0.0735397339 0.11019899139311135 0 +633 1 3.84438276 0.8723826 0.19696713075262356 1 +634 0 -5.06709051 0.0735397339 0.11019899139311135 0 +635 0 -5.06528139 0.07360139 0.11029500224239923 0 +636 1 4.97487545 0.923256457 0.11519664784290429 1 +637 0 -4.19794655 0.109196655 0.16682112010989417 0 +638 0 -5.06709051 0.0735397339 0.11019899139311135 0 +639 0 -4.53108168 0.09401735 0.14244467134955621 0 +640 0 -4.53108168 0.09401735 0.14244467134955621 0 +641 0 -5.06709051 0.0735397339 0.11019899139311135 0 +642 0 -5.06709051 0.0735397339 0.11019899139311135 0 +643 0 -5.06709051 0.0735397339 0.11019899139311135 0 +644 0 -5.06709051 0.0735397339 0.11019899139311135 0 +645 0 -5.06709051 0.0735397339 0.11019899139311135 0 +646 0 -5.06709051 0.0735397339 0.11019899139311135 0 +647 0 -5.086604 0.07287775 0.10916850994405589 0 +648 1 4.436872 0.9018929 0.14897197087347003 1 +649 0 -5.06709051 0.0735397339 0.11019899139311135 0 +650 0 -4.266619 0.105901212 0.16149385206384487 0 +651 0 -5.086604 0.07287775 0.10916850994405589 0 +652 0 -5.06709051 0.0735397339 0.11019899139311135 0 +653 0 -5.06709051 0.0735397339 0.11019899139311135 0 +654 0 -5.06709051 0.0735397339 0.11019899139311135 0 +655 0 -5.06709051 0.0735397339 0.11019899139311135 0 +656 0 -5.06709051 0.0735397339 0.11019899139311135 0 +657 0 -0.657974839 0.418487 0.78211668142342572 0 +658 1 4.38911438 0.89975965 0.1523884242559575 1 +659 0 -5.06709051 0.0735397339 0.11019899139311135 0 +660 0 -5.06709051 0.0735397339 0.11019899139311135 0 +661 0 -5.06709051 0.0735397339 0.11019899139311135 0 +662 0 -5.06528139 0.07360139 0.11029500224239923 0 +663 0 -5.06528139 0.07360139 0.11029500224239923 0 +664 0 -5.086604 0.07287775 0.10916850994405589 0 +665 0 -5.06709051 0.0735397339 0.11019899139311135 0 +666 0 -4.47418737 0.09646857 0.14635330428919666 0 +667 0 -5.06709051 0.0735397339 0.11019899139311135 0 +668 1 2.81698871 0.803528368 0.31557913591179698 1 +669 1 4.711059 0.913372755 0.13072433860609423 1 +670 1 4.711059 0.913372755 0.13072433860609423 1 +671 0 -5.06709051 0.0735397339 0.11019899139311135 0 +672 0 -5.06709051 0.0735397339 0.11019899139311135 0 +673 0 -4.15225935 0.111438632 0.17045667627503791 0 +674 0 -5.06709051 0.0735397339 0.11019899139311135 0 +675 0 -5.06528139 0.07360139 0.11029500224239923 0 +676 0 -5.06709051 0.0735397339 0.11019899139311135 0 +677 0 -5.06709051 0.0735397339 0.11019899139311135 0 +678 0 -5.06709051 0.0735397339 0.11019899139311135 0 +679 0 -5.06709051 0.0735397339 0.11019899139311135 0 +680 1 4.746889 0.9147798 0.12850361403582561 1 +681 1 4.79215431 0.9165277 0.12574962932901551 1 +682 0 -5.06709051 0.0735397339 0.11019899139311135 0 +683 0 -5.06709051 0.0735397339 0.11019899139311135 0 +684 0 -5.06709051 0.0735397339 0.11019899139311135 0 +685 0 -5.06709051 0.0735397339 0.11019899139311135 0 +686 0 -5.06709051 0.0735397339 0.11019899139311135 0 +687 0 -4.25203848 0.10659349 0.16261132712788906 0 +688 0 -5.06709051 0.0735397339 0.11019899139311135 0 +689 0 -4.47418737 0.09646857 0.14635330428919666 0 +690 0 -5.086604 0.07287775 0.10916850994405589 0 +691 1 3.19901466 0.831949532 0.26543208105885724 1 +692 0 -5.06709051 0.0735397339 0.11019899139311135 0 +693 0 -4.47418737 0.09646857 0.14635330428919666 0 +694 0 -5.07516241 0.07326523 0.10977159730236945 0 +695 0 -5.06709051 0.0735397339 0.11019899139311135 0 +696 1 4.711059 0.913372755 0.13072433860609423 1 +697 1 4.711059 0.913372755 0.13072433860609423 1 +698 1 4.711059 0.913372755 0.13072433860609423 1 diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss-out.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss-out.txt new file mode 100644 index 0000000000..8bd89002c1 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss-out.txt @@ -0,0 +1,65 @@ +maml.exe CV tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3702 (134.0/(134.0+228.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 127 | 7 | 0.9478 + negative || 10 | 218 | 0.9561 + ||====================== +Precision || 0.9270 | 0.9689 | +OVERALL 0/1 ACCURACY: 0.953039 +LOG LOSS/instance: 0.240776 +Test-set entropy (prior Log-Loss/instance): 0.950799 +LOG-LOSS REDUCTION (RIG): 74.676422 +AUC: 0.982031 +TEST POSITIVE RATIO: 0.3175 (107.0/(107.0+230.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 100 | 7 | 0.9346 + negative || 5 | 225 | 0.9783 + ||====================== +Precision || 0.9524 | 0.9698 | +OVERALL 0/1 ACCURACY: 0.964392 +LOG LOSS/instance: 0.205801 +Test-set entropy (prior Log-Loss/instance): 0.901650 +LOG-LOSS REDUCTION (RIG): 77.175051 +AUC: 0.994718 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.988374 (0.0063) +Accuracy: 0.958715 (0.0057) +Positive precision: 0.939694 (0.0127) +Positive recall: 0.941170 (0.0066) +Negative precision: 0.969358 (0.0005) +Negative recall: 0.967201 (0.0111) +Log-loss: 0.223289 (0.0175) +Log-loss reduction: 75.925737 (1.2493) +F1 Score: 0.940333 (0.0031) +AUPRC: 0.970067 (0.0183) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss-rp.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss-rp.txt new file mode 100644 index 0000000000..d3c7ce0fd0 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.988374 0.958715 0.939694 0.94117 0.969358 0.967201 0.223289 75.92574 0.940333 0.970067 10 0.2 20 10 goss + 1 LightGBM %Data% %Output% 99 0 0 maml.exe CV tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:goss;/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss.txt new file mode 100644 index 0000000000..13f90c4658 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-CV-breast-cancer.goss.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +5 1 4.85518169 0.918907166 0.1220089772233957 1 +6 0 -4.24826956 0.106773086 0.16290137276317815 0 +8 0 -6.3378787 0.0403514653 0.059421970461299017 0 +9 0 -6.135313 0.0444612838 0.065613765911889291 0 +10 0 -5.810166 0.0519028679 0.076893224701188714 0 +11 0 -6.242534 0.04223848 0.062261623353632063 0 +18 1 4.00077438 0.880837739 0.18305181399531753 1 +20 1 -0.127774343 0.484033644 1.0468207650886321 0 +21 1 5.126554 0.9284604 0.10708768636667922 1 +25 1 0.6900621 0.5854121 0.77247556630701764 1 +28 0 -6.242534 0.04223848 0.062261623353632063 0 +31 0 -6.242534 0.04223848 0.062261623353632063 0 +32 1 5.126554 0.9284604 0.10708768636667922 1 +35 0 -6.242534 0.04223848 0.062261623353632063 0 +37 0 -2.21439672 0.248393565 0.4119506770088443 0 +40 0 4.70202827 0.9130148 3.523086717288586 1 +41 1 3.108108 0.825498462 0.27666256813913126 1 +44 1 3.122963 0.826565862 0.27479831521838238 1 +45 0 -6.242534 0.04223848 0.062261623353632063 0 +46 1 4.27428675 0.8944613 0.16090907298519624 1 +48 0 -5.99168539 0.04761404 0.070381744820038394 0 +50 1 -1.71840513 0.297505975 1.7490094527393667 0 +51 1 -0.0494352467 0.4938209 1.0179401812696414 0 +52 1 4.23996973 0.8928305 0.1635417973814054 1 +54 1 4.151356 0.888516665 0.17052926002533803 1 +56 1 3.500455 0.851981461 0.23110605685986846 1 +60 1 2.71308422 0.7951971 0.33061554626794903 1 +63 1 1.56245458 0.685944557 0.54383612242454138 1 +64 0 -6.242534 0.04223848 0.062261623353632063 0 +66 0 -6.135313 0.0444612838 0.065613765911889291 0 +68 1 4.91996336 0.9212883 0.11827538541768642 1 +69 0 -6.242534 0.04223848 0.062261623353632063 0 +70 0 -5.38284874 0.0634812862 0.094620271713506648 0 +71 1 -0.00467008725 0.499416232 1.001685382146094 0 +72 0 -0.198462442 0.475212544 0.9301948598312737 0 +73 1 4.7046 0.9131169 0.13112856839964138 1 +74 1 1.08230865 0.6320809 0.66181884547134096 1 +76 0 -4.652814 0.08895943 0.13441279903011069 0 +77 0 -5.82893229 0.0514430664 0.076193726323763242 0 +79 0 -5.633163 0.0564346947 0.083805722897024773 0 +82 0 -6.135313 0.0444612838 0.065613765911889291 0 +88 0 -6.135313 0.0444612838 0.065613765911889291 0 +90 0 -6.242534 0.04223848 0.062261623353632063 0 +91 0 -6.19425154 0.04322597 0.063749864497165798 0 +92 0 -6.135313 0.0444612838 0.065613765911889291 0 +93 0 -6.242534 0.04223848 0.062261623353632063 0 +95 0 -6.242534 0.04223848 0.062261623353632063 0 +96 0 -6.19425154 0.04322597 0.063749864497165798 0 +97 0 -6.135313 0.0444612838 0.065613765911889291 0 +98 1 1.52928579 0.6823609 0.55139314018209817 1 +99 1 4.85518169 0.918907166 0.1220089772233957 1 +100 1 4.152907 0.888593435 0.17040461178071042 1 +102 0 -6.135313 0.0444612838 0.065613765911889291 0 +104 1 3.122963 0.826565862 0.27479831521838238 1 +105 1 0.9779411 0.619863868 0.68997668402080226 1 +106 1 4.069211 0.884382844 0.17725705611683257 1 +108 0 -4.91201973 0.07900017 0.11872720102638425 0 +109 1 4.69007254 0.9125389 0.1320420570535013 1 +111 1 2.340768 0.7632144 0.38983968546284176 1 +112 1 3.65980673 0.8617502 0.21465839075814694 1 +113 1 4.422728 0.9012654 0.14997611645415226 1 +115 0 -4.34361458 0.102310926 0.15571225868762351 0 +117 1 4.30059528 0.8956966 0.15891799661402123 1 +120 0 -6.098907 0.0452410728 0.066791590430185288 0 +121 0 -5.602051 0.05726879 0.085081605616356845 0 +122 1 5.21049833 0.931198657 0.10283911801689605 1 +123 1 5.003908 0.9242787 0.1136001949744247 1 +125 0 -6.242534 0.04223848 0.062261623353632063 0 +128 1 2.05279565 0.736216962 0.44179710528726762 1 +129 0 -5.633163 0.0564346947 0.083805722897024773 0 +131 0 -6.242534 0.04223848 0.062261623353632063 0 +132 1 3.33652782 0.841344237 0.24923189265527487 1 +133 0 -6.242534 0.04223848 0.062261623353632063 0 +137 0 -6.3378787 0.0403514653 0.059421970461299017 0 +138 0 -6.135313 0.0444612838 0.065613765911889291 0 +141 0 -6.3378787 0.0403514653 0.059421970461299017 0 +144 0 -6.242534 0.04223848 0.062261623353632063 0 +145 0 -3.88993287 0.12510325 0.19281532624266143 0 +147 0 -5.099901 0.072429806 0.10847163287095088 0 +150 0 -5.810166 0.0519028679 0.076893224701188714 0 +151 1 4.472859 0.9034735 0.14644581490388903 1 +152 1 4.85518169 0.918907166 0.1220089772233957 1 +154 0 -6.3378787 0.0403514653 0.059421970461299017 0 +156 0 -6.242534 0.04223848 0.062261623353632063 0 +161 0 -6.135313 0.0444612838 0.065613765911889291 0 +164 0 -3.87146831 0.126117259 0.19448838576547844 0 +167 1 1.59076393 0.688985765 0.53745391893088279 1 +169 0 -5.76188326 0.0531037673 0.078721760875576821 0 +171 0 -6.242534 0.04223848 0.062261623353632063 0 +173 1 4.70202827 0.9130148 0.13128980227907441 1 +174 1 4.27562952 0.894524634 0.16080688237702942 1 +176 0 -6.242534 0.04223848 0.062261623353632063 0 +177 1 3.122963 0.826565862 0.27479831521838238 1 +179 1 1.21912742 0.6478413 0.62628770800876199 1 +180 0 -5.810166 0.0519028679 0.076893224701188714 0 +181 0 -6.3378787 0.0403514653 0.059421970461299017 0 +183 1 4.70202827 0.9130148 0.13128980227907441 1 +187 1 4.85518169 0.918907166 0.1220089772233957 1 +188 1 4.70202827 0.9130148 0.13128980227907441 1 +189 0 -3.34654927 0.157988071 0.24808742317517343 0 +191 1 4.7046 0.9131169 0.13112856839964138 1 +192 0 -6.135313 0.0444612838 0.065613765911889291 0 +196 0 4.85518169 0.918907166 3.6242817491605308 1 +198 0 -6.3378787 0.0403514653 0.059421970461299017 0 +199 0 -6.242534 0.04223848 0.062261623353632063 0 +201 1 4.27562952 0.894524634 0.16080688237702942 1 +202 0 -6.242534 0.04223848 0.062261623353632063 0 +204 0 -6.242534 0.04223848 0.062261623353632063 0 +205 1 4.70202827 0.9130148 0.13128980227907441 1 +206 1 3.6366837 0.86036706 0.21697580455939161 1 +207 0 -5.810166 0.0519028679 0.076893224701188714 0 +209 0 -5.70294476 0.0546052568 0.081011252119550181 0 +210 1 4.85518169 0.918907166 0.1220089772233957 1 +211 1 4.85518169 0.918907166 0.1220089772233957 1 +212 0 -6.242534 0.04223848 0.062261623353632063 0 +216 0 -6.242534 0.04223848 0.062261623353632063 0 +218 1 4.37753439 0.899236262 0.15322788124954945 1 +219 0 -3.12401366 0.173358873 0.27466695169648236 0 +223 1 4.990325 0.923802 0.11434439694212548 1 +226 1 4.979455 0.9234185 0.11494342470711602 1 +228 0 -5.810166 0.0519028679 0.076893224701188714 0 +233 1 4.00077438 0.880837739 0.18305181399531753 1 +237 1 3.52581024 0.853573143 0.2284133104478088 1 +239 1 4.092378 0.885562 0.17533477402320735 1 +240 0 -3.64361954 0.139216855 0.21627826641877368 0 +241 0 -5.66653872 0.0555526167 0.082457670945938727 0 +242 0 -6.242534 0.04223848 0.062261623353632063 0 +244 0 -6.242534 0.04223848 0.062261623353632063 0 +246 1 4.85518169 0.918907166 0.1220089772233957 1 +247 1 2.74376464 0.7976841 0.32611062151708015 1 +248 0 -4.8047986 0.08298992 0.12499050827350028 0 +249 0 -4.24826956 0.106773086 0.16290137276317815 0 +250 0 -6.3378787 0.0403514653 0.059421970461299017 0 +252 0 2.37881422 0.766635 2.0993398968716317 1 +254 1 3.7206285 0.865333557 0.20867174426924942 1 +257 0 -6.242534 0.04223848 0.062261623353632063 0 +258 0 -6.242534 0.04223848 0.062261623353632063 0 +259 0 3.15156269 0.828606248 2.5446135757601787 1 +260 1 4.151356 0.888516665 0.17052926002533803 1 +262 1 4.979455 0.9234185 0.11494342470711602 1 +267 1 3.52967453 0.8538145 0.22800546061493704 1 +268 1 3.8141408 0.8706897 0.19976945448062877 1 +269 0 -6.242534 0.04223848 0.062261623353632063 0 +271 0 -6.135313 0.0444612838 0.065613765911889291 0 +272 1 3.52967453 0.8538145 0.22800546061493704 1 +275 0 -3.88993287 0.12510325 0.19281532624266143 0 +276 0 -6.242534 0.04223848 0.062261623353632063 0 +277 0 -6.242534 0.04223848 0.062261623353632063 0 +278 0 -6.242534 0.04223848 0.062261623353632063 0 +279 1 3.500455 0.851981461 0.23110605685986846 1 +280 0 -6.242534 0.04223848 0.062261623353632063 0 +283 1 4.91144276 0.920978844 0.11876007838360149 1 +284 1 3.01267433 0.818517745 0.28891440184822059 1 +285 1 4.85518169 0.918907166 0.1220089772233957 1 +288 1 2.386345 0.767308 0.38212230439278783 1 +290 0 -6.3378787 0.0403514653 0.059421970461299017 0 +291 0 -6.242534 0.04223848 0.062261623353632063 0 +293 1 0.821331739 0.601247549 0.73396898703671409 1 +296 0 4.376199 0.8991757 3.3100847558567241 1 +297 0 -0.5855849 0.427320361 0.80419978430742423 0 +299 1 0.307198554 0.5383245 0.89345207492762446 1 +300 1 4.53068829 0.9059659 0.14247130711177569 1 +301 0 -6.242534 0.04223848 0.062261623353632063 0 +303 0 -6.242534 0.04223848 0.062261623353632063 0 +304 1 4.201643 0.890983 0.16653021305505525 1 +308 1 4.53068829 0.9059659 0.14247130711177569 1 +309 0 -1.133761 0.361956924 0.64827426784843212 0 +311 0 -6.3378787 0.0403514653 0.059421970461299017 0 +312 1 2.73482418 0.7969617 0.32741765652805882 1 +314 0 -5.810166 0.0519028679 0.076893224701188714 0 +316 1 4.51358 0.905234635 0.14363631075946678 1 +317 1 4.70202827 0.9130148 0.13128980227907441 1 +319 0 4.42486858 0.9013606 3.3416917470480749 1 +321 0 -4.24826956 0.106773086 0.16290137276317815 0 +323 1 3.91605759 0.876319468 0.19047118521064277 1 +327 0 -6.242534 0.04223848 0.062261623353632063 0 +328 1 2.23526525 0.753549337 0.4082261219183172 1 +329 1 4.27562952 0.894524634 0.16080688237702942 1 +331 0 -6.135313 0.0444612838 0.065613765911889291 0 +332 0 -5.99168539 0.04761404 0.070381744820038394 0 +333 1 4.55144644 0.9068464 0.1410698780291269 1 +336 1 3.33652782 0.841344237 0.24923189265527487 1 +338 0 -5.810166 0.0519028679 0.076893224701188714 0 +343 0 -6.3378787 0.0403514653 0.059421970461299017 0 +344 1 4.85518169 0.918907166 0.1220089772233957 1 +346 0 -4.048108 0.116700441 0.1790253031014257 0 +347 0 -4.574996 0.0921636745 0.139495878563443 0 +348 1 1.9777838 0.728869 0.4562685119118447 1 +349 1 2.26726246 0.7565084 0.40257197415769308 1 +350 0 -6.08703041 0.0454982668 0.067180277610699737 0 +352 0 3.43233681 0.8476347 2.7143934625780504 1 +353 1 4.15001345 0.888450146 0.17063727140593779 1 +354 0 -6.242534 0.04223848 0.062261623353632063 0 +355 0 -5.525942 0.05935827 0.088282756944531748 0 +358 1 4.13402176 0.8876552 0.17192871100161813 1 +360 1 4.70202827 0.9130148 0.13128980227907441 1 +361 1 2.823096 0.80401 0.31471469627522414 1 +366 1 4.70202827 0.9130148 0.13128980227907441 1 +368 0 -5.585415 0.0577195249 0.085771544883292264 0 +370 0 -5.36318827 0.06406822 0.095524720040672251 0 +371 0 -5.585415 0.0577195249 0.085771544883292264 0 +373 0 -5.99168539 0.04761404 0.070381744820038394 0 +376 0 -6.242534 0.04223848 0.062261623353632063 0 +377 0 -5.810166 0.0519028679 0.076893224701188714 0 +378 0 -5.489536 0.06038282 0.08985500402168177 0 +379 0 -0.7603255 0.406087637 0.75167803038903647 0 +381 1 4.081508 0.88501 0.17623433155332399 1 +383 0 -6.3378787 0.0403514653 0.059421970461299017 0 +384 0 -6.3378787 0.0403514653 0.059421970461299017 0 +387 0 -2.07415 0.261714756 0.43774977197350545 0 +388 0 -6.242534 0.04223848 0.062261623353632063 0 +389 0 -4.72309971 0.0861521 0.12997402898935428 0 +391 1 4.84322643 0.918460667 0.12271015531091441 1 +392 0 -6.242534 0.04223848 0.062261623353632063 0 +395 0 -6.242534 0.04223848 0.062261623353632063 0 +396 0 -6.242534 0.04223848 0.062261623353632063 0 +398 0 -6.242534 0.04223848 0.062261623353632063 0 +399 0 -4.91217041 0.0789946839 0.11871861125458473 0 +404 0 -6.19425154 0.04322597 0.063749864497165798 0 +406 0 -6.135313 0.0444612838 0.065613765911889291 0 +409 0 -6.242534 0.04223848 0.062261623353632063 0 +413 0 -6.135313 0.0444612838 0.065613765911889291 0 +414 1 4.990325 0.923802 0.11434439694212548 1 +415 0 -3.459314 0.150631458 0.23553741746721518 0 +416 1 4.151356 0.888516665 0.17052926002533803 1 +418 0 -5.18884325 0.0694983 0.10391930969435764 0 +419 0 -5.47041 0.0609276779 0.090691824422903702 0 +422 0 -1.49663413 0.321188122 0.55891628526222026 0 +423 0 -5.38284874 0.0634812862 0.094620271713506648 0 +428 0 -6.242534 0.04223848 0.062261623353632063 0 +429 0 -6.242534 0.04223848 0.062261623353632063 0 +430 0 -6.079781 0.04565594 0.067418614232078428 0 +434 0 3.84762073 0.872562766 2.9721412368332492 1 +436 1 0.539397061 0.567018867 0.81853135582316505 1 +439 0 -6.23065758 0.0424793661 0.062624518391501238 0 +440 1 3.37768245 0.8440717 0.24456256392734108 1 +441 0 -5.08747435 0.07284836 0.10912277293344663 0 +442 0 -5.464276 0.0611033961 0.090961805250660777 0 +449 1 4.70202827 0.9130148 0.13128980227907441 1 +450 0 -5.559317 0.05843334 0.086864856564023749 0 +451 0 -6.23065758 0.0424793661 0.062624518391501238 0 +452 0 -6.19425154 0.04322597 0.063749864497165798 0 +453 1 4.30059528 0.8956966 0.15891799661402123 1 +454 0 -5.47041 0.0609276779 0.090691824422903702 0 +455 1 -3.56580019 0.1439454 2.796406449448138 0 +456 1 4.85518169 0.918907166 0.1220089772233957 1 +457 1 4.53068829 0.9059659 0.14247130711177569 1 +464 0 -6.23065758 0.0424793661 0.062624518391501238 0 +465 1 4.53068829 0.9059659 0.14247130711177569 1 +466 1 5.21049833 0.931198657 0.10283911801689605 1 +467 1 4.70202827 0.9130148 0.13128980227907441 1 +474 0 -6.23065758 0.0424793661 0.062624518391501238 0 +480 0 -5.7982893 0.0521958619 0.077339135170347129 0 +482 1 4.85518169 0.918907166 0.1220089772233957 1 +483 1 4.85518169 0.918907166 0.1220089772233957 1 +484 0 -6.23065758 0.0424793661 0.062624518391501238 0 +487 1 4.151356 0.888516665 0.17052926002533803 1 +489 1 -1.62315154 0.3075548 1.7010845499433891 0 +492 0 -5.70294476 0.0546052568 0.081011252119550181 0 +493 1 4.70202827 0.9130148 0.13128980227907441 1 +495 0 -5.810166 0.0519028679 0.076893224701188714 0 +497 0 -6.23065758 0.0424793661 0.062624518391501238 0 +501 0 -6.135313 0.0444612838 0.065613765911889291 0 +502 0 -5.99168539 0.04761404 0.070381744820038394 0 +504 0 -6.3378787 0.0403514653 0.059421970461299017 0 +507 0 -5.60790348 0.0571110062 0.084840162337402394 0 +510 0 -6.3378787 0.0403514653 0.059421970461299017 0 +513 0 -5.810166 0.0519028679 0.076893224701188714 0 +514 1 4.565799 0.907450855 0.14010858234374976 1 +517 0 -5.810166 0.0519028679 0.076893224701188714 0 +519 1 3.721043 0.865357757 0.20863139914490494 1 +520 0 -5.633163 0.0564346947 0.083805722897024773 0 +521 0 -5.525942 0.05935827 0.088282756944531748 0 +522 1 4.84322643 0.918460667 0.12271015531091441 1 +523 1 4.85518169 0.918907166 0.1220089772233957 1 +527 0 -6.135313 0.0444612838 0.065613765911889291 0 +528 0 -4.54600763 0.09338359 0.14143581691346635 0 +529 0 -5.70294476 0.0546052568 0.081011252119550181 0 +531 0 -6.135313 0.0444612838 0.065613765911889291 0 +532 0 -5.810166 0.0519028679 0.076893224701188714 0 +533 0 -6.242534 0.04223848 0.062261623353632063 0 +534 0 -6.242534 0.04223848 0.062261623353632063 0 +535 0 -3.876166 0.1258586 0.19406143587184183 0 +538 0 -6.135313 0.0444612838 0.065613765911889291 0 +539 0 -5.346754 0.0645627156 0.09628716243003746 0 +540 0 -5.33247042 0.0649953857 0.09695461009881863 0 +541 0 -6.3378787 0.0403514653 0.059421970461299017 0 +544 0 -5.3464427 0.06457212 0.096301663882982419 0 +546 1 4.70202827 0.9130148 0.13128980227907441 1 +547 0 -5.90551043 0.0496064536 0.073403055305693618 0 +548 0 -5.90551043 0.0496064536 0.073403055305693618 0 +549 1 4.081508 0.88501 0.17623433155332399 1 +557 0 -6.08703041 0.0454982668 0.067180277610699737 0 +558 0 -6.242534 0.04223848 0.062261623353632063 0 +559 0 -6.135313 0.0444612838 0.065613765911889291 0 +560 0 -6.135313 0.0444612838 0.065613765911889291 0 +561 0 -6.135313 0.0444612838 0.065613765911889291 0 +563 0 -6.242534 0.04223848 0.062261623353632063 0 +565 1 4.70202827 0.9130148 0.13128980227907441 1 +566 0 -6.242534 0.04223848 0.062261623353632063 0 +569 1 4.85518169 0.918907166 0.1220089772233957 1 +577 0 -6.242534 0.04223848 0.062261623353632063 0 +578 0 -6.242534 0.04223848 0.062261623353632063 0 +581 1 4.70202827 0.9130148 0.13128980227907441 1 +582 1 4.70202827 0.9130148 0.13128980227907441 1 +584 0 -5.382314 0.06349718 0.094644753479154534 0 +586 1 4.85518169 0.918907166 0.1220089772233957 1 +590 1 2.48048949 0.775606632 0.36660295486675726 1 +593 0 -6.23065758 0.0424793661 0.062624518391501238 0 +594 1 3.721043 0.865357757 0.20863139914490494 1 +600 0 -6.242534 0.04223848 0.062261623353632063 0 +602 0 -6.135313 0.0444612838 0.065613765911889291 0 +604 1 -0.696793735 0.413771242 1.273094716981011 0 +606 0 -6.08703041 0.0454982668 0.067180277610699737 0 +607 0 -6.3378787 0.0403514653 0.059421970461299017 0 +609 0 -6.23065758 0.0424793661 0.062624518391501238 0 +612 1 4.85518169 0.918907166 0.1220089772233957 1 +613 0 -6.079781 0.04565594 0.067418614232078428 0 +614 0 -5.810166 0.0519028679 0.076893224701188714 0 +617 0 -3.911246 0.123941518 0.19090091416286459 0 +618 0 -6.135313 0.0444612838 0.065613765911889291 0 +619 0 -6.135313 0.0444612838 0.065613765911889291 0 +621 0 0.6244607 0.5774296 1.2427363560236449 1 +622 0 -5.203127 0.06903787 0.10320561169602728 0 +624 0 -5.559317 0.05843334 0.086864856564023749 0 +627 0 -4.34361458 0.102310926 0.15571225868762351 0 +629 0 -6.23065758 0.0424793661 0.062624518391501238 0 +633 1 4.53068829 0.9059659 0.14247130711177569 1 +634 0 -6.3378787 0.0403514653 0.059421970461299017 0 +638 0 -6.23065758 0.0424793661 0.062624518391501238 0 +639 0 -6.08703041 0.0454982668 0.067180277610699737 0 +641 0 -6.242534 0.04223848 0.062261623353632063 0 +642 0 -6.242534 0.04223848 0.062261623353632063 0 +644 0 -6.3378787 0.0403514653 0.059421970461299017 0 +645 0 -6.242534 0.04223848 0.062261623353632063 0 +649 0 -6.242534 0.04223848 0.062261623353632063 0 +652 0 -6.135313 0.0444612838 0.065613765911889291 0 +653 0 -6.135313 0.0444612838 0.065613765911889291 0 +654 0 -6.242534 0.04223848 0.062261623353632063 0 +656 0 -6.135313 0.0444612838 0.065613765911889291 0 +657 0 2.0096736 0.7320085 1.8997409424272591 1 +660 0 -6.242534 0.04223848 0.062261623353632063 0 +661 0 -6.135313 0.0444612838 0.065613765911889291 0 +665 0 -6.3378787 0.0403514653 0.059421970461299017 0 +668 1 3.20690775 0.8325006 0.26447682282869772 1 +670 1 4.30059528 0.8956966 0.15891799661402123 1 +678 0 -6.3378787 0.0403514653 0.059421970461299017 0 +679 0 -6.3378787 0.0403514653 0.059421970461299017 0 +680 1 4.85518169 0.918907166 0.1220089772233957 1 +681 1 4.70202827 0.9130148 0.13128980227907441 1 +682 0 -6.135313 0.0444612838 0.065613765911889291 0 +683 0 -6.3378787 0.0403514653 0.059421970461299017 0 +685 0 -6.3378787 0.0403514653 0.059421970461299017 0 +688 0 -6.23065758 0.0424793661 0.062624518391501238 0 +689 0 -6.3378787 0.0403514653 0.059421970461299017 0 +691 1 4.55144644 0.9068464 0.1410698780291269 1 +692 0 -6.3378787 0.0403514653 0.059421970461299017 0 +693 0 -6.242534 0.04223848 0.062261623353632063 0 +694 0 -5.099901 0.072429806 0.10847163287095088 0 +696 1 4.524633 0.905707657 0.14288263994722966 1 +697 1 3.11245561 0.8258114 0.27611578466961867 1 +698 1 4.30059528 0.8956966 0.15891799661402123 1 +0 0 -5.974533 0.0480044559 0.070973273947168333 0 +1 0 2.678866 0.792396665 2.2680984724905557 1 +2 0 -5.432625 0.0620176345 0.092367295239153435 0 +3 0 1.89577818 0.7206904 1.8400630852016717 1 +4 0 -5.974533 0.0480044559 0.070973273947168333 0 +7 0 -5.555257 0.058545135 0.087036163665638336 0 +12 1 0.060030926 0.507503331 0.97851080425556425 1 +13 0 -4.91115141 0.0790317655 0.11877669824863878 0 +14 1 5.1771 0.930121064 0.10450958583479689 1 +15 1 0.9512126 0.6167098 0.69733625645623987 1 +16 0 -5.974533 0.0480044559 0.070973273947168333 0 +17 0 -5.974533 0.0480044559 0.070973273947168333 0 +19 0 -5.974533 0.0480044559 0.070973273947168333 0 +22 0 -5.974533 0.0480044559 0.070973273947168333 0 +23 1 5.146586 0.929122865 0.1060587067894013 1 +24 0 -5.974533 0.0480044559 0.070973273947168333 0 +26 0 -5.84363365 0.0510855578 0.075650080730339395 0 +27 0 -5.974533 0.0480044559 0.070973273947168333 0 +29 0 -4.762908 0.0845979 0.12752249409956656 0 +30 0 -5.974533 0.0480044559 0.070973273947168333 0 +33 0 -5.974533 0.0480044559 0.070973273947168333 0 +34 0 -5.555257 0.058545135 0.087036163665638336 0 +36 1 4.450465 0.902492642 0.14801292445262823 1 +38 1 3.87085843 0.873849154 0.19454383604597725 1 +39 1 1.07046688 0.6307029 0.66496749879075256 1 +42 1 3.77061033 0.8682193 0.20386857508895609 1 +43 1 2.812319 0.8031595 0.31624161720771332 1 +47 0 -5.974533 0.0480044559 0.070973273947168333 0 +49 1 3.22925186 0.8340526 0.26178968536294561 1 +53 1 1.92274415 0.7233964 0.46714163564157496 1 +55 1 4.38272762 0.8994713 0.15285087299260952 1 +57 1 -1.28345871 0.344855726 1.5359351743199918 0 +58 1 1.33113766 0.660510242 0.59834716256458442 1 +59 1 2.48897457 0.7763441 0.36523181503158558 1 +61 0 -5.432625 0.0620176345 0.092367295239153435 0 +62 1 3.609634 0.8587343 0.21971626085566962 1 +65 1 1.96780252 0.7278816 0.45822427906185348 1 +67 1 4.07177448 0.8845138 0.17704345071093652 1 +75 0 -3.99565387 0.119431272 0.18349248497039539 0 +78 0 -4.91115141 0.0790317655 0.11877669824863878 0 +80 0 -4.406663 0.09945172 0.15112447237205598 0 +81 0 -5.974533 0.0480044559 0.070973273947168333 0 +83 0 -5.432625 0.0620176345 0.092367295239153435 0 +84 1 4.73084354 0.914152265 0.12949360894701575 1 +85 1 3.12721014 0.82687 0.2742675250711904 1 +86 1 -0.3117204 0.461113632 1.1168057786673267 0 +87 1 4.73084354 0.914152265 0.12949360894701575 1 +89 0 -5.864908 0.05057236 0.074870047102428255 0 +94 0 -5.974533 0.0480044559 0.070973273947168333 0 +101 1 0.32106185 0.540046751 0.88884378902522021 1 +103 1 -1.676115 0.301944047 1.7276468641706269 0 +107 1 4.43419743 0.9017745 0.14916133923493161 1 +110 0 -1.21769476 0.352322161 0.62665171377775342 0 +114 0 -0.9544226 0.382910848 0.69644916087447573 0 +116 0 1.48628664 0.6776828 1.6334469930748525 1 +118 0 -4.80152655 0.08311451 0.1251865318331622 0 +119 0 -5.30172539 0.06593586 0.098406471340375598 0 +124 1 1.3495574 0.6625724 0.59385002196764458 1 +126 1 4.9201827 0.9212963 0.118262878162882 1 +127 0 -5.974533 0.0480044559 0.070973273947168333 0 +130 0 -4.762908 0.0845979 0.12752249409956656 0 +134 0 -5.864908 0.05057236 0.074870047102428255 0 +135 0 -4.62521 0.0900844 0.13619535592091017 0 +136 0 -5.974533 0.0480044559 0.070973273947168333 0 +139 0 -1.832093 0.285764128 0.48552750072742312 0 +140 0 -5.974533 0.0480044559 0.070973273947168333 0 +142 1 3.56091166 0.8557531 0.22473344136518184 1 +143 0 -1.832093 0.285764128 0.48552750072742312 0 +146 1 -0.153355062 0.48084 1.0563711866958063 0 +148 0 -4.320837 0.103361659 0.15740190294274298 0 +149 1 4.952993 0.9224776 0.11641421080668345 1 +153 0 -4.91115141 0.0790317655 0.11877669824863878 0 +155 1 2.47921371 0.7754956 0.36680952002717315 1 +157 0 -5.974533 0.0480044559 0.070973273947168333 0 +158 0 -1.3031919 0.342629969 0.60522240860358534 0 +159 1 4.952993 0.9224776 0.11641421080668345 1 +160 1 5.005415 0.9243314 0.11351786033512073 1 +162 0 -5.974533 0.0480044559 0.070973273947168333 0 +163 0 -4.233674 0.107471094 0.16402920021311729 0 +165 0 -5.432625 0.0620176345 0.092367295239153435 0 +166 1 2.9034152 0.8102611 0.30354126743346843 1 +168 0 -5.974533 0.0480044559 0.070973273947168333 0 +170 0 -5.974533 0.0480044559 0.070973273947168333 0 +172 0 -5.974533 0.0480044559 0.070973273947168333 0 +175 1 4.691906 0.912612 0.13192643773024004 1 +178 0 -5.974533 0.0480044559 0.070973273947168333 0 +182 0 -5.974533 0.0480044559 0.070973273947168333 0 +184 1 5.083561 0.927019358 0.10932862988856006 1 +185 0 -5.974533 0.0480044559 0.070973273947168333 0 +186 1 3.578182 0.8568158 0.22294298551465075 1 +190 1 5.05077 0.925902367 0.11106802083275139 1 +193 0 -5.974533 0.0480044559 0.070973273947168333 0 +194 0 -5.974533 0.0480044559 0.070973273947168333 0 +195 0 -5.974533 0.0480044559 0.070973273947168333 0 +197 0 -5.974533 0.0480044559 0.070973273947168333 0 +200 1 4.952993 0.9224776 0.11641421080668345 1 +203 0 -5.974533 0.0480044559 0.070973273947168333 0 +208 0 -5.974533 0.0480044559 0.070973273947168333 0 +213 1 4.952993 0.9224776 0.11641421080668345 1 +214 1 4.95600557 0.922585249 0.11624586929599191 1 +215 1 5.05077 0.925902367 0.11106802083275139 1 +217 0 -5.974533 0.0480044559 0.070973273947168333 0 +220 0 -5.974533 0.0480044559 0.070973273947168333 0 +221 1 4.69607544 0.912778139 0.13166385515487664 1 +222 1 -1.832093 0.285764128 1.8071032688954418 0 +224 1 4.82543755 0.917792 0.1237608284964886 1 +225 0 -5.974533 0.0480044559 0.070973273947168333 0 +227 1 4.34543848 0.8977728 0.15557772526296437 1 +229 1 4.952993 0.9224776 0.11641421080668345 1 +230 1 3.14041662 0.8278133 0.27262261958222528 1 +231 1 3.76383972 0.867831469 0.20451319397782594 1 +232 0 -0.00182669621 0.499771655 0.99934128486766483 0 +234 0 -5.20997143 0.0688182339 0.1028652864533212 0 +235 0 -0.859357953 0.394202977 0.72309360740781903 0 +236 1 4.437218 0.9019082 0.1489474673177292 1 +238 1 4.18336 0.8900919 0.16797380246926541 1 +243 0 -1.832093 0.285764128 0.48552750072742312 0 +245 0 -5.432625 0.0620176345 0.092367295239153435 0 +251 1 4.54024458 0.9063722 0.14182449967612121 1 +253 1 3.77061033 0.8682193 0.20386857508895609 1 +255 1 1.50728106 0.679971457 0.5564539079217623 1 +256 0 -5.974533 0.0480044559 0.070973273947168333 0 +261 1 4.691906 0.912612 0.13192643773024004 1 +263 1 4.66780043 0.911646 0.13345435924027338 1 +264 1 3.55159426 0.8551771 0.22570486636738665 1 +265 0 -4.762908 0.0845979 0.12752249409956656 0 +266 1 4.190417 0.8904366 0.16741521793084876 1 +270 1 4.16370153 0.8891266 0.16953924219013125 1 +273 1 -0.589163661 0.426882535 1.2280889551832246 0 +274 0 -5.974533 0.0480044559 0.070973273947168333 0 +281 0 -5.974533 0.0480044559 0.070973273947168333 0 +282 1 3.74070573 0.8664991 0.20672980075573399 1 +286 1 4.437218 0.9019082 0.1489474673177292 1 +287 0 -5.864908 0.05057236 0.074870047102428255 0 +289 1 3.833934 0.8717998 0.19793117810941421 1 +292 1 4.82543755 0.917792 0.1237608284964886 1 +294 0 -1.832093 0.285764128 0.48552750072742312 0 +295 1 4.541771 0.9064369 0.1417214699870501 1 +298 0 -4.9973526 0.0759510249 0.11395877757940477 0 +302 1 4.952993 0.9224776 0.11641421080668345 1 +305 1 3.67662883 0.8627492 0.21298683231853144 1 +306 0 -5.974533 0.0480044559 0.070973273947168333 0 +307 0 -5.974533 0.0480044559 0.070973273947168333 0 +310 0 -5.864908 0.05057236 0.074870047102428255 0 +313 0 -5.974533 0.0480044559 0.070973273947168333 0 +315 0 3.57622576 0.8566958 2.8028469119882984 1 +318 0 -5.12825155 0.07148322 0.10700010796555662 0 +320 1 4.9201827 0.9212963 0.118262878162882 1 +322 0 -5.974533 0.0480044559 0.070973273947168333 0 +324 0 -5.974533 0.0480044559 0.070973273947168333 0 +325 0 -4.74784231 0.08518308 0.12844504009491406 0 +326 1 -0.569087565 0.429340154 1.2198069880919129 0 +330 1 3.89335084 0.8750837 0.19250710531624327 1 +334 1 3.93655872 0.8774262 0.18865029730739294 1 +335 0 -5.974533 0.0480044559 0.070973273947168333 0 +337 0 -5.974533 0.0480044559 0.070973273947168333 0 +339 1 4.283956 0.8949168 0.16017457674585028 1 +340 1 4.889669 0.9201829 0.1200074736709852 1 +341 0 -5.974533 0.0480044559 0.070973273947168333 0 +342 0 -5.974533 0.0480044559 0.070973273947168333 0 +345 0 -5.974533 0.0480044559 0.070973273947168333 0 +351 0 -5.974533 0.0480044559 0.070973273947168333 0 +356 1 0.232216328 0.5289945 0.91867537055352333 1 +357 1 5.083561 0.927019358 0.10932862988856006 1 +359 1 3.440699 0.848173857 0.23756807946032787 1 +362 0 -4.251351 0.106626235 0.16266420602415232 0 +363 0 -0.0254919771 0.496813536 0.99083498057144959 0 +364 0 -5.974533 0.0480044559 0.070973273947168333 0 +365 0 -5.974533 0.0480044559 0.070973273947168333 0 +367 1 4.988552 0.923739552 0.1144419524293929 1 +369 0 -4.762908 0.0845979 0.12752249409956656 0 +372 0 -5.555257 0.058545135 0.087036163665638336 0 +374 0 -5.555257 0.058545135 0.087036163665638336 0 +375 0 -5.974533 0.0480044559 0.070973273947168333 0 +380 0 -5.974533 0.0480044559 0.070973273947168333 0 +382 0 -5.42435741 0.06225853 0.092737860790008786 0 +385 0 -4.64211941 0.08939376 0.13510074501301572 0 +386 1 4.95600557 0.922585249 0.11624586929599191 1 +390 0 -5.974533 0.0480044559 0.070973273947168333 0 +393 0 -5.974533 0.0480044559 0.070973273947168333 0 +394 0 -4.63200855 0.08980614 0.13575423986181803 0 +397 0 -5.974533 0.0480044559 0.070973273947168333 0 +400 1 4.284063 0.8949218 0.16016650532362478 1 +401 0 -5.974533 0.0480044559 0.070973273947168333 0 +402 0 -4.527248 0.0941807553 0.14270490423693205 0 +403 0 -4.46386 0.09691958 0.14707363043442426 0 +405 0 -5.974533 0.0480044559 0.070973273947168333 0 +407 0 -5.974533 0.0480044559 0.070973273947168333 0 +408 0 -1.47589576 0.323453039 0.56373801560043146 0 +410 0 -5.974533 0.0480044559 0.070973273947168333 0 +411 0 -1.832093 0.285764128 0.48552750072742312 0 +412 1 4.46344376 0.9030622 0.14710269663491421 1 +417 0 -5.974533 0.0480044559 0.070973273947168333 0 +420 0 -3.85605669 0.12696898 0.19589517889931171 0 +421 1 5.083561 0.927019358 0.10932862988856006 1 +424 0 -5.974533 0.0480044559 0.070973273947168333 0 +425 1 4.952993 0.9224776 0.11641421080668345 1 +426 0 -4.527248 0.0941807553 0.14270490423693205 0 +427 1 4.762418 0.9153831 0.1275524372463456 1 +431 0 -5.12825155 0.07148322 0.10700010796555662 0 +432 0 -5.974533 0.0480044559 0.070973273947168333 0 +433 0 -4.91943836 0.0787307 0.11830516058745956 0 +435 1 4.95600557 0.922585249 0.11624586929599191 1 +437 0 -5.974533 0.0480044559 0.070973273947168333 0 +438 0 -4.257989 0.106310487 0.16215439945172758 0 +443 0 -5.432625 0.0620176345 0.092367295239153435 0 +444 0 -5.864908 0.05057236 0.074870047102428255 0 +445 0 -5.974533 0.0480044559 0.070973273947168333 0 +446 0 -5.974533 0.0480044559 0.070973273947168333 0 +447 0 -5.974533 0.0480044559 0.070973273947168333 0 +448 0 -5.974533 0.0480044559 0.070973273947168333 0 +458 0 -5.555257 0.058545135 0.087036163665638336 0 +459 0 -4.762908 0.0845979 0.12752249409956656 0 +460 0 -5.974533 0.0480044559 0.070973273947168333 0 +461 0 -1.832093 0.285764128 0.48552750072742312 0 +462 0 -5.974533 0.0480044559 0.070973273947168333 0 +463 0 -5.974533 0.0480044559 0.070973273947168333 0 +468 0 -5.974533 0.0480044559 0.070973273947168333 0 +469 0 -5.555257 0.058545135 0.087036163665638336 0 +470 0 -5.974533 0.0480044559 0.070973273947168333 0 +471 0 -5.974533 0.0480044559 0.070973273947168333 0 +472 0 -5.974533 0.0480044559 0.070973273947168333 0 +473 0 -5.974533 0.0480044559 0.070973273947168333 0 +475 0 -5.974533 0.0480044559 0.070973273947168333 0 +476 0 -5.555257 0.058545135 0.087036163665638336 0 +477 0 -5.974533 0.0480044559 0.070973273947168333 0 +478 0 -5.84363365 0.0510855578 0.075650080730339395 0 +479 1 4.284063 0.8949218 0.16016650532362478 1 +481 0 -4.81467724 0.0826148 0.12440046487155368 0 +485 0 -4.91115141 0.0790317655 0.11877669824863878 0 +486 0 -5.974533 0.0480044559 0.070973273947168333 0 +488 1 1.81132364 0.7121116 0.48982475674007986 1 +490 0 -5.974533 0.0480044559 0.070973273947168333 0 +491 1 4.41421556 0.900886 0.15058354022546525 1 +494 0 -0.5405644 0.4328378 0.81816674711690196 0 +496 0 -5.974533 0.0480044559 0.070973273947168333 0 +498 0 -5.974533 0.0480044559 0.070973273947168333 0 +499 0 -5.974533 0.0480044559 0.070973273947168333 0 +500 0 -5.974533 0.0480044559 0.070973273947168333 0 +503 0 -5.974533 0.0480044559 0.070973273947168333 0 +505 0 -5.73887253 0.0536852852 0.07960803601171651 0 +506 1 4.33508968 0.8972969 0.15634265908188469 1 +508 0 -5.974533 0.0480044559 0.070973273947168333 0 +509 0 -5.974533 0.0480044559 0.070973273947168333 0 +511 0 -5.974533 0.0480044559 0.070973273947168333 0 +512 0 -5.974533 0.0480044559 0.070973273947168333 0 +515 1 4.603288 0.9090131 0.13762702117804301 1 +516 0 -5.974533 0.0480044559 0.070973273947168333 0 +518 0 -5.555257 0.058545135 0.087036163665638336 0 +524 0 -5.974533 0.0480044559 0.070973273947168333 0 +525 0 -5.974533 0.0480044559 0.070973273947168333 0 +526 0 -5.974533 0.0480044559 0.070973273947168333 0 +530 1 4.4572773 0.902792 0.14753449746593614 1 +536 0 -5.974533 0.0480044559 0.070973273947168333 0 +537 0 -5.555257 0.058545135 0.087036163665638336 0 +542 0 -5.73887253 0.0536852852 0.07960803601171651 0 +543 0 -5.974533 0.0480044559 0.070973273947168333 0 +545 0 -5.974533 0.0480044559 0.070973273947168333 0 +550 0 -5.974533 0.0480044559 0.070973273947168333 0 +551 0 -5.974533 0.0480044559 0.070973273947168333 0 +552 0 -4.406663 0.09945172 0.15112447237205598 0 +553 0 0.170345783 0.521280348 1.0627470642070393 1 +554 0 -5.974533 0.0480044559 0.070973273947168333 0 +555 0 -5.73887253 0.0536852852 0.07960803601171651 0 +556 0 -5.42435741 0.06225853 0.092737860790008786 0 +562 0 -5.974533 0.0480044559 0.070973273947168333 0 +564 0 -5.974533 0.0480044559 0.070973273947168333 0 +567 0 -4.91115141 0.0790317655 0.11877669824863878 0 +568 1 4.25844669 0.893711269 0.16211927936663173 1 +570 1 4.9201827 0.9212963 0.118262878162882 1 +571 1 4.82543755 0.917792 0.1237608284964886 1 +572 0 -5.974533 0.0480044559 0.070973273947168333 0 +573 0 -5.974533 0.0480044559 0.070973273947168333 0 +574 1 3.34847474 0.842139959 0.24786807316439324 1 +575 0 -5.555257 0.058545135 0.087036163665638336 0 +576 0 -5.974533 0.0480044559 0.070973273947168333 0 +579 0 -5.974533 0.0480044559 0.070973273947168333 0 +580 0 -5.555257 0.058545135 0.087036163665638336 0 +583 0 -5.974533 0.0480044559 0.070973273947168333 0 +585 0 -5.974533 0.0480044559 0.070973273947168333 0 +587 0 -5.974533 0.0480044559 0.070973273947168333 0 +588 1 4.46565771 0.9031591 0.14694796930059398 1 +589 0 -5.974533 0.0480044559 0.070973273947168333 0 +591 1 4.43419743 0.9017745 0.14916133923493161 1 +592 1 4.54024458 0.9063722 0.14182449967612121 1 +595 0 -5.974533 0.0480044559 0.070973273947168333 0 +596 0 -5.555257 0.058545135 0.087036163665638336 0 +597 0 -4.762908 0.0845979 0.12752249409956656 0 +598 0 -5.974533 0.0480044559 0.070973273947168333 0 +599 0 -4.63200855 0.08980614 0.13575423986181803 0 +601 0 -5.974533 0.0480044559 0.070973273947168333 0 +603 1 1.34133589 0.6616527 0.59585398095726827 1 +605 1 4.33287573 0.897194862 0.15650673578809424 1 +608 1 4.541771 0.9064369 0.1417214699870501 1 +610 1 4.54024458 0.9063722 0.14182449967612121 1 +611 1 3.312721 0.839748859 0.25197016397640781 1 +615 0 -4.762908 0.0845979 0.12752249409956656 0 +616 0 -5.974533 0.0480044559 0.070973273947168333 0 +620 0 -5.974533 0.0480044559 0.070973273947168333 0 +623 0 -5.974533 0.0480044559 0.070973273947168333 0 +625 0 -3.56294465 0.144121423 0.22452195867006242 0 +626 1 1.81517076 0.7125058 0.48902630146774384 1 +628 0 -5.974533 0.0480044559 0.070973273947168333 0 +630 0 -4.63200855 0.08980614 0.13575423986181803 0 +631 0 -5.974533 0.0480044559 0.070973273947168333 0 +632 0 -5.974533 0.0480044559 0.070973273947168333 0 +635 0 -4.762908 0.0845979 0.12752249409956656 0 +636 1 3.7019937 0.8642441 0.21048923959189306 1 +637 0 -4.1270895 0.112690896 0.17249132359801098 0 +640 0 -5.974533 0.0480044559 0.070973273947168333 0 +643 0 -5.974533 0.0480044559 0.070973273947168333 0 +646 0 -5.42435741 0.06225853 0.092737860790008786 0 +647 0 -5.974533 0.0480044559 0.070973273947168333 0 +648 1 4.327261 0.896935642 0.15692362438793947 1 +650 0 -4.354235 0.101824239 0.15493030597789326 0 +651 0 -5.84363365 0.0510855578 0.075650080730339395 0 +655 0 -5.974533 0.0480044559 0.070973273947168333 0 +658 1 4.95600557 0.922585249 0.11624586929599191 1 +659 0 -5.974533 0.0480044559 0.070973273947168333 0 +662 0 -4.762908 0.0845979 0.12752249409956656 0 +663 0 -4.762908 0.0845979 0.12752249409956656 0 +664 0 -5.974533 0.0480044559 0.070973273947168333 0 +666 0 -4.74688053 0.08522056 0.12850415454866093 0 +667 0 -5.974533 0.0480044559 0.070973273947168333 0 +669 1 4.512311 0.905180156 0.1437231373495434 1 +671 0 -5.84363365 0.0510855578 0.075650080730339395 0 +672 0 -5.974533 0.0480044559 0.070973273947168333 0 +673 0 -5.20997143 0.0688182339 0.1028652864533212 0 +674 0 -5.974533 0.0480044559 0.070973273947168333 0 +675 0 -4.762908 0.0845979 0.12752249409956656 0 +676 0 -5.555257 0.058545135 0.087036163665638336 0 +677 0 -5.974533 0.0480044559 0.070973273947168333 0 +684 0 -5.974533 0.0480044559 0.070973273947168333 0 +686 0 -5.974533 0.0480044559 0.070973273947168333 0 +687 0 -5.16711855 0.07020404 0.10501394052891096 0 +690 0 -5.974533 0.0480044559 0.070973273947168333 0 +695 0 -5.974533 0.0480044559 0.070973273947168333 0 diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-out.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-out.txt new file mode 100644 index 0000000000..ba50420a1d --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-out.txt @@ -0,0 +1,45 @@ +maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3448 (241.0/(241.0+458.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 240 | 1 | 0.9959 + negative || 8 | 450 | 0.9825 + ||====================== +Precision || 0.9677 | 0.9978 | +OVERALL 0/1 ACCURACY: 0.987124 +LOG LOSS/instance: 0.167803 +Test-set entropy (prior Log-Loss/instance): 0.929318 +LOG-LOSS REDUCTION (RIG): 81.943403 +AUC: 0.995765 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.995765 (0.0000) +Accuracy: 0.987124 (0.0000) +Positive precision: 0.967742 (0.0000) +Positive recall: 0.995851 (0.0000) +Negative precision: 0.997783 (0.0000) +Negative recall: 0.982533 (0.0000) +Log-loss: 0.167803 (0.0000) +Log-loss reduction: 81.943403 (0.0000) +F1 Score: 0.981595 (0.0000) +AUPRC: 0.986193 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-rp.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-rp.txt new file mode 100644 index 0000000000..77718de528 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.995765 0.987124 0.967742 0.995851 0.997783 0.982533 0.167803 81.94341 0.981595 0.986193 10 0.2 20 10 goss + 1 LightGBM %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:goss;/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss.txt b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss.txt new file mode 100644 index 0000000000..c5643a9c46 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -6.12573862 0.04466511 0.065921539368278048 0 +1 0 0.7871392 0.5971417 1.3116555550127289 1 +2 0 -5.88718367 0.0500402562 0.074061716914150894 0 +3 0 -0.0538624227 0.4932676 0.98070400644517874 0 +4 0 -5.88278341 0.0501449443 0.074220714532658688 0 +5 1 4.913594 0.921057045 0.11863758281262027 1 +6 0 -2.57204 0.216527224 0.35204494911913131 0 +7 0 -6.12573862 0.04466511 0.065921539368278048 0 +8 0 -6.12573862 0.04466511 0.065921539368278048 0 +9 0 -6.12573862 0.04466511 0.065921539368278048 0 +10 0 -6.12573862 0.04466511 0.065921539368278048 0 +11 0 -6.12573862 0.04466511 0.065921539368278048 0 +12 1 0.9067417 0.611440361 0.70971630871106062 1 +13 0 -5.275919 0.06673501 0.09964131392293657 0 +14 1 4.913594 0.921057045 0.11863758281262027 1 +15 1 0.8682936 0.606863439 0.72055618783458208 1 +16 0 -6.12573862 0.04466511 0.065921539368278048 0 +17 0 -6.12573862 0.04466511 0.065921539368278048 0 +18 1 4.694235 0.9127048 0.13177973608325938 1 +19 0 -4.45841932 0.09715795 0.14745447741632708 0 +20 1 2.096338 0.740423143 0.43357810562202381 1 +21 1 4.986593 0.92367053 0.11454975519156474 1 +22 0 -6.12573862 0.04466511 0.065921539368278048 0 +23 1 4.37396049 0.8990742 0.15348791467520745 1 +24 0 -6.12573862 0.04466511 0.065921539368278048 0 +25 1 1.11781752 0.6362 0.65244769857228824 1 +26 0 -6.12573862 0.04466511 0.065921539368278048 0 +27 0 -6.12573862 0.04466511 0.065921539368278048 0 +28 0 -6.12573862 0.04466511 0.065921539368278048 0 +29 0 -5.904324 0.0496344268 0.073445519186050218 0 +30 0 -6.12573862 0.04466511 0.065921539368278048 0 +31 0 -6.12573862 0.04466511 0.065921539368278048 0 +32 1 4.85804653 0.919013858 0.12184147876101566 1 +33 0 -6.12573862 0.04466511 0.065921539368278048 0 +34 0 -6.12573862 0.04466511 0.065921539368278048 0 +35 0 -6.12573862 0.04466511 0.065921539368278048 0 +36 1 4.85834026 0.9190248 0.12182426214416593 1 +37 0 -2.82574654 0.195781261 0.31434014181474312 0 +38 1 3.79839039 0.8698004 0.20124374118024355 1 +39 1 3.604104 0.858398557 0.2202804445036696 1 +40 0 4.94449 0.922173 3.6835858737000455 1 +41 1 4.08736324 0.8853076 0.17574927204930149 1 +42 1 4.084668 0.8851707 0.17597240053835977 1 +43 1 3.17567873 0.8303119 0.26827472950514092 1 +44 1 4.86881256 0.9194136 0.12121404707413413 1 +45 0 -6.12573862 0.04466511 0.065921539368278048 0 +46 1 2.78956151 0.801354349 0.31948776984346594 1 +47 0 -6.12573862 0.04466511 0.065921539368278048 0 +48 0 -5.88278341 0.0501449443 0.074220714532658688 0 +49 1 4.470567 0.903373539 0.14660543821458613 1 +50 1 2.70828986 0.7948064 0.331324567514511 1 +51 1 1.4053 0.668775 0.5804071294460843 1 +52 1 4.20677 0.8912317 0.16612752105266257 1 +53 1 4.77000046 0.9156763 0.12709041910070321 1 +54 1 4.611467 0.909350753 0.13709121986917477 1 +55 1 4.7640996 0.915448248 0.12744976419697612 1 +56 1 3.86125278 0.873318732 0.19541981005507014 1 +57 1 2.523603 0.7793361 0.35968245875358495 1 +58 1 2.48702025 0.7761744 0.36554719587520546 1 +59 1 1.97529042 0.728622556 0.45675643807174765 1 +60 1 3.22504544 0.833761334 0.2622936259972814 1 +61 0 -5.88718367 0.0500402562 0.074061716914150894 0 +62 1 4.39070368 0.899831355 0.15227345639462678 1 +63 1 0.434102565 0.5540508 0.85190982593788134 1 +64 0 -6.12573862 0.04466511 0.065921539368278048 0 +65 1 1.88134885 0.7192359 0.47546306732739252 1 +66 0 -6.12573862 0.04466511 0.065921539368278048 0 +67 1 3.43093181 0.8475439 0.23864000591652512 1 +68 1 4.617587 0.9096027 0.13669155561825619 1 +69 0 -6.12573862 0.04466511 0.065921539368278048 0 +70 0 -5.509922 0.05980708 0.088971279531383576 0 +71 1 1.8125602 0.7122384 0.48956793284940486 1 +72 0 -2.97863269 0.184024364 0.29340201866481563 0 +73 1 4.907225 0.920825243 0.11900071162759861 1 +74 1 3.884019 0.874572754 0.19334969091898527 1 +75 0 -5.20182657 0.06907967 0.10327038637237132 0 +76 0 -5.904324 0.0496344268 0.073445519186050218 0 +77 0 -5.17382336 0.0699855238 0.10467492216060112 0 +78 0 -5.275919 0.06673501 0.09964131392293657 0 +79 0 -6.048977 0.04633175 0.068440605343774177 0 +80 0 -4.493066 0.09564895 0.14504519266029128 0 +81 0 -6.12573862 0.04466511 0.065921539368278048 0 +82 0 -6.12573862 0.04466511 0.065921539368278048 0 +83 0 -4.254511 0.106475823 0.16242132801183079 0 +84 1 4.55594158 0.907036066 0.14076817777784198 1 +85 1 1.725657 0.703251243 0.50788789811799706 1 +86 1 2.55038524 0.781630337 0.35544163150392882 1 +87 1 4.55594158 0.907036066 0.14076817777784198 1 +88 0 -6.12573862 0.04466511 0.065921539368278048 0 +89 0 -6.048977 0.04633175 0.068440605343774177 0 +90 0 -6.12573862 0.04466511 0.065921539368278048 0 +91 0 -6.12573862 0.04466511 0.065921539368278048 0 +92 0 -6.12573862 0.04466511 0.065921539368278048 0 +93 0 -6.12573862 0.04466511 0.065921539368278048 0 +94 0 -6.12573862 0.04466511 0.065921539368278048 0 +95 0 -6.12573862 0.04466511 0.065921539368278048 0 +96 0 -6.12573862 0.04466511 0.065921539368278048 0 +97 0 -6.12573862 0.04466511 0.065921539368278048 0 +98 1 4.260588 0.8938129 0.16195523659395877 1 +99 1 4.96492338 0.9229031 0.11574888242720581 1 +100 1 4.80958557 0.917192042 0.12470425762982235 1 +101 1 0.5993819 0.574367 0.79995526602333489 1 +102 0 -6.12573862 0.04466511 0.065921539368278048 0 +103 1 1.68038464 0.6985057 0.51765620716822192 1 +104 1 4.7297945 0.9141111 0.12955861053021853 1 +105 1 3.71265173 0.8648681 0.20944796162171331 1 +106 1 4.72994661 0.914117038 0.12954920346283152 1 +107 1 4.55594158 0.907036066 0.14076817777784198 1 +108 0 -4.562707 0.0926790759 0.14031516516923384 0 +109 1 4.084668 0.8851707 0.17597240053835977 1 +110 0 -2.311099 0.2394769 0.39493603420278445 0 +111 1 4.55957127 0.907189 0.14052492930299665 1 +112 1 4.94610071 0.92223084 0.11680018409240302 1 +113 1 4.621939 0.909781456 0.13640806630159577 1 +114 0 -3.25624061 0.164088026 0.25857706754711179 0 +115 0 -3.30130816 0.161020562 0.25329264195172102 0 +116 0 -2.00872159 0.2680849 0.45025181165130657 0 +117 1 4.96379662 0.922863066 0.11581149726012986 1 +118 0 -5.47729063 0.06073113 0.090389902282158971 0 +119 0 -5.323412 0.06527118 0.097380212869344535 0 +120 0 -6.12573862 0.04466511 0.065921539368278048 0 +121 0 -5.323412 0.06527118 0.097380212869344535 0 +122 1 4.9408145 0.922041059 0.11709709951078236 1 +123 1 4.1693 0.8894023 0.1690920075230945 1 +124 1 4.048633 0.8833266 0.17898115446692364 1 +125 0 -6.12573862 0.04466511 0.065921539368278048 0 +126 1 4.687142 0.9124219 0.13222704839686869 1 +127 0 -6.12573862 0.04466511 0.065921539368278048 0 +128 1 3.9906776 0.88030684 0.18392161738135088 1 +129 0 -5.39437771 0.06313944 0.094093756062156753 0 +130 0 -5.509922 0.05980708 0.088971279531383576 0 +131 0 -6.12573862 0.04466511 0.065921539368278048 0 +132 1 3.632753 0.8601308 0.21737204988666808 1 +133 0 -6.12573862 0.04466511 0.065921539368278048 0 +134 0 -6.048977 0.04633175 0.068440605343774177 0 +135 0 -3.97436738 0.120555133 0.18533495728267063 0 +136 0 -6.12573862 0.04466511 0.065921539368278048 0 +137 0 -6.12573862 0.04466511 0.065921539368278048 0 +138 0 -6.12573862 0.04466511 0.065921539368278048 0 +139 0 -2.57204 0.216527224 0.35204494911913131 0 +140 0 -6.12573862 0.04466511 0.065921539368278048 0 +141 0 -6.12573862 0.04466511 0.065921539368278048 0 +142 1 4.41024256 0.900708437 0.15086791961091048 1 +143 0 -3.30130816 0.161020562 0.25329264195172102 0 +144 0 -6.12573862 0.04466511 0.065921539368278048 0 +145 0 -2.77348518 0.1999283 0.32179879660040939 0 +146 1 0.494813681 0.56153816 0.83254402924853765 1 +147 0 -5.810422 0.0518965647 0.076883633329030782 0 +148 0 -1.96937633 0.271962553 0.45791543727549477 0 +149 1 4.924066 0.921436965 0.11804261890737246 1 +150 0 -6.12573862 0.04466511 0.065921539368278048 0 +151 1 3.76944828 0.8681528 0.20397911167094482 1 +152 1 4.97612047 0.923300564 0.11512772651515453 1 +153 0 -4.595947 0.09129094 0.13810963729887868 0 +154 0 -6.12573862 0.04466511 0.065921539368278048 0 +155 1 3.7969203 0.8697171 0.20138185980340564 1 +156 0 -6.12573862 0.04466511 0.065921539368278048 0 +157 0 -6.12573862 0.04466511 0.065921539368278048 0 +158 0 -3.50268 0.147878259 0.23086853534747812 0 +159 1 4.941812 0.9220769 0.11704105018174046 1 +160 1 4.9408145 0.922041059 0.11709709951078236 1 +161 0 -6.12573862 0.04466511 0.065921539368278048 0 +162 0 -6.12573862 0.04466511 0.065921539368278048 0 +163 0 -5.275919 0.06673501 0.09964131392293657 0 +164 0 -1.28979349 0.34414047 0.60854123905801871 0 +165 0 -5.88718367 0.0500402562 0.074061716914150894 0 +166 1 3.69228983 0.863673866 0.21144145961034241 1 +167 1 4.012953 0.8814754 0.18200780515801596 1 +168 0 -6.12573862 0.04466511 0.065921539368278048 0 +169 0 -6.12573862 0.04466511 0.065921539368278048 0 +170 0 -6.12573862 0.04466511 0.065921539368278048 0 +171 0 -6.12573862 0.04466511 0.065921539368278048 0 +172 0 -6.12573862 0.04466511 0.065921539368278048 0 +173 1 5.004027 0.924282849 0.11359368245893879 1 +174 1 4.265131 0.8940283 0.1616075853020332 1 +175 1 4.94449 0.922173 0.11689063238018986 1 +176 0 -6.12573862 0.04466511 0.065921539368278048 0 +177 1 4.535296 0.906161964 0.14215915974923193 1 +178 0 -6.12573862 0.04466511 0.065921539368278048 0 +179 1 1.33880115 0.6613689 0.59647287441982744 1 +180 0 -6.12573862 0.04466511 0.065921539368278048 0 +181 0 -6.12573862 0.04466511 0.065921539368278048 0 +182 0 -4.45841932 0.09715795 0.14745447741632708 0 +183 1 4.94449 0.922173 0.11689063238018986 1 +184 1 4.265131 0.8940283 0.1616075853020332 1 +185 0 -6.12573862 0.04466511 0.065921539368278048 0 +186 1 4.5090003 0.905038 0.14394972806289524 1 +187 1 4.930342 0.9216638 0.1176874750230081 1 +188 1 4.586454 0.9083145 0.13873614247612856 1 +189 0 -5.299038 0.06601866 0.098534373417999532 0 +190 1 4.97612047 0.923300564 0.11512772651515453 1 +191 1 4.96466732 0.922894 0.11576313824398836 1 +192 0 -6.12573862 0.04466511 0.065921539368278048 0 +193 0 -6.12573862 0.04466511 0.065921539368278048 0 +194 0 -6.12573862 0.04466511 0.065921539368278048 0 +195 0 -6.12573862 0.04466511 0.065921539368278048 0 +196 0 2.62998962 0.7883478 2.2402324786627403 1 +197 0 -5.88278341 0.0501449443 0.074220714532658688 0 +198 0 -6.12573862 0.04466511 0.065921539368278048 0 +199 0 -6.12573862 0.04466511 0.065921539368278048 0 +200 1 4.9408145 0.922041059 0.11709709951078236 1 +201 1 4.70470667 0.9131211 0.13112188210334919 1 +202 0 -6.12573862 0.04466511 0.065921539368278048 0 +203 0 -6.12573862 0.04466511 0.065921539368278048 0 +204 0 -6.12573862 0.04466511 0.065921539368278048 0 +205 1 5.004027 0.924282849 0.11359368245893879 1 +206 1 5.00101566 0.9241774 0.11375827204562068 1 +207 0 -6.12573862 0.04466511 0.065921539368278048 0 +208 0 -6.12573862 0.04466511 0.065921539368278048 0 +209 0 -6.12573862 0.04466511 0.065921539368278048 0 +210 1 4.91459131 0.921093345 0.1185807267410698 1 +211 1 4.554042 0.906955957 0.14089560098583823 1 +212 0 -6.12573862 0.04466511 0.065921539368278048 0 +213 1 4.93133974 0.9216998 0.11763112286398286 1 +214 1 4.930342 0.9216638 0.1176874750230081 1 +215 1 4.959372 0.9227054 0.11605797639002108 1 +216 0 -6.12573862 0.04466511 0.065921539368278048 0 +217 0 -6.12573862 0.04466511 0.065921539368278048 0 +218 1 4.95708561 0.9226238 0.11618556568194083 1 +219 0 -4.72126245 0.0862244442 0.13008824504508865 0 +220 0 -6.12573862 0.04466511 0.065921539368278048 0 +221 1 4.941812 0.9220769 0.11704105018174046 1 +222 1 -2.26988316 0.24325031 2.0394864488016866 0 +223 1 4.46880245 0.9032965 0.14672852298737726 1 +224 1 4.93133974 0.9216998 0.11763112286398286 1 +225 0 -6.12573862 0.04466511 0.065921539368278048 0 +226 1 4.79576874 0.916665852 0.12553216413691681 1 +227 1 4.418471 0.9010758 0.15027965322376918 1 +228 0 -6.12573862 0.04466511 0.065921539368278048 0 +229 1 4.941812 0.9220769 0.11704105018174046 1 +230 1 3.05095315 0.821343541 0.28394231449164004 1 +231 1 4.55036926 0.906800866 0.14114232582393552 1 +232 0 -1.2109406 0.353093177 0.62837016596481299 0 +233 1 4.89690256 0.9204481 0.11959167995771566 1 +234 0 -5.339473 0.06478294 0.096626847259604867 0 +235 0 -2.31735182 0.238907963 0.3938571690946614 0 +236 1 4.9908905 0.9238219 0.11431330717108838 1 +237 1 4.91474152 0.921098769 0.11857223119865881 1 +238 1 4.974793 0.923253536 0.115201211668675 1 +239 1 4.72157764 0.913787961 0.13006865946632085 1 +240 0 -3.35855079 0.15719144 0.24672312869277493 0 +241 0 -6.138525 0.0443931036 0.065510829404308496 0 +242 0 -6.12573862 0.04466511 0.065921539368278048 0 +243 0 -2.38702083 0.232631683 0.38200889517336939 0 +244 0 -6.12573862 0.04466511 0.065921539368278048 0 +245 0 -5.88718367 0.0500402562 0.074061716914150894 0 +246 1 4.913594 0.921057045 0.11863758281262027 1 +247 1 4.17664766 0.8897631 0.1685067988684536 1 +248 0 -4.60795736 0.09079398 0.13732086179158925 0 +249 0 -2.57204 0.216527224 0.35204494911913131 0 +250 0 -6.12573862 0.04466511 0.065921539368278048 0 +251 1 4.83239174 0.918054 0.12334910346462673 1 +252 0 1.71953213 0.7026118 1.7495807101818632 1 +253 1 4.084668 0.8851707 0.17597240053835977 1 +254 1 4.39070368 0.899831355 0.15227345639462678 1 +255 1 0.69604063 0.5861374 0.77068916535044074 1 +256 0 -6.12573862 0.04466511 0.065921539368278048 0 +257 0 -6.12573862 0.04466511 0.065921539368278048 0 +258 0 -6.12573862 0.04466511 0.065921539368278048 0 +259 0 -0.0538624227 0.4932676 0.98070400644517874 0 +260 1 4.694235 0.9127048 0.13177973608325938 1 +261 1 4.94449 0.922173 0.11689063238018986 1 +262 1 4.924066 0.921436965 0.11804261890737246 1 +263 1 4.857149 0.9189805 0.12189387842436103 1 +264 1 4.510526 0.905103564 0.14384521639383285 1 +265 0 -5.05378866 0.07399416 0.11090680232251976 0 +266 1 4.753974 0.9150555 0.12806882531424363 1 +267 1 3.714267 0.864962459 0.20929057711111543 1 +268 1 4.712003 0.913410068 0.13066540377370875 1 +269 0 -6.12573862 0.04466511 0.065921539368278048 0 +270 1 4.524699 0.905710459 0.14287817759559546 1 +271 0 -6.12573862 0.04466511 0.065921539368278048 0 +272 1 3.714267 0.864962459 0.20929057711111543 1 +273 1 1.93753254 0.724873543 0.46419876197875504 1 +274 0 -6.12573862 0.04466511 0.065921539368278048 0 +275 0 -2.77348518 0.1999283 0.32179879660040939 0 +276 0 -6.12573862 0.04466511 0.065921539368278048 0 +277 0 -6.12573862 0.04466511 0.065921539368278048 0 +278 0 -6.12573862 0.04466511 0.065921539368278048 0 +279 1 4.7640996 0.915448248 0.12744976419697612 1 +280 0 -6.12573862 0.04466511 0.065921539368278048 0 +281 0 -6.12573862 0.04466511 0.065921539368278048 0 +282 1 3.4345994 0.8477807 0.23823696388172805 1 +283 1 4.836411 0.9182051 0.1231116772600446 1 +284 1 4.172628 0.8895658 0.16882672991838824 1 +285 1 4.913594 0.921057045 0.11863758281262027 1 +286 1 4.98141575 0.923487842 0.11483512694662856 1 +287 0 -6.048977 0.04633175 0.068440605343774177 0 +288 1 1.19110167 0.644637764 0.63343938955122503 1 +289 1 4.28883457 0.895145953 0.15980516326846522 1 +290 0 -6.12573862 0.04466511 0.065921539368278048 0 +291 0 -6.12573862 0.04466511 0.065921539368278048 0 +292 1 3.92763638 0.876945555 0.18944081854187686 1 +293 1 3.735207 0.8661807 0.20726003796861786 1 +294 0 -2.57204 0.216527224 0.35204494911913131 0 +295 1 4.94449 0.922173 0.11689063238018986 1 +296 0 0.9474534 0.6162654 1.3818193020414293 1 +297 0 -0.297049969 0.462936848 0.89683635464607525 0 +298 0 -3.72705865 0.134292215 0.20804796188805913 0 +299 1 1.73907173 0.7046491 0.5050231083614678 1 +300 1 4.04607964 0.883195 0.17919611798596427 1 +301 0 -6.12573862 0.04466511 0.065921539368278048 0 +302 1 4.93133974 0.9216998 0.11763112286398286 1 +303 0 -6.12573862 0.04466511 0.065921539368278048 0 +304 1 4.444847 0.902245164 0.1484085896669089 1 +305 1 4.765097 0.9154868 0.127388990454916 1 +306 0 -6.12573862 0.04466511 0.065921539368278048 0 +307 0 -6.12573862 0.04466511 0.065921539368278048 0 +308 1 4.604374 0.909058 0.13755579022428499 1 +309 0 -2.38702083 0.232631683 0.38200889517336939 0 +310 0 -6.048977 0.04633175 0.068440605343774177 0 +311 0 -6.12573862 0.04466511 0.065921539368278048 0 +312 1 4.87276363 0.919559836 0.1209846400424181 1 +313 0 -6.12573862 0.04466511 0.065921539368278048 0 +314 0 -6.12573862 0.04466511 0.065921539368278048 0 +315 0 4.700209 0.9129425 3.5218880744447407 1 +316 1 2.01076746 0.732115746 0.44985634211263337 1 +317 1 4.95708561 0.9226238 0.11618556568194083 1 +318 0 -5.39437771 0.06313944 0.094093756062156753 0 +319 0 0.786699057 0.597088754 1.3114660211791722 1 +320 1 4.97439766 0.9232395 0.1152230996051703 1 +321 0 -2.57204 0.216527224 0.35204494911913131 0 +322 0 -6.12573862 0.04466511 0.065921539368278048 0 +323 1 3.80140662 0.8699711 0.20096062450784979 1 +324 0 -6.12573862 0.04466511 0.065921539368278048 0 +325 0 -4.562707 0.0926790759 0.14031516516923384 0 +326 1 1.71431434 0.702066362 0.51032068905122763 1 +327 0 -6.12573862 0.04466511 0.065921539368278048 0 +328 1 4.06503344 0.8841691 0.17760577631727736 1 +329 1 4.72798443 0.914039969 0.12967084157529202 1 +330 1 4.55366468 0.906940043 0.14092091631139811 1 +331 0 -6.12573862 0.04466511 0.065921539368278048 0 +332 0 -6.12573862 0.04466511 0.065921539368278048 0 +333 1 3.59794188 0.858023643 0.22091069205640057 1 +334 1 4.470567 0.903373539 0.14660543821458613 1 +335 0 -6.12573862 0.04466511 0.065921539368278048 0 +336 1 3.632753 0.8601308 0.21737204988666808 1 +337 0 -6.12573862 0.04466511 0.065921539368278048 0 +338 0 -6.12573862 0.04466511 0.065921539368278048 0 +339 1 4.496154 0.9044845 0.14483229843008744 1 +340 1 4.95012 0.922374845 0.11657492723188825 1 +341 0 -6.12573862 0.04466511 0.065921539368278048 0 +342 0 -6.12573862 0.04466511 0.065921539368278048 0 +343 0 -6.12573862 0.04466511 0.065921539368278048 0 +344 1 4.96392536 0.9228676 0.11580441568439821 1 +345 0 -6.12573862 0.04466511 0.065921539368278048 0 +346 0 -4.136161 0.112238161 0.17175540047562393 0 +347 0 -4.562707 0.0926790759 0.14031516516923384 0 +348 1 0.0302184261 0.5037772 0.98914224795497152 1 +349 1 1.7592566 0.7067452 0.50073790022523745 1 +350 0 -5.88278341 0.0501449443 0.074220714532658688 0 +351 0 -6.12573862 0.04466511 0.065921539368278048 0 +352 0 -0.158508077 0.480196863 0.94396275556539111 0 +353 1 4.232817 0.8924878 0.16409560801765349 1 +354 0 -6.12573862 0.04466511 0.065921539368278048 0 +355 0 -6.048977 0.04633175 0.068440605343774177 0 +356 1 0.3901928 0.54862 0.86612091606133979 1 +357 1 4.913594 0.921057045 0.11863758281262027 1 +358 1 4.75895643 0.915249 0.1277638183136432 1 +359 1 4.357246 0.898313344 0.15470933110328511 1 +360 1 5.004027 0.924282849 0.11359368245893879 1 +361 1 3.29583049 0.8386091 0.25392961055221525 1 +362 0 -4.913519 0.0789456442 0.11864179575930466 0 +363 0 -1.14827621 0.36028254 0.64449323590393592 0 +364 0 -6.12573862 0.04466511 0.065921539368278048 0 +365 0 -6.12573862 0.04466511 0.065921539368278048 0 +366 1 5.004027 0.924282849 0.11359368245893879 1 +367 1 5.004027 0.924282849 0.11359368245893879 1 +368 0 -5.904324 0.0496344268 0.073445519186050218 0 +369 0 -5.904324 0.0496344268 0.073445519186050218 0 +370 0 -5.09706163 0.07252525 0.10862008599631576 0 +371 0 -5.904324 0.0496344268 0.073445519186050218 0 +372 0 -6.12573862 0.04466511 0.065921539368278048 0 +373 0 -6.12573862 0.04466511 0.065921539368278048 0 +374 0 -6.12573862 0.04466511 0.065921539368278048 0 +375 0 -6.12573862 0.04466511 0.065921539368278048 0 +376 0 -6.12573862 0.04466511 0.065921539368278048 0 +377 0 -6.12573862 0.04466511 0.065921539368278048 0 +378 0 -6.061764 0.04605007 0.068014552045070065 0 +379 0 -1.48199821 0.3227857 0.56231566885586359 0 +380 0 -6.12573862 0.04466511 0.065921539368278048 0 +381 1 4.930342 0.9216638 0.1176874750230081 1 +382 0 -6.12573862 0.04466511 0.065921539368278048 0 +383 0 -6.12573862 0.04466511 0.065921539368278048 0 +384 0 -6.12573862 0.04466511 0.065921539368278048 0 +385 0 -5.8586874 0.0507219173 0.075097320852640426 0 +386 1 4.30084324 0.895708144 0.15889937176960803 1 +387 0 -3.57571173 0.1433358 0.22319830268588145 0 +388 0 -6.12573862 0.04466511 0.065921539368278048 0 +389 0 -5.810422 0.0518965647 0.076883633329030782 0 +390 0 -6.12573862 0.04466511 0.065921539368278048 0 +391 1 4.79576874 0.916665852 0.12553216413691681 1 +392 0 -6.12573862 0.04466511 0.065921539368278048 0 +393 0 -6.12573862 0.04466511 0.065921539368278048 0 +394 0 -5.7551713 0.0532727726 0.078979280952392372 0 +395 0 -6.12573862 0.04466511 0.065921539368278048 0 +396 0 -6.12573862 0.04466511 0.065921539368278048 0 +397 0 -6.12573862 0.04466511 0.065921539368278048 0 +398 0 -6.12573862 0.04466511 0.065921539368278048 0 +399 0 -5.7551713 0.0532727726 0.078979280952392372 0 +400 1 4.55594158 0.907036066 0.14076817777784198 1 +401 0 -6.12573862 0.04466511 0.065921539368278048 0 +402 0 -4.108607 0.11361827 0.17399994914914052 0 +403 0 -4.666031 0.0884253 0.13356721214019227 0 +404 0 -6.138525 0.0443931036 0.065510829404308496 0 +405 0 -6.12573862 0.04466511 0.065921539368278048 0 +406 0 -6.12573862 0.04466511 0.065921539368278048 0 +407 0 -6.12573862 0.04466511 0.065921539368278048 0 +408 0 -3.51567078 0.147061646 0.2294866201318366 0 +409 0 -6.12573862 0.04466511 0.065921539368278048 0 +410 0 -6.12573862 0.04466511 0.065921539368278048 0 +411 0 -2.57204 0.216527224 0.35204494911913131 0 +412 1 4.847574 0.918623269 0.12245476759364576 1 +413 0 -6.12573862 0.04466511 0.065921539368278048 0 +414 1 4.50123835 0.9047039 0.14448238012860362 1 +415 0 -2.93420863 0.187383145 0.29935280632471489 0 +416 1 4.68795824 0.9124545 0.13217549722788033 1 +417 0 -6.12573862 0.04466511 0.065921539368278048 0 +418 0 -5.323412 0.06527118 0.097380212869344535 0 +419 0 -5.204088 0.06900698 0.10315774265429886 0 +420 0 -4.95155 0.0775739849 0.11649489306178905 0 +421 1 4.694235 0.9127048 0.13177973608325938 1 +422 0 -3.17850876 0.169488832 0.26792852706287573 0 +423 0 -5.509922 0.05980708 0.088971279531383576 0 +424 0 -6.12573862 0.04466511 0.065921539368278048 0 +425 1 4.93133974 0.9216998 0.11763112286398286 1 +426 0 -3.28017831 0.162452936 0.25575783357248416 0 +427 1 4.68605328 0.9123784 0.13229584898748298 1 +428 0 -6.12573862 0.04466511 0.065921539368278048 0 +429 0 -6.12573862 0.04466511 0.065921539368278048 0 +430 0 -5.93544865 0.0489054658 0.072339349687159854 0 +431 0 -5.1514225 0.07071806 0.10581172066639448 0 +432 0 -6.12573862 0.04466511 0.065921539368278048 0 +433 0 -6.138525 0.0443931036 0.065510829404308496 0 +434 0 2.60647821 0.786379635 2.2268789075895756 1 +435 1 4.214894 0.891624868 0.16549124015720693 1 +436 1 3.39190745 0.8450055 0.24296734230693379 1 +437 0 -6.12573862 0.04466511 0.065921539368278048 0 +438 0 -5.904324 0.0496344268 0.073445519186050218 0 +439 0 -6.12573862 0.04466511 0.065921539368278048 0 +440 1 4.57899952 0.9080037 0.13922993785081683 1 +441 0 -2.695176 0.206264988 0.3332706493409231 0 +442 0 -5.28870535 0.0663379356 0.099027628756686789 0 +443 0 -5.88718367 0.0500402562 0.074061716914150894 0 +444 0 -5.80602169 0.0520049259 0.077048532176877474 0 +445 0 -6.12573862 0.04466511 0.065921539368278048 0 +446 0 -6.12573862 0.04466511 0.065921539368278048 0 +447 0 -6.12573862 0.04466511 0.065921539368278048 0 +448 0 -6.12573862 0.04466511 0.065921539368278048 0 +449 1 5.004027 0.924282849 0.11359368245893879 1 +450 0 -5.88278341 0.0501449443 0.074220714532658688 0 +451 0 -6.12573862 0.04466511 0.065921539368278048 0 +452 0 -6.138525 0.0443931036 0.065510829404308496 0 +453 1 4.96379662 0.922863066 0.11581149726012986 1 +454 0 -5.8586874 0.0507219173 0.075097320852640426 0 +455 1 0.596782267 0.5740492 0.80075376707941792 1 +456 1 4.930342 0.9216638 0.1176874750230081 1 +457 1 4.959372 0.9227054 0.11605797639002108 1 +458 0 -6.12573862 0.04466511 0.065921539368278048 0 +459 0 -5.509922 0.05980708 0.088971279531383576 0 +460 0 -5.88278341 0.0501449443 0.074220714532658688 0 +461 0 -3.30130816 0.161020562 0.25329264195172102 0 +462 0 -4.45841932 0.09715795 0.14745447741632708 0 +463 0 -6.12573862 0.04466511 0.065921539368278048 0 +464 0 -6.12573862 0.04466511 0.065921539368278048 0 +465 1 4.97612047 0.923300564 0.11512772651515453 1 +466 1 4.79477072 0.9166277 0.1255922030194721 1 +467 1 4.53777361 0.9062673 0.1419914879107112 1 +468 0 -6.12573862 0.04466511 0.065921539368278048 0 +469 0 -6.12573862 0.04466511 0.065921539368278048 0 +470 0 -6.12573862 0.04466511 0.065921539368278048 0 +471 0 -4.45841932 0.09715795 0.14745447741632708 0 +472 0 -4.45841932 0.09715795 0.14745447741632708 0 +473 0 -6.12573862 0.04466511 0.065921539368278048 0 +474 0 -6.12573862 0.04466511 0.065921539368278048 0 +475 0 -6.12573862 0.04466511 0.065921539368278048 0 +476 0 -6.12573862 0.04466511 0.065921539368278048 0 +477 0 -6.12573862 0.04466511 0.065921539368278048 0 +478 0 -6.12573862 0.04466511 0.065921539368278048 0 +479 1 4.96379662 0.922863066 0.11581149726012986 1 +480 0 -6.12573862 0.04466511 0.065921539368278048 0 +481 0 -4.930868 0.07831719 0.11765774758534032 0 +482 1 4.97612047 0.923300564 0.11512772651515453 1 +483 1 4.92506361 0.9214731 0.11798606623603609 1 +484 0 -6.12573862 0.04466511 0.065921539368278048 0 +485 0 -5.28870535 0.0663379356 0.099027628756686789 0 +486 0 -6.12573862 0.04466511 0.065921539368278048 0 +487 1 4.694235 0.9127048 0.13177973608325938 1 +488 1 2.97813416 0.815938234 0.29346814906261504 1 +489 1 1.70382535 0.7009682 0.51257908601392099 1 +490 0 -6.12573862 0.04466511 0.065921539368278048 0 +491 1 4.309873 0.8961292 0.15822136074451454 1 +492 0 -6.12573862 0.04466511 0.065921539368278048 0 +493 1 4.94449 0.922173 0.11689063238018986 1 +494 0 -1.86898077 0.2820146 0.47797360412088818 0 +495 0 -6.12573862 0.04466511 0.065921539368278048 0 +496 0 -6.12573862 0.04466511 0.065921539368278048 0 +497 0 -6.12573862 0.04466511 0.065921539368278048 0 +498 0 -6.12573862 0.04466511 0.065921539368278048 0 +499 0 -6.12573862 0.04466511 0.065921539368278048 0 +500 0 -4.45841932 0.09715795 0.14745447741632708 0 +501 0 -6.12573862 0.04466511 0.065921539368278048 0 +502 0 -6.12573862 0.04466511 0.065921539368278048 0 +503 0 -6.12573862 0.04466511 0.065921539368278048 0 +504 0 -6.12573862 0.04466511 0.065921539368278048 0 +505 0 -5.93544865 0.0489054658 0.072339349687159854 0 +506 1 4.61993837 0.9096993 0.13653831889677209 1 +507 0 -4.666031 0.0884253 0.13356721214019227 0 +508 0 -6.12573862 0.04466511 0.065921539368278048 0 +509 0 -6.12573862 0.04466511 0.065921539368278048 0 +510 0 -6.12573862 0.04466511 0.065921539368278048 0 +511 0 -6.12573862 0.04466511 0.065921539368278048 0 +512 0 -6.12573862 0.04466511 0.065921539368278048 0 +513 0 -6.12573862 0.04466511 0.065921539368278048 0 +514 1 5.004027 0.924282849 0.11359368245893879 1 +515 1 5.02333355 0.924955666 0.11254387723751433 1 +516 0 -6.12573862 0.04466511 0.065921539368278048 0 +517 0 -6.12573862 0.04466511 0.065921539368278048 0 +518 0 -6.12573862 0.04466511 0.065921539368278048 0 +519 1 3.707599 0.8645726 0.20994100541133706 1 +520 0 -6.048977 0.04633175 0.068440605343774177 0 +521 0 -6.048977 0.04633175 0.068440605343774177 0 +522 1 3.29415345 0.838495553 0.25412496326918355 1 +523 1 4.687142 0.9124219 0.13222704839686869 1 +524 0 -6.12573862 0.04466511 0.065921539368278048 0 +525 0 -6.12573862 0.04466511 0.065921539368278048 0 +526 0 -6.12573862 0.04466511 0.065921539368278048 0 +527 0 -6.12573862 0.04466511 0.065921539368278048 0 +528 0 -5.177396 0.0698693544 0.10449472429160866 0 +529 0 -6.12573862 0.04466511 0.065921539368278048 0 +530 1 4.83683729 0.918221056 0.12308657886405872 1 +531 0 -6.12573862 0.04466511 0.065921539368278048 0 +532 0 -6.12573862 0.04466511 0.065921539368278048 0 +533 0 -6.12573862 0.04466511 0.065921539368278048 0 +534 0 -6.12573862 0.04466511 0.065921539368278048 0 +535 0 -5.44819069 0.0615664274 0.09167346789220833 0 +536 0 -6.12573862 0.04466511 0.065921539368278048 0 +537 0 -6.12573862 0.04466511 0.065921539368278048 0 +538 0 -6.12573862 0.04466511 0.065921539368278048 0 +539 0 -4.45841932 0.09715795 0.14745447741632708 0 +540 0 -5.88718367 0.0500402562 0.074061716914150894 0 +541 0 -6.12573862 0.04466511 0.065921539368278048 0 +542 0 -5.17382336 0.0699855238 0.10467492216060112 0 +543 0 -6.12573862 0.04466511 0.065921539368278048 0 +544 0 -5.904324 0.0496344268 0.073445519186050218 0 +545 0 -6.12573862 0.04466511 0.065921539368278048 0 +546 1 5.004027 0.924282849 0.11359368245893879 1 +547 0 -6.12573862 0.04466511 0.065921539368278048 0 +548 0 -6.12573862 0.04466511 0.065921539368278048 0 +549 1 4.233742 0.89253217 0.16402392529549129 1 +550 0 -6.12573862 0.04466511 0.065921539368278048 0 +551 0 -6.12573862 0.04466511 0.065921539368278048 0 +552 0 -5.44038153 0.0617924072 0.092020918427318632 0 +553 0 -2.05547643 0.263522834 0.44128729795151717 0 +554 0 -6.12573862 0.04466511 0.065921539368278048 0 +555 0 -4.01450157 0.118443735 0.18187544283824944 0 +556 0 -6.12573862 0.04466511 0.065921539368278048 0 +557 0 -5.88278341 0.0501449443 0.074220714532658688 0 +558 0 -6.12573862 0.04466511 0.065921539368278048 0 +559 0 -6.12573862 0.04466511 0.065921539368278048 0 +560 0 -6.12573862 0.04466511 0.065921539368278048 0 +561 0 -6.12573862 0.04466511 0.065921539368278048 0 +562 0 -6.12573862 0.04466511 0.065921539368278048 0 +563 0 -6.12573862 0.04466511 0.065921539368278048 0 +564 0 -6.12573862 0.04466511 0.065921539368278048 0 +565 1 5.004027 0.924282849 0.11359368245893879 1 +566 0 -6.12573862 0.04466511 0.065921539368278048 0 +567 0 -4.595947 0.09129094 0.13810963729887868 0 +568 1 3.938514 0.8775313 0.18847752650563218 1 +569 1 4.847574 0.918623269 0.12245476759364576 1 +570 1 4.54944563 0.9067618 0.14120444037717286 1 +571 1 4.552568 0.90689373 0.14099458928062417 1 +572 0 -6.12573862 0.04466511 0.065921539368278048 0 +573 0 -6.12573862 0.04466511 0.065921539368278048 0 +574 1 4.85103941 0.91875273 0.122251463360545 1 +575 0 -6.12573862 0.04466511 0.065921539368278048 0 +576 0 -6.12573862 0.04466511 0.065921539368278048 0 +577 0 -6.12573862 0.04466511 0.065921539368278048 0 +578 0 -6.12573862 0.04466511 0.065921539368278048 0 +579 0 -6.12573862 0.04466511 0.065921539368278048 0 +580 0 -6.12573862 0.04466511 0.065921539368278048 0 +581 1 4.94449 0.922173 0.11689063238018986 1 +582 1 4.09530258 0.885710061 0.17509358865445432 1 +583 0 -6.12573862 0.04466511 0.065921539368278048 0 +584 0 -5.80602169 0.0520049259 0.077048532176877474 0 +585 0 -6.12573862 0.04466511 0.065921539368278048 0 +586 1 4.91459131 0.921093345 0.1185807267410698 1 +587 0 -6.12573862 0.04466511 0.065921539368278048 0 +588 1 4.35050344 0.898005 0.15520460314710188 1 +589 0 -6.12573862 0.04466511 0.065921539368278048 0 +590 1 3.54668355 0.854872763 0.22621838555837612 1 +591 1 4.55594158 0.907036066 0.14076817777784198 1 +592 1 4.612346 0.909387 0.13703372644990114 1 +593 0 -6.12573862 0.04466511 0.065921539368278048 0 +594 1 3.707599 0.8645726 0.20994100541133706 1 +595 0 -6.12573862 0.04466511 0.065921539368278048 0 +596 0 -6.12573862 0.04466511 0.065921539368278048 0 +597 0 -5.05378866 0.07399416 0.11090680232251976 0 +598 0 -6.12573862 0.04466511 0.065921539368278048 0 +599 0 -5.7551713 0.0532727726 0.078979280952392372 0 +600 0 -6.12573862 0.04466511 0.065921539368278048 0 +601 0 -6.12573862 0.04466511 0.065921539368278048 0 +602 0 -6.12573862 0.04466511 0.065921539368278048 0 +603 1 1.93389523 0.72451067 0.46492115869820583 1 +604 1 0.8018034 0.5989043 0.73960257622323922 1 +605 1 4.85804653 0.919013858 0.12184147876101566 1 +606 0 -6.12573862 0.04466511 0.065921539368278048 0 +607 0 -6.12573862 0.04466511 0.065921539368278048 0 +608 1 4.71659 0.9135913 0.13037914277520105 1 +609 0 -6.12573862 0.04466511 0.065921539368278048 0 +610 1 4.57899952 0.9080037 0.13922993785081683 1 +611 1 4.74096966 0.914548755 0.1288680126360825 1 +612 1 4.91459131 0.921093345 0.1185807267410698 1 +613 0 -5.93544865 0.0489054658 0.072339349687159854 0 +614 0 -6.12573862 0.04466511 0.065921539368278048 0 +615 0 -5.904324 0.0496344268 0.073445519186050218 0 +616 0 -6.12573862 0.04466511 0.065921539368278048 0 +617 0 -2.57204 0.216527224 0.35204494911913131 0 +618 0 -6.12573862 0.04466511 0.065921539368278048 0 +619 0 -6.12573862 0.04466511 0.065921539368278048 0 +620 0 -6.12573862 0.04466511 0.065921539368278048 0 +621 0 -2.08407712 0.26075685 0.43587912530312761 0 +622 0 -4.45841932 0.09715795 0.14745447741632708 0 +623 0 -6.12573862 0.04466511 0.065921539368278048 0 +624 0 -6.12573862 0.04466511 0.065921539368278048 0 +625 0 -4.8392725 0.08168754 0.12294297386424494 0 +626 1 3.72445273 0.86555624 0.20830053219774505 1 +627 0 -3.30130816 0.161020562 0.25329264195172102 0 +628 0 -6.12573862 0.04466511 0.065921539368278048 0 +629 0 -6.12573862 0.04466511 0.065921539368278048 0 +630 0 -5.422645 0.062308535 0.092814793797065226 0 +631 0 -6.12573862 0.04466511 0.065921539368278048 0 +632 0 -6.12573862 0.04466511 0.065921539368278048 0 +633 1 4.599212 0.9088444 0.13789475993220657 1 +634 0 -6.12573862 0.04466511 0.065921539368278048 0 +635 0 -5.904324 0.0496344268 0.073445519186050218 0 +636 1 4.85834026 0.9190248 0.12182426214416593 1 +637 0 -4.461279 0.0970326 0.14725419077217505 0 +638 0 -6.12573862 0.04466511 0.065921539368278048 0 +639 0 -5.88278341 0.0501449443 0.074220714532658688 0 +640 0 -5.88278341 0.0501449443 0.074220714532658688 0 +641 0 -6.12573862 0.04466511 0.065921539368278048 0 +642 0 -6.12573862 0.04466511 0.065921539368278048 0 +643 0 -6.12573862 0.04466511 0.065921539368278048 0 +644 0 -6.12573862 0.04466511 0.065921539368278048 0 +645 0 -6.12573862 0.04466511 0.065921539368278048 0 +646 0 -6.12573862 0.04466511 0.065921539368278048 0 +647 0 -6.138525 0.0443931036 0.065510829404308496 0 +648 1 4.928055 0.9215812 0.11781679475557053 1 +649 0 -6.12573862 0.04466511 0.065921539368278048 0 +650 0 -4.86740255 0.08063864 0.12129606215924123 0 +651 0 -6.138525 0.0443931036 0.065510829404308496 0 +652 0 -6.12573862 0.04466511 0.065921539368278048 0 +653 0 -6.12573862 0.04466511 0.065921539368278048 0 +654 0 -6.12573862 0.04466511 0.065921539368278048 0 +655 0 -6.12573862 0.04466511 0.065921539368278048 0 +656 0 -6.12573862 0.04466511 0.065921539368278048 0 +657 0 -1.26773977 0.346633583 0.61403579333455072 0 +658 1 4.40070248 0.9002811 0.15155260745829846 1 +659 0 -6.12573862 0.04466511 0.065921539368278048 0 +660 0 -6.12573862 0.04466511 0.065921539368278048 0 +661 0 -6.12573862 0.04466511 0.065921539368278048 0 +662 0 -5.904324 0.0496344268 0.073445519186050218 0 +663 0 -5.904324 0.0496344268 0.073445519186050218 0 +664 0 -6.138525 0.0443931036 0.065510829404308496 0 +665 0 -6.12573862 0.04466511 0.065921539368278048 0 +666 0 -6.12573862 0.04466511 0.065921539368278048 0 +667 0 -6.12573862 0.04466511 0.065921539368278048 0 +668 1 3.583095 0.8571169 0.22243614858809693 1 +669 1 4.95708561 0.9226238 0.11618556568194083 1 +670 1 4.381452 0.8994136 0.15294341877416354 1 +671 0 -6.12573862 0.04466511 0.065921539368278048 0 +672 0 -6.12573862 0.04466511 0.065921539368278048 0 +673 0 -5.09706163 0.07252525 0.10862008599631576 0 +674 0 -6.12573862 0.04466511 0.065921539368278048 0 +675 0 -5.904324 0.0496344268 0.073445519186050218 0 +676 0 -6.12573862 0.04466511 0.065921539368278048 0 +677 0 -6.12573862 0.04466511 0.065921539368278048 0 +678 0 -6.12573862 0.04466511 0.065921539368278048 0 +679 0 -6.12573862 0.04466511 0.065921539368278048 0 +680 1 4.93133974 0.9216998 0.11763112286398286 1 +681 1 4.94449 0.922173 0.11689063238018986 1 +682 0 -6.12573862 0.04466511 0.065921539368278048 0 +683 0 -6.12573862 0.04466511 0.065921539368278048 0 +684 0 -6.12573862 0.04466511 0.065921539368278048 0 +685 0 -6.12573862 0.04466511 0.065921539368278048 0 +686 0 -6.12573862 0.04466511 0.065921539368278048 0 +687 0 -4.562707 0.0926790759 0.14031516516923384 0 +688 0 -6.12573862 0.04466511 0.065921539368278048 0 +689 0 -6.12573862 0.04466511 0.065921539368278048 0 +690 0 -6.138525 0.0443931036 0.065510829404308496 0 +691 1 2.44231081 0.7722668 0.37282873444142556 1 +692 0 -6.12573862 0.04466511 0.065921539368278048 0 +693 0 -6.12573862 0.04466511 0.065921539368278048 0 +694 0 -5.810422 0.0518965647 0.076883633329030782 0 +695 0 -6.12573862 0.04466511 0.065921539368278048 0 +696 1 4.55036926 0.906800866 0.14114232582393552 1 +697 1 3.27134752 0.8369454 0.25679456140192347 1 +698 1 3.72445273 0.86555624 0.20830053219774505 1 diff --git a/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer-out.txt b/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer-out.txt new file mode 100644 index 0000000000..2496917e04 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer-out.txt @@ -0,0 +1,45 @@ +maml.exe TrainTest test=%Data% tr=LightGBMBinary{nt=1 nl=5 mil=5 lr=0.25 iter=20 mb=255} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3448 (241.0/(241.0+458.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 240 | 1 | 0.9959 + negative || 11 | 447 | 0.9760 + ||====================== +Precision || 0.9562 | 0.9978 | +OVERALL 0/1 ACCURACY: 0.982833 +LOG LOSS/instance: 0.086938 +Test-set entropy (prior Log-Loss/instance): 0.929318 +LOG-LOSS REDUCTION (RIG): 90.644963 +AUC: 0.996313 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.996313 (0.0000) +Accuracy: 0.982833 (0.0000) +Positive precision: 0.956175 (0.0000) +Positive recall: 0.995851 (0.0000) +Negative precision: 0.997768 (0.0000) +Negative recall: 0.975983 (0.0000) +Log-loss: 0.086938 (0.0000) +Log-loss reduction: 90.644963 (0.0000) +F1 Score: 0.975610 (0.0000) +AUPRC: 0.987034 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer-rp.txt new file mode 100644 index 0000000000..0a2dcff3a5 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer-rp.txt @@ -0,0 +1,4 @@ +LightGBMBinary +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.996313 0.982833 0.956175 0.995851 0.997768 0.975983 0.086938 90.64497 0.97561 0.987034 20 0.25 5 5 1 LightGBMBinary %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMBinary{nt=1 nl=5 mil=5 lr=0.25 iter=20 mb=255} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 /iter:20;/lr:0.25;/nl:5;/mil:5;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer.txt b/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer.txt new file mode 100644 index 0000000000..8180e64edd --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMBinary/LightGBM-TrainTest-breast-cancer.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -11.1408987 0.003794317 0.0054844536464761871 0 +1 0 0.191842213 0.5239619 1.0708510547998533 1 +2 0 -10.352807 0.00561656 0.0081258244335933715 0 +3 0 -0.745744765 0.407847136 0.75595844049774485 0 +4 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +5 1 9.274134 0.9904069 0.013906771757572052 1 +6 0 -2.67131853 0.2082248 0.33683722078474054 0 +7 0 -11.1408987 0.003794317 0.0054844536464761871 0 +8 0 -9.129003 0.0103077162 0.014948064293186902 0 +9 0 -10.793726 0.00451033656 0.0065217589263549926 0 +10 0 -10.0781832 0.00643791631 0.009317976395589251 0 +11 0 -11.1408987 0.003794317 0.0054844536464761871 0 +12 1 1.4520539 0.6739328 0.56932337184434956 1 +13 0 -8.451772 0.0144019378 0.020928675408500307 0 +14 1 9.274134 0.9904069 0.013906771757572052 1 +15 1 2.33043027 0.762279034 0.3916088992805673 1 +16 0 -11.1408987 0.003794317 0.0054844536464761871 0 +17 0 -11.1408987 0.003794317 0.0054844536464761871 0 +18 1 9.46429348 0.99126935 0.012650971698572483 1 +19 0 -11.1408987 0.003794317 0.0054844536464761871 0 +20 1 5.83090067 0.948604941 0.07612071132266339 1 +21 1 9.014071 0.989089251 0.01582738630202769 1 +22 0 -11.1408987 0.003794317 0.0054844536464761871 0 +23 1 6.695143 0.966025233 0.049867221109728778 1 +24 0 -11.1408987 0.003794317 0.0054844536464761871 0 +25 1 0.353024364 0.544013858 0.87828469270484355 1 +26 0 -10.793726 0.00451033656 0.0065217589263549926 0 +27 0 -11.1408987 0.003794317 0.0054844536464761871 0 +28 0 -11.1408987 0.003794317 0.0054844536464761871 0 +29 0 -11.1249819 0.003824518 0.0055281913271731124 0 +30 0 -10.0781832 0.00643791631 0.009317976395589251 0 +31 0 -11.1408987 0.003794317 0.0054844536464761871 0 +32 1 9.113095 0.989610851 0.015066775731727065 1 +33 0 -11.1408987 0.003794317 0.0054844536464761871 0 +34 0 -11.1408987 0.003794317 0.0054844536464761871 0 +35 0 -11.1408987 0.003794317 0.0054844536464761871 0 +36 1 8.808518 0.9879225 0.017530239508724475 1 +37 0 -8.345987 0.0151723241 0.022056789543357803 0 +38 1 7.432053 0.97624743 0.034681249789809167 1 +39 1 4.67947149 0.9121149 0.13271249251622741 1 +40 0 9.35413551 0.9907795 6.7609422844201523 1 +41 1 5.14519262 0.92907697 0.10612997288183632 1 +42 1 6.044327 0.9535654 0.068596177822018822 1 +43 1 5.26266 0.9328509 0.10028158926423145 1 +44 1 8.722647 0.98739934 0.018294414611490426 1 +45 0 -11.1408987 0.003794317 0.0054844536464761871 0 +46 1 5.39120626 0.9367667 0.094238327334802807 1 +47 0 -11.1408987 0.003794317 0.0054844536464761871 0 +48 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +49 1 5.57127428 0.9418947 0.086362298062532941 1 +50 1 6.173262 0.9563379 0.064407600093902617 1 +51 1 1.62959909 0.6931313 0.52879936912076753 1 +52 1 7.09074545 0.971951544 0.041043703445742354 1 +53 1 8.494669 0.9858994 0.020487668060688979 1 +54 1 9.246337 0.9902739 0.014100489645724055 1 +55 1 7.939049 0.981467545 0.026987533150897716 1 +56 1 6.1828723 0.9565381 0.064105689389443152 1 +57 1 2.662988 0.7910876 0.33809058649873347 1 +58 1 4.5584197 0.9071405 0.14060208942052352 1 +59 1 5.63572073 0.9436334 0.083701645388880766 1 +60 1 6.09145451 0.9545977 0.067035217035386507 1 +61 0 -10.352807 0.00561656 0.0081258244335933715 0 +62 1 6.22759676 0.9574583 0.06271841386822509 1 +63 1 2.96480656 0.8149353 0.29524252355586916 1 +64 0 -11.1408987 0.003794317 0.0054844536464761871 0 +65 1 3.90195155 0.875553 0.19173356307998154 1 +66 0 -11.1408987 0.003794317 0.0054844536464761871 0 +67 1 7.520144 0.977247655 0.033203876676285611 1 +68 1 8.354915 0.9848942 0.021959316673970036 1 +69 0 -11.7515974 0.002798697 0.0040433269201261592 0 +70 0 -11.1249819 0.003824518 0.0055281913271731124 0 +71 1 3.20202327 0.8321597 0.26506767539412135 1 +72 0 -7.30176 0.025310982 0.036986105544657269 0 +73 1 8.049733 0.9824478 0.025547335174044564 1 +74 1 5.354063 0.9356576 0.095947385239666283 1 +75 0 -7.64184952 0.0214378815 0.031264659787381265 0 +76 0 -11.1249819 0.003824518 0.0055281913271731124 0 +77 0 -10.4720278 0.005293259 0.0076568411573198387 0 +78 0 -8.451772 0.0144019378 0.020928675408500307 0 +79 0 -11.1408987 0.003794317 0.0054844536464761871 0 +80 0 -7.324939 0.0250266381 0.036565292561749188 0 +81 0 -11.1408987 0.003794317 0.0054844536464761871 0 +82 0 -10.793726 0.00451033656 0.0065217589263549926 0 +83 0 -7.25121975 0.0259419419 0.03792032909389155 0 +84 1 9.370424 0.990853667 0.013256084002009599 1 +85 1 6.522149 0.963069 0.054288897339336381 1 +86 1 2.97598457 0.8157767 0.29375378289111959 1 +87 1 7.70157576 0.97917974 0.030354387115209134 1 +88 0 -11.1408987 0.003794317 0.0054844536464761871 0 +89 0 -11.1408987 0.003794317 0.0054844536464761871 0 +90 0 -11.1408987 0.003794317 0.0054844536464761871 0 +91 0 -11.1408987 0.003794317 0.0054844536464761871 0 +92 0 -11.1408987 0.003794317 0.0054844536464761871 0 +93 0 -11.1408987 0.003794317 0.0054844536464761871 0 +94 0 -11.1408987 0.003794317 0.0054844536464761871 0 +95 0 -11.1408987 0.003794317 0.0054844536464761871 0 +96 0 -11.1408987 0.003794317 0.0054844536464761871 0 +97 0 -11.1408987 0.003794317 0.0054844536464761871 0 +98 1 9.208157 0.9900883 0.014370921985123001 1 +99 1 9.274134 0.9904069 0.013906771757572052 1 +100 1 7.25592375 0.9741174 0.037832442000692482 1 +101 1 0.6636784 0.582206845 0.78039629287341283 1 +102 0 -11.1408987 0.003794317 0.0054844536464761871 0 +103 1 2.232404 0.75328356 0.40873505071150923 1 +104 1 9.492584 0.991390944 0.012474015207671739 1 +105 1 5.32842731 0.9348816 0.09714438886438892 1 +106 1 9.46429348 0.99126935 0.012650971698572483 1 +107 1 8.700008 0.9872577 0.018501352204702889 1 +108 0 -9.64856 0.007968333 0.011541920197508238 0 +109 1 6.700427 0.966111839 0.049737887225771368 1 +110 0 -4.014178 0.11846064 0.18190310927826997 0 +111 1 7.17823029 0.973119736 0.039310765216591721 1 +112 1 8.721394 0.987391531 0.018305823276373562 1 +113 1 9.105702 0.989572763 0.015122302118022618 1 +114 0 -6.12290955 0.0447255075 0.066012752240725281 0 +115 0 -6.795408 0.0323673 0.047468570938158913 0 +116 0 -2.479353 0.224492311 0.36678701041765982 0 +117 1 8.700008 0.9872577 0.018501352204702889 1 +118 0 -8.451772 0.0144019378 0.020928675408500307 0 +119 0 -10.0056343 0.006674148 0.0096610360020039331 0 +120 0 -11.1408987 0.003794317 0.0054844536464761871 0 +121 0 -10.0056343 0.006674148 0.0096610360020039331 0 +122 1 9.302145 0.990539 0.013714295254109422 1 +123 1 5.14182043 0.9289658 0.10630259950178499 1 +124 1 7.21285248 0.973568857 0.038645076157601946 1 +125 0 -11.1408987 0.003794317 0.0054844536464761871 0 +126 1 9.290635 0.990484953 0.013793036484376598 1 +127 0 -11.1408987 0.003794317 0.0054844536464761871 0 +128 1 6.18321 0.9565451 0.064095081407078522 1 +129 0 -9.641098 0.007997878 0.011584888039440988 0 +130 0 -11.1249819 0.003824518 0.0055281913271731124 0 +131 0 -11.1408987 0.003794317 0.0054844536464761871 0 +132 1 6.50233 0.96271497 0.054819370622932836 1 +133 0 -11.7515974 0.002798697 0.0040433269201261592 0 +134 0 -11.1408987 0.003794317 0.0054844536464761871 0 +135 0 -8.860468 0.0117714843 0.017083408969417173 0 +136 0 -11.1408987 0.003794317 0.0054844536464761871 0 +137 0 -11.1408987 0.003794317 0.0054844536464761871 0 +138 0 -11.1408987 0.003794317 0.0054844536464761871 0 +139 0 -1.60860276 0.309106171 0.53346406927085821 0 +140 0 -11.1408987 0.003794317 0.0054844536464761871 0 +141 0 -11.1408987 0.003794317 0.0054844536464761871 0 +142 1 8.457936 0.9856418 0.020864687335742812 1 +143 0 -6.795408 0.0323673 0.047468570938158913 0 +144 0 -11.1408987 0.003794317 0.0054844536464761871 0 +145 0 -1.31349862 0.3414702 0.60267939336265108 0 +146 1 2.39630437 0.7681959 0.38045377994578972 1 +147 0 -10.352807 0.00561656 0.0081258244335933715 0 +148 0 -6.36205053 0.0398860537 0.058722459807188501 0 +149 1 6.934371 0.969739556 0.044330761266236668 1 +150 0 -10.0781832 0.00643791631 0.009317976395589251 0 +151 1 7.37175035 0.9755382 0.035729736686882549 1 +152 1 9.099943 0.989543 0.015165664584975543 1 +153 0 -8.451772 0.0144019378 0.020928675408500307 0 +154 0 -11.1408987 0.003794317 0.0054844536464761871 0 +155 1 5.424654 0.9377501 0.092724581478057941 1 +156 0 -10.793726 0.00451033656 0.0065217589263549926 0 +157 0 -11.1408987 0.003794317 0.0054844536464761871 0 +158 0 -2.67131853 0.2082248 0.33683722078474054 0 +159 1 9.887188 0.992921531 0.010248386218477984 1 +160 1 9.302145 0.990539 0.013714295254109422 1 +161 0 -11.7515974 0.002798697 0.0040433269201261592 0 +162 0 -11.1408987 0.003794317 0.0054844536464761871 0 +163 0 -5.3771596 0.06365061 0.094881133498308609 0 +164 0 -1.79691482 0.289367616 0.49282466048662621 0 +165 0 -10.9635057 0.004144777 0.0059920758416508691 0 +166 1 7.1727457 0.9730479 0.039417250952604198 1 +167 1 7.52542257 0.977306247 0.033117381775498847 1 +168 0 -11.1408987 0.003794317 0.0054844536464761871 0 +169 0 -10.0781832 0.00643791631 0.009317976395589251 0 +170 0 -11.1408987 0.003794317 0.0054844536464761871 0 +171 0 -11.1408987 0.003794317 0.0054844536464761871 0 +172 0 -11.1408987 0.003794317 0.0054844536464761871 0 +173 1 9.35413551 0.9907795 0.013364048694591426 1 +174 1 8.639983 0.9868746 0.019061347344820612 1 +175 1 8.683719 0.987154841 0.018651696697845825 1 +176 0 -11.1408987 0.003794317 0.0054844536464761871 0 +177 1 9.581268 0.991761267 0.011935212277438465 1 +178 0 -11.1408987 0.003794317 0.0054844536464761871 0 +179 1 2.20761633 0.750973 0.41316708241478539 1 +180 0 -10.0781832 0.00643791631 0.009317976395589251 0 +181 0 -11.1408987 0.003794317 0.0054844536464761871 0 +182 0 -11.1408987 0.003794317 0.0054844536464761871 0 +183 1 9.35413551 0.9907795 0.013364048694591426 1 +184 1 8.639983 0.9868746 0.019061347344820612 1 +185 0 -10.0781832 0.00643791631 0.009317976395589251 0 +186 1 8.566467 0.9863898 0.019770190483280031 1 +187 1 9.973059 0.993217 0.0098191523070945419 1 +188 1 8.49752 0.9859192 0.020458710913685913 1 +189 0 -10.7778091 0.004546211 0.0065737503869248157 0 +190 1 9.099943 0.989543 0.015165664584975543 1 +191 1 8.618975 0.9867378 0.019261336051184869 1 +192 0 -11.1408987 0.003794317 0.0054844536464761871 0 +193 0 -11.1408987 0.003794317 0.0054844536464761871 0 +194 0 -11.1408987 0.003794317 0.0054844536464761871 0 +195 0 -11.1408987 0.003794317 0.0054844536464761871 0 +196 0 2.626489 0.788055539 2.2382418325825175 1 +197 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +198 0 -11.1408987 0.003794317 0.0054844536464761871 0 +199 0 -11.1408987 0.003794317 0.0054844536464761871 0 +200 1 9.302145 0.990539 0.013714295254109422 1 +201 1 9.978819 0.993236363 0.0097910145401494779 1 +202 0 -11.1408987 0.003794317 0.0054844536464761871 0 +203 0 -11.1408987 0.003794317 0.0054844536464761871 0 +204 0 -11.1408987 0.003794317 0.0054844536464761871 0 +205 1 9.35413551 0.9907795 0.013364048694591426 1 +206 1 7.939049 0.981467545 0.026987533150897716 1 +207 0 -10.0781832 0.00643791631 0.009317976395589251 0 +208 0 -10.0781832 0.00643791631 0.009317976395589251 0 +209 0 -10.0781832 0.00643791631 0.009317976395589251 0 +210 1 9.274134 0.9904069 0.013906771757572052 1 +211 1 8.401018 0.985233366 0.021462607069098 1 +212 0 -11.1408987 0.003794317 0.0054844536464761871 0 +213 1 9.973059 0.993217 0.0098191523070945419 1 +214 1 9.973059 0.993217 0.0098191523070945419 1 +215 1 8.401018 0.985233366 0.021462607069098 1 +216 0 -11.1408987 0.003794317 0.0054844536464761871 0 +217 0 -11.1408987 0.003794317 0.0054844536464761871 0 +218 1 8.481019 0.9858042 0.020626967038070158 1 +219 0 -11.1249819 0.003824518 0.0055281913271731124 0 +220 0 -11.1408987 0.003794317 0.0054844536464761871 0 +221 1 9.903688 0.9929793 0.010164469042396825 1 +222 1 -4.304539 0.104119331 3.2636901527043216 0 +223 1 7.09019375 0.971944034 0.041054851068202003 1 +224 1 9.973059 0.993217 0.0098191523070945419 1 +225 0 -11.1408987 0.003794317 0.0054844536464761871 0 +226 1 9.887188 0.992921531 0.010248386218477984 1 +227 1 6.06125546 0.9539388 0.068031408770273541 1 +228 0 -10.0781832 0.00643791631 0.009317976395589251 0 +229 1 9.887188 0.992921531 0.010248386218477984 1 +230 1 5.822027 0.9483882 0.076450353481824412 1 +231 1 8.858544 0.9882173 0.017099791114119234 1 +232 0 -1.68837154 0.300653934 0.51592155708079446 0 +233 1 8.055492 0.9824974 0.025474514025770799 1 +234 0 -8.979688 0.0110978512 0.016100320554689886 0 +235 0 -1.31349862 0.3414702 0.60267939336265108 0 +236 1 8.646986 0.9869198 0.018995213388831089 1 +237 1 9.13141251 0.989704549 0.014930184702656403 1 +238 1 8.396541 0.985200763 0.021510350106347824 1 +239 1 8.05048 0.98245424 0.025537882221233921 1 +240 0 -8.307092 0.0154656731 0.022486586633696577 0 +241 0 -9.540723 0.008406055 0.012178633240645663 0 +242 0 -11.1408987 0.003794317 0.0054844536464761871 0 +243 0 -3.69382024 0.136236086 0.21129105026238285 0 +244 0 -11.1408987 0.003794317 0.0054844536464761871 0 +245 0 -10.352807 0.00561656 0.0081258244335933715 0 +246 1 9.274134 0.9904069 0.013906771757572052 1 +247 1 5.817549 0.9482785 0.076617288483981333 1 +248 0 -9.64856 0.007968333 0.011541920197508238 0 +249 0 -2.67131853 0.2082248 0.33683722078474054 0 +250 0 -10.793726 0.00451033656 0.0065217589263549926 0 +251 1 8.721394 0.987391531 0.018305823276373562 1 +252 0 2.11510253 0.7422223 1.9558006823853182 1 +253 1 6.044327 0.9535654 0.068596177822018822 1 +254 1 6.22759676 0.9574583 0.06271841386822509 1 +255 1 2.48014879 0.775576949 0.36665816906652682 1 +256 0 -11.1408987 0.003794317 0.0054844536464761871 0 +257 0 -11.1408987 0.003794317 0.0054844536464761871 0 +258 0 -11.1408987 0.003794317 0.0054844536464761871 0 +259 0 0.283193856 0.5353402 1.1057532280150515 1 +260 1 10.1194534 0.993692756 0.0091282474748994851 1 +261 1 8.043809 0.9823966 0.025622523365384141 1 +262 1 6.934371 0.969739556 0.044330761266236668 1 +263 1 8.721394 0.987391531 0.018305823276373562 1 +264 1 7.126985 0.9724413 0.040316905121624717 1 +265 0 -11.7356806 0.00282099587 0.0040755880659088068 0 +266 1 8.646986 0.9869198 0.018995213388831089 1 +267 1 4.94409 0.922158659 0.11691310546313334 1 +268 1 9.113095 0.989610851 0.015066775731727065 1 +269 0 -11.1408987 0.003794317 0.0054844536464761871 0 +270 1 7.11166048 0.972235262 0.040622634121999394 1 +271 0 -11.1408987 0.003794317 0.0054844536464761871 0 +272 1 4.94409 0.922158659 0.11691310546313334 1 +273 1 4.1208353 0.886996031 0.17300044622027391 1 +274 0 -11.7515974 0.002798697 0.0040433269201261592 0 +275 0 -1.31349862 0.3414702 0.60267939336265108 0 +276 0 -11.1408987 0.003794317 0.0054844536464761871 0 +277 0 -11.1408987 0.003794317 0.0054844536464761871 0 +278 0 -11.1408987 0.003794317 0.0054844536464761871 0 +279 1 8.623115 0.986764848 0.019221771815457974 1 +280 0 -11.1408987 0.003794317 0.0054844536464761871 0 +281 0 -11.1408987 0.003794317 0.0054844536464761871 0 +282 1 7.44834232 0.9764356 0.034403196863819908 1 +283 1 8.033978 0.9823114 0.025747612286718125 1 +284 1 7.12837362 0.9724599 0.040289315758062355 1 +285 1 9.274134 0.9904069 0.013906771757572052 1 +286 1 9.3179 0.990612566 0.01360717241034631 1 +287 0 -11.1408987 0.003794317 0.0054844536464761871 0 +288 1 3.95294356 0.878304541 0.1872068319257183 1 +289 1 8.045126 0.982408 0.025605804814090766 1 +290 0 -11.1408987 0.003794317 0.0054844536464761871 0 +291 0 -11.1408987 0.003794317 0.0054844536464761871 0 +292 1 7.545969 0.977533 0.032782713841218038 1 +293 1 7.82729864 0.9804234 0.028523190565462438 1 +294 0 -2.67131853 0.2082248 0.33683722078474054 0 +295 1 8.683719 0.987154841 0.018651696697845825 1 +296 0 1.93075657 0.7241973 1.8582916614884373 1 +297 0 1.21198213 0.647025764 1.5023652114898498 1 +298 0 -4.8046937 0.08299391 0.12499677939585228 0 +299 1 6.792139 0.967581451 0.047544982550267206 1 +300 1 7.116138 0.9722956 0.040533128500011242 1 +301 0 -11.1408987 0.003794317 0.0054844536464761871 0 +302 1 9.973059 0.993217 0.0098191523070945419 1 +303 0 -11.1408987 0.003794317 0.0054844536464761871 0 +304 1 7.494034 0.9769556 0.033635108686750376 1 +305 1 9.009594 0.989065051 0.015862684335247734 1 +306 0 -11.1408987 0.003794317 0.0054844536464761871 0 +307 0 -11.1408987 0.003794317 0.0054844536464761871 0 +308 1 7.624736 0.9783819 0.031530421564222699 1 +309 0 -3.69382024 0.136236086 0.21129105026238285 0 +310 0 -11.1408987 0.003794317 0.0054844536464761871 0 +311 0 -11.1408987 0.003794317 0.0054844536464761871 0 +312 1 7.981511 0.9818498 0.026425767238453236 1 +313 0 -11.1408987 0.003794317 0.0054844536464761871 0 +314 0 -10.0781832 0.00643791631 0.009317976395589251 0 +315 0 8.130573 0.983131349 5.88951159247455 1 +316 1 4.73531771 0.9143276 0.1292168911311686 1 +317 1 8.481019 0.9858042 0.020626967038070158 1 +318 0 -9.641098 0.007997878 0.011584888039440988 0 +319 0 0.7705238 0.5951416 1.3045106471098233 1 +320 1 7.97981071 0.98183465 0.026448012968183419 1 +321 0 -2.67131853 0.2082248 0.33683722078474054 0 +322 0 -11.1408987 0.003794317 0.0054844536464761871 0 +323 1 6.252937 0.957971454 0.061945428766314335 1 +324 0 -11.1408987 0.003794317 0.0054844536464761871 0 +325 0 -9.301386 0.009464545 0.013719479606889235 0 +326 1 5.24081039 0.932163358 0.10134529157224524 1 +327 0 -11.1408987 0.003794317 0.0054844536464761871 0 +328 1 7.894324 0.9810564 0.027592028372844139 1 +329 1 8.710652 0.9873245 0.018403802166269453 1 +330 1 7.837536 0.9805214 0.028379005230758148 1 +331 0 -11.1408987 0.003794317 0.0054844536464761871 0 +332 0 -11.4044237 0.00332746375 0.0048085199879913726 0 +333 1 5.46663237 0.9389642 0.090857960051291389 1 +334 1 7.08571625 0.971882939 0.041145539292823469 1 +335 0 -11.1408987 0.003794317 0.0054844536464761871 0 +336 1 6.50233 0.96271497 0.054819370622932836 1 +337 0 -11.1408987 0.003794317 0.0054844536464761871 0 +338 0 -10.0781832 0.00643791631 0.009317976395589251 0 +339 1 7.30815029 0.974767745 0.03686958239855153 1 +340 1 8.05048 0.98245424 0.025537882221233921 1 +341 0 -11.1408987 0.003794317 0.0054844536464761871 0 +342 0 -11.1408987 0.003794317 0.0054844536464761871 0 +343 0 -11.1408987 0.003794317 0.0054844536464761871 0 +344 1 9.290635 0.990484953 0.013793036484376598 1 +345 0 -11.1408987 0.003794317 0.0054844536464761871 0 +346 0 -9.301386 0.009464545 0.013719479606889235 0 +347 0 -8.585843 0.01348073 0.019580863553249173 0 +348 1 3.204673 0.8323447 0.264746958820682 1 +349 1 3.02492 0.819425464 0.28731536957104747 1 +350 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +351 0 -11.1408987 0.003794317 0.0054844536464761871 0 +352 0 0.120472826 0.5150545 1.0441055452097858 1 +353 1 8.061415 0.982548237 0.025399858659549537 1 +354 0 -11.1408987 0.003794317 0.0054844536464761871 0 +355 0 -11.7515974 0.002798697 0.0040433269201261592 0 +356 1 2.28046 0.757721841 0.40025976070621477 1 +357 1 9.274134 0.9904069 0.013906771757572052 1 +358 1 8.413211 0.9853218 0.021333089126220839 1 +359 1 7.354948 0.9753369 0.036027441759334644 1 +360 1 9.35413551 0.9907795 0.013364048694591426 1 +361 1 7.97221 0.9817667 0.02654786023197938 1 +362 0 -8.104598 0.0170853827 0.02486199527913165 0 +363 0 -2.69398451 0.206362531 0.33344795467518717 0 +364 0 -11.1408987 0.003794317 0.0054844536464761871 0 +365 0 -11.1408987 0.003794317 0.0054844536464761871 0 +366 1 9.35413551 0.9907795 0.013364048694591426 1 +367 1 9.35413551 0.9907795 0.013364048694591426 1 +368 0 -11.1249819 0.003824518 0.0055281913271731124 0 +369 0 -10.0622663 0.00648902263 0.009392186896397094 0 +370 0 -10.4720278 0.005293259 0.0076568411573198387 0 +371 0 -11.1249819 0.003824518 0.0055281913271731124 0 +372 0 -11.1408987 0.003794317 0.0054844536464761871 0 +373 0 -11.1408987 0.003794317 0.0054844536464761871 0 +374 0 -11.1408987 0.003794317 0.0054844536464761871 0 +375 0 -11.1408987 0.003794317 0.0054844536464761871 0 +376 0 -11.1408987 0.003794317 0.0054844536464761871 0 +377 0 -10.0781832 0.00643791631 0.009317976395589251 0 +378 0 -11.2141371 0.00365838455 0.0052876112142239253 0 +379 0 -5.271106 0.0668850541 0.099873284283095887 0 +380 0 -11.1408987 0.003794317 0.0054844536464761871 0 +381 1 9.98956 0.993272364 0.009738723040134005 1 +382 0 -11.4044237 0.00332746375 0.0048085199879913726 0 +383 0 -11.1408987 0.003794317 0.0054844536464761871 0 +384 0 -11.1408987 0.003794317 0.0054844536464761871 0 +385 0 -8.386765 0.0148706678 0.021614954448689945 0 +386 1 8.639983 0.9868746 0.019061347344820612 1 +387 0 -9.289907 0.009518501 0.013798067832613392 0 +388 0 -11.7515974 0.002798697 0.0040433269201261592 0 +389 0 -10.9635057 0.004144777 0.0059920758416508691 0 +390 0 -11.1408987 0.003794317 0.0054844536464761871 0 +391 1 9.887188 0.992921531 0.010248386218477984 1 +392 0 -11.1408987 0.003794317 0.0054844536464761871 0 +393 0 -10.0781832 0.00643791631 0.009317976395589251 0 +394 0 -10.7778091 0.004546211 0.0065737503869248157 0 +395 0 -11.1408987 0.003794317 0.0054844536464761871 0 +396 0 -11.1408987 0.003794317 0.0054844536464761871 0 +397 0 -11.1408987 0.003794317 0.0054844536464761871 0 +398 0 -11.4044237 0.00332746375 0.0048085199879913726 0 +399 0 -10.7778091 0.004546211 0.0065737503869248157 0 +400 1 8.700008 0.9872577 0.018501352204702889 1 +401 0 -11.1408987 0.003794317 0.0054844536464761871 0 +402 0 -9.289907 0.009518501 0.013798067832613392 0 +403 0 -6.795408 0.0323673 0.047468570938158913 0 +404 0 -10.8669643 0.00434886431 0.0062877672328930361 0 +405 0 -11.1408987 0.003794317 0.0054844536464761871 0 +406 0 -10.793726 0.00451033656 0.0065217589263549926 0 +407 0 -11.1408987 0.003794317 0.0054844536464761871 0 +408 0 -8.023946 0.0177759528 0.025875951311168544 0 +409 0 -11.1408987 0.003794317 0.0054844536464761871 0 +410 0 -11.1408987 0.003794317 0.0054844536464761871 0 +411 0 -1.60860276 0.309106171 0.53346406927085821 0 +412 1 9.099943 0.989543 0.015165664584975543 1 +413 0 -11.1408987 0.003794317 0.0054844536464761871 0 +414 1 7.96331 0.9816869 0.026665145799971899 1 +415 0 -2.6968832 0.206125274 0.33301672841502694 0 +416 1 6.989869 0.9705433 0.043135478762872534 1 +417 0 -11.1408987 0.003794317 0.0054844536464761871 0 +418 0 -10.616333 0.004926604 0.0071251533271606418 0 +419 0 -8.972227 0.0111388648 0.016160155919286649 0 +420 0 -7.567138 0.02223571 0.032441379080581804 0 +421 1 8.469339 0.985722244 0.020746912751097368 1 +422 0 -7.79756832 0.0198639631 0.02894609453563346 0 +423 0 -11.1249819 0.003824518 0.0055281913271731124 0 +424 0 -11.1408987 0.003794317 0.0054844536464761871 0 +425 1 9.973059 0.993217 0.0098191523070945419 1 +426 0 -9.289907 0.009518501 0.013798067832613392 0 +427 1 8.834639 0.988077343 0.017304120598901823 1 +428 0 -11.1408987 0.003794317 0.0054844536464761871 0 +429 0 -11.1408987 0.003794317 0.0054844536464761871 0 +430 0 -11.0827265 0.003905862 0.0056460013312586337 0 +431 0 -9.714336 0.0077125174 0.011169940367472734 0 +432 0 -11.7515974 0.002798697 0.0040433269201261592 0 +433 0 -10.2562656 0.00589268841 0.0085264990912724478 0 +434 0 2.888761 0.8091321 2.3893535965491437 1 +435 1 8.267367 0.984228969 0.022934115231135192 1 +436 1 5.93617153 0.9511113 0.07231389299691196 1 +437 0 -11.1408987 0.003794317 0.0054844536464761871 0 +438 0 -10.5875225 0.00499773 0.0072282775549519776 0 +439 0 -11.1408987 0.003794317 0.0054844536464761871 0 +440 1 8.867787 0.988271 0.017021391272806899 1 +441 0 -4.054161 0.116388828 0.17851643454804922 0 +442 0 -7.91431141 0.0187587924 0.027320273233670325 0 +443 0 -10.352807 0.00561656 0.0081258244335933715 0 +444 0 -8.824449 0.0119828414 0.017391998029464235 0 +445 0 -11.1408987 0.003794317 0.0054844536464761871 0 +446 0 -11.1408987 0.003794317 0.0054844536464761871 0 +447 0 -11.1408987 0.003794317 0.0054844536464761871 0 +448 0 -10.0781832 0.00643791631 0.009317976395589251 0 +449 1 9.35413551 0.9907795 0.013364048694591426 1 +450 0 -9.540723 0.008406055 0.012178633240645663 0 +451 0 -11.1408987 0.003794317 0.0054844536464761871 0 +452 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +453 1 8.700008 0.9872577 0.018501352204702889 1 +454 0 -10.4720278 0.005293259 0.0076568411573198387 0 +455 1 4.937511 0.9219222 0.11728307577870839 1 +456 1 9.973059 0.993217 0.0098191523070945419 1 +457 1 8.678677 0.987122834 0.018698475671585835 1 +458 0 -11.1408987 0.003794317 0.0054844536464761871 0 +459 0 -11.1249819 0.003824518 0.0055281913271731124 0 +460 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +461 0 -6.795408 0.0323673 0.047468570938158913 0 +462 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +463 0 -11.7515974 0.002798697 0.0040433269201261592 0 +464 0 -11.1408987 0.003794317 0.0054844536464761871 0 +465 1 9.784009 0.992549539 0.010788985249565914 1 +466 1 9.302145 0.990539 0.013714295254109422 1 +467 1 6.044327 0.9535654 0.068596177822018822 1 +468 0 -11.1408987 0.003794317 0.0054844536464761871 0 +469 0 -11.1408987 0.003794317 0.0054844536464761871 0 +470 0 -10.0781832 0.00643791631 0.009317976395589251 0 +471 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +472 0 -10.0781832 0.00643791631 0.009317976395589251 0 +473 0 -11.1408987 0.003794317 0.0054844536464761871 0 +474 0 -11.1408987 0.003794317 0.0054844536464761871 0 +475 0 -11.1408987 0.003794317 0.0054844536464761871 0 +476 0 -11.1408987 0.003794317 0.0054844536464761871 0 +477 0 -11.1408987 0.003794317 0.0054844536464761871 0 +478 0 -10.793726 0.00451033656 0.0065217589263549926 0 +479 1 8.700008 0.9872577 0.018501352204702889 1 +480 0 -10.0781832 0.00643791631 0.009317976395589251 0 +481 0 -9.934567 0.00691389851 0.010009288711116292 0 +482 1 9.784009 0.992549539 0.010788985249565914 1 +483 1 9.257421 0.9903271 0.014022947270317726 1 +484 0 -11.1408987 0.003794317 0.0054844536464761871 0 +485 0 -6.8515954 0.03149888 0.046174376487384906 0 +486 0 -10.0781832 0.00643791631 0.009317976395589251 0 +487 1 10.1194534 0.993692756 0.0091282474748994851 1 +488 1 5.259406 0.9327489 0.10043931993839436 1 +489 1 0.7117242 0.5880384 0.76601776309411718 1 +490 0 -11.1408987 0.003794317 0.0054844536464761871 0 +491 1 6.721 0.966447 0.049237484113479738 1 +492 0 -10.0781832 0.00643791631 0.009317976395589251 0 +493 1 8.683719 0.987154841 0.018651696697845825 1 +494 0 -2.35003781 0.235949 0.38825914437927211 0 +495 0 -10.0781832 0.00643791631 0.009317976395589251 0 +496 0 -10.0781832 0.00643791631 0.009317976395589251 0 +497 0 -10.793726 0.00451033656 0.0065217589263549926 0 +498 0 -11.1408987 0.003794317 0.0054844536464761871 0 +499 0 -11.1408987 0.003794317 0.0054844536464761871 0 +500 0 -11.1408987 0.003794317 0.0054844536464761871 0 +501 0 -11.1408987 0.003794317 0.0054844536464761871 0 +502 0 -11.1408987 0.003794317 0.0054844536464761871 0 +503 0 -11.1408987 0.003794317 0.0054844536464761871 0 +504 0 -11.1408987 0.003794317 0.0054844536464761871 0 +505 0 -10.4720278 0.005293259 0.0076568411573198387 0 +506 1 8.429924 0.985442162 0.021156897062731286 1 +507 0 -6.795408 0.0323673 0.047468570938158913 0 +508 0 -11.1408987 0.003794317 0.0054844536464761871 0 +509 0 -11.1408987 0.003794317 0.0054844536464761871 0 +510 0 -11.1408987 0.003794317 0.0054844536464761871 0 +511 0 -11.1408987 0.003794317 0.0054844536464761871 0 +512 0 -11.1408987 0.003794317 0.0054844536464761871 0 +513 0 -10.0781832 0.00643791631 0.009317976395589251 0 +514 1 9.35413551 0.9907795 0.013364048694591426 1 +515 1 9.386926 0.9909281 0.013147693495487394 1 +516 0 -10.0781832 0.00643791631 0.009317976395589251 0 +517 0 -10.0781832 0.00643791631 0.009317976395589251 0 +518 0 -11.1408987 0.003794317 0.0054844536464761871 0 +519 1 6.73728943 0.9667101 0.048844794129335775 1 +520 0 -11.1408987 0.003794317 0.0054844536464761871 0 +521 0 -11.1408987 0.003794317 0.0054844536464761871 0 +522 1 7.160863 0.9728917 0.039648895618641884 1 +523 1 9.274134 0.9904069 0.013906771757572052 1 +524 0 -11.1408987 0.003794317 0.0054844536464761871 0 +525 0 -11.1408987 0.003794317 0.0054844536464761871 0 +526 0 -11.1408987 0.003794317 0.0054844536464761871 0 +527 0 -11.1408987 0.003794317 0.0054844536464761871 0 +528 0 -11.1249819 0.003824518 0.0055281913271731124 0 +529 0 -10.0781832 0.00643791631 0.009317976395589251 0 +530 1 8.005754 0.982064545 0.02611024762410109 1 +531 0 -10.793726 0.00451033656 0.0065217589263549926 0 +532 0 -10.0781832 0.00643791631 0.009317976395589251 0 +533 0 -11.1408987 0.003794317 0.0054844536464761871 0 +534 0 -11.1408987 0.003794317 0.0054844536464761871 0 +535 0 -11.1249819 0.003824518 0.0055281913271731124 0 +536 0 -11.1408987 0.003794317 0.0054844536464761871 0 +537 0 -11.1408987 0.003794317 0.0054844536464761871 0 +538 0 -11.1408987 0.003794317 0.0054844536464761871 0 +539 0 -11.1408987 0.003794317 0.0054844536464761871 0 +540 0 -10.352807 0.00561656 0.0081258244335933715 0 +541 0 -11.1408987 0.003794317 0.0054844536464761871 0 +542 0 -10.4720278 0.005293259 0.0076568411573198387 0 +543 0 -11.1408987 0.003794317 0.0054844536464761871 0 +544 0 -11.1249819 0.003824518 0.0055281913271731124 0 +545 0 -11.1408987 0.003794317 0.0054844536464761871 0 +546 1 9.35413551 0.9907795 0.013364048694591426 1 +547 0 -10.0781832 0.00643791631 0.009317976395589251 0 +548 0 -10.0781832 0.00643791631 0.009317976395589251 0 +549 1 6.23441839 0.9575971 0.062509346489219977 1 +550 0 -11.1408987 0.003794317 0.0054844536464761871 0 +551 0 -11.1408987 0.003794317 0.0054844536464761871 0 +552 0 -8.08276749 0.0172696561 0.025132491986605564 0 +553 0 -3.9415133 0.122307636 0.18821273881529132 0 +554 0 -11.1408987 0.003794317 0.0054844536464761871 0 +555 0 -7.34011126 0.0248421971 0.03629239594797426 0 +556 0 -10.793726 0.00451033656 0.0065217589263549926 0 +557 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +558 0 -11.1408987 0.003794317 0.0054844536464761871 0 +559 0 -11.1408987 0.003794317 0.0054844536464761871 0 +560 0 -11.1408987 0.003794317 0.0054844536464761871 0 +561 0 -11.1408987 0.003794317 0.0054844536464761871 0 +562 0 -11.1408987 0.003794317 0.0054844536464761871 0 +563 0 -11.1408987 0.003794317 0.0054844536464761871 0 +564 0 -11.7515974 0.002798697 0.0040433269201261592 0 +565 1 9.35413551 0.9907795 0.013364048694591426 1 +566 0 -11.1408987 0.003794317 0.0054844536464761871 0 +567 0 -8.451772 0.0144019378 0.020928675408500307 0 +568 1 5.817549 0.9482785 0.076617288483981333 1 +569 1 9.099943 0.989543 0.015165664584975543 1 +570 1 7.00637 0.9707783 0.042786255012913291 1 +571 1 9.257421 0.9903271 0.014022947270317726 1 +572 0 -11.1408987 0.003794317 0.0054844536464761871 0 +573 0 -11.1408987 0.003794317 0.0054844536464761871 0 +574 1 8.517464 0.9860569 0.020257160851031238 1 +575 0 -11.1408987 0.003794317 0.0054844536464761871 0 +576 0 -11.1408987 0.003794317 0.0054844536464761871 0 +577 0 -11.1408987 0.003794317 0.0054844536464761871 0 +578 0 -11.1408987 0.003794317 0.0054844536464761871 0 +579 0 -11.1408987 0.003794317 0.0054844536464761871 0 +580 0 -11.1408987 0.003794317 0.0054844536464761871 0 +581 1 8.043809 0.9823966 0.025622523365384141 1 +582 1 9.73166 0.9923535 0.011073961860426338 1 +583 0 -11.1408987 0.003794317 0.0054844536464761871 0 +584 0 -8.824449 0.0119828414 0.017391998029464235 0 +585 0 -11.1408987 0.003794317 0.0054844536464761871 0 +586 1 9.274134 0.9904069 0.013906771757572052 1 +587 0 -11.7515974 0.002798697 0.0040433269201261592 0 +588 1 7.760263 0.9797696 0.029485584466509632 1 +589 0 -11.1408987 0.003794317 0.0054844536464761871 0 +590 1 5.14993954 0.9292332 0.10588740490909247 1 +591 1 8.060098 0.9825369 0.025416487304717433 1 +592 1 8.055492 0.9824974 0.025474514025770799 1 +593 0 -11.1408987 0.003794317 0.0054844536464761871 0 +594 1 6.73728943 0.9667101 0.048844794129335775 1 +595 0 -11.1408987 0.003794317 0.0054844536464761871 0 +596 0 -11.1408987 0.003794317 0.0054844536464761871 0 +597 0 -11.1249819 0.003824518 0.0055281913271731124 0 +598 0 -11.1408987 0.003794317 0.0054844536464761871 0 +599 0 -10.7778091 0.004546211 0.0065737503869248157 0 +600 0 -11.1408987 0.003794317 0.0054844536464761871 0 +601 0 -10.0781832 0.00643791631 0.009317976395589251 0 +602 0 -11.1408987 0.003794317 0.0054844536464761871 0 +603 1 5.29666758 0.9339082 0.098647312760696312 1 +604 1 5.38688 0.9366384 0.094435885602072098 1 +605 1 9.113095 0.989610851 0.015066775731727065 1 +606 0 -11.1408987 0.003794317 0.0054844536464761871 0 +607 0 -11.1408987 0.003794317 0.0054844536464761871 0 +608 1 8.830113 0.98805064 0.017343110091630833 1 +609 0 -11.1408987 0.003794317 0.0054844536464761871 0 +610 1 8.867787 0.988271 0.017021391272806899 1 +611 1 8.260937 0.98417896 0.023007419875961721 1 +612 1 9.274134 0.9904069 0.013906771757572052 1 +613 0 -10.4720278 0.005293259 0.0076568411573198387 0 +614 0 -10.0781832 0.00643791631 0.009317976395589251 0 +615 0 -11.1249819 0.003824518 0.0055281913271731124 0 +616 0 -11.1408987 0.003794317 0.0054844536464761871 0 +617 0 -1.60860276 0.309106171 0.53346406927085821 0 +618 0 -11.1408987 0.003794317 0.0054844536464761871 0 +619 0 -11.1408987 0.003794317 0.0054844536464761871 0 +620 0 -11.1408987 0.003794317 0.0054844536464761871 0 +621 0 -3.58913 0.142513961 0.2218149117094308 0 +622 0 -6.65166759 0.0346954949 0.050943982898629274 0 +623 0 -11.1408987 0.003794317 0.0054844536464761871 0 +624 0 -10.0781832 0.00643791631 0.009317976395589251 0 +625 0 -4.167026 0.110709623 0.16927351973216262 0 +626 1 4.842628 0.918438256 0.12274535892278479 1 +627 0 -6.795408 0.0323673 0.047468570938158913 0 +628 0 -11.1408987 0.003794317 0.0054844536464761871 0 +629 0 -11.1408987 0.003794317 0.0054844536464761871 0 +630 0 -10.7778091 0.004546211 0.0065737503869248157 0 +631 0 -11.1408987 0.003794317 0.0054844536464761871 0 +632 0 -11.1408987 0.003794317 0.0054844536464761871 0 +633 1 6.42620564 0.9613244 0.056904752044233863 1 +634 0 -11.1408987 0.003794317 0.0054844536464761871 0 +635 0 -11.1249819 0.003824518 0.0055281913271731124 0 +636 1 9.492584 0.991390944 0.012474015207671739 1 +637 0 -9.452258 0.008782881 0.012726991314300787 0 +638 0 -11.1408987 0.003794317 0.0054844536464761871 0 +639 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +640 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +641 0 -11.1408987 0.003794317 0.0054844536464761871 0 +642 0 -11.1408987 0.003794317 0.0054844536464761871 0 +643 0 -11.1408987 0.003794317 0.0054844536464761871 0 +644 0 -11.1408987 0.003794317 0.0054844536464761871 0 +645 0 -11.1408987 0.003794317 0.0054844536464761871 0 +646 0 -10.793726 0.00451033656 0.0065217589263549926 0 +647 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +648 1 9.615418 0.9918996 0.011733982451323453 1 +649 0 -11.1408987 0.003794317 0.0054844536464761871 0 +650 0 -6.795408 0.0323673 0.047468570938158913 0 +651 0 -10.2562656 0.00589268841 0.0085264990912724478 0 +652 0 -11.7515974 0.002798697 0.0040433269201261592 0 +653 0 -11.1408987 0.003794317 0.0054844536464761871 0 +654 0 -11.1408987 0.003794317 0.0054844536464761871 0 +655 0 -11.1408987 0.003794317 0.0054844536464761871 0 +656 0 -11.1408987 0.003794317 0.0054844536464761871 0 +657 0 -1.18511176 0.356048644 0.63497638250270927 0 +658 1 7.770414 0.979869962 0.029337792601206499 1 +659 0 -11.1408987 0.003794317 0.0054844536464761871 0 +660 0 -11.1408987 0.003794317 0.0054844536464761871 0 +661 0 -11.1408987 0.003794317 0.0054844536464761871 0 +662 0 -11.1249819 0.003824518 0.0055281913271731124 0 +663 0 -11.1249819 0.003824518 0.0055281913271731124 0 +664 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +665 0 -11.1408987 0.003794317 0.0054844536464761871 0 +666 0 -10.793726 0.00451033656 0.0065217589263549926 0 +667 0 -11.1408987 0.003794317 0.0054844536464761871 0 +668 1 7.361788 0.975419 0.035906042607814007 1 +669 1 8.481019 0.9858042 0.020626967038070158 1 +670 1 7.82689238 0.9804195 0.028528891619975134 1 +671 0 -10.793726 0.00451033656 0.0065217589263549926 0 +672 0 -11.1408987 0.003794317 0.0054844536464761871 0 +673 0 -10.4720278 0.005293259 0.0076568411573198387 0 +674 0 -11.1408987 0.003794317 0.0054844536464761871 0 +675 0 -11.1249819 0.003824518 0.0055281913271731124 0 +676 0 -11.1408987 0.003794317 0.0054844536464761871 0 +677 0 -11.1408987 0.003794317 0.0054844536464761871 0 +678 0 -11.1408987 0.003794317 0.0054844536464761871 0 +679 0 -11.1408987 0.003794317 0.0054844536464761871 0 +680 1 9.973059 0.993217 0.0098191523070945419 1 +681 1 8.683719 0.987154841 0.018651696697845825 1 +682 0 -11.7515974 0.002798697 0.0040433269201261592 0 +683 0 -11.1408987 0.003794317 0.0054844536464761871 0 +684 0 -11.1408987 0.003794317 0.0054844536464761871 0 +685 0 -11.1408987 0.003794317 0.0054844536464761871 0 +686 0 -11.1408987 0.003794317 0.0054844536464761871 0 +687 0 -9.64856 0.007968333 0.011541920197508238 0 +688 0 -11.1408987 0.003794317 0.0054844536464761871 0 +689 0 -9.129003 0.0103077162 0.014948064293186902 0 +690 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +691 1 3.86220169 0.873371243 0.19533306500151071 1 +692 0 -11.1408987 0.003794317 0.0054844536464761871 0 +693 0 -11.1408987 0.003794317 0.0054844536464761871 0 +694 0 -10.352807 0.00561656 0.0081258244335933715 0 +695 0 -11.1408987 0.003794317 0.0054844536464761871 0 +696 1 9.067044 0.9893714 0.015415871487885204 1 +697 1 4.20529032 0.89116 0.16624359830210719 1 +698 1 4.20529032 0.89116 0.16624359830210719 1 diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key-out.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key-out.txt new file mode 100644 index 0000000000..193a84b3cd --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key-out.txt @@ -0,0 +1,67 @@ +maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% seed=1 xf=Term{col=Label} +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================== +PREDICTED || 0 | 1 | 2 | Recall +TRUTH ||======================== + 0 || 21 | 0 | 0 | 1.0000 + 1 || 0 | 27 | 3 | 0.9000 + 2 || 0 | 2 | 26 | 0.9286 + ||======================== +Precision ||1.0000 |0.9310 |0.8966 | +Accuracy(micro-avg): 0.936709 +Accuracy(macro-avg): 0.942857 +Log-loss: 0.312759 +Log-loss reduction: 71.240938 + +Confusion table + ||======================== +PREDICTED || 0 | 1 | 2 | Recall +TRUTH ||======================== + 0 || 29 | 0 | 0 | 1.0000 + 1 || 0 | 19 | 1 | 0.9500 + 2 || 0 | 2 | 20 | 0.9091 + ||======================== +Precision ||1.0000 |0.9048 |0.9524 | +Accuracy(micro-avg): 0.957746 +Accuracy(macro-avg): 0.953030 +Log-loss: 0.193389 +Log-loss reduction: 82.186751 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.947228 (0.0105) +Accuracy(macro-avg): 0.947944 (0.0051) +Log-loss: 0.253074 (0.0597) +Log-loss reduction: 76.713844 (5.4729) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Building term dictionary' started. +[1] (%Time%) 71 examples Total Terms: 3 +[1] 'Building term dictionary' finished in %Time%. +[2] 'Loading data for LightGBM' started. +[2] 'Loading data for LightGBM' finished in %Time%. +[3] 'Training with LightGBM' started. +[3] 'Training with LightGBM' finished in %Time%. +[4] 'Building term dictionary #2' started. +[4] (%Time%) 79 examples Total Terms: 3 +[4] 'Building term dictionary #2' finished in %Time%. +[5] 'Loading data for LightGBM #2' started. +[5] 'Loading data for LightGBM #2' finished in %Time%. +[6] 'Training with LightGBM #2' started. +[6] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key-rp.txt new file mode 100644 index 0000000000..b28e5f0924 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.947228 0.947944 0.253074 76.71384 10 0.2 20 10 1 LightGBMMC %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% seed=1 xf=Term{col=Label} /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key.txt new file mode 100644 index 0000000000..eba12784d0 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.key.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +5 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +6 0 0 0.12225796502047259 0.884920061 0.05914253 0.0559373945 0 2 1 +8 0 0 0.13903079517192601 0.87020123 0.07016016 0.0596385933 0 1 2 +9 0 0 0.13970878538557358 0.869611442 0.07047896 0.05990959 0 1 2 +10 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +11 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +18 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +20 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +21 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +25 0 0 0.13970878538557358 0.869611442 0.07047896 0.05990959 0 1 2 +28 0 0 0.12225796502047259 0.884920061 0.05914253 0.0559373945 0 2 1 +31 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +32 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +35 0 0 0.13903079517192601 0.87020123 0.07016016 0.0596385933 0 1 2 +37 0 0 0.13970878538557358 0.869611442 0.07047896 0.05990959 0 1 2 +40 0 0 0.12225796502047259 0.884920061 0.05914253 0.0559373945 0 2 1 +41 0 0 0.17550530270540357 0.839032948 0.09255621 0.068410866 0 1 2 +44 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +45 0 0 0.13903079517192601 0.87020123 0.07016016 0.0596385933 0 1 2 +46 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +48 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +50 1 1 0.48031528673730972 0.6185883 0.2931604 0.0882512555 1 2 0 +51 1 1 0.1855230347406718 0.8306697 0.09896271 0.0703676 1 0 2 +52 1 2 1.8686158620047173 0.7455236 0.154337138 0.100139305 2 1 0 +54 1 1 0.45820041221338154 0.6324207 0.3149093 0.05266998 1 2 0 +56 1 1 0.58631409634709242 0.556374252 0.357764423 0.08586135 1 2 0 +60 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +63 1 1 0.44289031357940112 0.642177641 0.3043398 0.053482566 1 2 0 +64 1 1 0.14288683084862894 0.866852164 0.06818328 0.06496458 1 2 0 +66 1 1 0.13881478450725465 0.8703892 0.0686788 0.0609319545 1 2 0 +68 1 1 0.14755364077036032 0.862816155 0.0811026245 0.0560812131 1 2 0 +69 1 1 0.13689581878715465 0.8720611 0.07104298 0.0568959676 1 2 0 +70 1 1 0.58631409634709242 0.556374252 0.357764423 0.08586135 1 2 0 +71 1 1 0.15245577872775815 0.858596861 0.07763986 0.0637633 1 2 0 +72 1 2 1.4638898231048283 0.7123695 0.231334671 0.05629582 2 1 0 +73 1 1 0.45820041221338154 0.6324207 0.3149093 0.05266998 1 2 0 +74 1 1 0.13842123633682313 0.870731831 0.068711035 0.06055716 1 2 0 +76 1 1 0.45820041221338154 0.6324207 0.3149093 0.05266998 1 2 0 +77 1 2 2.0734225760002563 0.815010965 0.12575464 0.0592344068 2 1 0 +79 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +82 1 1 0.13641482472258923 0.872480631 0.07081 0.0567093827 1 2 0 +88 1 1 0.13407561188247241 0.874523938 0.06425465 0.0612214059 1 2 0 +90 1 1 0.14206322054986673 0.8675664 0.07583086 0.0566027239 1 2 0 +91 1 1 0.44289031357940112 0.642177641 0.3043398 0.053482566 1 2 0 +92 1 1 0.13641482472258923 0.872480631 0.07081 0.0567093827 1 2 0 +93 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +95 1 1 0.13407561188247241 0.874523938 0.06425465 0.0612214059 1 2 0 +96 1 1 0.13407561188247241 0.874523938 0.06425465 0.0612214059 1 2 0 +97 1 1 0.13842123633682313 0.870731831 0.068711035 0.06055716 1 2 0 +98 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +99 1 1 0.13879102207379132 0.8704099 0.06865671 0.0609334 1 2 0 +100 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +102 2 2 0.12282263476045074 0.8844205 0.0591995977 0.0563798733 2 1 0 +104 2 2 0.12282263476045074 0.8844205 0.0591995977 0.0563798733 2 1 0 +105 2 2 0.12282263476045074 0.8844205 0.0591995977 0.0563798733 2 1 0 +106 2 1 2.3492272871651649 0.84814316 0.09544288 0.05641394 1 2 0 +108 2 2 0.22657586758781198 0.797258854 0.14797686 0.0547643043 2 1 0 +109 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +111 2 2 0.177848875720656 0.8370689 0.108788565 0.0541424938 2 1 0 +112 2 2 0.13281455464792449 0.875627458 0.06831084 0.0560617261 2 1 0 +113 2 2 0.1962166719523184 0.821834147 0.122739322 0.0554265566 2 1 0 +115 2 2 0.17200937673419167 0.8419713 0.09234353 0.0656852052 2 0 1 +117 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +120 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +121 2 2 0.16411842591849909 0.8486415 0.09412395 0.0572345145 2 1 0 +122 2 2 0.13716672321276682 0.871824861 0.07206305 0.0561121143 2 1 0 +123 2 2 0.28256655698542577 0.753846467 0.18986699 0.0562865436 2 1 0 +125 2 2 0.20564882812625254 0.8141189 0.09413582 0.09174526 2 0 1 +128 2 2 0.13716672321276682 0.871824861 0.07206305 0.0561121143 2 1 0 +129 2 2 0.16567788300150446 0.8473191 0.09548668 0.0571942 2 1 0 +131 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +132 2 2 0.13716672321276682 0.871824861 0.07206305 0.0561121143 2 1 0 +133 2 2 0.29112966022097542 0.747418761 0.191831574 0.06074964 2 1 0 +137 2 2 0.22116855095526036 0.801581562 0.1049951 0.09342333 2 1 0 +138 2 1 0.99148777165233459 0.5769952 0.371024281 0.05198054 1 2 0 +141 2 2 0.18520119392899573 0.8309371 0.09454043 0.07452247 2 0 1 +144 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +145 2 2 0.14505497806361808 0.864974737 0.07757514 0.0574500971 2 1 0 +147 2 2 0.14505497806361808 0.864974737 0.07757514 0.0574500971 2 1 0 +0 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +1 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +2 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +3 0 0 0.13111980383336003 0.8771127 0.06430127 0.05858605 0 1 2 +4 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +7 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +12 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +13 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +14 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +15 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +16 0 0 0.12377570311405263 0.883578 0.0616899766 0.0547319949 0 1 2 +17 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +19 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +22 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +23 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +24 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +26 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +27 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +29 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +30 0 0 0.13466431803417811 0.874009252 0.0676120147 0.058378756 0 1 2 +33 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +34 0 0 0.13111980383336003 0.8771127 0.06430127 0.05858605 0 1 2 +36 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +38 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +39 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +42 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +43 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +47 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +49 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +53 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +55 1 1 0.13788477324168841 0.8711991 0.0693822056 0.0594187379 1 2 0 +57 1 1 0.14180960025970848 0.867786467 0.06764004 0.06457352 1 2 0 +58 1 1 0.14599016737971268 0.8641662 0.07662087 0.0592129268 1 2 0 +59 1 1 0.15802382006343754 0.853829443 0.08263559 0.06353495 1 2 0 +61 1 1 0.24588101940191279 0.782015264 0.155458942 0.06252578 1 2 0 +62 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +65 1 1 0.13132980842568853 0.8769285 0.063261956 0.05980951 1 2 0 +67 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +75 1 1 0.16325813194034094 0.8493719 0.09269803 0.0579300523 1 2 0 +78 1 1 0.25856064866775763 0.7721622 0.1669285 0.0609093271 1 2 0 +80 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +81 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +83 1 2 0.93589296161344149 0.5591961 0.392235458 0.04856844 2 1 0 +84 1 1 0.30739855328930082 0.735357463 0.193893984 0.07074856 1 2 0 +85 1 1 0.36387320359326997 0.6949793 0.250199676 0.05482102 1 2 0 +86 1 1 0.22482401043721545 0.798656762 0.137458712 0.06388455 1 2 0 +87 1 1 0.15038993216531976 0.8603724 0.08044732 0.05918027 1 2 0 +89 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +94 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +101 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +103 2 2 0.1391351873710466 0.8701104 0.06958967 0.0602999441 2 1 0 +107 2 2 0.14333558969752591 0.866463244 0.07176019 0.0617765374 2 1 0 +110 2 2 0.23871432870005888 0.787639856 0.156446457 0.0559136942 2 1 0 +114 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +116 2 2 0.1391351873710466 0.8701104 0.06958967 0.0602999441 2 1 0 +118 2 2 0.12489127544479019 0.882592857 0.06075944 0.05664773 2 0 1 +119 2 1 0.82777746896385962 0.500950456 0.4370195 0.0620300435 1 2 0 +124 2 2 0.15317496105764933 0.8579796 0.08057635 0.0614440367 2 1 0 +126 2 2 0.41542564005029348 0.6600593 0.280402571 0.0595381558 2 1 0 +127 2 2 0.39337756049800737 0.674773932 0.268265069 0.05696099 2 1 0 +130 2 2 0.12489127544479019 0.882592857 0.06075944 0.05664773 2 0 1 +134 2 1 0.85550144650046023 0.5024456 0.42507 0.07248444 1 2 0 +135 2 2 0.12489127544479019 0.882592857 0.06075944 0.05664773 2 0 1 +136 2 2 0.1485323137279633 0.861972153 0.0780924 0.05993546 2 1 0 +139 2 2 0.16469395959924102 0.848153234 0.09065638 0.0611904152 2 1 0 +140 2 2 0.1540180682859322 0.857256532 0.08267425 0.0600692481 2 1 0 +142 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +143 2 2 0.15317496105764933 0.8579796 0.08057635 0.0614440367 2 1 0 +146 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +148 2 2 0.15751162588437911 0.8542669 0.08508965 0.0606434755 2 1 0 +149 2 2 0.22273115731729765 0.80033 0.142754182 0.05691586 2 1 0 diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404-out.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404-out.txt new file mode 100644 index 0000000000..e6f1c68e64 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404-out.txt @@ -0,0 +1,65 @@ +maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================================== +PREDICTED || 0 | 1 | 2 | 3 | 4 | Recall +TRUTH ||======================================== + 0 || 21 | 0 | 0 | 0 | 0 | 1.0000 + 1 || 0 | 27 | 3 | 0 | 0 | 0.9000 + 2 || 0 | 2 | 26 | 0 | 0 | 0.9286 + 3 || 0 | 0 | 0 | 0 | 0 | 0.0000 + 4 || 0 | 0 | 0 | 0 | 0 | 0.0000 + ||======================================== +Precision ||1.0000 |0.9310 |0.8966 |0.0000 |0.0000 | +Accuracy(micro-avg): 0.936709 +Accuracy(macro-avg): 0.942857 +Log-loss: 0.312759 +Log-loss reduction: 71.240931 + +Confusion table + ||======================================== +PREDICTED || 0 | 1 | 2 | 3 | 4 | Recall +TRUTH ||======================================== + 0 || 29 | 0 | 0 | 0 | 0 | 1.0000 + 1 || 0 | 19 | 1 | 0 | 0 | 0.9500 + 2 || 0 | 2 | 20 | 0 | 0 | 0.9091 + 3 || 0 | 0 | 0 | 0 | 0 | 0.0000 + 4 || 0 | 0 | 0 | 0 | 0 | 0.0000 + ||======================================== +Precision ||1.0000 |0.9048 |0.9524 |0.0000 |0.0000 | +Accuracy(micro-avg): 0.957746 +Accuracy(macro-avg): 0.953030 +Log-loss: 0.193390 +Log-loss reduction: 82.186746 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.947228 (0.0105) +Accuracy(macro-avg): 0.947944 (0.0051) +Log-loss: 0.253074 (0.0597) +Log-loss reduction: 76.713839 (5.4729) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404-rp.txt new file mode 100644 index 0000000000..aad98c4e5a --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.947228 0.947944 0.253074 76.71384 10 0.2 20 10 1 LightGBMMC %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404.txt new file mode 100644 index 0000000000..62ea0fc960 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-CV-iris.keyU404.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +5 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +6 0 0 0.12225803237644002 0.88492 0.0591425262 0.05593739 0 2 1 +8 0 0 0.13903086366717143 0.8702012 0.07016015 0.05963859 0 1 2 +9 0 0 0.13970885392727384 0.8696114 0.07047896 0.0599095859 0 1 2 +10 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +11 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +18 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +20 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +21 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +25 0 0 0.13970885392727384 0.8696114 0.07047896 0.0599095859 0 1 2 +28 0 0 0.12225803237644002 0.88492 0.0591425262 0.05593739 0 2 1 +31 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +32 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +35 0 0 0.13903086366717143 0.8702012 0.07016015 0.05963859 0 1 2 +37 0 0 0.13970885392727384 0.8696114 0.07047896 0.0599095859 0 1 2 +40 0 0 0.12225803237644002 0.88492 0.0591425262 0.05593739 0 2 1 +41 0 0 0.17550537374510114 0.8390329 0.0925562 0.06841086 0 1 2 +44 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +45 0 0 0.13903086366717143 0.8702012 0.07016015 0.05963859 0 1 2 +46 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +48 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +50 1 1 0.48031528673730972 0.6185883 0.293160379 0.08825125 1 2 0 +51 1 1 0.18552310649560261 0.830669641 0.0989627 0.07036759 1 0 2 +52 1 2 1.8686159585541422 0.7455235 0.154337123 0.1001393 2 1 0 +54 1 1 0.45820050646179217 0.632420659 0.314909279 0.0526699759 1 2 0 +56 1 1 0.58631420347758545 0.5563742 0.3577644 0.08586135 1 2 0 +60 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +63 1 1 0.44289040639584898 0.6421776 0.304339767 0.0534825623 1 2 0 +64 1 1 0.14288689960850434 0.8668521 0.06818327 0.06496457 1 2 0 +66 1 1 0.13881485298770596 0.870389163 0.0686788 0.06093195 1 2 0 +68 1 1 0.14755370985187494 0.8628161 0.0811026245 0.05608121 1 2 0 +69 1 1 0.13689588713632034 0.872061 0.07104297 0.0568959638 1 2 0 +70 1 1 0.58631420347758545 0.5563742 0.3577644 0.08586135 1 2 0 +71 1 1 0.15245584814875132 0.8585968 0.0776398554 0.06376329 1 2 0 +72 1 2 1.4638898875186992 0.7123695 0.231334656 0.0562958159 2 1 0 +73 1 1 0.45820050646179217 0.632420659 0.314909279 0.0526699759 1 2 0 +74 1 1 0.13842130479032938 0.8707318 0.06871103 0.0605571568 1 2 0 +76 1 1 0.45820050646179217 0.632420659 0.314909279 0.0526699759 1 2 0 +77 1 2 2.0734226944941909 0.8150109 0.125754625 0.0592344031 2 1 0 +79 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +82 1 1 0.13641489303888726 0.8724806 0.07080999 0.05670938 1 2 0 +88 1 1 0.13407568003915085 0.8745239 0.06425465 0.0612214021 1 2 0 +90 1 1 0.14206328925313413 0.867566347 0.07583086 0.05660272 1 2 0 +91 1 1 0.44289040639584898 0.6421776 0.304339767 0.0534825623 1 2 0 +92 1 1 0.13641489303888726 0.8724806 0.07080999 0.05670938 1 2 0 +93 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +95 1 1 0.13407568003915085 0.8745239 0.06425465 0.0612214021 1 2 0 +96 1 1 0.13407568003915085 0.8745239 0.06425465 0.0612214021 1 2 0 +97 1 1 0.13842130479032938 0.8707318 0.06871103 0.0605571568 1 2 0 +98 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +99 1 1 0.1387910905526154 0.870409846 0.0686567053 0.0609333962 1 2 0 +100 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +102 2 2 0.1228227021544628 0.884420455 0.059199594 0.05637987 2 1 0 +104 2 2 0.1228227021544628 0.884420455 0.059199594 0.05637987 2 1 0 +105 2 2 0.1228227021544628 0.884420455 0.059199594 0.05637987 2 1 0 +106 2 1 2.3492273652284066 0.8481431 0.0954428762 0.0564139374 1 2 0 +108 2 2 0.22657594234978759 0.7972588 0.147976846 0.0547643 2 1 0 +109 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +111 2 2 0.177848875720656 0.8370689 0.108788557 0.05414249 2 1 0 +112 2 2 0.13281462271870764 0.8756274 0.0683108345 0.0560617223 2 1 0 +113 2 2 0.19621674447868781 0.8218341 0.122739315 0.0554265529 2 1 0 +115 2 2 0.17200944752597333 0.8419712 0.0923435241 0.0656852 2 0 1 +117 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +120 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +121 2 2 0.16411849615386448 0.848641455 0.0941239446 0.05723451 2 1 0 +122 2 2 0.13716679158045109 0.8718248 0.07206305 0.05611211 2 1 0 +123 2 2 0.28256663605278198 0.7538464 0.189866975 0.05628654 2 1 0 +125 2 2 0.20564890133993838 0.814118862 0.09413581 0.09174525 2 0 1 +128 2 2 0.13716679158045109 0.8718248 0.07206305 0.05611211 2 1 0 +129 2 2 0.16567795334648433 0.847319067 0.09548667 0.0571941957 2 1 0 +131 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +132 2 2 0.13716679158045109 0.8718248 0.07206305 0.05611211 2 1 0 +133 2 2 0.29112966022097542 0.747418761 0.191831559 0.0607496351 2 1 0 +137 2 2 0.22116862531406531 0.8015815 0.104995094 0.09342332 2 1 0 +138 2 1 0.99148785197679079 0.576995134 0.371024251 0.05198054 1 2 0 +141 2 2 0.18520126566083658 0.830937 0.0945404246 0.0745224655 2 0 1 +144 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +145 2 2 0.14505497806361808 0.864974737 0.07757513 0.0574500933 2 1 0 +147 2 2 0.14505497806361808 0.864974737 0.07757513 0.0574500933 2 1 0 +0 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +1 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +2 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +3 0 0 0.13111987178887785 0.8771126 0.06430127 0.0585860461 0 1 2 +4 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +7 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +12 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +13 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +14 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +15 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +16 0 0 0.12377570311405263 0.883578 0.0616899729 0.05473199 0 1 2 +17 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +19 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +22 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +23 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +24 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +26 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +27 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +29 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +30 0 0 0.13466438623099261 0.8740092 0.06761201 0.0583787523 0 1 2 +33 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +34 0 0 0.13111987178887785 0.8771126 0.06430127 0.0585860461 0 1 2 +36 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +38 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +39 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +42 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +43 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +47 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +49 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +53 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +55 1 1 0.13788484165848175 0.871199 0.0693822056 0.0594187342 1 2 0 +57 1 1 0.14180966894555355 0.8677864 0.06764004 0.06457351 1 2 0 +58 1 1 0.1459902363533046 0.864166141 0.07662086 0.059212923 1 2 0 +59 1 1 0.1580238898720478 0.8538294 0.08263559 0.0635349452 1 2 0 +61 1 1 0.24588109562120131 0.7820152 0.155458942 0.06252578 1 2 0 +62 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +65 1 1 0.13132980842568853 0.8769285 0.063261956 0.0598095059 1 2 0 +67 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +75 1 1 0.16325820211530925 0.84937185 0.09269803 0.05793005 1 2 0 +78 1 1 0.25856072585963152 0.772162139 0.166928485 0.0609093234 1 2 0 +80 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +81 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +83 1 2 0.93589303759413867 0.559196055 0.392235428 0.04856844 2 1 0 +84 1 1 0.30739863434463804 0.7353574 0.193893969 0.07074856 1 2 0 +85 1 1 0.36387328935790564 0.69497925 0.250199646 0.05482102 1 2 0 +86 1 1 0.2248240850683334 0.7986567 0.1374587 0.06388454 1 2 0 +87 1 1 0.15039000144304782 0.860372365 0.0804473162 0.0591802672 1 2 0 +89 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +94 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +101 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +103 2 2 0.13913525587344278 0.870110333 0.06958966 0.06029994 2 1 0 +107 2 2 0.14333565848826485 0.8664632 0.07176019 0.0617765337 2 1 0 +110 2 2 0.23871440437506003 0.7876398 0.156446442 0.0559136942 2 1 0 +114 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +116 2 2 0.13913525587344278 0.870110333 0.06958966 0.06029994 2 1 0 +118 2 2 0.12489134297836053 0.8825928 0.0607594363 0.0566477254 2 0 1 +119 2 1 0.82777753715835345 0.5009504 0.437019467 0.06203004 1 2 0 +124 2 2 0.1531750305285868 0.857979536 0.0805763453 0.06144403 2 1 0 +126 2 2 0.41542573035225555 0.6600592 0.280402571 0.0595381558 2 1 0 +127 2 2 0.39337764883077281 0.6747739 0.268265069 0.0569609851 2 1 0 +130 2 2 0.12489134297836053 0.8825928 0.0607594363 0.0566477254 2 0 1 +134 2 1 0.85550151661202845 0.5024455 0.425069958 0.07248443 1 2 0 +135 2 2 0.12489134297836053 0.8825928 0.0607594363 0.0566477254 2 0 1 +136 2 2 0.14853238287711923 0.8619721 0.0780924 0.05993546 2 1 0 +139 2 2 0.16469402987504086 0.8481532 0.09065638 0.06119041 2 1 0 +140 2 2 0.15401813781546583 0.8572565 0.08267424 0.0600692444 2 1 0 +142 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +143 2 2 0.1531750305285868 0.857979536 0.0805763453 0.06144403 2 1 0 +146 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +148 2 2 0.15751169565724296 0.8542668 0.08508964 0.06064347 2 1 0 +149 2 2 0.22273123179238696 0.8003299 0.142754182 0.0569158569 2 1 0 diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key-out.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key-out.txt new file mode 100644 index 0000000000..64a3bc287d --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key-out.txt @@ -0,0 +1,43 @@ +maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% out=%Output% seed=1 xf=Term{col=Label} +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================== +PREDICTED || 0 | 1 | 2 | Recall +TRUTH ||======================== + 0 || 50 | 0 | 0 | 1.0000 + 1 || 0 | 47 | 3 | 0.9400 + 2 || 0 | 1 | 49 | 0.9800 + ||======================== +Precision ||1.0000 |0.9792 |0.9423 | +Accuracy(micro-avg): 0.973333 +Accuracy(macro-avg): 0.973333 +Log-loss: 0.196674 +Log-loss reduction: 82.097919 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.973333 (0.0000) +Accuracy(macro-avg): 0.973333 (0.0000) +Log-loss: 0.196674 (0.0000) +Log-loss reduction: 82.097919 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Building term dictionary' started. +[1] (%Time%) 150 examples Total Terms: 3 +[1] 'Building term dictionary' finished in %Time%. +[2] 'Loading data for LightGBM' started. +[2] 'Loading data for LightGBM' finished in %Time%. +[3] 'Training with LightGBM' started. +[3] 'Training with LightGBM' finished in %Time%. +[4] 'Saving model' started. +[4] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key-rp.txt new file mode 100644 index 0000000000..23dc3f1a86 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.973333 0.973333 0.196674 82.09792 10 0.2 20 10 1 LightGBMMC %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% out=%Output% seed=1 xf=Term{col=Label} /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key.txt new file mode 100644 index 0000000000..4fc92f1b19 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.key.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +0 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +1 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +2 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +3 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +4 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +5 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +6 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +7 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +8 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +9 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +10 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +11 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +12 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +13 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +14 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +15 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +16 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +17 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +18 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +19 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +20 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +21 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +22 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +23 0 0 0.33277494936956031 0.7169315 0.227236316 0.0558321662 0 1 2 +24 0 0 0.32796044820794762 0.7203915 0.224743724 0.054864794 0 1 2 +25 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +26 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +27 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +28 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +29 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +30 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +31 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +32 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +33 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +34 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +35 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +36 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +37 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +38 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +39 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +40 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +41 0 0 0.13811810171792147 0.8709958 0.0645556152 0.06444856 0 1 2 +42 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +43 0 0 0.33277494936956031 0.7169315 0.227236316 0.0558321662 0 1 2 +44 0 0 0.33634513183392067 0.7143765 0.229578465 0.05604506 0 1 2 +45 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +46 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +47 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +48 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +49 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +50 1 1 0.23100889631685528 0.7937324 0.149178371 0.0570892133 1 2 0 +51 1 1 0.15607289835381286 0.8554968 0.0860009938 0.0585021749 1 2 0 +52 1 1 0.50877014563522738 0.601234555 0.345829129 0.052936323 1 2 0 +53 1 1 0.13306515458964616 0.875408053 0.06540278 0.0591891445 1 2 0 +54 1 1 0.15325749593441318 0.8579088 0.08456552 0.05752569 1 2 0 +55 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +56 1 1 0.33773914875897953 0.71338135 0.194789842 0.0918288156 1 2 0 +57 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +58 1 1 0.12416960207104245 0.883230031 0.05863201 0.05813798 1 2 0 +59 1 1 0.1273381037166878 0.880435944 0.0600349456 0.0595290959 1 2 0 +60 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +61 1 1 0.1609832630763833 0.8513063 0.0884949937 0.0601987168 1 2 0 +62 1 1 0.13286234147782883 0.8755856 0.0653095841 0.0591047965 1 2 0 +63 1 1 0.23582975138698256 0.789915144 0.151939109 0.05814572 1 2 0 +64 1 1 0.13095815072854303 0.8772545 0.0616324246 0.06111311 1 2 0 +65 1 1 0.12594102775547797 0.881666839 0.0594169162 0.05891627 1 2 0 +66 1 1 0.1609832630763833 0.8513063 0.0884949937 0.0601987168 1 2 0 +67 1 1 0.12566071119127656 0.881914 0.0592928044 0.058793202 1 2 0 +68 1 1 0.16292738185521705 0.8496529 0.09265414 0.0576929823 1 2 0 +69 1 1 0.13131716612503977 0.8769396 0.06459884 0.05846158 1 2 0 +70 1 2 0.95035919356690834 0.554423034 0.386602134 0.0589748733 2 1 0 +71 1 1 0.12529959921655817 0.882232547 0.0591328628 0.05863461 1 2 0 +72 1 1 0.50877014563522738 0.601234555 0.345829129 0.052936323 1 2 0 +73 1 1 0.23582975138698256 0.789915144 0.151939109 0.05814572 1 2 0 +74 1 1 0.12416960207104245 0.883230031 0.05863201 0.05813798 1 2 0 +75 1 1 0.12594102775547797 0.881666839 0.0594169162 0.05891627 1 2 0 +76 1 1 0.26095097058717287 0.7703187 0.174276143 0.0554051772 1 2 0 +77 1 2 1.6029370592055334 0.738739431 0.2013044 0.0599561781 2 1 0 +78 1 1 0.15976734311668664 0.852342069 0.08787854 0.0597793758 1 2 0 +79 1 1 0.12955227996567303 0.87848866 0.0610127263 0.0604986325 1 2 0 +80 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +81 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +82 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +83 1 2 0.80815870423273684 0.493023425 0.445677936 0.06129863 2 1 0 +84 1 1 0.16454027823998496 0.8482836 0.09029396 0.0614224635 1 2 0 +85 1 1 0.2070731159429981 0.8129602 0.100639634 0.08640016 1 0 2 +86 1 1 0.2987897056212489 0.7417154 0.20252648 0.0557581745 1 2 0 +87 1 1 0.12976317713440702 0.8783034 0.06388293 0.0578136854 1 2 0 +88 1 1 0.12903506453208818 0.878943145 0.06078452 0.06027235 1 2 0 +89 1 1 0.13306515458964616 0.875408053 0.06540278 0.0591891445 1 2 0 +90 1 1 0.1273381037166878 0.880435944 0.0600349456 0.0595290959 1 2 0 +91 1 1 0.12737263080959327 0.880405545 0.0600502156 0.0595442355 1 2 0 +92 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +93 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +94 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +95 1 1 0.12903506453208818 0.878943145 0.06078452 0.06027235 1 2 0 +96 1 1 0.12661229526028364 0.8810752 0.05971398 0.05921083 1 2 0 +97 1 1 0.12529959921655817 0.882232547 0.0591328628 0.05863461 1 2 0 +98 1 1 0.44858136712049312 0.638533354 0.30528307 0.0561835542 1 0 2 +99 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +100 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +101 2 2 0.16184034002313213 0.850577 0.0913400352 0.0580829456 2 1 0 +102 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +103 2 2 0.12568524504717099 0.8818924 0.0596662238 0.05844138 2 1 0 +104 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +105 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +106 2 2 0.44758539287303228 0.639169633 0.301120639 0.0597097427 2 1 0 +107 2 2 0.12568524504717099 0.8818924 0.0596662238 0.05844138 2 1 0 +108 2 2 0.12568524504717099 0.8818924 0.0596662238 0.05844138 2 1 0 +109 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +110 2 2 0.19147015233338821 0.8257443 0.114775449 0.0594803 2 1 0 +111 2 2 0.12895206364866429 0.8790161 0.06284211 0.05814181 2 1 0 +112 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +113 2 2 0.23003014798568333 0.794509649 0.147670493 0.0578198843 2 1 0 +114 2 2 0.16184034002313213 0.850577 0.0913400352 0.0580829456 2 1 0 +115 2 2 0.14622594690253263 0.8639625 0.0778152943 0.0582222156 2 1 0 +116 2 2 0.13019277678014771 0.8779262 0.06272268 0.0593511574 2 1 0 +117 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +118 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +119 2 1 0.85092928263060119 0.5151953 0.427017927 0.05778675 1 2 0 +120 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +121 2 2 0.27313894704628855 0.760987043 0.18166633 0.0573466346 2 1 0 +122 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +123 2 2 0.29377982293137428 0.7454406 0.197279379 0.0572799928 2 1 0 +124 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +125 2 2 0.13019277678014771 0.8779262 0.06272268 0.0593511574 2 1 0 +126 2 2 0.43516329539237014 0.647159 0.2948179 0.0580231175 2 1 0 +127 2 2 0.36323660387324913 0.6954219 0.244927272 0.0596508458 2 1 0 +128 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +129 2 2 0.47537462515590923 0.6216521 0.316322356 0.0620255135 2 1 0 +130 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +131 2 2 0.16468208306001242 0.8481633 0.09738051 0.0544561855 2 0 1 +132 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +133 2 2 0.7071985901643314 0.493023425 0.445677936 0.06129863 2 1 0 +134 2 2 0.47537462515590923 0.6216521 0.316322356 0.0620255135 2 1 0 +135 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +136 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +137 2 2 0.13019277678014771 0.8779262 0.06272268 0.0593511574 2 1 0 +138 2 2 0.55105996253236122 0.5763386 0.362355322 0.06130607 2 1 0 +139 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +140 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +141 2 2 0.18701313089818 0.829432845 0.112345912 0.0582212359 2 1 0 +142 2 2 0.16184034002313213 0.850577 0.0913400352 0.0580829456 2 1 0 +143 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +144 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +145 2 2 0.14622594690253263 0.8639625 0.0778152943 0.0582222156 2 1 0 +146 2 2 0.23003014798568333 0.794509649 0.147670493 0.0578198843 2 1 0 +147 2 2 0.14864613971263602 0.861874044 0.07900992 0.0591160469 2 1 0 +148 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +149 2 2 0.20528992585094685 0.814411163 0.1260209 0.05956797 2 1 0 diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-out.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-out.txt new file mode 100644 index 0000000000..0263d06d71 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-out.txt @@ -0,0 +1,42 @@ +maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================================== +PREDICTED || 0 | 1 | 2 | 3 | 4 | Recall +TRUTH ||======================================== + 0 || 50 | 0 | 0 | 0 | 0 | 1.0000 + 1 || 0 | 47 | 3 | 0 | 0 | 0.9400 + 2 || 0 | 1 | 49 | 0 | 0 | 0.9800 + 3 || 0 | 0 | 0 | 0 | 0 | 0.0000 + 4 || 0 | 0 | 0 | 0 | 0 | 0.0000 + ||======================================== +Precision ||1.0000 |0.9792 |0.9423 |0.0000 |0.0000 | +Accuracy(micro-avg): 0.973333 +Accuracy(macro-avg): 0.973333 +Log-loss: 0.196675 +Log-loss reduction: 82.097914 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.973333 (0.0000) +Accuracy(macro-avg): 0.973333 (0.0000) +Log-loss: 0.196675 (0.0000) +Log-loss reduction: 82.097914 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-rp.txt new file mode 100644 index 0000000000..0842df2191 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.973333 0.973333 0.196675 82.09792 10 0.2 20 10 1 LightGBMMC %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% out=%Output% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404.txt b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404.txt new file mode 100644 index 0000000000..41d4c75d8b --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +0 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +1 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +2 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +3 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +4 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +5 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +6 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +7 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +8 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +9 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +10 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +11 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +12 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +13 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +14 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +15 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +16 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +17 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +18 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +19 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +20 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +21 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +22 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +23 0 0 0.33277503250811041 0.716931462 0.2272363 0.0558321625 0 1 2 +24 0 0 0.32796053094718908 0.720391452 0.224743709 0.05486479 0 1 2 +25 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +26 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +27 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +28 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +29 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +30 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +31 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +32 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +33 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +34 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +35 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +36 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +37 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +38 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +39 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +40 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +41 0 0 0.13811817015068023 0.87099576 0.06455561 0.06444855 0 1 2 +42 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +43 0 0 0.33277503250811041 0.716931462 0.2272363 0.0558321625 0 1 2 +44 0 0 0.33634521526982103 0.71437645 0.22957845 0.0560450554 0 1 2 +45 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +46 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +47 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +48 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +49 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +50 1 1 0.23100897141098861 0.793732345 0.149178356 0.05708921 1 2 0 +51 1 1 0.15607296802636475 0.855496764 0.0860009938 0.05850217 1 2 0 +52 1 1 0.50877024477232313 0.6012345 0.3458291 0.052936323 1 2 0 +53 1 1 0.13306522267748996 0.875408 0.06540278 0.05918914 1 2 0 +54 1 1 0.15325756541108468 0.8579087 0.08456551 0.0575256869 1 2 0 +55 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +56 1 1 0.33773923231127212 0.7133813 0.194789827 0.09182881 1 2 0 +57 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +58 1 1 0.12416966955589319 0.88323 0.058632005 0.0581379756 1 2 0 +59 1 1 0.12733817141570353 0.8804359 0.0600349456 0.0595290922 1 2 0 +60 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +61 1 1 0.16098333309189417 0.85130626 0.08849499 0.0601987131 1 2 0 +62 1 1 0.1328624095518649 0.875585556 0.06530958 0.0591047928 1 2 0 +63 1 1 0.23582975138698256 0.789915144 0.151939109 0.0581457168 1 2 0 +64 1 1 0.13095821867307653 0.8772544 0.06163242 0.0611131079 1 2 0 +65 1 1 0.12594109535997908 0.8816668 0.0594169125 0.058916267 1 2 0 +66 1 1 0.16098333309189417 0.85130626 0.08849499 0.0601987131 1 2 0 +67 1 1 0.12566077877682966 0.88191396 0.0592928 0.0587932 1 2 0 +68 1 1 0.16292745200697881 0.8496528 0.09265413 0.05769298 1 2 0 +69 1 1 0.13131723409397075 0.876939535 0.06459884 0.0584615767 1 2 0 +70 1 2 0.95035927065474868 0.554423 0.3866021 0.05897487 2 1 0 +71 1 1 0.12529966677770971 0.8822325 0.05913286 0.0586346053 1 2 0 +72 1 1 0.50877024477232313 0.6012345 0.3458291 0.052936323 1 2 0 +73 1 1 0.23582975138698256 0.789915144 0.151939109 0.0581457168 1 2 0 +74 1 1 0.12416966955589319 0.88323 0.058632005 0.0581379756 1 2 0 +75 1 1 0.12594109535997908 0.8816668 0.0594169125 0.058916267 1 2 0 +76 1 1 0.26095104796378088 0.7703186 0.174276143 0.0554051735 1 2 0 +77 1 2 1.6029370592055334 0.7387394 0.2013044 0.0599561743 2 1 0 +78 1 1 0.159767413047116 0.852342 0.08787853 0.0597793721 1 2 0 +79 1 1 0.12955234781475239 0.8784886 0.0610127226 0.06049863 1 2 0 +80 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +81 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +82 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +83 1 2 0.80815877110237733 0.4930234 0.4456779 0.0612986274 2 1 0 +84 1 1 0.16454034850498556 0.8482835 0.09029395 0.06142246 1 2 0 +85 1 1 0.2070731892610356 0.812960148 0.100639626 0.08640015 1 0 2 +86 1 1 0.29878978598178807 0.7417153 0.202526465 0.05575817 1 2 0 +87 1 1 0.12976324499779707 0.878303349 0.06388293 0.05781368 1 2 0 +88 1 1 0.12903513234608402 0.8789431 0.060784515 0.0602723472 1 2 0 +89 1 1 0.13306522267748996 0.875408 0.06540278 0.05918914 1 2 0 +90 1 1 0.12733817141570353 0.8804359 0.0600349456 0.0595290922 1 2 0 +91 1 1 0.12737269851094649 0.8804055 0.06005021 0.05954423 1 2 0 +92 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +93 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +94 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +95 1 1 0.12903513234608402 0.8789431 0.060784515 0.0602723472 1 2 0 +96 1 1 0.12661236291018069 0.881075144 0.0597139746 0.0592108257 1 2 0 +97 1 1 0.12529966677770971 0.8822325 0.05913286 0.0586346053 1 2 0 +98 1 1 0.44858136712049312 0.638533354 0.30528307 0.05618355 1 0 2 +99 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +100 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +101 2 2 0.16184034002313213 0.850577 0.09134003 0.0580829419 2 1 0 +102 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +103 2 2 0.12568531263438223 0.8818923 0.05966622 0.0584413745 2 1 0 +104 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +105 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +106 2 2 0.44758548612628529 0.6391696 0.3011206 0.05970974 2 1 0 +107 2 2 0.12568531263438223 0.8818923 0.05966622 0.0584413745 2 1 0 +108 2 2 0.12568531263438223 0.8818923 0.05966622 0.0584413745 2 1 0 +109 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +110 2 2 0.19147022451632548 0.8257442 0.114775442 0.0594802946 2 1 0 +111 2 2 0.12895213145703174 0.879016042 0.06284211 0.0581418052 2 1 0 +112 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +113 2 2 0.23003022300635434 0.7945096 0.147670478 0.05781988 2 1 0 +114 2 2 0.16184034002313213 0.850577 0.09134003 0.0580829419 2 1 0 +115 2 2 0.14622601589238901 0.8639624 0.0778152943 0.0582222119 2 1 0 +116 2 2 0.13019284467269809 0.8779261 0.06272268 0.0593511537 2 1 0 +117 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +118 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +119 2 1 0.85092928263060119 0.515195251 0.427017927 0.05778675 1 2 0 +120 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +121 2 2 0.27313902537173135 0.760987 0.181666315 0.05734663 2 1 0 +122 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +123 2 2 0.29377982293137428 0.7454406 0.197279364 0.05727999 2 1 0 +124 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +125 2 2 0.13019284467269809 0.8779261 0.06272268 0.0593511537 2 1 0 +126 2 2 0.43516338749438732 0.6471589 0.294817865 0.0580231138 2 1 0 +127 2 2 0.36323668958330446 0.6954218 0.244927257 0.0596508421 2 1 0 +128 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +129 2 2 0.47537472103694156 0.621652067 0.316322356 0.06202551 2 1 0 +130 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +131 2 2 0.16468215333497763 0.848163247 0.09738051 0.05445618 2 0 1 +132 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +133 2 2 0.70719865061241916 0.4930234 0.4456779 0.0612986274 2 1 0 +134 2 2 0.47537472103694156 0.621652067 0.316322356 0.06202551 2 1 0 +135 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +136 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +137 2 2 0.13019284467269809 0.8779261 0.06272268 0.0593511537 2 1 0 +138 2 2 0.55105996253236122 0.5763386 0.362355322 0.0613060668 2 1 0 +139 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +140 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +141 2 2 0.18701320276011227 0.8294328 0.112345912 0.0582212321 2 1 0 +142 2 2 0.16184034002313213 0.850577 0.09134003 0.0580829419 2 1 0 +143 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +144 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +145 2 2 0.14622601589238901 0.8639624 0.0778152943 0.0582222119 2 1 0 +146 2 2 0.23003022300635434 0.7945096 0.147670478 0.05781988 2 1 0 +147 2 2 0.14864620886966337 0.861874 0.07900992 0.0591160432 2 1 0 +148 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +149 2 2 0.20528999903836082 0.8144111 0.126020879 0.0595679656 2 1 0 diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine-out.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine-out.txt new file mode 100644 index 0000000000..9631870541 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.524348 +L2(avg): 0.466735 +RMS(avg): 0.683180 +Loss-fn(avg): 0.466735 +R Squared: 0.400415 +L1(avg): 0.517508 +L2(avg): 0.458039 +RMS(avg): 0.676786 +Loss-fn(avg): 0.458039 +R Squared: 0.420159 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.520928 (0.0034) +L2(avg): 0.462387 (0.0043) +RMS(avg): 0.679983 (0.0032) +Loss-fn(avg): 0.462387 (0.0043) +R Squared: 0.410287 (0.0099) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l2: 0.189697165394939 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] (%Time%) Iteration: 50 Training-l2: 0.204982247876212 +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine-rp.txt new file mode 100644 index 0000000000..ede416ff06 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.520928 0.462387 0.679983 0.462387 0.410287 50 0.2 20 10 gbdt{l2=0.2 l1=0.2} + 1 LightGBMR %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/booster:gbdt{l2=0.2 l1=0.2};/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine.txt new file mode 100644 index 0000000000..7bc6a0ec0b --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-CV-wine.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +5 6 5.80828 0.19172000885009766 0.036756561793481524 +6 6 5.206482 0.79351806640625 0.62967092171311378 +8 6 5.50727 0.49273014068603516 0.24278299154048 +9 6 5.99071741 0.0092825889587402344 8.6166457776926109E-05 +10 5 5.78352642 0.78352642059326172 0.61391365176768886 +11 5 5.3672 0.36719989776611328 0.13483576491944405 +18 6 5.8091054 0.19089460372924805 0.036440749732946642 +20 8 7.235471 0.76452922821044922 0.58450494078806514 +21 7 5.94430733 1.0556926727294922 1.1144870192547387 +25 6 5.54960966 0.45039033889770508 0.20285145737238963 +28 6 5.599702 0.40029811859130859 0.16023858374774136 +31 6 5.42717361 0.57282638549804688 0.32813006792275701 +32 6 5.800291 0.19970893859863281 0.039883660156192491 +35 5 5.98115873 0.98115873336791992 0.96267246006414098 +37 6 6.093817 0.093817234039306641 0.0088016734027860366 +40 6 5.89986944 0.10013055801391602 0.010026128648178201 +41 6 5.72777 0.27223014831542969 0.074109253651840845 +44 6 5.540586 0.45941400527954102 0.21106122824699014 +45 7 6.048586 0.95141410827636719 0.90518880542731495 +46 4 5.36457253 1.3645725250244141 1.8620581760515051 +48 6 5.482948 0.51705217361450195 0.26734295023948107 +50 6 6.23349476 0.23349475860595703 0.054519802296454145 +51 7 6.19232273 0.80767726898193359 0.65234257083011471 +52 7 6.08130836 0.91869163513183594 0.84399432046120637 +54 6 5.846752 0.15324783325195313 0.02348489839641843 +56 6 6.18618 0.18618011474609375 0.034663035126868635 +60 6 5.48933744 0.51066255569458008 0.2607762457885201 +63 6 5.37699461 0.62300539016723633 0.38813571617743037 +64 6 5.797454 0.20254611968994141 0.04102493060145207 +66 7 6.667073 0.33292722702026367 0.11084053849140219 +68 8 6.305265 1.694735050201416 2.8721268903811961 +69 5 5.570308 0.57030820846557617 0.32525145264321509 +70 6 5.35073948 0.64926052093505859 0.42153922404486366 +71 5 5.31465769 0.31465768814086914 0.09900946070615646 +72 5 4.61791229 0.38208770751953125 0.14599101623753086 +73 6 4.62672138 1.3732786178588867 1.8858941622684142 +74 8 6.305265 1.694735050201416 2.8721268903811961 +76 7 6.493501 0.50649881362915039 0.25654104820773682 +77 7 6.62248468 0.37751531600952148 0.14251781382176887 +79 5 5.094501 0.094501018524169922 0.0089304425021055067 +82 5 5.252633 0.25263309478759766 0.063823480581959302 +88 5 5.29069 0.29068994522094727 0.084500644252557322 +90 6 5.246408 0.75359201431274414 0.56790092403593917 +91 5 5.46798 0.46797990798950195 0.21900519428186271 +92 7 6.8612504 0.13874959945678711 0.019251451349418858 +93 7 6.8399725 0.16002750396728516 0.025608802025999466 +95 6 5.419488 0.58051204681396484 0.33699423649613891 +96 6 5.07628727 0.92371273040771484 0.85324520831727568 +97 7 5.607884 1.3921160697937012 1.9379871517778611 +98 4 4.55244064 0.55244064331054688 0.30519066438137088 +99 6 5.07628727 0.92371273040771484 0.85324520831727568 +100 5 5.95780659 0.95780658721923828 0.91739345852056431 +102 5 5.56467628 0.56467628479003906 0.3188593066042813 +104 5 5.95780659 0.95780658721923828 0.91739345852056431 +105 6 5.93800545 0.061994552612304688 0.003843324553599814 +106 5 5.6098 0.60979986190795898 0.37185587158296585 +108 6 5.85579967 0.14420032501220703 0.020793733733626141 +109 5 5.38346529 0.38346529006958008 0.14704562868814719 +111 5 5.33469868 0.33469867706298828 0.11202320442771452 +112 5 5.152083 0.15208292007446289 0.023129214578375468 +113 5 5.386198 0.38619804382324219 0.14914892905289889 +115 4 4.711909 0.71190881729125977 0.50681416413704028 +117 6 6.29482937 0.29482936859130859 0.086924356583949702 +120 5 5.1826005 0.18260049819946289 0.03334294194269205 +121 5 5.79177856 0.791778564453125 0.62691329512745142 +122 5 5.8222127 0.82221269607543945 0.67603371758764297 +123 6 5.60548544 0.39451456069946289 0.15564173860389019 +125 6 6.067872 0.067872047424316406 0.0046066148215686553 +128 7 5.829576 1.1704239845275879 1.3698923035574353 +129 6 5.54122353 0.45877647399902344 0.21047585309497663 +131 7 6.016204 0.98379611968994141 0.96785480511698552 +132 5 5.54468775 0.54468774795532227 0.29668474277264067 +133 5 5.73237562 0.7323756217956543 0.53637405140057126 +137 5 5.354897 0.35489702224731445 0.12595189640001081 +138 7 6.41750956 0.58249044418334961 0.33929511756491593 +141 5 5.354897 0.35489702224731445 0.12595189640001081 +144 6 5.879665 0.12033510208129883 0.01448053679291661 +145 6 5.90592957 0.0940704345703125 0.0088492466602474451 +147 4 4.823642 0.82364177703857422 0.67838577688326041 +150 7 6.3178277 0.68217229843139648 0.46535904474717427 +151 6 5.796888 0.20311212539672852 0.041254535483176369 +152 6 5.55071 0.44928979873657227 0.20186132324874961 +154 6 4.951878 1.0481219291687012 1.0985595784043198 +156 6 5.969942 0.030057907104492188 0.00090347777950228192 +161 5 5.775102 0.77510213851928711 0.60078332513717214 +164 5 5.67818975 0.67818975448608398 0.45994134308989487 +167 7 6.794436 0.20556402206420898 0.042256567167214598 +169 5 4.723493 0.27650690078735352 0.07645606618302736 +171 6 6.231303 0.23130321502685547 0.053501177281759738 +173 7 6.71465445 0.28534555435180664 0.081422085388339838 +174 5 5.489743 0.48974323272705078 0.23984843400194222 +176 4 6.449584 2.4495840072631836 6.0004618086395567 +177 5 5.73423433 0.73423433303833008 0.53910005581224141 +179 6 5.376075 0.62392520904541016 0.38928266648235876 +180 6 5.22496128 0.77503871917724609 0.60068501622390613 +181 5 5.33182955 0.33182954788208008 0.11011084884762568 +183 6 5.68878937 0.31121063232421875 0.096852057671640068 +187 5 5.94741631 0.94741630554199219 0.8975976560068375 +188 8 6.721152 1.2788481712341309 1.6354526450688809 +189 4 5.49590731 1.4959073066711426 2.2377386701521118 +191 5 5.38427973 0.38427972793579102 0.14767090930240556 +192 6 6.1925 0.19250011444091797 0.037056294059766515 +196 5 5.462054 0.46205377578735352 0.21349369171934995 +198 5 5.19289637 0.19289636611938477 0.037209008062063731 +199 5 5.216614 0.21661376953125 0.046921525150537491 +201 5 5.19289637 0.19289636611938477 0.037209008062063731 +202 5 5.158807 0.15880680084228516 0.025219599993761221 +204 4 5.766838 1.7668380737304688 3.1217167787835933 +205 5 5.790984 0.79098415374755859 0.62565593147974141 +206 5 5.788785 0.78878498077392578 0.62218174589452246 +207 4 5.0619545 1.0619544982910156 1.1277473564405227 +209 6 5.43237972 0.56762027740478516 0.32219277932108525 +210 5 5.047247 0.047246932983398438 0.0022322726763377432 +211 7 6.75930071 0.24069929122924805 0.057936148798262366 +212 5 5.788785 0.78878498077392578 0.62218174589452246 +216 5 6.03553057 1.0355305671691895 1.0723235555417432 +218 5 5.365101 0.36510086059570313 0.13329863840772305 +219 5 6.1874404 1.1874403953552246 1.4100146925213721 +223 6 5.63581467 0.36418533325195313 0.13263095695583615 +226 6 5.96993542 0.030064582824707031 0.00090387914042366901 +228 6 5.96993542 0.030064582824707031 0.00090387914042366901 +233 6 6.032256 0.032256126403808594 0.0010404576905784779 +237 6 5.58524275 0.41475725173950195 0.1720235778705046 +239 6 5.646391 0.35360908508300781 0.12503938505324186 +240 5 5.04183674 0.041836738586425781 0.0017503126955489279 +241 5 5.80289364 0.80289363861083984 0.64463819492175389 +242 7 6.52401257 0.47598743438720703 0.22656403769451572 +244 5 5.1631465 0.1631464958190918 0.026616779098048937 +246 7 6.84524536 0.154754638671875 0.023948998190462589 +247 7 5.84106064 1.1589393615722656 1.3431404438015306 +248 7 5.93824673 1.0617532730102539 1.1273200127479868 +249 5 5.282788 0.28278779983520508 0.079968939735636013 +250 4 4.86858034 0.86858034133911133 0.75443180936076715 +252 5 5.1631465 0.1631464958190918 0.026616779098048937 +254 6 5.5868516 0.41314840316772461 0.17069160304004072 +257 7 5.734293 1.2657070159912109 1.6020142503293755 +258 6 6.62694263 0.62694263458251953 0.39305706705727061 +259 4 4.29258347 0.29258346557617188 0.085605084328562953 +260 6 6.35282 0.35281991958618164 0.12448189565679968 +262 5 5.519015 0.51901483535766602 0.26937639932134516 +267 5 5.42426062 0.42426061630249023 0.17999707054536884 +268 6 5.42426062 0.57573938369750977 0.33147583794038837 +269 6 5.49771452 0.50228548049926758 0.25229070392038011 +271 5 5.63827229 0.63827228546142578 0.4073915103881518 +272 5 5.35147762 0.35147762298583984 0.12353651945977617 +275 6 6.05495071 0.054950714111328125 0.0030195809813449159 +276 6 6.143008 0.14300823211669922 0.020451354453143722 +277 5 4.38187933 0.61812067031860352 0.38207316307511974 +278 4 5.10659647 1.1065964698791504 1.2245557471489974 +279 7 6.1854105 0.81458950042724609 0.66355605420631036 +280 8 6.72976446 1.270235538482666 1.6134983232243485 +283 5 5.426278 0.42627811431884766 0.18171303074723255 +284 5 5.36907625 0.36907625198364258 0.13621727977829323 +285 5 5.147811 0.14781093597412109 0.021848072793545725 +288 7 6.302693 0.69730710983276367 0.48623720542332194 +290 7 6.302693 0.69730710983276367 0.48623720542332194 +291 6 6.182142 0.18214178085327148 0.033175628332401175 +293 7 5.923005 1.0769948959350586 1.1599180058701677 +296 5 5.05519533 0.055195331573486328 0.0030465246275070967 +297 7 6.49540234 0.50459766387939453 0.25461880239254242 +299 6 6.12447357 0.12447357177734375 0.015493670071009547 +300 6 5.95414829 0.045851707458496094 0.0021023790768595063 +301 6 5.298424 0.70157623291015625 0.49220921058440581 +303 6 5.63807344 0.36192655563354492 0.13099083167276149 +304 6 5.45552254 0.54447746276855469 0.29645570746288286 +308 7 5.828621 1.1713790893554688 1.3721289709792472 +309 6 5.78201675 0.21798324584960938 0.047516695471131243 +311 8 5.948389 2.0516109466552734 4.2091074764357472 +312 6 5.93200827 0.067991733551025391 0.0046228758312736318 +314 5 5.734013 0.73401308059692383 0.5387752024873862 +316 6 6.06090975 0.060909748077392578 0.0037099974108514289 +317 5 6.01898 1.0189800262451172 1.0383202938864997 +319 6 6.042424 0.042424201965332031 0.0017998129123952822 +321 5 6.01898 1.0189800262451172 1.0383202938864997 +323 6 5.88778448 0.11221551895141602 0.012592322693535607 +327 6 5.53253555 0.46746444702148438 0.21852300922910217 +328 6 5.698133 0.30186700820922852 0.091123690645190436 +329 5 5.96683931 0.96683931350708008 0.93477825814284188 +331 5 6.11903 1.1190299987792969 1.2522281381679932 +332 6 5.995608 0.0043921470642089844 1.92909558336396E-05 +333 5 5.879673 0.87967300415039063 0.77382459423097316 +336 6 6.19445658 0.19445657730102539 0.037813360455629663 +338 5 5.92611265 0.92611265182495117 0.85768464387024324 +343 5 5.8768 0.8768000602722168 0.76877834569336301 +344 6 6.03104544 0.031045436859130859 0.00096381914977428096 +346 7 5.946189 1.0538110733032227 1.1105177782164901 +347 6 6.44402266 0.44402265548706055 0.19715611858578086 +348 6 6.000975 0.00097513198852539063 9.5088239504548255E-07 +349 5 5.837654 0.83765411376953125 0.7016644143150188 +350 7 7.38578367 0.38578367233276367 0.14882904183855317 +352 6 5.3894496 0.6105504035949707 0.37277179532998161 +353 7 6.588947 0.41105318069458008 0.1689647173591311 +354 6 5.7112484 0.28875160217285156 0.083377487757388735 +355 6 6.368937 0.36893701553344727 0.13611452143072711 +358 6 5.21193743 0.78806257247924805 0.62104261814261008 +360 6 5.77032 0.22968006134033203 0.052752930577298685 +361 5 4.94997835 0.050021648406982422 0.0025021653093517671 +366 6 5.51550245 0.4844975471496582 0.23473787319403527 +368 6 5.511029 0.48897123336791992 0.2390928670613448 +370 6 5.15915 0.84084987640380859 0.70702851464830019 +371 6 5.511029 0.48897123336791992 0.2390928670613448 +373 6 5.628817 0.37118291854858398 0.13777675902224473 +376 7 5.75248051 1.2475194931030273 1.5563048856720343 +377 7 5.87503767 1.124962329864502 1.2655402436141685 +378 6 5.430989 0.56901121139526367 0.32377375869350544 +379 7 5.75248051 1.2475194931030273 1.5563048856720343 +381 6 5.49459362 0.50540637969970703 0.25543560864116444 +383 6 5.628817 0.37118291854858398 0.13777675902224473 +384 7 6.51569 0.48431015014648438 0.23455632153491024 +387 5 5.08900166 0.089001655578613281 0.0079212946957341046 +388 6 5.79040861 0.20959138870239258 0.043928550218197415 +389 7 5.79391527 1.2060847282409668 1.4546403716960867 +391 5 5.36205149 0.36205148696899414 0.13108127921645973 +392 6 4.892251 1.1077489852905273 1.227107814412193 +395 5 4.885891 0.11410903930664063 0.013020872851484455 +396 5 6.08122444 1.0812244415283203 1.1690462929582282 +398 5 5.343458 0.34345817565917969 0.11796351842713193 +399 6 6.66167355 0.66167354583740234 0.43781188126104098 +404 6 6.83485031 0.83485031127929688 0.69697504224313889 +406 7 7.377054 0.37705421447753906 0.14216988065527403 +409 5 6.08122444 1.0812244415283203 1.1690462929582282 +413 5 5.92827368 0.92827367782592773 0.86169202094447428 +414 6 5.657659 0.34234094619750977 0.11719732344340628 +415 6 6.120452 0.12045192718505859 0.014508666762594657 +416 6 5.685086 0.31491422653198242 0.099170970072236742 +418 6 5.685086 0.31491422653198242 0.099170970072236742 +419 6 5.96859169 0.031408309936523438 0.0009864819330687169 +422 6 5.964954 0.035046100616455078 0.001228229168418693 +423 6 5.964954 0.035046100616455078 0.001228229168418693 +428 5 5.70770168 0.70770168304443359 0.50084167218392395 +429 5 5.161595 0.16159486770629883 0.02611290126901622 +430 5 5.31656456 0.31656455993652344 0.10021312060780474 +434 8 6.928819 1.0711808204650879 1.1474283501322589 +436 5 5.35035944 0.35035943984985352 0.12275173709190312 +439 5 5.11043 0.11042976379394531 0.012194732731586555 +440 7 6.18897438 0.81102561950683594 0.65776255549644702 +441 6 5.71624041 0.28375959396362305 0.080519507166400217 +442 8 7.28845739 0.71154260635375977 0.50629288065670153 +449 7 6.21131849 0.7886815071105957 0.62201851965824062 +450 5 5.318568 0.31856822967529297 0.10148571695845021 +451 5 5.7516017 0.7516016960144043 0.564905109451729 +452 7 5.77642059 1.2235794067382813 1.4971465645940043 +453 7 6.491666 0.50833415985107422 0.25840361807149748 +454 7 6.21131849 0.7886815071105957 0.62201851965824062 +455 6 5.854044 0.14595603942871094 0.021303165445715422 +456 7 6.70512962 0.29487037658691406 0.086948538988508517 +457 5 5.45710325 0.45710325241088867 0.2089433833646126 +464 5 4.90521431 0.094785690307617188 0.0089843270870915148 +465 5 5.896737 0.89673709869384766 0.80413742417385947 +466 6 5.90757847 0.092421531677246094 0.0085417395175682032 +467 6 5.37867832 0.62132167816162109 0.38604062775357306 +474 6 5.72567129 0.27432870864868164 0.075256240388853257 +480 5 5.301491 0.30149078369140625 0.090896692650858313 +482 5 5.72171164 0.72171163558959961 0.52086768494541502 +483 5 5.301491 0.30149078369140625 0.090896692650858313 +484 5 5.525054 0.52505397796630859 0.27568167977824487 +487 6 5.93644571 0.063554286956787109 0.0040391473905856401 +489 6 5.572881 0.42711877822875977 0.18243045071562847 +492 6 5.95695925 0.043040752410888672 0.001852506368095419 +493 6 6.18003654 0.18003654479980469 0.03241315746345208 +495 6 6.223172 0.22317218780517578 0.04980582540974865 +497 6 6.77364969 0.77364969253540039 0.59853384676011956 +501 6 6.0556283 0.055628299713134766 0.0030945077289743494 +502 6 4.97781563 1.0221843719482422 1.0448608902552223 +504 6 6.21441841 0.21441841125488281 0.045975255085068056 +507 7 6.07226849 0.92773151397705078 0.86068576202615077 +510 6 4.95028734 1.0497126579284668 1.1018966642152463 +513 6 5.163256 0.83674383163452148 0.70014023977842044 +514 7 5.956624 1.0433759689331055 1.0886334125470967 +517 6 6.57721233 0.57721233367919922 0.33317407815138722 +519 5 4.88908 0.11091995239257813 0.012303235838771798 +520 5 5.1877284 0.1877284049987793 0.035241954043385704 +521 5 5.1877284 0.1877284049987793 0.035241954043385704 +522 6 6.216381 0.21638107299804688 0.04682076875178609 +523 6 6.435857 0.43585681915283203 0.18997116680202453 +527 6 6.677373 0.67737293243408203 0.45883408959434746 +528 6 6.649248 0.64924812316894531 0.42152312543839798 +529 6 6.803005 0.80300521850585938 0.64481738094764296 +531 5 5.847043 0.84704303741455078 0.71748190723246807 +532 6 5.828606 0.17139387130737305 0.029375859121728354 +533 6 5.828606 0.17139387130737305 0.029375859121728354 +534 6 5.828606 0.17139387130737305 0.029375859121728354 +535 5 5.31806469 0.31806468963623047 0.10116514679339161 +538 5 5.6805687 0.68056869506835938 0.46317374870704953 +539 6 4.66531754 1.3346824645996094 1.7813772813096875 +540 4 5.62447166 1.6244716644287109 2.6389081885317864 +541 5 4.80980158 0.19019842147827148 0.036175439532826204 +544 6 5.198272 0.8017277717590332 0.64276742000970444 +546 6 6.07615852 0.076158523559570313 0.0058001207107736263 +547 6 4.63071346 1.3692865371704102 1.874945620876133 +548 7 6.027543 0.97245693206787109 0.94567248472685606 +549 5 4.80980158 0.19019842147827148 0.036175439532826204 +557 6 5.579116 0.42088413238525391 0.17714345289368794 +558 5 5.648824 0.64882421493530273 0.42097286188641192 +559 6 7.030506 1.0305061340332031 1.061942892280058 +560 7 5.983154 1.0168461799621582 1.0339761537036338 +561 5 5.2358346 0.23583459854125977 0.055617957869117163 +563 7 5.19892454 1.8010754585266113 3.2438728073068432 +565 6 5.939111 0.060888767242431641 0.0037074419763030164 +566 6 4.47719574 1.5228042602539063 2.3189328150474466 +569 6 5.248791 0.75120878219604492 0.56431463444846486 +577 7 6.69894743 0.30105257034301758 0.090632650110137547 +578 7 6.661803 0.33819723129272461 0.11437736725406467 +581 5 5.480605 0.48060512542724609 0.23098128658693895 +582 6 5.367171 0.63282918930053711 0.40047278283077503 +584 7 6.44490433 0.55509567260742188 0.30813120574748609 +586 6 5.640957 0.35904312133789063 0.12891196298005525 +590 5 5.35784769 0.35784769058227539 0.12805496965506791 +593 5 5.30848074 0.30848073959350586 0.095160366700156374 +594 5 5.211274 0.21127414703369141 0.044636765204813855 +600 6 5.588999 0.41100120544433594 0.16892199087669724 +602 5 5.30848074 0.30848073959350586 0.095160366700156374 +604 6 5.71898746 0.28101253509521484 0.078968044880639354 +606 5 5.71843529 0.71843528747558594 0.51614926229012781 +607 5 5.71843529 0.71843528747558594 0.51614926229012781 +609 6 5.544185 0.45581483840942383 0.20776716691420916 +612 5 5.36357164 0.3635716438293457 0.13218434019677261 +613 5 5.486784 0.48678398132324219 0.2369586444729066 +614 5 5.486784 0.48678398132324219 0.2369586444729066 +617 6 5.683154 0.31684589385986328 0.10039132045585575 +618 6 5.783254 0.21674585342407227 0.046978764976529419 +619 6 5.98480844 0.015191555023193359 0.00023078334402271139 +621 5 5.4160533 0.41605329513549805 0.17310034439310584 +622 6 6.07667 0.076670169830322266 0.0058783149418104585 +624 5 5.22469759 0.22469758987426758 0.050489006895304556 +627 6 5.40007 0.5999298095703125 0.35991577641107142 +629 6 5.81221437 0.18778562545776367 0.0352634411285635 +633 5 5.39136028 0.39136028289794922 0.15316287102996284 +634 6 6.59777164 0.59777164459228516 0.35733093907856528 +638 5 5.072482 0.072482109069824219 0.0052536561352098943 +639 5 4.970767 0.029232978820800781 0.00085456705073738704 +641 4 5.53252 1.5325198173522949 2.3486169905775114 +642 6 5.80048943 0.19951057434082031 0.039804469273803988 +644 5 5.50555658 0.50555658340454102 0.25558745902367264 +645 5 5.36433029 0.36433029174804688 0.13273656148521695 +649 7 6.382847 0.61715316772460938 0.38087803243251983 +652 7 6.382847 0.61715316772460938 0.38087803243251983 +653 6 5.39073658 0.60926342010498047 0.37120191507801792 +654 7 7.006134 0.006134033203125 3.7626363337039948E-05 +656 6 6.008372 0.0083718299865722656 7.0087537324070581E-05 +657 5 5.15175724 0.15175724029541016 0.02303025998207886 +660 5 5.216773 0.21677303314208984 0.046990547897621582 +661 7 7.137654 0.13765382766723633 0.018948576271441198 +665 5 5.23176527 0.2317652702331543 0.053715140486247037 +668 6 5.657085 0.34291505813598633 0.11759073709640688 +670 6 5.345273 0.65472698211669922 0.42866742111164058 +678 7 6.815811 0.1841888427734375 0.03392552980221808 +679 7 6.815811 0.1841888427734375 0.03392552980221808 +680 5 4.949763 0.050237178802490234 0.0025237741340333741 +681 5 4.90691662 0.093083381652832031 0.0086645159399267868 +682 6 5.310383 0.68961715698242188 0.4755718232045183 +683 5 5.57668543 0.57668542861938477 0.33256608358192352 +685 5 5.48237133 0.48237133026123047 0.23268210025798908 +688 6 5.55162239 0.44837760925292969 0.2010424804793729 +689 7 6.42106438 0.57893562316894531 0.33516645577401505 +691 6 4.88665342 1.1133465766906738 1.2395405998288425 +692 5 5.15047026 0.15047025680541992 0.02264129818308902 +693 5 5.30301332 0.30301332473754883 0.091817074968503221 +694 6 5.21851873 0.78148126602172852 0.61071296914292361 +696 6 6.50944328 0.50944328308105469 0.25953245867640362 +697 5 5.558616 0.55861616134643555 0.31205201571742691 +698 5 5.558616 0.55861616134643555 0.31205201571742691 +700 5 4.836711 0.16328907012939453 0.026663320423722325 +702 4 5.14076853 1.1407685279846191 1.3013528344401948 +704 6 6.58592939 0.58592939376831055 0.34331325448169991 +705 5 4.44670725 0.55329275131225586 0.30613286865468581 +706 5 5.4099164 0.40991640090942383 0.16803145573453548 +707 6 6.31098175 0.31098175048828125 0.096709649136755615 +711 6 6.45854139 0.4585413932800293 0.2102602093511905 +712 6 6.45854139 0.4585413932800293 0.2102602093511905 +714 6 5.98270941 0.017290592193603516 0.00029896457840550283 +718 7 6.532272 0.4677281379699707 0.21876961104885595 +719 7 6.13225555 0.86774444580078125 0.75298042321810499 +720 5 5.08321571 0.083215713500976563 0.0069248549734766129 +721 5 5.865369 0.86536884307861328 0.74886323457121762 +722 6 6.39147 0.39146995544433594 0.15324872601559036 +723 8 6.789572 1.2104282379150391 1.4651365191421064 +724 7 5.677485 1.3225150108337402 1.749045953880568 +725 5 5.19655752 0.19655752182006836 0.038634859384046649 +726 7 6.88660955 0.11339044570922852 0.012857393178137499 +727 5 5.500728 0.50072813034057617 0.25072866051436904 +728 5 5.98868656 0.98868656158447266 0.97750111705772724 +729 5 4.834835 0.16516494750976563 0.027279459885903634 +732 7 4.74686766 2.2531323432922363 5.0766053563895639 +735 6 5.548644 0.45135593414306641 0.2037221792861601 +738 7 6.321803 0.67819690704345703 0.4599510447233115 +749 6 6.13887072 0.1388707160949707 0.019285075788729955 +752 6 5.745285 0.2547149658203125 0.064879713812842965 +757 6 5.58691835 0.41308164596557617 0.17063644623362961 +758 7 6.400842 0.59915781021118164 0.35899008153705836 +760 6 6.033177 0.033176898956298828 0.0011007066243564623 +761 6 5.963089 0.0369110107421875 0.001362422714009881 +764 6 5.44656 0.55344009399414063 0.30629593764024321 +765 6 5.75111437 0.2488856315612793 0.061944057597656865 +770 7 6.303649 0.69635105133056641 0.48490478668918513 +773 5 5.756574 0.75657415390014648 0.57240445034972254 +774 9 5.68372965 3.3162703514099121 10.997649043640422 +778 7 5.64314938 1.3568506240844727 1.8410436160784229 +779 8 6.50265 1.4973502159118652 2.2420576690913094 +780 4 4.171287 0.17128705978393555 0.02933925684942551 +781 6 5.375076 0.6249241828918457 0.39053023436304102 +782 7 5.64314938 1.3568506240844727 1.8410436160784229 +783 8 6.50265 1.4973502159118652 2.2420576690913094 +784 5 5.41523933 0.41523933410644531 0.17242370458916412 +785 6 5.943398 0.056602001190185547 0.0032037865387337661 +786 6 5.822032 0.17796802520751953 0.031672617996264307 +788 7 5.913982 1.0860180854797363 1.1794352819890719 +792 5 5.467223 0.46722316741943359 0.21829748817344807 +794 5 5.26649475 0.2664947509765625 0.07101945229806006 +795 5 5.21801758 0.218017578125 0.047531664371490479 +799 8 6.57892227 1.4210777282714844 2.0194619097892428 +802 5 5.40743256 0.40743255615234375 0.16600128781283274 +806 5 5.651162 0.65116214752197266 0.42401214236542728 +810 5 5.35292768 0.35292768478393555 0.12455795068694897 +816 5 5.17684269 0.17684268951416016 0.03127333683460165 +817 5 5.002493 0.0024929046630859375 6.2145736592356116E-06 +819 5 5.002493 0.0024929046630859375 6.2145736592356116E-06 +821 6 5.21509266 0.78490734100341797 0.61607953396105586 +826 6 6.08280659 0.082806587219238281 0.0068569308868973167 +827 9 6.580013 2.4199872016906738 5.856338056346658 +829 7 6.318461 0.68153905868530273 0.46449548851364852 +836 8 6.86261654 1.1373834609985352 1.2936411373530063 +838 8 6.86261654 1.1373834609985352 1.2936411373530063 +840 7 6.16398954 0.83601045608520508 0.69891348268379261 +841 7 6.03430843 0.96569156646728516 0.93256020154603902 +845 8 6.69226837 1.3077316284179688 1.7101620119647123 +848 7 6.03430843 0.96569156646728516 0.93256020154603902 +850 7 6.313141 0.686859130859375 0.47177546564489603 +851 5 5.332034 0.33203411102294922 0.11024665088280017 +854 7 6.52222 0.47777986526489258 0.22827359965253891 +855 7 5.93773556 1.0622644424438477 1.1284057456805385 +856 5 5.332034 0.33203411102294922 0.11024665088280017 +858 7 5.82581425 1.1741857528686523 1.3787121822397239 +859 5 5.48504925 0.48504924774169922 0.2352727727347883 +860 8 6.057407 1.9425930976867676 3.7736679431802713 +861 7 5.526988 1.4730119705200195 2.1697642652952709 +862 6 6.006587 0.0065870285034179688 4.3388944504840765E-05 +863 6 6.365287 0.36528682708740234 0.13343446604358178 +864 5 6.02387047 1.0238704681396484 1.0483107355285028 +870 5 4.99397 0.0060300827026367188 3.6361897400638554E-05 +871 5 5.05771 0.057710170745849609 0.0033304638075151161 +872 6 5.71040344 0.2895965576171875 0.083866166183724999 +874 5 5.3424654 0.34246540069580078 0.11728255067373539 +876 9 6.88309 2.1169099807739258 4.4813078667002628 +881 6 4.92345238 1.0765476226806641 1.1589547838993894 +885 7 6.233847 0.76615285873413086 0.58699020294648108 +887 7 6.67779875 0.32220125198364258 0.10381364677982674 +888 6 6.02012634 0.0201263427734375 0.00040506967343389988 +890 6 5.569731 0.43026876449584961 0.18513120970078489 +895 6 5.936211 0.063788890838623047 0.0040690225944217673 +896 6 5.90148973 0.098510265350341797 0.0097042723793947516 +898 6 5.175413 0.82458686828613281 0.67994350334993214 +900 7 6.22928333 0.77071666717529297 0.59400418106179131 +902 5 5.566873 0.56687307357788086 0.32134508154763353 +904 8 5.84905863 2.1509413719177246 4.6265487854273033 +906 4 4.528229 0.5282292366027832 0.27902612640195912 +908 4 5.4986105 1.4986104965209961 2.2458334202829064 +910 5 5.32466364 0.32466363906860352 0.10540647853326846 +912 5 5.38664961 0.38664960861206055 0.14949791983985961 +914 4 4.99963474 0.99963474273681641 0.99926961888650112 +918 6 6.35297775 0.35297775268554688 0.12459329389093909 +919 7 5.619564 1.3804359436035156 1.9056033943925286 +920 7 5.61330652 1.3866934776306152 1.9229188009032896 +921 6 5.527122 0.47287797927856445 0.22361358328657843 +924 8 6.40640163 1.5935983657836914 2.5395557514284519 +925 5 5.11208773 0.11208772659301758 0.01256365845279106 +926 5 4.7834034 0.21659660339355469 0.046914088601624826 +927 7 5.36317968 1.6368203163146973 2.6791807479005456 +930 7 5.91567659 1.0843234062194824 1.1757572492754207 +934 5 5.56775 0.56774997711181641 0.32234003651046805 +935 5 5.555936 0.55593585968017578 0.3090646800783361 +936 5 4.933273 0.066727161407470703 0.0044525140694986476 +937 5 5.413934 0.41393423080444336 0.17134154743166619 +938 6 5.60947943 0.39052057266235352 0.15250631767253253 +940 5 5.297755 0.29775476455688477 0.08865789981632588 +944 7 5.64300871 1.3569912910461426 1.8414253639750768 +950 5 5.191386 0.19138622283935547 0.036628686292715429 +953 5 5.78504562 0.78504562377929688 0.61629663141502533 +955 5 5.191386 0.19138622283935547 0.036628686292715429 +956 5 5.052131 0.052131175994873047 0.0027176595106084278 +958 7 5.82465935 1.1753406524658203 1.3814256493387802 +959 6 5.92871237 0.071287631988525391 0.0050819264745314285 +960 6 5.92871237 0.071287631988525391 0.0050819264745314285 +964 6 5.323346 0.67665386199951172 0.45786044895885425 +965 5 5.942498 0.94249820709228516 0.88830287037217204 +968 7 7.037116 0.037116050720214844 0.0013776012210655608 +969 7 5.911967 1.0880331993103027 1.183816242801413 +970 7 6.416778 0.5832219123840332 0.3401477990848889 +971 7 6.362315 0.63768482208251953 0.40664193231441459 +972 6 5.766083 0.233917236328125 0.054717273451387882 +974 6 6.990531 0.99053096771240234 0.98115159799726825 +976 6 6.241904 0.24190378189086914 0.058517439693105189 +980 6 5.416485 0.58351516723632813 0.34048995039483998 +982 6 6.43619442 0.43619441986083984 0.19026557191773463 +983 6 6.454488 0.45448780059814453 0.20655916089253878 +985 6 6.32975 0.32975006103515625 0.10873510275268927 +986 6 5.70133448 0.29866552352905273 0.089201094944883152 +989 7 5.61717 1.3828301429748535 1.9122192043198538 +992 5 5.94553471 0.94553470611572266 0.89403588046934601 +994 6 5.551492 0.44850778579711914 0.20115923392063451 +995 6 5.62143946 0.37856054306030273 0.14330808476211132 +997 6 5.558929 0.4410710334777832 0.19454365657315975 +998 6 5.70035934 0.29964065551757813 0.089784522439003922 +999 7 5.83896065 1.1610393524169922 1.3480123778608686 +1002 6 5.30784845 0.69215154647827148 0.47907376329226281 +1004 6 7.126438 1.1264381408691406 1.2688628852047259 +1006 6 7.126438 1.1264381408691406 1.2688628852047259 +1007 5 5.103116 0.10311603546142578 0.010632916769282019 +1015 5 5.09258461 0.092584609985351563 0.0085719100061396603 +1016 5 5.404233 0.40423297882080078 0.16340430116633797 +1017 6 5.70289135 0.29710865020751953 0.088273550028134196 +1018 6 6.281246 0.28124618530273438 0.079099416747340001 +1021 7 6.380373 0.61962699890136719 0.38393761776751489 +1025 6 6.22872925 0.228729248046875 0.052317068912088871 +1026 6 6.624846 0.62484598159790039 0.39043250071904367 +1027 4 4.34852028 0.34852027893066406 0.12146638482590788 +1030 6 6.000875 0.00087499618530273438 7.6561832429433707E-07 +1032 6 4.932675 1.0673251152038574 1.1391829015449275 +1033 6 4.932675 1.0673251152038574 1.1391829015449275 +1034 3 4.823845 1.8238449096679688 3.3264102545217611 +1037 5 4.860711 0.13928890228271484 0.019401398299123684 +1039 5 5.60733747 0.60733747482299805 0.36885880832437579 +1040 4 4.965731 0.96573114395141602 0.9326366423977106 +1044 7 5.986146 1.0138540267944336 1.0278999876472881 +1045 5 6.377755 1.3777551651000977 1.8982092949599974 +1047 5 3.98646641 1.0135335922241211 1.027250342566731 +1049 6 7.03259325 1.0325932502746582 1.0662488205127829 +1051 6 5.550454 0.44954586029052734 0.20209148050435033 +1052 5 5.950327 0.95032691955566406 0.90312125403215759 +1053 4 5.15795135 1.1579513549804688 1.3408513405011036 +1054 5 3.98646641 1.0135335922241211 1.027250342566731 +1058 6 5.71832275 0.28167724609375 0.079342070966959 +1059 4 5.272726 1.2727260589599609 1.619831621155754 +1060 7 6.133465 0.86653518676757813 0.7508832299063215 +1061 5 5.57759333 0.57759332656860352 0.33361405089658547 +1064 6 5.817982 0.18201780319213867 0.033130480678892127 +1065 5 5.710365 0.71036481857299805 0.50461817546624843 +1068 7 5.31932449 1.6806755065917969 2.8246701584575931 +1069 6 6.440941 0.44094085693359375 0.19442883931333199 +1071 5 5.710365 0.71036481857299805 0.50461817546624843 +1072 7 5.837095 1.162905216217041 1.3523485419048029 +1074 6 4.92468357 1.0753164291381836 1.1563054227744942 +1075 7 6.41403961 0.58596038818359375 0.34334957652026787 +1076 6 5.850889 0.14911079406738281 0.022234028907405445 +1077 5 5.840539 0.84053897857666016 0.70650577450669516 +1079 6 5.75533962 0.24466037750244141 0.059858700319637137 +1080 7 5.96626854 1.0337314605712891 1.0686007325748506 +1082 6 5.46353149 0.536468505859375 0.28779845777899027 +1083 6 6.08476448 0.084764480590820313 0.0071850171698315535 +1084 7 6.05763674 0.94236326217651367 0.88804851789996064 +1085 5 4.6782937 0.32170629501342773 0.1034949402512666 +1086 8 6.900887 1.0991129875183105 1.2080493593314259 +1088 6 6.08476448 0.084764480590820313 0.0071850171698315535 +1090 6 5.80458975 0.19541025161743164 0.038185166437187945 +1091 6 6.049824 0.049824237823486328 0.0024824546746913256 +1092 6 6.16954374 0.16954374313354492 0.028745080835733461 +1094 5 5.402039 0.4020390510559082 0.16163539857393516 +1095 8 6.64956951 1.3504304885864258 1.8236625045037727 +1098 6 6.14059544 0.14059543609619141 0.019767076651078241 +1099 7 7.001953 0.001953125 3.814697265625E-06 +1100 6 5.46353149 0.536468505859375 0.28779845777899027 +1101 6 6.53630066 0.5363006591796875 0.28761839703656733 +1103 5 4.507545 0.49245500564575195 0.24251193258555759 +1112 6 5.460754 0.5392460823059082 0.29078633728227032 +1119 5 4.88808155 0.11191844940185547 0.012525739316515683 +1122 7 6.77279854 0.22720146179199219 0.051620504240418086 +1125 6 4.8543334 1.1456665992736816 1.3125519566913226 +1126 7 7.052003 0.052002906799316406 0.0027043023155783885 +1129 7 6.24118137 0.75881862640380859 0.57580570777736284 +1130 6 6.008379 0.0083789825439453125 7.0207348471740261E-05 +1133 5 5.064787 0.064786911010742188 0.0041973438383138273 +1134 5 5.540143 0.54014301300048828 0.29175447449324565 +1135 6 5.733244 0.26675605773925781 0.071158794340590248 +1136 8 6.59698 1.403019905090332 1.9684648540796843 +1137 8 7.1152873 0.88471269607543945 0.7827165545970729 +1138 5 4.96683359 0.033166408538818359 0.0011000106553638034 +1140 6 5.66273642 0.33726358413696289 0.11374672518491025 +1141 5 5.32665348 0.32665348052978516 0.10670249634222273 +1143 5 5.807357 0.80735683441162109 0.65182505807115376 +1144 5 5.72894239 0.7289423942565918 0.53135701414453251 +1146 5 5.34848356 0.34848356246948242 0.12144079331142166 +1147 5 5.131541 0.13154077529907227 0.01730297556628102 +1148 6 6.152261 0.15226078033447266 0.023183345228062535 +1151 5 5.07304573 0.073045730590820313 0.0053356787575467024 +1153 6 5.74105072 0.25894927978515625 0.067054729501251131 +1155 4 6.077269 2.0772690773010254 4.3150468195110534 +1158 6 5.679586 0.32041406631469727 0.10266517389231922 +1159 6 5.75055456 0.24944543838500977 0.062223026731089703 +1164 6 5.40722132 0.59277868270874023 0.35138656667390933 +1165 5 6.2800765 1.2800765037536621 1.6385958554621993 +1166 5 5.0108695 0.010869503021240234 0.00011814609592875058 +1168 5 6.047814 1.047813892364502 1.0979139530320481 +1169 6 5.86063862 0.13936138153076172 0.019421594662162533 +1170 6 5.34022427 0.65977573394775391 0.43530401910629735 +1174 6 5.70964 0.2903599739074707 0.084308914447547068 +1175 5 5.29879236 0.29879236221313477 0.089276875716905124 +1177 6 5.775562 0.22443819046020508 0.05037250133705129 +1181 6 5.288253 0.71174716949462891 0.50658403328361601 +1182 5 6.285735 1.2857351303100586 1.6531148253134234 +1184 7 7.01639 0.016389846801757813 0.0002686270781850908 +1186 5 5.29342175 0.29342174530029297 0.086096320615069999 +1187 8 6.35788059 1.6421194076538086 2.6965561489932952 +1191 7 6.31105661 0.68894338607788086 0.474642989220456 +1195 6 5.87646532 0.1235346794128418 0.015260817017633599 +1198 6 5.535099 0.46490097045898438 0.21613291233370546 +1199 7 5.668652 1.3313479423522949 1.7724873436056896 +1200 6 6.047008 0.047008037567138672 0.0022097555959135207 +1201 7 5.87261152 1.1273884773254395 1.2710047788061729 +1202 5 5.520709 0.52070903778076172 0.27113790202656674 +1204 6 5.744867 0.25513315200805664 0.065092925253566136 +1206 6 5.34409475 0.65590524673461914 0.43021169269400161 +1207 5 5.520709 0.52070903778076172 0.27113790202656674 +1208 6 6.640169 0.64016914367675781 0.40981653251583339 +1210 6 4.49570036 1.5042996406555176 2.2629174088763193 +1212 6 6.1520853 0.15208530426025391 0.023129939771934005 +1213 6 5.744867 0.25513315200805664 0.065092925253566136 +1214 6 4.65929842 1.3407015800476074 1.7974807267421511 +1216 8 7.04643059 0.95356941223144531 0.90929462394342409 +1218 8 6.13147831 1.8685216903686523 3.4913733073781259 +1220 6 5.87119246 0.12880754470825195 0.016591383573768326 +1221 7 7.03517437 0.035174369812011719 0.0012372362916721613 +1229 3 6.334992 3.3349919319152832 11.122171185940033 +1231 7 6.70507526 0.29492473602294922 0.086980599918206281 +1232 7 6.7074585 0.29254150390625 0.085580531507730484 +1233 6 6.8001194 0.80011940002441406 0.64019105429542833 +1234 6 6.546759 0.54675912857055664 0.29894554467523449 +1238 7 6.551763 0.44823694229125977 0.20091635643461814 +1240 6 6.052974 0.052974224090576172 0.0028062684179985808 +1243 7 6.551763 0.44823694229125977 0.20091635643461814 +1246 7 5.836896 1.1631040573120117 1.3528110481356634 +1248 7 5.80520725 1.1947927474975586 1.4275297094727648 +1249 5 4.852862 0.14713811874389648 0.021649625987492982 +1251 5 5.544311 0.5443110466003418 0.29627451545115946 +1253 7 6.491688 0.50831222534179688 0.25838131843192969 +1254 5 6.03563356 1.0356335639953613 1.0725368788737342 +1255 6 5.61970472 0.3802952766418457 0.14462449743609795 +1257 6 5.95382261 0.046177387237548828 0.0021323510920865374 +1259 6 5.75618744 0.24381256103515625 0.059444564918521792 +1260 6 5.590599 0.40940093994140625 0.16760912962490693 +1261 6 5.6954813 0.30451869964599609 0.092731638434088381 +1263 6 4.91215 1.0878500938415527 1.1834178266710751 +1265 7 5.631242 1.3687582015991211 1.8734990144448602 +1266 8 6.702181 1.2978191375732422 1.6843345138513541 +1268 5 5.42324066 0.42324066162109375 0.17913265764946118 +1269 6 5.73010635 0.26989364624023438 0.072842580280848779 +1274 6 5.73010635 0.26989364624023438 0.072842580280848779 +1277 5 5.42324066 0.42324066162109375 0.17913265764946118 +1280 6 6.709922 0.70992183685302734 0.50398901444077637 +1281 7 6.485117 0.51488304138183594 0.26510454630260938 +1282 5 4.957567 0.042432785034179688 0.0018005412457569037 +1285 6 6.709922 0.70992183685302734 0.50398901444077637 +1290 6 5.946758 0.053242206573486328 0.0028347325608137908 +1291 6 6.065382 0.065382003784179688 0.004274806418834487 +1293 4 4.80942345 0.80942344665527344 0.65516631599530228 +1296 6 6.327094 0.32709407806396484 0.10699053590451513 +1297 7 6.75215244 0.24784755706787109 0.061428411544511619 +1300 6 5.462883 0.53711700439453125 0.2884946764097549 +1301 5 6.1102 1.1101999282836914 1.2325438807611135 +1302 6 5.83469963 0.16530036926269531 0.027324212078383425 +1306 8 6.776491 1.2235088348388672 1.4969738689287624 +1308 6 5.34525156 0.65474843978881836 0.4286955194058919 +1313 5 4.986168 0.01383209228515625 0.00019132677698507905 +1314 6 5.32113028 0.67886972427368164 0.46086410253542454 +1320 6 5.379435 0.62056493759155273 0.38510084176800774 +1323 5 5.58946848 0.58946847915649414 0.34747308791907017 +1324 6 5.761131 0.23886919021606445 0.057058490034478382 +1325 7 6.7117424 0.28825759887695313 0.083092443310306408 +1327 6 5.672103 0.32789707183837891 0.10751648972018302 +1328 6 6.51487637 0.51487636566162109 0.26509767191691935 +1330 5 5.31021452 0.31021451950073242 0.096233048109070296 +1331 6 5.63311625 0.36688375473022461 0.13460368948494761 +1334 6 5.764177 0.23582315444946289 0.055612560174495229 +1336 8 6.128258 1.871741771697998 3.5034172599191606 +1337 5 5.75152 0.75152015686035156 0.56478254616740742 +1338 5 5.75152 0.75152015686035156 0.56478254616740742 +1340 6 5.973752 0.026247978210449219 0.00068895636013621697 +1341 5 4.93071 0.0692901611328125 0.00480112642981112 +1344 8 6.2194767 1.7805233001708984 3.1702632224514673 +1345 8 7.028343 0.97165679931640625 0.94411693565780297 +1346 7 6.610233 0.38976716995239258 0.15191844677269728 +1348 8 6.128258 1.871741771697998 3.5034172599191606 +1350 7 6.45248127 0.54751873016357422 0.2997767598799328 +1354 5 6.381556 1.3815560340881348 1.9086970753253354 +1355 5 5.565555 0.56555509567260742 0.31985256624125213 +1356 6 5.802664 0.19733619689941406 0.038941574606724316 +1361 7 6.167615 0.83238506317138672 0.69286489339083346 +1363 4 5.27680159 1.276801586151123 1.6302222903980237 +1365 7 6.17772865 0.82227134704589844 0.67613016817267635 +1366 6 5.59236765 0.40763235092163086 0.16616413351789561 +1367 5 5.490637 0.49063682556152344 0.24072449459708878 +1370 6 5.50352764 0.49647235870361328 0.24648480295672925 +1372 6 5.22160673 0.77839326858520508 0.60589608057875921 +1373 6 5.22160673 0.77839326858520508 0.60589608057875921 +1375 7 6.76528645 0.23471355438232422 0.055090452610784268 +1379 6 4.334364 1.6656360626220703 2.7743434931071533 +1380 7 6.67767525 0.32232475280761719 0.10389324627249152 +1381 7 6.934968 0.065032005310058594 0.0042291617146474891 +1382 6 4.78057432 1.2194256782531738 1.486998984783213 +1383 6 5.463557 0.53644323348999023 0.28777134275719618 +1384 6 4.730748 1.269251823425293 1.6110001912684311 +1386 7 6.91881466 0.081185340881347656 0.006591059574020619 +1388 7 6.275715 0.72428512573242188 0.52458894335723016 +1389 6 5.81449032 0.18550968170166016 0.034413842005051265 +1393 6 5.76838875 0.23161125183105469 0.053643771974748233 +1394 7 6.91881466 0.081185340881347656 0.006591059574020619 +1395 7 6.602635 0.39736509323120117 0.1578990173186412 +1398 7 5.961599 1.0384011268615723 1.0782769002673831 +1400 7 5.961599 1.0384011268615723 1.0782769002673831 +1403 8 6.53851557 1.461484432220459 2.1359367456227574 +1404 5 4.86699438 0.13300561904907227 0.017690494698626935 +1406 8 5.688696 2.3113040924072266 5.3421266075783933 +1407 6 6.445782 0.44578218460083008 0.19872175610748855 +1408 7 5.961599 1.0384011268615723 1.0782769002673831 +1409 6 5.968728 0.031271934509277344 0.00097793388795253122 +1411 6 6.470186 0.47018623352050781 0.2210750941922015 +1413 6 5.568058 0.43194198608398438 0.18657387934217695 +1416 6 5.71637726 0.28362274169921875 0.080441859608981758 +1419 7 5.735413 1.2645869255065918 1.5991800921622144 +1420 4 5.435072 1.4350719451904297 2.0594314878726436 +1421 6 6.20828724 0.20828723907470703 0.043383573961364164 +1424 6 5.568058 0.43194198608398438 0.18657387934217695 +1425 6 5.89798737 0.10201263427734375 0.010406577552203089 +1426 6 6.426051 0.42605113983154297 0.18151957375175698 +1427 5 6.12100124 1.1210012435913086 1.2566437881332604 +1431 5 5.52014351 0.52014350891113281 0.2705492698623857 +1434 5 6.12100124 1.1210012435913086 1.2566437881332604 +1436 5 4.46587324 0.53412675857543945 0.28529139422630578 +1437 7 6.259091 0.74090909957885742 0.54894629383875326 +1438 5 5.908599 0.90859889984130859 0.82555196079283633 +1439 5 5.26834249 0.26834249496459961 0.072007694603826167 +1440 5 5.372621 0.37262105941772461 0.13884645392158745 +1442 5 5.371896 0.37189579010009766 0.13830647869417589 +1443 6 6.53377056 0.53377056121826172 0.28491101202325808 +1447 6 5.841877 0.15812301635742188 0.025002888301969506 +1456 6 6.359233 0.35923290252685547 0.12904827825786924 +1457 6 6.14253044 0.14253044128417969 0.020314926692662993 +1458 6 6.716283 0.71628284454345703 0.51306111338726623 +1459 6 6.436798 0.436798095703125 0.19079257640987635 +1460 6 6.29338169 0.29338169097900391 0.086072816601699742 +1461 6 5.90714359 0.092856407165527344 0.0086223123516901978 +1462 6 5.841877 0.15812301635742188 0.025002888301969506 +1463 6 5.54711056 0.45288944244384766 0.2051088470770992 +1464 8 6.92592 1.0740799903869629 1.1536478257496583 +1465 5 5.75080967 0.75080966949462891 0.56371515980663389 +1470 7 6.94059563 0.059404373168945313 0.0035288795515953097 +1471 6 6.187877 0.18787717819213867 0.035297834085440627 +1474 4 4.706076 0.70607614517211914 0.49854352278111946 +1478 6 6.05484343 0.054843425750732422 0.0030078013480761001 +1480 6 5.97576237 0.024237632751464844 0.00058746284139488125 +1482 6 5.6252265 0.37477350234985352 0.14045517806357566 +1484 3 5.265096 2.2650961875915527 5.1306607390417867 +1485 6 5.49697828 0.5030217170715332 0.2530308478455936 +1486 6 5.66257668 0.33742332458496094 0.1138544999739679 +1488 6 5.62225533 0.37774467468261719 0.14269103925107629 +1489 5 5.447718 0.44771814346313477 0.20045153598607612 +1492 5 5.587722 0.58772182464599609 0.34541694316521898 +1494 8 6.77752161 1.2224783897399902 1.4944534133812795 +1495 7 6.81155968 0.18844032287597656 0.035509755285602296 +1498 6 5.93317366 0.066826343536376953 0.0044657601904418698 +1502 5 5.409653 0.4096531867980957 0.16781573345383549 +1503 7 6.489947 0.51005315780639648 0.26015422378827679 +1505 7 5.30349255 1.696507453918457 2.8781375412008856 +1506 6 6.09120464 0.091204643249511719 0.0083182869502707035 +1508 6 5.44468641 0.5553135871887207 0.30837318011640491 +1509 5 5.788155 0.78815507888793945 0.62118842837685406 +1510 5 5.76694965 0.76694965362548828 0.58821177119625645 +1511 6 5.69408131 0.30591869354248047 0.093586247058738081 +1514 7 6.561585 0.4384150505065918 0.19220775651069744 +1518 6 5.993828 0.00617218017578125 3.8095808122307062E-05 +1519 5 5.7571373 0.75713729858398438 0.57325688890705351 +1521 5 5.409653 0.4096531867980957 0.16781573345383549 +1522 5 6.08686972 1.0868697166442871 1.181285780958433 +1523 6 5.97075748 0.029242515563964844 0.00085512471650872612 +1524 6 5.48240471 0.51759529113769531 0.26790488540791557 +1525 5 5.188568 0.188568115234375 0.035557934083044529 +1528 6 6.077338 0.077338218688964844 0.005981200069982151 +1529 6 5.48240471 0.51759529113769531 0.26790488540791557 +1531 7 5.76033354 1.2396664619445801 1.536772936870193 +1534 6 5.88148546 0.1185145378112793 0.01404569567262115 +1535 6 5.831912 0.16808795928955078 0.028253562058125681 +1536 5 5.113925 0.11392498016357422 0.012978901105270779 +1537 6 5.46942472 0.53057527542114258 0.2815101228882213 +1539 6 6.008886 0.0088858604431152344 7.8958515814520069E-05 +1541 4 4.825052 0.82505178451538086 0.68071044713201445 +1544 5 5.113925 0.11392498016357422 0.012978901105270779 +1545 6 6.576745 0.57674503326416016 0.33263483339487721 +1546 6 5.71939373 0.28060626983642578 0.078739878671512997 +1547 6 5.71939373 0.28060626983642578 0.078739878671512997 +1548 6 7.57207346 1.5720734596252441 2.4714149624580841 +1550 6 5.99755526 0.0024447441101074219 5.9767737639049301E-06 +1553 7 6.208527 0.7914729118347168 0.62642937016812539 +1555 7 6.55556 0.44443988800048828 0.19752681404588657 +1556 6 6.01286459 0.012864589691162109 0.00016549766792195442 +1557 6 5.99755526 0.0024447441101074219 5.9767737639049301E-06 +1558 4 5.386171 1.3861708641052246 1.9214696644942251 +1563 6 6.553794 0.55379390716552734 0.30668769161366072 +1565 6 5.9825325 0.017467498779296875 0.00030511351360473782 +1566 5 6.17159033 1.1715903282165527 1.3726238971705698 +1568 6 5.727659 0.27234077453613281 0.074169497474940727 +1570 5 5.420094 0.42009401321411133 0.17647897993833794 +1574 4 5.65801764 1.658017635345459 2.7490224791165474 +1575 6 5.65997028 0.34002971649169922 0.11562020809742535 +1577 4 5.276046 1.2760457992553711 1.6282928817972788 +1579 4 5.450556 1.4505558013916016 2.1041121329508314 +1582 7 6.032928 0.9670720100402832 0.93522827260335362 +1583 5 5.13851166 0.13851165771484375 0.019185479322914034 +1584 6 5.304762 0.69523811340332031 0.48335603432860808 +1586 5 5.18219042 0.1821904182434082 0.033193348499708009 +1590 6 6.906599 0.90659904479980469 0.82192182803191827 +1591 6 6.93632364 0.93632364273071289 0.87670196393651167 +1593 6 5.05398464 0.94601535797119141 0.89494505751736142 +1594 6 5.53434753 0.4656524658203125 0.2168322189245373 +1595 6 5.47930336 0.52069664001464844 0.27112499092254438 +1601 6 5.34099054 0.65900945663452148 0.43429346393372725 +1602 5 6.63619566 1.6361956596374512 2.677136236616434 +1604 5 5.01126766 0.011267662048339844 0.00012696020803559804 +1605 9 6.93166 2.0683398246765137 4.2780296303428713 +1606 6 6.49907351 0.49907350540161133 0.24907436379385217 +1608 5 5.16369724 0.16369724273681641 0.026796787279636192 +1611 6 5.64973164 0.35026836395263672 0.12268792678605678 +1612 7 5.99648 1.0035200119018555 1.0070524142875001 +1614 5 5.79273653 0.79273653030395508 0.62843120647835349 +1615 6 6.422241 0.4222412109375 0.17828764021396637 +1618 6 4.82879448 1.1712055206298828 1.3717223715539149 +1620 7 5.99648 1.0035200119018555 1.0070524142875001 +1622 6 4.932357 1.0676431655883789 1.1398619290275747 +1624 7 5.93193245 1.0680675506591797 1.1407682927710994 +1625 6 6.15797472 0.1579747200012207 0.02495601215946408 +1627 5 5.09917068 0.099170684814453125 0.0098348247265676036 +1630 5 4.88835955 0.11164045333862305 0.01246359082165327 +1631 6 6.06227827 0.062278270721435547 0.0038785830040524161 +1635 6 5.59236431 0.40763568878173828 0.16616685476856219 +1637 6 6.312566 0.31256580352783203 0.097697381534999295 +1638 5 4.97513056 0.024869441986083984 0.00061848914469919691 +1640 5 5.26559353 0.26559352874755859 0.070539922512580233 +1643 7 5.743971 1.2560291290283203 1.5776091729676409 +1645 7 5.89232731 1.1076726913452148 1.2269387911519516 +1648 5 6.52520132 1.5252013206481934 2.3262390685069931 +1649 4 5.402714 1.4027137756347656 1.9676059363555396 +1650 7 6.83081436 0.16918563842773438 0.02862378025020007 +1652 4 5.73360443 1.7336044311523438 3.0053843237110414 +1661 6 5.54768658 0.45231342315673828 0.20458743276776659 +1662 7 5.839347 1.1606531143188477 1.34711565177804 +1666 5 5.10381126 0.10381126403808594 0.010776778541185195 +1670 6 5.53445244 0.46554756164550781 0.2167345321540779 +1671 7 6.4646616 0.53533840179443359 0.28658720443581842 +1672 5 5.54212427 0.54212427139282227 0.29389872563319841 +1675 5 5.49875832 0.49875831604003906 0.24875985781909549 +1676 7 6.4646616 0.53533840179443359 0.28658720443581842 +1678 6 5.893253 0.10674715042114258 0.01139495412303404 +1682 7 6.325238 0.67476177215576172 0.45530344916278409 +1683 7 6.325238 0.67476177215576172 0.45530344916278409 +1686 5 5.67819548 0.67819547653198242 0.45994910438844272 +1687 7 6.003312 0.99668788909912109 0.99338674827686191 +1689 6 6.36480761 0.3648076057434082 0.13308458920823796 +1691 7 6.325238 0.67476177215576172 0.45530344916278409 +1692 6 6.534476 0.53447580337524414 0.28566438439361264 +1693 5 5.35202169 0.35202169418334961 0.12391927317571572 +1694 6 5.785526 0.21447420120239258 0.045999182981404374 +1695 6 6.31205273 0.31205272674560547 0.097376904269367515 +1696 6 5.672015 0.32798480987548828 0.1075740355090602 +1698 6 6.534476 0.53447580337524414 0.28566438439361264 +1700 6 6.17246342 0.17246341705322266 0.029743630221673811 +1703 5 5.34564161 0.3456416130065918 0.11946812464179857 +1705 6 6.7654047 0.76540470123291016 0.58584435666944046 +1708 4 5.439889 1.4398889541625977 2.0732802003194593 +1710 5 5.2302 0.23019981384277344 0.052991954293247545 +1712 6 5.777736 0.22226381301879883 0.049401202577655567 +1717 6 5.55541563 0.44458436965942383 0.19765526174546721 +1718 4 5.02554274 1.0255427360534668 1.0517379034720307 +1722 6 6.04382038 0.043820381164550781 0.0019202258054065169 +1726 6 6.851109 0.85110902786254883 0.72438657730913292 +1727 6 5.45301056 0.54698944091796875 0.29919744847575203 +1729 6 6.64549351 0.64549350738525391 0.41666186807651684 +1730 6 5.684866 0.31513404846191406 0.099309468499996001 +1732 5 5.67953 0.67953014373779297 0.46176121624830557 +1733 6 5.80405474 0.19594526290893555 0.038394546056451873 +1737 6 5.75306463 0.24693536758422852 0.060977075763958055 +1738 5 5.839874 0.8398737907409668 0.70538798437360128 +1741 6 6.81806326 0.81806325912475586 0.66922749592981745 +1742 6 5.68590355 0.31409645080566406 0.098656580408714944 +1745 5 4.99210072 0.0078992843627929688 6.2398693444265518E-05 +1750 6 6.551964 0.55196380615234375 0.30466404330218211 +1751 7 6.395873 0.60412693023681641 0.36496934783735924 +1752 6 5.692622 0.30737781524658203 0.094481121305761917 +1757 5 5.09984255 0.099842548370361328 0.0099685344650879415 +1759 5 4.684496 0.31550407409667969 0.099542820771603147 +1760 6 5.528948 0.47105216979980469 0.22189014667310403 +1761 6 5.559502 0.44049787521362305 0.19403837806771662 +1762 7 6.353659 0.64634084701538086 0.41775649052055996 +1763 6 5.96684837 0.033151626586914063 0.0010990303453581873 +1764 5 5.25088 0.25087976455688477 0.062940656264117933 +1766 5 5.003823 0.0038228034973144531 1.4613826579079614E-05 +1769 7 6.535719 0.46428108215332031 0.21555692324545817 +1770 6 5.67120647 0.32879352569580078 0.10810518253947521 +1771 6 5.99136829 0.0086317062377929688 7.4506352575554047E-05 +1777 6 5.99136829 0.0086317062377929688 7.4506352575554047E-05 +1778 8 7.7493763 0.25062370300292969 0.062812240506900707 +1780 5 6.034183 1.0341830253601074 1.0695345299429846 +1781 4 5.52017832 1.5201783180236816 2.3109421185893098 +1782 6 6.0583744 0.058374404907226563 0.0034075711482728366 +1786 7 6.37066031 0.62933969497680664 0.39606845167350002 +1787 7 6.90712833 0.092871665954589844 0.0086251463371809223 +1790 5 5.274954 0.27495384216308594 0.075599615320243174 +1791 5 5.577743 0.5777430534362793 0.33378703579387548 +1792 6 5.61199474 0.38800525665283203 0.15054807919023006 +1793 5 5.126741 0.12674093246459961 0.016063263961996199 +1796 5 6.383996 1.3839960098266602 1.9154449552161168 +1797 8 6.65697432 1.3430256843566895 1.803717988841754 +1798 6 5.957332 0.042667865753173828 0.001820546767930864 +1799 6 6.017667 0.017666816711425781 0.00031211641271511326 +1804 6 5.379597 0.62040281295776367 0.3848996503259059 +1806 5 5.07963467 0.079634666442871094 0.0063416800994673395 +1807 6 5.63211966 0.36788034439086914 0.13533594778914448 +1808 5 5.27121639 0.27121639251708984 0.073558331569984148 +1809 6 5.63211966 0.36788034439086914 0.13533594778914448 +1811 5 5.07963467 0.079634666442871094 0.0063416800994673395 +1813 6 6.01981449 0.019814491271972656 0.00039261406436708057 +1815 6 5.7096796 0.29032039642333984 0.084285932579405198 +1819 6 6.7962656 0.79626560211181641 0.63403890910649352 +1820 6 5.7096796 0.29032039642333984 0.084285932579405198 +1822 7 7.000497 0.00049686431884765625 2.4687415134394541E-07 +1833 7 6.684526 0.31547403335571289 0.09952386572172145 +1834 6 5.58879 0.41121006011962891 0.16909371354358882 +1837 7 6.620609 0.37939119338989258 0.14393767762180687 +1838 6 5.25579643 0.74420356750488281 0.55383894988699467 +1839 6 5.69494152 0.30505847930908203 0.09306067579836963 +1840 5 5.98602247 0.9860224723815918 0.97224031604150696 +1842 6 6.12460756 0.12460756301879883 0.015527044761483921 +1846 5 5.52307034 0.52307033538818359 0.27360257576310687 +1848 5 4.607618 0.39238214492797852 0.15396374765828114 +1849 6 6.30588961 0.30588960647583008 0.093568451349938186 +1850 7 6.00497246 0.99502754211425781 0.9900798095659411 +1851 6 6.067011 0.067010879516601563 0.0044904579735884909 +1852 7 6.1998477 0.80015230178833008 0.64024370605716285 +1853 5 5.065463 0.065463066101074219 0.0042854130233536125 +1855 6 5.905511 0.094489097595214844 0.0089281895643580356 +1856 4 4.58664846 0.58664846420288086 0.34415642055159879 +1857 5 4.86528444 0.13471555709838867 0.018148281324329218 +1860 6 5.79932547 0.20067453384399414 0.04027026853350435 +1864 6 6.284785 0.28478479385375977 0.081102378810328446 +1865 6 5.532091 0.46790885925292969 0.21893870056737796 +1869 7 6.080062 0.91993808746337891 0.84628608476577938 +1870 6 5.981809 0.018190860748291016 0.00033090741476371477 +1872 5 5.009711 0.0097107887268066406 9.4299417696674936E-05 +1875 5 5.46236658 0.46236658096313477 0.21378285519153906 +1880 5 5.258416 0.25841617584228516 0.066778919936950842 +1881 6 5.86735439 0.13264560699462891 0.017594857054973545 +1882 5 5.258416 0.25841617584228516 0.066778919936950842 +1886 5 4.814584 0.18541622161865234 0.034379175239337201 +1891 5 5.142381 0.14238119125366211 0.020272403622811908 +1893 5 5.12605667 0.12605667114257813 0.015890284339548089 +1895 6 5.542293 0.45770692825317383 0.20949563217095601 +1896 6 5.438239 0.56176090240478516 0.31557531147063855 +1897 6 5.438239 0.56176090240478516 0.31557531147063855 +1898 6 4.979807 1.0201930999755859 1.0407939612377959 +1904 6 5.542293 0.45770692825317383 0.20949563217095601 +1907 7 6.702694 0.29730606079101563 0.088390893783071078 +1908 7 6.76456976 0.23543024063110352 0.055427398203619305 +1909 5 5.86436367 0.86436367034912109 0.74712455461940408 +1910 5 5.34539843 0.3453984260559082 0.11930007272189869 +1911 6 5.993113 0.0068869590759277344 4.7430205313503393E-05 +1912 6 6.007423 0.0074229240417480469 5.509980132956116E-05 +1913 6 5.67044 0.3295598030090332 0.10860966375935277 +1914 6 6.594901 0.59490108489990234 0.35390730081508082 +1915 7 6.76456976 0.23543024063110352 0.055427398203619305 +1916 5 5.34539843 0.3453984260559082 0.11930007272189869 +1918 6 5.74891472 0.25108528137207031 0.063043818521691719 +1920 7 5.75763226 1.2423677444458008 1.5434776124393466 +1922 5 5.731976 0.73197603225708008 0.53578891179881794 +1923 5 4.71941042 0.28058958053588867 0.078730512705305955 +1925 6 5.954923 0.045076847076416016 0.0020319221423505951 +1926 6 5.920651 0.079349040985107422 0.0062962703052562574 +1927 5 5.80981636 0.80981636047363281 0.6558025376907608 +1929 5 5.25512838 0.25512838363647461 0.065090492136960165 +1930 6 5.70013952 0.29986047744750977 0.089916305935048513 +1931 3 5.116358 2.1163578033447266 4.4789703517781163 +1933 5 5.0376873 0.037687301635742188 0.0014203327045834158 +1938 5 5.9158864 0.91588640213012695 0.83884790160686862 +1940 5 4.86190462 0.13809537887573242 0.019070333666832084 +1941 5 5.38696527 0.38696527481079102 0.14974212390939101 +1943 5 5.79620075 0.79620075225830078 0.63393563789668406 +1944 5 5.049108 0.049108028411865234 0.0024115984545005631 +1946 6 5.31514931 0.68485069274902344 0.4690204713588173 +1948 7 6.25940466 0.74059534072875977 0.54848145870914777 +1949 5 5.18440056 0.18440055847167969 0.034003565964667359 +1950 5 5.345883 0.34588289260864258 0.11963497539932177 +1951 4 4.95812225 0.95812225341796875 0.91799825249472633 +1952 7 6.54604959 0.45395040512084961 0.20607097030938348 +1953 6 6.370929 0.37092876434326172 0.13758814821721899 +1955 5 5.42086029 0.42086029052734375 0.17712338414276019 +1959 5 5.453207 0.45320701599121094 0.20539659934365773 +1960 5 5.453207 0.45320701599121094 0.20539659934365773 +1966 6 5.371932 0.62806797027587891 0.39446937528646231 +1969 7 6.85478354 0.14521646499633789 0.021087821706032628 +1970 6 5.39096928 0.60903072357177734 0.37091842225436267 +1972 5 5.68259859 0.68259859085083008 0.46594083623153892 +1974 5 5.24890041 0.24890041351318359 0.061951415847033786 +1975 6 5.479768 0.52023220062255859 0.27064154256459005 +1977 6 5.80837154 0.19162845611572266 0.036721465193295444 +1978 6 5.28652048 0.71347951889038086 0.50905302387604934 +1979 6 5.296408 0.70359182357788086 0.49504145420564782 +1980 8 7.485046 0.5149540901184082 0.26517771492967768 +1982 8 7.485046 0.5149540901184082 0.26517771492967768 +1984 8 7.485046 0.5149540901184082 0.26517771492967768 +1985 6 5.973269 0.026731014251708984 0.00071454712292506883 +1986 6 5.805167 0.19483280181884766 0.037959820664582367 +1989 7 6.82315636 0.17684364318847656 0.031273674136173213 +1990 4 5.207319 1.2073187828063965 1.4576186433171188 +1992 5 5.926482 0.92648220062255859 0.85836926807041891 +1993 6 5.79101229 0.20898771286010742 0.043675864126498709 +1996 6 6.06539965 0.065399646759033203 0.0042771137962063221 +1997 6 6.0473156 0.047315597534179688 0.0022387657700164709 +1998 6 6.0473156 0.047315597534179688 0.0022387657700164709 +2001 5 5.064017 0.064016819000244141 0.0040981531149100192 +2002 6 6.60353136 0.6035313606262207 0.36425010325933727 +2003 6 5.79101229 0.20898771286010742 0.043675864126498709 +2004 6 6.215163 0.21516323089599609 0.046295215929603728 +2005 6 6.06539965 0.065399646759033203 0.0042771137962063221 +2007 6 5.89332438 0.10667562484741211 0.011379688936585808 +2008 5 6.035252 1.0352520942687988 1.0717468986879339 +2011 5 6.035252 1.0352520942687988 1.0717468986879339 +2019 6 5.73516369 0.26483631134033203 0.07013827180435328 +2022 6 5.48330927 0.51669073104858398 0.26696931155152015 +2024 5 4.992839 0.0071611404418945313 5.1281932428537402E-05 +2025 5 5.26053953 0.26053953170776367 0.067880847582500792 +2027 5 5.107182 0.10718202590942383 0.011487986678048401 +2028 6 5.429237 0.57076311111450195 0.3257705290091053 +2029 6 5.48330927 0.51669073104858398 0.26696931155152015 +2031 5 5.71048927 0.71048927307128906 0.50479500714936876 +2032 6 5.723135 0.27686500549316406 0.076654231266729767 +2034 5 5.869266 0.86926603317260742 0.75562343642764063 +2035 5 5.689244 0.68924379348754883 0.47505700686110686 +2037 5 5.71048927 0.71048927307128906 0.50479500714936876 +2038 5 5.53941774 0.53941774368286133 0.29097150219990908 +2039 5 5.17752075 0.177520751953125 0.031513617374002934 +2043 6 6.26886225 0.26886224746704102 0.072286908113028403 +2048 5 5.2710104 0.27101039886474609 0.073446636292828771 +2050 3 5.012742 2.0127420425415039 4.0511305298141451 +2051 5 5.20824671 0.20824670791625977 0.043366691357960008 +2052 5 5.20824671 0.20824670791625977 0.043366691357960008 +2057 7 6.78188 0.21812009811401367 0.047576377201266951 +2058 5 5.42770338 0.4277033805847168 0.1829301817635951 +2060 5 5.69225931 0.69225931167602539 0.47922295460216446 +2061 6 6.217498 0.21749782562255859 0.047305304150540906 +2062 5 6.018735 1.0187349319458008 1.0378208615666153 +2063 5 5.508641 0.50864076614379883 0.25871542898335065 +2064 6 5.61093235 0.38906764984130859 0.15137363615303912 +2065 5 5.69977331 0.69977331161499023 0.48968268764861023 +2066 5 5.49579334 0.49579334259033203 0.24581103855689435 +2067 5 5.51807261 0.51807260513305664 0.26839922418935203 +2069 7 6.47043943 0.52956056594848633 0.28043439300768114 +2070 6 5.740727 0.25927305221557617 0.067222515605180888 +2071 6 5.88474464 0.11525535583496094 0.013283797048643464 +2073 5 5.25647974 0.25647974014282227 0.065781857103729635 +2074 6 5.61093235 0.38906764984130859 0.15137363615303912 +2076 5 5.427954 0.42795419692993164 0.18314479466994271 +2078 6 6.103273 0.10327291488647461 0.010665294949149029 +2079 4 5.63887072 1.6388707160949707 2.6858972240736421 +2080 5 5.427954 0.42795419692993164 0.18314479466994271 +2082 6 5.593912 0.40608787536621094 0.16490736251944327 +2084 6 6.01919174 0.019191741943359375 0.00036832295882049948 +2085 6 6.01919174 0.019191741943359375 0.00036832295882049948 +2086 5 5.72145462 0.72145462036132813 0.52049676924070809 +2087 6 6.13345 0.13345003128051758 0.01780891084877112 +2089 6 6.01919174 0.019191741943359375 0.00036832295882049948 +2090 5 5.169893 0.16989278793334961 0.028863559391766103 +2091 5 5.49635267 0.4963526725769043 0.24636597557423556 +2094 5 5.393815 0.39381504058837891 0.15509028619362653 +2096 5 4.93707228 0.062927722930908203 0.0039598983132691501 +2097 5 5.69649458 0.69649457931518555 0.48510469901543729 +2099 5 5.89435 0.89435005187988281 0.79986201529754908 +2102 5 5.21029234 0.21029233932495117 0.044222867978760405 +2103 5 5.43867159 0.43867158889770508 0.19243276290603717 +2104 5 5.89435 0.89435005187988281 0.79986201529754908 +2106 5 5.18669176 0.1866917610168457 0.034853813631571029 +2110 5 5.3566494 0.35664939880371094 0.12719879366704845 +2111 5 5.3566494 0.35664939880371094 0.12719879366704845 +2112 5 5.3566494 0.35664939880371094 0.12719879366704845 +2113 5 5.14198542 0.14198541641235352 0.020159858473789427 +2114 6 6.12237 0.12236976623535156 0.014974359688494587 +2115 5 5.3566494 0.35664939880371094 0.12719879366704845 +2116 4 6.222515 2.2225151062011719 4.9395733972924063 +2118 6 5.98331451 0.01668548583984375 0.00027840543771162629 +2120 5 5.83379126 0.83379125595092773 0.69520785850022548 +2121 7 6.72408 0.27591991424560547 0.076131799077302276 +2122 5 5.536666 0.53666591644287109 0.2880103058714667 +2123 5 5.83379126 0.83379125595092773 0.69520785850022548 +2124 7 6.72408 0.27591991424560547 0.076131799077302276 +2125 5 5.504136 0.50413608551025391 0.25415319271360204 +2128 6 5.11005926 0.88994073867797852 0.79199451835870605 +2129 5 5.92302132 0.92302131652832031 0.85196835076567368 +2131 6 5.55115 0.44885015487670898 0.20146646153284564 +2132 6 5.55115 0.44885015487670898 0.20146646153284564 +2134 6 5.93478727 0.065212726593017578 0.004252699709695662 +2136 6 6.01020527 0.010205268859863281 0.0001041475125020952 +2137 5 5.7383213 0.73832130432128906 0.54511834841468954 +2139 5 5.07746649 0.077466487884521484 0.0060010567451627139 +2142 5 5.49341869 0.49341869354248047 0.24346200713716826 +2143 7 6.608935 0.39106512069702148 0.15293192862577598 +2146 6 5.70015049 0.29984951019287109 0.089909728762904706 +2147 5 5.44971561 0.44971561431884766 0.20224413376217854 +2148 5 5.07746649 0.077466487884521484 0.0060010567451627139 +2150 6 6.55059433 0.55059432983398438 0.30315411604533438 +2152 6 5.93261766 0.067382335662841797 0.0045403791593798815 +2157 6 6.08861732 0.088617324829101563 0.0078530302598665003 +2158 6 5.33268738 0.6673126220703125 0.44530613557435572 +2161 7 6.74377155 0.25622844696044922 0.065653017031763738 +2162 6 4.75042868 1.2495713233947754 1.5614284922505703 +2166 5 5.28467369 0.28467369079589844 0.081039110231358791 +2167 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2168 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2171 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2172 5 5.01180124 0.011801242828369141 0.00013926933229413407 +2173 5 5.22546339 0.2254633903503418 0.050833740388270598 +2174 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2176 5 5.01180124 0.011801242828369141 0.00013926933229413407 +2179 6 5.932353 0.067646980285644531 0.0045761139417663799 +2182 5 5.69115925 0.69115924835205078 0.47770110658257181 +2184 6 6.046692 0.04669189453125 0.0021801330149173737 +2186 5 4.99832344 0.0016765594482421875 2.8108515834901482E-06 +2189 6 6.404397 0.40439701080322266 0.16353694234658178 +2192 6 5.53746462 0.46253538131713867 0.21393897897019087 +2197 6 6.46665955 0.4666595458984375 0.2177711317781359 +2198 5 5.16137743 0.1613774299621582 0.026042674901191276 +2201 6 5.700198 0.29980182647705078 0.089881135158975667 +2202 5 5.16137743 0.1613774299621582 0.026042674901191276 +2203 5 5.47646475 0.47646474838256836 0.22701865645126418 +2204 5 5.351197 0.3511967658996582 0.12333916837837933 +2205 5 5.522396 0.52239608764648438 0.27289767238835339 +2206 6 5.58879 0.41121006011962891 0.16909371354358882 +2209 6 6.157562 0.1575617790222168 0.024825714208645877 +2210 7 5.705906 1.2940940856933594 1.6746795026265318 +2211 6 5.65906954 0.34093046188354492 0.11623357984012728 +2215 6 5.562096 0.43790388107299805 0.19175980905879442 +2216 5 5.402029 0.40202903747558594 0.16162734697354608 +2219 7 6.70257664 0.29742336273193359 0.088460656698771345 +2222 7 6.04341 0.95659017562866211 0.91506476410927462 +2224 7 6.04341 0.95659017562866211 0.91506476410927462 +2226 5 5.322302 0.32230186462402344 0.10387849194012233 +2227 5 5.273082 0.27308177947998047 0.074573658283952682 +2232 6 5.48561 0.51438999176025391 0.26459706362311408 +2233 5 5.79209232 0.79209232330322266 0.62741024863589701 +2235 6 5.46630526 0.53369474411010742 0.28483007989075304 +2238 6 5.868995 0.13100481033325195 0.017162260330451318 +2239 6 5.46630526 0.53369474411010742 0.28483007989075304 +2240 5 5.22449732 0.22449731826782227 0.050399045909443885 +2241 5 5.286269 0.28626918792724609 0.081950047956524941 +2245 7 5.857095 1.1429052352905273 1.3062323768544957 +2247 6 5.868995 0.13100481033325195 0.017162260330451318 +2252 5 5.27887154 0.27887153625488281 0.077769333733158419 +2253 5 5.112074 0.11207389831542969 0.012560558683617273 +2254 6 5.564041 0.4359588623046875 0.19006012962199748 +2255 6 5.67652464 0.32347536087036133 0.10463630909021049 +2258 5 5.041592 0.041592121124267578 0.0017299045396157453 +2259 6 5.44358349 0.55641651153564453 0.30959933430949604 +2260 5 5.041592 0.041592121124267578 0.0017299045396157453 +2266 5 5.3401947 0.3401947021484375 0.11573243536986411 +2267 6 6.28939629 0.28939628601074219 0.083750210356811294 +2270 7 5.61781025 1.3821897506713867 1.9104485068610302 +2271 6 5.50590134 0.49409866333007813 0.24413348910456989 +2272 6 6.20042467 0.2004246711730957 0.04017004881484354 +2273 5 5.55797958 0.55797958374023438 0.31134121587092523 +2274 7 5.61781025 1.3821897506713867 1.9104485068610302 +2275 4 5.20286942 1.2028694152832031 1.446894830223755 +2276 6 5.06417942 0.93582057952880859 0.87576015706963517 +2278 6 5.06417942 0.93582057952880859 0.87576015706963517 +2280 6 5.82958651 0.17041349411010742 0.029040758974815617 +2282 5 4.960868 0.039132118225097656 0.0015313226767830201 +2283 5 4.960868 0.039132118225097656 0.0015313226767830201 +2284 5 4.960868 0.039132118225097656 0.0015313226767830201 +2285 5 4.960868 0.039132118225097656 0.0015313226767830201 +2287 5 4.939122 0.060877799987792969 0.0037061065313537256 +2289 7 6.850773 0.14922714233398438 0.022268740009167232 +2290 7 5.442205 1.5577950477600098 2.4267254108256111 +2291 6 6.19865465 0.1986546516418457 0.03946367061894307 +2292 6 5.148794 0.85120582580566406 0.72455135788550251 +2293 7 6.850773 0.14922714233398438 0.022268740009167232 +2295 6 5.170192 0.82980823516845703 0.68858170715338929 +2296 7 6.062081 0.93791913986206055 0.87969231291958749 +2297 6 5.743333 0.25666713714599609 0.065878019290721568 +2298 8 6.6889596 1.3110404014587402 1.7188269342570948 +2299 7 7.28213453 0.2821345329284668 0.079599894670764115 +2300 7 6.79692125 0.2030787467956543 0.04124097740009347 +2304 6 5.039255 0.96074485778808594 0.92303068176624947 +2306 5 5.22065544 0.22065544128417969 0.04868882376831607 +2310 5 5.378486 0.37848615646362305 0.14325177063460615 +2311 7 6.907369 0.092630863189697266 0.0085804768152684119 +2314 6 6.952427 0.95242691040039063 0.90711701965483371 +2315 6 6.085919 0.085918903350830078 0.00738205795300928 +2317 5 5.5054183 0.50541830062866211 0.25544765861036467 +2318 4 5.44983768 1.4498376846313477 2.1020293117771871 +2319 7 6.905406 0.094594001770019531 0.0089480251708664582 +2321 5 5.564613 0.56461286544799805 0.31878768782939915 +2324 5 5.28028536 0.28028535842895508 0.078559882149647819 +2327 6 5.360427 0.63957309722900391 0.40905374669910088 +2328 5 5.44725466 0.44725465774536133 0.2000367288749203 +2329 5 5.23106432 0.2310643196105957 0.053390719797107522 +2331 5 5.563631 0.56363105773925781 0.31767996924827457 +2332 6 5.479902 0.52009820938110352 0.27050214740143019 +2333 8 7.33445263 0.66554737091064453 0.44295330292607105 +2334 5 5.46037626 0.46037626266479492 0.21194630322520425 +2335 5 5.863933 0.86393308639526367 0.74638037776844612 +2336 5 5.045481 0.045481204986572266 0.0020685400070306059 +2337 4 5.42458248 1.4245824813842773 2.0294352462669849 +2338 5 5.51501942 0.51501941680908203 0.26524499969036697 +2339 6 5.765536 0.23446416854858398 0.054973446333178799 +2340 6 5.9685955 0.031404495239257813 0.00098624232123256661 +2342 8 6.636878 1.3631219863891602 1.8581015497775297 +2344 6 5.765536 0.23446416854858398 0.054973446333178799 +2345 6 5.700315 0.29968500137329102 0.089811100048109438 +2347 6 6.155386 0.15538597106933594 0.024144800005160505 +2349 5 5.10179329 0.10179328918457031 0.010361873723013559 +2350 5 5.512929 0.51292896270751953 0.26309612078421196 +2351 6 5.85234976 0.14765024185180664 0.021800593918896993 +2355 7 6.029962 0.97003793716430664 0.94097359953798332 +2358 5 5.204894 0.20489406585693359 0.041981578223385441 +2359 5 5.25028229 0.25028228759765625 0.062641223485115916 +2365 5 5.20540667 0.20540666580200195 0.042191898355895319 +2366 5 5.31656742 0.31656742095947266 0.10021493201293197 +2367 6 5.47557354 0.52442646026611328 0.27502311222724529 +2370 7 6.327482 0.67251777648925781 0.45228015969405533 +2374 6 6.422069 0.42206907272338867 0.17814230214958116 +2375 6 6.931272 0.93127202987670898 0.86726759363068595 +2376 6 6.422069 0.42206907272338867 0.17814230214958116 +2379 4 4.756755 0.75675487518310547 0.57267794111339754 +2380 4 4.45949 0.45948982238769531 0.21113089687787578 +2381 6 5.986179 0.013821125030517578 0.00019102349710919952 +2383 6 6.14936352 0.14936351776123047 0.02230946043800941 +2386 4 5.41926 1.4192600250244141 2.0142990186323004 +2387 4 5.4051466 1.405146598815918 1.9744369641639423 +2389 8 6.94480133 1.0551986694335938 1.1134442319744267 +2391 6 6.00016 0.00016021728515625 2.5669578462839127E-08 +2392 7 5.617188 1.3828120231628418 1.9121690914037117 +2393 6 5.617188 0.3828120231628418 0.14654504507802812 +2396 5 5.256116 0.25611591339111328 0.065595361092164239 +2401 4 5.10378027 1.1037802696228027 1.2183308836085871 +2403 6 5.75654268 0.24345731735229492 0.059271465372376042 +2406 6 6.770986 0.77098608016967773 0.59441953581540474 +2415 5 5.52892637 0.52892637252807617 0.27976310755570921 +2419 5 5.28138256 0.28138256072998047 0.079176145482961147 +2420 7 6.67350435 0.32649564743041992 0.10659940779100907 +2422 5 4.03719425 0.96280574798583984 0.92699490835457254 +2423 6 5.645845 0.35415506362915039 0.12542580909416756 +2424 5 4.03719425 0.96280574798583984 0.92699490835457254 +2426 6 6.25219631 0.25219631195068359 0.063602979761526512 +2427 6 5.3982296 0.60177040100097656 0.36212761552087613 +2428 6 6.25219631 0.25219631195068359 0.063602979761526512 +2429 6 5.3982296 0.60177040100097656 0.36212761552087613 +2430 5 5.12913275 0.12913274765014648 0.016675266515676412 +2431 5 5.05260849 0.052608489990234375 0.0027676532190525904 +2433 6 4.791566 1.2084341049194336 1.4603129859324326 +2435 4 5.59644747 1.5964474678039551 2.5486445174576602 +2436 5 5.067692 0.067691802978515625 0.0045821801904821768 +2437 6 5.689383 0.31061697006225586 0.096482902090656353 +2439 6 6.093392 0.093391895294189453 0.0087220461066408461 +2440 5 5.38602734 0.38602733612060547 0.14901710423237091 +2441 6 6.452305 0.45230484008789063 0.20457966836693231 +2443 5 5.30036068 0.30036067962646484 0.090216537865671853 +2444 5 5.296285 0.29628515243530273 0.087784891553610578 +2450 5 4.968459 0.031540870666503906 0.00099482652240112657 +2452 7 6.529565 0.47043514251708984 0.22130922331507463 +2453 6 6.33554029 0.3355402946472168 0.11258728933194107 +2455 6 5.79571867 0.20428133010864258 0.041730861830956201 +2456 6 5.56070232 0.43929767608642578 0.19298244821493427 +2459 5 5.270118 0.27011823654174805 0.07296386171242375 +2461 5 4.9582386 0.041761398315429688 0.0017440143892599735 +2464 5 5.31435633 0.31435632705688477 0.098819900360695101 +2465 5 5.03994131 0.039941310882568359 0.0015953083150179737 +2466 5 5.08337355 0.083373546600341797 0.0069511482727193652 +2467 6 5.568081 0.43191909790039063 0.18655410713108722 +2470 5 5.535125 0.53512477874755859 0.28635852882962354 +2472 6 5.576354 0.42364597320556641 0.17947591061329149 +2475 5 4.41602135 0.58397865295410156 0.34103106710608699 +2477 7 6.26229572 0.73770427703857422 0.54420760036100546 +2478 6 5.454049 0.54595088958740234 0.29806237384127598 +2483 6 5.454049 0.54595088958740234 0.29806237384127598 +2486 5 5.928272 0.92827177047729492 0.8616884798650517 +2488 6 6.42370558 0.4237055778503418 0.17952641670149205 +2495 5 5.980746 0.98074579238891602 0.96186230928856276 +2496 5 5.86902666 0.86902666091918945 0.75520733738835588 +2499 6 6.260035 0.26003503799438477 0.067618220984741129 +2502 4 5.1143384 1.1143383979797363 1.2417500652120452 +2503 4 5.1143384 1.1143383979797363 1.2417500652120452 +2504 6 5.21815968 0.78184032440185547 0.6112742928607986 +2505 6 5.03083229 0.96916770935058594 0.93928604884786182 +2511 6 5.4982357 0.50176429748535156 0.25176741023096838 +2512 6 5.612169 0.38783121109008789 0.15041304829560431 +2513 5 5.13564 0.13564014434814453 0.018398248758785485 +2514 7 6.95298 0.04701995849609375 0.0022108764969743788 +2517 6 5.57794857 0.42205142974853516 0.17812740935278271 +2518 7 6.791449 0.20855093002319336 0.043493490413538893 +2519 5 5.55116463 0.55116462707519531 0.30378244613893912 +2522 8 6.104276 1.895723819732666 3.5937688007018096 +2523 5 6.237401 1.237401008605957 1.5311612560990397 +2525 8 6.104276 1.895723819732666 3.5937688007018096 +2526 7 7.040822 0.040822029113769531 0.0016664380609654472 +2531 4 5.01932573 1.0193257331848145 1.0390249503327595 +2532 4 5.01932573 1.0193257331848145 1.0390249503327595 +2534 7 5.86961842 1.1303815841674805 1.2777625258249827 +2536 6 5.60501671 0.39498329162597656 0.15601180066369125 +2537 6 5.178944 0.82105588912963867 0.67413277307446151 +2538 6 5.178944 0.82105588912963867 0.67413277307446151 +2541 6 5.614379 0.38562107086181641 0.14870361029261403 +2545 6 5.877658 0.12234210968017578 0.014967591800996161 +2546 5 5.24112558 0.24112558364868164 0.058141547089917367 +2547 5 4.973504 0.026495933532714844 0.0007020344937700429 +2548 6 5.567487 0.43251323699951172 0.18706770017979579 +2551 6 5.567487 0.43251323699951172 0.18706770017979579 +2552 5 5.26310062 0.26310062408447266 0.069221938393638993 +2554 7 6.83249044 0.16750955581665039 0.028059451289891513 +2555 7 6.9097147 0.090285301208496094 0.0081514356143088662 +2556 5 5.60247326 0.60247325897216797 0.36297402777654497 +2557 7 6.83249044 0.16750955581665039 0.028059451289891513 +2558 7 6.9097147 0.090285301208496094 0.0081514356143088662 +2560 6 5.963154 0.036846160888671875 0.001357639572233893 +2562 6 5.963154 0.036846160888671875 0.001357639572233893 +2563 5 5.25828 0.25827980041503906 0.066708455302432412 +2564 6 5.21689034 0.78310966491699219 0.61326074728640378 +2566 7 6.128587 0.87141323089599609 0.7593610189805986 +2567 5 6.238179 1.2381792068481445 1.5330877482711003 +2568 6 5.407526 0.59247398376464844 0.3510254214379529 +2569 6 6.194025 0.19402503967285156 0.037645716020051623 +2571 6 6.41501474 0.41501474380493164 0.17223723757547305 +2574 5 5.635308 0.63530778884887695 0.40361598657204922 +2575 6 5.561543 0.43845701217651367 0.19224455152675546 +2579 6 5.722208 0.27779197692871094 0.07716838244596147 +2581 7 6.690846 0.30915403366088867 0.095576216528797886 +2583 7 6.690846 0.30915403366088867 0.095576216528797886 +2584 7 6.690846 0.30915403366088867 0.095576216528797886 +2586 7 6.690846 0.30915403366088867 0.095576216528797886 +2592 5 5.79668045 0.79668045043945313 0.63469974011240993 +2593 5 5.87219429 0.87219429016113281 0.76072287978968234 +2595 5 4.964598 0.035401821136474609 0.0012532889397789404 +2596 5 5.10914946 0.10914945602416992 0.011913603750372204 +2599 6 5.62042475 0.37957525253295898 0.14407737233545959 +2600 7 7.30414 0.30414009094238281 0.092501194918440888 +2602 6 6.401818 0.40181779861450195 0.16145754328340445 +2607 6 5.579085 0.42091512680053711 0.17716954396951223 +2609 6 5.292896 0.70710420608520508 0.49999635826338817 +2610 5 5.13112736 0.13112735748291016 0.017194383880450914 +2611 5 5.496989 0.49698877334594727 0.24699784083190934 +2612 7 6.89696455 0.10303544998168945 0.010616303952929229 +2617 7 6.94228029 0.057719707489013672 0.003331564632617301 +2618 7 6.28177166 0.71822834014892578 0.51585194859308103 +2619 6 5.39915 0.60085010528564453 0.36102084902177012 +2621 5 5.347756 0.34775590896606445 0.12093417222081371 +2623 7 6.94228029 0.057719707489013672 0.003331564632617301 +2626 7 6.28341341 0.71658658981323242 0.51349634070015782 +2628 6 5.57233238 0.42766761779785156 0.18289959131288924 +2633 5 5.747111 0.74711084365844727 0.55817461271203683 +2635 6 6.50639057 0.50639057159423828 0.25643141099953937 +2638 6 6.61158371 0.61158370971679688 0.37403463399095926 +2639 6 6.030149 0.030148983001708984 0.00090896117603733728 +2641 5 5.903246 0.90324592590332031 0.81585320266094641 +2644 6 6.09582567 0.095825672149658203 0.0091825594429337798 +2648 6 5.787987 0.21201276779174805 0.044949413706717678 +2650 5 5.39147425 0.39147424697875977 0.153252086047587 +2652 7 6.80050564 0.19949436187744141 0.039798000420887547 +2653 5 5.45156336 0.45156335830688477 0.20390946656539199 +2654 5 4.98665 0.013350009918212891 0.00017822276481638255 +2658 7 6.502366 0.49763393402099609 0.24763953228921309 +2660 6 5.36160755 0.63839244842529297 0.40754491820644034 +2661 6 6.14635 0.14634990692138672 0.021418295255898556 +2664 7 6.55731344 0.44268655776977539 0.19597138843005268 +2665 5 5.342439 0.34243917465209961 0.11726458833641118 +2666 7 7.11803436 0.11803436279296875 0.013932110799942166 +2668 6 6.28019142 0.28019142150878906 0.078507232687115902 +2669 5 5.39382172 0.39382171630859375 0.1550955442362465 +2670 7 7.11803436 0.11803436279296875 0.013932110799942166 +2674 7 5.861015 1.1389851570129395 1.2972871878957903 +2679 6 5.708907 0.29109287261962891 0.0847350604899475 +2680 6 6.65364027 0.6536402702331543 0.42724560287047098 +2681 6 6.35068655 0.35068655014038086 0.12298105644936186 +2683 5 5.26071072 0.26071071624755859 0.067970077566315013 +2694 6 5.9146595 0.085340499877929688 0.007283000919414917 +2697 5 5.87555742 0.87555742263793945 0.76660080033639133 +2698 6 5.506389 0.49361085891723633 0.24365168004101179 +2699 6 5.444553 0.55544710159301758 0.30852148266808399 +2700 7 6.026109 0.97389078140258789 0.94846325410094323 +2703 5 5.42530346 0.42530345916748047 0.18088303237982473 +2706 6 5.4116106 0.58838939666748047 0.34620208211072168 +2707 5 5.42530346 0.42530345916748047 0.18088303237982473 +2709 5 5.918651 0.91865110397338867 0.84391985083152576 +2710 5 5.918651 0.91865110397338867 0.84391985083152576 +2711 5 5.674193 0.67419290542602539 0.45453607372678562 +2712 5 5.732471 0.73247098922729492 0.53651375005961199 +2716 5 5.918651 0.91865110397338867 0.84391985083152576 +2717 6 5.926712 0.0732879638671875 0.0053711256477981806 +2718 6 5.66730261 0.33269739151000977 0.11068755431756472 +2721 5 5.484752 0.48475217819213867 0.23498467426202296 +2722 7 6.53023052 0.46976947784423828 0.22068336231404828 +2723 6 6.4047637 0.40476369857788086 0.16383365168644559 +2724 6 6.22072268 0.22072267532348633 0.04871849940195716 +2727 6 6.02800226 0.028002262115478516 0.00078412668358396331 +2728 6 5.65830135 0.34169864654541016 0.11675796505096514 +2729 7 6.48090172 0.51909828186035156 0.269463026230369 +2730 5 5.030326 0.030325889587402344 0.00091965957926731789 +2731 5 4.903098 0.096901893615722656 0.0093899769863128313 +2732 5 5.092683 0.092682838439941406 0.0085901085412842804 +2733 7 6.48090172 0.51909828186035156 0.269463026230369 +2739 7 6.84986925 0.1501307487487793 0.022539241719869096 +2740 6 5.629528 0.37047195434570313 0.13724946895672474 +2743 6 5.069488 0.9305119514465332 0.86585249178483537 +2744 6 5.069488 0.9305119514465332 0.86585249178483537 +2745 7 6.66979456 0.33020544052124023 0.10903563294982632 +2749 6 5.6916337 0.30836629867553711 0.09508977415885056 +2752 6 6.321662 0.32166194915771484 0.10346640953594033 +2753 8 5.90083933 2.0991606712341309 4.4064755236561268 +2754 5 5.001648 0.00164794921875 2.7157366275787354E-06 +2755 5 5.214188 0.2141880989074707 0.045876541713596453 +2756 6 5.120204 0.87979602813720703 0.77404105112600519 +2757 5 6.278562 1.278562068939209 1.6347209641301106 +2758 6 5.77940369 0.2205963134765625 0.04866273351944983 +2759 6 5.68099546 0.31900453567504883 0.1017638937812535 +2760 6 5.680106 0.31989383697509766 0.10233206693465036 +2761 5 5.40748549 0.4074854850769043 0.16604442054835999 +2762 5 5.307543 0.30754280090332031 0.094582574387459317 +2764 6 6.016877 0.016877174377441406 0.00028483901496656472 +2768 6 5.438565 0.56143522262573242 0.31520950920480573 +2769 5 5.307543 0.30754280090332031 0.094582574387459317 +2770 7 5.659925 1.3400750160217285 1.7958010485656359 +2771 6 5.661485 0.33851480484008789 0.11459227309592279 +2773 7 6.59006643 0.40993356704711914 0.16804552939197492 +2776 8 6.990417 1.0095829963684082 1.0192578265562133 +2778 7 6.59006643 0.40993356704711914 0.16804552939197492 +2779 5 6.28366 1.2836599349975586 1.6477828287179364 +2780 5 4.619333 0.38066720962524414 0.14490752448386957 +2781 6 4.73323345 1.2667665481567383 1.6046974875289379 +2782 6 5.759841 0.24015903472900391 0.057676361961966904 +2784 6 5.759841 0.24015903472900391 0.057676361961966904 +2787 5 5.154094 0.15409421920776367 0.023745028393250323 +2789 5 5.24807024 0.24807024002075195 0.061538843983953484 +2792 5 5.47459 0.47458982467651367 0.22523550168648399 +2793 7 7.030477 0.030477046966552734 0.00092885039180146123 +2795 8 6.281604 1.7183961868286133 2.9528854549071184 +2797 5 5.248554 0.24855422973632813 0.06177920511981938 +2800 5 5.540111 0.54011106491088867 0.2917199624391742 +2804 8 6.281604 1.7183961868286133 2.9528854549071184 +2808 6 5.26842356 0.73157644271850586 0.53520409154066328 +2809 7 6.62437439 0.3756256103515625 0.14109459915198386 +2810 7 6.433074 0.56692600250244141 0.3214050923133982 +2811 5 5.668065 0.66806507110595703 0.44631093923180742 +2813 7 6.62437439 0.3756256103515625 0.14109459915198386 +2814 7 6.61809349 0.38190650939941406 0.14585258192164474 +2818 4 5.808469 1.8084688186645508 3.2705594680819559 +2823 6 6.27581358 0.27581357955932617 0.076073130669328748 +2830 5 5.800622 0.80062198638916016 0.64099556508972455 +2831 5 5.099738 0.099738121032714844 0.0099476927871364751 +2833 7 5.92833 1.0716700553894043 1.1484767076183289 +2836 6 5.74643373 0.25356626510620117 0.064295850799908294 +2837 6 5.851513 0.14848709106445313 0.022048416212783195 +2839 7 5.859615 1.1403851509094238 1.3004782924147094 +2840 6 5.96657133 0.033428668975830078 0.0011174759094956244 +2842 6 5.52991533 0.47008466720581055 0.22097959434199765 +2844 5 5.898055 0.89805507659912109 0.80650292060545326 +2846 7 6.969701 0.030299186706542969 0.00091804071507795015 +2847 5 6.262068 1.2620677947998047 1.5928151186708419 +2848 5 5.204508 0.20450782775878906 0.041823451614618534 +2850 5 5.99285364 0.99285364151000977 0.98575835345968699 +2852 5 5.972932 0.97293186187744141 0.94659640785630472 +2854 6 6.112688 0.11268806457519531 0.012698599897703389 +2856 7 6.85824966 0.14175033569335938 0.020093157669180073 +2860 6 5.47837162 0.52162837982177734 0.27209616663549241 +2861 6 6.112688 0.11268806457519531 0.012698599897703389 +2863 6 6.65813065 0.65813064575195313 0.43313594687788282 +2865 6 6.6311245 0.63112449645996094 0.39831813003183925 +2868 5 5.65523767 0.65523767471313477 0.42933641036347581 +2869 6 6.94134426 0.94134426116943359 0.8861290180366268 +2870 7 6.93730831 0.062691688537597656 0.0039302478116951534 +2871 6 6.28578663 0.28578662872314453 0.081673997156940459 +2872 7 7.50544739 0.5054473876953125 0.25547706172801554 +2873 8 7.100377 0.89962291717529297 0.80932139310698403 +2879 6 6.63262224 0.63262224197387695 0.40021090104005452 +2881 7 6.52594 0.47406005859375 0.22473293915390968 +2890 8 6.85379457 1.1462054252624512 1.3137868769010765 +2891 6 5.87739563 0.1226043701171875 0.015031831571832299 +2893 7 7.978032 0.97803211212158203 0.95654681234100281 +2895 5 5.43063641 0.43063640594482422 0.18544771412507544 +2896 5 5.205651 0.20565080642700195 0.042292254184076228 +2898 5 5.73327 0.73327016830444336 0.53768513972522669 +2902 5 5.41895247 0.41895246505737305 0.17552116797764938 +2903 6 6.160978 0.16097784042358398 0.02591386510744087 +2904 7 5.80037928 1.1996207237243652 1.4390898807889698 +2905 5 5.474959 0.47495889663696289 0.2255859534946012 +2906 5 5.359196 0.35919618606567383 0.12902190008412617 +2910 5 5.279104 0.27910423278808594 0.077899172760226065 +2911 5 5.41895247 0.41895246505737305 0.17552116797764938 +2913 5 6.005797 1.0057969093322754 1.0116274228223574 +2919 5 6.438273 1.4382729530334473 2.0686290874275528 +2920 4 5.60087061 1.6008706092834473 2.5627867076675557 +2923 6 6.241534 0.24153423309326172 0.058338785755950084 +2924 6 6.32152033 0.32152032852172852 0.10337532165272023 +2927 7 6.90382433 0.096175670623779297 0.009249759619933684 +2929 6 6.32152033 0.32152032852172852 0.10337532165272023 +2933 6 6.241534 0.24153423309326172 0.058338785755950084 +2934 5 5.298636 0.29863595962524414 0.089183436381290448 +2937 5 5.67272425 0.67272424697875977 0.45255791247313937 +2940 6 5.942824 0.057176113128662109 0.0032691079125015676 +2941 5 5.81210947 0.81210947036743164 0.65952179186047033 +2943 8 7.476893 0.52310705184936523 0.27364098769453449 +2944 6 5.942824 0.057176113128662109 0.0032691079125015676 +2947 6 6.210386 0.21038579940795898 0.044262184592525955 +2948 6 5.40534925 0.5946507453918457 0.3536095089950777 +2949 6 5.43621063 0.56378936767578125 0.31785845110425726 +2950 5 5.08234453 0.082344532012939453 0.0067806219524300104 +2953 5 5.08234453 0.082344532012939453 0.0067806219524300104 +2955 5 6.242766 1.2427659034729004 1.5444670908348144 +2956 6 6.03635645 0.036356449127197266 0.0013217913931384828 +2959 7 7.05597639 0.055976390838623047 0.0031333563313182822 +2961 6 6.331708 0.33170795440673828 0.11003016701670276 +2962 5 5.27895737 0.27895736694335938 0.07781721257197205 +2964 5 6.17455339 1.174553394317627 1.3795756761030589 +2965 8 7.1527915 0.84720849990844727 0.71776224231712149 +2967 6 5.957492 0.042508125305175781 0.0018069407169605256 +2968 5 5.81376457 0.81376457214355469 0.66221277887598262 +2970 5 5.81376457 0.81376457214355469 0.66221277887598262 +2971 5 4.99322844 0.0067715644836425781 4.5854085556129576E-05 +2975 6 6.17230034 0.17230033874511719 0.029687406731682131 +2981 7 6.48654 0.51346015930175781 0.26364133519018651 +2984 6 4.562323 1.4376769065856934 2.0669148877298085 +2985 7 6.512452 0.48754787445068359 0.23770292988137953 +2987 7 6.60074 0.39926004409790039 0.15940858281305736 +2989 6 6.429061 0.42906093597412109 0.18409328677898884 +2991 7 6.909401 0.09059906005859375 0.0082081896835006773 +2994 7 6.60074 0.39926004409790039 0.15940858281305736 +2996 8 5.7872653 2.2127346992492676 4.8961948492617466 +2997 6 6.427847 0.42784690856933594 0.18305297717233771 +2999 7 6.60074 0.39926004409790039 0.15940858281305736 +3000 7 6.512452 0.48754787445068359 0.23770292988137953 +3001 7 6.57342339 0.42657661437988281 0.18196760793580324 +3002 7 6.909401 0.09059906005859375 0.0082081896835006773 +3004 6 6.277748 0.27774810791015625 0.077144011447671801 +3005 6 6.057661 0.057661056518554688 0.003324797438835958 +3006 6 6.429061 0.42906093597412109 0.18409328677898884 +3013 6 6.67181063 0.67181062698364258 0.45132951852815495 +3014 6 5.558968 0.44103193283081055 0.19450916577648059 +3016 6 6.67181063 0.67181062698364258 0.45132951852815495 +3020 6 4.05025244 1.9497475624084473 3.801515557117682 +3022 5 5.064984 0.064983844757080078 0.004222900079412284 +3023 6 5.558968 0.44103193283081055 0.19450916577648059 +3026 6 5.6375 0.36250019073486328 0.13140638828281226 +3027 5 5.77296543 0.77296543121337891 0.5974755578508848 +3028 6 5.745474 0.25452613830566406 0.064783555080794031 +3029 8 7.19962168 0.80037832260131836 0.64060545929010004 +3031 6 5.923202 0.076797962188720703 0.0058979269963401748 +3033 6 5.77843237 0.22156763076782227 0.04909221500406602 +3034 6 5.63558245 0.36441755294799805 0.13280015289660696 +3037 6 5.42967224 0.5703277587890625 0.32527375244535506 +3038 6 6.38509274 0.38509273529052734 0.14829641477354016 +3039 6 5.31801128 0.68198871612548828 0.46510860892249184 +3040 5 6.381903 1.3819031715393066 1.9096563755103944 +3043 6 5.588426 0.41157388687133789 0.16939306435438084 +3044 6 5.87649345 0.12350654602050781 0.015253866909915814 +3045 6 6.14374876 0.14374876022338867 0.020663706065761289 +3046 6 6.83705759 0.83705759048461914 0.70066540978791636 +3049 5 5.32754469 0.3275446891784668 0.10728552340901842 +3050 4 5.0039525 1.0039525032043457 1.0079206286902718 +3053 5 5.62100029 0.62100028991699219 0.38564136007698835 +3055 6 6.298503 0.29850292205810547 0.089103994477227388 +3056 5 5.31829453 0.31829452514648438 0.10131140473822597 +3058 5 5.35015059 0.35015058517456055 0.12260543229808718 +3059 6 5.40152 0.598480224609375 0.35817857924848795 +3062 8 6.9144206 1.0855793952941895 1.178482623487298 +3064 5 5.388519 0.3885188102722168 0.15094686593533879 +3065 6 6.27987 0.27987003326416016 0.078327235519282112 +3066 5 5.388519 0.3885188102722168 0.15094686593533879 +3069 8 5.07914543 2.9208545684814453 8.5313914102189301 +3070 8 6.9144206 1.0855793952941895 1.178482623487298 +3072 6 6.397393 0.39739322662353516 0.15792137656626437 +3073 5 6.52471828 1.5247182846069336 2.3247658474147102 +3074 5 6.30772257 1.3077225685119629 1.7101383161955255 +3075 7 6.25977373 0.74022626876831055 0.54793492897465512 +3076 5 5.427511 0.42751121520996094 0.18276583913029754 +3077 5 5.35015059 0.35015058517456055 0.12260543229808718 +3078 5 6.802679 1.8026790618896484 3.2496518001753429 +3079 5 5.684782 0.68478202819824219 0.46892642614329816 +3080 6 5.40152 0.598480224609375 0.35817857924848795 +3084 6 6.54111862 0.54111862182617188 0.29280936288705561 +3086 7 7.17780447 0.17780447006225586 0.03161442957411964 +3088 6 6.27715 0.27715015411376953 0.076812207925286202 +3090 6 6.54111862 0.54111862182617188 0.29280936288705561 +3091 6 5.58051538 0.41948461532592773 0.17596734249514157 +3094 6 4.10049248 1.8995075225830078 3.6081288283494359 +3095 6 4.10049248 1.8995075225830078 3.6081288283494359 +3097 5 6.741381 1.7413811683654785 3.032408373537919 +3099 7 6.51613331 0.48386669158935547 0.23412697522962844 +3101 6 5.866829 0.13317108154296875 0.017734536959324032 +3102 6 5.42601442 0.57398557662963867 0.32945944217885881 +3104 5 5.773071 0.7730708122253418 0.59763848071474968 +3105 6 5.76177263 0.23822736740112305 0.056752278578869664 +3106 6 6.02370739 0.023707389831542969 0.00056204033262474695 +3108 5 5.81408358 0.81408357620239258 0.66273206904247672 +3111 7 6.49721241 0.50278759002685547 0.25279536068501329 +3112 5 5.442617 0.44261693954467773 0.1959097551718969 +3113 6 5.5020566 0.49794340133666992 0.24794763093473193 +3114 6 6.28996038 0.28996038436889648 0.084077024503358189 +3115 6 6.28996038 0.28996038436889648 0.084077024503358189 +3116 7 6.45204258 0.54795742034912109 0.30025733451566339 +3117 7 6.49721241 0.50278759002685547 0.25279536068501329 +3119 5 4.900861 0.099139213562011719 0.0098285836656941683 +3120 6 5.438194 0.56180620193481445 0.31562620853242151 +3122 6 6.961881 0.96188116073608398 0.92521536737899623 +3124 6 5.5020566 0.49794340133666992 0.24794763093473193 +3125 5 5.66976547 0.66976547241210938 0.44858578803541604 +3126 7 6.22714758 0.77285242080688477 0.59730086434706209 +3128 6 6.38471365 0.38471364974975586 0.14800459230377783 +3131 5 5.26796055 0.26796054840087891 0.071802855499299767 +3133 6 6.66105556 0.66105556488037109 0.43699445985930652 +3135 6 5.55962849 0.44037151336669922 0.19392706978487695 +3138 6 6.08207035 0.082070350646972656 0.0067355424553170451 +3140 6 5.55962849 0.44037151336669922 0.19392706978487695 +3141 7 5.62027645 1.3797235488891602 1.9036370713592987 +3143 5 5.493113 0.49311304092407227 0.24316047112938577 +3144 6 5.89535141 0.10464859008789063 0.01095132740738336 +3145 6 5.89535141 0.10464859008789063 0.01095132740738336 +3146 6 5.89535141 0.10464859008789063 0.01095132740738336 +3147 6 5.691378 0.30862188339233398 0.095247466908631395 +3151 6 5.89535141 0.10464859008789063 0.01095132740738336 +3154 6 6.88422871 0.88422870635986328 0.78186040515083732 +3157 7 6.794643 0.20535707473754883 0.042171528144763215 +3158 7 7.03653 0.036530017852783203 0.0013344422043246595 +3159 6 6.4036 0.40360021591186523 0.16289313428410424 +3162 7 6.794643 0.20535707473754883 0.042171528144763215 +3164 6 5.591423 0.40857696533203125 0.16693513659993187 +3166 6 6.93464851 0.93464851379394531 0.87356784433723078 +3167 7 6.354538 0.6454620361328125 0.41662124008871615 +3168 6 6.76005125 0.76005125045776367 0.5776779033224102 +3172 8 6.63394737 1.3660526275634766 1.8660997812730784 +3173 8 6.65707636 1.342923641204834 1.8034439061068497 +3174 8 6.82011032 1.1798896789550781 1.3921396545047173 +3175 6 5.84485531 0.15514469146728516 0.024069875290479104 +3176 6 6.38577461 0.38577461242675781 0.1488220515930152 +3177 5 5.93752146 0.93752145767211914 0.87894648359565508 +3178 6 5.928312 0.071688175201416016 0.0051391944637089182 +3179 4 5.694992 1.6949920654296875 2.872998101869598 +3181 6 6.218146 0.21814584732055664 0.047587610703203609 +3182 5 6.04654074 1.0465407371520996 1.09524751451886 +3183 6 6.174143 0.17414283752441406 0.030325727861054474 +3189 5 6.06723547 1.0672354698181152 1.1389915480378932 +3190 7 7.04060841 0.040608406066894531 0.0016490426432937966 +3192 6 6.218146 0.21814584732055664 0.047587610703203609 +3193 5 6.04654074 1.0465407371520996 1.09524751451886 +3195 6 6.26814 0.26813983917236328 0.071898973351380846 +3197 6 6.472759 0.47275876998901367 0.22350085460152513 +3199 7 6.48691034 0.51308965682983398 0.2632609959457568 +3200 7 7.05278635 0.052786350250244141 0.0027863987727414496 +3201 6 6.472759 0.47275876998901367 0.22350085460152513 +3204 5 5.69841528 0.69841527938842773 0.48778390248321557 +3206 7 6.803375 0.1966252326965332 0.03866148213296583 +3208 5 6.13848734 1.1384873390197754 1.296153421108329 +3209 5 5.56524849 0.56524848937988281 0.31950585474623949 +3211 6 6.22323 0.22322988510131836 0.049831581602347796 +3212 5 6.169505 1.1695051193237305 1.367742224124413 +3215 6 6.30010271 0.30010271072387695 0.090061636983818971 +3216 5 6.26681948 1.2668194770812988 1.6048315875125354 +3217 5 5.16897726 0.16897726058959961 0.028553314596365453 +3218 4 5.06769848 1.0676984786987305 1.1399800414155834 +3220 5 5.50094748 0.50094747543334961 0.25094837314304641 +3224 6 6.3995347 0.39953470230102539 0.15962797834276898 +3225 7 6.534587 0.46541309356689453 0.21660934766350692 +3228 6 5.305252 0.6947479248046875 0.48267467902041972 +3229 7 6.28676 0.71324014663696289 0.50871150677471633 +3230 6 5.628512 0.37148809432983398 0.13800340422881163 +3231 6 6.54455757 0.54455757141113281 0.29654294858119101 +3233 6 6.819964 0.81996393203735352 0.6723408498421577 +3234 6 5.81466961 0.18533039093017578 0.034347353802331781 +3235 6 6.3995347 0.39953470230102539 0.15962797834276898 +3237 7 6.28185368 0.71814632415771484 0.51573414290123765 +3238 5 5.628002 0.62800216674804688 0.39438672144024167 +3243 7 6.62556076 0.37443923950195313 0.14020474407880101 +3245 5 5.628002 0.62800216674804688 0.39438672144024167 +3249 7 6.28185368 0.71814632415771484 0.51573414290123765 +3250 6 7.093312 1.0933117866516113 1.1953306628313385 +3254 5 6.18474531 1.1847453117370605 1.4036214536829448 +3257 6 6.21816874 0.21816873550415039 0.047597597151479931 +3259 6 6.21816874 0.21816873550415039 0.047597597151479931 +3260 6 6.21816874 0.21816873550415039 0.047597597151479931 +3261 5 6.670792 1.6707921028137207 2.7915462508246947 +3262 7 6.145352 0.85464811325073242 0.73042339748303675 +3265 3 5.247516 2.2475161552429199 5.0513288680779169 +3268 6 6.50005341 0.50005340576171875 0.25005340861389413 +3270 5 6.018678 1.0186781883239746 1.0377052513670151 +3276 8 6.301276 1.6987237930297852 2.8856625250055004 +3279 6 5.93030453 0.069695472717285156 0.0048574589172858396 +3280 5 6.018678 1.0186781883239746 1.0377052513670151 +3285 7 6.433152 0.56684780120849609 0.32131642973490671 +3286 7 6.352344 0.64765596389770508 0.41945824757226546 +3289 5 5.342055 0.34205484390258789 0.11700151623722377 +3291 8 6.82019329 1.1798067092895508 1.3919438712846386 +3292 5 5.342055 0.34205484390258789 0.11700151623722377 +3294 6 5.68973255 0.31026744842529297 0.096265889552341832 +3301 8 6.82019329 1.1798067092895508 1.3919438712846386 +3304 7 6.88351154 0.11648845672607422 0.013569560550422466 +3307 3 5.8957386 2.8957386016845703 8.3853020492861106 +3312 7 6.76305866 0.23694133758544922 0.056141197456781811 +3315 7 6.36094856 0.63905143737792969 0.40838673961479799 +3320 5 5.636375 0.63637495040893555 0.40497307750797518 +3322 7 6.73071337 0.2692866325378418 0.072515290463570636 +3324 6 6.155808 0.1558079719543457 0.024276124124526177 +3325 7 6.96725035 0.032749652862548828 0.0010725397626174527 +3327 7 6.50289774 0.49710226058959961 0.2471106574832902 +3329 6 6.26983547 0.26983547210693359 0.072811182007171737 +3331 6 5.80678654 0.19321346282958984 0.037331442218601296 +3334 6 6.02954 0.029540061950683594 0.00087261526005022461 +3338 6 4.53636837 1.4636316299438477 2.1422175481720842 +3339 6 5.969812 0.030188083648681641 0.00091132039437979984 +3340 6 6.42462969 0.42462968826293945 0.18031037215428114 +3341 6 5.969812 0.030188083648681641 0.00091132039437979984 +3345 6 5.878929 0.12107086181640625 0.014658153580967337 +3348 6 4.53636837 1.4636316299438477 2.1422175481720842 +3349 6 5.888847 0.11115312576293945 0.012355017366871834 +3350 6 6.474879 0.47487878799438477 0.22550986328701583 +3352 6 6.51672649 0.51672649383544922 0.26700626943147654 +3353 6 6.63064528 0.6306452751159668 0.39771346302609345 +3354 7 6.961644 0.038355827331542969 0.0014711694902871386 +3358 6 6.51672649 0.51672649383544922 0.26700626943147654 +3360 7 6.0704236 0.92957639694213867 0.86411227775192856 +3362 6 6.474879 0.47487878799438477 0.22550986328701583 +3364 6 6.260106 0.26010608673095703 0.067655176354492141 +3367 6 6.59981632 0.59981632232666016 0.35977962052947987 +3368 6 5.883497 0.11650276184082031 0.013572893516538898 +3373 7 6.808924 0.19107580184936523 0.036509962052377887 +3374 5 5.82516146 0.82516145706176758 0.6808914302202993 +3375 6 5.946118 0.053882122039794922 0.0029032830755113537 +3377 6 5.72262573 0.277374267578125 0.076936484314501286 +3378 8 6.531135 1.468864917755127 2.1575641466117759 +3379 5 5.22318745 0.22318744659423828 0.049812636317255965 +3380 7 6.92272663 0.077273368835449219 0.0059711735311793745 +3381 7 6.2997756 0.70022439956665039 0.49031420974847606 +3385 6 6.621978 0.62197780609130859 0.38685639127015747 +3386 8 6.531135 1.468864917755127 2.1575641466117759 +3388 6 5.837392 0.16260814666748047 0.026441409362632839 +3391 8 6.387185 1.6128149032592773 2.6011719121752321 +3392 6 6.6376133 0.63761329650878906 0.40655071588480496 +3393 6 6.22890139 0.22890138626098633 0.052395844632201261 +3394 5 5.47459 0.47458982467651367 0.22523550168648399 +3395 5 5.509231 0.5092310905456543 0.25931630357831637 +3396 6 6.11340332 0.1134033203125 0.012860313057899475 +3398 5 5.378982 0.3789820671081543 0.14362740718956957 +3402 6 5.28050137 0.71949863433837891 0.51767828481479228 +3403 5 6.06067371 1.060673713684082 1.125028726900382 +3404 6 5.25454664 0.7454533576965332 0.55570070850103548 +3407 5 5.378982 0.3789820671081543 0.14362740718956957 +3410 7 6.179308 0.82069206237792969 0.67353546125013963 +3412 6 5.82096052 0.17903947830200195 0.032055134790653028 +3413 6 5.61508751 0.38491249084472656 0.14815762560829171 +3415 7 6.34700537 0.65299463272094727 0.42640199036236481 +3417 4 6.689371 2.6893711090087891 7.232716961971164 +3418 6 5.75941849 0.24058151245117188 0.057879464133293368 +3419 7 6.34700537 0.65299463272094727 0.42640199036236481 +3420 5 5.35013247 0.35013246536254883 0.12259274330085645 +3421 8 6.36025953 1.6397404670715332 2.6887487993519699 +3424 6 6.2162385 0.21623849868774414 0.046759088314729524 +3426 6 6.236654 0.23665380477905273 0.056005023316402003 +3427 6 6.425235 0.42523479461669922 0.18082463055270637 +3428 6 6.2162385 0.21623849868774414 0.046759088314729524 +3429 5 5.9808383 0.98083829879760742 0.96204376838818462 +3430 6 6.236654 0.23665380477905273 0.056005023316402003 +3432 5 6.193153 1.193152904510498 1.4236138535418377 +3433 7 6.986817 0.013183116912841797 0.00017379457153765543 +3434 6 5.64902449 0.35097551345825195 0.1231838110472836 +3436 6 6.465708 0.46570777893066406 0.21688373535653227 +3438 5 5.14778042 0.14778041839599609 0.021839052061295661 +3440 5 6.438942 1.4389419555664063 2.0705539514892735 +3441 5 6.080147 1.0801467895507813 1.1667170869768597 +3443 6 6.19375563 0.1937556266784668 0.037541242869565394 +3444 5 5.14778042 0.14778041839599609 0.021839052061295661 +3445 8 6.94122648 1.0587735176086426 1.1210013615893786 +3446 6 5.21913433 0.78086566925048828 0.60975119341401296 +3447 6 6.29725456 0.29725456237792969 0.088360274854494492 +3448 7 7.261501 0.26150083541870117 0.068382686924678637 +3449 8 6.94122648 1.0587735176086426 1.1210013615893786 +3453 6 6.26551533 0.26551532745361328 0.070498389112799487 +3460 6 6.21407652 0.21407651901245117 0.045828755992488368 +3462 6 6.394197 0.39419698715209961 0.15539126467979258 +3464 5 5.73516941 0.73516941070556641 0.54047406243716978 +3466 6 6.394197 0.39419698715209961 0.15539126467979258 +3468 8 6.66443 1.3355698585510254 1.783746847070006 +3469 6 5.840723 0.15927696228027344 0.025369150713231647 +3471 6 6.21407652 0.21407651901245117 0.045828755992488368 +3474 6 5.58264971 0.41735029220581055 0.17418126640427545 +3476 8 7.32128954 0.6787104606628418 0.46064788941316692 +3479 7 7.112981 0.11298084259033203 0.012764670792421384 +3485 7 5.81863832 1.1813616752624512 1.3956154077789051 +3486 6 5.92535448 0.074645519256591797 0.0055719535450862168 +3489 8 5.245248 2.7547521591186523 7.5886594581688769 +3492 7 7.013208 0.013207912445068359 0.00017444895115659165 +3495 7 6.28093338 0.71906661987304688 0.51705680381564889 +3496 7 6.481858 0.5181422233581543 0.26847136362653146 +3498 6 5.777094 0.22290611267089844 0.049687135066051269 +3499 7 7.088905 0.088904857635498047 0.0079040737111881754 +3501 6 6.25927 0.25927019119262695 0.067221032041061335 +3505 7 6.2764 0.72359991073608398 0.52359683081726871 +3508 5 5.340404 0.34040403366088867 0.11587490613260343 +3509 6 5.88247347 0.11752653121948242 0.013812485540483976 +3510 6 6.16876173 0.1687617301940918 0.028480521578103435 +3512 6 6.10856533 0.10856533050537109 0.011786430987740459 +3514 6 6.71761 0.71760988235473633 0.51496394325317851 +3515 7 6.43362331 0.56637668609619141 0.32078255055330374 +3521 7 6.25795937 0.74204063415527344 0.55062430273756036 +3524 6 6.80415726 0.80415725708007813 0.64666889411455486 +3525 6 6.80415726 0.80415725708007813 0.64666889411455486 +3530 5 5.47427368 0.474273681640625 0.22493552509695292 +3534 5 5.47427368 0.474273681640625 0.22493552509695292 +3535 5 5.32360458 0.32360458374023438 0.10471992661769036 +3538 7 6.769995 0.23000478744506836 0.052902202247651076 +3539 6 6.66193151 0.66193151473999023 0.43815333020597791 +3540 6 6.68253851 0.68253850936889648 0.46585881677151519 +3545 6 5.902541 0.097458839416503906 0.0094982253804118955 +3548 6 6.40086937 0.40086936950683594 0.16069625140880817 +3549 6 6.234617 0.23461723327636719 0.055045246150257299 +3550 6 6.28539371 0.28539371490478516 0.081449572507153789 +3552 6 5.958351 0.04164886474609375 0.0017346279346384108 +3553 6 5.958351 0.04164886474609375 0.0017346279346384108 +3554 6 5.695507 0.30449295043945313 0.092715956867323257 +3556 7 6.32758856 0.67241144180297852 0.45213714706756036 +3557 6 5.695507 0.30449295043945313 0.092715956867323257 +3558 6 5.958351 0.04164886474609375 0.0017346279346384108 +3559 4 4.56899071 0.56899070739746094 0.32375042510466301 +3561 5 4.667524 0.33247613906860352 0.11054038304996538 +3562 6 6.965445 0.96544504165649414 0.93208412845910971 +3563 5 4.667524 0.33247613906860352 0.11054038304996538 +3565 6 5.897271 0.10272884368896484 0.010553215325671772 +3569 6 5.897271 0.10272884368896484 0.010553215325671772 +3570 6 6.1648035 0.16480350494384766 0.027160195241776819 +3571 4 4.48588562 0.4858856201171875 0.23608483583666384 +3575 7 6.23748446 0.76251554489135742 0.58142995620096372 +3583 6 5.41491938 0.58508062362670898 0.3423193361434187 +3584 7 6.06448555 0.93551445007324219 0.87518728629584075 +3586 7 6.019777 0.98022317886352539 0.96083748038131489 +3587 6 5.63349771 0.36650228500366211 0.13432392491290557 +3592 7 6.047007 0.95299291610717773 0.9081954981504623 +3598 7 6.731533 0.26846694946289063 0.072074502953910269 +3599 6 5.406142 0.59385776519775391 0.35266704528567061 +3600 6 6.567454 0.56745386123657227 0.32200388463229501 +3605 5 5.234682 0.23468208312988281 0.055075680142181227 +3607 6 6.07156134 0.071561336517333984 0.0051210248841471184 +3613 6 6.29382372 0.2938237190246582 0.086332377861481291 +3614 5 5.31686544 0.31686544418334961 0.10040370971751145 +3615 6 6.234737 0.23473691940307617 0.055101421330846279 +3616 5 5.135875 0.13587522506713867 0.018462076787045589 +3620 7 6.37463236 0.62536764144897461 0.39108468697145327 +3622 6 6.234737 0.23473691940307617 0.055101421330846279 +3625 5 5.135875 0.13587522506713867 0.018462076787045589 +3627 5 5.206159 0.20615911483764648 0.042501580630641911 +3628 6 5.126278 0.87372207641601563 0.76339026681671385 +3629 6 5.37236261 0.62763738632202148 0.39392868870913844 +3631 6 5.87679 0.12320995330810547 0.01518069259418553 +3635 6 6.12622452 0.12622451782226563 0.015932628899463452 +3637 7 5.76559067 1.2344093322753906 1.5237663996085757 +3638 7 6.650932 0.34906816482543945 0.12184858369460017 +3639 6 6.99471331 0.99471330642700195 0.98945456198293869 +3640 6 6.340162 0.34016180038452148 0.11571005044083904 +3643 6 6.340162 0.34016180038452148 0.11571005044083904 +3645 6 6.351741 0.35174083709716797 0.12372161648181645 +3646 7 5.50947475 1.4905252456665039 2.2216655079691918 +3647 7 7.066052 0.066051959991455078 0.0043628614187127823 +3650 4 5.207849 1.2078490257263184 1.4588992689480165 +3652 6 5.94521332 0.05478668212890625 0.0030015805386938155 +3653 6 5.465872 0.53412818908691406 0.28529292237726622 +3655 7 7.232871 0.23287105560302734 0.054228928537668253 +3656 7 6.5983386 0.40166139602661133 0.1613318770580463 +3658 7 6.19759941 0.80240058898925781 0.64384670521030785 +3660 8 7.28588152 0.71411848068237305 0.50996520445210081 +3661 6 6.05568 0.055679798126220703 0.0031002399193766905 +3668 5 4.161898 0.83810186386108398 0.70241473420742295 +3677 6 6.41289663 0.41289663314819336 0.17048362966511377 +3679 7 6.120346 0.8796539306640625 0.77379103773273528 +3680 6 6.035059 0.035058975219726563 0.0012291317434574012 +3681 8 6.888233 1.1117668151855469 1.2360254513478139 +3684 7 6.92954063 0.070459365844726563 0.0049645222352410201 +3687 5 6.88020945 1.8802094459533691 3.5351875606522754 +3688 6 6.72161055 0.72161054611206055 0.52072178026014626 +3697 6 6.035059 0.035058975219726563 0.0012291317434574012 +3698 6 6.39411926 0.3941192626953125 0.15532999322749674 +3699 5 5.1721015 0.17210149765014648 0.029618925493423376 +3702 6 5.99003363 0.0099663734436035156 9.9328599617365398E-05 +3703 6 5.99003363 0.0099663734436035156 9.9328599617365398E-05 +3704 6 5.99003363 0.0099663734436035156 9.9328599617365398E-05 +3706 6 6.51541328 0.51541328430175781 0.26565085363472463 +3714 4 5.95268631 1.9526863098144531 3.8129838245367864 +3716 5 6.049506 1.0495061874389648 1.1014632374726716 +3718 5 5.32817268 0.32817268371582031 0.10769731033724383 +3720 7 7.13351345 0.13351345062255859 0.017825841497142392 +3721 5 5.27913761 0.27913761138916016 0.077917806092045794 +3723 7 6.52531 0.47468996047973633 0.22533055858025364 +3724 6 6.28641844 0.28641843795776367 0.082035521602165318 +3728 7 6.68674 0.31326007843017578 0.098131876738079882 +3730 6 5.48833 0.51167011260986328 0.26180630413819017 +3731 6 6.3389554 0.33895540237426758 0.11489076479870164 +3733 6 6.53397942 0.53397941589355469 0.28513401659802184 +3734 5 5.700733 0.70073318481445313 0.49102699630020652 +3735 6 6.66451836 0.66451835632324219 0.44158464589054347 +3738 6 5.4453907 0.55460929870605469 0.30759147421122179 +3739 7 6.935587 0.064413070678710938 0.0041490436742606107 +3741 7 6.935587 0.064413070678710938 0.0041490436742606107 +3744 7 6.935587 0.064413070678710938 0.0041490436742606107 +3745 7 6.935587 0.064413070678710938 0.0041490436742606107 +3748 5 5.463842 0.46384191513061523 0.21514932223203687 +3749 6 6.3819747 0.38197469711303711 0.14590466923459644 +3750 7 6.935587 0.064413070678710938 0.0041490436742606107 +3753 5 5.480336 0.48033618927001953 0.23072285472244403 +3757 5 5.4016695 0.40166950225830078 0.1613383890444311 +3759 6 6.210043 0.21004295349121094 0.044118042311311001 +3762 5 5.33852148 0.33852148056030273 0.11459679280073942 +3764 8 7.608175 0.39182519912719727 0.15352698667106779 +3766 5 5.06073856 0.060738563537597656 0.0036891731006107875 +3767 5 5.06073856 0.060738563537597656 0.0036891731006107875 +3769 5 5.06073856 0.060738563537597656 0.0036891731006107875 +3771 6 5.91118431 0.088815689086914063 0.0078882266279833857 +3772 6 6.0771904 0.077190399169921875 0.0059583577240118757 +3776 5 6.74684 1.7468400001525879 3.0514499861330933 +3778 7 6.67663431 0.32336568832397461 0.10456536838523789 +3779 7 6.32261753 0.67738246917724609 0.45884700954866275 +3782 6 6.412977 0.41297721862792969 0.17055018310566084 +3785 7 6.92169 0.078310012817382813 0.0061324581074586604 +3786 5 5.189933 0.18993282318115234 0.036074477321562881 +3790 5 5.34790945 0.34790945053100586 0.12104098576878641 +3794 5 5.83044529 0.83044528961181641 0.68963937903845363 +3795 6 5.59086227 0.40913772583007813 0.16739367869740818 +3796 6 6.42995358 0.42995357513427734 0.18486007677074667 +3797 5 5.022169 0.022169113159179688 0.00049146957826451398 +3799 5 6.094518 1.0945181846618652 1.1979700565555049 +3802 5 5.595747 0.59574699401855469 0.35491448088214383 +3803 6 6.150232 0.15023183822631836 0.02256960521685869 +3804 5 5.549744 0.5497441291809082 0.30221860756887509 +3806 5 5.022169 0.022169113159179688 0.00049146957826451398 +3807 5 5.709923 0.70992279052734375 0.50399036851013079 +3810 3 5.56449556 2.5644955635070801 6.5766374952474962 +3811 5 5.97139454 0.97139453887939453 0.94360735016471153 +3812 5 5.595747 0.59574699401855469 0.35491448088214383 +3813 5 6.094518 1.0945181846618652 1.1979700565555049 +3814 5 5.48091125 0.4809112548828125 0.23127563507296145 +3816 5 5.563448 0.56344795227050781 0.31747359491782845 +3817 6 6.265292 0.26529216766357422 0.070379934223637974 +3818 6 6.96043253 0.96043252944946289 0.9224306436246934 +3819 6 6.96043253 0.96043252944946289 0.9224306436246934 +3822 6 6.096108 0.096107959747314453 0.0092367399267914152 +3825 6 6.25888348 0.25888347625732422 0.067020654279076552 +3826 6 6.96043253 0.96043252944946289 0.9224306436246934 +3827 5 6.038882 1.038881778717041 1.079275350150283 +3828 6 6.265292 0.26529216766357422 0.070379934223637974 +3829 7 7.161894 0.16189384460449219 0.026209616920823464 +3831 5 5.2977705 0.29777050018310547 0.088667270779296814 +3832 5 5.2977705 0.29777050018310547 0.088667270779296814 +3835 5 4.87871933 0.12128067016601563 0.014709000955917872 +3836 6 5.974171 0.025828838348388672 0.00066712889042719326 +3837 6 5.974171 0.025828838348388672 0.00066712889042719326 +3840 6 6.614344 0.61434412002563477 0.37741869781007154 +3842 6 6.45290661 0.45290660858154297 0.20512439609683497 +3844 6 6.614344 0.61434412002563477 0.37741869781007154 +3845 5 4.981601 0.018398761749267578 0.00033851443390631175 +3846 6 6.192758 0.19275808334350586 0.037155678694261951 +3847 5 4.981601 0.018398761749267578 0.00033851443390631175 +3849 5 4.961581 0.038418769836425781 0.0014760018757442595 +3851 7 7.275682 0.27568197250366211 0.076000549963509911 +3852 6 6.26231146 0.26231145858764648 0.068807301306378577 +3856 6 6.26231146 0.26231145858764648 0.068807301306378577 +3857 6 6.128902 0.12890195846557617 0.016615714896261125 +3858 6 6.57184649 0.57184648513793945 0.32700840256461561 +3859 5 5.50589275 0.50589275360107422 0.25592747814607719 +3861 6 5.85925865 0.14074134826660156 0.019808127111900831 +3864 7 6.47671556 0.5232844352722168 0.27382660019816285 +3865 6 7.15604162 1.1560416221618652 1.3364322321706368 +3867 5 5.50589275 0.50589275360107422 0.25592747814607719 +3868 6 5.647613 0.3523869514465332 0.12417656354978135 +3871 6 5.68695974 0.31304025650024414 0.097994202189738644 +3873 5 5.255146 0.25514602661132813 0.06509949489554856 +3874 5 5.43803358 0.4380335807800293 0.19187341789097445 +3877 5 5.99010754 0.99010753631591797 0.98031293346957682 +3878 5 5.527993 0.52799320220947266 0.27877682157941308 +3879 4 4.91237736 0.91237735748291016 0.83243244244749803 +3880 6 5.699999 0.30000114440917969 0.090000686646817485 +3881 6 5.699999 0.30000114440917969 0.090000686646817485 +3882 5 5.99318933 0.99318933486938477 0.98642505489829091 +3883 6 6.58375263 0.58375263214111328 0.34076713553167792 +3884 6 5.699999 0.30000114440917969 0.090000686646817485 +3885 6 6.473375 0.47337484359741211 0.22408374255087438 +3887 6 6.473375 0.47337484359741211 0.22408374255087438 +3890 6 6.30750275 0.30750274658203125 0.094557939155492932 +3892 5 6.229194 1.229194164276123 1.5109182934904766 +3895 6 6.381786 0.38178586959838867 0.14576045022499784 +3896 6 5.91276646 0.087233543395996094 0.0076096910934211337 +3898 7 6.231013 0.76898717880249023 0.59134128116261309 +3899 5 6.229194 1.229194164276123 1.5109182934904766 +3901 4 4.6103096 0.61030960083007813 0.3724778088653693 +3902 6 6.039623 0.039622783660888672 0.0015699649850375863 +3905 7 7.09633732 0.096337318420410156 0.009280878920435498 +3906 7 7.09633732 0.096337318420410156 0.009280878920435498 +3908 7 6.07826757 0.92173242568969727 0.84959066456781329 +3909 7 6.07826757 0.92173242568969727 0.84959066456781329 +3910 6 6.56103 0.56102991104125977 0.31475456108296385 +3911 6 5.48336744 0.5166325569152832 0.26690919886482334 +3913 6 5.76502657 0.23497343063354492 0.055212513103697347 +3914 7 6.07826757 0.92173242568969727 0.84959066456781329 +3915 7 7.30798674 0.30798673629760742 0.094855829735251973 +3917 5 5.298418 0.29841804504394531 0.089053329607850173 +3920 6 5.70013428 0.29986572265625 0.089919451624155045 +3922 7 6.772524 0.22747611999511719 0.051745385168032954 +3923 5 4.84254742 0.15745258331298828 0.024791315991933516 +3925 5 5.9297 0.92969989776611328 0.86434189990632149 +3926 6 6.27461052 0.27461051940917969 0.075410937370179454 +3927 5 6.35843372 1.358433723449707 1.8453421810054351 +3928 5 5.164068 0.16406822204589844 0.026918381485302234 +3930 6 6.30921459 0.30921459197998047 0.095613663893345802 +3931 6 6.703116 0.70311594009399414 0.49437202521426116 +3932 8 6.61660242 1.3833975791931152 1.9137888621173715 +3933 4 5.20369053 1.2036905288696289 1.4488708892904469 +3936 6 6.05036974 0.050369739532470703 0.002537110660568942 +3937 5 5.59848833 0.59848833084106445 0.35818828215292342 +3940 5 5.272034 0.2720341682434082 0.07400258869188292 +3941 5 5.37050867 0.37050867080688477 0.1372766751430845 +3942 6 5.744685 0.25531482696533203 0.065185660868337436 +3943 6 5.6546936 0.345306396484375 0.11923650745302439 +3944 6 6.18634558 0.18634557723999023 0.034724674156905166 +3945 6 6.18634558 0.18634557723999023 0.034724674156905166 +3946 6 6.70885563 0.70885562896728516 0.50247630271860544 +3947 7 6.46026945 0.53973054885864258 0.29130906537125156 +3949 5 5.272034 0.2720341682434082 0.07400258869188292 +3950 5 5.37050867 0.37050867080688477 0.1372766751430845 +3951 5 5.32029867 0.32029867172241211 0.10259123910714152 +3952 6 6.31042576 0.31042575836181641 0.096364151454508828 +3953 7 6.074407 0.92559289932250977 0.8567222152762497 +3954 5 5.32029867 0.32029867172241211 0.10259123910714152 +3956 5 5.69653654 0.69653654098510742 0.48516315292749823 +3959 6 5.67546844 0.32453155517578125 0.10532073030481115 +3960 6 5.61647 0.3835301399230957 0.14709536822942937 +3962 7 7.10236073 0.10236072540283203 0.010477718104993983 +3963 7 6.26382637 0.73617362976074219 0.54195161315510632 +3965 4 5.4957037 1.4957036972045898 2.2371295498314794 +3967 4 5.365923 1.3659229278564453 1.8657454448439239 +3970 7 6.320763 0.67923688888549805 0.46136275122285042 +3973 4 5.365923 1.3659229278564453 1.8657454448439239 +3978 7 5.71544456 1.2845554351806641 1.6500826660521852 +3982 7 7.37746859 0.37746858596801758 0.14248253339269468 +3985 6 6.22989225 0.22989225387573242 0.052850448392064209 +3990 6 5.629327 0.37067317962646484 0.13739860609439347 +3993 7 6.456397 0.54360294342041016 0.29550416009533365 +3994 7 6.456397 0.54360294342041016 0.29550416009533365 +3995 5 4.807619 0.19238090515136719 0.037010412666859338 +3996 7 6.456397 0.54360294342041016 0.29550416009533365 +3997 7 6.59891129 0.40108871459960938 0.1608721569791669 +4002 6 5.69266367 0.30733633041381836 0.094455619992231732 +4003 6 6.37953 0.37952995300292969 0.14404298522640602 +4004 7 6.56926346 0.43073654174804688 0.18553396839706693 +4006 6 6.12772465 0.12772464752197266 0.016313585584612156 +4009 6 5.98062944 0.019370555877685547 0.00037521843501053809 +4010 6 6.53024626 0.53024625778198242 0.28116109389179655 +4011 7 6.59891129 0.40108871459960938 0.1608721569791669 +4014 6 6.0624485 0.062448501586914063 0.0038998153504508082 +4015 5 5.20229053 0.20229053497314453 0.040921460539721011 +4017 6 6.266227 0.26622676849365234 0.07087669226257276 +4018 6 6.0624485 0.062448501586914063 0.0038998153504508082 +4019 5 5.20229053 0.20229053497314453 0.040921460539721011 +4021 5 5.525948 0.52594804763793945 0.27662134881416023 +4022 5 5.184402 0.1844019889831543 0.034004093540943359 +4024 6 6.41054964 0.41054964065551758 0.16855100744237461 +4025 6 6.88123941 0.88123941421508789 0.77658290516615125 +4027 5 5.225659 0.22565889358520508 0.05092193625409891 +4029 6 6.156711 0.15671110153198242 0.024558369343367303 +4031 5 5.03427553 0.034275531768798828 0.0011748120780339377 +4032 5 5.47714472 0.47714471817016602 0.22766708207768716 +4033 6 5.79416132 0.20583868026733398 0.042369562294197749 +4034 5 5.47714472 0.47714471817016602 0.22766708207768716 +4035 6 6.311769 0.31176900863647461 0.09719991474617018 +4037 5 5.1469183 0.14691829681396484 0.021584985938716272 +4039 4 5.378083 1.3780832290649414 1.8991133862300558 +4043 7 6.78501034 0.21498966217041016 0.046220554840147088 +4044 7 6.78501034 0.21498966217041016 0.046220554840147088 +4047 6 6.32993937 0.32993936538696289 0.10885998483195181 +4049 6 6.327114 0.32711410522460938 0.10700363783689681 +4050 7 6.78501034 0.21498966217041016 0.046220554840147088 +4051 6 7.054825 1.0548248291015625 1.1126554200891405 +4052 5 5.30189657 0.30189657211303711 0.091141540253602216 +4053 7 6.78501034 0.21498966217041016 0.046220554840147088 +4054 7 6.77009153 0.22990846633911133 0.052857902894402287 +4055 6 7.054825 1.0548248291015625 1.1126554200891405 +4056 5 5.582327 0.58232688903808594 0.33910460569677525 +4059 6 6.327114 0.32711410522460938 0.10700363783689681 +4064 5 6.198673 1.1986727714538574 1.4368164130248715 +4066 6 6.30273151 0.30273151397705078 0.091646369554837293 +4070 5 5.66637039 0.66637039184570313 0.44404949912859593 +4071 6 6.1098485 0.1098484992980957 0.012066692798043732 +4075 6 5.666741 0.33325910568237305 0.11106163152021509 +4078 6 5.879165 0.1208348274230957 0.014601055518369321 +4082 6 6.022336 0.022336006164550781 0.0004988971713828505 +4085 6 5.08671474 0.91328525543212891 0.83408995778972894 +4086 6 5.488061 0.51193904876708984 0.26208158965255279 +4087 6 5.64334774 0.35665225982666016 0.12720083443946351 +4088 6 5.72493553 0.27506446838378906 0.075660461767256493 +4091 6 5.634808 0.36519193649291992 0.13336515047944886 +4094 7 7.48243332 0.48243331909179688 0.2327419073699275 +4096 5 5.089331 0.089331150054931641 0.0079800543701367133 +4097 6 5.634808 0.36519193649291992 0.13336515047944886 +4099 6 5.024937 0.97506284713745117 0.95074755586779247 +4100 6 6.250351 0.2503509521484375 0.062675599241629243 +4101 5 5.439694 0.43969392776489258 0.19333075011331857 +4102 5 5.439694 0.43969392776489258 0.19333075011331857 +4103 7 6.61045074 0.38954925537109375 0.15174862236017361 +4105 7 6.051799 0.94820117950439453 0.89908547681352502 +4107 6 6.30281353 0.30281352996826172 0.091696033931839338 +4108 6 6.50387859 0.50387859344482422 0.25389363693193445 +4109 6 6.676968 0.67696809768676758 0.45828580528564089 +4111 6 5.916855 0.0831451416015625 0.0069131145719438791 +4112 6 6.29033375 0.29033374786376953 0.084293685148622899 +4119 7 6.77510738 0.22489261627197266 0.05057668885365274 +4120 5 5.63756371 0.63756370544433594 0.40648747849991196 +4122 6 5.22994566 0.77005434036254883 0.5929836871112002 +4125 5 5.72206545 0.72206544876098633 0.52137851229440457 +4126 5 5.6171937 0.61719369888305664 0.38092806194094919 +4128 5 5.545142 0.54514217376708984 0.29717998961950798 +4131 5 5.435503 0.43550300598144531 0.18966286821887479 +4132 5 5.435503 0.43550300598144531 0.18966286821887479 +4133 6 6.504245 0.50424480438232422 0.25426282274656842 +4134 6 6.438658 0.43865823745727539 0.1924210492891234 +4136 6 6.71551752 0.71551752090454102 0.51196532272138029 +4137 5 5.435503 0.43550300598144531 0.18966286821887479 +4138 6 5.60441542 0.3955845832824707 0.156487162530766 +4139 7 6.48148727 0.51851272583007813 0.26885544684773777 +4140 6 5.954033 0.04596710205078125 0.0021129744709469378 +4141 6 5.954033 0.04596710205078125 0.0021129744709469378 +4143 6 5.744161 0.25583887100219727 0.065453527915678933 +4147 7 6.48148727 0.51851272583007813 0.26885544684773777 +4149 7 6.590849 0.40915107727050781 0.16740460403161705 +4150 5 5.16339254 0.16339254379272461 0.026697123367057429 +4151 6 6.510788 0.5107879638671875 0.26090434403158724 +4152 6 5.592431 0.40756893157958984 0.16611243398892839 +4154 5 5.376306 0.37630605697631836 0.14160624851706416 +4155 5 5.29260063 0.29260063171386719 0.085615129679354141 +4159 7 7.16390467 0.16390466690063477 0.026864739831808038 +4160 7 7.16390467 0.16390466690063477 0.026864739831808038 +4162 7 7.16390467 0.16390466690063477 0.026864739831808038 +4163 5 5.101523 0.10152292251586914 0.010306903796163169 +4165 7 6.356756 0.64324378967285156 0.4137625729526917 +4166 7 6.32713461 0.67286539077758789 0.45274783410627606 +4168 6 6.39330339 0.39330339431762695 0.15468755998176675 +4169 7 6.687795 0.31220483779907227 0.097471860745145023 +4170 7 7.16390467 0.16390466690063477 0.026864739831808038 +4171 5 6.347183 1.3471832275390625 1.8149026485625654 +4174 6 5.44309568 0.55690431594848633 0.31014241712205148 +4177 6 6.19482231 0.19482231140136719 0.037955733019771287 +4178 7 6.57164145 0.42835855484008789 0.18349105150468858 +4179 5 5.05455256 0.054552555084228516 0.0029759812662177865 +4180 6 5.084555 0.91544485092163086 0.83803927507892695 +4181 6 5.96743 0.03256988525390625 0.0010607974254526198 +4184 7 6.5577774 0.44222259521484375 0.19556082371855155 +4186 5 5.90006351 0.90006351470947266 0.8101143305111691 +4187 6 6.46320343 0.46320343017578125 0.21455741772660986 +4188 6 6.44960356 0.44960355758666992 0.20214335899459002 +4189 5 5.297014 0.29701423645019531 0.08821745665409253 +4195 8 6.76916 1.2308402061462402 1.5149676130661192 +4196 6 6.51287127 0.51287126541137695 0.26303693488466706 +4199 6 6.176452 0.1764521598815918 0.031135364726878834 +4203 5 5.38581276 0.38581275939941406 0.14885148531539016 +4205 6 6.52375174 0.52375173568725586 0.27431588063541312 +4206 6 5.432502 0.56749820709228516 0.32205421505295817 +4207 7 6.581491 0.41850900650024414 0.17514978852182139 +4208 6 6.212375 0.21237516403198242 0.04510321029761144 +4210 6 5.67804 0.3219599723815918 0.10365822381595535 +4211 6 5.51014376 0.48985624313354492 0.23995913893691068 +4212 4 5.212126 1.2121257781982422 1.4692489021726942 +4213 4 5.060474 1.0604739189147949 1.124604932698503 +4215 5 5.059038 0.059038162231445313 0.0034855045996664558 +4218 6 6.394302 0.3943018913269043 0.15547398150397385 +4221 6 6.65286064 0.65286064147949219 0.42622701719301404 +4222 4 4.633886 0.63388586044311523 0.40181128406970856 +4223 4 4.400543 0.400543212890625 0.16043486539274454 +4225 5 5.63308668 0.6330866813659668 0.40079874612297317 +4227 7 5.683286 1.316713809967041 1.733735257357921 +4228 6 5.52954865 0.47045135498046875 0.22132447740295902 +4229 6 5.500939 0.49906110763549805 0.24906198915437017 +4230 6 5.10506773 0.89493227005004883 0.80090376797693352 +4231 6 6.10618258 0.10618257522583008 0.011274739281589063 +4233 6 5.702374 0.29762601852416992 0.088581246902549537 +4235 5 5.387373 0.38737297058105469 0.15005781833679066 +4236 5 5.387373 0.38737297058105469 0.15005781833679066 +4237 5 6.079797 1.0797967910766602 1.1659611100194525 +4240 6 6.04235 0.042349815368652344 0.0017935068617589423 +4241 6 6.64007854 0.64007854461669922 0.40970054327863181 +4244 5 5.441324 0.44132423400878906 0.19476707952344441 +4249 6 5.78925276 0.21074724197387695 0.044414399999595844 +4251 6 5.858612 0.141387939453125 0.019990549422800541 +4253 4 5.8745327 1.8745326995849609 3.5138728418132814 +4254 5 5.450234 0.45023393630981445 0.20271059740503006 +4256 5 5.133646 0.13364601135253906 0.017861256350443 +4257 5 6.02000427 1.0200042724609375 1.0404087158385664 +4260 6 6.01973867 0.019738674163818359 0.00038961525774539041 +4261 7 6.56697464 0.43302536010742188 0.18751096249616239 +4262 6 6.330959 0.33095884323120117 0.10953375591293479 +4263 6 5.64368629 0.35631370544433594 0.12695945668747299 +4266 7 6.56697464 0.43302536010742188 0.18751096249616239 +4268 6 6.285269 0.28526878356933594 0.081378278879128629 +4271 5 5.01476955 0.014769554138183594 0.00021813972944073612 +4272 6 5.781704 0.21829605102539063 0.047653165893279947 +4274 6 5.781704 0.21829605102539063 0.047653165893279947 +4275 6 5.781704 0.21829605102539063 0.047653165893279947 +4278 4 4.938565 0.93856477737426758 0.88090384132760846 +4279 6 6.01974726 0.019747257232666016 0.00038995416821308027 +4281 5 5.319337 0.31933689117431641 0.1019760500648772 +4288 6 6.14997339 0.14997339248657227 0.02249201845393145 +4291 5 5.485445 0.48544502258300781 0.23565686995061697 +4292 6 6.1382513 0.13825130462646484 0.01911342323091958 +4295 5 5.485445 0.48544502258300781 0.23565686995061697 +4297 6 6.570992 0.57099199295043945 0.3260318560135147 +4300 5 5.6564436 0.65644359588623047 0.43091819458004466 +4301 5 5.090175 0.090175151824951172 0.0081315580066529947 +4304 6 6.063004 0.063004016876220703 0.0039695061425391032 +4306 6 5.888244 0.1117558479309082 0.012489369546756279 +4307 7 6.46735144 0.53264856338500977 0.28371449207611477 +4308 6 6.231441 0.23144102096557617 0.053564946185588269 +4310 6 5.56281471 0.43718528747558594 0.19113097558511072 +4311 5 6.594462 1.5944619178771973 2.5423088075606302 +4314 7 6.20663929 0.79336071014404297 0.62942121640026016 +4315 7 7.05764341 0.057643413543701172 0.0033227631249701517 +4318 7 6.20663929 0.79336071014404297 0.62942121640026016 +4319 7 7.05764341 0.057643413543701172 0.0033227631249701517 +4322 7 6.27760839 0.72239160537719727 0.5218496315194443 +4323 6 6.29443645 0.29443645477294922 0.086692825899262971 +4324 6 6.31806231 0.31806230545043945 0.10116363014844865 +4325 5 5.31029463 0.31029462814331055 0.09628275625459537 +4327 5 5.31029463 0.31029462814331055 0.09628275625459537 +4331 5 5.391353 0.39135313034057617 0.153157272627368 +4336 8 7.729702 0.27029800415039063 0.073061011047684588 +4338 8 7.729702 0.27029800415039063 0.073061011047684588 +4339 8 5.958715 2.0412850379943848 4.1668446063397369 +4342 6 6.291953 0.29195308685302734 0.085236604923011328 +4344 6 5.317271 0.68272876739501953 0.46611856982872268 +4345 6 6.31709051 0.31709051132202148 0.10054639237046104 +4346 6 5.317271 0.68272876739501953 0.46611856982872268 +4347 7 6.621838 0.37816190719604492 0.14300642805415009 +4348 6 5.36084461 0.63915538787841797 0.40851960985401092 +4350 6 6.83250046 0.83250045776367188 0.69305701217672322 +4356 5 5.504216 0.50421619415283203 0.25423397044596641 +4357 6 6.453199 0.45319890975952148 0.2053892518072189 +4359 6 5.04429054 0.95570945739746094 0.9133805669589492 +4360 5 5.40712547 0.40712547302246094 0.16575115078376257 +4364 6 6.245087 0.2450871467590332 0.06006770950648388 +4367 5 5.45087051 0.45087051391601563 0.20328422031889204 +4368 6 6.67910862 0.67910861968994141 0.46118851733717747 +4371 5 5.74291 0.74290990829467773 0.55191513184240648 +4373 6 6.36110163 0.36110162734985352 0.13039438527471248 +4374 5 5.32525253 0.32525253295898438 0.10578921019623522 +4377 6 7.04408646 1.0440864562988281 1.0901165282266447 +4379 5 5.196431 0.19643115997314453 0.038585200608395098 +4381 6 6.36042356 0.36042356491088867 0.12990514614307358 +4383 6 7.04408646 1.0440864562988281 1.0901165282266447 +4384 5 5.18999052 0.18999052047729492 0.036096397871233421 +4385 5 5.18999052 0.18999052047729492 0.036096397871233421 +4387 6 6.435978 0.43597793579101563 0.19007676049659494 +4389 4 5.99478436 1.9947843551635742 3.9791646236053566 +4390 5 5.17939425 0.17939424514770508 0.032182295192114907 +4391 5 5.379522 0.37952184677124023 0.14403683217665275 +4392 5 5.17939425 0.17939424514770508 0.032182295192114907 +4394 6 5.834315 0.16568517684936523 0.027451577827605433 +4395 5 5.269406 0.26940584182739258 0.072579507610726068 +4396 5 5.316714 0.31671380996704102 0.10030763742383897 +4401 6 7.47518349 1.4751834869384766 2.1761663201359625 +4402 6 6.7421875 0.7421875 0.55084228515625 +4404 5 5.17557526 0.17557525634765625 0.030826670641545206 +4405 5 5.17557526 0.17557525634765625 0.030826670641545206 +4407 6 6.18221474 0.18221473693847656 0.033202210357558215 +4409 7 6.862802 0.13719797134399414 0.018823283340907437 +4412 7 6.47333336 0.52666664123535156 0.27737775099012651 +4416 5 5.318562 0.31856203079223633 0.10148176746247373 +4420 6 5.97056 0.029439926147460938 0.0008667092515679542 +4423 6 5.966315 0.033685207366943359 0.0011346931953539752 +4424 6 5.97056 0.029439926147460938 0.0008667092515679542 +4425 6 5.889046 0.11095380783081055 0.012310747472156436 +4427 5 5.589685 0.58968496322631836 0.34772835585522444 +4429 6 5.65252161 0.34747838973999023 0.12074123133629655 +4430 5 5.1771245 0.1771245002746582 0.031373088597547394 +4432 6 6.515359 0.51535892486572266 0.26559482143875357 +4433 5 4.73562431 0.26437568664550781 0.069894503689283738 +4434 6 6.01353645 0.013536453247070313 0.00018323556651012041 +4435 6 5.850846 0.1491541862487793 0.022246971275535543 +4438 5 5.73496962 0.7349696159362793 0.54018033634952189 +4441 6 6.27864456 0.27864456176757813 0.077642791802645661 +4444 6 6.3316474 0.33164739608764648 0.10998999533171627 +4450 6 6.14488649 0.14488649368286133 0.020992096051713816 +4451 5 5.14968872 0.149688720703125 0.022406713105738163 +4452 5 5.28926849 0.28926849365234375 0.083676261419896036 +4454 6 5.80965662 0.19034337997436523 0.036230602300065584 +4458 7 6.61311436 0.38688564300537109 0.14968050076367945 +4463 6 6.658324 0.65832376480102539 0.4333901793017958 +4464 5 5.120392 0.120391845703125 0.014494196511805058 +4467 5 5.73596573 0.73596572875976563 0.54164555390889291 +4468 6 6.12151051 0.12151050567626953 0.01476480298970273 +4469 6 6.24088 0.24088001251220703 0.058023180427881016 +4471 6 6.16272926 0.16272926330566406 0.026480813136004144 +4474 6 5.6268096 0.37319040298461914 0.13927107687982243 +4476 6 6.544504 0.54450416564941406 0.29648478640956455 +4477 5 5.24585152 0.24585151672363281 0.060442968275310704 +4479 5 4.967896 0.032104015350341797 0.0010306678016149817 +4480 5 6.4718976 1.4718976020812988 2.1664825510126775 +4483 4 4.978445 0.97844505310058594 0.95735472193700843 +4484 5 4.967896 0.032104015350341797 0.0010306678016149817 +4485 6 6.47099161 0.47099161148071289 0.2218330980851988 +4487 6 6.01450157 0.014501571655273438 0.00021029558047302999 +4488 6 6.66565847 0.66565847396850586 0.44310120396607999 +4490 6 6.46030855 0.46030855178833008 0.21188396284946975 +4492 6 6.17970562 0.17970561981201172 0.032294109792019299 +4495 6 5.32732725 0.67267274856567383 0.45248862666289824 +4500 6 5.7847333 0.21526670455932617 0.046339754091832219 +4501 6 4.38273048 1.6172695159912109 2.6155606873544457 +4502 6 6.209939 0.20993900299072266 0.044074384976738656 +4505 5 5.354311 0.35431098937988281 0.12553627719535143 +4506 6 6.38854027 0.38854026794433594 0.15096353981425636 +4508 4 6.35570669 2.3557066917419434 5.5493540175177714 +4510 6 7.131123 1.1311230659484863 1.2794393903207038 +4513 6 6.408106 0.40810585021972656 0.16655038498356589 +4515 6 6.40050936 0.40050935745239258 0.16040774540692837 +4518 6 5.206761 0.79323911666870117 0.62922829621334131 +4519 6 6.27893829 0.27893829345703125 0.077806571556720883 +4523 5 6.205263 1.2052631378173828 1.4526592313814035 +4524 6 5.74004173 0.25995826721191406 0.067578300691820914 +4525 6 6.27893829 0.27893829345703125 0.077806571556720883 +4529 6 5.65850925 0.34149074554443359 0.11661592929249309 +4537 5 5.47643948 0.47643947601318359 0.22699457430371694 +4538 6 7.06011152 1.0601115226745605 1.1238364405073753 +4539 5 5.625727 0.62572717666625977 0.39153449961872866 +4540 6 7.01432848 1.0143284797668457 1.0288622648661203 +4541 6 6.414744 0.41474390029907227 0.1720125028352868 +4545 6 6.605016 0.60501623153686523 0.36604464042306972 +4546 6 6.60486555 0.60486555099487305 0.36586233478033137 +4547 6 6.235944 0.23594379425048828 0.055669474045316747 +4548 5 5.460303 0.46030282974243164 0.21187869506889001 +4550 6 5.86993 0.13007020950317383 0.016918259400199531 +4553 6 7.01432848 1.0143284797668457 1.0288622648661203 +4555 5 5.59962273 0.59962272644042969 0.35954741406385438 +4559 7 5.797486 1.2025141716003418 1.4460403328996563 +4560 6 7.544105 1.544105052947998 2.3842604145395399 +4562 7 6.26490545 0.73509454727172852 0.54036399342862751 +4563 7 6.43433571 0.56566429138183594 0.31997609054451459 +4569 6 5.82548571 0.1745142936706543 0.03045523869536737 +4571 7 6.409703 0.59029722213745117 0.34845081046319137 +4574 7 7.56355667 0.56355667114257813 0.31759612158930395 +4575 7 6.80576038 0.19423961639404297 0.037729028576904966 +4576 5 5.672396 0.67239618301391602 0.45211662693168364 +4578 7 6.73552 0.2644801139831543 0.069949730692542289 +4581 6 6.09460163 0.094601631164550781 0.0089494686189937056 +4582 6 5.86895657 0.13104343414306641 0.017172381632008182 +4588 5 6.259477 1.2594771385192871 1.5862826624527315 +4589 6 6.50933647 0.50933647155761719 0.25942364125876338 +4591 6 5.471005 0.52899503707885742 0.27983574925406174 +4592 6 6.50867176 0.50867176055908203 0.25874695999027608 +4594 6 7.082544 1.0825438499450684 1.1719011870538907 +4595 6 6.133527 0.13352680206298828 0.017829406869168452 +4601 6 6.48194647 0.48194646835327148 0.23227239835819091 +4603 6 6.293041 0.29304122924804688 0.085873162039206363 +4604 6 6.22902727 0.22902727127075195 0.052453490985726603 +4610 6 5.326705 0.67329502105712891 0.45332618538031966 +4611 5 6.039484 1.0394840240478516 1.0805270362507144 +4612 5 5.33843374 0.33843374252319336 0.11453739807825514 +4614 5 4.97168446 0.028315544128417969 0.00080177003928838531 +4616 5 5.59241867 0.59241867065429688 0.35095988133980427 +4618 7 6.42852545 0.57147455215454102 0.32658316376023322 +4620 6 5.808576 0.19142389297485352 0.036643106801648173 +4622 7 7.204969 0.20496892929077148 0.042012261974605281 +4626 6 6.09176064 0.091760635375976563 0.0084200142046029214 +4627 6 6.17300463 0.1730046272277832 0.029930601042224225 +4628 6 6.17300463 0.1730046272277832 0.029930601042224225 +4629 7 6.012713 0.98728704452514648 0.97473570828719858 +4631 7 6.16862 0.83137989044189453 0.69119252223117655 +4633 6 5.419295 0.58070516586303711 0.33721848966001744 +4634 6 6.527281 0.52728080749511719 0.27802504995270283 +4637 6 6.35494137 0.35494136810302734 0.12598337479084876 +4638 5 5.38869524 0.38869524002075195 0.15108398961478997 +4640 6 6.35494137 0.35494136810302734 0.12598337479084876 +4643 6 5.883711 0.11628913879394531 0.013523163801437477 +4646 7 6.12449837 0.87550163269042969 0.76650310884360806 +4649 5 5.01977348 0.019773483276367188 0.00039099064088077284 +4651 7 7.3044734 0.3044734001159668 0.09270405137817761 +4652 5 5.218393 0.21839284896850586 0.047695436480580611 +4656 7 6.594793 0.40520715713500977 0.1641928401934365 +4657 7 6.594793 0.40520715713500977 0.1641928401934365 +4661 5 5.733464 0.73346376419067383 0.53796909338075238 +4664 7 6.38869572 0.61130428314208984 0.37369292658786435 +4667 7 6.38869572 0.61130428314208984 0.37369292658786435 +4668 7 6.396843 0.60315704345703125 0.36379841907182708 +4669 5 6.01887846 1.0188784599304199 1.0381133161101843 +4673 7 6.829722 0.17027807235717773 0.028994621925676256 +4674 7 7.480595 0.48059511184692383 0.23097166153115722 +4678 6 5.634528 0.36547183990478516 0.13356966576338891 +4679 5 5.25704 0.25704002380371094 0.066069573837012285 +4682 6 5.864652 0.13534784317016602 0.018319038650815855 +4684 6 5.99708748 0.0029125213623046875 8.4827806858811527E-06 +4685 5 5.60988665 0.60988664627075195 0.37196172129938532 +4686 4 4.5981946 0.59819459915161133 0.35783677845415696 +4688 6 5.99485159 0.0051484107971191406 2.6506133735892945E-05 +4692 5 5.76820374 0.7682037353515625 0.59013697900809348 +4693 6 5.99485159 0.0051484107971191406 2.6506133735892945E-05 +4694 7 5.9951334 1.0048666000366211 1.0097568838691586 +4695 7 7.197026 0.19702577590942383 0.038819156372710495 +4698 6 5.40118074 0.59881925582885742 0.35858450115142659 +4699 5 5.850246 0.85024595260620117 0.72291817992322649 +4700 5 5.850246 0.85024595260620117 0.72291817992322649 +4702 6 5.25802 0.74198007583618164 0.55053443293786586 +4703 7 6.73666143 0.26333856582641602 0.069347200251513641 +4704 6 5.49017763 0.50982236862182617 0.25991884754716921 +4705 6 5.82633734 0.17366266250610352 0.030158720348708812 +4709 6 6.57755852 0.57755851745605469 0.33357384108603583 +4710 7 6.916105 0.083895206451416016 0.0070384056655257154 +4711 6 5.845137 0.15486288070678711 0.023982511820804575 +4714 7 6.586605 0.41339492797851563 0.17089536647836212 +4717 6 5.740331 0.25966882705688477 0.06742789974509833 +4720 5 6.219128 1.2191281318664551 1.4862734019081927 +4721 6 6.535844 0.53584384918212891 0.28712863070632011 +4724 6 6.535844 0.53584384918212891 0.28712863070632011 +4726 6 6.86302328 0.86302328109741211 0.7448091837161428 +4728 6 6.30442429 0.30442428588867188 0.092674145838827826 +4731 6 6.8704896 0.87048959732055664 0.75775213904330485 +4732 6 6.8704896 0.87048959732055664 0.75775213904330485 +4736 6 5.867101 0.13289880752563477 0.017662093041735716 +4739 6 6.42715454 0.427154541015625 0.18246100191026926 +4740 5 5.4530344 0.45303440093994141 0.20524016843501158 +4741 6 6.15025043 0.15025043487548828 0.022575193180273345 +4742 6 6.04357 0.043570041656494141 0.0018983485299486347 +4744 5 5.634781 0.6347808837890625 0.40294677042402327 +4745 3 5.54872656 2.5487265586853027 6.4960070709478259 +4747 6 6.425161 0.42516088485717773 0.18076177801253834 +4749 6 5.05324841 0.94675159454345703 0.89633858177057846 +4750 5 5.608757 0.60875701904296875 0.37058510823408142 +4751 6 5.22416258 0.77583742141723633 0.60192370447134635 +4753 6 6.984895 0.98489522933959961 0.97001861277590251 +4755 6 6.162296 0.16229581832885742 0.026339932647033493 +4760 6 5.80196 0.19804000854492188 0.039219844984472729 +4761 6 6.1952095 0.19520950317382813 0.038106750129372813 +4763 7 7.03779554 0.037795543670654297 0.0014285031213603361 +4765 8 6.97475052 1.0252494812011719 1.0511364987032721 +4767 7 5.745017 1.2549829483032227 1.5749822005318492 +4768 6 5.863212 0.13678789138793945 0.01871092723035872 +4769 6 5.863212 0.13678789138793945 0.01871092723035872 +4777 6 6.517849 0.51784896850585938 0.26816755418258253 +4778 6 5.594188 0.40581178665161133 0.16468320618537291 +4779 4 4.573623 0.5736231803894043 0.32904355308005506 +4780 5 5.31235266 0.31235265731811523 0.097564182533687926 +4781 5 5.38558674 0.38558673858642578 0.14867713297371665 +4782 6 5.71773052 0.28226947784423828 0.079676058122458926 +4786 8 7.073131 0.92686891555786133 0.85908598662740587 +4787 8 7.001248 0.99875211715698242 0.99750579152555474 +4788 5 5.602041 0.60204076766967773 0.36245308593629488 +4790 6 6.56148863 0.56148862838745117 0.31526947980842124 +4792 6 7.33942556 1.3394255638122559 1.7940608409937795 +4795 7 6.783159 0.21684122085571289 0.047020115062196055 +4798 5 5.705885 0.70588493347167969 0.49827353930231766 +4799 6 5.50493431 0.49506568908691406 0.24509003651110106 +4805 6 5.933027 0.066973209381103516 0.004485410774805132 +4806 6 5.25618362 0.74381637573242188 0.55326280080771539 +4809 6 5.84081841 0.15918159484863281 0.025338780138554284 +4810 5 5.76808643 0.76808643341064453 0.58995676918948448 +4814 6 6.0173893 0.017389297485351563 0.00030238766703405418 +4818 6 6.429421 0.42942094802856445 0.18440235060575105 +4819 6 6.0173893 0.017389297485351563 0.00030238766703405418 +4820 5 5.26329374 0.26329374313354492 0.069323595173273134 +4821 6 5.773676 0.22632408142089844 0.051222589831013465 +4823 7 6.05669355 0.94330644607543945 0.88982705120747596 +4824 5 5.61980629 0.61980628967285156 0.38415983671802678 +4825 6 6.29941463 0.29941463470458984 0.089649123475282977 +4827 6 6.6732707 0.67327070236206055 0.45329343865910232 +4831 6 5.590648 0.40935182571411133 0.16756891721547618 +4833 6 5.94547939 0.054520606994628906 0.0029724965870627784 +4838 6 6.32839632 0.32839632034301758 0.10784414321483382 +4840 7 6.710075 0.28992509841918945 0.084056562693376691 +4842 6 5.77888966 0.22111034393310547 0.04888978419421619 +4843 5 6.01944 1.0194401741027832 1.0392582685747129 +4847 7 6.45959568 0.54040431976318359 0.29203682881870918 +4848 6 6.241429 0.24142885208129883 0.058287890617293669 +4855 6 5.87883329 0.12116670608520508 0.014681370663538473 +4857 6 5.837939 0.16206121444702148 0.026263837228043485 +4858 5 5.23321867 0.23321866989135742 0.054390947985893945 +4861 6 5.94553232 0.054467678070068359 0.0029667279543446057 +4863 7 7.39696741 0.39696741104125977 0.15758312542880049 +4864 5 5.52893162 0.52893161773681641 0.27976865624168568 +4865 6 7.049436 1.049436092376709 1.1013161119828965 +4868 6 6.187224 0.18722391128540039 0.035052792957003476 +4870 7 6.183802 0.81619787216186523 0.6661789665215565 +4873 6 6.869692 0.86969184875488281 0.75636391179068596 +4874 6 5.979304 0.020696163177490234 0.00042833117026930267 +4875 6 5.571311 0.42868900299072266 0.18377426128517982 +4877 5 4.36846638 0.63153362274169922 0.39883471665325487 +4884 5 5.59040356 0.59040355682373047 0.34857635991011193 +4885 6 5.74394369 0.25605630874633789 0.065564833248799914 +4890 6 6.7028656 0.7028656005859375 0.49402005248703063 +4891 6 5.521093 0.47890710830688477 0.22935201838686226 +4892 5 5.94552565 0.9455256462097168 0.89401874764030254 +4893 6 6.23143 0.2314300537109375 0.053559869760647416 +4895 6 5.37373352 0.6262664794921875 0.39220970333553851 +4897 6 5.62531757 0.37468242645263672 0.14038692069243552 +0 6 5.760466 0.23953390121459961 0.057376489831085564 +1 6 5.294115 0.70588493347167969 0.49827353930231766 +2 6 5.59617853 0.40382146835327148 0.16307177830299224 +3 6 5.84859467 0.15140533447265625 0.022923575306776911 +4 6 5.84859467 0.15140533447265625 0.022923575306776911 +7 6 5.760466 0.23953390121459961 0.057376489831085564 +12 5 6.1283617 1.128361701965332 1.2732001304621008 +13 7 6.41504 0.58495998382568359 0.34217818267734401 +14 5 5.24674654 0.24674654006958008 0.060883855036308887 +15 7 6.208092 0.79190778732299805 0.62711794362280671 +16 6 4.963639 1.0363612174987793 1.0740445731355521 +17 8 6.49511576 1.5048842430114746 2.264676584864219 +19 5 5.36396646 0.36396646499633789 0.13247158764193045 +22 8 6.25016737 1.7498326301574707 3.0619142335638116 +23 5 5.02689552 0.026895523071289063 0.00072336916127824225 +24 6 5.06524944 0.93475055694580078 0.87375860371048475 +26 6 6.074901 0.074901103973388672 0.0056101753764323803 +27 6 5.796622 0.20337820053100586 0.041362692451230032 +29 7 6.52617359 0.47382640838623047 0.22451146528419486 +30 6 5.333254 0.66674613952636719 0.4445504145733139 +33 6 6.07082129 0.070821285247802734 0.0050156544441506412 +34 5 5.449047 0.44904708862304688 0.20164328780083451 +36 5 5.051116 0.051115989685058594 0.0026128444014830166 +38 5 5.340738 0.34073781967163086 0.11610226175457683 +39 5 5.340738 0.34073781967163086 0.11610226175457683 +42 6 5.60342 0.39658021926879883 0.15727587031528856 +43 6 6.01738262 0.017382621765136719 0.00030215553942980478 +47 5 4.866223 0.13377714157104492 0.017896323606919395 +49 5 6.221687 1.221686840057373 1.4925187351693694 +53 6 6.41970825 0.419708251953125 0.17615501675754786 +55 6 5.986149 0.013851165771484375 0.00019185479322914034 +57 6 5.406242 0.59375810623168945 0.35254868871584222 +58 6 5.20185137 0.79814863204956055 0.63704123884258479 +59 6 5.90068769 0.099312305450439453 0.0098629340138813859 +61 6 5.406242 0.59375810623168945 0.35254868871584222 +62 5 5.29558659 0.29558658599853516 0.08737142982226942 +65 5 4.91127968 0.088720321655273438 0.0078712954746151809 +67 5 5.35263872 0.35263872146606445 0.12435406787722059 +75 5 5.26306438 0.26306438446044922 0.069202870371555036 +78 5 5.796858 0.79685783386230469 0.63498240738772438 +80 6 6.851635 0.85163497924804688 0.72528213787882123 +81 6 6.130857 0.13085699081420898 0.017123552044949975 +83 6 5.73027 0.2697300910949707 0.072754322042101194 +84 5 5.232582 0.23258209228515625 0.054094429651740938 +85 6 5.21471 0.78528976440429688 0.61668001407815609 +86 6 5.27120543 0.72879457473754883 0.53114153216688464 +87 6 5.56987047 0.4301295280456543 0.18501141089677731 +89 6 5.21471 0.78528976440429688 0.61668001407815609 +94 7 6.043582 0.95641803741455078 0.91473546229190106 +101 5 5.535883 0.53588294982910156 0.28717053591753938 +103 5 5.394018 0.39401817321777344 0.15525032082587131 +107 6 6.09827232 0.098272323608398438 0.0096574495873937849 +110 6 5.97177 0.028230190277099609 0.00079694364308124932 +114 5 5.17982864 0.17982864379882813 0.032338341130525805 +116 6 6.428582 0.42858219146728516 0.18368269484290067 +118 5 5.192375 0.19237518310546875 0.037008211074862629 +119 5 5.13975763 0.13975763320922852 0.019532196040245253 +124 6 5.696412 0.30358791351318359 0.092165621231288242 +126 5 6.026167 1.0261669158935547 1.0530185392744897 +127 7 6.21480465 0.78519535064697266 0.61653173867762234 +130 5 4.77477 0.22523021697998047 0.050728650640849082 +134 5 5.139866 0.13986587524414063 0.019562463057809509 +135 5 5.60496473 0.6049647331237793 0.36598232832352551 +136 6 5.858693 0.14130687713623047 0.019967633525993733 +139 6 6.03543043 0.035430431365966797 0.0012553154667784838 +140 5 5.60465 0.60465002059936523 0.3656016474108128 +142 6 6.084482 0.084482192993164063 0.007137240932934219 +143 6 5.8161664 0.18383359909057617 0.033794792154594688 +146 6 5.524167 0.47583293914794922 0.22641698597817594 +148 7 6.906253 0.093747138977050781 0.0087885260663824738 +149 6 5.58138275 0.41861724853515625 0.17524040077114478 +153 5 5.875115 0.87511491775512695 0.76582611927756261 +155 6 5.928622 0.071378231048583984 0.0050948518676250387 +157 7 6.41029167 0.58970832824707031 0.34775591240395443 +158 8 6.370565 1.6294350624084473 2.6550586226060204 +159 8 6.370565 1.6294350624084473 2.6550586226060204 +160 7 6.41029167 0.58970832824707031 0.34775591240395443 +162 5 5.36589956 0.36589956283569336 0.13388249008335151 +163 6 5.928622 0.071378231048583984 0.0050948518676250387 +165 5 5.708807 0.70880699157714844 0.50240735130864778 +166 6 5.26426 0.73574018478393555 0.54131361950589962 +168 5 5.207327 0.20732688903808594 0.042984438918210799 +170 6 6.053034 0.053033828735351563 0.0028125869903306011 +172 4 4.75167847 0.751678466796875 0.56502051744610071 +175 6 6.3391943 0.33919429779052734 0.11505277165360894 +178 4 4.61763 0.6176300048828125 0.38146682293154299 +182 5 5.274463 0.27446317672729492 0.075330035379238325 +184 5 5.32252359 0.32252359390258789 0.10402146862384143 +185 5 5.36232662 0.36232662200927734 0.13128058101665374 +186 6 5.84258556 0.15741443634033203 0.024779304768344446 +190 6 5.46028948 0.53971052169799805 0.29128744723152522 +193 5 6.09086466 1.0908646583557129 1.1899857028495262 +194 5 5.24797 0.2479701042175293 0.061489172585652341 +195 6 5.31127167 0.68872833251953125 0.47434671601513401 +197 5 5.21954346 0.21954345703125 0.048199329525232315 +200 5 5.61530256 0.61530256271362305 0.37859724368195202 +203 6 6.86750841 0.8675084114074707 0.75257084386271345 +208 5 5.026546 0.026546001434326172 0.00070469019215124717 +213 6 6.026121 0.026121139526367188 0.00068231393015594222 +214 7 6.450726 0.54927396774291992 0.30170189164005023 +215 5 5.307987 0.30798721313476563 0.094856123454519548 +217 5 5.307987 0.30798721313476563 0.094856123454519548 +220 5 5.54282665 0.54282665252685547 0.29466077469351148 +221 6 5.35106373 0.64893627166748047 0.42111828468569001 +222 7 6.450726 0.54927396774291992 0.30170189164005023 +224 6 5.836071 0.16392898559570313 0.026872712318436243 +225 5 5.64871836 0.64871835708618164 0.42083550682059467 +227 6 5.07952 0.92047977447509766 0.84728301521772664 +229 5 5.64871836 0.64871835708618164 0.42083550682059467 +230 4 4.760241 0.76024103164672852 0.57796642619928207 +231 6 5.60397243 0.39602756500244141 0.15683783224176295 +232 6 5.85416746 0.14583253860473633 0.021267129315901911 +234 6 6.16361237 0.16361236572265625 0.026769006217364222 +235 6 6.16361237 0.16361236572265625 0.026769006217364222 +236 6 6.16361237 0.16361236572265625 0.026769006217364222 +238 7 6.311166 0.68883419036865234 0.47449254182083678 +243 6 5.903076 0.096923828125 0.009394228458404541 +245 6 5.514191 0.4858088493347168 0.23601023809192156 +251 3 4.82756948 1.8275694847106934 3.3400102214457092 +253 3 4.84502363 1.8450236320495605 3.4041122028213522 +255 8 5.828538 2.1714620590209961 4.7152474737677039 +256 7 6.028649 0.97135114669799805 0.94352305019151572 +261 5 5.66695833 0.66695833206176758 0.44483341670661503 +263 6 5.779109 0.22089099884033203 0.048792833368679567 +264 6 5.468629 0.53137111663818359 0.28235526359731011 +265 5 5.66695833 0.66695833206176758 0.44483341670661503 +266 6 5.227504 0.77249622344970703 0.5967504152440597 +270 6 5.227504 0.77249622344970703 0.5967504152440597 +273 5 5.04690742 0.046907424926757813 0.0022003065132594202 +274 5 5.32239056 0.32239055633544922 0.10393567081428046 +281 8 6.920855 1.0791449546813965 1.1645538332143133 +282 4 5.13089275 1.1308927536010742 1.27891842014742 +286 6 5.202199 0.79780101776123047 0.63648646394085517 +287 7 6.399926 0.60007381439208984 0.36008858271907229 +289 7 6.399926 0.60007381439208984 0.36008858271907229 +292 5 5.56242371 0.5624237060546875 0.31632042513228953 +294 3 4.28524733 1.2852473258972168 1.6518606887259466 +295 6 5.396621 0.6033787727355957 0.36406594338791365 +298 6 5.701315 0.29868507385253906 0.089212773342296714 +302 6 5.887432 0.11256790161132813 0.012671532473177649 +305 6 5.437251 0.56274890899658203 0.31668633457684336 +306 5 5.30845976 0.30845975875854492 0.095147422773379731 +307 6 5.404123 0.59587717056274414 0.35506960239786167 +310 7 6.45454025 0.54545974731445313 0.29752633594034705 +313 6 5.506036 0.49396419525146484 0.24400062619042728 +315 6 5.470152 0.52984809875488281 0.28073900775416405 +318 7 6.52936554 0.47063446044921875 0.22149679536232725 +320 7 5.68558025 1.3144197463989258 1.7276992697234164 +322 6 6.05053425 0.050534248352050781 0.0025537102565067471 +324 5 4.646965 0.35303497314453125 0.1246336922631599 +325 5 4.59268665 0.40731334686279297 0.1659041625325699 +326 6 5.789024 0.21097612380981445 0.044510924817814157 +330 8 6.97127628 1.0287237167358398 1.0582724853748005 +334 5 6.14773369 1.1477336883544922 1.3172926193838066 +335 6 6.41830826 0.41830825805664063 0.17498179875838105 +337 6 5.28686953 0.71313047409057617 0.50855507307664993 +339 7 6.665181 0.33481884002685547 0.11210365563692903 +340 7 5.694383 1.3056168556213379 1.7046353736825495 +341 6 5.31231642 0.6876835823059082 0.47290870937308682 +342 6 5.279088 0.72091197967529297 0.51971408243935002 +345 6 5.887382 0.11261796951293945 0.01268280705721736 +351 7 7.006105 0.0061049461364746094 3.727036732925626E-05 +356 6 6.174892 0.17489194869995117 0.030587193720066352 +357 6 5.64322853 0.35677146911621094 0.12728588117533945 +359 6 6.14331532 0.14331531524658203 0.020539279584227188 +362 6 5.94113731 0.058862686157226563 0.0034648158216441516 +363 6 6.174892 0.17489194869995117 0.030587193720066352 +364 7 6.49051857 0.50948143005371094 0.25957132756957435 +365 7 6.982633 0.017366886138916016 0.00030160873416207323 +367 6 5.258188 0.74181222915649414 0.55028538332612698 +369 5 6.047746 1.0477461814880371 1.0977720608227628 +372 5 5.063949 0.063949108123779297 0.0040894884298268153 +374 7 6.68047762 0.31952238082885742 0.10209455185054139 +375 7 6.68047762 0.31952238082885742 0.10209455185054139 +380 7 5.89107656 1.1089234352111816 1.2297111851605678 +382 6 5.279668 0.72033214569091797 0.51887840011568187 +385 7 6.68047762 0.31952238082885742 0.10209455185054139 +386 7 6.47401237 0.52598762512207031 0.27666298178155557 +390 7 5.77210665 1.2278933525085449 1.5077220851346738 +393 6 6.532292 0.53229188919067383 0.28333465529817659 +394 5 5.113532 0.11353206634521484 0.012889530088614265 +397 6 6.450558 0.45055818557739258 0.20300267859079213 +400 6 6.450558 0.45055818557739258 0.20300267859079213 +401 5 5.113532 0.11353206634521484 0.012889530088614265 +402 5 4.784559 0.21544122695922852 0.046414922273697812 +403 5 5.150881 0.15088081359863281 0.02276501991218538 +405 5 5.233643 0.2336430549621582 0.054589077132050079 +407 5 5.072737 0.072737216949462891 0.0052907027295532316 +408 6 6.07039 0.070390224456787109 0.0049547836990768701 +410 6 5.85691261 0.14308738708496094 0.020474000342801446 +411 6 5.7674613 0.23253870010375977 0.054074247045946322 +412 5 5.63204336 0.63204336166381836 0.3994788110233003 +417 5 5.089598 0.089598178863525391 0.0080278336556602881 +420 7 6.749453 0.25054693222045898 0.062773765245083268 +421 6 5.98592949 0.014070510864257813 0.00019797927598119713 +424 7 5.79814625 1.2018537521362305 1.4444524415239357 +425 6 5.98592949 0.014070510864257813 0.00019797927598119713 +426 6 5.98592949 0.014070510864257813 0.00019797927598119713 +427 5 5.209277 0.20927715301513672 0.043796926774120948 +431 5 4.8581214 0.14187860488891602 0.020129538525225144 +432 7 6.188831 0.81116914749145508 0.657995385842014 +433 4 4.92514372 0.92514371871948242 0.85589090028611281 +435 7 7.09158134 0.091581344604492188 0.0083871426795667503 +437 8 6.49513674 1.5048632621765137 2.2646134378485385 +438 7 6.188831 0.81116914749145508 0.657995385842014 +443 6 5.614153 0.38584709167480469 0.14887797815390513 +444 6 5.97591734 0.024082660675048828 0.00057997454518954328 +445 3 6.120806 3.1208062171936035 9.7394314452742492 +446 5 6.695441 1.6954407691955566 2.8745194018504208 +447 6 5.89296055 0.10703945159912109 0.011457444198640587 +448 6 5.89296055 0.10703945159912109 0.011457444198640587 +458 6 5.25619 0.74381017684936523 0.55325357918468399 +459 5 4.669416 0.33058404922485352 0.10928581360190037 +460 5 5.560707 0.56070709228515625 0.31439244333887473 +461 5 5.771966 0.77196598052978516 0.59593147509531263 +462 5 5.23972225 0.23972225189208984 0.057466758052214573 +463 6 5.216147 0.78385305404663086 0.6144256103382304 +468 5 5.023873 0.023872852325439453 0.0005699130781522399 +469 5 5.52225828 0.52225828170776367 0.27275371281234584 +470 6 5.096721 0.90327882766723633 0.81591264051189683 +471 5 5.729003 0.72900295257568359 0.53144530486406438 +472 6 6.24567556 0.24567556381225586 0.060356482654469801 +473 7 6.18447256 0.81552743911743164 0.66508500395343617 +475 5 5.78770447 0.7877044677734375 0.62047832855023444 +476 7 6.38093758 0.61906242370605469 0.38323828444481478 +477 6 6.25798655 0.25798654556274414 0.066557057691397858 +478 6 4.977918 1.0220818519592285 1.0446513121044063 +479 6 6.291813 0.29181289672851563 0.085154766697087325 +481 6 5.883209 0.116790771484375 0.013640084303915501 +485 6 6.138332 0.13833189010620117 0.019135711820354118 +486 6 5.8698926 0.13010740280151367 0.016927936263755328 +488 6 6.530078 0.53007793426513672 0.2809826163947946 +490 6 6.16165 0.16165018081665039 0.026130780958055766 +491 7 6.2314353 0.76856470108032227 0.59069169974668512 +494 6 6.6919 0.69189977645874023 0.47872530066365471 +496 4 5.114645 1.1146450042724609 1.2424334855495545 +498 5 5.27051 0.27051019668579102 0.073175766510985341 +499 4 5.114645 1.1146450042724609 1.2424334855495545 +500 6 5.722214 0.2777857780456543 0.077164938484429513 +503 5 5.04213572 0.042135715484619141 0.0017754185194007732 +505 6 6.0714097 0.071409702301025391 0.005099345582721071 +506 5 4.865561 0.13443899154663086 0.018073842448075084 +508 6 6.37310457 0.37310457229614258 0.13920702186828748 +509 7 5.84958029 1.1504197120666504 1.3234655139115148 +511 6 5.65211773 0.34788227081298828 0.12102207434600132 +512 6 6.2494874 0.24948740005493164 0.062243962786169504 +515 6 5.62628031 0.37371969223022461 0.1396664083606538 +516 5 5.912393 0.91239309310913086 0.83246115635324713 +518 6 6.74377871 0.74377870559692383 0.55320676289943549 +524 5 4.760686 0.23931407928466797 0.057271228543868347 +525 6 5.27357674 0.72642326354980469 0.527690757826349 +526 4 6.060733 2.0607328414916992 4.2466198440024527 +530 6 6.473486 0.47348594665527344 0.22418894168004044 +536 5 5.16379738 0.16379737854003906 0.026829581216588849 +537 6 5.760993 0.23900699615478516 0.057124344210933486 +542 6 5.306597 0.69340276718139648 0.48080739753481794 +543 6 5.959676 0.040324211120605469 0.0016260420024991618 +545 6 6.357703 0.35770320892333984 0.12795158567405451 +550 7 5.32338524 1.6766147613525391 2.8110370579852315 +551 7 5.943192 1.0568079948425293 1.1168431379630874 +552 7 6.1307826 0.8692173957824707 0.75553888113086032 +553 7 5.32338524 1.6766147613525391 2.8110370579852315 +554 7 6.1307826 0.8692173957824707 0.75553888113086032 +555 7 5.943192 1.0568079948425293 1.1168431379630874 +556 5 4.966044 0.033956050872802734 0.0011530133908763673 +562 6 5.03047132 0.9695286750793457 0.93998585180111149 +564 5 5.114619 0.11461877822875977 0.013137464322653614 +567 5 5.716825 0.71682500839233398 0.51383809265666969 +568 6 5.59775925 0.40224075317382813 0.16179762351384852 +570 5 4.94926262 0.050737380981445313 0.0025742818288563285 +571 7 6.66947842 0.33052158355712891 0.10924451719711215 +572 5 5.33599567 0.33599567413330078 0.11289309303629125 +573 7 7.127603 0.12760305404663086 0.016282539402027396 +574 7 6.14305973 0.85694026947021484 0.73434662543968443 +575 6 5.78696442 0.21303558349609375 0.045384159835521132 +576 6 5.6825285 0.31747150421142578 0.10078815598626534 +579 7 6.459541 0.54045915603637695 0.29209609934355285 +580 5 4.94926262 0.050737380981445313 0.0025742818288563285 +583 6 5.17567348 0.82432651519775391 0.6795142036580728 +585 6 5.17567348 0.82432651519775391 0.6795142036580728 +587 7 6.182838 0.81716203689575195 0.66775379454361428 +588 7 6.94865036 0.051349639892578125 0.0026367855170974508 +589 6 5.834272 0.16572809219360352 0.027465800542131547 +591 6 6.23586273 0.23586273193359375 0.055631228315178305 +592 5 5.251458 0.25145816802978516 0.063231210268895666 +595 7 5.37297726 1.6270227432250977 2.6472030069717221 +596 5 5.251458 0.25145816802978516 0.063231210268895666 +597 6 6.31547976 0.31547975540161133 0.099527476068260512 +598 8 6.12208557 1.8779144287109375 3.5265626015607268 +599 7 5.801997 1.198002815246582 1.4352107453387362 +601 6 6.101768 0.10176801681518555 0.010356729246495888 +603 5 4.881016 0.11898422241210938 0.014157245183014311 +605 6 5.47040653 0.52959346771240234 0.28046924104364734 +608 5 5.13522959 0.13522958755493164 0.018287041350276922 +610 8 6.99854326 1.0014567375183105 1.0029155971208183 +611 6 5.71053934 0.28946065902709961 0.083787473124402823 +615 5 5.508101 0.50810098648071289 0.25816661246267358 +616 7 6.078271 0.92172908782958984 0.84958451135116775 +620 5 5.102666 0.10266590118408203 0.010540287265939696 +623 5 5.14863729 0.14863729476928711 0.022093045396331945 +625 8 6.411424 1.5885758399963379 2.5235731994200705 +626 4 4.92221451 0.92221450805664063 0.85047959887015168 +628 6 5.51115227 0.48884773254394531 0.23897210561335669 +630 5 6.03271961 1.032719612121582 1.0665097972605508 +631 5 6.03271961 1.032719612121582 1.0665097972605508 +632 6 6.430566 0.43056583404541016 0.18538693744721968 +635 6 6.40166759 0.40166759490966797 0.16133685680051713 +636 7 6.378405 0.62159490585327148 0.38638022698273744 +637 5 5.22644949 0.22644948959350586 0.051279371337159319 +640 7 6.365346 0.63465404510498047 0.40278575696811458 +643 5 5.40024 0.40023994445800781 0.16019201313974918 +646 4 4.877896 0.87789583206176758 0.77070109195142322 +647 6 5.42187929 0.57812070846557617 0.33422355355673972 +648 5 5.12070274 0.12070274353027344 0.014569152295734966 +650 7 6.49445772 0.50554227828979492 0.25557299513843645 +651 7 6.49445772 0.50554227828979492 0.25557299513843645 +655 6 6.75058842 0.75058841705322266 0.56338297181446251 +658 5 6.03086853 1.0308685302734375 1.0626899267081171 +659 4 5.07536459 1.0753645896911621 1.1564090007616414 +662 4 4.80875 0.80875015258789063 0.65407680931093637 +663 5 5.040732 0.040731906890869141 0.001659088238966433 +664 6 5.695841 0.30415916442871094 0.092512797305971617 +666 6 6.43564749 0.43564748764038086 0.18978873348737579 +667 6 5.695841 0.30415916442871094 0.092512797305971617 +669 5 5.57963753 0.57963752746582031 0.3359796632466896 +671 6 6.40359831 0.40359830856323242 0.16289159467510217 +672 8 7.066577 0.93342304229736328 0.87127857589166524 +673 6 6.343106 0.34310579299926758 0.11772158518965625 +674 5 5.478634 0.47863388061523438 0.22909039167279843 +675 6 4.78799152 1.2120084762573242 1.4689645465196008 +676 6 4.74690247 1.2530975341796875 1.5702534301672131 +677 7 6.78537464 0.21462535858154297 0.0460640445462559 +684 5 5.723876 0.72387599945068359 0.52399646258072607 +686 7 6.37023 0.62976980209350586 0.39661000362889354 +687 4 5.161622 1.1616220474243164 1.3493657810622608 +690 4 6.082882 2.0828819274902344 4.338397123865434 +695 5 5.33051825 0.33051824569702148 0.10924231073863666 +699 5 5.48718262 0.4871826171875 0.23734690248966217 +701 7 6.914577 0.085422992706298828 0.0072970876829003828 +703 6 5.65349865 0.34650135040283203 0.12006318583098619 +708 6 6.082324 0.082324028015136719 0.0067772455886370153 +709 5 4.987764 0.012236118316650391 0.00014972259145906719 +710 5 5.24866629 0.24866628646850586 0.06183492202603702 +713 5 5.492665 0.49266481399536133 0.24271861894908398 +715 7 6.51023674 0.48976325988769531 0.23986805073582218 +716 6 5.139985 0.86001491546630859 0.73962565482452192 +717 5 5.587695 0.58769512176513672 0.34538555614653887 +730 6 6.027294 0.027294158935546875 0.00074497111199889332 +731 6 5.51182747 0.48817253112792969 0.23831242014784948 +733 6 5.83744335 0.16255664825439453 0.026424663891702949 +734 5 5.47097254 0.47097253799438477 0.2218151315448722 +736 6 5.83744335 0.16255664825439453 0.026424663891702949 +737 5 5.47097254 0.47097253799438477 0.2218151315448722 +739 6 5.6218257 0.3781743049621582 0.14301580493361143 +740 3 5.22292662 2.2229266166687012 4.9414027430941587 +741 6 6.449 0.44899988174438477 0.2016008938064715 +742 6 6.38735151 0.38735151290893555 0.15004119455284126 +743 5 5.3871417 0.38714170455932617 0.14987869940910059 +744 5 5.3076973 0.30769729614257813 0.094677626053453423 +745 6 6.703045 0.70304489135742188 0.49427211926376913 +746 6 5.54885435 0.45114564895629883 0.20353239657220001 +747 6 6.505473 0.50547313690185547 0.25550309212940192 +748 6 5.89029551 0.10970449447631836 0.012035076108304565 +750 6 6.505473 0.50547313690185547 0.25550309212940192 +751 6 6.275194 0.27519416809082031 0.075731830151198665 +753 6 5.54885435 0.45114564895629883 0.20353239657220001 +754 5 5.21971035 0.21971035003662109 0.048272637913214567 +755 7 6.596735 0.40326499938964844 0.16262265973273315 +756 5 5.29386139 0.29386138916015625 0.086354516039136797 +759 7 6.5696454 0.43035459518432617 0.18520507759626526 +762 5 5.06554747 0.065547466278076172 0.0042964703354755329 +763 6 5.86560154 0.13439846038818359 0.018062946154714155 +766 5 5.16220665 0.16220664978027344 0.026310997232940281 +767 6 5.43860626 0.56139373779296875 0.31516292883316055 +768 7 5.741325 1.2586750984191895 1.5842630033805563 +769 7 5.741325 1.2586750984191895 1.5842630033805563 +771 7 6.02586 0.97414016723632813 0.94894906542322133 +772 7 5.645487 1.3545131683349609 1.8347059231928142 +775 6 6.31435871 0.31435871124267578 0.098821399334156013 +776 6 6.0731554 0.073155403137207031 0.0053517130081672803 +777 5 5.74329 0.74328994750976563 0.55247994606907014 +787 6 5.772376 0.22762393951416016 0.051812657839946041 +789 6 5.608652 0.39134788513183594 0.15315316719716066 +790 6 5.772376 0.22762393951416016 0.051812657839946041 +791 7 6.60906744 0.39093255996704102 0.15282826644238412 +793 7 6.60906744 0.39093255996704102 0.15282826644238412 +796 6 5.285374 0.71462583541870117 0.51069008464787657 +797 6 6.10648537 0.10648536682128906 0.011339133347064489 +798 6 5.4663415 0.53365850448608398 0.28479139941032372 +800 6 5.266454 0.73354578018188477 0.53808941162265 +801 5 5.12194 0.12194013595581055 0.01486939675692156 +803 7 5.714782 1.2852177619934082 1.6517846957433449 +804 6 5.444122 0.5558781623840332 0.30900053141544959 +805 6 5.266454 0.73354578018188477 0.53808941162265 +807 6 5.24923134 0.75076866149902344 0.56365358308903524 +808 6 4.86180449 1.1381955146789551 1.2954890296352914 +809 6 5.24923134 0.75076866149902344 0.56365358308903524 +811 6 5.0033145 0.99668550491333008 0.99338199570433972 +812 7 4.800945 2.1990551948547363 4.8358437500176024 +813 6 5.35610628 0.64389371871948242 0.41459912100640395 +814 6 4.76751566 1.2324843406677246 1.5190176499911558 +815 5 5.230801 0.23080110549926758 0.053269150299684043 +818 5 5.230801 0.23080110549926758 0.053269150299684043 +820 9 6.74644756 2.2535524368286133 5.0784985855361811 +822 5 5.849502 0.8495020866394043 0.72165379520470196 +823 6 5.83266354 0.16733646392822266 0.028001492160001362 +824 5 5.382196 0.38219594955444336 0.14607374385582261 +825 6 5.932135 0.067864894866943359 0.0046056439553012751 +828 7 6.31619263 0.683807373046875 0.46759252343326807 +830 6 5.80719566 0.19280433654785156 0.03717351219165721 +831 4 6.26753235 2.2675323486328125 5.1417029520962387 +832 8 6.940169 1.0598311424255371 1.1232420504550191 +833 6 6.203789 0.20378923416137695 0.041530051960080527 +834 6 5.80719566 0.19280433654785156 0.03717351219165721 +835 8 6.948848 1.051152229309082 1.104921009181453 +837 8 7.10874 0.89126014709472656 0.79434464979931363 +839 7 6.408877 0.59112310409545898 0.34942652419545084 +842 7 6.515357 0.48464298248291016 0.23487882046993036 +843 7 6.23895073 0.76104927062988281 0.57919599232627661 +844 8 6.849922 1.1500778198242188 1.3226789916516282 +846 5 5.760487 0.76048707962036133 0.57834059826950579 +847 5 5.67596 0.67596006393432617 0.45692200803409833 +849 6 6.19975758 0.19975757598876953 0.039903089164909034 +852 7 6.506963 0.49303722381591797 0.24308570406810759 +853 5 5.18266726 0.18266725540161133 0.033367326195957503 +857 5 5.06863356 0.068633556365966797 0.0047105650594403414 +865 6 6.448615 0.44861507415771484 0.20125548476153199 +866 7 6.506963 0.49303722381591797 0.24308570406810759 +867 8 5.900881 2.0991191864013672 4.4063013587183377 +868 7 6.13432264 0.8656773567199707 0.74939728593767541 +869 6 6.330358 0.33035802841186523 0.10913642693617476 +873 3 5.39196968 2.3919696807861328 5.7215189538001141 +875 7 5.945717 1.0542831420898438 1.1115129436948337 +877 6 5.27623844 0.72376155853271484 0.52383079360970441 +878 6 5.729253 0.27074718475341797 0.073304038051901443 +879 8 7.033074 0.96692609786987305 0.93494607874185931 +880 7 5.945717 1.0542831420898438 1.1115129436948337 +882 6 6.47362232 0.47362232208251953 0.22431810397483787 +883 6 6.47362232 0.47362232208251953 0.22431810397483787 +884 6 6.0108 0.010799884796142578 0.00011663751160995162 +886 6 5.72650337 0.27349662780761719 0.074800405422138283 +889 7 6.836567 0.16343307495117188 0.026710369987995364 +891 7 6.05931 0.94069004058837891 0.88489775246216595 +892 5 5.83085966 0.83085966110229492 0.69032777644702037 +893 7 5.88735628 1.1126437187194824 1.2379760448059187 +894 7 6.05931 0.94069004058837891 0.88489775246216595 +897 6 5.356787 0.64321279525756836 0.41372269998305455 +899 6 5.940027 0.059972763061523438 0.0035967323092336301 +901 6 5.439856 0.56014394760131836 0.31376124203438849 +903 6 5.16906166 0.83093833923339844 0.69045852360795834 +905 4 5.119085 1.1190848350524902 1.2523508680444593 +907 8 6.72354841 1.276451587677002 1.629328655683139 +909 5 5.951847 0.95184707641601563 0.90601285688171629 +911 5 5.17918253 0.17918252944946289 0.032106378859907636 +913 5 5.018202 0.018201828002929688 0.00033130654264823534 +915 5 5.038798 0.038797855377197266 0.0015052735818699148 +916 7 6.2027626 0.79723739624023438 0.63558746596390847 +917 6 6.036959 0.036959171295166016 0.0013659803428254236 +922 6 5.438461 0.5615391731262207 0.31532624295527967 +923 6 5.67066 0.32933998107910156 0.10846482313718298 +928 5 5.700507 0.70050716400146484 0.49071028681737516 +929 5 5.23482 0.23481988906860352 0.055140380302191261 +931 5 5.416477 0.41647720336914063 0.17345326092618052 +932 6 5.64696264 0.35303735733032227 0.12463537567077765 +933 5 5.43066549 0.43066549301147461 0.18547276687081649 +939 7 5.80225849 1.1977415084838867 1.4345847211452565 +941 6 5.62785 0.37214994430541992 0.13849558104652715 +942 7 5.356612 1.6433877944946289 2.7007234430939207 +943 7 6.63288736 0.36711263656616211 0.13477168792655903 +945 7 6.26371 0.73628997802734375 0.54212293174350634 +946 5 5.47489262 0.47489261627197266 0.22552299698963907 +947 5 5.80209875 0.80209875106811523 0.64336240646503029 +948 4 4.016797 0.016797065734863281 0.00028214141730131814 +949 5 5.809106 0.80910587310791016 0.65465231389771361 +951 6 5.86978531 0.13021469116210938 0.016955865794443525 +952 6 6.022801 0.022800922393798828 0.00051988206200803688 +954 6 5.86978531 0.13021469116210938 0.016955865794443525 +957 7 6.50963163 0.49036836624145508 0.24046113461031382 +961 7 6.85018969 0.1498103141784668 0.02244313023425093 +962 6 5.93246365 0.067536354064941406 0.0045611591203851276 +963 6 6.31939554 0.31939554214477539 0.10201351234195499 +966 6 5.41205454 0.58794546127319336 0.34567986543174811 +967 6 5.92570257 0.074297428131103516 0.005520107826896492 +973 7 6.949879 0.050120830535888672 0.0025120976536072703 +975 5 5.173891 0.17389106750488281 0.030238103357987711 +977 5 5.95053864 0.95053863525390625 0.90352369711035863 +978 7 6.605027 0.39497280120849609 0.15600351369448617 +979 5 5.769002 0.76900196075439453 0.59136401564410335 +981 7 6.605027 0.39497280120849609 0.15600351369448617 +984 5 6.3729744 1.3729743957519531 1.8850586913904408 +987 6 5.5826726 0.4173274040222168 0.17416216214792257 +988 5 6.3729744 1.3729743957519531 1.8850586913904408 +990 6 6.21594143 0.21594142913818359 0.046630700818241166 +991 4 4.94119453 0.94119453430175781 0.88584715139950276 +993 4 5.06608534 1.0660853385925293 1.1365379491619478 +996 5 5.17936563 0.17936563491821289 0.032172030989613631 +1000 7 5.52855635 1.4714436531066895 2.1651464242679594 +1001 5 5.712898 0.71289777755737305 0.50822324124624174 +1003 7 5.70227766 1.297722339630127 1.6840832707750906 +1005 6 6.584769 0.58476877212524414 0.34195451685286571 +1008 7 6.029186 0.97081422805786133 0.94248026539958119 +1009 6 5.62538576 0.37461423873901367 0.14033582786601073 +1010 6 6.15891266 0.15891265869140625 0.025253233092371374 +1011 7 6.02436256 0.97563743591308594 0.95186840635506087 +1012 6 5.62912273 0.37087726593017578 0.13754994638384233 +1013 5 5.50491762 0.50491762161254883 0.25494180461487304 +1014 5 6.15509129 1.1550912857055664 1.3342358783129384 +1019 6 5.742344 0.25765609741210938 0.066386664533638395 +1020 7 6.23330545 0.76669454574584961 0.58782052647643468 +1022 8 6.47398043 1.5260195732116699 2.3287357378251272 +1023 6 6.22773075 0.22773075103759766 0.051861294968148286 +1024 6 6.031418 0.0314178466796875 0.00098708108998835087 +1028 7 6.00834942 0.99165058135986328 0.98337087551135482 +1029 4 5.17407846 1.1740784645080566 1.378460240821596 +1031 6 5.45544338 0.54455661773681641 0.29654190992096119 +1035 6 6.33974743 0.33974742889404297 0.11542831544011278 +1036 5 6.43673229 1.436732292175293 2.0641996793792714 +1038 7 6.24824667 0.75175333023071289 0.56513306951296727 +1041 5 5.91462135 0.91462135314941406 0.83653221963686519 +1042 4 5.50987244 1.5098724365234375 2.2797147745732218 +1043 5 5.33948231 0.33948230743408203 0.11524823706076859 +1046 5 5.62477064 0.6247706413269043 0.3903383542640313 +1048 5 5.034732 0.034731864929199219 0.0012063024414601387 +1050 5 5.59548426 0.59548425674438477 0.35460150003041235 +1055 5 5.39846945 0.39846944808959961 0.15877790106083012 +1056 6 5.9916153 0.00838470458984375 7.0303271058946848E-05 +1057 5 5.16176367 0.16176366806030273 0.026167484304323807 +1062 5 5.52524757 0.52524757385253906 0.27588501383797848 +1063 5 5.34958124 0.34958124160766602 0.12220704448395736 +1066 6 5.38780165 0.6121983528137207 0.37478682318783285 +1067 7 6.16809368 0.83190631866455078 0.69206812303400511 +1070 7 5.71303272 1.2869672775268555 1.6562847734248862 +1073 5 5.672453 0.67245292663574219 0.45219293854097486 +1078 5 5.86502457 0.86502456665039063 0.74826750090869609 +1081 6 5.666392 0.33360815048217773 0.11129439806813934 +1087 8 6.18193 1.8180699348449707 3.305378287987196 +1089 7 6.042182 0.95781803131103516 0.91741538110454712 +1093 7 6.22694731 0.77305269241333008 0.59761046524749872 +1096 6 5.72905 0.2709498405456543 0.073413816091715489 +1097 7 6.01744366 0.98255634307861328 0.96541696732401761 +1102 5 6.45477772 1.454777717590332 2.1163782075973359 +1104 5 5.133098 0.13309812545776367 0.017715111000370598 +1105 7 6.572625 0.42737483978271484 0.18264925367930118 +1106 8 7.194024 0.80597591400146484 0.64959717395049665 +1107 7 6.734277 0.26572322845458984 0.070608834140330146 +1108 7 6.37152 0.62847995758056641 0.39498705708047055 +1109 4 5.30562353 1.3056235313415527 1.7046528055927865 +1110 7 6.734277 0.26572322845458984 0.070608834140330146 +1111 6 6.009964 0.0099639892578125 9.9281081929802895E-05 +1113 5 6.037582 1.0375819206237793 1.0765762420053306 +1114 4 4.41076326 0.41076326370239258 0.1687264588074413 +1115 8 5.98748255 2.0125174522399902 4.0502264955705414 +1116 5 4.90289736 0.097102642059326172 0.0094289230949016201 +1117 5 5.82768726 0.82768726348876953 0.6850662061415278 +1118 5 4.90289736 0.097102642059326172 0.0094289230949016201 +1120 6 6.10586357 0.10586357116699219 0.01120709570022882 +1121 6 5.18950462 0.81049537658691406 0.65690275546876364 +1123 5 4.903581 0.096418857574462891 0.0092965960959645599 +1124 5 5.744567 0.74456691741943359 0.55437989451547764 +1127 7 6.33109 0.66891002655029297 0.44744062361951364 +1128 5 5.677559 0.67755889892578125 0.45908606151351705 +1131 6 5.63907 0.36092996597290039 0.13027044033719903 +1132 5 5.72486734 0.72486734390258789 0.52543266625639262 +1139 5 6.42748642 1.4274864196777344 2.0377174783643568 +1142 5 4.971568 0.028431892395019531 0.00080837250516196946 +1145 5 5.10051 0.1005101203918457 0.010102284301183317 +1149 5 5.462134 0.46213388442993164 0.21356772713829741 +1150 5 5.117995 0.11799478530883789 0.013922769360078746 +1152 4 4.57453156 0.57453155517578125 0.33008650789270177 +1154 4 5.413978 1.413978099822998 1.9993340667790562 +1156 6 5.30396843 0.69603157043457031 0.48445994704161421 +1157 6 5.30396843 0.69603157043457031 0.48445994704161421 +1160 6 6.187364 0.18736410140991211 0.035105306497143829 +1161 6 5.30396843 0.69603157043457031 0.48445994704161421 +1162 7 5.98087168 1.0191283226013184 1.0386225379281768 +1163 6 5.293566 0.70643377304077148 0.49904867569262024 +1167 6 5.66483259 0.33516740798950195 0.11233719137840126 +1171 5 4.899895 0.10010480880737305 0.010020972746360712 +1172 6 6.07855 0.078549861907958984 0.0061700808057594259 +1173 5 6.19663334 1.1966333389282227 1.4319313478345066 +1176 7 5.74743557 1.2525644302368164 1.5689176518944805 +1178 5 5.472783 0.47278308868408203 0.22352384894566057 +1179 5 5.756897 0.75689697265625 0.57289302721619606 +1180 5 4.899895 0.10010480880737305 0.010020972746360712 +1183 6 6.20801973 0.20801973342895508 0.043272209495853531 +1185 5 5.087918 0.087917804718017578 0.0077295403864354739 +1188 6 5.65794563 0.34205436706542969 0.11700119002853171 +1189 5 4.939712 0.060287952423095703 0.0036346372073694511 +1190 6 6.07855 0.078549861907958984 0.0061700808057594259 +1192 6 5.7700386 0.22996139526367188 0.052882243311614729 +1193 7 5.82296658 1.1770334243774414 1.3854076821016861 +1194 6 5.47563 0.52437019348144531 0.27496409981176839 +1196 7 6.705709 0.29429101943969727 0.086607204122856274 +1197 7 5.82296658 1.1770334243774414 1.3854076821016861 +1203 6 5.899554 0.10044622421264648 0.010089443958577249 +1205 5 4.849187 0.15081310272216797 0.022744591952687188 +1209 6 6.46530867 0.46530866622924805 0.21651215486804176 +1211 5 5.415062 0.41506195068359375 0.17227642290527001 +1215 5 5.75489759 0.7548975944519043 0.56987037810927177 +1217 5 4.94168 0.058320045471191406 0.0034012277037618333 +1219 8 6.149987 1.8500127792358398 3.4225472833359163 +1222 6 5.252237 0.74776315689086914 0.55914973880339858 +1223 5 5.75489759 0.7548975944519043 0.56987037810927177 +1224 7 6.828078 0.17192220687866211 0.029557245218029493 +1225 6 6.36836958 0.36836957931518555 0.13569614696484678 +1226 7 6.828078 0.17192220687866211 0.029557245218029493 +1227 5 6.02813625 1.0281362533569336 1.0570641554668327 +1228 6 5.928509 0.071490764617919922 0.005110929425654831 +1230 6 5.70135975 0.29864025115966797 0.089185999612709566 +1235 5 5.32679749 0.3267974853515625 0.10679659643210471 +1236 6 6.36836958 0.36836957931518555 0.13569614696484678 +1237 5 6.57272768 1.5727276802062988 2.4734723560870862 +1239 5 5.11314869 0.11314868927001953 0.012802625883523433 +1241 7 6.17593575 0.82406425476074219 0.6790818959743774 +1242 7 7.049261 0.049261093139648438 0.0024266552973131184 +1244 5 5.48783636 0.48783636093139648 0.23798431504678774 +1245 4 5.28817654 1.2881765365600586 1.659398789343868 +1247 6 5.9337616 0.0662384033203125 0.004387526074424386 +1250 7 5.70580244 1.2941975593566895 1.6749473226448117 +1252 6 5.28407574 0.71592426300048828 0.51254755035279231 +1256 6 6.01677132 0.016771316528320313 0.0002812770580931101 +1258 6 5.34223127 0.65776872634887695 0.43265969736262377 +1262 6 6.01677132 0.016771316528320313 0.0002812770580931101 +1264 5 5.9943676 0.99436759948730469 0.98876692291014479 +1267 7 5.75471735 1.2452826499938965 1.5507288783758213 +1270 7 5.75471735 1.2452826499938965 1.5507288783758213 +1271 5 5.586012 0.58601188659667969 0.34340993123259977 +1272 5 5.23190975 0.23190975189208984 0.053782133022650669 +1273 5 5.586012 0.58601188659667969 0.34340993123259977 +1275 6 5.607518 0.39248180389404297 0.154041966387922 +1276 7 5.75471735 1.2452826499938965 1.5507288783758213 +1278 6 5.40593958 0.59406042098999023 0.35290778378680443 +1279 6 5.93613434 0.06386566162109375 0.0040788227343000472 +1283 8 7.28526354 0.7147364616394043 0.51084820959681565 +1284 7 6.51235151 0.48764848709106445 0.23780104696220405 +1286 7 5.999429 1.0005707740783691 1.0011418739397868 +1287 7 6.010927 0.98907279968261719 0.97826500307201059 +1288 7 6.059415 0.94058513641357422 0.88470039884214202 +1289 6 6.580059 0.58005905151367188 0.33646850324294064 +1292 6 6.481823 0.48182296752929688 0.23215337203873787 +1294 4 4.84203959 0.84203958511352539 0.70903066289815797 +1295 6 5.849522 0.15047788619995117 0.022643594235205455 +1298 6 6.438703 0.43870306015014648 0.19246037498510304 +1299 5 5.84311 0.84311008453369141 0.71083461464240827 +1303 6 6.040718 0.04071807861328125 0.0016579619259573519 +1304 5 5.23674536 0.23674535751342773 0.056048364304160714 +1305 7 5.961569 1.0384311676025391 1.0783392898483726 +1307 5 5.201838 0.20183801651000977 0.040738584908694975 +1309 6 5.140684 0.85931587219238281 0.73842376820175559 +1310 6 5.39392853 0.60607147216796875 0.36732262937584892 +1311 6 5.793617 0.20638322830200195 0.04259403692435626 +1312 5 5.47025442 0.47025442123413086 0.22113922069024738 +1315 6 5.966254 0.033745765686035156 0.0011387767017367878 +1316 6 5.96671247 0.033287525177001953 0.0011080593324095389 +1317 5 6.4081254 1.4081254005432129 1.9828171436549837 +1318 6 6.69151068 0.69151067733764648 0.47818701687197063 +1319 5 5.55651 0.55650997161865234 0.30970334851099324 +1321 6 6.663579 0.66357898712158203 0.44033707214930473 +1322 6 5.82713461 0.17286539077758789 0.029882443328688169 +1326 6 5.40980434 0.59019565582275391 0.34833091215205059 +1329 5 5.092535 0.092535018920898438 0.0085627297266910318 +1332 7 5.692085 1.307915210723877 1.7106421984428835 +1333 8 7.02583933 0.97416067123413086 0.94898901337933239 +1335 6 4.97064 1.0293598175048828 1.0595816338936856 +1339 6 6.011735 0.011734962463378906 0.00013770934401691193 +1342 6 6.011735 0.011734962463378906 0.00013770934401691193 +1343 6 6.17206049 0.17206048965454102 0.029604812100160416 +1347 7 7.23906326 0.23906326293945313 0.057151243687258102 +1349 4 5.488322 1.4883217811584473 2.215101724270653 +1351 7 6.8603344 0.13966560363769531 0.01950648083948181 +1352 6 4.97064 1.0293598175048828 1.0595816338936856 +1353 5 5.547811 0.54781103134155273 0.30009692605949567 +1357 6 5.488955 0.51104497909545898 0.26116697065867811 +1358 8 6.688844 1.3111557960510254 1.7191295215181981 +1359 7 6.5702467 0.42975330352783203 0.18468790189308493 +1360 6 5.92257833 0.077421665191650391 0.0059941142410480097 +1362 7 5.93040943 1.0695905685424805 1.1440239843150266 +1364 5 5.73871326 0.73871326446533203 0.54569728709702758 +1368 6 6.17178631 0.17178630828857422 0.029510535715417063 +1369 5 5.040043 0.040042877197265625 0.0016034320142352954 +1371 7 6.6165185 0.38348150253295898 0.14705806278493583 +1374 7 6.341347 0.65865278244018555 0.43382348781619839 +1376 6 5.66357231 0.33642768859863281 0.11318358965581865 +1377 6 5.50639057 0.49360942840576172 0.2436502678110628 +1378 7 6.506033 0.49396705627441406 0.24400345268441015 +1385 5 5.176291 0.17629098892211914 0.031078512775138734 +1387 6 6.60271931 0.60271930694580078 0.36327056296522642 +1390 6 6.133471 0.13347101211547852 0.017814511075130213 +1391 6 6.58808565 0.58808565139770508 0.3458447333798631 +1392 6 6.60271931 0.60271930694580078 0.36327056296522642 +1396 7 5.920642 1.0793581008911133 1.1650139099592707 +1397 7 6.475289 0.52471113204956055 0.27532177209673137 +1399 6 6.41273 0.41273021697998047 0.17034623200834176 +1401 6 5.14331245 0.85668754577636719 0.73391355108833523 +1402 8 6.59536552 1.4046344757080078 1.97299801034751 +1405 4 4.97745275 0.97745275497436523 0.95541388820697648 +1410 6 6.84542227 0.84542226791381836 0.71473881108454407 +1412 8 6.71645546 1.2835445404052734 1.6474865872041846 +1414 6 6.140478 0.14047813415527344 0.019734106175747002 +1415 5 4.79202175 0.20797824859619141 0.043254951889139193 +1417 3 4.953996 1.9539961814880371 3.8181010772698301 +1418 5 5.049917 0.049917221069335938 0.0024917289592849556 +1422 5 5.3871603 0.38716030120849609 0.14989309883185342 +1423 4 5.36329365 1.3632936477661133 1.8585695700394353 +1428 7 6.534054 0.46594619750976563 0.21710585897380952 +1429 5 5.45791769 0.45791769027709961 0.20968861106871373 +1430 4 4.918244 0.9182438850402832 0.84317183241387283 +1432 7 6.30958557 0.6904144287109375 0.4766720833722502 +1433 6 6.0021987 0.0021986961364746094 4.8342647005483741E-06 +1435 5 5.6443 0.64429998397827148 0.41512246935440089 +1441 5 5.43425846 0.43425846099853516 0.18858041094881628 +1444 6 6.30873156 0.3087315559387207 0.095315173632343431 +1445 6 6.33068848 0.3306884765625 0.10935486853122711 +1446 6 6.361789 0.36178922653198242 0.13089144443461009 +1448 6 5.79400826 0.20599174499511719 0.042432599006133387 +1449 6 6.40241 0.40241003036499023 0.16193383253835236 +1450 6 6.30873156 0.3087315559387207 0.095315173632343431 +1451 5 5.064728 0.064727783203125 0.0041896859183907509 +1452 6 6.30873156 0.3087315559387207 0.095315173632343431 +1453 7 6.630288 0.36971187591552734 0.13668687119297829 +1454 5 5.63396454 0.63396453857421875 0.40191103616962209 +1455 5 5.307369 0.30736923217773438 0.094475844889529981 +1466 6 6.40241 0.40241003036499023 0.16193383253835236 +1467 7 6.904765 0.095234870910644531 0.0090696806373671279 +1468 5 5.18547869 0.18547868728637695 0.034402343437477612 +1469 5 5.064728 0.064727783203125 0.0041896859183907509 +1472 5 5.25965261 0.25965261459350586 0.067419480265243692 +1473 6 6.145816 0.14581584930419922 0.021262261908304936 +1475 6 5.63432074 0.36567926406860352 0.13372132416975546 +1476 5 5.59673834 0.59673833847045898 0.35609664460048407 +1477 6 4.993153 1.0068469047546387 1.0137406896139964 +1479 6 5.99484158 0.0051584243774414063 2.660934205778176E-05 +1481 6 5.814835 0.1851649284362793 0.034286050722812433 +1483 4 5.096024 1.0960240364074707 1.2012686883829247 +1487 6 5.494021 0.50597906112670898 0.25601481029866591 +1490 6 5.90605736 0.093942642211914063 0.0088252200257556979 +1491 5 5.36705828 0.36705827713012695 0.13473177880973708 +1493 8 7.507157 0.4928431510925293 0.24289437157881366 +1496 5 3.73965025 1.2603497505187988 1.5884814936327984 +1497 7 6.33508444 0.66491556167602539 0.44211270415894433 +1499 6 6.15693665 0.1569366455078125 0.024629110703244805 +1500 7 6.62924862 0.37075138092041016 0.13745658645439107 +1501 5 5.42421675 0.42421674728393555 0.17995984867616244 +1504 8 6.618411 1.3815889358520508 1.9087879876688021 +1507 6 5.60484552 0.39515447616577148 0.15614706003384526 +1512 7 6.41460657 0.58539342880249023 0.3426854664851362 +1513 6 6.1881566 0.1881566047668457 0.035402907917386983 +1515 6 6.406722 0.40672206878662109 0.16542284123806894 +1516 6 5.8938427 0.10615730285644531 0.011269372949755052 +1517 6 5.738828 0.26117181777954102 0.068210718402269777 +1520 6 5.710736 0.28926420211791992 0.083673778626916828 +1526 6 5.80973148 0.19026851654052734 0.036202108386532927 +1527 6 5.870094 0.12990617752075195 0.01687561495805312 +1530 5 5.09535074 0.095350742340087891 0.0090917640648058295 +1532 7 5.39276028 1.6072397232055664 2.5832195278499057 +1533 6 6.650949 0.65094900131225586 0.42373460230942328 +1538 6 5.309088 0.69091176986694336 0.4773590737406721 +1540 6 6.17057276 0.17057275772094727 0.029095065676528975 +1542 6 6.437708 0.43770790100097656 0.1915882065986807 +1543 6 6.494682 0.49468183517456055 0.24471011805167109 +1549 6 5.93311 0.066889762878417969 0.0044742403779309825 +1551 6 5.79150629 0.20849370956420898 0.043469626927844729 +1552 7 6.568247 0.43175315856933594 0.18641078993459814 +1554 7 6.26918 0.7308201789855957 0.53409813401253814 +1559 4 5.560808 1.5608081817626953 2.4361221802573709 +1560 6 6.349241 0.34924077987670898 0.1219691223288919 +1561 5 4.81193638 0.18806362152099609 0.035367925739592465 +1562 7 6.56004429 0.43995571136474609 0.19356102796245978 +1564 5 4.81193638 0.18806362152099609 0.035367925739592465 +1567 5 5.56694126 0.56694126129150391 0.32142239375480131 +1569 5 5.486824 0.48682403564453125 0.23699764168122783 +1571 6 5.42728138 0.57271862030029297 0.32800661803867115 +1572 6 5.95556974 0.044430255889892578 0.0019740476384413341 +1573 5 5.71593142 0.71593141555786133 0.51255779178268313 +1576 6 5.3123 0.68769979476928711 0.47293100772571961 +1578 5 5.89515352 0.89515352249145508 0.80129982882885997 +1580 5 4.789808 0.21019220352172852 0.044180762421319741 +1581 6 6.12694454 0.12694454193115234 0.016114916726110096 +1585 5 5.095582 0.095582008361816406 0.0091359203224783414 +1587 6 5.43847561 0.56152439117431641 0.31530964188368671 +1588 5 5.095582 0.095582008361816406 0.0091359203224783414 +1589 6 6.57659435 0.57659435272216797 0.33246104759109585 +1592 6 5.995277 0.0047230720520019531 2.230740960840194E-05 +1596 5 6.15547037 1.1554703712463379 1.3351117788281499 +1597 6 5.42937946 0.57062053680419922 0.32560779702271248 +1598 6 5.5156 0.48439979553222656 0.2346431619116629 +1599 6 5.63169432 0.36830568313598633 0.13564907623026556 +1600 6 5.406555 0.59344482421875 0.35217675939202309 +1603 7 5.52368355 1.4763164520263672 2.1795102665237209 +1607 7 5.521132 1.4788680076599121 2.1870505840799979 +1609 7 5.96955967 1.0304403305053711 1.0618072747320184 +1610 6 6.05691242 0.056912422180175781 0.0032390237984145642 +1613 7 6.103424 0.896575927734375 0.80384839419275522 +1616 6 5.335125 0.66487503051757813 0.44205880620575044 +1617 6 5.52980137 0.47019863128662109 0.22108675286381185 +1619 8 6.729283 1.2707171440124512 1.6147220600871606 +1621 5 4.84396172 0.15603828430175781 0.024347946167836199 +1623 6 5.68089437 0.31910562515258789 0.10182840000402393 +1626 6 5.63088036 0.36911964416503906 0.13624931170852506 +1628 6 5.57520962 0.42479038238525391 0.18044686896701023 +1629 6 5.65554953 0.34445047378540039 0.1186461288909868 +1632 8 7.12291 0.8770899772644043 0.76928682821767325 +1633 7 6.45866 0.54133987426757813 0.29304885947203729 +1634 6 5.487575 0.51242494583129883 0.26257932511020954 +1636 5 5.24233532 0.24233531951904297 0.058726407086396648 +1639 5 5.68869734 0.68869733810424805 0.47430402351187695 +1641 6 5.73338747 0.26661252975463867 0.071082241022168091 +1642 7 5.563681 1.4363188743591309 2.0630119088402807 +1644 7 5.563681 1.4363188743591309 2.0630119088402807 +1646 6 5.73338747 0.26661252975463867 0.071082241022168091 +1647 7 6.283148 0.71685218811035156 0.51387705959859886 +1651 6 4.98633 1.0136699676513672 1.0275268033183238 +1653 6 5.289247 0.71075296401977539 0.50516977586289613 +1654 5 5.107417 0.10741710662841797 0.011538434796420916 +1655 5 5.704415 0.70441484451293945 0.49620027317018867 +1656 5 5.69252 0.6925201416015625 0.47958414652384818 +1657 6 6.306578 0.30657815933227539 0.093990167779566036 +1658 5 5.217158 0.21715784072875977 0.047157527789977394 +1659 5 5.266233 0.26623296737670898 0.07087999291820779 +1660 6 5.272804 0.72719621658325195 0.52881433741299588 +1663 6 5.289247 0.71075296401977539 0.50516977586289613 +1664 4 5.28846645 1.2884664535522461 1.6601458019295023 +1665 8 6.539163 1.4608368873596191 2.1340444114705406 +1667 6 6.103382 0.10338211059570313 0.010687860791222192 +1668 7 5.517866 1.4821338653564453 2.1967207948364376 +1669 6 5.002777 0.997222900390625 0.99445351306349039 +1673 5 5.44804335 0.4480433464050293 0.20074284025781708 +1674 6 5.60366058 0.39633941650390625 0.15708493307465687 +1677 6 6.12342 0.12341976165771484 0.015232437567647139 +1679 5 5.36758 0.36757993698120117 0.13511501007110382 +1680 5 5.30406761 0.30406761169433594 0.092457112481497461 +1681 6 6.31024456 0.31024456024169922 0.096251687159565336 +1684 7 6.14880276 0.85119724273681641 0.72453674604275875 +1685 7 6.75045347 0.24954652786254883 0.062273469568253859 +1688 3 5.08076429 2.0807642936706543 4.3295800458147369 +1690 4 4.711043 0.71104288101196289 0.50558197863779242 +1697 6 6.4876914 0.48769140243530273 0.23784290400931241 +1699 6 6.16492939 0.16492938995361328 0.027201703670471034 +1701 5 5.8191824 0.81918239593505859 0.6710597978099031 +1702 4 4.340795 0.34079504013061523 0.11614125937762765 +1704 5 5.396419 0.39641904830932617 0.15714806186247188 +1706 6 6.20638561 0.20638561248779297 0.042595021041961445 +1707 5 5.43179274 0.4317927360534668 0.18644496690853885 +1709 5 6.212621 1.2126212120056152 1.4704502038059672 +1711 5 6.309819 1.309819221496582 1.7156263930019122 +1713 6 5.396862 0.60313796997070313 0.36377541082038078 +1714 5 5.380734 0.38073396682739258 0.14495835349612207 +1715 8 6.369188 1.6308121681213379 2.6595483276926188 +1716 6 6.466825 0.46682500839233398 0.21792558846050269 +1719 6 5.80834866 0.19165134429931641 0.036730237771735119 +1720 7 6.154079 0.84592103958129883 0.71558240520630534 +1721 7 5.694867 1.3051328659057617 1.703371797667387 +1723 8 6.369188 1.6308121681213379 2.6595483276926188 +1724 6 6.248959 0.24895906448364258 0.061980615788570503 +1725 6 5.7679286 0.2320713996887207 0.053857134553481956 +1728 5 5.380734 0.38073396682739258 0.14495835349612207 +1731 6 5.26263046 0.73736953735351563 0.54371383461693767 +1734 6 5.87407446 0.12592554092407227 0.015857241857020199 +1735 6 6.79139137 0.79139137268066406 0.62630030475338572 +1736 5 5.39636326 0.39636325836181641 0.15710383257919602 +1739 4 5.18590927 1.1859092712402344 1.4063807996135438 +1740 6 5.19072962 0.80927038192749023 0.65491855106506591 +1743 6 5.31016731 0.68983268737792969 0.47586913657505647 +1744 5 5.531529 0.53152894973754883 0.28252302440910171 +1746 5 5.797213 0.79721307754516602 0.63554869100903488 +1747 6 5.31016731 0.68983268737792969 0.47586913657505647 +1748 5 5.8615346 0.86153459548950195 0.74224185922525976 +1749 6 5.804206 0.19579410552978516 0.038335331760208646 +1753 7 6.184713 0.81528711318969727 0.66469307693319024 +1754 6 6.77167845 0.77167844772338867 0.5954876266807787 +1755 6 5.508878 0.49112176895141602 0.24120059193796806 +1756 5 5.125717 0.1257171630859375 0.015804805094376206 +1758 5 5.452408 0.4524078369140625 0.20467285090126097 +1765 5 5.18423843 0.18423843383789063 0.033943800503038801 +1767 5 5.255097 0.2550969123840332 0.065074434707867113 +1768 5 5.13475275 0.13475275039672852 0.018158303739483017 +1772 6 5.847888 0.15211200714111328 0.023138062716498098 +1773 6 5.847888 0.15211200714111328 0.023138062716498098 +1774 6 6.19572735 0.19572734832763672 0.038309194883368036 +1775 6 6.664879 0.66487884521484375 0.44206387881422415 +1776 5 6.248544 1.2485442161560059 1.5588626596966151 +1779 8 6.81899166 1.1810083389282227 1.3947806966179996 +1783 6 4.47723866 1.522761344909668 2.3188021135511008 +1784 7 6.801015 0.19898509979248047 0.039595069939423411 +1785 6 6.31658554 0.31658554077148438 0.1002264046255732 +1788 5 6.75687361 1.756873607635498 3.0866048732061699 +1789 7 5.92843246 1.0715675354003906 1.1482569829240674 +1794 5 5.250449 0.25044918060302734 0.062724792064727808 +1795 6 5.26829338 0.73170661926269531 0.53539457667284296 +1800 6 5.250173 0.74982690811157227 0.56224039212816024 +1801 5 5.31909275 0.31909275054931641 0.10182018345312827 +1802 6 6.01945448 0.019454479217529297 0.00037847676162527932 +1803 6 6.015074 0.015073776245117188 0.00022721873028785922 +1805 5 5.166034 0.16603422164916992 0.027567362758645686 +1810 6 5.31367254 0.68632745742797852 0.47104537881955366 +1812 6 6.18724251 0.18724250793457031 0.035059756777627626 +1814 7 6.72885752 0.27114248275756836 0.073518245955938255 +1816 7 6.89374733 0.10625267028808594 0.0112896299433487 +1817 4 5.07511234 1.0751123428344727 1.1558665497150287 +1818 6 6.42408848 0.42408847808837891 0.17985103724731744 +1821 5 5.98397446 0.98397445678710938 0.96820573160948697 +1823 6 5.735797 0.26420307159423828 0.069803263039830199 +1824 5 5.2308197 0.2308197021484375 0.053277734899893403 +1825 5 5.304334 0.30433416366577148 0.092619283174144584 +1826 5 5.2308197 0.2308197021484375 0.053277734899893403 +1827 6 5.735797 0.26420307159423828 0.069803263039830199 +1828 6 5.798369 0.20163106918334961 0.040655088060020717 +1829 7 6.39849 0.60151004791259766 0.36181433773981553 +1830 7 6.39849 0.60151004791259766 0.36181433773981553 +1831 7 6.769 0.23099994659423828 0.053360975326540938 +1832 7 6.39849 0.60151004791259766 0.36181433773981553 +1835 5 5.286033 0.28603315353393555 0.081814964920567945 +1836 6 5.85457 0.14543008804321289 0.021149910508256653 +1841 7 6.87208366 0.12791633605957031 0.016362589030904928 +1843 6 6.158535 0.15853500366210938 0.025133347386145033 +1844 6 6.583081 0.58308076858520508 0.33998318269391348 +1845 5 5.119748 0.11974811553955078 0.014339611175273603 +1847 5 5.119748 0.11974811553955078 0.014339611175273603 +1854 7 5.83165932 1.1683406829833984 1.3650199515141139 +1858 5 4.904401 0.095599174499511719 0.0091392021649880917 +1859 6 5.984875 0.015124797821044922 0.00022875950912748522 +1861 6 5.82768631 0.17231369018554688 0.029692007825360633 +1862 7 6.22135639 0.77864360809326172 0.60628586842449295 +1863 5 5.38612461 0.38612461090087891 0.14909221514335513 +1866 6 5.44316244 0.55683755874633789 0.3100680668305813 +1867 6 6.447666 0.44766616821289063 0.20040499816241208 +1868 7 6.56608438 0.43391561508178711 0.18828276101180563 +1871 6 6.08121634 0.081216335296630859 0.0065960931190147676 +1873 5 5.3560524 0.35605239868164063 0.12677331060694996 +1874 5 5.856788 0.85678815841674805 0.73408594840316255 +1876 6 5.976185 0.023815155029296875 0.00056716160906944424 +1877 6 5.42421627 0.57578372955322266 0.33152690321821865 +1878 6 5.481139 0.51886081695556641 0.26921654737179779 +1879 6 5.55618 0.44381999969482422 0.19697619212911377 +1883 5 5.539126 0.53912591934204102 0.29065675690640091 +1884 5 6.11783743 1.1178374290466309 1.2495605177775815 +1885 6 5.55618 0.44381999969482422 0.19697619212911377 +1887 5 6.036951 1.0369510650634766 1.0752675113362784 +1888 5 6.078992 1.0789918899536133 1.1642234985856703 +1889 5 6.20253038 1.2025303840637207 1.4460793245964396 +1890 5 5.539126 0.53912591934204102 0.29065675690640091 +1892 5 5.426909 0.42690896987915039 0.18225126856327734 +1894 5 5.325189 0.32518911361694336 0.1057479596149733 +1899 7 6.870124 0.12987613677978516 0.016867810904841463 +1900 6 5.666265 0.33373498916625977 0.11137904299380352 +1901 5 5.854561 0.85456085205078125 0.73027424985775724 +1902 6 5.9222703 0.077729701995849609 0.0060419065723635867 +1903 5 5.57865524 0.57865524291992188 0.3348418901587138 +1905 6 5.44087934 0.55912065505981445 0.31261590691451602 +1906 5 5.76264858 0.76264858245849609 0.58163286032595352 +1917 6 6.08581066 0.085810661315917969 0.0073634695954751805 +1919 6 5.901009 0.098990917205810547 0.0097992016892476386 +1921 5 5.6296773 0.62967729568481445 0.39649349670094125 +1924 4 5.005332 1.0053319931030273 1.0106924163565054 +1928 6 5.99948263 0.00051736831665039063 2.6766997507365886E-07 +1932 6 4.2580533 1.7419466972351074 3.034378296008299 +1934 6 6.11376858 0.11376857757568359 0.012943289243594336 +1935 5 5.52794266 0.52794265747070313 0.27872344957722817 +1936 6 6.0192523 0.019252300262451172 0.00037065106539557746 +1937 7 6.255805 0.74419498443603516 0.55382617485975061 +1939 5 5.17908669 0.17908668518066406 0.032072040808998281 +1942 5 4.74660873 0.25339126586914063 0.064207133618765511 +1945 6 5.68932152 0.31067848205566406 0.096521119212411577 +1947 5 5.152422 0.15242195129394531 0.023232451236253837 +1954 5 5.30072069 0.3007206916809082 0.090432934405043852 +1956 5 5.660834 0.66083383560180664 0.43670135827619561 +1957 6 5.72360754 0.27639245986938477 0.076392791872649468 +1958 6 5.227452 0.77254819869995117 0.59683071931453924 +1961 5 5.33527327 0.33527326583862305 0.112408162786096 +1962 5 4.870322 0.12967777252197266 0.016816324686260486 +1963 6 5.227452 0.77254819869995117 0.59683071931453924 +1964 5 4.94884157 0.051158428192138672 0.0026171847750902089 +1965 6 5.241108 0.75889205932617188 0.57591715770831797 +1967 7 5.806977 1.1930232048034668 1.4233043671995347 +1968 6 6.512014 0.51201391220092773 0.26215824628729933 +1971 7 6.75558329 0.24441671371459961 0.059739529943044545 +1973 5 5.07161427 0.071614265441894531 0.0051286030147821293 +1976 5 5.4603076 0.46030759811401367 0.21188308488149232 +1981 8 7.75330448 0.24669551849365234 0.060858678844851966 +1983 8 7.75330448 0.24669551849365234 0.060858678844851966 +1987 5 6.11174345 1.1117434501647949 1.2359734989843219 +1988 6 5.883041 0.1169590950012207 0.01367942990350457 +1991 8 7.75330448 0.24669551849365234 0.060858678844851966 +1994 6 5.72388744 0.27611255645751953 0.076238143833506911 +1995 6 6.02649355 0.026493549346923828 0.000701908156997888 +1999 6 6.81447172 0.81447172164916992 0.66336418536616293 +2000 5 5.215534 0.21553421020507813 0.046454995768726803 +2006 6 6.02649355 0.026493549346923828 0.000701908156997888 +2009 7 7.09648 0.096479892730712891 0.0093083697013298661 +2010 6 6.19020176 0.19020175933837891 0.036176709255414607 +2012 5 6.44898653 1.4489865303039551 2.0995619650022945 +2013 6 5.4776516 0.52234840393066406 0.27284785508891218 +2014 5 6.09270144 1.0927014350891113 1.1939964262458034 +2015 6 6.06119633 0.061196327209472656 0.0037449904639288434 +2016 7 6.723304 0.27669620513916016 0.076560789938412199 +2017 5 6.09270144 1.0927014350891113 1.1939964262458034 +2018 7 6.109254 0.89074611663818359 0.79342864430600457 +2020 6 6.076952 0.076951980590820313 0.0059216073168499861 +2021 6 5.7072506 0.29274940490722656 0.085702214073535288 +2023 6 5.7072506 0.29274940490722656 0.085702214073535288 +2026 5 4.99418974 0.0058102607727050781 3.3759130246835412E-05 +2030 6 5.936183 0.063817024230957031 0.0040726125816945569 +2033 5 6.131294 1.131293773651123 1.2798256023017984 +2036 6 5.1974144 0.80258560180664063 0.6441436482273275 +2040 6 5.84815359 0.15184640884399414 0.023057331878817422 +2041 5 5.480253 0.48025321960449219 0.2306431549404806 +2042 6 5.619582 0.38041782379150391 0.14471772065826372 +2044 6 5.464227 0.53577280044555664 0.28705249369727426 +2045 5 5.30614138 0.30614137649536133 0.093722542402474573 +2046 5 4.952074 0.047925949096679688 0.0022968965968175326 +2047 5 5.364253 0.36425304412841797 0.13268028015681921 +2049 7 5.550204 1.449796199798584 2.1019090209504157 +2053 5 6.461071 1.4610710144042969 2.1347285091324011 +2054 5 6.461071 1.4610710144042969 2.1347285091324011 +2055 6 6.188693 0.18869304656982422 0.035605065823801851 +2056 5 5.366029 0.36602878570556641 0.13397707196509145 +2059 5 5.17987537 0.17987537384033203 0.032355150114199205 +2068 6 6.36916876 0.36916875839233398 0.13628557217293746 +2072 5 6.0042057 1.0042057037353516 1.0084290954146127 +2075 5 5.44059229 0.44059228897094727 0.1941215651006587 +2077 6 5.883988 0.1160120964050293 0.013458806512289812 +2081 5 5.297085 0.29708480834960938 0.088259383352124132 +2083 5 4.993862 0.006137847900390625 3.7673176848329604E-05 +2088 6 5.370086 0.6299138069152832 0.39679140414250469 +2092 5 5.100627 0.10062694549560547 0.010125782159775554 +2093 5 5.26249743 0.2624974250793457 0.068904898173286711 +2095 5 5.11470842 0.11470842361450195 0.013158022448124029 +2098 6 5.54454 0.4554600715637207 0.20744387678882958 +2100 5 5.67114925 0.67114925384521484 0.45044132093698863 +2101 6 6.203464 0.20346403121948242 0.041397612000082518 +2105 5 4.79189 0.20810985565185547 0.04330971201943612 +2107 6 6.144533 0.14453315734863281 0.020889833573164651 +2108 6 5.54454 0.4554600715637207 0.20744387678882958 +2109 6 6.09675169 0.096751689910888672 0.0093608895006127568 +2117 5 5.680355 0.68035507202148438 0.46288302402535919 +2119 4 5.769792 1.7697920799255371 3.1321640061671587 +2126 5 5.23718929 0.23718929290771484 0.056258760670061747 +2127 5 4.92841053 0.071589469909667969 0.0051250522019472555 +2130 5 6.167457 1.167457103729248 1.3629560890478842 +2133 6 6.208752 0.20875215530395508 0.04357746234404658 +2135 5 5.686537 0.68653678894042969 0.4713327625686361 +2138 5 5.24775362 0.24775362014770508 0.061381856296293336 +2140 5 5.356593 0.35659313201904297 0.12715866180315061 +2141 5 5.356593 0.35659313201904297 0.12715866180315061 +2144 6 6.144319 0.14431905746459961 0.020827990347470404 +2145 6 5.79513073 0.20486927032470703 0.041971417923377885 +2149 6 6.46941233 0.46941232681274414 0.22034793256375451 +2151 5 5.356593 0.35659313201904297 0.12715866180315061 +2153 6 5.702473 0.29752683639526367 0.088522218375373996 +2154 4 4.58447027 0.58447027206420898 0.34160549892681047 +2155 5 5.991484 0.99148416519165039 0.98304084982578388 +2156 4 5.90772533 1.9077253341674805 3.639415950624425 +2159 4 5.62724733 1.6272473335266113 2.6479338844694666 +2160 6 6.665399 0.66539907455444336 0.44275592841790967 +2163 6 6.30488348 0.30488348007202148 0.092953936420826722 +2164 5 5.963228 0.96322822570800781 0.92780861480059684 +2165 5 5.02107 0.021070003509521484 0.00044394504789124767 +2169 7 6.877237 0.12276315689086914 0.015070792689812151 +2170 7 6.877237 0.12276315689086914 0.015070792689812151 +2175 7 6.90269566 0.097304344177246094 0.0094681353957639658 +2177 7 5.132139 1.8678607940673828 3.4889039460140339 +2178 5 4.92999363 0.070006370544433594 0.0049008919168045395 +2180 6 5.18151331 0.81848669052124023 0.66992046256041249 +2181 6 6.148518 0.14851808547973633 0.022057621714566267 +2183 5 5.435717 0.43571710586547852 0.18984939634378861 +2185 7 5.74344969 1.2565503120422363 1.5789186866934415 +2187 5 5.352044 0.35204410552978516 0.12393505223826651 +2188 6 6.02323 0.023230075836181641 0.00053963642335475015 +2190 6 6.57424259 0.57424259185791016 0.32975455430369038 +2191 5 5.592154 0.59215402603149414 0.35064639054530744 +2193 6 5.934508 0.065492153167724609 0.0042892221265447006 +2194 6 6.02323 0.023230075836181641 0.00053963642335475015 +2195 5 5.352044 0.35204410552978516 0.12393505223826651 +2196 6 5.596691 0.40330886840820313 0.1626580433367053 +2199 6 5.59486771 0.40513229370117188 0.16413217539957259 +2200 5 5.302277 0.3022770881652832 0.091371438029682395 +2207 7 6.24579573 0.75420427322387695 0.56882408574915644 +2208 5 6.12349844 1.1234984397888184 1.2622487442079091 +2212 6 6.01525831 0.015258312225341797 0.00023281609196601494 +2213 6 6.45868874 0.45868873596191406 0.21039535649833851 +2214 5 6.12349844 1.1234984397888184 1.2622487442079091 +2217 6 5.918304 0.081696033477783203 0.0066742418860030739 +2218 6 6.095583 0.095582962036132813 0.0091361026316008065 +2220 6 5.801627 0.19837284088134766 0.039351783999336476 +2221 6 6.00986242 0.0098624229431152344 9.7267386308885762E-05 +2223 6 5.76725245 0.23274755477905273 0.054171424255628153 +2225 4 6.12911 2.1291098594665527 4.5331087936776839 +2228 7 5.87837029 1.1216297149658203 1.2580532174943073 +2229 6 6.26292 0.26291990280151367 0.069126875289157397 +2230 7 5.87837029 1.1216297149658203 1.2580532174943073 +2231 6 6.26292 0.26291990280151367 0.069126875289157397 +2234 5 5.7482605 0.748260498046875 0.55989377293735743 +2236 5 5.239353 0.23935317993164063 0.057289944743388332 +2237 4 5.21864271 1.2186427116394043 1.4850900586318403 +2242 5 5.52886868 0.52886867523193359 0.27970207564158045 +2243 5 6.186667 1.1866669654846191 1.4081784869724743 +2244 5 5.318094 0.31809377670288086 0.10118365077710223 +2246 4 5.21864271 1.2186427116394043 1.4850900586318403 +2248 6 5.74933434 0.25066566467285156 0.062833275445882464 +2249 5 5.066485 0.066484928131103516 0.0044202456685979996 +2250 6 5.04836 0.95164012908935547 0.90561893529320514 +2251 7 6.596238 0.40376186370849609 0.16302364258535817 +2256 5 6.17655468 1.1765546798706055 1.3842809147254229 +2257 6 5.453563 0.54643678665161133 0.2985931618061386 +2261 6 5.09705639 0.90294361114501953 0.81530716490760824 +2262 6 5.53213072 0.46786928176879883 0.21890166482285167 +2263 5 5.155079 0.15507888793945313 0.02404946148453746 +2264 6 6.54189157 0.54189157485961914 0.29364647890383822 +2265 5 5.155079 0.15507888793945313 0.02404946148453746 +2268 6 5.37617826 0.62382173538208008 0.38915355753510994 +2269 6 5.787396 0.21260404586791992 0.045200480319408598 +2277 6 6.41014862 0.41014862060546875 0.16822189098456874 +2279 5 5.151719 0.15171909332275391 0.023018683278678509 +2281 6 5.45302343 0.54697656631469727 0.29918336409741642 +2286 5 5.052512 0.052512168884277344 0.0027575278809308656 +2288 5 5.064839 0.064838886260986328 0.0042040811715651216 +2294 7 7.06264973 0.062649726867675781 0.0039249882765943767 +2301 5 5.93844175 0.93844175338745117 0.88067292450091372 +2302 5 4.70638 0.29362010955810547 0.086212768736913858 +2303 5 5.21226931 0.21226930618286133 0.04505825834735333 +2305 7 6.662912 0.33708810806274414 0.11362839259732027 +2307 5 5.53247929 0.53247928619384766 0.28353419022550952 +2308 5 5.29220247 0.29220247268676758 0.085382285044261153 +2309 6 5.16241026 0.83758974075317383 0.70155657381496894 +2312 5 5.29220247 0.29220247268676758 0.085382285044261153 +2313 7 6.83518839 0.16481161117553711 0.027162867178276429 +2316 7 6.41389847 0.58610153198242188 0.34351500579214189 +2320 6 6.270724 0.27072381973266602 0.073291386570645045 +2322 6 5.31858063 0.68141937255859375 0.46433236129814759 +2323 6 6.34466648 0.34466648101806641 0.11879498313737713 +2325 6 4.86779928 1.1322007179260254 1.2818784656722073 +2326 5 5.164012 0.16401195526123047 0.026899921468611865 +2330 6 5.418478 0.58152198791503906 0.33816782242865884 +2341 5 5.289282 0.28928184509277344 0.083683985900279367 +2343 5 6.607133 1.6071329116821289 2.5828761958118776 +2346 4 5.22390175 1.2239017486572266 1.497935490366217 +2348 6 5.732352 0.26764822006225586 0.07163556970249374 +2352 6 4.92892838 1.0710716247558594 1.1471944253571564 +2353 7 6.629093 0.37090682983398438 0.13757187641749624 +2354 6 6.40233326 0.40233325958251953 0.16187205176629504 +2356 6 6.0423007 0.042300701141357422 0.0017893493170504371 +2357 5 5.656014 0.65601396560668945 0.43035432307101473 +2360 6 5.923725 0.076274871826171875 0.0058178560720989481 +2361 5 5.435309 0.43530893325805664 0.18949386737426721 +2362 6 6.59601164 0.59601163864135742 0.35522987339595602 +2363 5 5.40386868 0.40386867523193359 0.16310990683359705 +2364 5 5.101656 0.10165596008300781 0.010333934220398078 +2368 6 6.03222227 0.032222270965576172 0.0010382747461790132 +2369 6 6.44548035 0.4454803466796875 0.19845273927785456 +2371 5 5.05729532 0.057295322418212891 0.0032827539710069686 +2372 4 4.919681 0.91968107223510742 0.84581327462751688 +2373 3 4.649655 1.6496548652648926 2.7213611744921309 +2377 6 5.685666 0.31433391571044922 0.098805810565863794 +2378 5 5.3659873 0.36598730087280273 0.13394670440015943 +2382 8 6.08168459 1.9183154106140137 3.6799340145992119 +2384 8 6.08168459 1.9183154106140137 3.6799340145992119 +2385 5 6.075173 1.0751729011535645 1.1559967673749725 +2388 4 5.50844765 1.5084476470947266 2.2754143040256167 +2390 8 6.72099352 1.2790064811706543 1.6358575788765393 +2394 5 4.58178139 0.41821861267089844 0.17490680798437097 +2395 5 5.433248 0.43324804306030273 0.18770386681558193 +2397 6 6.34468651 0.34468650817871094 0.11880878892043256 +2398 6 5.82847166 0.17152833938598633 0.029421971212514109 +2399 6 5.86013937 0.13986063003540039 0.019560995833899142 +2400 4 5.371424 1.3714241981506348 1.8808043312731115 +2402 6 5.738343 0.2616572380065918 0.068464510201238227 +2404 5 5.227812 0.22781181335449219 0.051898222303861985 +2405 5 5.53696 0.53696012496948242 0.28832617580724218 +2407 6 6.45428562 0.45428562164306641 0.20637542603162728 +2408 5 5.178765 0.17876482009887695 0.031956860904983841 +2409 4 6.19751453 2.197514533996582 4.8290701271262151 +2410 6 5.979308 0.020691871643066406 0.00042815355209313566 +2411 6 5.34828043 0.65171957015991211 0.4247383981294206 +2412 4 4.916668 0.91666793823242188 0.84028010898327921 +2413 4 6.19751453 2.197514533996582 4.8290701271262151 +2414 4 4.938815 0.93881511688232422 0.88137382368677208 +2416 6 5.90936852 0.090631484985351563 0.0082140660706500057 +2417 5 5.098955 0.098955154418945313 0.009792122586077312 +2418 5 5.14088 0.14088010787963867 0.01984720479617863 +2421 5 5.53499174 0.53499174118041992 0.28621616313125742 +2425 6 5.7708354 0.22916460037231445 0.052516414063802586 +2432 5 5.24270248 0.24270248413085938 0.058904495803290047 +2434 6 5.044686 0.95531415939331055 0.91262514313734755 +2438 5 5.163544 0.1635441780090332 0.02674669816065034 +2442 5 5.403841 0.40384101867675781 0.16308756836588145 +2445 5 5.26599836 0.26599836349487305 0.07075512938195061 +2446 5 5.146648 0.14664793014526367 0.021505615415890134 +2447 6 5.372452 0.6275482177734375 0.39381676563061774 +2448 6 6.4595356 0.45953559875488281 0.21117296652300865 +2449 6 5.92163754 0.078362464904785156 0.0061406759059536853 +2451 5 5.25498247 0.25498247146606445 0.065016060754942373 +2454 5 5.75557137 0.75557136535644531 0.57088808814660297 +2457 6 6.171699 0.17169904708862305 0.029480562771141194 +2458 6 5.670337 0.32966279983520508 0.10867756159518649 +2460 5 5.292545 0.29254484176635742 0.085582484444103102 +2462 5 5.344185 0.34418487548828125 0.11846322851488367 +2463 7 5.982689 1.0173110961914063 1.0349218664341606 +2468 6 5.92515135 0.074848651885986328 0.0056023206891495647 +2469 5 5.10332346 0.10332345962524414 0.010675737308929456 +2471 7 6.763718 0.2362818717956543 0.055829122939258014 +2473 6 5.359101 0.6408991813659668 0.4107517606755664 +2474 7 6.66483355 0.33516645431518555 0.11233655209821336 +2476 6 5.617904 0.3820958137512207 0.14599721088620754 +2479 6 5.733638 0.26636219024658203 0.07094881639295636 +2480 5 5.60609865 0.60609865188598633 0.36735557581801004 +2481 6 5.534317 0.4656829833984375 0.21686064102686942 +2482 6 5.51141644 0.48858356475830078 0.23871389975192869 +2484 5 4.99243975 0.0075602531433105469 5.7157427590937004E-05 +2485 6 5.452924 0.54707622528076172 0.29929239626744675 +2487 6 6.08044624 0.080446243286132813 0.0064715980588516686 +2489 6 5.251443 0.74855709075927734 0.56033771812599298 +2490 6 5.63068438 0.36931562423706055 0.1363940303056097 +2491 5 5.337746 0.33774614334106445 0.11407245734176286 +2492 6 5.251443 0.74855709075927734 0.56033771812599298 +2493 4 4.97407532 0.9740753173828125 0.9488227239344269 +2494 4 4.97407532 0.9740753173828125 0.9488227239344269 +2497 5 5.861051 0.86105108261108398 0.74140896686571978 +2498 5 5.861051 0.86105108261108398 0.74140896686571978 +2500 5 5.861051 0.86105108261108398 0.74140896686571978 +2501 5 5.58227253 0.58227252960205078 0.3390412987291711 +2506 6 5.66883469 0.33116531372070313 0.10967046501173172 +2507 7 6.7565403 0.24345970153808594 0.059272626273013884 +2508 6 5.29136038 0.70863962173461914 0.5021701134921841 +2509 5 5.079103 0.079102993011474609 0.0062572835033734009 +2510 6 5.2369175 0.76308250427246094 0.58229490832673036 +2515 7 6.55906534 0.44093465805053711 0.19442337267014409 +2516 6 5.811081 0.1889190673828125 0.03569041402079165 +2520 5 5.290832 0.2908320426940918 0.084583277057618034 +2521 7 6.52523851 0.4747614860534668 0.22539846863969615 +2524 5 5.290832 0.2908320426940918 0.084583277057618034 +2527 6 6.490842 0.49084186553955078 0.24092573696634645 +2528 6 6.352836 0.35283613204956055 0.12449333607969493 +2529 5 5.23124552 0.23124551773071289 0.05347448947054545 +2530 6 5.951566 0.048433780670166016 0.0023458311100057472 +2533 5 5.814865 0.8148651123046875 0.66400515125133097 +2535 6 5.80516768 0.19483232498168945 0.037959634857770652 +2539 5 5.67786741 0.67786741256713867 0.45950422902046739 +2540 5 5.81270027 0.81270027160644531 0.66048173146918998 +2542 5 5.65886974 0.65886974334716797 0.43410933869836299 +2543 6 5.83148432 0.16851568222045898 0.028397535154226716 +2544 6 6.05693531 0.056935310363769531 0.0032416295662187622 +2549 5 5.859064 0.85906410217285156 0.73799113164204755 +2550 5 5.152034 0.15203380584716797 0.023114278120374365 +2553 7 6.7520833 0.24791669845581055 0.061462689373229296 +2559 5 5.22799063 0.22799062728881836 0.051979726131548887 +2561 5 5.33876657 0.33876657485961914 0.11476279224211794 +2565 5 5.59515524 0.59515523910522461 0.35420975863439708 +2570 5 6.33803844 1.338038444519043 1.79034687901094 +2572 5 5.527744 0.52774381637573242 0.27851353572282278 +2573 5 5.510949 0.51094913482666016 0.26106901838011254 +2576 5 5.52992439 0.52992439270019531 0.28081986197867082 +2577 5 5.52948666 0.52948665618896484 0.28035611908217106 +2578 7 7.174179 0.1741790771484375 0.030338350916281343 +2580 5 5.20988464 0.2098846435546875 0.044051563600078225 +2582 7 6.89886475 0.10113525390625 0.010228339582681656 +2585 7 6.89886475 0.10113525390625 0.010228339582681656 +2587 6 5.308645 0.69135522842407227 0.47797205186930114 +2588 7 6.89886475 0.10113525390625 0.010228339582681656 +2589 4 4.752048 0.75204801559448242 0.56557621775959888 +2590 6 5.84936428 0.15063571929931641 0.022691119928822445 +2591 7 6.7222743 0.2777256965637207 0.077131562531803866 +2594 7 6.5785265 0.42147350311279297 0.1776399138261695 +2597 6 6.427939 0.42793893814086914 0.18313173477713462 +2598 5 5.18123627 0.18123626708984375 0.032846584508661181 +2601 5 5.74279642 0.74279642105102539 0.5517465231262122 +2603 7 6.79414 0.20586013793945313 0.042378396392450668 +2604 7 6.79414 0.20586013793945313 0.042378396392450668 +2605 6 5.72790956 0.27209043502807617 0.074033204833767741 +2606 6 6.387043 0.38704299926757813 0.14980228328204248 +2608 6 6.0678134 0.067813396453857422 0.0045986567386080424 +2613 5 5.126914 0.12691402435302734 0.016107169577480818 +2614 5 6.94864941 1.9486494064331055 3.7972345091920943 +2615 7 6.824006 0.17599391937255859 0.030973859656114655 +2616 7 6.824006 0.17599391937255859 0.030973859656114655 +2620 5 5.711483 0.71148300170898438 0.50620806172082666 +2622 7 6.08931541 0.91068458557128906 0.82934641439715051 +2624 5 6.94864941 1.9486494064331055 3.7972345091920943 +2625 5 4.77114964 0.22885036468505859 0.052372489416484314 +2627 7 6.292391 0.70760917663574219 0.50071074685911299 +2629 5 5.016961 0.016961097717285156 0.00028767883577529574 +2630 6 5.658123 0.34187698364257813 0.11687987194454763 +2631 7 7.00162125 0.001621246337890625 2.6284396881237626E-06 +2632 5 5.24547338 0.24547338485717773 0.060257182673240095 +2634 5 5.226285 0.22628498077392578 0.05120489252385596 +2636 5 5.24788761 0.24788761138916016 0.061448267880223284 +2637 5 5.226285 0.22628498077392578 0.05120489252385596 +2640 6 5.900393 0.099606990814208984 0.009921552619061913 +2642 5 5.567663 0.56766319274902344 0.32224150040201494 +2643 5 5.44986 0.4498600959777832 0.20237410595314032 +2645 7 6.19523335 0.80476665496826172 0.6476493689488052 +2646 7 5.6784997 1.321500301361084 1.7463630464974358 +2647 5 5.91222429 0.91222429275512695 0.83215316029259156 +2649 6 5.982657 0.017343044281005859 0.00030078118493293005 +2651 5 5.137049 0.13704919815063477 0.018782482713731952 +2655 5 5.89877558 0.89877557754516602 0.80779753879164673 +2656 4 5.77243853 1.7724385261535645 3.1415383289934198 +2657 7 6.763962 0.2360382080078125 0.055714035639539361 +2659 6 6.37671328 0.37671327590942383 0.14191289224640968 +2662 6 6.27378 0.27377986907958984 0.074955416713237355 +2663 8 5.605367 2.3946328163146973 5.7342663249712587 +2667 7 6.06611156 0.93388843536376953 0.87214760970618954 +2671 7 6.997082 0.0029177665710449219 8.5133617631072411E-06 +2672 7 5.70440626 1.2955937385559082 1.678563135385275 +2673 6 5.376573 0.62342691421508789 0.38866111736774656 +2675 7 5.65682268 1.343177318572998 1.8041253091289491 +2676 6 6.117843 0.1178431510925293 0.013887008259416689 +2677 6 6.376442 0.37644195556640625 0.14170854591066018 +2678 5 5.088139 0.088139057159423828 0.0077684933969521808 +2682 6 6.55787754 0.55787754058837891 0.31122735029293835 +2684 6 6.64978456 0.64978456497192383 0.4222199808757523 +2685 7 6.16082764 0.83917236328125 0.70421025529503822 +2686 6 6.421867 0.42186689376831055 0.17797167605772302 +2687 5 5.601118 0.60111808776855469 0.36134295544252382 +2688 6 5.775768 0.22423219680786133 0.050280078085279456 +2689 6 5.77052832 0.22947168350219727 0.052657253529332593 +2690 6 5.477135 0.52286481857299805 0.27338761850137416 +2691 6 6.19818 0.19818019866943359 0.039275391144656169 +2692 6 5.3088727 0.69112730026245117 0.47765694516806434 +2693 6 6.40099239 0.40099239349365234 0.16079489963976812 +2695 6 6.671632 0.67163181304931641 0.4510892922999119 +2696 6 6.101705 0.10170507431030273 0.010343922140464201 +2701 5 5.683027 0.68302679061889648 0.46652559670314986 +2702 5 5.683027 0.68302679061889648 0.46652559670314986 +2704 6 5.40905666 0.59094333648681641 0.34921402693817072 +2705 6 5.377111 0.62288904190063477 0.38799075851989073 +2708 6 5.674005 0.32599496841430664 0.10627271943144478 +2713 6 5.674005 0.32599496841430664 0.10627271943144478 +2714 6 5.63665152 0.36334848403930664 0.13202212085366227 +2715 6 5.961359 0.038640975952148438 0.0014931250225345138 +2719 6 6.00781345 0.0078134536743164063 6.1050058320688549E-05 +2720 7 6.928305 0.071694850921630859 0.0051401516486748733 +2725 5 5.436736 0.43673610687255859 0.19073842704619892 +2726 6 6.01847649 0.018476486206054688 0.00034138054252252914 +2734 6 5.772902 0.22709798812866211 0.051573496212085956 +2735 6 5.495194 0.5048060417175293 0.25482913975451993 +2736 6 6.02836132 0.028361320495605469 0.00080436450025445083 +2737 7 5.989409 1.0105910301208496 1.02129423016072 +2738 5 4.737275 0.26272487640380859 0.069024360681396502 +2741 5 4.737275 0.26272487640380859 0.069024360681396502 +2742 6 6.055468 0.055468082427978516 0.003076708168237019 +2746 6 5.836874 0.16312599182128906 0.026610089207679266 +2747 6 5.7550745 0.24492549896240234 0.059988500041981752 +2748 8 6.51024771 1.4897522926330566 2.2193618934054484 +2750 8 6.51024771 1.4897522926330566 2.2193618934054484 +2751 6 6.259954 0.25995397567749023 0.067576069470533184 +2763 6 5.62238073 0.37761926651000977 0.14259631043955778 +2765 6 6.661471 0.66147089004516602 0.43754373837714411 +2766 6 6.56617546 0.56617546081542969 0.32055465242956416 +2767 6 5.70376873 0.29623126983642578 0.087752965228901303 +2772 7 6.78145933 0.21854066848754883 0.047760023782984717 +2774 8 6.670294 1.3297061920166016 1.7681185570872913 +2775 8 6.670294 1.3297061920166016 1.7681185570872913 +2777 6 6.15103436 0.15103435516357422 0.022811376439676678 +2783 6 6.03249025 0.032490253448486328 0.0010556165691468777 +2785 5 5.375451 0.37545108795166016 0.14096351944408525 +2786 6 6.6210227 0.62102270126342773 0.38566919548452461 +2788 5 5.12538052 0.12538051605224609 0.01572027380552754 +2790 6 6.03864765 0.038647651672363281 0.0014936409797883243 +2791 5 5.305353 0.30535316467285156 0.093240555175725603 +2794 5 5.126914 0.12691402435302734 0.016107169577480818 +2796 7 6.79185629 0.20814371109008789 0.043323804466353977 +2798 7 6.130739 0.86926078796386719 0.75561431749156327 +2799 7 6.46095467 0.53904533386230469 0.29056987195872352 +2801 5 5.305835 0.30583477020263672 0.093534906664899609 +2802 6 5.2526474 0.74735260009765625 0.5585359088727273 +2803 8 6.48372269 1.5162773132324219 2.299096890623332 +2805 6 6.56267643 0.56267642974853516 0.31660476459455822 +2806 5 5.630569 0.6305689811706543 0.39761724001459697 +2807 5 5.77354336 0.77354335784912109 0.59836932647249341 +2812 6 6.34839 0.34839010238647461 0.12137566344085826 +2815 5 5.861833 0.86183309555053711 0.74275628458622123 +2816 5 6.02125645 1.0212564468383789 1.0429647302089506 +2817 7 6.998362 0.0016379356384277344 2.6828331556316698E-06 +2819 6 6.00246859 0.0024685859680175781 6.0939166814932832E-06 +2820 5 5.3738 0.37379980087280273 0.13972629113254698 +2821 5 5.538675 0.53867483139038086 0.29017057397345525 +2822 5 5.93718 0.9371800422668457 0.8783064316232867 +2824 6 5.525997 0.47400283813476563 0.22467869055981282 +2825 6 5.664385 0.33561515808105469 0.11263753433377133 +2826 6 5.576673 0.42332696914672852 0.17920572280695524 +2827 7 6.09040356 0.90959644317626953 0.82736568943892053 +2828 7 6.09040356 0.90959644317626953 0.82736568943892053 +2829 5 5.81203938 0.81203937530517578 0.65940794704602013 +2832 6 6.443174 0.44317388534545898 0.19640309265219003 +2834 6 6.52443933 0.52443933486938477 0.27503661595824269 +2835 6 5.664385 0.33561515808105469 0.11263753433377133 +2838 7 6.574909 0.42509078979492188 0.18070217956847046 +2841 6 5.288304 0.71169614791870117 0.50651140696231778 +2843 6 5.576536 0.42346382141113281 0.17932160804411978 +2845 7 6.77294 0.22705984115600586 0.051556171465790612 +2849 5 4.95902538 0.040974617004394531 0.0016789192386568175 +2851 5 5.447955 0.44795513153076172 0.20066379986474203 +2853 6 6.56922865 0.5692286491394043 0.32402125500107104 +2855 7 6.19740772 0.80259227752685547 0.64415436394574499 +2857 8 6.96427441 1.0357255935668945 1.072727505169496 +2858 7 6.19740772 0.80259227752685547 0.64415436394574499 +2859 6 6.38069248 0.38069248199462891 0.14492676584723085 +2862 6 7.406578 1.4065780639648438 1.9784618500270881 +2864 6 6.56922865 0.5692286491394043 0.32402125500107104 +2866 7 6.92963028 0.070369720458984375 0.0049518975574756041 +2867 7 6.45028639 0.5497136116027832 0.30218505478137558 +2874 7 7.00020456 0.00020456314086914063 4.1846078602247871E-08 +2875 6 6.091036 0.091035842895507813 0.0082875246916955803 +2876 5 5.73519039 0.73519039154052734 0.5405049118135139 +2877 5 5.667036 0.66703605651855469 0.44493710069582448 +2878 6 7.063399 1.0633988380432129 1.1308170887516553 +2880 5 5.79379845 0.79379844665527344 0.63011597391232499 +2882 5 6.03466845 1.0346684455871582 1.0705387922937462 +2883 7 6.6983304 0.30166959762573242 0.091004546131671304 +2884 7 6.882702 0.11729812622070313 0.013758850414888002 +2885 6 6.69207048 0.69207048416137695 0.47896155504736271 +2886 5 5.645948 0.64594793319702148 0.41724873240150373 +2887 5 6.44235039 1.4423503875732422 2.080374640532682 +2888 4 5.687807 1.6878070831298828 2.8486927498634032 +2889 6 6.115722 0.1157221794128418 0.013391622808057946 +2892 5 5.230067 0.23006677627563477 0.05293072154586298 +2894 7 6.08665466 0.9133453369140625 0.83419970446266234 +2897 5 5.230067 0.23006677627563477 0.05293072154586298 +2899 5 5.345107 0.34510707855224609 0.11909889566686616 +2900 6 6.304159 0.30415916442871094 0.092512797305971617 +2901 7 6.9534893 0.046510696411132813 0.0021632448806485627 +2907 6 5.99173832 0.0082616806030273438 6.8255366386438254E-05 +2908 6 6.029345 0.029345035552978516 0.0008611311116055731 +2909 6 6.13224649 0.13224649429321289 0.01748913525284479 +2912 7 6.9534893 0.046510696411132813 0.0021632448806485627 +2914 6 6.29565048 0.29565048217773438 0.087409207611926831 +2915 6 6.29565048 0.29565048217773438 0.087409207611926831 +2916 6 7.28764725 1.2876472473144531 1.6580354335164884 +2917 7 6.59266424 0.40733575820922852 0.16592241991588708 +2918 6 5.818439 0.18156099319458008 0.032964394249802353 +2921 6 5.24437332 0.75562667846679688 0.57097167721076403 +2922 8 6.92716074 1.0728392601013184 1.1509840780147442 +2925 5 5.60205 0.60204982757568359 0.36246399488391035 +2926 8 6.49473143 1.5052685737609863 2.2658334791524339 +2928 7 6.657715 0.34228515625 0.11715912818908691 +2930 8 6.3040967 1.6959033012390137 2.8760880071533848 +2931 8 6.49473143 1.5052685737609863 2.2658334791524339 +2932 6 5.77632141 0.2236785888671875 0.050032111117616296 +2935 4 5.64942026 1.6494202613830566 2.7205871986609509 +2936 5 5.53018761 0.53018760681152344 0.28109889841653057 +2938 8 6.46726751 1.5327324867248535 2.3492688758617533 +2939 8 6.46726751 1.5327324867248535 2.3492688758617533 +2942 5 5.406212 0.40621185302734375 0.16500806953990832 +2945 8 6.766925 1.2330751419067383 1.5204743055883227 +2946 6 6.597327 0.59732723236083984 0.35679982251986075 +2951 5 5.378861 0.3788609504699707 0.14353561979100959 +2952 5 5.267042 0.26704216003417969 0.071311515235720435 +2954 7 6.799798 0.20020198822021484 0.040080836087327043 +2957 6 6.349566 0.34956598281860352 0.12219637634393621 +2958 5 5.378861 0.3788609504699707 0.14353561979100959 +2960 7 6.284437 0.71556282043457031 0.51203014998827712 +2963 7 6.68011761 0.31988239288330078 0.1023247452767464 +2966 6 5.974721 0.025279045104980469 0.000639030121419637 +2969 6 6.09424448 0.094244480133056641 0.0088820220355501078 +2972 6 5.933644 0.066356182098388672 0.0044031429026745172 +2973 6 5.974721 0.025279045104980469 0.000639030121419637 +2974 6 5.957036 0.042963981628417969 0.0018459037173670367 +2976 6 6.69672871 0.69672870635986328 0.48543089026588859 +2977 6 5.54298067 0.45701932907104492 0.20886666714454805 +2978 6 5.54298067 0.45701932907104492 0.20886666714454805 +2979 7 6.81259727 0.18740272521972656 0.035119781419780338 +2980 7 6.51479244 0.48520755767822266 0.23542637402806577 +2982 6 5.97326 0.026740074157714844 0.00071503156596008921 +2983 6 6.640424 0.64042377471923828 0.41014261122563767 +2986 7 6.75716543 0.24283456802368164 0.058968627427248066 +2988 7 6.219643 0.78035688400268555 0.60895686641038083 +2990 7 7.345382 0.3453822135925293 0.11928887346607553 +2992 7 6.498168 0.50183200836181641 0.25183536461645417 +2993 7 6.69612646 0.30387353897094727 0.092339127686727807 +2995 6 6.423425 0.42342519760131836 0.1792888979637155 +2998 7 5.98535633 1.014643669128418 1.0295017753023785 +3003 7 6.219643 0.78035688400268555 0.60895686641038083 +3007 7 7.345382 0.3453822135925293 0.11928887346607553 +3008 7 6.825198 0.17480182647705078 0.030555678539712972 +3009 6 6.295004 0.29500389099121094 0.087027295699954266 +3010 5 5.711464 0.71146392822265625 0.50618092116201296 +3011 6 6.46941233 0.46941232681274414 0.22034793256375451 +3012 6 6.697702 0.69770193099975586 0.48678798452078809 +3015 6 6.49390459 0.49390459060668945 0.24394174462236151 +3017 6 6.946234 0.94623422622680664 0.89535921088304349 +3018 8 6.962376 1.0376238822937012 1.0766633211062526 +3019 6 6.49390459 0.49390459060668945 0.24394174462236151 +3021 4 5.24641752 1.2464175224304199 1.5535566402215863 +3024 6 6.009761 0.0097608566284179688 9.5274322120530996E-05 +3025 7 6.219143 0.78085708618164063 0.60973778904008213 +3030 8 7.225498 0.77450180053710938 0.59985303903522436 +3032 5 6.4052043 1.4052042961120605 1.9745991138117915 +3035 7 6.15401649 0.84598350524902344 0.71568809115342447 +3036 5 5.49720573 0.49720573425292969 0.24721354217399494 +3041 6 5.60923433 0.39076566696166992 0.15269780647599873 +3042 6 5.63067532 0.36932468414306641 0.13640072231737577 +3047 5 5.81673336 0.81673336029052734 0.66705338181145635 +3048 6 6.29114628 0.29114627838134766 0.084766155415309186 +3051 5 4.942138 0.057861804962158203 0.0033479884734788357 +3052 7 5.52170372 1.4782962799072266 2.1853598911875451 +3054 6 6.31711531 0.31711530685424805 0.1005621178412639 +3057 5 7.07048559 2.0704855918884277 4.2869105862175729 +3060 5 5.98335648 0.98335647583007813 0.96698995855695102 +3061 5 5.98335648 0.98335647583007813 0.96698995855695102 +3063 5 5.98335648 0.98335647583007813 0.96698995855695102 +3067 4 5.51983833 1.5198383331298828 2.3099085588510206 +3068 6 6.672843 0.67284297943115234 0.4527176749697901 +3071 7 6.574376 0.42562389373779297 0.18115569892052008 +3081 5 5.98335648 0.98335647583007813 0.96698995855695102 +3082 6 5.716046 0.28395414352416992 0.080629955624544891 +3083 7 7.03537655 0.035376548767089844 0.0012515002026702859 +3085 6 6.038491 0.038490772247314453 0.0014815395481946325 +3087 3 5.562565 2.5625648498535156 6.5667386097047711 +3089 7 6.300327 0.69967317581176758 0.48954255295052462 +3092 6 6.07498169 0.074981689453125 0.0056222537532448769 +3093 7 6.38679647 0.61320352554321289 0.37601856373862574 +3096 7 6.29434252 0.7056574821472168 0.49795248211034959 +3098 7 6.51368141 0.48631858825683594 0.23650576928412193 +3100 7 6.214272 0.78572797775268555 0.61736845502332471 +3103 7 6.38679647 0.61320352554321289 0.37601856373862574 +3107 6 5.8152194 0.18478059768676758 0.034143869281479056 +3109 4 5.217391 1.2173910140991211 1.4820408812092865 +3110 6 6.220336 0.22033596038818359 0.04854793544018321 +3118 7 6.662462 0.33753776550292969 0.11393174314071075 +3121 5 5.7390213 0.73902130126953125 0.54615248373011127 +3123 5 5.898568 0.89856815338134766 0.80742472627116513 +3127 5 5.530425 0.53042507171630859 0.28135075670525111 +3129 6 6.40345764 0.4034576416015625 0.16277806856669486 +3130 6 6.532478 0.53247785568237305 0.2835326667920981 +3132 6 6.18413734 0.18413734436035156 0.033906561588082695 +3134 6 6.30036449 0.30036449432373047 0.090218829450350313 +3136 5 5.418242 0.41824197769165039 0.17492635190342298 +3137 6 6.030046 0.030045986175537109 0.00090276128526056709 +3139 6 5.48615837 0.51384162902832031 0.26403321972247795 +3142 6 5.927244 0.072755813598632813 0.0052934084123990033 +3148 6 5.863857 0.13614320755004883 0.018534972962015672 +3149 6 5.978788 0.021212100982666016 0.00044995322809882055 +3150 6 6.86632347 0.86632347106933594 0.75051635652562254 +3152 6 6.020052 0.020051956176757813 0.00040208094651461579 +3153 6 6.675877 0.67587709426879883 0.45680984655723478 +3155 7 7.07547855 0.075478553771972656 0.0056970120795085677 +3156 5 5.45387 0.45386981964111328 0.2059978131810567 +3160 6 5.46099949 0.53900051116943359 0.29052155104091071 +3161 5 5.45387 0.45386981964111328 0.2059978131810567 +3163 7 7.082826 0.082826137542724609 0.006860169060246335 +3165 6 5.32146263 0.67853736877441406 0.46041296082330518 +3169 6 5.94287443 0.057125568389892578 0.0032633305638682941 +3170 6 5.82820129 0.1717987060546875 0.029514795402064919 +3171 6 6.13454771 0.13454771041870117 0.018103086378914668 +3180 6 6.229454 0.22945404052734375 0.052649156714323908 +3184 7 6.49895573 0.50104427337646484 0.25104536388334964 +3185 6 6.42349863 0.42349863052368164 0.17935109005543381 +3186 4 4.975396 0.97539615631103516 0.95139766174634133 +3187 7 6.33176565 0.66823434829711914 0.44653714424407553 +3188 8 6.155749 1.8442511558532715 3.4012623258661279 +3191 6 6.22899628 0.22899627685546875 0.052439294813666493 +3194 5 5.332969 0.33296918869018555 0.11086848061700039 +3196 7 6.38609028 0.61390972137451172 0.37688514599813061 +3198 7 6.38609028 0.61390972137451172 0.37688514599813061 +3202 7 6.58337927 0.41662073135375977 0.17357283379374167 +3203 7 6.38609028 0.61390972137451172 0.37688514599813061 +3205 7 6.77105665 0.2289433479309082 0.052415056561812889 +3207 6 6.487988 0.48798799514770508 0.23813228340827663 +3210 5 5.164092 0.16409206390380859 0.026926205436211603 +3213 6 6.04922438 0.049224376678466797 0.0024230392593835859 +3214 6 6.378387 0.3783869743347168 0.14317670234618163 +3219 7 6.99409437 0.0059056282043457031 3.4876444487963454E-05 +3221 6 6.578329 0.57832908630371094 0.33446453206488513 +3222 6 6.260792 0.26079177856445313 0.068012351766810752 +3223 6 6.038379 0.038379192352294922 0.001472962405614453 +3226 6 5.90616274 0.093837261199951172 0.0088054315895078616 +3227 6 5.297394 0.702606201171875 0.49365547392517328 +3232 5 6.33687925 1.3368792533874512 1.7872461381377889 +3236 6 6.73901 0.73900985717773438 0.54613556900585536 +3239 7 6.717206 0.28279399871826172 0.079972445711064211 +3240 6 6.097996 0.097996234893798828 0.009603262053360595 +3241 7 6.155386 0.84461402893066406 0.71337285786648863 +3242 6 6.638215 0.63821506500244141 0.40731846919607051 +3244 7 6.78101444 0.21898555755615234 0.047954674418178911 +3246 6 6.296465 0.29646492004394531 0.087891448816662887 +3247 6 6.18805265 0.18805265426635742 0.035363800776622156 +3248 7 6.380581 0.61941909790039063 0.38368001884373371 +3251 6 5.43093538 0.56906461715698242 0.32383453850002297 +3252 8 6.62019968 1.3798003196716309 1.9038489221659347 +3253 8 6.28288651 1.7171134948730469 2.9484787542751292 +3255 6 6.162778 0.16277790069580078 0.02649664495493198 +3256 6 6.162778 0.16277790069580078 0.02649664495493198 +3258 6 6.162778 0.16277790069580078 0.02649664495493198 +3263 8 6.648934 1.3510661125183105 1.8253796403953402 +3264 6 4.76881361 1.2311863899230957 1.5158199267318651 +3266 6 6.52629471 0.52629470825195313 0.27698611993400846 +3267 6 5.456572 0.54342794418334961 0.29531393051934174 +3269 5 5.305388 0.30538797378540039 0.093261814532752396 +3271 7 6.67051172 0.32948827743530273 0.10856252496728303 +3272 7 6.15691328 0.84308671951293945 0.71079521661908984 +3273 7 6.470145 0.52985477447509766 0.2807460820340566 +3274 5 6.602502 1.6025018692016602 2.5680122407948147 +3275 4 5.10975838 1.1097583770751953 1.2315636554885714 +3277 7 6.07994556 0.92005443572998047 0.84650016470641276 +3278 5 5.305388 0.30538797378540039 0.093261814532752396 +3281 6 6.1144104 0.114410400390625 0.013089739717543125 +3282 7 6.54771852 0.45228147506713867 0.20455853268890678 +3283 6 6.13799 0.13798999786376953 0.01904123951044312 +3284 6 6.074531 0.074531078338623047 0.0055548816383179656 +3287 7 6.549185 0.45081520080566406 0.20323434527745121 +3288 6 6.13799 0.13798999786376953 0.01904123951044312 +3290 5 5.538323 0.53832292556762695 0.28979157219168883 +3293 7 5.87733269 1.1226673126220703 1.2603818948300614 +3295 5 5.37942362 0.37942361831665039 0.1439622821364992 +3296 5 5.385761 0.38576078414916992 0.14881138258738247 +3297 5 5.46297359 0.46297359466552734 0.21434454935752001 +3298 6 6.486424 0.48642396926879883 0.23660827787921335 +3299 7 6.907785 0.092215061187744141 0.0085036175098593958 +3300 5 5.538323 0.53832292556762695 0.28979157219168883 +3302 6 6.837441 0.83744096755981445 0.7013073741475182 +3303 7 6.97040558 0.02959442138671875 0.00087582977721467614 +3305 7 6.44612741 0.55387258529663086 0.30677484074317363 +3306 7 6.650588 0.34941196441650391 0.12208872087740019 +3308 6 5.71844 0.28155994415283203 0.079276002151345892 +3309 7 7.01717138 0.017171382904052734 0.00029485639083759452 +3310 7 6.34131145 0.65868854522705078 0.43387059961332852 +3311 7 6.4923954 0.50760459899902344 0.25766242892495939 +3313 7 5.71587229 1.2841277122497559 1.6489839813677918 +3314 6 5.3228364 0.67716360092163086 0.45855054241314974 +3316 6 6.5741744 0.57417440414428711 0.32967624637444715 +3317 6 6.148521 0.14852094650268555 0.022058471550053582 +3318 7 6.34272146 0.65727853775024414 0.43201507618709911 +3319 5 6.048157 1.0481572151184082 1.098633547604777 +3321 6 7.08008051 1.080080509185791 1.1665739063230376 +3323 6 6.115237 0.11523723602294922 0.013279620566208905 +3326 5 5.86527252 0.86527252197265625 0.74869653728092089 +3328 5 6.12279 1.1227898597717285 1.2606570692062178 +3330 6 5.853405 0.14659500122070313 0.021490094382897951 +3332 7 6.677882 0.32211780548095703 0.10375988060786767 +3333 6 5.77039862 0.22960138320922852 0.052716795171591002 +3335 6 5.34549332 0.65450668334960938 0.42837899854930583 +3336 6 5.34549332 0.65450668334960938 0.42837899854930583 +3337 6 5.34549332 0.65450668334960938 0.42837899854930583 +3342 5 6.33434725 1.3343472480773926 1.7804825784517107 +3343 7 5.351585 1.6484150886535645 2.7172723045007388 +3344 6 5.34549332 0.65450668334960938 0.42837899854930583 +3346 6 6.06787443 0.067874431610107422 0.0046069384663951496 +3347 6 5.473527 0.52647304534912109 0.27717386747917772 +3351 6 6.575538 0.57553815841674805 0.33124417179374177 +3355 6 6.61243725 0.61243724822998047 0.37507938301951071 +3356 6 5.67187738 0.32812261581420898 0.10766445100875899 +3357 7 6.22333241 0.77666759490966797 0.6032125529827681 +3359 6 6.455224 0.45522403717041016 0.20722892401772697 +3361 6 6.04721 0.047210216522216797 0.0022288045440745918 +3363 6 6.575538 0.57553815841674805 0.33124417179374177 +3365 7 6.32687855 0.67312145233154297 0.45309248958892567 +3366 6 6.063332 0.063332080841064453 0.0040109524636591232 +3369 7 6.996855 0.0031452178955078125 9.8923956102225929E-06 +3370 6 6.12963772 0.12963771820068359 0.01680593798027985 +3371 6 6.063332 0.063332080841064453 0.0040109524636591232 +3372 6 6.205173 0.20517301559448242 0.042095966328133727 +3376 6 5.938579 0.061420917510986328 0.003772529107891387 +3382 7 6.91614866 0.083851337432861328 0.0070310467892795714 +3383 6 6.39578152 0.39578151702880859 0.15664300922162511 +3384 6 5.7451396 0.25486040115356445 0.064953824076155797 +3387 5 5.19510555 0.19510555267333984 0.038066176683969388 +3389 7 6.93638754 0.063612461090087891 0.0040465452059379459 +3390 6 6.849008 0.84900808334350586 0.72081472558261339 +3397 6 5.76644 0.23356008529663086 0.054550313443769483 +3399 6 6.414225 0.41422510147094727 0.17158243468861656 +3400 6 5.49066544 0.50933456420898438 0.25942169829795603 +3401 5 6.021369 1.0213689804077148 1.043194594139095 +3405 6 5.91241646 0.087583541870117188 0.0076708768065145705 +3406 6 6.414225 0.41422510147094727 0.17158243468861656 +3408 6 5.93870974 0.061290264129638672 0.0037564964770808729 +3409 3 6.19192934 3.1919293403625488 10.188412913867296 +3411 6 5.952903 0.047097206115722656 0.0022181468239068636 +3414 7 6.563632 0.43636798858642578 0.19041702146296302 +3416 6 5.661405 0.33859491348266602 0.11464651543633408 +3422 8 6.904515 1.0954852104187012 1.200087846246106 +3423 5 5.99837971 0.99837970733642578 0.99676204002116719 +3425 6 5.99837971 0.0016202926635742188 2.6253483156324364E-06 +3431 6 5.99837971 0.0016202926635742188 2.6253483156324364E-06 +3435 6 6.5048027 0.50480270385742188 0.25482576982176397 +3437 5 5.184186 0.18418598175048828 0.033924475873391202 +3439 5 5.184186 0.18418598175048828 0.033924475873391202 +3442 7 6.286774 0.7132258415222168 0.50869110101507431 +3450 7 6.264104 0.73589611053466797 0.54154308550005226 +3451 7 6.264104 0.73589611053466797 0.54154308550005226 +3452 5 5.423088 0.42308807373046875 0.17900351813295856 +3454 5 6.26566124 1.2656612396240234 1.6018983734866197 +3455 6 6.27837944 0.27837944030761719 0.077495112785982201 +3456 5 5.248194 0.24819421768188477 0.0616003696907228 +3457 7 6.41663027 0.58336973190307617 0.34032024410066697 +3458 7 6.66799736 0.33200263977050781 0.11022575281458558 +3459 6 5.45284367 0.54715633392333984 0.29938005375242938 +3461 8 5.74069548 2.2593045234680176 5.104456929763046 +3463 7 6.4216876 0.57831239700317383 0.33444522852755654 +3465 6 6.35328 0.35328006744384766 0.12480680605312955 +3467 5 5.426408 0.42640781402587891 0.18182362386232853 +3470 8 5.74069548 2.2593045234680176 5.104456929763046 +3472 6 6.27772 0.27771997451782227 0.077128384246179849 +3473 8 6.909926 1.0900740623474121 1.1882614614025897 +3475 6 5.10875368 0.89124631881713867 0.79432000080510079 +3477 7 5.978974 1.0210261344909668 1.0424943673135658 +3478 6 5.10875368 0.89124631881713867 0.79432000080510079 +3480 8 6.909926 1.0900740623474121 1.1882614614025897 +3481 5 5.437664 0.43766403198242188 0.1915498048911104 +3482 8 6.716783 1.2832169532775879 1.6466457491790152 +3483 7 6.300488 0.69951200485229492 0.48931704493247707 +3484 8 6.966226 1.0337738990783691 1.0686884744156941 +3487 6 5.76212358 0.23787641525268555 0.056585188933468089 +3488 6 5.669864 0.33013582229614258 0.10898966116315023 +3490 7 5.978974 1.0210261344909668 1.0424943673135658 +3491 6 5.86625338 0.13374662399291992 0.017888159429503503 +3493 7 6.80228853 0.19771146774291992 0.039089824477059665 +3494 6 6.465614 0.46561384201049805 0.21679624987177704 +3497 6 6.49325275 0.49325275421142578 0.24329827953715721 +3500 7 6.80228853 0.19771146774291992 0.039089824477059665 +3502 5 5.604294 0.6042938232421875 0.36517102480866015 +3503 7 6.91178846 0.088211536407470703 0.0077812751553665294 +3504 7 6.53602171 0.46397829055786133 0.21527585410899519 +3506 6 6.3817296 0.3817296028137207 0.14571748966432096 +3507 7 6.95021248 0.049787521362304688 0.0024787972834019456 +3511 7 6.14064837 0.85935163497924805 0.73848523254150678 +3513 6 6.194863 0.19486284255981445 0.037971527410491035 +3516 7 7.160789 0.16078901290893555 0.025853106672229842 +3517 7 6.42108536 0.57891464233398438 0.33514216310868505 +3518 5 5.62887764 0.62887763977050781 0.39548708580332459 +3519 7 6.91881466 0.081185340881347656 0.006591059574020619 +3520 5 4.49786 0.50214004516601563 0.25214462495932821 +3522 5 5.28192759 0.28192758560180664 0.079483163523264011 +3523 5 4.49786 0.50214004516601563 0.25214462495932821 +3526 6 5.8437705 0.15622949600219727 0.024407655421100571 +3527 6 5.46539 0.53460979461669922 0.28580763250010932 +3528 4 4.4780035 0.47800350189208984 0.22848734782110114 +3529 7 6.96215773 0.037842273712158203 0.0014320376797058998 +3531 5 5.334848 0.33484792709350586 0.11212313427881782 +3532 6 6.010312 0.010312080383300781 0.00010633900183165679 +3533 6 5.45931339 0.54068660736083984 0.29234200737937499 +3536 6 6.167815 0.16781520843505859 0.028161944182102161 +3537 5 5.384029 0.38402891159057617 0.14747820493744257 +3541 6 6.34305763 0.34305763244628906 0.11768853917965316 +3542 6 5.784195 0.2158050537109375 0.046571821207180619 +3543 6 5.960298 0.039701938629150391 0.001576243930912824 +3544 6 5.960298 0.039701938629150391 0.001576243930912824 +3546 6 5.784195 0.2158050537109375 0.046571821207180619 +3547 6 6.22976446 0.22976446151733398 0.052791707776350449 +3551 6 5.85590124 0.14409875869750977 0.020764452258163146 +3555 6 5.74821234 0.25178766250610352 0.063397026990287486 +3560 6 5.88100147 0.11899852752685547 0.014160649553559779 +3564 6 5.88100147 0.11899852752685547 0.014160649553559779 +3566 6 6.084973 0.084972858428955078 0.0072203866695872421 +3567 6 6.27822161 0.27822160720825195 0.077407262717542835 +3568 7 6.10018253 0.89981746673583984 0.80967147344290424 +3572 6 6.084973 0.084972858428955078 0.0072203866695872421 +3573 6 5.96597672 0.034023284912109375 0.0011575839162105694 +3574 6 5.874278 0.12572193145751953 0.015806004049409239 +3576 5 5.308861 0.30886077880859375 0.095394980686251074 +3577 7 6.527867 0.47213315963745117 0.22290972042924295 +3578 4 5.243605 1.2436051368713379 1.546553736452779 +3579 7 6.63758755 0.36241245269775391 0.13134278587040171 +3580 5 5.46338272 0.46338272094726563 0.21472354607249144 +3581 7 6.72054243 0.27945756912231445 0.07809653293975316 +3582 6 6.45041752 0.45041751861572266 0.20287594107594487 +3585 7 5.9680953 1.0319046974182129 1.0648273045537735 +3588 6 5.62326431 0.37673568725585938 0.14192977805214468 +3589 6 5.62326431 0.37673568725585938 0.14192977805214468 +3590 7 6.22018242 0.77981758117675781 0.60811545991236926 +3591 5 5.94550943 0.94550943374633789 0.89398808930332052 +3593 7 6.567736 0.43226385116577148 0.18685203702466424 +3594 7 6.36764431 0.63235569000244141 0.39987371867846377 +3595 7 6.124147 0.87585306167602539 0.76711858564726754 +3596 7 6.226759 0.77324104309082031 0.59790171072017984 +3597 6 5.781614 0.21838617324829102 0.047692520666032578 +3601 7 6.532061 0.46793889999389648 0.21896681412749786 +3602 6 6.54178429 0.54178428649902344 0.29353021309725591 +3603 7 7.277727 0.27772712707519531 0.077132357113441685 +3604 6 6.17229366 0.17229366302490234 0.029685106318538601 +3606 5 5.02290344 0.0229034423828125 0.00052456767298281193 +3608 6 6.042901 0.042901039123535156 0.0018404991578790941 +3609 6 6.042901 0.042901039123535156 0.0018404991578790941 +3610 5 5.149426 0.14942598342895508 0.022328124523710358 +3611 6 6.25682163 0.25682163238525391 0.065957350861026498 +3612 6 6.182319 0.18231916427612305 0.033240277662343942 +3617 5 5.84981 0.84981012344360352 0.72217724590723265 +3618 7 5.523922 1.4760780334472656 2.178806360825547 +3619 6 5.89736557 0.10263442993164063 0.010533826207392849 +3621 7 5.523922 1.4760780334472656 2.178806360825547 +3623 6 5.89736557 0.10263442993164063 0.010533826207392849 +3624 7 6.647185 0.35281515121459961 0.12447853092658079 +3626 5 5.84981 0.84981012344360352 0.72217724590723265 +3630 6 6.034987 0.034986972808837891 0.0012240882663263619 +3632 6 5.87621975 0.12378025054931641 0.015321550426051544 +3633 6 6.034987 0.034986972808837891 0.0012240882663263619 +3634 7 6.41386271 0.58613729476928711 0.34355692831945817 +3636 7 5.85150146 1.14849853515625 1.319048885256052 +3641 6 6.379178 0.37917804718017578 0.14377599146337161 +3642 6 6.379178 0.37917804718017578 0.14377599146337161 +3644 7 5.766061 1.2339391708374023 1.522605877326896 +3648 5 5.762733 0.76273298263549805 0.58176160280004297 +3649 6 6.608306 0.60830593109130859 0.37003610580086388 +3651 6 5.29889727 0.70110273361206055 0.49154504307830393 +3654 6 5.84720135 0.15279865264892578 0.023347428251327074 +3657 8 5.421206 2.578794002532959 6.6501785074999589 +3659 8 7.105409 0.89459085464477539 0.80029279721406965 +3662 4 4.376965 0.37696504592895508 0.14210264585221921 +3663 6 6.50556326 0.50556325912475586 0.25559420897684504 +3664 8 6.748468 1.2515320777893066 1.5663325417356191 +3665 8 7.105409 0.89459085464477539 0.80029279721406965 +3666 7 5.80096 1.1990399360656738 1.4376967682803752 +3667 8 7.36449432 0.63550567626953125 0.40386746457079425 +3669 7 7.10047436 0.10047435760498047 0.010095096536133497 +3670 6 5.35885763 0.64114236831665039 0.41106353645068339 +3671 7 6.66211176 0.33788824081420898 0.11416846328052088 +3672 8 6.41473675 1.5852632522583008 2.513059578960565 +3673 7 6.55105972 0.44894027709960938 0.20154737240227405 +3674 5 5.291589 0.29158878326416016 0.085024018525473366 +3675 6 5.73092127 0.26907873153686523 0.072403363765488393 +3676 7 6.61730766 0.38269233703613281 0.14645342482617707 +3678 5 5.57581854 0.57581853866577148 0.33156698947118457 +3682 7 6.502991 0.4970088005065918 0.24701774778100116 +3683 6 6.082693 0.082693099975585938 0.006838148783572251 +3685 6 6.082693 0.082693099975585938 0.006838148783572251 +3686 5 5.173567 0.17356681823730469 0.030125440393021563 +3689 8 7.2585597 0.7414402961730957 0.54973371278924787 +3690 7 6.452725 0.54727506637573242 0.29950999827656233 +3691 6 6.33922768 0.33922767639160156 0.11507541643004515 +3692 7 6.2607 0.73929977416992188 0.54656415608769748 +3693 7 6.9394455 0.06055450439453125 0.0036668480024673045 +3694 5 5.57581854 0.57581853866577148 0.33156698947118457 +3695 6 6.42376041 0.42376041412353516 0.17957288857815001 +3696 7 6.502991 0.4970088005065918 0.24701774778100116 +3700 5 5.07225561 0.072255611419677734 0.0052208733816314634 +3701 5 5.23490524 0.23490524291992188 0.055180473151267506 +3705 6 5.877325 0.12267494201660156 0.015049141398776555 +3707 6 6.45800257 0.45800256729125977 0.20976635164538493 +3708 5 4.759108 0.24089193344116211 0.058028923597021276 +3709 5 5.23494053 0.23494052886962891 0.055197052105540934 +3710 5 4.60004759 0.39995241165161133 0.15996193158593996 +3711 6 5.877325 0.12267494201660156 0.015049141398776555 +3712 5 5.68548536 0.6854853630065918 0.46989018289627893 +3713 5 5.06799841 0.067998409271240234 0.0046237836634190899 +3715 6 5.36293173 0.63706827163696289 0.40585598272650714 +3717 6 5.639399 0.36060094833374023 0.13003304393919279 +3719 5 5.583803 0.58380317687988281 0.34082614933504374 +3722 5 5.07799673 0.077996730804443359 0.0060834900161808037 +3725 6 6.860689 0.86068916320800781 0.74078583566370071 +3726 7 6.08775568 0.91224431991577148 0.83218969921858843 +3727 7 6.540676 0.45932388305664063 0.21097842954623047 +3729 5 5.07445 0.074450016021728516 0.0055428048856356327 +3732 5 5.07445 0.074450016021728516 0.0055428048856356327 +3736 4 6.51138926 2.5113892555236816 6.3070759927597919 +3737 5 5.62473774 0.62473773956298828 0.39029724323427217 +3740 7 6.76206827 0.23793172836303711 0.056611507361822078 +3742 7 6.76206827 0.23793172836303711 0.056611507361822078 +3743 7 6.76206827 0.23793172836303711 0.056611507361822078 +3746 5 6.23751 1.2375102043151855 1.5314315057842123 +3747 6 5.72499752 0.27500247955322266 0.075626363760420645 +3751 5 5.497589 0.497589111328125 0.24759492371231318 +3752 5 5.71907949 0.71907949447631836 0.51707531937631757 +3754 8 7.540161 0.4598388671875 0.21145178377628326 +3755 6 6.30786037 0.30786037445068359 0.094778010156915116 +3756 5 5.497589 0.497589111328125 0.24759492371231318 +3758 5 5.5047245 0.50472450256347656 0.25474682348794886 +3760 6 6.32082844 0.32082843780517578 0.10293088650450954 +3761 7 6.16920328 0.83079671859741211 0.69022318763222756 +3763 5 6.21218348 1.2121834754943848 1.4693887782616457 +3765 5 5.13151646 0.13151645660400391 0.017296578357672843 +3768 6 5.74247456 0.25752544403076172 0.066319354323240987 +3770 4 6.401444 2.4014439582824707 5.7669330847713809 +3773 5 5.84778261 0.84778261184692383 0.71873535694999191 +3774 5 5.19562674 0.19562673568725586 0.038269819715651465 +3775 6 7.05194664 1.0519466400146484 1.1065917334381083 +3777 6 7.05194664 1.0519466400146484 1.1065917334381083 +3780 5 5.19562674 0.19562673568725586 0.038269819715651465 +3781 6 6.4230175 0.42301750183105469 0.17894380685538636 +3783 5 5.183643 0.18364286422729492 0.033724701581604677 +3784 6 5.7984395 0.20156049728393555 0.040626634065347389 +3787 5 5.26239729 0.26239728927612305 0.068852337419457399 +3788 5 5.363848 0.36384820938110352 0.13238551946983534 +3789 6 5.2043786 0.79562139511108398 0.63301340435850761 +3791 5 5.26949024 0.26949024200439453 0.072624990535587131 +3792 6 5.717157 0.28284311294555664 0.080000226540732911 +3793 6 5.21008873 0.78991127014160156 0.62395981469671824 +3798 5 5.749331 0.74933099746704102 0.56149694376495063 +3800 5 5.224291 0.22429084777832031 0.050306384397117654 +3801 6 5.82138157 0.17861843109130859 0.031904543925520557 +3805 6 5.82138157 0.17861843109130859 0.031904543925520557 +3808 6 5.37288952 0.62711048126220703 0.39326755570891692 +3809 6 5.95666265 0.043337345123291016 0.0018781254823352356 +3815 7 6.536592 0.46340799331665039 0.21474696826976469 +3820 5 5.71193933 0.71193933486938477 0.50685761653426198 +3821 6 5.86657572 0.13342428207397461 0.017802039046955542 +3823 5 5.403213 0.4032130241394043 0.16258074283564383 +3824 7 6.30346251 0.69653749465942383 0.48516448146642688 +3830 7 6.236936 0.76306390762329102 0.5822665271173264 +3833 6 5.77439 0.22560977935791016 0.050899772541924904 +3834 5 5.173202 0.1732020378112793 0.029998945901979823 +3838 5 5.173202 0.1732020378112793 0.029998945901979823 +3839 5 5.009995 0.0099949836730957031 9.9899698625449673E-05 +3841 6 6.08930826 0.089308261871337891 0.0079759656384794653 +3843 7 6.8901124 0.10988759994506836 0.012075284621687388 +3848 6 5.46327162 0.5367283821105957 0.28807735616305763 +3850 6 6.41540051 0.41540050506591797 0.17255757960901974 +3853 7 6.89614964 0.10385036468505859 0.010784898245219665 +3854 6 7.155131 1.1551308631896973 1.3343273110933751 +3855 6 6.148987 0.14898681640625 0.022197071462869644 +3860 5 5.29700661 0.29700660705566406 0.088212924634717638 +3862 6 5.397261 0.60273885726928711 0.36329413006228606 +3863 6 5.397261 0.60273885726928711 0.36329413006228606 +3866 6 5.8716774 0.12832260131835938 0.016466690009110607 +3869 6 5.493267 0.50673294067382813 0.25677827316394541 +3870 6 5.86107063 0.13892936706542969 0.019301369033200899 +3872 4 5.1494236 1.1494235992431641 1.3211746104971098 +3875 7 5.99542236 1.00457763671875 1.0091762281954288 +3876 5 5.434084 0.43408393859863281 0.18842886574930162 +3886 6 6.69179535 0.69179534912109375 0.47858080506557599 +3888 6 5.799838 0.20016193389892578 0.040064799782157934 +3889 6 5.704214 0.29578590393066406 0.08748930096408003 +3891 5 5.775384 0.77538394927978516 0.60122026880071644 +3893 5 4.805878 0.1941218376159668 0.037683287839399782 +3894 6 6.364979 0.36497879028320313 0.13320951735659037 +3897 6 5.863347 0.13665294647216797 0.018674027779525204 +3900 5 4.805878 0.1941218376159668 0.037683287839399782 +3903 6 6.1915493 0.19154930114746094 0.03669113477008068 +3904 7 6.72974825 0.27025175094604492 0.073036008889403092 +3907 7 6.973695 0.026305198669433594 0.00069196347703837091 +3912 7 7.129527 0.12952709197998047 0.016777267556790321 +3916 6 6.510377 0.51037693023681641 0.26048461091795616 +3918 7 6.473529 0.52647113800048828 0.27717185914752918 +3919 6 6.34661436 0.34661436080932617 0.12014151511925775 +3921 5 5.35047245 0.35047245025634766 0.12283093838868808 +3924 5 5.19889069 0.19889068603515625 0.039557504991535097 +3929 5 5.176083 0.17608308792114258 0.031005253851844827 +3934 6 5.984907 0.015092849731445313 0.00022779411301598884 +3935 5 5.36477 0.36476993560791016 0.13305710592339892 +3938 6 6.098598 0.098598003387451172 0.0097215662719918328 +3939 6 6.2004323 0.20043230056762695 0.040173107110831552 +3948 5 5.643932 0.64393186569213867 0.41464824765375852 +3955 6 6.22030973 0.22030973434448242 0.048536379046936418 +3957 5 6.63103867 1.6310386657714844 2.6602871292416239 +3958 6 5.819886 0.18011379241943359 0.032440978219710814 +3961 5 5.08412075 0.084120750427246094 0.0070763006524430239 +3964 5 5.15813351 0.15813350677490234 0.025006205964928085 +3966 6 5.739699 0.26030111312866211 0.06775666949602055 +3968 6 5.160427 0.83957290649414063 0.704882665319019 +3969 6 6.30193424 0.30193424224853516 0.091164286642197112 +3971 6 6.30193424 0.30193424224853516 0.091164286642197112 +3972 6 5.221729 0.77827119827270508 0.60570605806083222 +3974 6 5.160427 0.83957290649414063 0.704882665319019 +3975 7 6.56129646 0.43870353698730469 0.19246079336517141 +3976 7 7.03108168 0.031081676483154297 0.00096607061300346686 +3977 6 6.7676506 0.76765060424804688 0.58928745020239148 +3979 6 6.005453 0.0054531097412109375 2.9736405849689618E-05 +3980 5 5.800408 0.80040788650512695 0.64065278477960419 +3981 7 6.6836977 0.31630229949951172 0.10004714466867881 +3983 6 5.8931303 0.10686969757080078 0.011421132258874422 +3984 7 7.03108168 0.031081676483154297 0.00096607061300346686 +3986 6 5.96196938 0.038030624389648438 0.0014463283914665226 +3987 6 5.75529051 0.24470949172973633 0.059882735342625892 +3988 6 5.97655 0.023449897766113281 0.00054989770524116466 +3989 6 5.96196938 0.038030624389648438 0.0014463283914665226 +3991 5 5.94195461 0.94195461273193359 0.88727849244696699 +3992 7 5.93896532 1.0610346794128418 1.125794590916712 +3998 6 5.95320749 0.046792507171630859 0.0021895387274071254 +3999 6 5.95320749 0.046792507171630859 0.0021895387274071254 +4000 6 5.95320749 0.046792507171630859 0.0021895387274071254 +4001 5 5.302957 0.30295705795288086 0.091782978963465212 +4005 6 6.513918 0.51391792297363281 0.26411163155353279 +4007 5 5.302957 0.30295705795288086 0.091782978963465212 +4008 6 5.57442427 0.42557573318481445 0.18111470467579238 +4012 6 5.95320749 0.046792507171630859 0.0021895387274071254 +4013 6 5.14580154 0.85419845581054688 0.7296550019091228 +4016 5 4.962957 0.037043094635009766 0.0013721908601382893 +4020 4 4.688758 0.68875789642333984 0.47438743988550414 +4023 6 6.234725 0.23472499847412109 0.05509582490867615 +4026 6 6.234725 0.23472499847412109 0.05509582490867615 +4028 6 6.42392159 0.42392158508300781 0.17970951029928983 +4030 5 5.791537 0.79153680801391602 0.62653051844085894 +4036 5 5.21523428 0.21523427963256836 0.046325795128950631 +4038 5 5.08173847 0.081738471984863281 0.0066811778024202795 +4040 5 5.61071 0.61071014404296875 0.37296688003698364 +4041 5 5.223783 0.22378301620483398 0.05007883834173299 +4042 7 6.82277 0.17722988128662109 0.031410430820869806 +4045 7 6.82277 0.17722988128662109 0.031410430820869806 +4046 7 6.9875083 0.012491703033447266 0.00015604264467583562 +4048 6 6.15472126 0.15472126007080078 0.023938668317896372 +4057 6 6.28539753 0.28539752960205078 0.081451749902953452 +4058 6 6.15472126 0.15472126007080078 0.023938668317896372 +4060 5 4.857431 0.14256906509399414 0.020325938321775538 +4061 5 4.857431 0.14256906509399414 0.020325938321775538 +4062 6 6.06900644 0.069006443023681641 0.0047618891787806206 +4063 5 5.51296663 0.51296663284301758 0.2631347664103032 +4065 8 6.8692975 1.1307024955749512 1.2784881334994225 +4067 5 5.12521124 0.12521123886108398 0.015677854337127428 +4068 6 6.401434 0.40143394470214844 0.16114921195912757 +4069 6 5.72744131 0.27255868911743164 0.074288239013412749 +4072 7 6.0370245 0.96297550201416016 0.92732181747942377 +4073 5 4.602127 0.3978729248046875 0.15830286429263651 +4074 4 4.94903946 0.94903945922851563 0.90067589517275337 +4076 5 5.611673 0.61167287826538086 0.37414371000545543 +4077 6 6.1862545 0.18625450134277344 0.034690739270445192 +4079 6 5.8900733 0.10992670059204102 0.012083879503052231 +4080 6 5.72423 0.27577018737792969 0.07604919624645845 +4081 6 5.674435 0.32556486129760742 0.10599247891173036 +4083 5 5.2860117 0.28601169586181641 0.081802690169752168 +4084 8 5.7264595 2.2735404968261719 5.1689863907085964 +4089 6 5.294126 0.70587396621704102 0.49825805618297636 +4090 6 5.23996973 0.76003026962280273 0.57764601074291022 +4092 6 5.294522 0.70547819137573242 0.49769947850677454 +4093 6 4.98445845 1.0155415534973145 1.0313246468797388 +4095 6 4.98445845 1.0155415534973145 1.0313246468797388 +4098 5 6.04345465 1.043454647064209 1.0887976004798929 +4104 7 6.358297 0.64170312881469727 0.41178290553057195 +4106 5 5.692534 0.69253396987915039 0.47960329943657598 +4110 5 5.68967056 0.68967056274414063 0.47564548511581961 +4113 6 6.400872 0.40087223052978516 0.16069854520992521 +4114 6 5.801262 0.19873809814453125 0.039496831654105335 +4115 6 5.96592236 0.034077644348144531 0.0011612858443186269 +4116 6 5.15404654 0.84595346450805664 0.71563726411318385 +4117 6 5.15404654 0.84595346450805664 0.71563726411318385 +4118 8 6.34038639 1.6596136093139648 2.7543173322201255 +4121 6 5.723781 0.27621889114379883 0.076296875824709787 +4123 6 6.31618643 0.31618642807006836 0.099973857295708513 +4124 7 6.58742 0.41258001327514648 0.17022226735412005 +4127 5 5.39415359 0.39415359497070313 0.15535705642832909 +4129 7 6.79277468 0.20722532272338867 0.042942334377812585 +4130 6 6.04917336 0.049173355102539063 0.0024180188520404045 +4135 5 6.357899 1.3578991889953613 1.84389020747426 +4142 6 6.02567 0.025670051574707031 0.00065895154784811893 +4144 6 5.75873327 0.24126672744750977 0.058209633773230962 +4145 6 5.731949 0.2680511474609375 0.07185141765512526 +4146 7 5.82673454 1.1732654571533203 1.3765518329491897 +4148 6 5.90310144 0.096898555755615234 0.0093893301075240743 +4153 5 5.16035843 0.16035842895507813 0.025714825736940838 +4156 5 5.33752441 0.3375244140625 0.11392273008823395 +4157 7 7.163793 0.16379308700561523 0.026828175350829042 +4158 7 7.163793 0.16379308700561523 0.026828175350829042 +4161 7 7.163793 0.16379308700561523 0.026828175350829042 +4164 5 5.70770454 0.70770454406738281 0.50084572169362218 +4167 8 6.47032166 1.5296783447265625 2.3399158383253962 +4172 6 5.80711365 0.1928863525390625 0.037205144995823503 +4173 5 5.48750067 0.48750066757202148 0.2376569008831666 +4175 7 6.18734026 0.81265974044799805 0.66041585374500755 +4176 6 6.30238962 0.30238962173461914 0.091439483332806049 +4182 6 5.118956 0.88104391098022461 0.77623837307532995 +4183 7 6.74477 0.25522994995117188 0.0651423273520777 +4185 5 5.45041275 0.45041275024414063 0.2028716455824906 +4190 6 5.78829861 0.21170139312744141 0.044817479852099495 +4191 5 5.714152 0.71415185928344727 0.51001287811800466 +4192 6 5.66603136 0.3339686393737793 0.11153505208517345 +4193 6 5.9803896 0.019610404968261719 0.0003845679830192239 +4194 6 5.66603136 0.3339686393737793 0.11153505208517345 +4197 5 5.455963 0.455963134765625 0.20790238026529551 +4198 5 5.106357 0.10635709762573242 0.011311832215369577 +4200 6 5.97465658 0.025343418121337891 0.00064228884207295778 +4201 6 6.104894 0.10489416122436523 0.011002785058963127 +4202 6 6.57342958 0.57342958450317383 0.32882148838348257 +4204 6 6.07713747 0.077137470245361328 0.0059501893158540042 +4209 6 6.687663 0.68766307830810547 0.47288050926817959 +4214 5 5.250823 0.25082302093505859 0.062912187830988842 +4216 5 5.250823 0.25082302093505859 0.062912187830988842 +4217 4 4.716484 0.71648406982421875 0.51334942231187597 +4219 5 5.250823 0.25082302093505859 0.062912187830988842 +4220 6 5.991435 0.0085649490356445313 7.3358351983188186E-05 +4224 7 6.574186 0.42581415176391602 0.1813176918424233 +4226 7 5.74867153 1.2513284683227539 1.5658229356349693 +4232 6 6.462127 0.4621272087097168 0.21356155702983415 +4234 6 5.617531 0.38246917724609375 0.14628267154330388 +4238 5 5.304575 0.30457496643066406 0.092765910176240141 +4239 7 6.4709487 0.52905130386352539 0.27989528211969628 +4242 7 6.803386 0.19661378860473633 0.038656981869507945 +4243 6 6.294727 0.29472684860229492 0.086863915287040072 +4245 5 5.304516 0.30451583862304688 0.092729895972297527 +4246 6 6.62987375 0.62987375259399414 0.39674094420684014 +4247 6 5.315835 0.68416500091552734 0.46808174847774353 +4248 6 5.47403669 0.52596330642700195 0.27663739970762435 +4250 6 5.65320539 0.34679460525512695 0.12026649823405933 +4252 6 5.65320539 0.34679460525512695 0.12026649823405933 +4255 5 5.06073236 0.060732364654541016 0.0036884201165321429 +4258 6 5.836208 0.16379213333129883 0.026827862941217973 +4259 6 6.598309 0.59830904006958008 0.35797370742898238 +4264 6 6.344581 0.34458112716674805 0.11873615319950659 +4265 6 5.87048626 0.12951374053955078 0.016773808988546079 +4267 7 6.85002375 0.14997625350952148 0.022492876616752255 +4269 5 5.29990435 0.29990434646606445 0.089942617029237226 +4270 6 5.849698 0.15030193328857422 0.022590671150283015 +4273 6 5.85590124 0.14409875869750977 0.020764452258163146 +4276 7 7.51885366 0.51885366439819336 0.26920912505943306 +4277 5 5.975496 0.97549581527709961 0.95159208562313324 +4280 6 5.85590124 0.14409875869750977 0.020764452258163146 +4282 5 5.540368 0.54036808013916016 0.29199766203328181 +4283 6 6.06771231 0.067712306976318359 0.004584956516055172 +4284 6 6.06771231 0.067712306976318359 0.004584956516055172 +4285 6 6.06771231 0.067712306976318359 0.004584956516055172 +4286 6 6.06771231 0.067712306976318359 0.004584956516055172 +4287 5 5.364779 0.36477899551391602 0.13306371556814156 +4289 6 5.39277 0.60723018646240234 0.36872849935116392 +4290 5 5.540368 0.54036808013916016 0.29199766203328181 +4293 5 5.352377 0.35237693786621094 0.12416950633996748 +4294 5 6.12349844 1.1234984397888184 1.2622487442079091 +4296 6 6.119482 0.11948204040527344 0.014275957979407394 +4298 6 6.53625965 0.53625965118408203 0.28757441348807333 +4299 6 5.33871174 0.66128826141357422 0.43730216468338767 +4302 6 5.57782555 0.42217445373535156 0.1782312693867425 +4303 6 6.18824339 0.18824338912963867 0.035435573551012567 +4305 6 6.193798 0.19379806518554688 0.037557690069661476 +4309 6 6.52417946 0.52417945861816406 0.27476410483723157 +4312 6 6.18824339 0.18824338912963867 0.035435573551012567 +4313 6 6.25637245 0.25637245178222656 0.065726834032830084 +4316 5 4.7827754 0.2172245979309082 0.047186525946244728 +4317 7 6.98226547 0.017734527587890625 0.00031451346876565367 +4320 5 5.331039 0.3310389518737793 0.10958678765769037 +4321 6 5.965597 0.034402847290039063 0.0011835559016617481 +4326 5 5.196533 0.196533203125 0.03862529993057251 +4328 5 5.81707525 0.81707525253295898 0.6676119683017987 +4329 5 5.66501427 0.66501426696777344 0.44224397527068504 +4330 5 5.36759853 0.36759853363037109 0.13512868192719907 +4332 8 7.563051 0.43694877624511719 0.19092423306210549 +4333 8 7.563051 0.43694877624511719 0.19092423306210549 +4334 8 7.563051 0.43694877624511719 0.19092423306210549 +4335 8 7.563051 0.43694877624511719 0.19092423306210549 +4337 8 7.563051 0.43694877624511719 0.19092423306210549 +4340 8 7.563051 0.43694877624511719 0.19092423306210549 +4341 6 5.349428 0.65057182312011719 0.42324369703783304 +4343 6 6.26234961 0.26234960556030273 0.068827315537646427 +4349 5 4.904963 0.095036983489990234 0.0090320282308766764 +4351 6 6.69831133 0.69831132888793945 0.48763871205323994 +4352 5 5.71307564 0.71307563781738281 0.50847686524866731 +4353 6 6.03289175 0.032891750335693359 0.0010818672401455842 +4354 6 6.4404335 0.44043350219726563 0.19398166985774878 +4355 6 6.69831133 0.69831132888793945 0.48763871205323994 +4358 5 5.545092 0.54509210586547852 0.29712540387686204 +4361 6 6.434056 0.43405580520629883 0.18840444203328843 +4362 6 6.71373272 0.71373271942138672 0.50941439477264794 +4363 5 5.230393 0.2303929328918457 0.053080903526506518 +4365 5 5.13981152 0.13981151580810547 0.019547259952560125 +4366 6 6.799898 0.79989814758300781 0.63983704650672735 +4369 6 5.830846 0.16915416717529297 0.028613132272766961 +4370 5 5.41643667 0.41643667221069336 0.17341950196191647 +4372 6 5.703184 0.29681587219238281 0.088099661985324929 +4375 6 5.947179 0.052821159362792969 0.0027900748764295713 +4376 5 5.03130627 0.031306266784667969 0.00098008233999280492 +4378 5 4.92310953 0.076890468597412109 0.0059121441611296177 +4380 6 6.52618837 0.52618837356567383 0.27687420447568911 +4382 6 5.97180367 0.028196334838867188 0.0007950332983455155 +4386 6 6.30707 0.30706977844238281 0.094291848832654068 +4388 6 5.86662054 0.13337945938110352 0.017790080184795443 +4393 6 5.38777351 0.61222648620605469 0.37482127041221247 +4397 5 5.297247 0.29724693298339844 0.088355739168036962 +4398 5 5.297247 0.29724693298339844 0.088355739168036962 +4399 5 5.61268663 0.6126866340637207 0.3753849115603316 +4400 5 5.297247 0.29724693298339844 0.088355739168036962 +4403 5 5.609075 0.60907506942749023 0.37097244019810205 +4406 7 6.93056154 0.069438457489013672 0.0048216993784535589 +4408 5 5.07466841 0.074668407440185547 0.0055753710696535563 +4410 5 5.34693146 0.34693145751953125 0.12036143621662632 +4411 7 6.754829 0.24517107009887695 0.060108853613428437 +4413 7 6.754829 0.24517107009887695 0.060108853613428437 +4414 7 6.689015 0.31098508834838867 0.096711725175055108 +4415 5 5.03584576 0.035845756530761719 0.0012849182612626464 +4417 6 5.767893 0.23210716247558594 0.053873734872468049 +4418 6 6.090339 0.090339183807373047 0.0081611681309823325 +4419 6 6.090339 0.090339183807373047 0.0081611681309823325 +4421 6 6.090339 0.090339183807373047 0.0081611681309823325 +4422 6 5.767893 0.23210716247558594 0.053873734872468049 +4426 6 5.79476738 0.20523262023925781 0.042120428410271415 +4428 6 6.550341 0.55034112930297852 0.30287535860247772 +4431 6 6.55115938 0.55115938186645508 0.30377666421941285 +4436 6 6.38329029 0.38329029083251953 0.14691144704647741 +4437 6 5.74162626 0.25837373733520508 0.066756988144561547 +4439 5 5.159874 0.15987396240234375 0.025559683854226023 +4440 5 5.046295 0.046295166015625 0.0021432423964142799 +4442 5 5.046295 0.046295166015625 0.0021432423964142799 +4443 5 5.159874 0.15987396240234375 0.025559683854226023 +4445 6 6.25906467 0.25906467437744141 0.067114505510289746 +4446 6 7.02105 1.021049976348877 1.0425430542020422 +4447 6 6.868141 0.86814117431640625 0.75366909854346886 +4448 5 5.758686 0.75868606567382813 0.57560454624763224 +4449 6 5.47040653 0.52959346771240234 0.28046924104364734 +4453 6 6.868141 0.86814117431640625 0.75366909854346886 +4455 5 5.494454 0.49445390701293945 0.24448466616036058 +4456 5 5.494454 0.49445390701293945 0.24448466616036058 +4457 5 5.494454 0.49445390701293945 0.24448466616036058 +4459 5 5.78956127 0.78956127166748047 0.6234070017171689 +4460 6 6.16204548 0.16204547882080078 0.026258737206262595 +4461 6 5.98530626 0.014693737030029297 0.00021590590790765418 +4462 6 6.9270153 0.92701530456542969 0.85935737489853636 +4465 5 5.23201847 0.23201847076416016 0.053832570775739441 +4466 5 6.13223457 1.1322345733642578 1.2819551291213429 +4470 6 6.18318462 0.18318462371826172 0.033556606366801134 +4472 5 6.27475071 1.2747507095336914 1.6249893714566497 +4473 5 5.007015 0.007015228271484375 4.9213427701033652E-05 +4475 6 6.679543 0.67954301834106445 0.46177871377608426 +4478 5 5.228984 0.22898387908935547 0.052433616882808565 +4481 5 5.228984 0.22898387908935547 0.052433616882808565 +4482 6 6.764298 0.7642979621887207 0.58415137500583114 +4486 6 5.52998972 0.47001028060913086 0.22090966387827393 +4489 6 6.793877 0.79387712478637695 0.63024088925908472 +4491 6 6.86674261 0.86674261093139648 0.75124275360417414 +4493 6 5.470741 0.52925920486450195 0.28011530593380485 +4494 6 5.330176 0.66982412338256836 0.44866435626522616 +4496 6 5.330176 0.66982412338256836 0.44866435626522616 +4497 5 5.06463528 0.064635276794433594 0.0041777190062930458 +4498 5 5.89736652 0.89736652374267578 0.8052666779340143 +4499 6 6.21874046 0.21874046325683594 0.047847390265815193 +4503 7 6.168795 0.83120489120483398 0.6909015711628399 +4504 5 5.46944 0.46943998336791992 0.22037389798447293 +4507 5 6.61253 1.6125302314758301 2.6002537474234941 +4509 5 5.41654444 0.41654443740844727 0.17350926833591984 +4511 6 6.10758734 0.10758733749389648 0.011575035189025584 +4512 6 6.10758734 0.10758733749389648 0.011575035189025584 +4514 5 4.692554 0.30744600296020508 0.09452304473620643 +4516 6 6.863519 0.86351919174194336 0.74566539450665914 +4517 6 5.75581551 0.24418449401855469 0.05962606711909757 +4520 5 5.19558239 0.19558238983154297 0.038252471212217642 +4521 5 5.27875662 0.27875661849975586 0.077705252357418431 +4522 6 5.6984477 0.30155229568481445 0.090933787032781765 +4526 6 6.114628 0.11462783813476563 0.013139541275450028 +4527 6 5.75581551 0.24418449401855469 0.05962606711909757 +4528 6 4.93128061 1.0687193870544434 1.1421611282660251 +4530 6 5.38715839 0.61284160614013672 0.37557483421642246 +4531 6 5.38715839 0.61284160614013672 0.37557483421642246 +4532 6 6.157311 0.15731096267700195 0.024746738978365102 +4533 5 5.603791 0.60379123687744141 0.36456385772999056 +4534 6 6.32857943 0.32857942581176758 0.10796443906679087 +4535 6 5.538044 0.46195602416992188 0.21340336826688144 +4536 6 5.38715839 0.61284160614013672 0.37557483421642246 +4542 5 6.22740364 1.2274036407470703 1.5065196973191632 +4543 5 6.22740364 1.2274036407470703 1.5065196973191632 +4544 6 6.4345727 0.43457269668579102 0.18885342870476052 +4549 5 6.22740364 1.2274036407470703 1.5065196973191632 +4551 6 5.8944006 0.10559940338134766 0.011151233994496579 +4552 6 6.49616 0.49616003036499023 0.24617477573178803 +4554 6 6.08486366 0.084863662719726563 0.007201841250207508 +4556 5 6.536952 1.536952018737793 2.3622215079021771 +4557 6 5.29681063 0.70318937301635742 0.49447529432313786 +4558 6 6.41869736 0.41869735717773438 0.17530747690761928 +4561 6 6.520865 0.52086496353149414 0.27130031023466472 +4564 7 6.22001362 0.77998638153076172 0.60837875537345099 +4565 5 6.13613462 1.1361346244812012 1.29080188494504 +4566 5 6.5219326 1.5219326019287109 2.3162788448134961 +4567 5 6.13613462 1.1361346244812012 1.29080188494504 +4568 6 6.322889 0.32288885116577148 0.10425721020715173 +4570 6 6.31788635 0.3178863525390625 0.10105173313058913 +4572 7 6.277157 0.72284317016601563 0.52250224865565542 +4573 6 6.44510651 0.44510650634765625 0.19811980199301615 +4577 6 5.970567 0.029432773590087891 0.00086628816120537522 +4579 6 6.22496557 0.22496557235717773 0.050609508745992571 +4580 6 6.645353 0.64535284042358398 0.41648028864278785 +4583 6 5.402732 0.59726810455322266 0.35672918871659931 +4584 6 6.00640726 0.0064072608947753906 4.1052992173717939E-05 +4585 6 6.381577 0.3815770149230957 0.1456010183176204 +4586 6 6.00690842 0.006908416748046875 4.772622196469456E-05 +4587 6 6.292461 0.29246091842651367 0.085533388806879884 +4590 6 6.12023926 0.1202392578125 0.014457479119300842 +4593 6 5.970617 0.029383182525634766 0.00086337141533476824 +4596 6 6.02695847 0.026958465576171875 0.00072675886622164398 +4597 6 4.66897345 1.331026554107666 1.7716316877397276 +4598 6 5.970617 0.029383182525634766 0.00086337141533476824 +4599 7 6.31390667 0.68609333038330078 0.47072405799644912 +4600 6 5.592253 0.40774679183959961 0.16625744625548577 +4602 6 5.68200874 0.31799125671386719 0.10111843934646458 +4605 6 6.718238 0.71823787689208984 0.51586564780245681 +4606 5 6.014402 1.014401912689209 1.0290112404675256 +4607 6 6.366955 0.36695480346679688 0.13465582778735552 +4608 7 6.719237 0.28076314926147461 0.07882794598322107 +4609 4 3.58334613 0.41665387153625488 0.17360044866614999 +4613 5 5.56812954 0.56812953948974609 0.32277117364083097 +4615 7 6.48936749 0.51063251495361328 0.26074556532785209 +4617 7 6.89289141 0.10710859298706055 0.011472250691667796 +4619 5 4.744896 0.25510406494140625 0.065078083949629217 +4621 7 5.60056925 1.3994307518005371 1.9584064290850165 +4623 6 6.641723 0.6417231559753418 0.41180860891495286 +4624 6 6.91729259 0.91729259490966797 0.84142570467611222 +4625 5 5.395468 0.39546823501586914 0.15639512490656671 +4630 7 5.665024 1.3349761962890625 1.7821614446584135 +4632 6 6.213084 0.21308422088623047 0.045404885190691857 +4635 6 5.715031 0.28496885299682617 0.081207247178326725 +4636 5 5.216097 0.21609687805175781 0.046697860703716287 +4639 6 5.123841 0.8761591911315918 0.76765492820436521 +4641 6 6.089448 0.089447975158691406 0.0080009402599898749 +4642 7 6.574551 0.42544889450073242 0.18100676183189535 +4644 6 6.24152946 0.24152946472167969 0.058336482328741113 +4645 7 6.48060846 0.51939153671264648 0.2697675684087244 +4647 7 6.13382149 0.86617851257324219 0.75026521564359427 +4648 5 4.853619 0.14638090133666992 0.021427368276135894 +4650 5 4.56051 0.43948984146118164 0.19315132074757457 +4653 7 6.845636 0.15436410903930664 0.02382827815949895 +4654 7 6.73595858 0.26404142379760742 0.069717873481067727 +4655 7 6.73595858 0.26404142379760742 0.069717873481067727 +4658 6 6.96779537 0.96779537200927734 0.93662788208257552 +4659 6 5.803561 0.19643878936767578 0.038588197968238092 +4660 6 6.200283 0.20028305053710938 0.040113300332450308 +4662 6 6.893102 0.89310216903686523 0.7976314843383534 +4663 7 6.494305 0.50569486618041992 0.25572729768123281 +4665 6 6.893102 0.89310216903686523 0.7976314843383534 +4666 5 5.05701542 0.057015419006347656 0.0032507580044693896 +4670 6 5.604501 0.39549922943115234 0.15641964048063528 +4671 5 5.28037834 0.28037834167480469 0.078612014480313519 +4672 5 5.28037834 0.28037834167480469 0.078612014480313519 +4675 6 5.96652365 0.033476352691650391 0.0011206661895357684 +4676 6 5.651302 0.34869813919067383 0.12159039227503854 +4677 7 6.623289 0.37671089172363281 0.1419110959432146 +4680 4 4.31187439 0.3118743896484375 0.09726563491858542 +4681 6 6.13964272 0.13964271545410156 0.019500087979395175 +4683 6 5.97821426 0.021785736083984375 0.00047461829672101885 +4687 6 5.80405569 0.19594430923461914 0.038394172321432052 +4689 6 5.80405569 0.19594430923461914 0.038394172321432052 +4690 6 5.80405569 0.19594430923461914 0.038394172321432052 +4691 7 6.169539 0.83046102523803711 0.68966551443941171 +4696 6 6.34956169 0.34956169128417969 0.12219337601345615 +4697 7 6.844913 0.15508699417114258 0.024051975761040012 +4701 6 5.30037546 0.69962453842163086 0.48947449476168003 +4706 7 6.419825 0.58017492294311523 0.3366029412120497 +4707 6 6.145443 0.14544296264648438 0.021153655383386649 +4708 6 6.09184551 0.091845512390136719 0.0084355981462067575 +4712 6 5.99468327 0.0053167343139648438 2.8267663765291218E-05 +4713 6 6.242741 0.24274110794067383 0.058923245484265863 +4715 6 5.57592058 0.42407941818237305 0.17984335292590004 +4716 6 5.64552069 0.35447931289672852 0.12565558327173676 +4718 6 5.69662333 0.30337667465209961 0.092037406722965898 +4719 6 5.57592058 0.42407941818237305 0.17984335292590004 +4722 6 5.76592445 0.23407554626464844 0.054791361359093571 +4723 6 5.09452 0.90547990798950195 0.81989386377267692 +4725 6 5.77877331 0.22122669219970703 0.048941249341623916 +4727 6 5.76592445 0.23407554626464844 0.054791361359093571 +4729 5 5.04089 0.040890216827392578 0.0016720098321911792 +4730 5 5.79183769 0.79183769226074219 0.62700693088481785 +4733 6 5.38009 0.61990976333618164 0.38428811467952073 +4734 6 6.050664 0.050663948059082031 0.0025668356329333619 +4735 6 5.92308235 0.076917648315429688 0.0059163246223761234 +4737 7 6.36828756 0.63171243667602539 0.39906060265116139 +4738 6 6.63842154 0.63842153549194336 0.40758205697989069 +4743 5 5.5243535 0.5243535041809082 0.27494659734679772 +4746 6 5.203251 0.79674911499023438 0.63480915223772172 +4748 5 5.32940531 0.32940530776977539 0.10850785678690045 +4752 7 6.69350529 0.30649471282958984 0.093939008992492745 +4754 6 5.914886 0.085114002227783203 0.0072443933752310841 +4756 7 6.854581 0.14541912078857422 0.021146720690921939 +4757 7 6.854581 0.14541912078857422 0.021146720690921939 +4758 6 6.226448 0.22644805908203125 0.051278723462019116 +4759 6 5.644577 0.3554229736328125 0.12632549018599093 +4762 7 6.60214663 0.39785337448120117 0.1582873075860789 +4764 6 6.12550163 0.12550163269042969 0.01575065980796353 +4766 8 6.66040468 1.3395953178405762 1.7945156155803943 +4770 6 5.706313 0.29368686676025391 0.086251975707455131 +4771 6 5.706313 0.29368686676025391 0.086251975707455131 +4772 5 5.219483 0.2194828987121582 0.048172742827091497 +4773 7 6.10453272 0.89546728134155273 0.80186165195323156 +4774 4 5.47965336 1.4796533584594727 2.1893740612003967 +4775 6 5.44863558 0.55136442184448242 0.30400272567590036 +4776 6 5.44695759 0.55304241180419922 0.30585590925420547 +4783 6 5.37171173 0.62828826904296875 0.39474614901700988 +4784 5 5.42426443 0.42426443099975586 0.1800003074115466 +4785 7 6.221619 0.7783808708190918 0.60587678005708767 +4789 6 5.49157 0.50843000411987305 0.25850106908933412 +4791 6 5.37171173 0.62828826904296875 0.39474614901700988 +4793 6 5.165858 0.83414220809936523 0.69579322333288474 +4794 5 5.16718 0.16718006134033203 0.027949172909757181 +4796 7 6.41808653 0.58191347122192383 0.33862328798954877 +4797 6 6.462242 0.46224212646484375 0.2136677834787406 +4800 7 5.83382559 1.1661744117736816 1.3599627586756924 +4801 7 6.41808653 0.58191347122192383 0.33862328798954877 +4802 8 6.6250205 1.3749794960021973 1.8905686144264564 +4803 7 6.71922445 0.28077554702758789 0.078834907808641219 +4804 4 5.554571 1.5545711517333984 2.4166914658017049 +4807 6 5.99386072 0.0061392784118652344 3.7690739418394514E-05 +4808 5 5.56873131 0.56873130798339844 0.32345530068050721 +4811 6 6.37171 0.37170982360839844 0.13816819296698668 +4812 7 6.333003 0.66699695587158203 0.44488493914195715 +4813 5 5.160439 0.16043901443481445 0.0257406773528146 +4815 7 5.545589 1.4544110298156738 2.1153114436494889 +4816 6 5.28646374 0.71353626251220703 0.50913399791988923 +4817 6 6.44789171 0.4478917121887207 0.20060698584734382 +4822 6 6.01049948 0.010499477386474609 0.00011023902538909169 +4826 6 6.35310268 0.35310268402099609 0.12468150546283141 +4828 5 5.462024 0.46202421188354492 0.21346637236661081 +4829 7 6.69648361 0.30351638793945313 0.092122197747812606 +4830 6 6.00627041 0.0062704086303710938 3.9318024391832296E-05 +4832 5 5.865965 0.86596488952636719 0.74989518989241333 +4834 7 6.36888 0.63112020492553711 0.39831271306525196 +4835 6 6.0981555 0.098155498504638672 0.0096345018866941246 +4836 5 5.09540653 0.095406532287597656 0.0091024064031444141 +4837 6 6.83529234 0.83529233932495117 0.69771329213494937 +4839 4 4.56506252 0.56506252288818359 0.31929565477275901 +4841 6 6.10761261 0.10761260986328125 0.011580473801586777 +4844 6 6.14371252 0.14371252059936523 0.020653288577022977 +4845 5 4.975312 0.024687767028808594 0.0006094858408687287 +4846 6 6.43904543 0.43904542922973633 0.19276088892752341 +4849 5 5.26026344 0.26026344299316406 0.06773705975865596 +4850 6 6.110013 0.11001300811767578 0.012102861955099797 +4851 5 5.26026344 0.26026344299316406 0.06773705975865596 +4852 5 6.32657051 1.3265705108642578 1.759789320294658 +4853 5 6.24574852 1.2457485198974609 1.5518893748267146 +4854 6 6.420056 0.42005586624145508 0.1764469307638592 +4856 6 5.965333 0.034667015075683594 0.0012018019342576736 +4859 6 6.22630453 0.22630453109741211 0.051213740795219564 +4860 6 5.83978939 0.16021060943603516 0.025667439375865797 +4862 6 6.11810541 0.11810541152954102 0.01394888823256224 +4866 6 5.978206 0.021793842315673828 0.00047497156288045517 +4867 6 4.43492126 1.5650787353515625 2.4494714478496462 +4869 6 5.88256931 0.11743068695068359 0.01378996623770945 +4871 6 6.876634 0.87663412094116211 0.76848738199828404 +4872 5 5.71218348 0.71218347549438477 0.50720530276726095 +4876 7 6.576274 0.42372608184814453 0.17954379243838048 +4878 4 4.537464 0.53746414184570313 0.28886770376993809 +4879 6 5.50284052 0.49715948104858398 0.24716754959649734 +4880 6 5.50284052 0.49715948104858398 0.24716754959649734 +4881 6 5.90926361 0.09073638916015625 0.0082330923178233206 +4882 5 5.77714348 0.77714347839355469 0.6039519860096334 +4883 6 6.174638 0.17463779449462891 0.030498359265948238 +4886 7 6.898373 0.10162687301635742 0.010328021319082836 +4887 7 4.873293 2.1267070770263672 4.5228829914740345 +4888 5 5.89248848 0.89248847961425781 0.79653568624416948 +4889 6 5.90926361 0.09073638916015625 0.0082330923178233206 +4894 5 5.370122 0.37012195587158203 0.13699026221820532 +4896 7 6.225442 0.77455806732177734 0.59994019965324696 diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine-out.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine-out.txt new file mode 100644 index 0000000000..56988214d4 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine-out.txt @@ -0,0 +1,32 @@ +maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.402080 +L2(avg): 0.272274 +RMS(avg): 0.521799 +Loss-fn(avg): 0.272274 +R Squared: 0.652798 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.402080 (0.0000) +L2(avg): 0.272274 (0.0000) +RMS(avg): 0.521799 (0.0000) +Loss-fn(avg): 0.272274 (0.0000) +R Squared: 0.652798 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l2: 0.272273893168108 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine-rp.txt new file mode 100644 index 0000000000..981a680d8e --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.40208 0.272274 0.521799 0.272274 0.652798 50 0.2 20 10 gbdt{l2=0.2 l1=0.2} + 1 LightGBMR %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/booster:gbdt{l2=0.2 l1=0.2};/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine.txt new file mode 100644 index 0000000000..1bbc59f006 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMReg-TrainTest-wine.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +0 6 5.75468349 0.24531650543212891 0.060180187837431731 +1 6 5.428862 0.57113790512084961 0.32619850666583261 +2 6 5.565058 0.43494176864624023 0.18917434211311956 +3 6 5.806712 0.19328784942626953 0.037360192735832243 +4 6 5.806712 0.19328784942626953 0.037360192735832243 +5 6 5.565058 0.43494176864624023 0.18917434211311956 +6 6 5.374303 0.62569713592529297 0.39149690590511455 +7 6 5.75468349 0.24531650543212891 0.060180187837431731 +8 6 5.428862 0.57113790512084961 0.32619850666583261 +9 6 5.88526535 0.11473464965820313 0.01316403983219061 +10 5 5.56626 0.56625986099243164 0.320650230171168 +11 5 5.603975 0.60397481918334961 0.36478558220755986 +12 5 5.915541 0.91554117202758789 0.83821563767764928 +13 7 6.79125071 0.20874929428100586 0.043576267862817986 +14 5 5.12093067 0.12093067169189453 0.014624227355852781 +15 7 6.61398268 0.3860173225402832 0.14900937330116903 +16 6 5.12558126 0.87441873550415039 0.76460812500067732 +17 8 7.381921 0.61807918548583984 0.38202187953083921 +18 6 5.768282 0.23171806335449219 0.053693260884756455 +19 5 5.330098 0.33009815216064453 0.10896479005987203 +20 8 7.381921 0.61807918548583984 0.38202187953083921 +21 7 6.091793 0.90820693969726563 0.82483984531427268 +22 8 6.882561 1.117438793182373 1.2486694565088783 +23 5 4.760516 0.23948383331298828 0.057352506418283156 +24 6 5.32735825 0.67264175415039063 0.45244692942651454 +25 6 5.824215 0.17578506469726563 0.030900388970621862 +26 6 6.12207937 0.12207937240600586 0.014903373167044265 +27 6 6.27089357 0.27089357376098633 0.07338332830499894 +28 6 5.47679138 0.5232086181640625 0.27374725812114775 +29 7 6.673289 0.32671117782592773 0.10674019371640497 +30 6 5.680629 0.31937122344970703 0.1019979783677627 +31 6 5.676132 0.3238677978515625 0.10489035048522055 +32 6 6.144576 0.14457607269287109 0.020902240795294347 +33 6 6.04860258 0.048602581024169922 0.0023622108822110022 +34 5 5.23357868 0.23357868194580078 0.05455900065953756 +35 5 5.87163448 0.87163448333740234 0.75974667254286032 +36 5 5.122443 0.12244319915771484 0.014992337019975821 +37 6 5.98563528 0.014364719390869141 0.00020634516317841189 +38 5 5.11015034 0.11015033721923828 0.01213309678951191 +39 5 5.11015034 0.11015033721923828 0.01213309678951191 +40 6 5.806291 0.19370889663696289 0.037523136636309573 +41 6 5.562098 0.43790197372436523 0.19175813859169466 +42 6 5.39396858 0.60603141784667969 0.36727407941725687 +43 6 5.786384 0.21361589431762695 0.045631750305119567 +44 6 5.781356 0.21864414215087891 0.047805260896893742 +45 7 6.03766251 0.96233749389648438 0.9260934521589661 +46 4 5.05566454 1.0556645393371582 1.1144276196139344 +47 5 5.05566454 0.055664539337158203 0.003098540939618033 +48 6 5.39396858 0.60603141784667969 0.36727407941725687 +49 5 5.97254 0.97253990173339844 0.94583386046360829 +50 6 5.861218 0.13878202438354492 0.019260450291994857 +51 7 6.28765249 0.71234750747680664 0.50743897140841909 +52 7 6.41036272 0.58963727951049805 0.3476721213885412 +53 6 6.265282 0.26528215408325195 0.070374621275050231 +54 6 5.92683554 0.073164463043212891 0.0053530386524016649 +55 6 6.08680248 0.086802482604980469 0.0075346709863879369 +56 6 6.05274343 0.052743434906005859 0.0027818699256840773 +57 6 5.7438097 0.25619029998779297 0.065633469807835354 +58 6 5.452292 0.54770803451538086 0.29998409107270163 +59 6 6.20660353 0.2066035270690918 0.042685017397388947 +60 6 5.573681 0.42631912231445313 0.18174799405096564 +61 6 5.7438097 0.25619029998779297 0.065633469807835354 +62 5 4.92492676 0.0750732421875 0.0056359916925430298 +63 6 5.452292 0.54770803451538086 0.29998409107270163 +64 6 5.91558838 0.08441162109375 0.0071253217756748199 +65 5 5.12823963 0.12823963165283203 0.016445403126454039 +66 7 6.71586752 0.28413248062133789 0.080731266544034952 +67 5 4.984102 0.015898227691650391 0.00025275364373555931 +68 8 6.74372244 1.2562775611877441 1.5782333107438262 +69 5 5.446637 0.44663715362548828 0.19948474699867802 +70 6 5.39191866 0.60808134078979492 0.36976291701671471 +71 5 5.164618 0.16461801528930664 0.027099090957790395 +72 5 4.74779 0.25221014022827148 0.063609954833964366 +73 6 5.20674467 0.79325532913208008 0.62925401719644469 +74 8 6.74372244 1.2562775611877441 1.5782333107438262 +75 5 5.446637 0.44663715362548828 0.19948474699867802 +76 7 7.25402069 0.25402069091796875 0.064526511414442211 +77 7 6.24755239 0.75244760513305664 0.56617739847047233 +78 5 5.80187654 0.80187654495239258 0.64300599334478648 +79 5 5.11330938 0.11330938339233398 0.012839016364750933 +80 6 6.300786 0.30078601837158203 0.090472228847829683 +81 6 5.94111967 0.058880329132080078 0.0034668931587020779 +82 5 5.41016674 0.41016674041748047 0.16823675494470081 +83 6 5.70397139 0.29602861404418945 0.087632940332923681 +84 5 5.188725 0.18872499465942383 0.035617123609199552 +85 6 5.39039373 0.60960626602172852 0.37161979957295443 +86 6 5.290827 0.70917320251464844 0.50292663116488256 +87 6 5.482315 0.5176849365234375 0.26799769350327551 +88 5 5.188725 0.18872499465942383 0.035617123609199552 +89 6 5.39039373 0.60960626602172852 0.37161979957295443 +90 6 5.290827 0.70917320251464844 0.50292663116488256 +91 5 5.279007 0.2790069580078125 0.077844882616773248 +92 7 6.50266075 0.49733924865722656 0.24734632825493463 +93 7 6.653836 0.34616422653198242 0.11982967173048564 +94 7 6.12829065 0.87170934677124023 0.75987718524834236 +95 6 5.79502344 0.20497655868530273 0.042015389610469356 +96 6 5.26495934 0.73504066467285156 0.54028477872270741 +97 7 5.870676 1.1293239593505859 1.2753726051632839 +98 4 4.314463 0.31446313858032227 0.098887065525786966 +99 6 5.26495934 0.73504066467285156 0.54028477872270741 +100 5 5.7749877 0.77498769760131836 0.60060593143339247 +101 5 5.58767366 0.58767366409301758 0.34536033546851286 +102 5 5.23754454 0.23754453659057617 0.056427406864031582 +103 5 5.09081936 0.090819358825683594 0.0082481559375082725 +104 5 5.7749877 0.77498769760131836 0.60060593143339247 +105 6 6.152058 0.15205812454223633 0.023121673239302254 +106 5 5.58767366 0.58767366409301758 0.34536033546851286 +107 6 5.934953 0.065046787261962891 0.0042310845331030578 +108 6 5.934953 0.065046787261962891 0.0042310845331030578 +109 5 5.43903732 0.43903732299804688 0.19275377098529134 +110 6 5.66466951 0.33533048629760742 0.11244653504058988 +111 5 5.189618 0.18961811065673828 0.035955027889031044 +112 5 5.102654 0.10265398025512695 0.010537839662219994 +113 5 5.34510136 0.34510135650634766 0.11909494626252126 +114 5 5.34510136 0.34510135650634766 0.11909494626252126 +115 4 4.26780653 0.2678065299987793 0.071720337509987075 +116 6 6.12102032 0.12102031707763672 0.01464591714557173 +117 6 6.259355 0.25935506820678711 0.067265051404547194 +118 5 5.102654 0.10265398025512695 0.010537839662219994 +119 5 5.278118 0.27811813354492188 0.077349696206510998 +120 5 5.385162 0.3851618766784668 0.14834967124647847 +121 5 5.60905361 0.60905361175537109 0.37094630199226231 +122 5 5.926923 0.92692279815673828 0.85918587374271738 +123 6 5.714049 0.28595113754272461 0.081768053061978208 +124 6 5.820791 0.17920923233032227 0.032115948952423423 +125 6 6.33170271 0.33170270919799805 0.11002668728929166 +126 5 5.804877 0.80487680435180664 0.64782667018357643 +127 7 5.94108725 1.0589127540588379 1.1212962207084729 +128 7 6.26106644 0.73893356323242188 0.54602281087136362 +129 6 6.170016 0.17001581192016602 0.028905376302873265 +130 5 5.027666 0.027666091918945313 0.00076541264206753112 +131 7 5.94108725 1.0589127540588379 1.1212962207084729 +132 5 5.46517944 0.465179443359375 0.21639191452413797 +133 5 5.532 0.53200006484985352 0.28302406900024835 +134 5 5.287642 0.28764200210571289 0.082737921375382939 +135 5 5.55317259 0.55317258834838867 0.30599991250005587 +136 6 6.024812 0.024812221527099609 0.00061564633710986527 +137 5 5.15711546 0.15711545944213867 0.024685267595714322 +138 7 6.29848 0.70151996612548828 0.49213026287270623 +139 6 6.027224 0.027224063873291016 0.00074114965377702902 +140 5 5.41884947 0.41884946823120117 0.17543487703756 +141 5 5.15711546 0.15711545944213867 0.024685267595714322 +142 6 5.97671032 0.023289680480957031 0.00054240921690507093 +143 6 5.85617161 0.14382839202880859 0.020686606353592651 +144 6 5.79136848 0.20863151550292969 0.043527109261049191 +145 6 5.877765 0.12223482131958008 0.014941351543029668 +146 6 5.749695 0.25030517578125 0.062652681022882462 +147 4 4.63994741 0.63994741439819336 0.40953269319493302 +148 7 6.415667 0.58433294296264648 0.34144498823138747 +149 6 5.506055 0.49394512176513672 0.24398178331557574 +150 7 6.524688 0.47531223297119141 0.22592171881206013 +151 6 5.790869 0.20913076400756836 0.04373567645438925 +152 6 5.506055 0.49394512176513672 0.24398178331557574 +153 5 6.085953 1.0859532356262207 1.179294429967058 +154 6 5.27088 0.72911977767944336 0.53161565020332091 +155 6 6.091402 0.091402053833007813 0.0083543354448920581 +156 6 6.091402 0.091402053833007813 0.0083543354448920581 +157 7 6.425449 0.57455110549926758 0.3301089728304305 +158 8 7.30207253 0.69792747497558594 0.48710276032579714 +159 8 7.30207253 0.69792747497558594 0.48710276032579714 +160 7 6.425449 0.57455110549926758 0.3301089728304305 +161 5 5.54679966 0.54679965972900391 0.29898986787975446 +162 5 5.46407843 0.46407842636108398 0.21536878581378005 +163 6 6.091402 0.091402053833007813 0.0083543354448920581 +164 5 5.61681652 0.61681652069091797 0.38046262019724963 +165 5 5.702333 0.70233297348022461 0.49327160563757388 +166 6 5.74394369 0.25605630874633789 0.065564833248799914 +167 7 6.678452 0.3215479850769043 0.10339310670701707 +168 5 5.23894262 0.23894262313842773 0.057093577152272701 +169 5 4.72458029 0.27541971206665039 0.075856017794876607 +170 6 6.121615 0.12161493301391602 0.01479019193197928 +171 6 6.020179 0.020178794860839844 0.00040718376203585649 +172 4 4.177219 0.17721891403198242 0.031406543490675176 +173 7 6.80681133 0.19318866729736328 0.037321861172131321 +174 5 5.562073 0.5620732307434082 0.3159263167183326 +175 6 6.20894337 0.20894336700439453 0.043657330615133105 +176 4 5.530099 1.5300989151000977 2.3412026899904959 +177 5 5.26488543 0.26488542556762695 0.070164288678142839 +178 4 4.37374353 0.37374353408813477 0.13968422927268875 +179 6 5.627479 0.37252092361450195 0.1387718385306016 +180 6 5.41738129 0.58261871337890625 0.33944456517929211 +181 5 5.03604841 0.036048412322998047 0.0012994880310088774 +182 5 5.22736263 0.22736263275146484 0.051693766771677474 +183 6 5.45467854 0.54532146453857422 0.29737549968649546 +184 5 5.25501537 0.25501537322998047 0.065032840583626239 +185 5 5.296224 0.29622411727905273 0.087748727657753989 +186 6 5.853021 0.14697885513305664 0.02160278385622405 +187 5 5.998221 0.99822092056274414 0.99644500624913235 +188 8 7.056808 0.9431920051574707 0.88961115859297024 +189 4 5.332552 1.3325519561767578 1.7756947159105039 +190 6 5.27124071 0.7287592887878418 0.531090100994561 +191 5 5.22736263 0.22736263275146484 0.051693766771677474 +192 6 6.16341448 0.16341447830200195 0.026704291718715467 +193 5 5.771303 0.77130317687988281 0.59490859066499979 +194 5 5.28241158 0.28241157531738281 0.079756297873245785 +195 6 5.40575838 0.59424161911010742 0.35312310188260199 +196 5 5.21673441 0.21673440933227539 0.046973804188610302 +197 5 5.192751 0.19275093078613281 0.037152921318920562 +198 5 5.33667469 0.33667469024658203 0.11334984705263196 +199 5 5.192751 0.19275093078613281 0.037152921318920562 +200 5 5.13898754 0.13898754119873047 0.019317536608468799 +201 5 5.33667469 0.33667469024658203 0.11334984705263196 +202 5 5.25656748 0.25656747817993164 0.065826870859609699 +203 6 6.87973166 0.87973165512084961 0.77392778502166948 +204 4 5.5412097 1.5412096977233887 2.3753273323566191 +205 5 5.47215 0.47214984893798828 0.22292547985216515 +206 5 5.819323 0.81932306289672852 0.67129028139447655 +207 4 4.38594675 0.38594675064086914 0.14895489433024522 +208 5 4.990595 0.0094051361083984375 8.8456585217500106E-05 +209 6 5.401164 0.59883594512939453 0.35860448917901522 +210 5 5.362051 0.36205101013183594 0.13108093393748277 +211 7 6.553773 0.44622707366943359 0.19911860127558612 +212 5 5.819323 0.81932306289672852 0.67129028139447655 +213 6 5.920044 0.0799560546875 0.0063929706811904907 +214 7 6.7516346 0.24836540222167969 0.061685373020736733 +215 5 5.31538868 0.31538867950439453 0.099470019159525691 +216 5 5.990885 0.99088478088378906 0.98185264898711466 +217 5 5.31538868 0.31538867950439453 0.099470019159525691 +218 5 5.173066 0.17306613922119141 0.029951888544928806 +219 5 6.04188538 1.0418853759765625 1.085525136673823 +220 5 5.990885 0.99088478088378906 0.98185264898711466 +221 6 5.235949 0.76405096054077148 0.58377387030327554 +222 7 6.7516346 0.24836540222167969 0.061685373020736733 +223 6 5.79227161 0.20772838592529297 0.043151082319127454 +224 6 6.029271 0.029271125793457031 0.00085679880521638552 +225 5 5.384162 0.38416194915771484 0.14758040318065468 +226 6 5.95489836 0.045101642608642578 0.0020341581659977237 +227 6 5.499437 0.50056314468383789 0.25056346181577283 +228 6 5.95489836 0.045101642608642578 0.0020341581659977237 +229 5 5.384162 0.38416194915771484 0.14758040318065468 +230 4 4.446024 0.44602394104003906 0.19893735598088824 +231 6 5.74688053 0.25311946868896484 0.064069465429383854 +232 6 5.749846 0.25015401840209961 0.06257703292271799 +233 6 6.15617752 0.15617752075195313 0.024391417988226749 +234 6 6.15617752 0.15617752075195313 0.024391417988226749 +235 6 6.15617752 0.15617752075195313 0.024391417988226749 +236 6 6.15617752 0.15617752075195313 0.024391417988226749 +237 6 5.46915054 0.53084945678710938 0.2818011457711691 +238 7 7.05990648 0.059906482696533203 0.0035887866690700321 +239 6 5.64534473 0.35465526580810547 0.12578035756541794 +240 5 4.95311737 0.04688262939453125 0.0021979809389449656 +241 5 5.690982 0.69098186492919922 0.47745593766103411 +242 7 6.38708448 0.6129155158996582 0.37566542963054417 +243 6 5.92264938 0.077350616455078125 0.0059831178659806028 +244 5 5.301481 0.30148077011108398 0.09089065474677227 +245 6 5.91515 0.084849834442138672 0.007199494404858342 +246 7 6.88372326 0.11627674102783203 0.013520280504053517 +247 7 6.059374 0.94062614440917969 0.88477754354607896 +248 7 6.03445435 0.965545654296875 0.93227841053158045 +249 5 5.359669 0.35966920852661133 0.12936193956215902 +250 4 5.167353 1.1673531532287598 1.3627133843531283 +251 3 4.49473763 1.4947376251220703 2.2342405679555668 +252 5 5.301481 0.30148077011108398 0.09089065474677227 +253 3 4.322997 1.3229970932006836 1.7503213086174583 +254 6 5.589023 0.41097688674926758 0.16890200144212031 +255 8 6.295933 1.7040672302246094 2.9038451251253719 +256 7 5.87387753 1.1261224746704102 1.2681518279578086 +257 7 5.87387753 1.1261224746704102 1.2681518279578086 +258 6 6.36277533 0.36277532577514648 0.13160593699126366 +259 4 3.98837662 0.011623382568359375 0.00013510302233044058 +260 6 6.302642 0.30264186859130859 0.091592100624438899 +261 5 5.3442893 0.34428930282592773 0.11853512404036337 +262 5 5.49438143 0.49438142776489258 0.2444129961188537 +263 6 5.616195 0.3838047981262207 0.14730612306470903 +264 6 5.7502203 0.24977970123291016 0.062389899148001859 +265 5 5.3442893 0.34428930282592773 0.11853512404036337 +266 6 5.16183329 0.83816671371459961 0.70252343997913158 +267 5 5.348096 0.34809589385986328 0.1211707513220972 +268 6 5.348096 0.65190410614013672 0.42497896360237064 +269 6 5.369744 0.63025617599487305 0.39722284737968039 +270 6 5.16183329 0.83816671371459961 0.70252343997913158 +271 5 5.102849 0.10284900665283203 0.010577918169474287 +272 5 5.39269733 0.39269733428955078 0.1542111963581192 +273 5 5.05073929 0.050739288330078125 0.0025744753802428022 +274 5 5.482709 0.48270893096923828 0.23300791203746485 +275 6 5.93928432 0.060715675354003906 0.0036863932336927974 +276 6 5.98012447 0.019875526428222656 0.00039503655079897726 +277 5 5.00867653 0.0086765289306640625 7.528215428465046E-05 +278 4 4.974161 0.97416114807128906 0.94898994241157197 +279 7 6.429354 0.57064580917358398 0.32563663952737443 +280 8 6.91723728 1.0827627182006836 1.172375103925333 +281 8 6.97333765 1.0266623497009277 1.05403558029343 +282 4 5.16001034 1.1600103378295898 1.3456239838715192 +283 5 5.15820456 0.15820455551147461 0.025028681384583251 +284 5 5.1790514 0.17905139923095703 0.03205940356656356 +285 5 5.094003 0.094003200531005859 0.0088366017100725003 +286 6 5.35268736 0.64731264114379883 0.41901365538456048 +287 7 6.3021884 0.69781160354614258 0.48694103404363887 +288 7 6.3021884 0.69781160354614258 0.48694103404363887 +289 7 6.3021884 0.69781160354614258 0.48694103404363887 +290 7 6.3021884 0.69781160354614258 0.48694103404363887 +291 6 5.820911 0.17908906936645508 0.032072894766542959 +292 5 5.341021 0.34102106094360352 0.11629536400710094 +293 7 5.87495327 1.1250467300415039 1.2657301447770806 +294 3 3.93183255 0.93183255195617676 0.86831190488516086 +295 6 5.65310144 0.34689855575561523 0.12033860798533169 +296 5 5.18066072 0.18066072463989258 0.032638297427411089 +297 7 6.394417 0.60558319091796875 0.36673100112238899 +298 6 5.9266243 0.073375701904296875 0.005383993629948236 +299 6 5.99227858 0.0077214241027832031 5.9620390175041393E-05 +300 6 5.87351751 0.12648248672485352 0.015997819448102746 +301 6 5.71431828 0.28568172454833984 0.08161404774091352 +302 6 5.87351751 0.12648248672485352 0.015997819448102746 +303 6 5.87837744 0.12162256240844727 0.01479204768679665 +304 6 5.394941 0.60505914688110352 0.3660965712244888 +305 6 5.394941 0.60505914688110352 0.3660965712244888 +306 5 5.220892 0.22089195251464844 0.0487932546857337 +307 6 5.33827353 0.66172647476196289 0.43788192740089471 +308 7 6.0804224 0.91957759857177734 0.84562295979503688 +309 6 5.93416357 0.065836429595947266 0.004334435461942121 +310 7 6.722236 0.27776384353637695 0.077152752776100897 +311 8 7.22786236 0.77213764190673828 0.5961965380492984 +312 6 6.118533 0.11853313446044922 0.014050103965018934 +313 6 5.402841 0.59715890884399414 0.3565987624117497 +314 5 5.365508 0.36550807952880859 0.13359615620083787 +315 6 5.698318 0.3016819953918457 0.091012026343605612 +316 6 6.04022455 0.040224552154541016 0.0016180145960333903 +317 5 6.033596 1.0335960388183594 1.0683207714610035 +318 7 6.607716 0.39228391647338867 0.15388667112370058 +319 6 6.24146557 0.24146556854248047 0.058305620791543333 +320 7 6.51413059 0.48586940765380859 0.23606908129386284 +321 5 6.033596 1.0335960388183594 1.0683207714610035 +322 6 6.04022455 0.040224552154541016 0.0016180145960333903 +323 6 5.963121 0.036879062652587891 0.001360065262133503 +324 5 5.16921139 0.16921138763427734 0.028632493705117668 +325 5 4.408439 0.59156084060668945 0.34994422813929305 +326 6 5.74754953 0.25245046615600586 0.06373123786238466 +327 6 5.44730234 0.55269765853881836 0.30547470175429225 +328 6 5.488627 0.51137304306030273 0.26150238916875423 +329 5 5.86261129 0.86261129379272461 0.74409824417875825 +330 8 7.090369 0.90963077545166016 0.82742814764878858 +331 5 6.05666828 1.0566682815551758 1.1165478572447682 +332 6 6.319801 0.31980085372924805 0.1022725860459559 +333 5 5.58119726 0.58119726181030273 0.33779025713579358 +334 5 5.65321 0.65321016311645508 0.42668351719862585 +335 6 6.319801 0.31980085372924805 0.1022725860459559 +336 6 6.11735344 0.11735343933105469 0.013771829722827533 +337 6 5.38936663 0.61063337326049805 0.37287311653949473 +338 5 5.330161 0.33016109466552734 0.10900634843073931 +339 7 6.78890038 0.21109962463378906 0.044563051520526642 +340 7 5.92403841 1.0759615898132324 1.1576933427534186 +341 6 5.41036749 0.58963251113891602 0.34766649819198392 +342 6 5.59871244 0.40128755569458008 0.16103170235533071 +343 5 5.429605 0.42960500717163086 0.184560462186937 +344 6 5.709671 0.2903289794921875 0.08429091633297503 +345 6 5.948705 0.051294803619384766 0.0026311568783512485 +346 7 6.09437847 0.90562152862548828 0.82015035310996609 +347 6 6.19719934 0.19719934463500977 0.038887581524477355 +348 6 6.097723 0.097723007202148438 0.0095497861366311554 +349 5 5.76003933 0.76003932952880859 0.5776597824306009 +350 7 6.79789734 0.2021026611328125 0.04084548563696444 +351 7 6.578576 0.42142391204833984 0.17759811364612688 +352 6 5.371543 0.62845706939697266 0.39495828807503131 +353 7 6.578576 0.42142391204833984 0.17759811364612688 +354 6 5.670751 0.32924890518188477 0.10840484156346974 +355 6 6.183845 0.18384504318237305 0.03379899990272861 +356 6 6.183845 0.18384504318237305 0.03379899990272861 +357 6 5.336155 0.66384506225585938 0.44069026668148581 +358 6 5.296089 0.70391082763671875 0.49549045326421037 +359 6 6.08911371 0.089113712310791016 0.0079412537218104262 +360 6 5.67155838 0.32844161987304688 0.10787389766483102 +361 5 4.84053326 0.15946674346923828 0.02542964227268385 +362 6 5.97343636 0.026563644409179688 0.00070562720429734327 +363 6 6.183845 0.18384504318237305 0.03379899990272861 +364 7 6.583856 0.41614389419555664 0.17317574067624264 +365 7 7.08582544 0.085825443267822266 0.0073660067121181783 +366 6 5.89871 0.10129022598266602 0.01025970987961955 +367 6 5.30400562 0.69599437713623047 0.48440817300524941 +368 6 5.83022356 0.16977643966674805 0.02882403946591694 +369 5 5.58880329 0.58880329132080078 0.34668931587020779 +370 6 5.30400562 0.69599437713623047 0.48440817300524941 +371 6 5.83022356 0.16977643966674805 0.02882403946591694 +372 5 4.772894 0.22710609436035156 0.051577178095612908 +373 6 5.60631132 0.39368867874145508 0.15499077576919262 +374 7 6.83962536 0.16037464141845703 0.025720025610098673 +375 7 6.83962536 0.16037464141845703 0.025720025610098673 +376 7 5.858397 1.1416029930114746 1.3032573936527569 +377 7 5.830574 1.1694259643554688 1.3675570861087181 +378 6 5.26461172 0.73538827896118164 0.54079592083348871 +379 7 5.858397 1.1416029930114746 1.3032573936527569 +380 7 5.830574 1.1694259643554688 1.3675570861087181 +381 6 5.43521452 0.56478548049926758 0.31898263898278856 +382 6 5.43323469 0.56676530838012695 0.3212229147832204 +383 6 5.60631132 0.39368867874145508 0.15499077576919262 +384 7 6.733138 0.26686191558837891 0.071215281991499069 +385 7 6.83962536 0.16037464141845703 0.025720025610098673 +386 7 6.863374 0.13662576675415039 0.018666600141159506 +387 5 5.254784 0.25478410720825195 0.064914941285906025 +388 6 5.87611 0.12388992309570313 0.015348713044659235 +389 7 5.93216467 1.0678353309631348 1.1402722940531476 +390 7 5.93216467 1.0678353309631348 1.1402722940531476 +391 5 5.07553434 0.075534343719482422 0.0057054370811329136 +392 6 5.30473661 0.69526338577270508 0.48339117559612532 +393 6 6.15231037 0.15231037139892578 0.023198449235678709 +394 5 5.16831541 0.16831541061401367 0.028330077450164026 +395 5 5.233454 0.23345422744750977 0.054500876313113622 +396 5 5.96566343 0.96566343307495117 0.9325058659781007 +397 6 6.100245 0.10024499893188477 0.010049059810853578 +398 5 5.2522397 0.25223970413208008 0.063624868340639296 +399 6 6.407573 0.40757322311401367 0.16611593219954557 +400 6 6.100245 0.10024499893188477 0.010049059810853578 +401 5 5.16831541 0.16831541061401367 0.028330077450164026 +402 5 5.118631 0.11863088607788086 0.014073287131623147 +403 5 5.3481245 0.34812450408935547 0.12119067034745967 +404 6 6.675493 0.67549276351928711 0.45629047356692354 +405 5 5.233454 0.23345422744750977 0.054500876313113622 +406 7 7.081275 0.081274986267089844 0.0066056233927156427 +407 5 4.94992352 0.050076484680175781 0.0025076543179238797 +408 6 5.90589857 0.094101428985595703 0.0088550789371311112 +409 5 5.96566343 0.96566343307495117 0.9325058659781007 +410 6 5.7482605 0.251739501953125 0.063372776843607426 +411 6 5.9920783 0.0079216957092285156 6.2753262909609475E-05 +412 5 5.56511974 0.56511974334716797 0.319360324320769 +413 5 5.56511974 0.56511974334716797 0.319360324320769 +414 6 5.7482605 0.251739501953125 0.063372776843607426 +415 6 5.9920783 0.0079216957092285156 6.2753262909609475E-05 +416 6 5.86958933 0.13041067123413086 0.017006943171736566 +417 5 5.11206532 0.11206531524658203 0.012558634881315811 +418 6 5.86958933 0.13041067123413086 0.017006943171736566 +419 6 5.831169 0.16883087158203125 0.028503863199148327 +420 7 6.689255 0.3107447624206543 0.096562307371868883 +421 6 5.87943363 0.12056636810302734 0.014536249117554689 +422 6 5.87943363 0.12056636810302734 0.014536249117554689 +423 6 5.87943363 0.12056636810302734 0.014536249117554689 +424 7 5.95081234 1.0491876602172852 1.1007947463522214 +425 6 5.87943363 0.12056636810302734 0.014536249117554689 +426 6 5.87943363 0.12056636810302734 0.014536249117554689 +427 5 5.24868631 0.24868631362915039 0.061844882586456151 +428 5 5.4483943 0.4483942985534668 0.20105744697525552 +429 5 5.16103458 0.16103458404541016 0.025932137258678267 +430 5 5.24868631 0.24868631362915039 0.061844882586456151 +431 5 5.10770464 0.10770463943481445 0.011600289355783389 +432 7 6.57548237 0.42451763153076172 0.18021521948048758 +433 4 4.708309 0.70830917358398438 0.50170188538322691 +434 8 6.96170425 1.0382957458496094 1.0780580558493966 +435 7 6.91244125 0.087558746337890625 0.0076665340602630749 +436 5 5.4172473 0.41724729537963867 0.17409530550162344 +437 8 7.2327404 0.76725959777832031 0.58868729038294987 +438 7 6.57548237 0.42451763153076172 0.18021521948048758 +439 5 5.09460831 0.094608306884765625 0.0089507317316019908 +440 7 6.333899 0.66610097885131836 0.44369051402668447 +441 6 6.071405 0.071404933929443359 0.0050986645894681715 +442 8 7.38202429 0.61797571182250977 0.38189398040253764 +443 6 5.58170938 0.41829061508178711 0.17496703866549979 +444 6 5.96860075 0.031399250030517578 0.00098591290247895813 +445 3 5.549208 2.5492081642150879 6.4984622645008585 +446 5 6.19848967 1.1984896659851074 1.4363774794730944 +447 6 5.756496 0.24350404739379883 0.059294221097161426 +448 6 5.756496 0.24350404739379883 0.059294221097161426 +449 7 6.6492877 0.35071229934692383 0.12299911691320631 +450 5 5.02871132 0.028711318969726563 0.00082433983698138036 +451 5 5.507411 0.50741100311279297 0.2574659260799308 +452 7 6.136642 0.8633580207824707 0.74538707204942511 +453 7 6.4758153 0.5241847038269043 0.27476960372609938 +454 7 6.6492877 0.35071229934692383 0.12299911691320631 +455 6 5.756496 0.24350404739379883 0.059294221097161426 +456 7 6.834708 0.16529178619384766 0.027321374583152647 +457 5 5.640308 0.64030790328979492 0.40999421101537337 +458 6 5.32179976 0.67820024490356445 0.4599555721872548 +459 5 4.82953072 0.17046928405761719 0.029059776807116577 +460 5 5.640308 0.64030790328979492 0.40999421101537337 +461 5 5.43269873 0.43269872665405273 0.18722818804803865 +462 5 5.321591 0.32159090042114258 0.10342070723368124 +463 6 5.20089865 0.79910135269165039 0.63856297187362543 +464 5 4.98644924 0.013550758361816406 0.00018362305218033725 +465 5 5.4275465 0.42754650115966797 0.18279601065387396 +466 6 6.059653 0.059652805328369141 0.0035584571835443057 +467 6 5.20089865 0.79910135269165039 0.63856297187362543 +468 5 4.98644924 0.013550758361816406 0.00018362305218033725 +469 5 5.323033 0.32303285598754883 0.10435022604747246 +470 6 5.18785763 0.81214237213134766 0.65957523261113238 +471 5 5.20747042 0.20747041702270508 0.043043973939575153 +472 6 6.2822175 0.28221750259399414 0.079646718770391089 +473 7 6.1696806 0.83031940460205078 0.68943031365870411 +474 6 5.81795454 0.18204545974731445 0.033140549414611087 +475 5 5.7082715 0.70827150344848633 0.50164852259717918 +476 7 6.5067544 0.49324560165405273 0.24329122355106847 +477 6 6.148587 0.14858722686767578 0.022078163988226152 +478 6 5.16096258 0.83903741836547852 0.70398378941740702 +479 6 6.0799365 0.079936504364013672 0.0063898447299379768 +480 5 5.271217 0.27121686935424805 0.073558590222319253 +481 6 6.171603 0.17160320281982422 0.029447659218021727 +482 5 5.573488 0.57348823547363281 0.32888875622666092 +483 5 5.271217 0.27121686935424805 0.073558590222319253 +484 5 5.36182356 0.36182355880737305 0.13091628770803254 +485 6 6.199785 0.19978523254394531 0.039914139142638305 +486 6 5.96590042 0.034099578857421875 0.0011627812782535329 +487 6 5.9241333 0.07586669921875 0.0057557560503482819 +488 6 6.31041574 0.31041574478149414 0.096357934608249707 +489 6 5.47512054 0.52487945556640625 0.27549844287568703 +490 6 6.19690561 0.19690561294555664 0.038771820409465363 +491 7 6.62910938 0.37089061737060547 0.13755985005354887 +492 6 5.87253046 0.12746953964233398 0.016248483536628555 +493 6 6.263361 0.26336097717285156 0.069359004297439242 +494 6 6.2679 0.26789999008178711 0.071770404685821632 +495 6 6.6444664 0.64446640014648438 0.41533694091776852 +496 4 4.775965 0.77596521377563477 0.60212201298986656 +497 6 6.66031027 0.66031026840209961 0.43600965055725283 +498 5 5.107339 0.10733890533447266 0.011521640598402882 +499 4 4.775965 0.77596521377563477 0.60212201298986656 +500 6 5.39384 0.60616016387939453 0.36743014427429443 +501 6 6.040598 0.040597915649414063 0.0016481907550769392 +502 6 5.154273 0.84572696685791016 0.71525410247068066 +503 5 5.159687 0.15968704223632813 0.025499951458186843 +504 6 6.167881 0.16788101196289063 0.028184034177684225 +505 6 6.167881 0.16788101196289063 0.028184034177684225 +506 5 5.08835363 0.088353633880615234 0.0078063646199098002 +507 7 6.095513 0.90448713302612305 0.81809697380981561 +508 6 6.2309227 0.23092269897460938 0.053325292901718058 +509 7 6.095513 0.90448713302612305 0.81809697380981561 +510 6 5.272565 0.72743511199951172 0.52916184216974216 +511 6 5.5821805 0.41781949996948242 0.17457313455474832 +512 6 6.258699 0.25869894027709961 0.066925141700494351 +513 6 5.81159925 0.1884007453918457 0.03549484086420307 +514 7 6.098065 0.90193510055541992 0.81348692561391545 +515 6 5.45307732 0.54692268371582031 0.29912442196291522 +516 5 5.978399 0.97839879989624023 0.95726421163840314 +517 6 6.02913475 0.029134750366210938 0.00084883367890142836 +518 6 6.19396639 0.19396638870239258 0.037622959946247647 +519 5 5.23702669 0.23702669143676758 0.056181652453460629 +520 5 5.448774 0.44877386093139648 0.20139797825527239 +521 5 5.448774 0.44877386093139648 0.20139797825527239 +522 6 6.07142735 0.071427345275878906 0.0051018656531596207 +523 6 6.2844224 0.28442239761352539 0.080896100264226334 +524 5 4.514703 0.48529720306396484 0.23551337530170713 +525 6 5.40235 0.59765005111694336 0.35718558360008501 +526 4 4.72034931 0.72034931182861328 0.51890313105195673 +527 6 6.59680128 0.5968012809753418 0.35617176897380887 +528 6 6.51870775 0.5187077522277832 0.26905773222119933 +529 6 6.36267757 0.36267757415771484 0.13153502279692475 +530 6 6.037053 0.037053108215332031 0.0013729328284171061 +531 5 5.97751045 0.97751045227050781 0.95552668429809273 +532 6 5.8616004 0.13839960098266602 0.019154449552161168 +533 6 5.8616004 0.13839960098266602 0.019154449552161168 +534 6 5.8616004 0.13839960098266602 0.019154449552161168 +535 5 5.19603348 0.19603347778320313 0.038429124411777593 +536 5 5.19603348 0.19603347778320313 0.038429124411777593 +537 6 5.8616004 0.13839960098266602 0.019154449552161168 +538 5 5.589188 0.5891880989074707 0.34714261589419948 +539 6 5.37892151 0.6210784912109375 0.38573849224485457 +540 4 5.45178461 1.451784610748291 2.1076785560055669 +541 5 4.952542 0.047458171844482422 0.0022522780748204241 +542 6 5.618697 0.38130283355712891 0.14539185087869555 +543 6 5.904283 0.095716953277587891 0.0091617351447439432 +544 6 5.34441471 0.65558528900146484 0.42979207115513418 +545 6 6.13511848 0.13511848449707031 0.01825700485278503 +546 6 5.9491806 0.05081939697265625 0.0025826111086644232 +547 6 5.68298626 0.31701374053955078 0.10049771169087762 +548 7 6.17158461 0.8284153938293457 0.68627206473342994 +549 5 4.952542 0.047458171844482422 0.0022522780748204241 +550 7 5.66757774 1.3324222564697266 1.7753490695358778 +551 7 5.746953 1.253046989440918 1.570126757746948 +552 7 6.27114058 0.72885942459106445 0.53123606081521757 +553 7 5.66757774 1.3324222564697266 1.7753490695358778 +554 7 6.27114058 0.72885942459106445 0.53123606081521757 +555 7 5.746953 1.253046989440918 1.570126757746948 +556 5 5.00603962 0.0060396194458007813 3.6477003050094936E-05 +557 6 5.82325029 0.17674970626831055 0.031240458665934057 +558 5 5.31163931 0.31163930892944336 0.097119058870021036 +559 6 6.750174 0.75017404556274414 0.56276109863597412 +560 7 6.050167 0.94983291625976563 0.90218256881053094 +561 5 5.197575 0.19757509231567383 0.039035917103547035 +562 6 5.17906332 0.82093667984008789 0.67393703230686697 +563 7 5.404128 1.5958719253540039 2.5468072021330954 +564 5 5.222314 0.22231388092041016 0.049423461649894307 +565 6 5.77024126 0.22975873947143555 0.052789078363502995 +566 6 5.583592 0.41640806198120117 0.17339567408293988 +567 5 5.776841 0.77684116363525391 0.60348219351817534 +568 6 5.72432041 0.27567958831787109 0.075999235415110888 +569 6 5.43442726 0.56557273864746094 0.31987252270118915 +570 5 5.004094 0.0040941238403320313 1.67618500199751E-05 +571 7 6.748615 0.25138521194458008 0.063194524784421446 +572 5 5.23731852 0.23731851577758789 0.056320077930877233 +573 7 6.81844759 0.18155241012573242 0.032961277622462148 +574 7 6.23604345 0.76395654678344727 0.58362960537328945 +575 6 5.939097 0.060903072357177734 0.0037091842225436267 +576 6 5.931183 0.068817138671875 0.0047357985749840736 +577 7 6.689255 0.3107447624206543 0.096562307371868883 +578 7 6.748615 0.25138521194458008 0.063194524784421446 +579 7 6.88390064 0.11609935760498047 0.013479060836289136 +580 5 5.004094 0.0040941238403320313 1.67618500199751E-05 +581 5 5.65414333 0.65414333343505859 0.42790350067753025 +582 6 5.61086226 0.38913774490356445 0.1514281845086316 +583 6 5.693468 0.30653190612792969 0.093961809474421898 +584 7 6.39591646 0.60408353805541992 0.36491692094955397 +585 6 5.693468 0.30653190612792969 0.093961809474421898 +586 6 5.60034037 0.39965963363647461 0.15972782275844111 +587 7 6.347285 0.65271520614624023 0.42603714033452889 +588 7 6.963931 0.036068916320800781 0.001300966724556929 +589 6 5.88822651 0.11177349090576172 0.012493313269260398 +590 5 4.95751238 0.042487621307373047 0.0018051979643587401 +591 6 6.25201368 0.2520136833190918 0.063510896580055487 +592 5 5.41490841 0.41490840911865234 0.17214898795737099 +593 5 5.11563158 0.1156315803527832 0.013370662374882158 +594 5 4.971714 0.028285980224609375 0.00080009667726699263 +595 7 5.776347 1.2236528396606445 1.497326272009559 +596 5 5.41490841 0.41490840911865234 0.17214898795737099 +597 6 6.041546 0.041545867919921875 0.0017260591412195936 +598 8 6.3806777 1.6193222999572754 2.6222047111389202 +599 7 6.228356 0.77164411544799805 0.59543464090552334 +600 6 5.45590353 0.54409646987915039 0.29604096853495321 +601 6 5.675238 0.32476186752319336 0.10547027059715219 +602 5 5.11563158 0.1156315803527832 0.013370662374882158 +603 5 4.971714 0.028285980224609375 0.00080009667726699263 +604 6 5.638143 0.36185693740844727 0.13094044315062092 +605 6 5.638143 0.36185693740844727 0.13094044315062092 +606 5 5.494974 0.49497413635253906 0.24499939565794193 +607 5 5.494974 0.49497413635253906 0.24499939565794193 +608 5 5.25137138 0.25137138366699219 0.063187572526658187 +609 6 5.36752748 0.63247251510620117 0.40002148236476387 +610 8 7.06434345 0.93565654754638672 0.87545317496642383 +611 6 5.55398846 0.44601154327392578 0.19892629673358897 +612 5 5.240067 0.2400670051574707 0.057632166965277065 +613 5 5.35241652 0.3524165153503418 0.1241974002916777 +614 5 5.35241652 0.3524165153503418 0.1241974002916777 +615 5 5.240067 0.2400670051574707 0.057632166965277065 +616 7 6.07053661 0.92946338653564453 0.86390218691030896 +617 6 5.68455839 0.31544160842895508 0.099503408328246223 +618 6 5.708391 0.29160881042480469 0.085035698317369679 +619 6 6.07619429 0.076194286346435547 0.0058055692718426144 +620 5 5.26621342 0.26621341705322266 0.070869583419153059 +621 5 5.37356234 0.37356233596801758 0.13954881885388204 +622 6 5.79691 0.20309019088745117 0.041245625634701355 +623 5 4.9132266 0.086773395538330078 0.0075296221732514823 +624 5 5.115207 0.11520719528198242 0.013272697844740833 +625 8 6.59713936 1.4028606414794922 1.9680179794122523 +626 4 4.457788 0.45778799057006836 0.209569844310181 +627 6 5.31530046 0.68469953536987305 0.46881345373572003 +628 6 5.31530046 0.68469953536987305 0.46881345373572003 +629 6 5.594381 0.40561914443969727 0.16452689033599199 +630 5 5.24268532 0.24268531799316406 0.058896163569443161 +631 5 5.24268532 0.24268531799316406 0.058896163569443161 +632 6 5.875219 0.12478113174438477 0.015570330839409507 +633 5 5.23071766 0.23071765899658203 0.05323063817286311 +634 6 6.51998425 0.51998424530029297 0.27038361536051525 +635 6 6.08986759 0.089867591857910156 0.0080761840663399198 +636 7 6.29875374 0.70124626159667969 0.49174631940331892 +637 5 5.257495 0.25749492645263672 0.066303637148848793 +638 5 5.275801 0.27580118179321289 0.076066291878532866 +639 5 5.323193 0.32319307327270508 0.10445376261145611 +640 7 6.396723 0.60327720642089844 0.3639433877870033 +641 4 5.229983 1.229982852935791 1.5128578185160677 +642 6 5.86662674 0.13337326049804688 0.017788426615879871 +643 5 5.45093775 0.45093774795532227 0.20334485253101775 +644 5 5.45093775 0.45093774795532227 0.20334485253101775 +645 5 5.24437666 0.24437665939331055 0.059719951656234116 +646 4 4.74324846 0.74324846267700195 0.55241827727172677 +647 6 6.00779343 0.007793426513671875 6.0737496824003756E-05 +648 5 5.18965864 0.18965864181518555 0.035970400415180848 +649 7 6.326384 0.67361593246459961 0.45375842447015202 +650 7 6.326384 0.67361593246459961 0.45375842447015202 +651 7 6.326384 0.67361593246459961 0.45375842447015202 +652 7 6.326384 0.67361593246459961 0.45375842447015202 +653 6 5.4366684 0.56333160400390625 0.31734249606961384 +654 7 6.830691 0.16930913925170898 0.028665584634154584 +655 6 6.590023 0.59002304077148438 0.34812718864122871 +656 6 6.23281145 0.23281145095825195 0.054201171697286554 +657 5 5.062823 0.062822818756103516 0.0039467065564622317 +658 5 5.59347248 0.59347248077392578 0.35220958543595771 +659 4 4.17119837 0.17119836807250977 0.029308881230690531 +660 5 5.04121876 0.041218757629394531 0.0016989859805107699 +661 7 6.913087 0.086913108825683594 0.0075538884857451194 +662 4 4.35116768 0.35116767883300781 0.12331873865696252 +663 5 5.04121876 0.041218757629394531 0.0016989859805107699 +664 6 5.86935139 0.13064861297607422 0.017069060072572029 +665 5 5.10480833 0.10480833053588867 0.010984786149720094 +666 6 6.54895258 0.54895257949829102 0.30134893453782752 +667 6 5.86935139 0.13064861297607422 0.017069060072572029 +668 6 5.53544044 0.46455955505371094 0.21581558019170188 +669 5 5.39997 0.39997005462646484 0.15997604459789727 +670 6 5.265179 0.73482084274291992 0.53996167092941505 +671 6 6.171881 0.17188119888305664 0.029543146529476871 +672 8 7.181752 0.81824779510498047 0.6695294541941621 +673 6 6.02429342 0.024293422698974609 0.00059017038643105479 +674 5 5.3664 0.36639976501464844 0.13424878780278959 +675 6 5.31930161 0.68069839477539063 0.46335030464979354 +676 6 5.35488653 0.64511346817016602 0.4161713868145398 +677 7 6.96780729 0.032192707061767578 0.0010363703879647801 +678 7 6.96780729 0.032192707061767578 0.0010363703879647801 +679 7 6.96780729 0.032192707061767578 0.0010363703879647801 +680 5 5.2060957 0.20609569549560547 0.042475435701817332 +681 5 4.946529 0.053471088409423828 0.0028591572956884193 +682 6 5.399353 0.60064697265625 0.36077678576111794 +683 5 5.263034 0.26303386688232422 0.069186815127068257 +684 5 5.50861454 0.50861454010009766 0.25868875040123385 +685 5 5.07341576 0.073415756225585938 0.0053898732621746603 +686 7 6.00908756 0.99091243743896484 0.98190745867123042 +687 4 4.52703762 0.52703762054443359 0.27776865346913837 +688 6 5.58062744 0.41937255859375 0.17587334290146828 +689 7 6.52020073 0.47979927062988281 0.23020734009696753 +690 4 5.823676 1.8236761093139648 3.3257945516825203 +691 6 5.42463827 0.57536172866821289 0.33104111881607423 +692 5 5.35376024 0.3537602424621582 0.12514630914688496 +693 5 5.23882055 0.23882055282592773 0.05703525645208174 +694 6 5.30280161 0.69719839096069336 0.48608559635817983 +695 5 5.145367 0.14536714553833008 0.021131607001962038 +696 6 6.2366724 0.23667240142822266 0.05601382559780177 +697 5 5.362401 0.36240100860595703 0.13133449103861494 +698 5 5.362401 0.36240100860595703 0.13133449103861494 +699 5 5.58441544 0.58441543579101563 0.34154140159080271 +700 5 5.12781763 0.12781763076782227 0.016337346735099345 +701 7 6.85601139 0.14398860931396484 0.020732719612169603 +702 4 5.173525 1.1735248565673828 1.3771605889814964 +703 6 5.646388 0.35361194610595703 0.12504140842884226 +704 6 6.358103 0.35810279846191406 0.12823761426625424 +705 5 5.29434967 0.29434967041015625 0.086641728470567614 +706 5 5.38131 0.38130998611450195 0.14539730551064167 +707 6 6.40786076 0.40786075592041016 0.16635039621996839 +708 6 6.00541 0.0054101943969726563 2.9270203413034324E-05 +709 5 4.96764946 0.032350540161132813 0.001046557448717067 +710 5 5.475811 0.47581100463867188 0.22639611213526223 +711 6 6.164548 0.16454792022705078 0.027076018051047868 +712 6 6.164548 0.16454792022705078 0.027076018051047868 +713 5 5.60174274 0.60174274444580078 0.36209433049316431 +714 6 6.04477644 0.044776439666748047 0.0020049295492299279 +715 7 6.664191 0.33580923080444336 0.11276783949347191 +716 6 5.479746 0.52025413513183594 0.27066436512177461 +717 5 5.49299 0.49299001693725586 0.24303915679979582 +718 7 6.664191 0.33580923080444336 0.11276783949347191 +719 7 6.562948 0.43705177307128906 0.19101425234475755 +720 5 5.10616255 0.10616254806518555 0.011270486611692832 +721 5 5.317372 0.31737184524536133 0.10072488815444558 +722 6 6.002906 0.0029058456420898438 8.4439388956525363E-06 +723 8 6.75251627 1.2474837303161621 1.5562156574035271 +724 7 5.946286 1.0537137985229492 1.1103127691976624 +725 5 5.30462027 0.30462026596069336 0.092793506433963557 +726 7 6.85490274 0.14509725570678711 0.021053213613640764 +727 5 5.35527563 0.35527563095092773 0.1262207739475798 +728 5 6.074019 1.0740189552307129 1.1535167161948721 +729 5 4.81860971 0.18139028549194336 0.032902435670848718 +730 6 6.13959646 0.13959646224975586 0.019487172272647513 +731 6 5.731812 0.2681879997253418 0.071924803196679932 +732 7 5.99923 1.000770092010498 1.0015407770627007 +733 6 5.84573126 0.15426874160766602 0.023798844637212824 +734 5 5.34902859 0.34902858734130859 0.12182095478146948 +735 6 5.605581 0.39441919326782227 0.15556650001803973 +736 6 5.84573126 0.15426874160766602 0.023798844637212824 +737 5 5.34902859 0.34902858734130859 0.12182095478146948 +738 7 6.128486 0.87151384353637695 0.75953637947554853 +739 6 5.605581 0.39441919326782227 0.15556650001803973 +740 3 4.629902 1.6299018859863281 2.6565801579417894 +741 6 6.385394 0.38539409637451172 0.14852860952032643 +742 6 6.08729458 0.087294578552246094 0.0076203434446142637 +743 5 5.519646 0.51964616775512695 0.27003213966258954 +744 5 5.47758532 0.4775853157043457 0.22808773377641955 +745 6 6.33001661 0.3300166130065918 0.10891096486034257 +746 6 5.7296977 0.27030229568481445 0.073063331052480862 +747 6 6.12972736 0.12972736358642578 0.01682918886308471 +748 6 5.93445158 0.065548419952392578 0.0042965953582552174 +749 6 6.08697748 0.086977481842041016 0.0075650823475825746 +750 6 6.12972736 0.12972736358642578 0.01682918886308471 +751 6 6.10662651 0.10662651062011719 0.011369212767021963 +752 6 5.984835 0.015164852142333984 0.00022997274049885164 +753 6 5.7296977 0.27030229568481445 0.073063331052480862 +754 5 5.149871 0.14987087249755859 0.022461278423179465 +755 7 6.61580563 0.38419437408447266 0.14760531707815971 +756 5 5.41311169 0.41311168670654297 0.17066126569352491 +757 6 5.977644 0.022356033325195313 0.00049979222603724338 +758 7 6.57947254 0.42052745819091797 0.17684334309251426 +759 7 6.623723 0.37627696990966797 0.14158435808440117 +760 6 5.93445158 0.065548419952392578 0.0042965953582552174 +761 6 5.89669228 0.10330772399902344 0.010672485837858403 +762 5 5.196006 0.19600582122802734 0.038418281955273414 +763 6 5.80283 0.19716978073120117 0.038875922433589949 +764 6 5.57660151 0.42339849472045898 0.17926628533155053 +765 6 6.0163517 0.016351699829101563 0.00026737808730104007 +766 5 4.96117973 0.038820266723632813 0.0015070131084939931 +767 6 5.613486 0.38651418685913086 0.14939321664337513 +768 7 6.477986 0.52201414108276367 0.2724987634903755 +769 7 6.477986 0.52201414108276367 0.2724987634903755 +770 7 6.369348 0.63065195083618164 0.39772188309348167 +771 7 6.260023 0.73997688293457031 0.54756578727756278 +772 7 6.090812 0.90918779373168945 0.82662244427069709 +773 5 5.334377 0.33437681198120117 0.11180785239071156 +774 9 6.33221531 2.6677846908569336 7.1170751567706247 +775 6 6.322846 0.3228459358215332 0.10422949827648154 +776 6 6.14606333 0.14606332778930664 0.021334495724886438 +777 5 5.67473936 0.67473936080932617 0.45527320502537805 +778 7 6.27057648 0.72942352294921875 0.53205867583164945 +779 8 7.25729275 0.74270725250244141 0.55161406291972526 +780 4 4.25158453 0.25158452987670898 0.063294775673284676 +781 6 5.46962643 0.53037357330322266 0.2812961272584289 +782 7 6.27057648 0.72942352294921875 0.53205867583164945 +783 8 7.25729275 0.74270725250244141 0.55161406291972526 +784 5 5.67473936 0.67473936080932617 0.45527320502537805 +785 6 5.984593 0.015407085418701172 0.00023737828109915426 +786 6 5.73779 0.26220989227294922 0.068754027605791634 +787 6 5.73779 0.26220989227294922 0.068754027605791634 +788 7 5.744564 1.2554359436035156 1.5761194084916497 +789 6 5.984593 0.015407085418701172 0.00023737828109915426 +790 6 5.73779 0.26220989227294922 0.068754027605791634 +791 7 6.72236443 0.27763557434082031 0.077081512139557162 +792 5 5.33879137 0.3387913703918457 0.11477959265198479 +793 7 6.72236443 0.27763557434082031 0.077081512139557162 +794 5 5.357848 0.35784816741943359 0.12805531092544697 +795 5 5.146967 0.14696693420410156 0.021599279749352718 +796 6 5.565932 0.43406820297241211 0.18841520483169916 +797 6 5.848738 0.15126180648803711 0.022880134102024385 +798 6 5.683093 0.31690692901611328 0.10043000165842386 +799 8 6.89512539 1.1048746109008789 1.2207479058133686 +800 6 5.54755449 0.45244550704956055 0.20470693684933394 +801 5 5.25595665 0.25595664978027344 0.06551380656674155 +802 5 5.45315027 0.45315027236938477 0.2053451693484476 +803 7 5.900673 1.0993270874023438 1.2085200450965203 +804 6 5.57087564 0.42912435531616211 0.18414771232551175 +805 6 5.54755449 0.45244550704956055 0.20470693684933394 +806 5 5.43025064 0.43025064468383789 0.18511561725085812 +807 6 5.45095158 0.54904842376708984 0.30145417164112587 +808 6 5.265709 0.73429107666015625 0.53918338526273146 +809 6 5.38183546 0.6181645393371582 0.38212739769392101 +810 5 5.25595665 0.25595664978027344 0.06551380656674155 +811 6 5.19684839 0.80315160751342773 0.64505250465140307 +812 7 5.290009 1.7099909782409668 2.9240691456654986 +813 6 5.39861631 0.60138368606567383 0.36166233786593693 +814 6 5.16599131 0.83400869369506836 0.69557050115895436 +815 5 5.2495265 0.2495265007019043 0.062263474552537446 +816 5 5.339467 0.33946704864501953 0.11523787711576006 +817 5 5.18921566 0.18921566009521484 0.035802566025267879 +818 5 5.2495265 0.2495265007019043 0.062263474552537446 +819 5 5.18921566 0.18921566009521484 0.035802566025267879 +820 9 7.59099245 1.4090075492858887 1.985302273944626 +821 6 5.282037 0.71796321868896484 0.51547118339021836 +822 5 5.76482248 0.76482248306274414 0.58495343059826155 +823 6 5.7928896 0.20711040496826172 0.042894719846117368 +824 5 5.339467 0.33946704864501953 0.11523787711576006 +825 6 5.967984 0.032015800476074219 0.0010250114801237942 +826 6 5.883083 0.11691713333129883 0.013669616066408707 +827 9 7.18077564 1.8192243576049805 3.3095772633032539 +828 7 6.28743362 0.71256637573242188 0.50775083982443903 +829 7 6.37156773 0.62843227386474609 0.39492712283481524 +830 6 5.99365139 0.0063486099243164063 4.0304847971128765E-05 +831 4 5.97875738 1.978757381439209 3.9154807746001552 +832 8 7.28261232 0.71738767623901367 0.5146450780196119 +833 6 6.34423351 0.34423351287841797 0.11849671138861595 +834 6 5.99365139 0.0063486099243164063 4.0304847971128765E-05 +835 8 6.9307394 1.0692605972290039 1.1433182247865261 +836 8 7.40185452 0.59814548492431641 0.35777802113534563 +837 8 7.40185452 0.59814548492431641 0.35777802113534563 +838 8 7.40185452 0.59814548492431641 0.35777802113534563 +839 7 6.12130642 0.87869358062744141 0.77210240863587387 +840 7 6.10929 0.89070987701416016 0.79336408501058031 +841 7 6.560469 0.43953084945678711 0.19318736762420485 +842 7 6.560469 0.43953084945678711 0.19318736762420485 +843 7 6.28632545 0.71367454528808594 0.50933135659215623 +844 8 6.815397 1.184603214263916 1.4032847752444013 +845 8 6.815397 1.184603214263916 1.4032847752444013 +846 5 5.744107 0.74410676956176758 0.55369488450764948 +847 5 5.505699 0.50569915771484375 0.25573163811350241 +848 7 6.560469 0.43953084945678711 0.19318736762420485 +849 6 6.179038 0.17903804779052734 0.032054622556643153 +850 7 6.28632545 0.71367454528808594 0.50933135659215623 +851 5 5.222547 0.22254705429077148 0.049527191373499591 +852 7 6.845798 0.15420198440551758 0.023778251994599486 +853 5 5.05667639 0.056676387786865234 0.0032122129325671267 +854 7 6.845798 0.15420198440551758 0.023778251994599486 +855 7 6.591907 0.40809297561645508 0.1665398767474926 +856 5 5.222547 0.22254705429077148 0.049527191373499591 +857 5 5.28674126 0.28674125671386719 0.082220548301847884 +858 7 6.067086 0.93291378021240234 0.87032812131019455 +859 5 5.37729025 0.37729024887084961 0.14234793189302763 +860 8 6.29607058 1.7039294242858887 2.90337548294724 +861 7 6.279361 0.72063922882080078 0.51932089811543847 +862 6 5.761328 0.23867177963256836 0.056964218392977273 +863 6 6.351686 0.35168600082397461 0.12368304317556067 +864 5 5.67746735 0.67746734619140625 0.45896200515562668 +865 6 6.29066324 0.29066324234008789 0.084485120447652662 +866 7 6.845798 0.15420198440551758 0.023778251994599486 +867 8 6.719907 1.2800931930541992 1.6386385829036954 +868 7 6.091088 0.90891218185424805 0.82612135432304967 +869 6 6.09487629 0.094876289367675781 0.0090015102841789485 +870 5 4.84508 0.15492010116577148 0.024000237745212871 +871 5 5.05667639 0.056676387786865234 0.0032122129325671267 +872 6 5.842372 0.15762805938720703 0.024846605106176867 +873 3 4.258792 1.2587919235229492 1.5845571067266064 +874 5 5.26144648 0.26144647598266602 0.068354259803754758 +875 7 6.0310564 0.96894359588623047 0.9388516920089387 +876 9 7.59398556 1.4060144424438477 1.9768766123606838 +877 6 5.71128035 0.28871965408325195 0.083359038653952666 +878 6 6.17698956 0.17698955535888672 0.031325302706136426 +879 8 7.301932 0.69806814193725586 0.48729913078773279 +880 7 6.0310564 0.96894359588623047 0.9388516920089387 +881 6 4.977804 1.0221958160400391 1.0448842863297614 +882 6 6.22262239 0.22262239456176758 0.049560730560415323 +883 6 6.22262239 0.22262239456176758 0.049560730560415323 +884 6 5.929256 0.070744037628173828 0.0050047188599364745 +885 7 6.7628746 0.23712539672851563 0.056228453773655929 +886 6 5.867425 0.13257503509521484 0.017576139930497447 +887 7 6.904134 0.095866203308105469 0.0091903289367110119 +888 6 5.867425 0.13257503509521484 0.017576139930497447 +889 7 6.904134 0.095866203308105469 0.0091903289367110119 +890 6 5.41642475 0.58357524871826172 0.34056007091658103 +891 7 6.571357 0.42864322662353516 0.18373501573023532 +892 5 5.903946 0.9039459228515625 0.81711823143996298 +893 7 6.39641476 0.60358524322509766 0.3643151458391003 +894 7 6.571357 0.42864322662353516 0.18373501573023532 +895 6 5.795584 0.20441579818725586 0.041785818548532916 +896 6 6.044704 0.044703960418701172 0.0019984440771168011 +897 6 5.53706169 0.46293830871582031 0.21431187767666415 +898 6 5.99871159 0.0012884140014648438 1.6600106391706504E-06 +899 6 6.044704 0.044703960418701172 0.0019984440771168011 +900 7 6.42305946 0.57694053649902344 0.332860382655781 +901 6 5.644117 0.35588312149047852 0.12665279616180669 +902 5 5.376226 0.37622594833374023 0.14154596419962218 +903 6 5.4128356 0.58716440200805664 0.34476203498547875 +904 8 5.905926 2.0940737724304199 4.3851449643809701 +905 4 5.15215969 1.1521596908569336 1.3274719532355448 +906 4 4.686398 0.68639802932739258 0.47114225466452808 +907 8 7.10625744 0.89374256134033203 0.79877576595117716 +908 4 5.538096 1.5380959510803223 2.3657391547296811 +909 5 6.001538 1.0015377998352051 1.0030779644987433 +910 5 5.33533525 0.33533525466918945 0.11244973302405015 +911 5 5.265445 0.26544523239135742 0.070461171399301747 +912 5 5.27746153 0.27746152877807617 0.076984899951867192 +913 5 5.02890873 0.028908729553222656 0.000835714644381369 +914 4 4.618807 0.61880683898925781 0.38292190397987724 +915 5 5.02890873 0.028908729553222656 0.000835714644381369 +916 7 6.41210556 0.58789443969726563 0.34561987222696189 +917 6 5.79484129 0.20515871047973633 0.042090096485708273 +918 6 6.30130339 0.30130338668823242 0.090783730829798515 +919 7 5.49856329 1.501436710357666 2.2543121952096499 +920 7 5.924132 1.0758681297302246 1.1574922325692114 +921 6 5.415235 0.58476495742797852 0.34195005543574553 +922 6 5.415235 0.58476495742797852 0.34195005543574553 +923 6 5.6857233 0.31427669525146484 0.098769841178182105 +924 8 7.1898 0.81020021438598633 0.65642438739109821 +925 5 4.880244 0.11975622177124023 0.014341552652922473 +926 5 4.65471268 0.34528732299804688 0.11922333542315755 +927 7 5.814518 1.1854820251464844 1.4053676319454098 +928 5 5.665487 0.66548681259155273 0.44287269773326443 +929 5 5.26054239 0.26054239273071289 0.067882338409845033 +930 7 6.386512 0.61348819732666016 0.37636776825911511 +931 5 5.3852005 0.38520050048828125 0.14837942557642236 +932 6 5.74774551 0.25225448608398438 0.063632325749495067 +933 5 5.48427868 0.48427867889404297 0.23452583883135958 +934 5 5.25979567 0.2597956657409668 0.067493787937792149 +935 5 5.39290571 0.39290571212768555 0.15437489862256371 +936 5 5.031928 0.031928062438964844 0.0010194011711064377 +937 5 5.26054239 0.26054239273071289 0.067882338409845033 +938 6 5.805165 0.19483518600463867 0.037960749705462149 +939 7 5.841794 1.1582059860229492 1.341441106059392 +940 5 5.4379406 0.43794059753417969 0.19179196696859435 +941 6 5.4995656 0.50043439865112305 0.25043458735331114 +942 7 5.84281254 1.1571874618530273 1.3390828218698516 +943 7 6.667791 0.33220911026000977 0.11036289293974733 +944 7 5.80859041 1.1914095878601074 1.419456806044991 +945 7 6.29415846 0.7058415412902832 0.49821228141104257 +946 5 4.972539 0.027461051940917969 0.00075410937370179454 +947 5 5.56696272 0.56696271896362305 0.32144672469462421 +948 4 4.32402658 0.32402658462524414 0.1049932275439005 +949 5 5.413275 0.41327476501464844 0.17079603139791288 +950 5 5.189596 0.18959617614746094 0.035946710009739036 +951 6 5.98419046 0.015809535980224609 0.0002499414279100165 +952 6 5.73206854 0.26793146133422852 0.07178726797269519 +953 5 5.75603533 0.75603532791137695 0.57158941705006328 +954 6 5.98419046 0.015809535980224609 0.0002499414279100165 +955 5 5.189596 0.18959617614746094 0.035946710009739036 +956 5 4.97038651 0.029613494873046875 0.00087695907859597355 +957 7 6.168868 0.83113193511962891 0.69078029357569903 +958 7 6.26521635 0.73478364944458008 0.53990701149109555 +959 6 5.910377 0.089622974395751953 0.0080322775395416102 +960 6 5.910377 0.089622974395751953 0.0080322775395416102 +961 7 6.86594248 0.13405752182006836 0.017971419156538104 +962 6 5.910377 0.089622974395751953 0.0080322775395416102 +963 6 6.619384 0.61938381195068359 0.38363630650655978 +964 6 5.39164448 0.60835552215576172 0.37009644133740949 +965 5 5.822154 0.82215404510498047 0.67593727388248226 +966 6 5.30688763 0.69311237335205078 0.48040476209371263 +967 6 5.84447241 0.15552759170532227 0.024188831781657427 +968 7 6.907046 0.092954158782958984 0.0086404756350475509 +969 7 6.48757744 0.51242256164550781 0.26257688168334425 +970 7 6.853606 0.14639377593994141 0.021431137633953767 +971 7 6.58319426 0.41680574417114258 0.17372702837405996 +972 6 5.84447241 0.15552759170532227 0.024188831781657427 +973 7 6.907046 0.092954158782958984 0.0086404756350475509 +974 6 6.300776 0.30077600479125977 0.090466205058191917 +975 5 5.21892643 0.21892642974853516 0.047928781642440299 +976 6 6.132713 0.13271284103393555 0.017612698175298647 +977 5 5.34033251 0.3403325080871582 0.1158262160608956 +978 7 6.68473768 0.3152623176574707 0.099390328934759964 +979 5 5.52983046 0.5298304557800293 0.28072031187207358 +980 6 5.64436245 0.35563755035400391 0.12647806722179666 +981 7 6.68473768 0.3152623176574707 0.099390328934759964 +982 6 6.33463573 0.33463573455810547 0.11198107484324282 +983 6 6.484856 0.48485612869262695 0.23508546553080123 +984 5 5.95464563 0.95464563369750977 0.91134828593771999 +985 6 6.035773 0.035772800445556641 0.0012796932517176174 +986 6 5.657669 0.3423309326171875 0.11719046742655337 +987 6 5.644068 0.35593223571777344 0.12668775642305263 +988 5 5.95464563 0.95464563369750977 0.91134828593771999 +989 7 6.054229 0.94577121734619141 0.89448319556049682 +990 6 5.938118 0.06188201904296875 0.003829384280834347 +991 4 4.6924963 0.69249629974365234 0.47955112515865039 +992 5 5.46030664 0.46030664443969727 0.21188220691533388 +993 4 4.682115 0.68211507797241211 0.46528097959730985 +994 6 5.68704033 0.31295967102050781 0.097943755685264478 +995 6 5.751753 0.24824714660644531 0.061626645798241952 +996 5 4.88118124 0.11881875991821289 0.014117897708501914 +997 6 5.532356 0.46764421463012695 0.21869111147702824 +998 6 5.715275 0.28472518920898438 0.081068433370091952 +999 7 6.12828445 0.87171554565429688 0.75988799253536854 +1000 7 5.75078869 1.249211311340332 1.560528900380632 +1001 5 5.37959146 0.37959146499633789 0.14408968029806601 +1002 6 5.324381 0.67561912536621094 0.45646120256060385 +1003 7 5.734845 1.2651548385620117 1.6006167655368699 +1004 6 6.470826 0.47082614898681641 0.22167726256975584 +1005 6 6.26050854 0.26050853729248047 0.067864698002267687 +1006 6 6.470826 0.47082614898681641 0.22167726256975584 +1007 5 4.969872 0.030128002166748047 0.00090769651455957501 +1008 7 5.990216 1.0097842216491699 1.0196641742916199 +1009 6 6.03905725 0.039057254791259766 0.0015254691518293839 +1010 6 5.961968 0.038032054901123047 0.0014464372000020376 +1011 7 6.40974426 0.5902557373046875 0.34840183542110026 +1012 6 5.83015 0.16984987258911133 0.028848979218537352 +1013 5 5.47680569 0.47680568695068359 0.22734366310851328 +1014 5 5.880411 0.88041114807128906 0.77512378964820527 +1015 5 5.34980726 0.3498072624206543 0.1223651208422325 +1016 5 5.21006966 0.21006965637207031 0.044129260528279701 +1017 6 5.961968 0.038032054901123047 0.0014464372000020376 +1018 6 5.96575975 0.034240245819091797 0.0011723944337518333 +1019 6 5.856124 0.14387607574462891 0.020700325171674194 +1020 7 6.15400028 0.84599971771240234 0.71571552236946445 +1021 7 6.15400028 0.84599971771240234 0.71571552236946445 +1022 8 7.124521 0.87547922134399414 0.76646386700508629 +1023 6 5.8021183 0.19788169860839844 0.039157166644145036 +1024 6 6.3128047 0.3128046989440918 0.097846779681503904 +1025 6 6.03922939 0.039229393005371094 0.0015389452755698585 +1026 6 6.19870853 0.19870853424072266 0.039485081580096448 +1027 4 4.37104034 0.37104034423828125 0.13767093705246225 +1028 7 6.500612 0.49938821792602539 0.24938859220333143 +1029 4 4.8798933 0.87989330291748047 0.77421222451903304 +1030 6 5.86210537 0.13789463043212891 0.019014929102013411 +1031 6 5.66682529 0.33317470550537109 0.11100538438859076 +1032 6 5.55122232 0.44877767562866211 0.20140140214266467 +1033 6 5.55122232 0.44877767562866211 0.20140140214266467 +1034 3 4.10867262 1.1086726188659668 1.2291549758231213 +1035 6 6.16589975 0.16589975357055664 0.027522728234771421 +1036 5 5.71157932 0.71157932281494141 0.50634513265777059 +1037 5 4.98682547 0.013174533843994141 0.00017356834200654703 +1038 7 6.22729349 0.77270650863647461 0.59707534848917021 +1039 5 5.944244 0.9442439079284668 0.89159655766002288 +1040 4 4.656221 0.65622091293334961 0.43062588657107881 +1041 5 5.56935263 0.56935262680053711 0.32416241364467169 +1042 4 5.12880945 1.1288094520568848 1.2742107790529644 +1043 5 5.25701237 0.25701236724853516 0.066055356918695907 +1044 7 6.045879 0.95412111282348633 0.91034709793552793 +1045 5 5.825871 0.82587099075317383 0.68206289336762893 +1046 5 5.405234 0.40523386001586914 0.16421448130336103 +1047 5 4.630548 0.36945199966430664 0.13649478005595483 +1048 5 5.02841234 0.028412342071533203 0.00080726118198981567 +1049 6 6.89803839 0.89803838729858398 0.80647294506184153 +1050 5 5.57447243 0.57447242736816406 0.33001856980627053 +1051 6 5.75370646 0.24629354476928711 0.060660510195020834 +1052 5 5.565639 0.56563901901245117 0.3199474998293681 +1053 4 4.707374 0.70737409591674805 0.50037811157403667 +1054 5 4.630548 0.36945199966430664 0.13649478005595483 +1055 5 5.54014635 0.5401463508605957 0.29175808034801776 +1056 6 5.71638632 0.28361368179321289 0.080436720500301817 +1057 5 5.032247 0.032247066497802734 0.0010398732977137115 +1058 6 5.71638632 0.28361368179321289 0.080436720500301817 +1059 4 4.853614 0.85361385345458984 0.72865661080959399 +1060 7 6.41022825 0.58977174758911133 0.34783071425431444 +1061 5 5.65601873 0.65601873397827148 0.43036057933045413 +1062 5 5.03708935 0.037089347839355469 0.0013756197231487022 +1063 5 5.27974224 0.27974224090576172 0.078255721346977225 +1064 6 6.02264 0.022640228271484375 0.00051257993618492037 +1065 5 5.512553 0.51255321502685547 0.26271079823436594 +1066 6 5.341002 0.65899801254272461 0.43427838053526102 +1067 7 6.18087673 0.81912326812744141 0.67096292838778027 +1068 7 6.045392 0.95460796356201172 0.91127636409601109 +1069 6 6.692119 0.69211912155151367 0.47902887841723896 +1070 7 5.93807173 1.0619282722473145 1.1276916553981664 +1071 5 5.512553 0.51255321502685547 0.26271079823436594 +1072 7 6.101792 0.8982081413269043 0.80677786514593208 +1073 5 5.67952 0.6795201301574707 0.46174760728922593 +1074 6 5.47626066 0.52373933792114258 0.27430289408607678 +1075 7 6.69735241 0.30264759063720703 0.091595564118506445 +1076 6 5.935822 0.064177989959716797 0.00411881439526951 +1077 5 5.92465544 0.92465543746948242 0.85498767804187992 +1078 5 5.23349667 0.23349666595458984 0.054520693011909316 +1079 6 5.53093767 0.46906232833862305 0.22001946786645021 +1080 7 6.04816961 0.95183038711547852 0.90598108583640169 +1081 6 5.610572 0.38942813873291016 0.15165427523697872 +1082 6 5.610572 0.38942813873291016 0.15165427523697872 +1083 6 6.01216745 0.012167453765869141 0.00014804693114456313 +1084 7 6.06720972 0.93279027938842773 0.87009770532154107 +1085 5 4.8821125 0.11788749694824219 0.013897461936721811 +1086 8 7.018562 0.98143815994262695 0.9632208617915694 +1087 8 6.23180676 1.768193244934082 3.1265073514305186 +1088 6 6.01216745 0.012167453765869141 0.00014804693114456313 +1089 7 6.29614735 0.70385265350341797 0.49540855784380255 +1090 6 5.83192348 0.16807651519775391 0.0282497149610208 +1091 6 6.15303469 0.15303468704223633 0.023419615438115216 +1092 6 5.70561 0.29439020156860352 0.086665590779603008 +1093 7 6.08976 0.91024017333984375 0.8285371731617488 +1094 5 5.412741 0.41274118423461914 0.17035528516339582 +1095 8 6.758789 1.2412109375 1.5406045913696289 +1096 6 5.97093248 0.029067516326904297 0.00084492050541484787 +1097 7 6.06720972 0.93279027938842773 0.87009770532154107 +1098 6 6.07918739 0.079187393188476563 0.0062706432399863843 +1099 7 7.03807 0.038070201873779297 0.0014493402707103087 +1100 6 5.610572 0.38942813873291016 0.15165427523697872 +1101 6 6.43299437 0.43299436569213867 0.18748412072113751 +1102 5 5.85943174 0.85943174362182617 0.73862292194485235 +1103 5 5.10429573 0.10429573059082031 0.010877599419472972 +1104 5 4.8821125 0.11788749694824219 0.013897461936721811 +1105 7 6.770464 0.22953605651855469 0.052686801242089132 +1106 8 7.018562 0.98143815994262695 0.9632208617915694 +1107 7 6.98446751 0.015532493591308594 0.00024125835716404254 +1108 7 6.594719 0.40528106689453125 0.16425274318316951 +1109 4 4.91977644 0.91977643966674805 0.84598869896603901 +1110 7 6.98446751 0.015532493591308594 0.00024125835716404254 +1111 6 5.80645752 0.19354248046875 0.037458691745996475 +1112 6 5.579233 0.42076683044433594 0.17704472560217255 +1113 5 5.85607052 0.85607051849365234 0.73285673263399076 +1114 4 4.210546 0.21054601669311523 0.044329625145337559 +1115 8 6.52873039 1.4712696075439453 2.1646342580825149 +1116 5 4.93939924 0.060600757598876953 0.0036724518215578428 +1117 5 5.30673933 0.30673933029174805 0.094089016747830101 +1118 5 4.93939924 0.060600757598876953 0.0036724518215578428 +1119 5 5.132389 0.13238906860351563 0.017526865485706367 +1120 6 6.11902142 0.11902141571044922 0.014166097397719568 +1121 6 5.462161 0.53783893585205078 0.2892707209184664 +1122 7 7.01724672 0.017246723175048828 0.00029744946027676633 +1123 5 5.10792828 0.10792827606201172 0.011648512773717812 +1124 5 5.47876072 0.47876071929931641 0.22921182634399884 +1125 6 5.50789976 0.49210023880004883 0.24216264502706508 +1126 7 7.1118207 0.11182069778442383 0.012503868452995448 +1127 7 6.765686 0.23431396484375 0.054903034120798111 +1128 5 5.402971 0.40297079086303711 0.16238545828878159 +1129 7 6.556822 0.44317817687988281 0.1964068964625767 +1130 6 5.892219 0.10778093338012695 0.011616729600291364 +1131 6 5.73756075 0.26243925094604492 0.06887436043712114 +1132 5 5.37563229 0.37563228607177734 0.14109961433950957 +1133 5 5.6008687 0.60086870193481445 0.36104319696482889 +1134 5 5.608214 0.60821390151977539 0.36992415000190704 +1135 6 5.44677258 0.55322742462158203 0.30606058335342823 +1136 8 7.178051 0.82194900512695313 0.67560016702918801 +1137 8 6.969251 1.0307488441467285 1.0624431797098168 +1138 5 5.00738 0.0073800086975097656 5.4464528375319787E-05 +1139 5 5.977937 0.97793722152709961 0.9563612092481435 +1140 6 5.87731743 0.12268257141113281 0.015051013328047702 +1141 5 4.867375 0.13262510299682617 0.01758941794491875 +1142 5 5.00738 0.0073800086975097656 5.4464528375319787E-05 +1143 5 5.85505152 0.85505151748657227 0.73111309755609 +1144 5 5.85505152 0.85505151748657227 0.73111309755609 +1145 5 5.10958338 0.10958337783813477 0.012008516698415406 +1146 5 5.43428946 0.43428945541381836 0.18860733108363092 +1147 5 4.82746458 0.17253541946411133 0.029768470969656846 +1148 6 6.254219 0.25421905517578125 0.064627328014466912 +1149 5 5.412803 0.41280317306518555 0.17040645969268553 +1150 5 5.112308 0.11230802536010742 0.012613092560286532 +1151 5 5.10958338 0.10958337783813477 0.012008516698415406 +1152 4 4.478788 0.47878789901733398 0.2292378522454328 +1153 6 6.06767225 0.067672252655029297 0.0045795337794061197 +1154 4 5.525569 1.525568962097168 2.3273606581142303 +1155 4 5.83603525 1.8360352516174316 3.3710254451818855 +1156 6 5.705391 0.29460906982421875 0.086794504022691399 +1157 6 5.705391 0.29460906982421875 0.086794504022691399 +1158 6 5.613663 0.3863368034362793 0.14925612568936231 +1159 6 5.705391 0.29460906982421875 0.086794504022691399 +1160 6 6.03820658 0.038206577301025391 0.0014597425490592286 +1161 6 5.705391 0.29460906982421875 0.086794504022691399 +1162 7 5.89303446 1.1069655418395996 1.2253727108202384 +1163 6 5.613663 0.3863368034362793 0.14925612568936231 +1164 6 5.57107639 0.42892360687255859 0.18397546053256519 +1165 5 6.21637726 1.2163772583007813 1.4795736345113255 +1166 5 5.03993464 0.039934635162353516 0.0015947750855502818 +1167 6 5.658946 0.34105396270751953 0.11631780547850212 +1168 5 5.60502958 0.60502958297729492 0.3660607962776794 +1169 6 6.03820658 0.038206577301025391 0.0014597425490592286 +1170 6 5.52565 0.4743499755859375 0.2250078993383795 +1171 5 5.103544 0.10354423522949219 0.010721408649260411 +1172 6 5.77168846 0.22831153869628906 0.052126158701867098 +1173 5 5.65733957 0.65733957290649414 0.43209531410889213 +1174 6 6.049003 0.049003124237060547 0.0024013061849927908 +1175 5 5.524268 0.52426815032958984 0.27485709345000942 +1176 7 5.779589 1.2204108238220215 1.4894025789019452 +1177 6 5.1657753 0.83422470092773438 0.69593085163796786 +1178 5 5.137906 0.13790607452392578 0.019018085390598571 +1179 5 5.877721 0.87772083282470703 0.77039386037449731 +1180 5 5.103544 0.10354423522949219 0.010721408649260411 +1181 6 5.537969 0.46203088760375977 0.21347254109991809 +1182 5 5.65733957 0.65733957290649414 0.43209531410889213 +1183 6 5.982406 0.017593860626220703 0.00030954393173487915 +1184 7 7.129286 0.12928581237792969 0.016714821282221237 +1185 5 5.1653595 0.1653594970703125 0.027343763271346688 +1186 5 5.1552124 0.15521240234375 0.02409088984131813 +1187 8 6.62410975 1.3758902549743652 1.8930739937334238 +1188 6 6.0923624 0.092362403869628906 0.0085308136485764408 +1189 5 4.7566247 0.24337530136108398 0.059231537312598448 +1190 6 5.77168846 0.22831153869628906 0.052126158701867098 +1191 7 6.228344 0.77165603637695313 0.5954530384769896 +1192 6 5.88427734 0.11572265625 0.013391733169555664 +1193 7 6.62193251 0.3780674934387207 0.14293502959503712 +1194 6 5.724867 0.27513313293457031 0.075698240838391939 +1195 6 5.85270834 0.14729166030883789 0.021694833196534091 +1196 7 6.228344 0.77165603637695313 0.5954530384769896 +1197 7 6.62193251 0.3780674934387207 0.14293502959503712 +1198 6 5.88427734 0.11572265625 0.013391733169555664 +1199 7 5.937553 1.0624470710754395 1.1287937788367799 +1200 6 6.37769175 0.37769174575805664 0.1426510548137685 +1201 7 6.44489861 0.55510139465332031 0.30813755834606127 +1202 5 5.310828 0.31082820892333984 0.096614175462491403 +1203 6 5.63135147 0.36864852905273438 0.13590173797274474 +1204 6 5.63135147 0.36864852905273438 0.13590173797274474 +1205 5 4.72144365 0.27855634689331055 0.07759363839454636 +1206 6 5.289617 0.71038293838500977 0.50464391914852058 +1207 5 5.310828 0.31082820892333984 0.096614175462491403 +1208 6 6.11222935 0.11222934722900391 0.012595426379448327 +1209 6 6.17824745 0.17824745178222656 0.031772154066857183 +1210 6 5.282294 0.71770620346069336 0.51510219448596217 +1211 5 5.3563714 0.35637140274047852 0.12700057669121634 +1212 6 6.04702139 0.047021389007568359 0.0022110110242010705 +1213 6 5.63135147 0.36864852905273438 0.13590173797274474 +1214 6 5.363396 0.63660383224487305 0.40526443922885846 +1215 5 5.69043732 0.69043731689453125 0.47670368856051937 +1216 8 6.838419 1.1615810394287109 1.3492705111602845 +1217 5 4.86424255 0.1357574462890625 0.01843008422292769 +1218 8 6.467907 1.5320930480957031 2.3473091080231825 +1219 8 6.838419 1.1615810394287109 1.3492705111602845 +1220 6 5.6570406 0.34295940399169922 0.11762115278634155 +1221 7 6.91511154 0.084888458251953125 0.0072060503443935886 +1222 6 5.43544245 0.56455755233764648 0.31872522990147445 +1223 5 5.69043732 0.69043731689453125 0.47670368856051937 +1224 7 6.894313 0.10568714141845703 0.011169771861204936 +1225 6 6.245586 0.24558591842651367 0.060312443329394227 +1226 7 6.894313 0.10568714141845703 0.011169771861204936 +1227 5 6.100359 1.1003589630126953 1.2107898474823742 +1228 6 5.5494566 0.45054340362548828 0.20298935855043965 +1229 3 5.304199 2.30419921875 5.3093340396881104 +1230 6 5.946202 0.053798198699951172 0.002894246183359428 +1231 7 6.70273447 0.29726552963256836 0.088366795107731377 +1232 7 6.92535257 0.074647426605224609 0.0055722382987823948 +1233 6 6.646057 0.64605712890625 0.41738981381058693 +1234 6 6.09385824 0.093858242034912109 0.0088093695978841424 +1235 5 5.44398 0.44398021697998047 0.19711843306959054 +1236 6 6.245586 0.24558591842651367 0.060312443329394227 +1237 5 6.10185528 1.1018552780151367 1.2140850536898142 +1238 7 6.84097576 0.15902423858642578 0.02528870845799247 +1239 5 5.387145 0.38714504241943359 0.14988128386994504 +1240 6 5.8931427 0.1068572998046875 0.011418482521548867 +1241 7 6.54278 0.45722007751464844 0.20905019928250113 +1242 7 6.73510265 0.26489734649658203 0.070170604180930241 +1243 7 6.84097576 0.15902423858642578 0.02528870845799247 +1244 5 5.3529973 0.3529973030090332 0.1246070959316512 +1245 4 4.574822 0.57482194900512695 0.33042027305805277 +1246 7 5.863571 1.1364288330078125 1.2914704924914986 +1247 6 5.985528 0.014472007751464844 0.00020943900835845852 +1248 7 5.85182476 1.1481752395629883 1.3183063807455255 +1249 5 4.89960527 0.10039472579956055 0.010079100968368948 +1250 7 6.29567766 0.70432233810424805 0.4960699559526347 +1251 5 5.595309 0.59530878067016602 0.35439254434299983 +1252 6 5.614072 0.38592815399169922 0.14894054004344071 +1253 7 6.781205 0.21879482269287109 0.0478711744372049 +1254 5 5.56732273 0.56732273101806641 0.32185508112979733 +1255 6 5.882935 0.1170649528503418 0.013704203185852748 +1256 6 5.8892746 0.11072540283203125 0.012260114832315594 +1257 6 5.95164537 0.048354625701904297 0.0023381698267712636 +1258 6 5.41884851 0.58115148544311523 0.33773704903273938 +1259 6 5.756651 0.24334907531738281 0.059218772457825253 +1260 6 5.58933926 0.41066074371337891 0.16864224642722547 +1261 6 5.84502745 0.15497255325317383 0.024016492261807798 +1262 6 5.8892746 0.11072540283203125 0.012260114832315594 +1263 6 5.237282 0.76271820068359375 0.58173905365401879 +1264 5 5.38367939 0.38367938995361328 0.14720987427517684 +1265 7 6.2032733 0.79672670364379883 0.63477344029911364 +1266 8 6.718538 1.2814621925354004 1.6421453508976356 +1267 7 6.47745848 0.52254152297973633 0.27304964323798231 +1268 5 5.3250103 0.32501029968261719 0.10563169489978463 +1269 6 5.612442 0.3875579833984375 0.15020119049586356 +1270 7 6.47745848 0.52254152297973633 0.27304964323798231 +1271 5 5.10060358 0.10060358047485352 0.010121080404360328 +1272 5 5.27133226 0.2713322639465332 0.073621197458351162 +1273 5 5.10060358 0.10060358047485352 0.010121080404360328 +1274 6 5.612442 0.3875579833984375 0.15020119049586356 +1275 6 5.458334 0.54166603088378906 0.29340208901339793 +1276 7 6.47745848 0.52254152297973633 0.27304964323798231 +1277 5 5.3250103 0.32501029968261719 0.10563169489978463 +1278 6 5.51326656 0.48673343658447266 0.23690943828933086 +1279 6 5.76638126 0.23361873626708984 0.054577713935032079 +1280 6 6.193863 0.1938629150390625 0.037582829827442765 +1281 7 6.465979 0.53402090072631836 0.28517832241254837 +1282 5 4.972692 0.027307987213134766 0.00074572616563273186 +1283 8 7.43220043 0.56779956817626953 0.32239634962115815 +1284 7 6.465979 0.53402090072631836 0.28517832241254837 +1285 6 6.193863 0.1938629150390625 0.037582829827442765 +1286 7 6.305199 0.69480085372924805 0.48274822634289194 +1287 7 6.35717773 0.642822265625 0.41322046518325806 +1288 7 6.65708542 0.34291458129882813 0.1175904100673506 +1289 6 6.093326 0.093326091766357422 0.0087097594043825666 +1290 6 5.65154362 0.34845638275146484 0.12142185068023537 +1291 6 5.93934059 0.060659408569335938 0.0036795638479816262 +1292 6 6.11116362 0.11116361618041992 0.012357349562307718 +1293 4 5.20322227 1.2032222747802734 1.4477438425274158 +1294 4 5.20646429 1.2064642906188965 1.4555560845385571 +1295 6 5.93934059 0.060659408569335938 0.0036795638479816262 +1296 6 6.33243275 0.33243274688720703 0.11051153120297386 +1297 7 6.47113848 0.52886152267456055 0.27969451016565472 +1298 6 6.46381426 0.46381425857543945 0.21512366645788461 +1299 5 5.814402 0.81440210342407227 0.6632507860615533 +1300 6 5.65920353 0.34079647064208984 0.1161422344021048 +1301 5 6.145593 1.1455931663513184 1.3123837027908394 +1302 6 5.79424763 0.20575237274169922 0.042334038888839132 +1303 6 5.99417257 0.0058274269104003906 3.3958904396058642E-05 +1304 5 4.760337 0.23966312408447266 0.057438413045929337 +1305 7 5.967471 1.0325288772583008 1.0661158823722872 +1306 8 6.71653032 1.2834696769714355 1.6472944117051611 +1307 5 4.928889 0.071111202239990234 0.0050568030840167921 +1308 6 5.519699 0.4803009033203125 0.23068895773030818 +1309 6 5.25417376 0.74582624435424805 0.55625678676756252 +1310 6 5.555265 0.44473505020141602 0.19778926487765602 +1311 6 5.90800333 0.091996669769287109 0.0084633872486392647 +1312 5 5.37995148 0.37995147705078125 0.14436312491307035 +1313 5 4.78751326 0.21248674392700195 0.045150616344699301 +1314 6 5.3819623 0.61803770065307617 0.38197059942854139 +1315 6 5.965221 0.034779071807861328 0.0012095838358163746 +1316 6 6.133198 0.13319778442382813 0.01774164977541659 +1317 5 5.727461 0.72746086120605469 0.52919930458665476 +1318 6 5.96416569 0.035834312438964844 0.0012840979479733505 +1319 5 5.315215 0.31521511077880859 0.099360566063296574 +1320 6 5.53202772 0.4679722785949707 0.21899805353336887 +1321 6 6.27661276 0.27661275863647461 0.076514618240480559 +1322 6 5.9950614 0.0049386024475097656 2.4389794134549447E-05 +1323 5 5.63579941 0.63579940795898438 0.40424088716099504 +1324 6 5.84845543 0.15154457092285156 0.022965756976191187 +1325 7 6.57000828 0.42999172210693359 0.1848928810804864 +1326 6 5.332149 0.66785097122192383 0.44602491976206693 +1327 6 5.70322227 0.29677772521972656 0.088077018186595524 +1328 6 6.19832325 0.19832324981689453 0.039332111417934357 +1329 5 5.24106073 0.24106073379516602 0.058110277377863895 +1330 5 5.275782 0.27578210830688477 0.076055771262190319 +1331 6 5.9980464 0.0019536018371582031 3.8165601381479064E-06 +1332 7 6.28721142 0.71278858184814453 0.50806756241308904 +1333 8 7.208517 0.79148292541503906 0.62644522122354829 +1334 6 5.80906248 0.19093751907348633 0.036457136189937955 +1335 6 5.53973341 0.4602665901184082 0.21184533397922678 +1336 8 6.56598568 1.4340143203735352 2.0563970710363719 +1337 5 5.58535767 0.585357666015625 0.34264359716325998 +1338 5 5.58535767 0.585357666015625 0.34264359716325998 +1339 6 5.59666157 0.40333843231201172 0.16268189097991126 +1340 6 5.68894053 0.31105947494506836 0.09675799695310161 +1341 5 5.024909 0.024909019470214844 0.00062045925096754218 +1342 6 5.59666157 0.40333843231201172 0.16268189097991126 +1343 6 5.52039242 0.47960758209228516 0.23002343280040805 +1344 8 6.76283932 1.2371606826782227 1.5305665547648459 +1345 8 7.29672575 0.70327425003051758 0.49459467075598695 +1346 7 6.62656832 0.37343168258666992 0.1394512215595114 +1347 7 6.4981637 0.50183629989624023 0.25183967189354917 +1348 8 6.56598568 1.4340143203735352 2.0563970710363719 +1349 4 4.51300955 0.51300954818725586 0.26317879653129239 +1350 7 6.694145 0.30585479736328125 0.093547157070133835 +1351 7 6.78723574 0.21276426315307617 0.045268631675071447 +1352 6 5.53973341 0.4602665901184082 0.21184533397922678 +1353 5 5.58535767 0.585357666015625 0.34264359716325998 +1354 5 5.855622 0.8556218147277832 0.73208868983806497 +1355 5 5.634065 0.63406515121459961 0.40203861598479307 +1356 6 5.88986158 0.1101384162902832 0.01213047074293172 +1357 6 5.48553562 0.51446437835693359 0.26467359659818612 +1358 8 6.64505959 1.3549404144287109 1.8358635266522469 +1359 7 6.36494541 0.63505458831787109 0.40329433014358074 +1360 6 6.15028334 0.1502833366394043 0.022585081271472518 +1361 7 6.441375 0.55862522125244141 0.31206213781933911 +1362 7 6.15109444 0.84890556335449219 0.72064065549420775 +1363 4 4.86845255 0.86845254898071289 0.75420982983109752 +1364 5 5.634065 0.63406515121459961 0.40203861598479307 +1365 7 6.202309 0.79769086837768555 0.63631072149314605 +1366 6 6.18606329 0.18606328964233398 0.034619547752527069 +1367 5 5.06025934 0.060259342193603516 0.003631188321605805 +1368 6 5.88986158 0.1101384162902832 0.01213047074293172 +1369 5 5.00331259 0.0033125877380371094 1.0973237522193813E-05 +1370 6 5.57671547 0.42328453063964844 0.17916979387882748 +1371 7 6.227106 0.77289390563964844 0.59736498937490978 +1372 6 5.65561247 0.34438753128051758 0.11860277170148947 +1373 6 5.65561247 0.34438753128051758 0.11860277170148947 +1374 7 6.524151 0.47584915161132813 0.22643241508922074 +1375 7 6.52171946 0.47828054428100586 0.22875227903773521 +1376 6 5.316654 0.68334579467773438 0.46696147510374431 +1377 6 5.37147141 0.62852859497070313 0.39504819469584618 +1378 7 6.430662 0.56933784484863281 0.32414558157688589 +1379 6 5.082979 0.91702079772949219 0.84092714346843422 +1380 7 6.746756 0.25324392318725586 0.064132484631272746 +1381 7 6.964511 0.035489082336425781 0.0012594749650816084 +1382 6 5.17345047 0.82654953002929688 0.68318412559165154 +1383 6 5.44885063 0.55114936828613281 0.30376562616220326 +1384 6 5.353897 0.6461029052734375 0.41744896420277655 +1385 5 5.214962 0.21496200561523438 0.046208663858124055 +1386 7 6.70045853 0.29954147338867188 0.089725094279856421 +1387 6 6.51349 0.51349020004272461 0.26367218553991734 +1388 7 6.2468257 0.7531743049621582 0.56727153365523009 +1389 6 5.64481068 0.35518932342529297 0.12615945547531737 +1390 6 5.88739872 0.11260128021240234 0.012679048305471952 +1391 6 6.315742 0.31574201583862305 0.099693020565837287 +1392 6 6.51349 0.51349020004272461 0.26367218553991734 +1393 6 5.75668669 0.24331331253051758 0.059201368054573322 +1394 7 6.70045853 0.29954147338867188 0.089725094279856421 +1395 7 6.47507143 0.52492856979370117 0.2755500033856606 +1396 7 6.2468257 0.7531743049621582 0.56727153365523009 +1397 7 6.46521664 0.53478336334228516 0.28599324570768658 +1398 7 6.46521664 0.53478336334228516 0.28599324570768658 +1399 6 6.17105865 0.17105865478515625 0.029261063376907259 +1400 7 6.46521664 0.53478336334228516 0.28599324570768658 +1401 6 5.33331 0.66668987274169922 0.4444753864163431 +1402 8 6.738231 1.2617688179016113 1.5920605498288296 +1403 8 6.82005262 1.1799473762512207 1.3922758107221398 +1404 5 5.197244 0.19724416732788086 0.038905261544869063 +1405 4 4.788163 0.78816318511962891 0.62120120637791842 +1406 8 5.997945 2.0020551681518555 4.0082248963235543 +1407 6 6.16638 0.16637992858886719 0.027682280637236545 +1408 7 6.46521664 0.53478336334228516 0.28599324570768658 +1409 6 5.84087849 0.15912151336669922 0.025319656016108638 +1410 6 6.91486263 0.91486263275146484 0.83697363680494163 +1411 6 6.17105865 0.17105865478515625 0.029261063376907259 +1412 8 6.925897 1.0741028785705566 1.1536969937535559 +1413 6 5.74678326 0.25321674346923828 0.064118719173166028 +1414 6 6.30511141 0.30511140823364258 0.093092971434316496 +1415 5 4.77416 0.22584009170532227 0.051003747021468371 +1416 6 5.730961 0.26903915405273438 0.072382066413410939 +1417 3 3.87556767 0.87556767463684082 0.76661875286896475 +1418 5 5.128478 0.12847805023193359 0.016506609391399252 +1419 7 5.832464 1.1675357818603516 1.3631398019242624 +1420 4 5.022509 1.0225090980529785 1.0455248556011156 +1421 6 6.31783152 0.31783151626586914 0.10101687273186144 +1422 5 5.643516 0.64351606369018555 0.41411292422731094 +1423 4 4.68935776 0.68935775756835938 0.47521411791967694 +1424 6 5.74678326 0.25321674346923828 0.064118719173166028 +1425 6 5.866952 0.13304805755615234 0.017701785619465227 +1426 6 6.1267 0.12669992446899414 0.01605287086044882 +1427 5 5.5781126 0.57811260223388672 0.33421418086163612 +1428 7 6.30638742 0.69361257553100586 0.48109840493475531 +1429 5 5.425704 0.42570400238037109 0.181223897642667 +1430 4 4.59027672 0.59027671813964844 0.34842660397771397 +1431 5 5.425704 0.42570400238037109 0.181223897642667 +1432 7 6.45146465 0.54853534698486328 0.30089102689180436 +1433 6 6.12620735 0.12620735168457031 0.015928295619232813 +1434 5 5.5781126 0.57811260223388672 0.33421418086163612 +1435 5 5.358219 0.35821914672851563 0.12832095708290581 +1436 5 4.74604464 0.25395536422729492 0.064493327019818025 +1437 7 6.30638742 0.69361257553100586 0.48109840493475531 +1438 5 5.376018 0.37601804733276367 0.1413895719199445 +1439 5 5.31217 0.31217002868652344 0.097450126810144866 +1440 5 5.34141731 0.34141731262207031 0.11656578135807649 +1441 5 5.31631041 0.31631040573120117 0.1000522727738371 +1442 5 5.239716 0.2397160530090332 0.057463786070229617 +1443 6 6.53284931 0.53284931182861328 0.28392838911622675 +1444 6 6.13901567 0.13901567459106445 0.019325357782008723 +1445 6 6.249914 0.24991416931152344 0.062457092022668803 +1446 6 6.32129574 0.32129573822021484 0.10323095139847283 +1447 6 5.96523571 0.034764289855957031 0.0012085558491889969 +1448 6 5.96523571 0.034764289855957031 0.0012085558491889969 +1449 6 6.238419 0.2384190559387207 0.056843646234710832 +1450 6 6.13901567 0.13901567459106445 0.019325357782008723 +1451 5 4.972824 0.0271759033203125 0.00073852972127497196 +1452 6 6.13901567 0.13901567459106445 0.019325357782008723 +1453 7 6.924468 0.075531959533691406 0.0057050769109991961 +1454 5 5.481235 0.48123502731323242 0.23158715151316756 +1455 5 5.152508 0.15250778198242188 0.023258623565197922 +1456 6 6.32129574 0.32129573822021484 0.10323095139847283 +1457 6 6.249914 0.24991416931152344 0.062457092022668803 +1458 6 6.5971756 0.59717559814453125 0.35661869501927868 +1459 6 6.099336 0.099336147308349609 0.0098676701620661333 +1460 6 6.1909585 0.19095849990844727 0.036465148687284454 +1461 6 6.055593 0.055593013763427734 0.0030905831793006655 +1462 6 5.96523571 0.034764289855957031 0.0012085558491889969 +1463 6 5.404578 0.59542179107666016 0.35452710928893794 +1464 8 7.21596861 0.78403139114379883 0.61470522229888047 +1465 5 5.483042 0.48304176330566406 0.23332934509744518 +1466 6 6.238419 0.2384190559387207 0.056843646234710832 +1467 7 6.716609 0.28339099884033203 0.080310458223721071 +1468 5 5.373811 0.37381076812744141 0.13973449036802776 +1469 5 4.972824 0.0271759033203125 0.00073852972127497196 +1470 7 6.924468 0.075531959533691406 0.0057050769109991961 +1471 6 6.13901567 0.13901567459106445 0.019325357782008723 +1472 5 4.685822 0.3141779899597168 0.098707809375127908 +1473 6 6.3247633 0.32476329803466797 0.10547119975035457 +1474 4 4.968365 0.96836519241333008 0.93773114587770579 +1475 6 5.644989 0.355010986328125 0.12603280041366816 +1476 5 5.26950741 0.26950740814208984 0.072634243043466995 +1477 6 5.090542 0.90945816040039063 0.82711414551886264 +1478 6 5.942869 0.057130813598632813 0.0032639298624417279 +1479 6 5.958142 0.041858196258544922 0.0017521085940188641 +1480 6 5.644989 0.355010986328125 0.12603280041366816 +1481 6 5.81158543 0.18841457366943359 0.035500051571034419 +1482 6 5.731278 0.2687220573425293 0.072211544102401604 +1483 4 4.968365 0.96836519241333008 0.93773114587770579 +1484 3 4.72003746 1.7200374603271484 2.9585288649286667 +1485 6 5.74980974 0.25019025802612305 0.062595165211178028 +1486 6 6.04464531 0.044645309448242188 0.0019932036557293031 +1487 6 5.584739 0.41526079177856445 0.17244152518856026 +1488 6 5.4774065 0.52259349822998047 0.2731039643922486 +1489 5 5.54700565 0.54700565338134766 0.29921518483115506 +1490 6 6.117487 0.11748695373535156 0.013803184298012638 +1491 5 5.28033733 0.28033733367919922 0.078589020654362685 +1492 5 5.511872 0.5118718147277832 0.26201275471271401 +1493 8 7.21298552 0.78701448440551758 0.61939179866408267 +1494 8 6.91919661 1.080803394317627 1.1681359771685038 +1495 7 6.89 0.1100001335144043 0.012100029373186771 +1496 5 4.47227573 0.52772426605224609 0.27849290098038182 +1497 7 6.363376 0.63662385940551758 0.40528993836437621 +1498 6 6.229407 0.22940683364868164 0.052627495324713891 +1499 6 6.32839346 0.32839345932006836 0.10784226412420139 +1500 7 6.508002 0.49199819564819336 0.24206222452107795 +1501 5 5.62988043 0.62988042831420898 0.39674935397329136 +1502 5 5.25582027 0.25582027435302734 0.06544401277005818 +1503 7 6.683228 0.3167719841003418 0.1003444899108672 +1504 8 6.89950371 1.1004962921142578 1.2110920889572299 +1505 7 5.938468 1.0615320205688477 1.1268502306929804 +1506 6 5.97229433 0.027705669403076172 0.00076760411707255116 +1507 6 5.688956 0.31104421615600586 0.096748504404104096 +1508 6 5.87291145 0.12708854675292969 0.016151498715771595 +1509 5 5.75635767 0.75635766983032227 0.57207692471115479 +1510 5 5.488938 0.4889378547668457 0.2390602258240051 +1511 6 5.843129 0.15687084197998047 0.024608461063508003 +1512 7 6.549167 0.45083284378051758 0.20325025303122857 +1513 6 6.254115 0.25411510467529297 0.064574486424135102 +1514 7 6.508002 0.49199819564819336 0.24206222452107795 +1515 6 6.25105858 0.25105857849121094 0.063030409834027523 +1516 6 6.023645 0.023644924163818359 0.00055908243871272134 +1517 6 5.769742 0.23025798797607422 0.053018741026789939 +1518 6 6.08221436 0.08221435546875 0.006759200245141983 +1519 5 5.62988043 0.62988042831420898 0.39674935397329136 +1520 6 5.637359 0.3626408576965332 0.13150839167087724 +1521 5 5.25582027 0.25582027435302734 0.06544401277005818 +1522 5 5.9717474 0.97174739837646484 0.94429300625142787 +1523 6 5.85238028 0.14761972427368164 0.021791582994637793 +1524 6 5.722701 0.27729892730712891 0.076894695085684361 +1525 5 5.175857 0.1758570671081543 0.030925708051881884 +1526 6 5.79728031 0.20271968841552734 0.041095272071288491 +1527 6 6.118867 0.11886692047119141 0.014129344782304543 +1528 6 5.967835 0.032165050506591797 0.0010345904740916012 +1529 6 5.722701 0.27729892730712891 0.076894695085684361 +1530 5 5.175857 0.1758570671081543 0.030925708051881884 +1531 7 6.23848534 0.76151466369628906 0.57990458302447223 +1532 7 6.21835041 0.78164958953857422 0.61097608082582155 +1533 6 6.054538 0.054537773132324219 0.0029743686982328654 +1534 6 6.03214836 0.032148361206054688 0.001033517128234962 +1535 6 6.021887 0.021886825561523438 0.00047903313316055574 +1536 5 4.937884 0.062116146087646484 0.0038584156047818396 +1537 6 5.64776373 0.35223627090454102 0.12407039054073721 +1538 6 5.63121843 0.36878156661987305 0.13599984387860786 +1539 6 6.054538 0.054537773132324219 0.0029743686982328654 +1540 6 6.03214836 0.032148361206054688 0.001033517128234962 +1541 4 4.78551245 0.78551244735717773 0.61702980495306292 +1542 6 6.13340139 0.13340139389038086 0.017795931891896544 +1543 6 6.26117373 0.26117372512817383 0.068211714697326897 +1544 5 4.937884 0.062116146087646484 0.0038584156047818396 +1545 6 6.10239172 0.10239171981811523 0.010484064287311412 +1546 6 5.70011139 0.29988861083984375 0.08993317891145125 +1547 6 5.70011139 0.29988861083984375 0.08993317891145125 +1548 6 6.932836 0.93283605575561523 0.87018310691769329 +1549 6 6.021887 0.021886825561523438 0.00047903313316055574 +1550 6 6.09009027 0.090090274810791016 0.0081162576154838462 +1551 6 5.807327 0.1926732063293457 0.037122964437230621 +1552 7 6.95572 0.044280052185058594 0.0019607230215115123 +1553 7 6.56591129 0.43408870697021484 0.18843300551907305 +1554 7 6.32974529 0.67025470733642578 0.44924137270663778 +1555 7 6.827229 0.17277097702026367 0.029849810500536478 +1556 6 5.97219038 0.027809619903564453 0.00077337495918072818 +1557 6 6.09009027 0.090090274810791016 0.0081162576154838462 +1558 4 5.05523 1.0552301406860352 1.1135106498122695 +1559 4 4.55122566 0.55122566223144531 0.30384973070249544 +1560 6 6.44468355 0.44468355178833008 0.19774346123108444 +1561 5 4.740227 0.25977277755737305 0.067481895959872418 +1562 7 7.064521 0.064520835876464844 0.0041629382621977129 +1563 6 6.44468355 0.44468355178833008 0.19774346123108444 +1564 5 4.740227 0.25977277755737305 0.067481895959872418 +1565 6 6.068884 0.068883895874023438 0.0047449911107833032 +1566 5 5.817742 0.81774187088012695 0.66870176739053022 +1567 5 5.55821562 0.55821561813354492 0.31160467632821565 +1568 6 5.69551039 0.3044896125793457 0.092713924168720041 +1569 5 5.243182 0.24318218231201172 0.059137573794032505 +1570 5 5.32225132 0.32225131988525391 0.10384591316778824 +1571 6 5.69551039 0.3044896125793457 0.092713924168720041 +1572 6 5.98878431 0.011215686798095703 0.00012579163035297825 +1573 5 5.653162 0.65316200256347656 0.42662060159273096 +1574 4 5.28284025 1.2828402519226074 1.6456791119528589 +1575 6 5.921736 0.078264236450195313 0.0061252907071320806 +1576 6 5.4334197 0.56658029556274414 0.32101323131996651 +1577 4 4.55412769 0.55412769317626953 0.30705750034485391 +1578 5 5.47052336 0.47052335739135742 0.22139222985083507 +1579 4 4.95065 0.95065021514892578 0.90373583156269888 +1580 5 4.83012533 0.16987466812133789 0.028857402869334692 +1581 6 5.79309464 0.20690536499023438 0.042809830061742105 +1582 7 6.382326 0.61767387390136719 0.38152101450032205 +1583 5 5.47052336 0.47052335739135742 0.22139222985083507 +1584 6 5.36747742 0.6325225830078125 0.40008481801487505 +1585 5 5.183105 0.1831049919128418 0.03352743806340186 +1586 5 5.07949257 0.079492568969726563 0.0063190685214067344 +1587 6 5.36747742 0.6325225830078125 0.40008481801487505 +1588 5 5.183105 0.1831049919128418 0.03352743806340186 +1589 6 6.20743036 0.20743036270141602 0.043027355370441001 +1590 6 6.254276 0.25427579879760742 0.064656181854161332 +1591 6 6.23296738 0.23296737670898438 0.054273798610665835 +1592 6 5.70682764 0.29317235946655273 0.085950032355185613 +1593 6 5.682406 0.31759405136108398 0.10086598145994685 +1594 6 5.50038338 0.49961662292480469 0.24961676990278647 +1595 6 5.378048 0.62195205688476563 0.38682436106319074 +1596 5 5.471547 0.47154712677001953 0.22235669276506087 +1597 6 5.378048 0.62195205688476563 0.38682436106319074 +1598 6 5.786599 0.21340084075927734 0.045539918836766446 +1599 6 5.995114 0.0048861503601074219 2.3874465341577888E-05 +1600 6 5.50038338 0.49961662292480469 0.24961676990278647 +1601 6 5.7212 0.27880001068115234 0.077729445955810661 +1602 5 6.388898 1.3888978958129883 1.9290373649937465 +1603 7 6.34934 0.65066003799438477 0.42335848504285423 +1604 5 5.23386431 0.23386430740356445 0.054692514277348891 +1605 9 7.51498842 1.4850115776062012 2.2052593856244584 +1606 6 6.256978 0.25697803497314453 0.066037710458658694 +1607 7 6.41602325 0.58397674560546875 0.34102883940795437 +1608 5 5.227486 0.22748613357543945 0.051749940969102681 +1609 7 6.09239149 0.9076085090637207 0.82375320572486999 +1610 6 6.256978 0.25697803497314453 0.066037710458658694 +1611 6 5.482277 0.51772308349609375 0.26803719118470326 +1612 7 6.301487 0.69851303100585938 0.48792045448499266 +1613 7 6.70857239 0.2914276123046875 0.084930053213611245 +1614 5 5.67042351 0.67042350769042969 0.44946767966393963 +1615 6 6.16949129 0.16949129104614258 0.028727297740488211 +1616 6 5.23981476 0.76018524169921875 0.57788160169729963 +1617 6 5.620055 0.37994480133056641 0.14435805205812358 +1618 6 5.42863655 0.57136344909667969 0.32645619096365408 +1619 8 7.24344873 0.75655126571655273 0.57236981765731798 +1620 7 6.301487 0.69851303100585938 0.48792045448499266 +1621 5 4.877641 0.12235879898071289 0.014971675688002506 +1622 6 5.1973033 0.80269670486450195 0.64432200000032935 +1623 6 6.01609564 0.016095638275146484 0.00025906957148436049 +1624 7 6.30074549 0.69925451278686523 0.48895687365279628 +1625 6 5.95052862 0.049471378326416016 0.0024474172735153843 +1626 6 5.89849854 0.10150146484375 0.010302547365427017 +1627 5 4.877641 0.12235879898071289 0.014971675688002506 +1628 6 5.86008358 0.13991641998291016 0.0195766045808341 +1629 6 5.651425 0.34857511520385742 0.12150461093938247 +1630 5 5.21269 0.21268987655639648 0.045236983589575175 +1631 6 5.86008358 0.13991641998291016 0.0195766045808341 +1632 8 7.2880435 0.71195650100708008 0.50688205932624442 +1633 7 6.217728 0.7822718620300293 0.61194926612392919 +1634 6 5.67150831 0.3284916877746582 0.10790678893704353 +1635 6 5.516388 0.483612060546875 0.23388062510639429 +1636 5 5.21493769 0.21493768692016602 0.046198209258591305 +1637 6 6.02342 0.023419857025146484 0.00054848970307830314 +1638 5 5.076503 0.076502799987792969 0.0058526784059722559 +1639 5 5.92867231 0.92867231369018555 0.86243226621468239 +1640 5 5.21493769 0.21493768692016602 0.046198209258591305 +1641 6 5.908219 0.091781139373779297 0.0084237775447491003 +1642 7 6.565082 0.43491792678833008 0.18915360304185924 +1643 7 5.79451656 1.2054834365844727 1.4531903158795103 +1644 7 6.565082 0.43491792678833008 0.18915360304185924 +1645 7 6.00915 0.99084997177124023 0.98178366655906757 +1646 6 5.908219 0.091781139373779297 0.0084237775447491003 +1647 7 6.117744 0.88225603103637695 0.77837570430006053 +1648 5 5.75815058 0.75815057754516602 0.57479229823206879 +1649 4 4.91885138 0.91885137557983398 0.84428785040495313 +1650 7 6.6463275 0.35367250442504883 0.12508424038628618 +1651 6 5.18333 0.81666994094848633 0.66694979244880415 +1652 4 5.41829157 1.4182915687561035 2.0115509740046491 +1653 6 5.86178446 0.13821554183959961 0.01910353600601411 +1654 5 5.20454645 0.20454645156860352 0.041839250849307064 +1655 5 5.36041641 0.36041641235351563 0.12989999029377941 +1656 5 5.37715673 0.37715673446655273 0.14224720235347377 +1657 6 6.272336 0.27233600616455078 0.074166900253658241 +1658 5 5.17258549 0.17258548736572266 0.029785750449264015 +1659 5 5.2393117 0.23931169509887695 0.057270087411097848 +1660 6 5.30503654 0.69496345520019531 0.48297420406379388 +1661 6 5.5524416 0.44755840301513672 0.20030852410945954 +1662 7 6.02084 0.97915983200073242 0.95875397660370254 +1663 6 5.86178446 0.13821554183959961 0.01910353600601411 +1664 4 5.09628 1.0962800979614258 1.2018300531863133 +1665 8 7.22773361 0.77226638793945313 0.59639537394104991 +1666 5 4.93944645 0.060553550720214844 0.0036667325048256316 +1667 6 5.8606534 0.13934659957885742 0.019417474814190427 +1668 7 6.10476971 0.89523029327392578 0.80143727799531916 +1669 6 5.03797865 0.9620213508605957 0.92548507951164538 +1670 6 5.59164524 0.40835475921630859 0.16675360937460937 +1671 7 6.882999 0.11700105667114258 0.013689247262163917 +1672 5 5.59216356 0.5921635627746582 0.35065768507797657 +1673 5 5.51849842 0.51849842071533203 0.26884061228429346 +1674 6 5.934598 0.065402030944824219 0.0042774256517077447 +1675 5 5.248185 0.24818515777587891 0.061595872540237906 +1676 7 6.882999 0.11700105667114258 0.013689247262163917 +1677 6 6.154132 0.15413188934326172 0.023756639312523475 +1678 6 6.01720238 0.017202377319335938 0.00029592178543680348 +1679 5 5.416397 0.4163970947265625 0.17338654049672186 +1680 5 5.22387362 0.22387361526489258 0.050119395611773143 +1681 6 6.222181 0.22218084335327148 0.049364327153170962 +1682 7 6.552593 0.44740676879882813 0.20017281676700804 +1683 7 6.552593 0.44740676879882813 0.20017281676700804 +1684 7 6.147742 0.85225820541381836 0.72634404869518221 +1685 7 6.552593 0.44740676879882813 0.20017281676700804 +1686 5 5.913256 0.91325616836547852 0.83403682905759524 +1687 7 6.147742 0.85225820541381836 0.72634404869518221 +1688 3 4.05032873 1.0503287315368652 1.1031904442918403 +1689 6 6.512403 0.51240301132202148 0.26255684601187568 +1690 4 4.340952 0.34095191955566406 0.11624821144869202 +1691 7 6.552593 0.44740676879882813 0.20017281676700804 +1692 6 6.273069 0.27306890487670898 0.07456662681056514 +1693 5 5.412921 0.41292095184326172 0.17050371247114526 +1694 6 5.885221 0.11477899551391602 0.013174217811183553 +1695 6 6.52959633 0.52959632873535156 0.28047227140996256 +1696 6 5.40495539 0.59504461288452148 0.35407809132289003 +1697 6 6.019387 0.019386768341064453 0.00037584678671009897 +1698 6 6.273069 0.27306890487670898 0.07456662681056514 +1699 6 6.10461664 0.10461664199829102 0.010944641782998588 +1700 6 5.73511171 0.26488828659057617 0.070165804372891216 +1701 5 5.65722847 0.65722846984863281 0.43194926157957525 +1702 4 4.538543 0.5385432243347168 0.2900288044768331 +1703 5 5.31020069 0.31020069122314453 0.096224468835316657 +1704 5 5.31020069 0.31020069122314453 0.096224468835316657 +1705 6 6.40745354 0.40745353698730469 0.16601838480346487 +1706 6 6.12257051 0.12257051467895508 0.015023531068663942 +1707 5 5.19459629 0.19459629058837891 0.037867716310756805 +1708 4 4.698 0.69799995422363281 0.4872039360961935 +1709 5 5.6977067 0.69770669937133789 0.48679463834764647 +1710 5 5.070458 0.070457935333251953 0.004964320651424714 +1711 5 6.22978067 1.2297806739807129 1.5123605060964564 +1712 6 5.730933 0.26906681060791016 0.072396948570712993 +1713 6 5.36452341 0.63547658920288086 0.40383049542492699 +1714 5 5.384505 0.38450479507446289 0.1478439374352547 +1715 8 7.081153 0.91884708404541016 0.84427996385875304 +1716 6 6.10853767 0.10853767395019531 0.011780426666518906 +1717 6 5.4734683 0.52653169631958008 0.2772356272291745 +1718 4 4.947448 0.94744777679443359 0.89765728975271486 +1719 6 5.783446 0.21655416488647461 0.046895706329678433 +1720 7 6.25786257 0.74213743209838867 0.55076796812159046 +1721 7 6.4139185 0.58608150482177734 0.34349153029415902 +1722 6 6.32412243 0.32412242889404297 0.10505534891217394 +1723 8 7.081153 0.91884708404541016 0.84427996385875304 +1724 6 6.30066347 0.30066347122192383 0.090398522927216618 +1725 6 5.754034 0.24596595764160156 0.060499252318550134 +1726 6 6.520613 0.52061319351196289 0.27103809725872452 +1727 6 5.98238945 0.017610549926757813 0.0003101314687228296 +1728 5 5.384505 0.38450479507446289 0.1478439374352547 +1729 6 6.46460056 0.46460056304931641 0.21585368318574183 +1730 6 5.518448 0.4815521240234375 0.23189244815148413 +1731 6 5.678014 0.32198619842529297 0.10367511197637214 +1732 5 5.49025154 0.49025154113769531 0.24034657358788536 +1733 6 5.878735 0.12126493453979492 0.014705184348940747 +1734 6 5.746217 0.25378322601318359 0.064405925805658626 +1735 6 6.333721 0.33372116088867188 0.11136981322488282 +1736 5 5.36819935 0.36819934844970703 0.13557076019878878 +1737 6 5.746217 0.25378322601318359 0.064405925805658626 +1738 5 5.43976355 0.43976354598999023 0.19339197638169026 +1739 4 4.2871747 0.28717470169067383 0.082469309291127502 +1740 6 5.2528553 0.74714469909667969 0.55822520138826803 +1741 6 6.82206631 0.82206630706787109 0.67579301321620733 +1742 6 5.62115145 0.37884855270385742 0.14352622588580743 +1743 6 5.6809206 0.31907939910888672 0.10181166293568822 +1744 5 5.759692 0.75969219207763672 0.57713222670372488 +1745 5 5.11411858 0.11411857604980469 0.013023049399635056 +1746 5 5.80971241 0.80971240997314453 0.65563418686451769 +1747 6 5.6809206 0.31907939910888672 0.10181166293568822 +1748 5 5.64571142 0.64571142196655273 0.41694324045806752 +1749 6 5.94423151 0.055768489837646484 0.0031101244587716792 +1750 6 6.285816 0.28581619262695313 0.081690895967767574 +1751 7 6.485704 0.51429605484008789 0.26450043202407869 +1752 6 5.63064766 0.36935234069824219 0.13642115157927037 +1753 7 6.43418837 0.5658116340637207 0.32014280524185779 +1754 6 6.579439 0.57943916320800781 0.33574974385919631 +1755 6 5.62115145 0.37884855270385742 0.14352622588580743 +1756 5 5.163484 0.16348409652709961 0.026727049817282023 +1757 5 5.04545259 0.045452594757080078 0.0020659383701513434 +1758 5 5.160804 0.16080379486083984 0.025857860441647063 +1759 5 5.12348461 0.12348461151123047 0.015248449280079512 +1760 6 5.661794 0.33820581436157227 0.11438317286797428 +1761 6 5.71764851 0.28235149383544922 0.079722366071109718 +1762 7 6.49546671 0.50453329086303711 0.25455384158908601 +1763 6 5.75959873 0.24040126800537109 0.057792769658590259 +1764 5 5.163484 0.16348409652709961 0.026727049817282023 +1765 5 5.04545259 0.045452594757080078 0.0020659383701513434 +1766 5 5.096784 0.096784114837646484 0.0093671648849067424 +1767 5 5.053221 0.053221225738525391 0.0028324988691110775 +1768 5 5.07901 0.079010009765625 0.0062425816431641579 +1769 7 6.85152245 0.14847755432128906 0.022045584137231344 +1770 6 5.873308 0.12669181823730469 0.016050816808274249 +1771 6 6.204919 0.20491886138916016 0.041991739753029833 +1772 6 5.873308 0.12669181823730469 0.016050816808274249 +1773 6 5.873308 0.12669181823730469 0.016050816808274249 +1774 6 6.087834 0.087833881378173828 0.0077147907179551112 +1775 6 6.2735157 0.27351570129394531 0.074810838854318717 +1776 5 5.410328 0.41032791137695313 0.1683689948549727 +1777 6 6.204919 0.20491886138916016 0.041991739753029833 +1778 8 7.307756 0.69224405288696289 0.47920182875736828 +1779 8 7.307756 0.69224405288696289 0.47920182875736828 +1780 5 5.72046137 0.72046136856079102 0.51906458358848795 +1781 4 4.912416 0.91241598129272461 0.83250292291836558 +1782 6 6.076927 0.07692718505859375 0.0059177918010391295 +1783 6 4.881966 1.1180338859558105 1.2499997701454504 +1784 7 6.59484243 0.40515756607055664 0.16415265334421747 +1785 6 6.076927 0.07692718505859375 0.0059177918010391295 +1786 7 6.360997 0.63900279998779297 0.40832457839223935 +1787 7 7.01656771 0.016567707061767578 0.00027448891728454328 +1788 5 6.143606 1.1436061859130859 1.3078351084586757 +1789 7 6.33957958 0.66042041778564453 0.43615512822816527 +1790 5 5.29969263 0.29969263076782227 0.089815672936538249 +1791 5 5.249451 0.2494511604309082 0.062225881440326702 +1792 6 5.723403 0.27659702301025391 0.076505913138134929 +1793 5 5.207859 0.20785903930664063 0.043205380221479572 +1794 5 5.19692469 0.19692468643188477 0.03877933212629614 +1795 6 5.24541235 0.75458765029907227 0.56940252198387498 +1796 5 6.265488 1.2654881477355957 1.6014602520592689 +1797 8 6.965482 1.034517765045166 1.0702270061940453 +1798 6 5.884701 0.11529922485351563 0.013293911251821555 +1799 6 5.82440472 0.17559528350830078 0.030833703590360528 +1800 6 5.29319572 0.70680427551269531 0.4995722838830261 +1801 5 4.91377449 0.086225509643554688 0.0074348385132907424 +1802 6 5.884701 0.11529922485351563 0.013293911251821555 +1803 6 5.82440472 0.17559528350830078 0.030833703590360528 +1804 6 5.29319572 0.70680427551269531 0.4995722838830261 +1805 5 5.04264 0.042640209197998047 0.0018181874404490372 +1806 5 5.02612352 0.026123523712158203 0.00068243849113969191 +1807 6 6.09280062 0.092800617218017578 0.0086119545560450206 +1808 5 5.04264 0.042640209197998047 0.0018181874404490372 +1809 6 6.09280062 0.092800617218017578 0.0086119545560450206 +1810 6 5.255104 0.74489593505859375 0.55486995406681672 +1811 5 5.02612352 0.026123523712158203 0.00068243849113969191 +1812 6 6.23844051 0.23844051361083984 0.056853878531001101 +1813 6 6.055648 0.055647850036621094 0.0030966832136982703 +1814 7 6.84700155 0.15299844741821289 0.023408524912383655 +1815 6 5.847058 0.15294218063354492 0.023391310616943883 +1816 7 6.807296 0.19270420074462891 0.037134908984626236 +1817 4 4.387817 0.3878169059753418 0.1504019525602871 +1818 6 6.41068125 0.41068124771118164 0.16865908722161294 +1819 6 6.407588 0.40758800506591797 0.16612798187361477 +1820 6 5.847058 0.15294218063354492 0.023391310616943883 +1821 5 5.86094856 0.86094856262207031 0.74123242748100893 +1822 7 6.84700155 0.15299844741821289 0.023408524912383655 +1823 6 5.91580439 0.084195613861083984 0.0070889013934447576 +1824 5 4.94229841 0.057701587677001953 0.0033294732204467437 +1825 5 5.17851543 0.17851543426513672 0.031867760270870349 +1826 5 4.94229841 0.057701587677001953 0.0033294732204467437 +1827 6 5.91580439 0.084195613861083984 0.0070889013934447576 +1828 6 5.984389 0.015611171722412109 0.00024370868254663947 +1829 7 6.62336445 0.37663555145263672 0.14185433861803176 +1830 7 6.62336445 0.37663555145263672 0.14185433861803176 +1831 7 6.98497629 0.015023708343505859 0.00022571181239072757 +1832 7 6.62336445 0.37663555145263672 0.14185433861803176 +1833 7 6.98497629 0.015023708343505859 0.00022571181239072757 +1834 6 5.795934 0.20406579971313477 0.041642850612561233 +1835 5 4.829798 0.17020177841186523 0.028968645374561675 +1836 6 5.89136076 0.10863924026489258 0.011802484525333057 +1837 7 6.92395926 0.076040744781494141 0.0057821948669243284 +1838 6 5.541737 0.45826292037963867 0.21000490419487505 +1839 6 5.89136076 0.10863924026489258 0.011802484525333057 +1840 5 6.09481955 1.0948195457458496 1.1986298377471485 +1841 7 6.92395926 0.076040744781494141 0.0057821948669243284 +1842 6 6.06164074 0.061640739440917969 0.0037995807588231401 +1843 6 6.09501934 0.095019340515136719 0.0090286750719315023 +1844 6 6.220677 0.22067689895629883 0.048698293732968523 +1845 5 5.0563755 0.056375503540039063 0.0031781973993929569 +1846 5 5.255092 0.25509214401245117 0.065072001936869128 +1847 5 5.0563755 0.056375503540039063 0.0031781973993929569 +1848 5 5.009955 0.0099549293518066406 9.9100618399461382E-05 +1849 6 5.931581 0.068418979644775391 0.0046811567756321892 +1850 7 5.88479948 1.1152005195617676 1.2436721988308364 +1851 6 6.220677 0.22067689895629883 0.048698293732968523 +1852 7 6.638763 0.3612370491027832 0.1304922056444866 +1853 5 5.22545147 0.22545146942138672 0.050828365064262471 +1854 7 6.01192665 0.98807334899902344 0.97628894300214597 +1855 6 5.9560647 0.043935298919677734 0.0019303104911614355 +1856 4 4.10342932 0.10342931747436523 0.010697623713213034 +1857 5 4.620319 0.37968111038208008 0.14415774558096928 +1858 5 4.919397 0.080603122711181641 0.0064968633907938056 +1859 6 5.9560647 0.043935298919677734 0.0019303104911614355 +1860 6 6.04375 0.043749809265136719 0.0019140458107358427 +1861 6 6.03792238 0.037922382354736328 0.0014381070834588172 +1862 7 6.806666 0.19333410263061523 0.037378075239985264 +1863 5 5.32885742 0.328857421875 0.10814720392227173 +1864 6 6.014627 0.014626979827880859 0.00021394853888523357 +1865 6 5.269379 0.7306208610534668 0.53380684260650924 +1866 6 5.62850952 0.371490478515625 0.13800517562776804 +1867 6 6.451072 0.45107221603393555 0.20346614407776542 +1868 7 6.66807175 0.33192825317382813 0.11017636525502894 +1869 7 6.102109 0.89789104461669922 0.80620832800286735 +1870 6 5.899302 0.10069799423217773 0.0101400860423837 +1871 6 5.88717651 0.112823486328125 0.012729139067232609 +1872 5 5.08207035 0.082070350646972656 0.0067355424553170451 +1873 5 5.08207035 0.082070350646972656 0.0067355424553170451 +1874 5 5.97225142 0.97225141525268555 0.94527281446084999 +1875 5 5.113133 0.11313295364379883 0.012799065200169935 +1876 6 6.020215 0.020215034484863281 0.00040864761922421167 +1877 6 6.050329 0.050329208374023438 0.0025330292155558709 +1878 6 5.714985 0.28501510620117188 0.081233610762865283 +1879 6 5.87600851 0.12399148941040039 0.015373889446209432 +1880 5 5.345978 0.345977783203125 0.11970062647014856 +1881 6 5.87600851 0.12399148941040039 0.015373889446209432 +1882 5 5.345978 0.345977783203125 0.11970062647014856 +1883 5 5.345978 0.345977783203125 0.11970062647014856 +1884 5 6.06035852 1.0603585243225098 1.1243602001034105 +1885 6 5.87600851 0.12399148941040039 0.015373889446209432 +1886 5 4.68862867 0.3113713264465332 0.096952102933073547 +1887 5 5.749301 0.74930095672607422 0.56145192375061015 +1888 5 5.445546 0.44554615020751953 0.19851137196474156 +1889 5 5.742894 0.74289417266845703 0.55189175178475125 +1890 5 5.345978 0.345977783203125 0.11970062647014856 +1891 5 5.36257029 0.36257028579711914 0.13145721214300465 +1892 5 5.08076429 0.080764293670654297 0.0065228711321196897 +1893 5 5.08076429 0.080764293670654297 0.0065228711321196897 +1894 5 5.25159 0.25158977508544922 0.063297414927546924 +1895 6 5.80944967 0.19055032730102539 0.036309427234527902 +1896 6 5.24799 0.75200986862182617 0.56551884250461626 +1897 6 5.24799 0.75200986862182617 0.56551884250461626 +1898 6 5.155396 0.8446040153503418 0.7133559427459204 +1899 7 6.94139671 0.058603286743164063 0.0034343452171015088 +1900 6 5.823166 0.1768341064453125 0.031270301202312112 +1901 5 5.69784641 0.69784641265869141 0.48698961566060461 +1902 6 5.729632 0.27036809921264648 0.073098909071859453 +1903 5 5.36386776 0.36386775970458984 0.13239974655243714 +1904 6 5.80944967 0.19055032730102539 0.036309427234527902 +1905 6 5.24799 0.75200986862182617 0.56551884250461626 +1906 5 5.558832 0.55883216857910156 0.31229339263882139 +1907 7 6.79576731 0.20423269271850586 0.041710992775051636 +1908 7 6.680592 0.31940793991088867 0.10202143207811787 +1909 5 5.67669249 0.67669248580932617 0.4579127203508051 +1910 5 5.4686 0.46859979629516602 0.21958576908787109 +1911 6 5.70000124 0.29999876022338867 0.089999256135570249 +1912 6 5.850281 0.14971923828125 0.022415850311517715 +1913 6 5.388945 0.61105489730834961 0.37338808752451769 +1914 6 6.44605 0.44605016708374023 0.19896075155543258 +1915 7 6.680592 0.31940793991088867 0.10202143207811787 +1916 5 5.4686 0.46859979629516602 0.21958576908787109 +1917 6 5.70000124 0.29999876022338867 0.089999256135570249 +1918 6 5.7495923 0.25040769577026367 0.062704014100972927 +1919 6 5.886413 0.1135869026184082 0.012901984446443748 +1920 7 5.743813 1.2561869621276855 1.5780056838195833 +1921 5 5.67669249 0.67669248580932617 0.4579127203508051 +1922 5 5.669428 0.66942787170410156 0.44813367541428306 +1923 5 4.989098 0.010901927947998047 0.00011885203298334091 +1924 4 4.73279762 0.73279762268066406 0.5369923558064329 +1925 6 5.83154726 0.16845273971557617 0.028376325517683654 +1926 6 5.64685774 0.35314226150512695 0.12470945686095547 +1927 5 5.77821064 0.77821063995361328 0.60561180013701232 +1928 6 5.857794 0.14220619201660156 0.020222601047862554 +1929 5 5.54489565 0.54489564895629883 0.29691126825150604 +1930 6 5.84882736 0.15117263793945313 0.022853166461572982 +1931 3 3.392923 0.39292311668395996 0.15438857562463681 +1932 6 5.1673274 0.8326725959777832 0.69334365209238058 +1933 5 5.02177858 0.021778583526611328 0.00047430670042558631 +1934 6 5.9227314 0.077268600463867188 0.0059704366176447365 +1935 5 5.54489565 0.54489564895629883 0.29691126825150604 +1936 6 5.84882736 0.15117263793945313 0.022853166461572982 +1937 7 6.28827858 0.71172142028808594 0.50654738009689027 +1938 5 5.794291 0.79429101943969727 0.63089822356255354 +1939 5 5.254755 0.25475502014160156 0.064900120287347818 +1940 5 5.00748158 0.0074815750122070313 5.597396466328064E-05 +1941 5 5.254755 0.25475502014160156 0.064900120287347818 +1942 5 5.00748158 0.0074815750122070313 5.597396466328064E-05 +1943 5 5.58706045 0.58706045150756836 0.34463997372427002 +1944 5 4.965873 0.034127235412597656 0.0011646681969068595 +1945 6 5.76166153 0.23833847045898438 0.056805226500728168 +1946 6 5.283599 0.71640110015869141 0.5132305363085834 +1947 5 4.965873 0.034127235412597656 0.0011646681969068595 +1948 7 6.313704 0.68629598617553711 0.47100218064065302 +1949 5 5.20408154 0.20408153533935547 0.041649273066468595 +1950 5 5.35217953 0.35217952728271484 0.12403041943707649 +1951 4 4.37076139 0.37076139450073242 0.13746401165212774 +1952 7 6.63146448 0.36853551864624023 0.13581842850385328 +1953 6 6.311296 0.31129598617553711 0.096905191009000191 +1954 5 5.35217953 0.35217952728271484 0.12403041943707649 +1955 5 5.34369326 0.34369325637817383 0.11812505447983312 +1956 5 5.299818 0.29981803894042969 0.089890856474085012 +1957 6 5.87184048 0.12815952301025391 0.0164248633382158 +1958 6 5.689827 0.31017303466796875 0.096207311435136944 +1959 5 4.98411274 0.015887260437011719 0.00025240504419343779 +1960 5 4.98411274 0.015887260437011719 0.00025240504419343779 +1961 5 5.12694454 0.12694454193115234 0.016114916726110096 +1962 5 5.295978 0.29597806930541992 0.087603017509763959 +1963 6 5.689827 0.31017303466796875 0.096207311435136944 +1964 5 5.230468 0.23046779632568359 0.053115405143216776 +1965 6 5.40837 0.59162998199462891 0.35002603559496492 +1966 6 5.723364 0.27663612365722656 0.076527544912096346 +1967 7 5.95787 1.0421299934387207 1.0860349232245881 +1968 6 6.14720058 0.14720058441162109 0.021668012051122787 +1969 7 6.716495 0.28350496292114258 0.080375064000918428 +1970 6 5.717197 0.28280305862426758 0.079977569967240925 +1971 7 6.716495 0.28350496292114258 0.080375064000918428 +1972 5 5.58269548 0.58269548416137695 0.3395340272620615 +1973 5 5.138886 0.1388859748840332 0.019289314019488302 +1974 5 5.138886 0.1388859748840332 0.019289314019488302 +1975 6 5.42846346 0.57153654098510742 0.32665401768122138 +1976 5 5.39033556 0.3903355598449707 0.15236184927948671 +1977 6 5.720798 0.27920198440551758 0.077953748095978881 +1978 6 5.35937166 0.64062833786010742 0.41040466726940394 +1979 6 5.30258036 0.69741964340209961 0.48639415900311178 +1980 8 7.68329954 0.31670045852661133 0.10029918043096586 +1981 8 7.68329954 0.31670045852661133 0.10029918043096586 +1982 8 7.68329954 0.31670045852661133 0.10029918043096586 +1983 8 7.68329954 0.31670045852661133 0.10029918043096586 +1984 8 7.68329954 0.31670045852661133 0.10029918043096586 +1985 6 6.075756 0.075756072998046875 0.0057389825960854068 +1986 6 5.96010828 0.039891719818115234 0.0015913493100470077 +1987 5 5.86364174 0.86364173889160156 0.74587705315570929 +1988 6 5.943341 0.056659221649169922 0.0032102673978897656 +1989 7 6.692215 0.3077850341796875 0.094731627264991403 +1990 4 4.806215 0.80621480941772461 0.64998231892445801 +1991 8 7.68329954 0.31670045852661133 0.10029918043096586 +1992 5 5.80926657 0.80926656723022461 0.65491237683659165 +1993 6 5.71915674 0.28084325790405273 0.078872935510162279 +1994 6 5.90227032 0.097729682922363281 0.0095510909241056652 +1995 6 6.130645 0.13064479827880859 0.017068063317310589 +1996 6 5.90227032 0.097729682922363281 0.0095510909241056652 +1997 6 6.130645 0.13064479827880859 0.017068063317310589 +1998 6 6.130645 0.13064479827880859 0.017068063317310589 +1999 6 6.572855 0.57285499572753906 0.3281628461299988 +2000 5 5.113103 0.11310291290283203 0.012792268907105608 +2001 5 5.03617239 0.036172389984130859 0.0013084417971640505 +2002 6 6.53848076 0.53848075866699219 0.28996152745457948 +2003 6 5.71915674 0.28084325790405273 0.078872935510162279 +2004 6 5.98823071 0.011769294738769531 0.00013851629864802817 +2005 6 5.90227032 0.097729682922363281 0.0095510909241056652 +2006 6 6.130645 0.13064479827880859 0.017068063317310589 +2007 6 5.986577 0.013422966003417969 0.00018017601632891456 +2008 5 5.262037 0.26203680038452148 0.068663284755757559 +2009 7 6.89477158 0.10522842407226563 0.011073021232732572 +2010 6 6.091445 0.091444969177246094 0.0083621823878274881 +2011 5 5.262037 0.26203680038452148 0.068663284755757559 +2012 5 5.99970531 0.99970531463623047 0.99941071611192456 +2013 6 5.64873266 0.35126733779907227 0.12338874260444754 +2014 5 5.20198536 0.20198535919189453 0.040798085327878653 +2015 6 6.13061333 0.13061332702636719 0.017059841196896741 +2016 7 7.07036066 0.070360660552978516 0.004950622553451467 +2017 5 5.20198536 0.20198535919189453 0.040798085327878653 +2018 7 6.070636 0.92936420440673828 0.86371782443256961 +2019 6 5.64873266 0.35126733779907227 0.12338874260444754 +2020 6 5.99316072 0.0068392753601074219 4.6775687451372505E-05 +2021 6 5.798797 0.2012028694152832 0.040482594660943505 +2022 6 5.55679941 0.44320058822631836 0.1964267614041546 +2023 6 5.798797 0.2012028694152832 0.040482594660943505 +2024 5 4.847904 0.15209579467773438 0.023133130758651532 +2025 5 5.08376265 0.083762645721435547 0.0070161808182547247 +2026 5 4.944269 0.055730819702148438 0.0031059242646733765 +2027 5 5.070517 0.070517063140869141 0.0049726561940133251 +2028 6 5.94484043 0.055159568786621094 0.003042578028725984 +2029 6 5.55679941 0.44320058822631836 0.1964267614041546 +2030 6 5.885327 0.11467313766479492 0.013149928501889008 +2031 5 5.854764 0.85476398468017578 0.73062146950633178 +2032 6 5.80357075 0.19642925262451172 0.038584451286624244 +2033 5 5.78247929 0.78247928619384766 0.61227383332243335 +2034 5 5.584074 0.58407402038574219 0.34114246128956438 +2035 5 5.391613 0.39161300659179688 0.15336074693186674 +2036 6 5.683799 0.31620121002197266 0.099983205219359661 +2037 5 5.854764 0.85476398468017578 0.73062146950633178 +2038 5 5.47931051 0.47931051254272461 0.22973856743396937 +2039 5 5.10026169 0.10026168823242188 0.010052406127215363 +2040 6 5.587714 0.41228580474853516 0.16997958479714725 +2041 5 5.47931051 0.47931051254272461 0.22973856743396937 +2042 6 5.59508228 0.40491771697998047 0.16395835752427956 +2043 6 6.188592 0.18859195709228516 0.035566926279898325 +2044 6 5.51965761 0.48034238815307617 0.23072880985660049 +2045 5 5.10026169 0.10026168823242188 0.010052406127215363 +2046 5 5.27681828 0.27681827545166016 0.076628357624031196 +2047 5 5.202298 0.20229816436767578 0.040924547306531167 +2048 5 5.22819233 0.22819232940673828 0.052071739200073353 +2049 7 5.916048 1.0839519500732422 1.1749518300675845 +2050 3 4.86571169 1.8657116889953613 3.4808801064539239 +2051 5 5.301681 0.3016810417175293 0.091011450931773652 +2052 5 5.301681 0.3016810417175293 0.091011450931773652 +2053 5 5.82433939 0.82433938980102539 0.67953542957752688 +2054 5 5.82433939 0.82433938980102539 0.67953542957752688 +2055 6 6.10678625 0.10678625106811523 0.011403303417182542 +2056 5 5.301681 0.3016810417175293 0.091011450931773652 +2057 7 6.74051332 0.25948667526245117 0.067333334638760789 +2058 5 5.39320326 0.3932032585144043 0.15460880250634546 +2059 5 5.17256451 0.17256450653076172 0.029778508914205304 +2060 5 5.469499 0.46949911117553711 0.22042941539461935 +2061 6 6.131151 0.13115119934082031 0.017200637088535586 +2062 5 6.16290665 1.1629066467285156 1.3523518690053606 +2063 5 5.51166773 0.51166772842407227 0.26180386431065017 +2064 6 5.94528627 0.054713726043701172 0.0029935918175851839 +2065 5 5.34100866 0.34100866317749023 0.11628690836209898 +2066 5 5.42366552 0.42366552352905273 0.17949247582714634 +2067 5 5.42366552 0.42366552352905273 0.17949247582714634 +2068 6 6.36523342 0.36523342132568359 0.13339545205326431 +2069 7 6.286891 0.71310901641845703 0.50852446929729922 +2070 6 5.28514051 0.7148594856262207 0.51102408418978484 +2071 6 6.005229 0.0052289962768554688 2.7342402063368354E-05 +2072 5 5.93074942 0.93074941635131836 0.86629447603831977 +2073 5 5.35567665 0.35567665100097656 0.12650588006727048 +2074 6 5.94528627 0.054713726043701172 0.0029935918175851839 +2075 5 5.51166773 0.51166772842407227 0.26180386431065017 +2076 5 5.118412 0.11841201782226563 0.014021405964740552 +2077 6 5.855995 0.14400482177734375 0.020737388695124537 +2078 6 6.076282 0.076282024383544922 0.005818947244051742 +2079 4 5.34362173 1.3436217308044434 1.8053193554899281 +2080 5 5.118412 0.11841201782226563 0.014021405964740552 +2081 5 5.451315 0.45131492614746094 0.20368516256348812 +2082 6 5.66807032 0.33192968368530273 0.11017731491142513 +2083 5 5.27994061 0.27994060516357422 0.078366742419348157 +2084 6 6.06697464 0.066974639892578125 0.0044856023887405172 +2085 6 6.06697464 0.066974639892578125 0.0044856023887405172 +2086 5 5.50176668 0.50176668167114258 0.25176980283526973 +2087 6 6.04193258 0.041932582855224609 0.0017583415049102769 +2088 6 5.73626757 0.2637324333190918 0.069554796384409201 +2089 6 6.06697464 0.066974639892578125 0.0044856023887405172 +2090 5 5.283904 0.28390407562255859 0.080601524155099469 +2091 5 5.375473 0.3754730224609375 0.14097999059595168 +2092 5 5.079679 0.079679012298583984 0.0063487450008778978 +2093 5 5.1351285 0.13512849807739258 0.01825971099265189 +2094 5 5.1351285 0.13512849807739258 0.01825971099265189 +2095 5 5.338806 0.33880615234375 0.11478960886597633 +2096 5 4.8727994 0.12720060348510742 0.016179993526975522 +2097 5 5.54609776 0.54609775543212891 0.29822275848800928 +2098 6 6.14330435 0.14330434799194336 0.020536136153396001 +2099 5 5.527509 0.52750921249389648 0.27826596926593083 +2100 5 5.54609776 0.54609775543212891 0.29822275848800928 +2101 6 6.23822355 0.23822355270385742 0.056750461062847535 +2102 5 5.32251453 0.32251453399658203 0.10401562463903247 +2103 5 5.34272051 0.34272050857543945 0.11745734699820787 +2104 5 5.527509 0.52750921249389648 0.27826596926593083 +2105 5 4.8727994 0.12720060348510742 0.016179993526975522 +2106 5 5.035476 0.035476207733154297 0.0012585613151259167 +2107 6 5.93114567 0.068854331970214844 0.0047409190310645499 +2108 6 6.14330435 0.14330434799194336 0.020536136153396001 +2109 6 5.92951775 0.070482254028320313 0.0049677481329126749 +2110 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2111 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2112 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2113 5 5.149098 0.14909791946411133 0.022230189588526628 +2114 6 5.92951775 0.070482254028320313 0.0049677481329126749 +2115 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2116 4 5.852532 1.852531909942627 3.4318744773556773 +2117 5 5.57782 0.57781982421875 0.33387574926018715 +2118 6 6.14478445 0.14478445053100586 0.020962537115565283 +2119 4 5.80488253 1.8048825263977051 3.2576009340957626 +2120 5 5.551959 0.55195903778076172 0.30465877938786434 +2121 7 7.031645 0.031644821166992188 0.0010013947066909168 +2122 5 5.3448925 0.34489250183105469 0.11895083781928406 +2123 5 5.551959 0.55195903778076172 0.30465877938786434 +2124 7 7.031645 0.031644821166992188 0.0010013947066909168 +2125 5 5.446592 0.44659185409545898 0.19944428414441973 +2126 5 5.337021 0.3370208740234375 0.11358306952752173 +2127 5 4.86048555 0.13951444625854492 0.019464280714828419 +2128 6 5.56485748 0.43514251708984375 0.18934901017928496 +2129 5 6.24411345 1.2441134452819824 1.5478182647314043 +2130 5 6.119552 1.1195521354675293 1.2533969840299051 +2131 6 5.40368462 0.59631538391113281 0.35559203708908171 +2132 6 5.40368462 0.59631538391113281 0.35559203708908171 +2133 6 6.14214373 0.14214372634887695 0.020204838940344416 +2134 6 6.136567 0.13656711578369141 0.018650577113476174 +2135 5 5.83917761 0.83917760848999023 0.70421905859097933 +2136 6 6.22776365 0.22776365280151367 0.051876281537488467 +2137 5 5.83917761 0.83917760848999023 0.70421905859097933 +2138 5 5.524169 0.52416896820068359 0.27475310722456925 +2139 5 5.025896 0.025896072387695313 0.0006706065651087556 +2140 5 5.2133007 0.21330070495605469 0.045497190734749893 +2141 5 5.2133007 0.21330070495605469 0.045497190734749893 +2142 5 5.309244 0.30924415588378906 0.095631947948277229 +2143 7 6.958703 0.041296958923339844 0.0017054388163160183 +2144 6 5.889221 0.11077880859375 0.012271944433450699 +2145 6 5.70829439 0.29170560836791992 0.085092161953298273 +2146 6 5.921274 0.078725814819335938 0.0061977539189683739 +2147 5 5.40994263 0.409942626953125 0.16805295739322901 +2148 5 5.025896 0.025896072387695313 0.0006706065651087556 +2149 6 6.53269434 0.53269433975219727 0.28376325960402937 +2150 6 6.549871 0.54987096786499023 0.30235808130078112 +2151 5 5.2133007 0.21330070495605469 0.045497190734749893 +2152 6 5.682142 0.31785821914672852 0.10103384747912969 +2153 6 5.77969551 0.22030448913574219 0.048534067933360348 +2154 4 4.248038 0.24803781509399414 0.061522757716602428 +2155 5 5.60414028 0.60414028167724609 0.36498547994506225 +2156 4 5.46349 1.4634900093078613 2.141803007343924 +2157 6 6.10743046 0.10743045806884766 0.011541303320882434 +2158 6 6.07451153 0.074511528015136719 0.0055519678071505041 +2159 4 4.98861456 0.98861455917358398 0.97735874660997979 +2160 6 6.48047829 0.48047828674316406 0.23085938403164619 +2161 7 6.83936453 0.16063547134399414 0.025803754653907163 +2162 6 5.335519 0.66448116302490234 0.44153521601492685 +2163 6 6.10743046 0.10743045806884766 0.011541303320882434 +2164 5 5.37191248 0.37191247940063477 0.13831889233392758 +2165 5 5.199658 0.19965791702270508 0.039863283829845386 +2166 5 5.199658 0.19965791702270508 0.039863283829845386 +2167 7 6.89165068 0.10834932327270508 0.01173957585365315 +2168 7 6.89165068 0.10834932327270508 0.01173957585365315 +2169 7 6.89165068 0.10834932327270508 0.01173957585365315 +2170 7 6.89165068 0.10834932327270508 0.01173957585365315 +2171 7 6.89165068 0.10834932327270508 0.01173957585365315 +2172 5 4.909876 0.090124130249023438 0.0081223588531429414 +2173 5 5.22056675 0.22056674957275391 0.048649691017089935 +2174 7 6.89165068 0.10834932327270508 0.01173957585365315 +2175 7 6.87728834 0.1227116584777832 0.015058151126368102 +2176 5 4.909876 0.090124130249023438 0.0081223588531429414 +2177 7 5.235744 1.7642560005187988 3.1125992353665879 +2178 5 5.22056675 0.22056674957275391 0.048649691017089935 +2179 6 5.972474 0.027525901794433594 0.00075767526959680254 +2180 6 5.27915764 0.72084236145019531 0.51961371006109403 +2181 6 6.10079861 0.10079860687255859 0.010160359147448617 +2182 5 5.40179 0.40179014205932617 0.16143531825605351 +2183 5 5.42879057 0.42879056930541992 0.18386135232526613 +2184 6 5.755803 0.24419689178466797 0.059632121957292838 +2185 7 5.900644 1.0993561744689941 1.2085839983431015 +2186 5 4.90778875 0.092211246490478516 0.0085029139793277864 +2187 5 4.98141146 0.018588542938232422 0.00034553392856651044 +2188 6 5.86708736 0.13291263580322266 0.017665768756160105 +2189 6 6.13499641 0.13499641418457031 0.018224031842692057 +2190 6 6.517881 0.51788091659545898 0.26820064377375274 +2191 5 5.432943 0.43294286727905273 0.18743952632780747 +2192 6 5.41571856 0.58428144454956055 0.3413848064449212 +2193 6 6.13499641 0.13499641418457031 0.018224031842692057 +2194 6 5.86708736 0.13291263580322266 0.017665768756160105 +2195 5 4.98141146 0.018588542938232422 0.00034553392856651044 +2196 6 6.001491 0.0014910697937011719 2.2232891296880553E-06 +2197 6 6.077741 0.077741146087646484 0.0060436857950207923 +2198 5 5.23285532 0.23285531997680664 0.054221600041501006 +2199 6 5.63764 0.36236000061035156 0.13130477004233398 +2200 5 5.408938 0.40893793106079102 0.16723023146028027 +2201 6 5.59414864 0.40585136413574219 0.1647153297708428 +2202 5 5.23285532 0.23285531997680664 0.054221600041501006 +2203 5 5.406095 0.40609502792358398 0.16491317170425646 +2204 5 5.11989975 0.11989974975585938 0.0143759499915177 +2205 5 5.380273 0.38027286529541016 0.14460745207998116 +2206 6 5.93944168 0.060558319091796875 0.0036673100112238899 +2207 7 6.39073563 0.60926437377929688 0.37120307715667877 +2208 5 5.924955 0.92495489120483398 0.85554155076374627 +2209 6 6.31965542 0.31965541839599609 0.10217958650991932 +2210 7 5.84579563 1.1542043685913086 1.3321877244752613 +2211 6 5.993177 0.0068230628967285156 4.6554187292713323E-05 +2212 6 6.31965542 0.31965541839599609 0.10217958650991932 +2213 6 6.095436 0.09543609619140625 0.0091080484562553465 +2214 5 5.924955 0.92495489120483398 0.85554155076374627 +2215 6 6.031555 0.03155517578125 0.00099572911858558655 +2216 5 5.20941067 0.20941066741943359 0.043852827629052626 +2217 6 5.818059 0.18194103240966797 0.03310253927429585 +2218 6 5.866191 0.13380908966064453 0.017904872475810407 +2219 7 6.95728445 0.042715549468994141 0.0018246181664380856 +2220 6 6.066302 0.066301822662353516 0.0043959316883501742 +2221 6 6.031555 0.03155517578125 0.00099572911858558655 +2222 7 6.41842175 0.58157825469970703 0.3382332663395573 +2223 6 5.74332047 0.25667953491210938 0.065884383642696775 +2224 7 6.41842175 0.58157825469970703 0.3382332663395573 +2225 4 5.301856 1.3018560409545898 1.6948291513699587 +2226 5 5.18825626 0.18825626373291016 0.035440420834675024 +2227 5 5.23327971 0.23327970504760742 0.054419420787098716 +2228 7 6.38512373 0.61487627029418945 0.37807282777089313 +2229 6 6.26501751 0.26501750946044922 0.070234280320619291 +2230 7 6.38512373 0.61487627029418945 0.37807282777089313 +2231 6 6.26501751 0.26501750946044922 0.070234280320619291 +2232 6 5.50034 0.49966001510620117 0.24966013069592918 +2233 5 5.005345 0.0053448677062988281 2.8567610797836096E-05 +2234 5 5.36880445 0.3688044548034668 0.13601672588288238 +2235 6 5.15101051 0.84898948669433594 0.72078314851751202 +2236 5 5.279118 0.27911806106567383 0.077906892013061224 +2237 4 4.755305 0.75530481338500977 0.57048536112256443 +2238 6 5.81597137 0.18402862548828125 0.033866534999106079 +2239 6 5.15101051 0.84898948669433594 0.72078314851751202 +2240 5 5.31853 0.31853008270263672 0.10146141358654859 +2241 5 5.279118 0.27911806106567383 0.077906892013061224 +2242 5 5.341262 0.34126186370849609 0.11645965962179616 +2243 5 5.89338827 0.89338827133178711 0.79814260335319887 +2244 5 5.26064634 0.26064634323120117 0.067936516239797129 +2245 7 5.975706 1.0242938995361328 1.0491779926269373 +2246 4 4.755305 0.75530481338500977 0.57048536112256443 +2247 6 5.81597137 0.18402862548828125 0.033866534999106079 +2248 6 5.80423069 0.19576930999755859 0.038325622736920195 +2249 5 5.112997 0.11299705505371094 0.012768334450811381 +2250 6 5.51153231 0.48846769332885742 0.2386006874260147 +2251 7 6.61156225 0.38843774795532227 0.15088388403660247 +2252 5 5.28885174 0.28885173797607422 0.083435326531798637 +2253 5 5.112997 0.11299705505371094 0.012768334450811381 +2254 6 5.780869 0.2191309928894043 0.048018392044696157 +2255 6 5.905129 0.094871044158935547 0.0090005150198066985 +2256 5 5.74268055 0.74268054962158203 0.55157439878621517 +2257 6 5.513558 0.48644208908081055 0.23662590602930322 +2258 5 5.1727047 0.17270469665527344 0.029826912246790016 +2259 6 5.513558 0.48644208908081055 0.23662590602930322 +2260 5 5.1727047 0.17270469665527344 0.029826912246790016 +2261 6 5.250121 0.74987888336181641 0.56231833971196465 +2262 6 5.674826 0.32517385482788086 0.10573803586362374 +2263 5 5.21189451 0.21189451217651367 0.044899284290522701 +2264 6 6.183153 0.18315315246582031 0.033545077258168021 +2265 5 5.21189451 0.21189451217651367 0.044899284290522701 +2266 5 5.29360437 0.29360437393188477 0.086203528391934015 +2267 6 6.183153 0.18315315246582031 0.033545077258168021 +2268 6 5.172826 0.82717418670654297 0.68421713515363081 +2269 6 6.08651543 0.086515426635742188 0.0074849190459644888 +2270 7 6.53247643 0.46752357482910156 0.21857829302098253 +2271 6 5.51747131 0.4825286865234375 0.23283393331803381 +2272 6 6.08014965 0.080149650573730469 0.0064239664870910929 +2273 5 4.94806051 0.051939487457275391 0.0026977103573244676 +2274 7 6.53247643 0.46752357482910156 0.21857829302098253 +2275 4 4.87486267 0.8748626708984375 0.76538469293154776 +2276 6 5.252231 0.74776887893676758 0.55915829630635017 +2277 6 5.94082737 0.059172630310058594 0.003501400177810865 +2278 6 5.252231 0.74776887893676758 0.55915829630635017 +2279 5 5.32774067 0.32774066925048828 0.10741394628075795 +2280 6 5.95069265 0.049307346343994141 0.0024312144034865923 +2281 6 5.98364353 0.016356468200683594 0.0002675340519999736 +2282 5 5.10705328 0.10705327987670898 0.011460404732360985 +2283 5 5.10705328 0.10705327987670898 0.011460404732360985 +2284 5 5.10705328 0.10705327987670898 0.011460404732360985 +2285 5 5.10705328 0.10705327987670898 0.011460404732360985 +2286 5 5.255406 0.25540590286254883 0.065232175217033728 +2287 5 5.04064369 0.040643692016601563 0.0016519097007403616 +2288 5 5.10705328 0.10705327987670898 0.011460404732360985 +2289 7 6.975762 0.024238109588623047 0.00058748595643010049 +2290 7 6.01900434 0.98099565505981445 0.96235247524623446 +2291 6 6.01213932 0.012139320373535156 0.00014736309913132573 +2292 6 5.082049 0.91795110702514648 0.84263423488869194 +2293 7 6.975762 0.024238109588623047 0.00058748595643010049 +2294 7 7.15972137 0.15972137451171875 0.02551091747591272 +2295 6 5.543599 0.45640087127685547 0.2083017553022728 +2296 7 6.03206825 0.96793174743652344 0.9368918676955218 +2297 6 5.525688 0.47431182861328125 0.22497171076247469 +2298 8 6.825002 1.1749978065490723 1.3806198453951311 +2299 7 7.15972137 0.15972137451171875 0.02551091747591272 +2300 7 7.12855768 0.12855768203735352 0.016527077610817287 +2301 5 5.64900637 0.64900636672973633 0.421209264055733 +2302 5 4.962141 0.037858963012695313 0.0014333010803966317 +2303 5 5.078949 0.078948974609375 0.0062329405918717384 +2304 6 5.204391 0.7956089973449707 0.6329936766562696 +2305 7 6.719511 0.28048896789550781 0.078674061111087212 +2306 5 5.347551 0.34755086898803711 0.12079160653433973 +2307 5 5.493848 0.49384784698486328 0.24388569597158494 +2308 5 5.03939629 0.039396286010742188 0.0015520673514402006 +2309 6 4.99927 1.000730037689209 1.0014606083334456 +2310 5 5.493848 0.49384784698486328 0.24388569597158494 +2311 7 6.676727 0.3232731819152832 0.10450555014563179 +2312 5 5.03939629 0.039396286010742188 0.0015520673514402006 +2313 7 6.59226847 0.40773153305053711 0.16624500304374124 +2314 6 6.75099134 0.7509913444519043 0.56398799944167877 +2315 6 6.20311642 0.20311641693115234 0.04125627882694971 +2316 7 6.70196724 0.29803276062011719 0.088823526402848074 +2317 5 5.40779161 0.4077916145324707 0.16629400088299917 +2318 4 5.22995758 1.2299575805664063 1.5127956499927677 +2319 7 7.1599 0.15990018844604492 0.025568070265080678 +2320 6 6.534845 0.53484487533569336 0.28605904067285337 +2321 5 4.79688025 0.20311975479125977 0.041257634786461495 +2322 6 5.37514925 0.62485074996948242 0.39043845973742464 +2323 6 6.43884945 0.43884944915771484 0.19258883902602975 +2324 5 5.21170664 0.21170663833618164 0.044819700715606814 +2325 6 4.96660471 1.0333952903747559 1.067905826168726 +2326 5 5.23989534 0.23989534378051758 0.057549775967572714 +2327 6 4.96660471 1.0333952903747559 1.067905826168726 +2328 5 5.23989534 0.23989534378051758 0.057549775967572714 +2329 5 5.39162445 0.39162445068359375 0.15336971037322655 +2330 6 5.52637434 0.47362565994262695 0.22432126575608891 +2331 5 5.642715 0.6427149772644043 0.41308254199998373 +2332 6 5.70127439 0.29872560501098633 0.08923698708917982 +2333 8 7.634215 0.36578512191772461 0.13379875541636466 +2334 5 4.72977543 0.27022457122802734 0.073021318895371223 +2335 5 5.563473 0.56347322463989258 0.31750207488607884 +2336 5 4.43548155 0.56451845169067383 0.31868108229923564 +2337 4 5.1952877 1.1952877044677734 1.4287126964518393 +2338 5 5.461004 0.46100378036499023 0.21252448551081216 +2339 6 5.68787336 0.31212663650512695 0.09742303721600365 +2340 6 5.77562952 0.22437047958374023 0.050342112108637593 +2341 5 5.461004 0.46100378036499023 0.21252448551081216 +2342 8 6.9745307 1.0254693031311035 1.0515872916641911 +2343 5 6.21626854 1.2162685394287109 1.4793091600040498 +2344 6 5.68787336 0.31212663650512695 0.09742303721600365 +2345 6 5.964076 0.035923957824707031 0.0012905307457913295 +2346 4 5.00611448 1.0061144828796387 1.0122663526601627 +2347 6 6.032659 0.032659053802490234 0.0010666137952739518 +2348 6 5.979141 0.0208587646484375 0.00043508806265890598 +2349 5 5.04481649 0.044816493988037109 0.0020085181333797664 +2350 5 5.54842949 0.54842948913574219 0.30077490455369116 +2351 6 5.86459446 0.13540554046630859 0.018334660388973134 +2352 6 5.2427454 0.75725460052490234 0.57343453001612943 +2353 7 6.393229 0.60677099227905273 0.36817103707130627 +2354 6 5.97516 0.024839878082275391 0.00061701954314230534 +2355 7 6.41990471 0.58009529113769531 0.33651054680012749 +2356 6 5.74326134 0.25673866271972656 0.065914740935113514 +2357 5 5.605159 0.60515880584716797 0.36621718029437034 +2358 5 5.40133858 0.40133857727050781 0.16107265360551537 +2359 5 5.15412426 0.15412425994873047 0.023754287504743843 +2360 6 5.684558 0.31544208526611328 0.099503709157033882 +2361 5 5.361921 0.36192083358764648 0.1309866897847769 +2362 6 6.2134304 0.21343040466308594 0.045552537634648615 +2363 5 5.35377932 0.35377931594848633 0.12515980439297891 +2364 5 5.09424829 0.094248294830322266 0.0088827410784233507 +2365 5 5.24187565 0.24187564849853516 0.058503829336586932 +2366 5 5.289029 0.28902912139892578 0.083537833016634977 +2367 6 5.289107 0.71089315414428711 0.50536907660921315 +2368 6 5.888105 0.11189508438110352 0.012520509908654276 +2369 6 5.946237 0.053762912750244141 0.002890450787390364 +2370 7 6.52725029 0.47274971008300781 0.22349228838356794 +2371 5 5.12754726 0.12754726409912109 0.016268304579170945 +2372 4 4.236829 0.23682880401611328 0.056087882411702594 +2373 3 3.86445427 0.86445426940917969 0.74728118389975862 +2374 6 6.472952 0.47295188903808594 0.22368348934469395 +2375 6 6.807021 0.80702114105224609 0.65128312210526929 +2376 6 6.472952 0.47295188903808594 0.22368348934469395 +2377 6 5.663546 0.33645391464233398 0.11320123667815096 +2378 5 5.27205563 0.27205562591552734 0.074014263592289353 +2379 4 4.47827053 0.47827053070068359 0.22874270053671353 +2380 4 4.47827053 0.47827053070068359 0.22874270053671353 +2381 6 6.20269156 0.20269155502319336 0.041083866477720221 +2382 8 6.92358637 1.076413631439209 1.1586663059481452 +2383 6 6.59504271 0.59504270553588867 0.35407582141147032 +2384 8 6.92358637 1.076413631439209 1.1586663059481452 +2385 5 5.97708464 0.97708463668823242 0.95469438725217515 +2386 4 5.147523 1.1475229263305664 1.3168088664542665 +2387 4 5.14467859 1.1446785926818848 1.3102890805441803 +2388 4 4.95968 0.95968008041381836 0.92098585674307287 +2389 8 7.235937 0.76406288146972656 0.58379208683982142 +2390 8 6.88572645 1.1142735481262207 1.2416055400537971 +2391 6 5.947992 0.052008152008056641 0.002704847875293126 +2392 7 6.005415 0.99458503723144531 0.98919939628467546 +2393 6 5.93540573 0.064594268798828125 0.0041724195616552606 +2394 5 5.061161 0.061161041259765625 0.0037406729679787531 +2395 5 5.44356155 0.44356155395507813 0.19674685214704368 +2396 5 5.024654 0.024653911590576172 0.00060781535671594611 +2397 6 6.36759043 0.36759042739868164 0.13512272231514544 +2398 6 5.95639 0.043610095977783203 0.0019018404711914627 +2399 6 5.99291468 0.0070853233337402344 5.0201806743643829E-05 +2400 4 4.96698666 0.96698665618896484 0.9350631932475153 +2401 4 5.41945934 1.419459342956543 2.0148648263066207 +2402 6 5.724603 0.27539682388305664 0.075843410604875316 +2403 6 6.153986 0.15398597717285156 0.023711681165877962 +2404 5 4.909302 0.090697765350341797 0.008226084639545661 +2405 5 5.50746536 0.50746536254882813 0.25752109418681357 +2406 6 6.72038031 0.72038030624389648 0.51894778562405008 +2407 6 6.304238 0.30423784255981445 0.092560664845450447 +2408 5 5.204785 0.20478487014770508 0.04193684304141243 +2409 4 5.755078 1.7550778388977051 3.0802982205898388 +2410 6 5.889095 0.11090517044067383 0.012299956830474912 +2411 6 5.495484 0.5045161247253418 0.25453652010787664 +2412 4 4.567272 0.56727218627929688 0.32179773332609329 +2413 4 5.755078 1.7550778388977051 3.0802982205898388 +2414 4 4.49246454 0.49246454238891602 0.24252132551032446 +2415 5 5.50717735 0.50717735290527344 0.25722886730000027 +2416 6 5.889095 0.11090517044067383 0.012299956830474912 +2417 5 5.11089039 0.11089038848876953 0.01229667825919023 +2418 5 5.35015631 0.35015630722045898 0.12260943948626846 +2419 5 5.025919 0.025918960571289063 0.00067179251709603705 +2420 7 6.794381 0.20561885833740234 0.042279114903976733 +2421 5 5.55628 0.55628013610839844 0.30944758982877829 +2422 5 4.60507631 0.39492368698120117 0.15596471853882576 +2423 6 5.75788975 0.24211025238037109 0.058617374307686987 +2424 5 4.60507631 0.39492368698120117 0.15596471853882576 +2425 6 5.75788975 0.24211025238037109 0.058617374307686987 +2426 6 6.110245 0.1102452278137207 0.012154010255699177 +2427 6 5.64332628 0.3566737174987793 0.12721614075439902 +2428 6 6.110245 0.1102452278137207 0.012154010255699177 +2429 6 5.64332628 0.3566737174987793 0.12721614075439902 +2430 5 5.13360643 0.1336064338684082 0.017850679171033335 +2431 5 5.08932161 0.089321613311767578 0.007978350604616935 +2432 5 5.17863 0.17862987518310547 0.031908632307931839 +2433 6 5.377493 0.62250709533691406 0.38751508374480181 +2434 6 5.518652 0.48134803771972656 0.23169593341663131 +2435 4 5.145903 1.1459031105041504 1.3130939386630871 +2436 5 5.19192553 0.1919255256652832 0.036835407401895282 +2437 6 5.77196264 0.22803735733032227 0.052001036338197082 +2438 5 5.19192553 0.1919255256652832 0.036835407401895282 +2439 6 6.008643 0.0086431503295898438 7.4704047619889025E-05 +2440 5 5.18086863 0.18086862564086914 0.032713459741216866 +2441 6 6.38087845 0.38087844848632813 0.14506839252135251 +2442 5 5.02869463 0.028694629669189453 0.00082338177185192762 +2443 5 5.252044 0.2520442008972168 0.06352627920591658 +2444 5 5.02869463 0.028694629669189453 0.00082338177185192762 +2445 5 5.246009 0.24600887298583984 0.060520365587763081 +2446 5 5.252044 0.2520442008972168 0.06352627920591658 +2447 6 5.67375374 0.32624626159667969 0.10643662320580916 +2448 6 6.2183075 0.2183074951171875 0.047658162424340844 +2449 6 5.812583 0.18741703033447266 0.035125143259392644 +2450 5 5.37584734 0.37584733963012695 0.141261222707044 +2451 5 5.37584734 0.37584733963012695 0.141261222707044 +2452 7 6.854299 0.14570093154907227 0.021228761454267442 +2453 6 6.284056 0.28405618667602539 0.080687917188924985 +2454 5 5.381132 0.38113212585449219 0.14526169735836447 +2455 6 5.80150557 0.19849443435668945 0.039400040470582098 +2456 6 5.78387928 0.21612071990966797 0.046708165574273153 +2457 6 5.78387928 0.21612071990966797 0.046708165574273153 +2458 6 5.80150557 0.19849443435668945 0.039400040470582098 +2459 5 5.122227 0.12222719192504883 0.014939486445882721 +2460 5 5.122227 0.12222719192504883 0.014939486445882721 +2461 5 4.78146458 0.21853542327880859 0.047757731227648037 +2462 5 4.896528 0.10347223281860352 0.01070650296446729 +2463 7 6.22579765 0.77420234680175781 0.59938927379334928 +2464 5 5.400786 0.40078592300415039 0.16062935607828877 +2465 5 5.08618641 0.086186408996582031 0.0074280970957261161 +2466 5 5.16699362 0.16699361801147461 0.027886868456562297 +2467 6 5.645084 0.35491609573364258 0.12596543501081214 +2468 6 5.73548174 0.26451826095581055 0.069969910379086286 +2469 5 5.10323334 0.10323333740234375 0.010657121951226145 +2470 5 5.553936 0.55393600463867188 0.30684509723505471 +2471 7 6.896915 0.10308504104614258 0.0106265256874849 +2472 6 5.57246351 0.4275364875793457 0.18278744821168402 +2473 6 5.38096952 0.61903047561645508 0.38319872974193459 +2474 7 6.54121256 0.45878744125366211 0.21048591625208246 +2475 5 4.755563 0.24443721771240234 0.059749553402980382 +2476 6 5.478174 0.52182579040527344 0.27230215553208836 +2477 7 6.54121256 0.45878744125366211 0.21048591625208246 +2478 6 5.45521164 0.54478836059570313 0.29679435784055386 +2479 6 5.54736233 0.45263767242431641 0.20488086249770276 +2480 5 5.26764965 0.26764965057373047 0.071636335452240019 +2481 6 5.515577 0.48442316055297852 0.2346657984801368 +2482 6 5.498918 0.50108194351196289 0.25108311411372597 +2483 6 5.45521164 0.54478836059570313 0.29679435784055386 +2484 5 5.048979 0.048978805541992188 0.0023989233923202846 +2485 6 5.576148 0.42385196685791016 0.17965048980931897 +2486 5 5.57141066 0.5714106559753418 0.32651013776217042 +2487 6 6.054063 0.054062843322753906 0.0029227910281406366 +2488 6 6.054063 0.054062843322753906 0.0029227910281406366 +2489 6 5.417714 0.58228588104248047 0.33905684726141772 +2490 6 5.333998 0.66600179672241211 0.44355839323748114 +2491 5 5.37121058 0.37121057510375977 0.13779729106886407 +2492 6 5.417714 0.58228588104248047 0.33905684726141772 +2493 4 4.939772 0.93977212905883789 0.88317165455578106 +2494 4 4.939772 0.93977212905883789 0.88317165455578106 +2495 5 5.6389513 0.63895130157470703 0.40825876578401221 +2496 5 5.562788 0.56278800964355469 0.3167303437985538 +2497 5 5.339306 0.33930587768554688 0.1151284786319593 +2498 5 5.339306 0.33930587768554688 0.1151284786319593 +2499 6 6.341508 0.34150791168212891 0.11662765374148876 +2500 5 5.339306 0.33930587768554688 0.1151284786319593 +2501 5 5.429243 0.42924308776855469 0.18424962839708314 +2502 4 4.857595 0.85759496688842773 0.73546912723236346 +2503 4 4.857595 0.85759496688842773 0.73546912723236346 +2504 6 5.39802 0.60198020935058594 0.36238017244977527 +2505 6 5.350875 0.64912509918212891 0.42136339438820869 +2506 6 5.44687939 0.55312061309814453 0.3059424126340673 +2507 7 6.84971571 0.1502842903137207 0.022585367915098686 +2508 6 5.37374973 0.62625026702880859 0.39218939695365407 +2509 5 5.177659 0.17765903472900391 0.031562732620841416 +2510 6 5.473051 0.52694892883300781 0.27767517359825433 +2511 6 5.32681227 0.6731877326965332 0.45318172345309904 +2512 6 5.648741 0.35125923156738281 0.12338304776130826 +2513 5 5.189906 0.18990612030029297 0.036064334527509345 +2514 7 6.82964373 0.17035627365112305 0.02902125997229632 +2515 7 6.536579 0.46342086791992188 0.21475890082365368 +2516 6 5.708578 0.29142189025878906 0.084926718122005695 +2517 6 5.782086 0.21791410446166992 0.047486556923331591 +2518 7 6.536579 0.46342086791992188 0.21475890082365368 +2519 5 5.46886444 0.46886444091796875 0.21983386395731941 +2520 5 5.02772331 0.027723312377929688 0.00076858204920426942 +2521 7 6.915324 0.084675788879394531 0.0071699892223477946 +2522 8 6.48247051 1.5175294876098633 2.3028957457654542 +2523 5 5.884742 0.88474178314208984 0.78276802283744473 +2524 5 5.02772331 0.027723312377929688 0.00076858204920426942 +2525 8 6.48247051 1.5175294876098633 2.3028957457654542 +2526 7 6.915324 0.084675788879394531 0.0071699892223477946 +2527 6 6.1603756 0.16037559509277344 0.025720331501361215 +2528 6 6.13957453 0.13957452774047852 0.019481048793977607 +2529 5 5.06424427 0.064244270324707031 0.0041273262695540325 +2530 6 6.075336 0.075335979461669922 0.0056755098014491523 +2531 4 4.62371826 0.62371826171875 0.38902447000145912 +2532 4 4.62371826 0.62371826171875 0.38902447000145912 +2533 5 5.874933 0.87493276596069336 0.76550734495162942 +2534 7 6.029249 0.97075080871582031 0.94235713262241916 +2535 6 5.720717 0.27928304672241211 0.077999020186553025 +2536 6 5.726112 0.27388811111450195 0.075014697409869768 +2537 6 5.468898 0.53110218048095703 0.28206952611162706 +2538 6 5.468898 0.53110218048095703 0.28206952611162706 +2539 5 5.56798553 0.56798553466796875 0.32260756759205833 +2540 5 5.68123245 0.68123245239257813 0.46407765419280622 +2541 6 5.720717 0.27928304672241211 0.077999020186553025 +2542 5 5.711144 0.71114397048950195 0.50572574676357362 +2543 6 5.726112 0.27388811111450195 0.075014697409869768 +2544 6 6.21710253 0.2171025276184082 0.047133507498301697 +2545 6 5.887309 0.11269092559814453 0.012699244712166546 +2546 5 5.450121 0.45012092590332031 0.20260884793606238 +2547 5 5.08151436 0.081514358520507813 0.0066445906450098846 +2548 6 5.55139828 0.44860172271728516 0.201243505624916 +2549 5 5.91132641 0.91132640838623047 0.83051582262214652 +2550 5 5.08151436 0.081514358520507813 0.0066445906450098846 +2551 6 5.55139828 0.44860172271728516 0.201243505624916 +2552 5 4.86496 0.1350398063659668 0.018235749303357807 +2553 7 6.786768 0.21323204040527344 0.045467903055396164 +2554 7 6.776767 0.22323322296142578 0.049833071833745635 +2555 7 6.786768 0.21323204040527344 0.045467903055396164 +2556 5 5.62658167 0.62658166885375977 0.39260458774356266 +2557 7 6.776767 0.22323322296142578 0.049833071833745635 +2558 7 6.786768 0.21323204040527344 0.045467903055396164 +2559 5 5.06189 0.061890125274658203 0.0038303876065128861 +2560 6 5.631182 0.36881780624389648 0.13602657420256037 +2561 5 5.24192762 0.2419276237487793 0.05852897513273092 +2562 6 5.631182 0.36881780624389648 0.13602657420256037 +2563 5 5.06189 0.061890125274658203 0.0038303876065128861 +2564 6 5.62755537 0.37244462966918945 0.13871500216941968 +2565 5 5.40115833 0.40115833282470703 0.16092800799469842 +2566 7 6.38711166 0.61288833618164063 0.37563211262749974 +2567 5 6.20616 1.2061600685119629 1.454822110872783 +2568 6 5.408229 0.59177112579345703 0.35019306532285555 +2569 6 6.057435 0.057435035705566406 0.003298783326499688 +2570 5 6.20616 1.2061600685119629 1.454822110872783 +2571 6 6.188366 0.18836593627929688 0.035481725950376131 +2572 5 5.30330133 0.30330133438110352 0.091991699437357966 +2573 5 5.37471962 0.37471961975097656 0.14041479342631646 +2574 5 5.736238 0.73623800277709961 0.54204639673321253 +2575 6 5.9216547 0.078345298767089844 0.0061379858389045694 +2576 5 5.440002 0.4400019645690918 0.19360172882466031 +2577 5 5.652346 0.65234613418579102 0.42555547878714606 +2578 7 6.88552141 0.11447858810424805 0.013105347134342082 +2579 6 5.612733 0.38726711273193359 0.14997581660372816 +2580 5 5.30633926 0.30633926391601563 0.093843744616606273 +2581 7 6.78701258 0.21298742294311523 0.04536364233194945 +2582 7 6.78701258 0.21298742294311523 0.04536364233194945 +2583 7 6.78701258 0.21298742294311523 0.04536364233194945 +2584 7 6.78701258 0.21298742294311523 0.04536364233194945 +2585 7 6.78701258 0.21298742294311523 0.04536364233194945 +2586 7 6.78701258 0.21298742294311523 0.04536364233194945 +2587 6 5.47037554 0.52962446212768555 0.28050207088404022 +2588 7 6.78701258 0.21298742294311523 0.04536364233194945 +2589 4 4.558096 0.55809593200683594 0.31147106932257884 +2590 6 6.21032572 0.21032571792602539 0.044236907621097998 +2591 7 6.52475357 0.47524642944335938 0.22585916869866196 +2592 5 5.80257 0.80256986618041992 0.64411839010085714 +2593 5 5.87175465 0.87175464630126953 0.75995616334785154 +2594 7 6.80093145 0.19906854629516602 0.039628286124070655 +2595 5 5.0406127 0.040612697601318359 0.00164939120645613 +2596 5 5.361028 0.36102819442749023 0.13034135717157369 +2597 6 6.29323149 0.29323148727416992 0.085984705129021677 +2598 5 5.361028 0.36102819442749023 0.13034135717157369 +2599 6 5.52094364 0.47905635833740234 0.22949499446349364 +2600 7 6.705906 0.29409408569335938 0.086491331239813007 +2601 5 5.446015 0.4460148811340332 0.19892927419300577 +2602 6 6.29323149 0.29323148727416992 0.085984705129021677 +2603 7 6.834382 0.16561794281005859 0.027429302980635839 +2604 7 6.834382 0.16561794281005859 0.027429302980635839 +2605 6 5.62017155 0.37982845306396484 0.14426965375696454 +2606 6 6.07756424 0.077564239501953125 0.0060162112495163456 +2607 6 5.83296537 0.16703462600708008 0.027900566285325112 +2608 6 5.97012949 0.029870510101318359 0.00089224737371296214 +2609 6 5.62017155 0.37982845306396484 0.14426965375696454 +2610 5 5.357526 0.35752582550048828 0.1278247158998056 +2611 5 5.46344376 0.46344375610351563 0.21478011507133488 +2612 7 6.834382 0.16561794281005859 0.027429302980635839 +2613 5 5.212436 0.21243619918823242 0.045129138725542361 +2614 5 5.966585 0.96658515930175781 0.93428687018240453 +2615 7 6.66529751 0.33470249176025391 0.11202575799052283 +2616 7 6.66529751 0.33470249176025391 0.11202575799052283 +2617 7 6.66529751 0.33470249176025391 0.11202575799052283 +2618 7 6.16085 0.83914995193481445 0.70417264183220141 +2619 6 5.38147259 0.61852741241455078 0.38257615990823979 +2620 5 5.15913773 0.15913772583007813 0.025324815782369114 +2621 5 5.212436 0.21243619918823242 0.045129138725542361 +2622 7 6.16085 0.83914995193481445 0.70417264183220141 +2623 7 6.66529751 0.33470249176025391 0.11202575799052283 +2624 5 5.966585 0.96658515930175781 0.93428687018240453 +2625 5 4.83140373 0.16859626770019531 0.028424701482435921 +2626 7 6.534824 0.46517610549926758 0.21638880912746572 +2627 7 6.400417 0.59958314895629883 0.35949995251235123 +2628 6 5.97330952 0.026690483093261719 0.00071238188775168965 +2629 5 4.389117 0.61088323593139648 0.37317832794201422 +2630 6 5.90676069 0.093239307403564453 0.008693568445096389 +2631 7 6.491511 0.50848913192749023 0.25856119728837257 +2632 5 5.12749624 0.12749624252319336 0.016255291857532939 +2633 5 5.50522661 0.50522661209106445 0.25525392956501491 +2634 5 5.23011732 0.2301173210144043 0.052953981430846397 +2635 6 6.11222172 0.11222171783447266 0.012593713953719998 +2636 5 5.50522661 0.50522661209106445 0.25525392956501491 +2637 5 5.23011732 0.2301173210144043 0.052953981430846397 +2638 6 6.48589325 0.48589324951171875 0.23609224992105737 +2639 6 6.26323843 0.26323843002319336 0.069294471041075667 +2640 6 6.02032232 0.020322322845458984 0.00041299680583506415 +2641 5 5.49053431 0.49053430557250977 0.24062390494350439 +2642 5 5.27835655 0.27835655212402344 0.077482370110374177 +2643 5 5.37544632 0.37544631958007813 0.14095993888622615 +2644 6 6.076317 0.07631683349609375 0.005824259074870497 +2645 7 6.539323 0.46067714691162109 0.21222343368663132 +2646 7 6.03048754 0.9695124626159668 0.93995441516767642 +2647 5 5.53373 0.53373003005981445 0.28486774498765044 +2648 6 6.06513739 0.065137386322021484 0.0042428790968642716 +2649 6 6.076317 0.07631683349609375 0.005824259074870497 +2650 5 5.42053 0.42052984237670898 0.1768453483293797 +2651 5 4.88292837 0.11707162857055664 0.013705766216162374 +2652 7 6.700081 0.29991912841796875 0.08995148359099403 +2653 5 5.334144 0.33414411544799805 0.11165228988852505 +2654 5 4.79802275 0.20197725296020508 0.040794810713350671 +2655 5 5.59066868 0.59066867828369141 0.34888948750540294 +2656 4 5.534751 1.5347509384155273 2.3554604429673418 +2657 7 6.749618 0.2503819465637207 0.06269111916503789 +2658 7 6.35202026 0.647979736328125 0.4198777386918664 +2659 6 6.192402 0.19240188598632813 0.037018485731096007 +2660 6 5.35101557 0.64898443222045898 0.42118079326451152 +2661 6 5.839745 0.16025495529174805 0.025681650695560165 +2662 6 6.10311651 0.10311651229858398 0.010633015108624022 +2663 8 6.417799 1.5822010040283203 2.5033600171482249 +2664 7 6.837831 0.16216897964477539 0.026298777959027575 +2665 5 5.13746262 0.13746261596679688 0.018895970788435079 +2666 7 7.010816 0.010816097259521484 0.00011698795992742816 +2667 7 6.62150049 0.37849950790405273 0.14326187748361008 +2668 6 5.76007128 0.2399287223815918 0.057565791823662948 +2669 5 5.45352936 0.45352935791015625 0.20568887848639861 +2670 7 7.010816 0.010816097259521484 0.00011698795992742816 +2671 7 6.98377371 0.016226291656494141 0.00026329254092161136 +2672 7 6.54092646 0.45907354354858398 0.21074851838625364 +2673 6 5.08340025 0.91659975051879883 0.84015510265112425 +2674 7 5.778003 1.2219967842102051 1.4932761406200825 +2675 7 5.7659874 1.2340126037597656 1.5227871062379563 +2676 6 6.296325 0.2963252067565918 0.087808628159336877 +2677 6 6.534412 0.53441190719604492 0.28559608655291413 +2678 5 5.132459 0.13245916366577148 0.017545430039035637 +2679 6 5.927195 0.072804927825927734 0.0053005575157385465 +2680 6 6.597612 0.59761190414428711 0.3571399879749606 +2681 6 6.1629777 0.16297769546508789 0.02656172921911093 +2682 6 6.14354 0.1435399055480957 0.020603704484756236 +2683 5 5.132459 0.13245916366577148 0.017545430039035637 +2684 6 6.346119 0.34611892700195313 0.11979831162898336 +2685 7 6.700144 0.29985618591308594 0.089913732230343157 +2686 6 6.597612 0.59761190414428711 0.3571399879749606 +2687 5 5.44237471 0.44237470626831055 0.19569538074597403 +2688 6 6.1629777 0.16297769546508789 0.02656172921911093 +2689 6 5.927195 0.072804927825927734 0.0053005575157385465 +2690 6 5.39308643 0.60691356658935547 0.36834407731021201 +2691 6 5.943039 0.0569610595703125 0.0032445623073726892 +2692 6 5.38779 0.61220979690551758 0.37480083542709508 +2693 6 6.273909 0.27390909194946289 0.075026190652579317 +2694 6 5.943039 0.0569610595703125 0.0032445623073726892 +2695 6 6.42099857 0.42099857330322266 0.17723979872334894 +2696 6 5.61446333 0.38553667068481445 0.14863852444273107 +2697 5 5.986452 0.98645210266113281 0.97308775084457011 +2698 6 5.38779 0.61220979690551758 0.37480083542709508 +2699 6 5.39308643 0.60691356658935547 0.36834407731021201 +2700 7 6.558984 0.44101619720458984 0.19449528619679768 +2701 5 5.53186131 0.53186130523681641 0.28287644800820999 +2702 5 5.53186131 0.53186130523681641 0.28287644800820999 +2703 5 5.53186131 0.53186130523681641 0.28287644800820999 +2704 6 5.49847364 0.5015263557434082 0.25152868550526364 +2705 6 5.547789 0.45221090316772461 0.2044947009437692 +2706 6 5.459655 0.54034519195556641 0.29197292646949791 +2707 5 5.53186131 0.53186130523681641 0.28287644800820999 +2708 6 5.71547937 0.28452062606811523 0.080951986658192254 +2709 5 5.3331356 0.33313560485839844 0.11097933122437098 +2710 5 5.3331356 0.33313560485839844 0.11097933122437098 +2711 5 5.54598951 0.5459895133972168 0.29810454873972958 +2712 5 5.57248545 0.57248544692993164 0.32773958694656358 +2713 6 5.71547937 0.28452062606811523 0.080951986658192254 +2714 6 5.520475 0.47952508926391602 0.22994431123356662 +2715 6 5.81573725 0.18426275253295898 0.033952761971022483 +2716 5 5.3331356 0.33313560485839844 0.11097933122437098 +2717 6 6.06022024 0.060220241546630859 0.0036264774919345655 +2718 6 5.60196733 0.39803266525268555 0.15843000260815643 +2719 6 6.12731934 0.1273193359375 0.016210213303565979 +2720 7 6.82676744 0.1732325553894043 0.030009518246743028 +2721 5 5.071255 0.071255207061767578 0.0050773045334153721 +2722 7 7.01948929 0.019489288330078125 0.00037983235961291939 +2723 6 6.68752337 0.68752336502075195 0.47268837744945813 +2724 6 6.12731934 0.1273193359375 0.016210213303565979 +2725 5 5.315857 0.31585693359375 0.099765602499246597 +2726 6 6.010409 0.010408878326416016 0.00010834474801413307 +2727 6 6.110698 0.11069822311401367 0.012254096600599951 +2728 6 5.59660959 0.40339040756225586 0.16272382091324289 +2729 7 6.35478163 0.6452183723449707 0.41630674801149326 +2730 5 5.104849 0.10484886169433594 0.010993283798597986 +2731 5 5.09944868 0.099448680877685547 0.009890040128311739 +2732 5 5.08644629 0.086446285247802734 0.0074729602331444767 +2733 7 6.35478163 0.6452183723449707 0.41630674801149326 +2734 6 5.840015 0.15998506546020508 0.025595221170306104 +2735 6 5.59660959 0.40339040756225586 0.16272382091324289 +2736 6 6.110698 0.11069822311401367 0.012254096600599951 +2737 7 6.31539965 0.6846003532409668 0.46867764365765652 +2738 5 4.859411 0.14058923721313477 0.019765333620171077 +2739 7 6.79711866 0.2028813362121582 0.041160836583230775 +2740 6 5.55758953 0.44241046905517578 0.19572702312962065 +2741 5 4.859411 0.14058923721313477 0.019765333620171077 +2742 6 5.90890455 0.091095447540283203 0.0082983805625644891 +2743 6 5.42445946 0.57554054260253906 0.33124691617922508 +2744 6 5.42445946 0.57554054260253906 0.33124691617922508 +2745 7 6.68684959 0.31315040588378906 0.098063176705181831 +2746 6 5.8635807 0.13641929626464844 0.018610224393341923 +2747 6 5.836842 0.16315793991088867 0.026620513355965159 +2748 8 7.59587 0.40412998199462891 0.16332104234697908 +2749 6 5.836842 0.16315793991088867 0.026620513355965159 +2750 8 7.59587 0.40412998199462891 0.16332104234697908 +2751 6 6.33598948 0.33598947525024414 0.11288892747893442 +2752 6 6.41576338 0.41576337814331055 0.17285918660513744 +2753 8 6.57070065 1.4292993545532227 2.0428966449262589 +2754 5 4.82796144 0.17203855514526367 0.029597264456469929 +2755 5 5.026161 0.02616119384765625 0.00068440806353464723 +2756 6 5.25135136 0.74864864349365234 0.56047479140488576 +2757 5 5.6517005 0.65170049667358398 0.42471353736459605 +2758 6 5.7463727 0.25362730026245117 0.064326807438419564 +2759 6 6.056962 0.056962013244628906 0.0032446709528812789 +2760 6 6.05584574 0.055845737457275391 0.0031187463921469316 +2761 5 5.12640953 0.12640953063964844 0.015979369436536217 +2762 5 4.967308 0.03269195556640625 0.0010687639587558806 +2763 6 5.50983524 0.49016475677490234 0.24026148878419917 +2764 6 5.886604 0.11339616775512695 0.012858690861548894 +2765 6 6.373077 0.3730769157409668 0.13918638505879244 +2766 6 6.392993 0.39299297332763672 0.15444347708489659 +2767 6 5.886604 0.11339616775512695 0.012858690861548894 +2768 6 5.50983524 0.49016475677490234 0.24026148878419917 +2769 5 4.967308 0.03269195556640625 0.0010687639587558806 +2770 7 5.96291351 1.0370864868164063 1.075548381137196 +2771 6 6.006506 0.0065059661865234375 4.232759602018632E-05 +2772 7 7.188282 0.18828201293945313 0.035450116396532394 +2773 7 6.637038 0.36296176910400391 0.13174124583110824 +2774 8 7.22622252 0.77377748489379883 0.59873159612857307 +2775 8 7.22622252 0.77377748489379883 0.59873159612857307 +2776 8 7.13183546 0.8681645393371582 0.75370966736250011 +2777 6 5.887922 0.11207818984985352 0.012561520640019808 +2778 7 6.637038 0.36296176910400391 0.13174124583110824 +2779 5 6.17867136 1.1786713600158691 1.3892661749216586 +2780 5 4.9449873 0.055012702941894531 0.0030263974849731312 +2781 6 5.315123 0.68487691879272461 0.4690563938950163 +2782 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2783 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2784 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2785 5 5.21472025 0.21472024917602539 0.046104785406214432 +2786 6 6.152581 0.15258121490478516 0.023281027141820232 +2787 5 5.21472025 0.21472024917602539 0.046104785406214432 +2788 5 5.23888636 0.23888635635375977 0.057066691251975499 +2789 5 5.228488 0.22848796844482422 0.052206751724042988 +2790 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2791 5 5.31389856 0.31389856338500977 0.098532308095172993 +2792 5 5.398319 0.39831876754760742 0.15865784058064492 +2793 7 6.85435152 0.14564847946166992 0.021213479569496485 +2794 5 5.27362 0.2736201286315918 0.074867974792368841 +2795 8 6.51372147 1.4862785339355469 2.2090238804375986 +2796 7 6.85435152 0.14564847946166992 0.021213479569496485 +2797 5 5.27362 0.2736201286315918 0.074867974792368841 +2798 7 6.320331 0.67966890335083008 0.46194981818212 +2799 7 6.312358 0.68764209747314453 0.4728516542172656 +2800 5 5.31389856 0.31389856338500977 0.098532308095172993 +2801 5 5.398319 0.39831876754760742 0.15865784058064492 +2802 6 5.911348 0.088652133941650391 0.0078592008524083212 +2803 8 7.10538 0.89461994171142578 0.80034484010775486 +2804 8 6.51372147 1.4862785339355469 2.2090238804375986 +2805 6 6.125227 0.12522697448730469 0.015681795139244059 +2806 5 5.57819366 0.57819366455078125 0.33430791372666135 +2807 5 5.467038 0.46703815460205078 0.21812463785408909 +2808 6 5.449633 0.55036687850952148 0.30290370096031438 +2809 7 6.89858437 0.10141563415527344 0.010285130851116264 +2810 7 6.5463047 0.45369529724121094 0.20583942273879074 +2811 5 5.89086533 0.89086532592773438 0.7936410289403284 +2812 6 6.117913 0.11791276931762695 0.013903421168151908 +2813 7 6.89858437 0.10141563415527344 0.010285130851116264 +2814 7 6.761442 0.23855781555175781 0.056909831360826502 +2815 5 5.678755 0.67875480651855469 0.46070808737204061 +2816 5 5.93518972 0.93518972396850586 0.87457981981629018 +2817 7 6.761442 0.23855781555175781 0.056909831360826502 +2818 4 5.07461357 1.0746135711669922 1.1547943273362762 +2819 6 6.01559734 0.015597343444824219 0.00024327712253580103 +2820 5 5.33604956 0.33604955673217773 0.11292930457989314 +2821 5 5.366424 0.3664240837097168 0.13426660912250554 +2822 5 5.85116053 0.85116052627563477 0.72447424148981554 +2823 6 6.01015854 0.010158538818359375 0.00010319591092411429 +2824 6 5.59928751 0.40071249008178711 0.16057049970754633 +2825 6 5.800588 0.19941186904907227 0.039765093517644345 +2826 6 5.48602867 0.51397132873535156 0.26416652676198282 +2827 7 6.66664076 0.3333592414855957 0.11112838388385171 +2828 7 6.66664076 0.3333592414855957 0.11112838388385171 +2829 5 5.41582632 0.41582632064819336 0.17291152894381412 +2830 5 5.8822813 0.88228130340576172 0.77842029833936977 +2831 5 5.240319 0.24031877517700195 0.05775311370257441 +2832 6 6.208396 0.20839595794677734 0.043428875288554991 +2833 7 6.11395073 0.88604927062988281 0.78508330998374731 +2834 6 6.35579 0.35579013824462891 0.12658662247213215 +2835 6 5.800588 0.19941186904907227 0.039765093517644345 +2836 6 5.48602867 0.51397132873535156 0.26416652676198282 +2837 6 5.82906437 0.17093563079833984 0.029218989876426349 +2838 7 6.760046 0.23995399475097656 0.057577919596951688 +2839 7 6.032847 0.96715307235717773 0.93538506536992827 +2840 6 6.251306 0.25130605697631836 0.06315473427298457 +2841 6 5.576804 0.42319583892822266 0.17909471808616217 +2842 6 5.73872662 0.26127338409423828 0.068263781236055365 +2843 6 5.85552 0.14448022842407227 0.020874536405472099 +2844 5 5.89313745 0.89313745498657227 0.7976945134998914 +2845 7 6.34599352 0.6540064811706543 0.42772447741322139 +2846 7 6.760046 0.23995399475097656 0.057577919596951688 +2847 5 6.01179361 1.0117936134338379 1.0237263161855026 +2848 5 5.079327 0.079327106475830078 0.0062927898218276823 +2849 5 4.88416767 0.11583232879638672 0.01341712839439424 +2850 5 5.665823 0.66582298278808594 0.44332024440882378 +2851 5 5.54855633 0.54855632781982422 0.30091404479117045 +2852 5 5.910392 0.91039180755615234 0.82881324326535832 +2853 6 6.005491 0.0054907798767089844 3.014866365447233E-05 +2854 6 6.1430006 0.14300060272216797 0.020449172378903313 +2855 7 6.55762529 0.44237470626831055 0.19569538074597403 +2856 7 6.736136 0.26386404037475586 0.06962423180289079 +2857 8 6.942888 1.0571122169494629 1.1174862392238083 +2858 7 6.55762529 0.44237470626831055 0.19569538074597403 +2859 6 5.91818142 0.081818580627441406 0.0066942801358891302 +2860 6 5.965876 0.034123897552490234 0.001164440384172849 +2861 6 6.1430006 0.14300060272216797 0.020449172378903313 +2862 6 6.691774 0.69177389144897461 0.47855111689045771 +2863 6 6.34304333 0.34304332733154297 0.11767872442669614 +2864 6 6.005491 0.0054907798767089844 3.014866365447233E-05 +2865 6 5.929855 0.070145130157470703 0.0049203392848085059 +2866 7 6.736136 0.26386404037475586 0.06962423180289079 +2867 7 6.4575305 0.54246950149536133 0.29427316005262583 +2868 5 5.651781 0.65178108215332031 0.42481857905295328 +2869 6 6.55753326 0.55753326416015625 0.31084334064507857 +2870 7 6.4575305 0.54246950149536133 0.29427316005262583 +2871 6 6.16480064 0.16480064392089844 0.027159252236742759 +2872 7 7.28570557 0.28570556640625 0.081627670675516129 +2873 8 6.998543 1.0014572143554688 1.0029165521846153 +2874 7 7.19103336 0.19103336334228516 0.036493745909865538 +2875 6 6.16480064 0.16480064392089844 0.027159252236742759 +2876 5 5.69884062 0.69884061813354492 0.48837820955327516 +2877 5 5.146617 0.14661693572998047 0.021496525842849223 +2878 6 6.674345 0.67434501647949219 0.45474120125072659 +2879 6 5.830216 0.1697840690612793 0.028826630107005258 +2880 5 5.48119974 0.48119974136352539 0.23155319108832373 +2881 7 6.59828854 0.40171146392822266 0.16137210025135573 +2882 5 5.83155537 0.83155536651611328 0.69148432758174749 +2883 7 6.65674639 0.34325361251831055 0.11782304250687048 +2884 7 6.89670372 0.10329627990722656 0.010670121442672098 +2885 6 6.895076 0.89507579803466797 0.80116068422739772 +2886 5 5.568845 0.56884479522705078 0.32358440105690534 +2887 5 6.2788415 1.278841495513916 1.6354355706482693 +2888 4 4.97987 0.97986984252929688 0.96014490829838905 +2889 6 6.17137671 0.17137670516967773 0.029369975074814647 +2890 8 6.99665642 1.0033435821533203 1.0066983438482566 +2891 6 6.11748743 0.11748743057250977 0.013803296342530302 +2892 5 5.10433245 0.10433244705200195 0.010885259507858791 +2893 7 7.350198 0.35019779205322266 0.12263849355895218 +2894 7 6.62656164 0.37343835830688477 0.13945620745494125 +2895 5 4.986747 0.013253211975097656 0.00017564762765687192 +2896 5 5.465397 0.46539688110351563 0.21659425694087986 +2897 5 5.10433245 0.10433244705200195 0.010885259507858791 +2898 5 5.67653847 0.67653846740722656 0.45770429788171896 +2899 5 5.324881 0.32488107681274414 0.10554771407100816 +2900 6 6.486866 0.48686599731445313 0.23703849934099708 +2901 7 6.934615 0.065384864807128906 0.0042751805458465242 +2902 5 5.470778 0.47077798843383789 0.2216319143938108 +2903 6 6.162005 0.16200494766235352 0.026245603067081902 +2904 7 6.578451 0.42154884338378906 0.17770342735821032 +2905 5 5.169223 0.16922283172607422 0.028636366777391231 +2906 5 5.311511 0.31151103973388672 0.09703912787608715 +2907 6 6.162005 0.16200494766235352 0.026245603067081902 +2908 6 5.8543663 0.14563369750976563 0.021209173850365914 +2909 6 6.204579 0.20457887649536133 0.041852516708104304 +2910 5 5.372203 0.37220287322998047 0.13853497884065291 +2911 5 5.470778 0.47077798843383789 0.2216319143938108 +2912 7 6.934615 0.065384864807128906 0.0042751805458465242 +2913 5 5.73384953 0.73384952545166016 0.53853512600562681 +2914 6 6.185189 0.18518877029418945 0.034294880643074066 +2915 6 6.185189 0.18518877029418945 0.034294880643074066 +2916 6 6.42385769 0.42385768890380859 0.17965534044287779 +2917 7 6.77903557 0.22096443176269531 0.048825280104210833 +2918 6 6.22794437 0.22794437408447266 0.05195863767676201 +2919 5 6.22429657 1.2242965698242188 1.4989020908833481 +2920 4 5.41122055 1.4112205505371094 1.9915434422582621 +2921 6 5.38592863 0.61407136917114258 0.37708364643572168 +2922 8 7.34079075 0.65920925140380859 0.43455683713636972 +2923 6 6.241174 0.24117422103881836 0.058165004893680816 +2924 6 6.01887941 0.018879413604736328 0.00035643225805870316 +2925 5 5.801418 0.80141782760620117 0.64227053440504278 +2926 8 7.500604 0.49939584732055664 0.24939621232101672 +2927 7 6.77533054 0.22466945648193359 0.050476364675887453 +2928 7 6.77533054 0.22466945648193359 0.050476364675887453 +2929 6 6.01887941 0.018879413604736328 0.00035643225805870316 +2930 8 6.95274448 1.0472555160522461 1.0967441159018563 +2931 8 7.500604 0.49939584732055664 0.24939621232101672 +2932 6 5.81837845 0.18162155151367188 0.032986387974233367 +2933 6 6.241174 0.24117422103881836 0.058165004893680816 +2934 5 5.40555 0.40555000305175781 0.16447080497528077 +2935 4 4.575317 0.5753169059753418 0.33098954230104027 +2936 5 5.563707 0.56370687484741211 0.31776544075023594 +2937 5 5.801418 0.80141782760620117 0.64227053440504278 +2938 8 7.290619 0.709381103515625 0.50322155002504587 +2939 8 7.290619 0.709381103515625 0.50322155002504587 +2940 6 5.923137 0.076862812042236328 0.0059078918750401499 +2941 5 5.50564241 0.50564241409301758 0.25567425092981466 +2942 5 5.4280076 0.42800760269165039 0.18319050796185365 +2943 8 7.290619 0.709381103515625 0.50322155002504587 +2944 6 5.923137 0.076862812042236328 0.0059078918750401499 +2945 8 7.50769234 0.49230766296386719 0.24236683501294465 +2946 6 6.43216467 0.43216466903686523 0.18676630116374326 +2947 6 6.43216467 0.43216466903686523 0.18676630116374326 +2948 6 5.295068 0.70493221282958984 0.49692942468482215 +2949 6 5.52491 0.47509002685546875 0.22571053361753002 +2950 5 4.885021 0.11497879028320313 0.013220122214988805 +2951 5 5.36800766 0.36800765991210938 0.13542963775398675 +2952 5 5.084062 0.084062099456787109 0.0070664365650827676 +2953 5 4.885021 0.11497879028320313 0.013220122214988805 +2954 7 6.80840158 0.19159841537475586 0.036709952774117482 +2955 5 5.89870071 0.89870071411132813 0.80766297354421113 +2956 6 5.952585 0.047414779663085938 0.0022481613304989878 +2957 6 6.248593 0.24859285354614258 0.061798406834213893 +2958 5 5.36800766 0.36800765991210938 0.13542963775398675 +2959 7 6.886067 0.11393308639526367 0.012980748175550616 +2960 7 6.864493 0.13550710678100586 0.018362175988158924 +2961 6 6.36556625 0.36556625366210938 0.1336386858165497 +2962 5 5.118201 0.11820077896118164 0.01397142414703012 +2963 7 7.14948225 0.14948225021362305 0.022344943128928207 +2964 5 5.77492046 0.77492046356201172 0.60050172484716313 +2965 8 7.51538849 0.48461151123046875 0.23484831681707874 +2966 6 6.015978 0.015977859497070313 0.00025529199410811998 +2967 6 6.015978 0.015977859497070313 0.00025529199410811998 +2968 5 5.458155 0.45815515518188477 0.20990614621973691 +2969 6 6.22913742 0.22913742065429688 0.052503957544104196 +2970 5 5.458155 0.45815515518188477 0.20990614621973691 +2971 5 5.00773525 0.0077352523803710938 5.9834129388036672E-05 +2972 6 5.95129251 0.048707485198974609 0.0023724191144083306 +2973 6 6.015978 0.015977859497070313 0.00025529199410811998 +2974 6 5.932331 0.067668914794921875 0.0045790820295223966 +2975 6 6.144719 0.14471912384033203 0.020943624805113359 +2976 6 6.486239 0.48623895645141602 0.23642832277096204 +2977 6 5.59412336 0.40587663650512695 0.16473584406071495 +2978 6 5.59412336 0.40587663650512695 0.16473584406071495 +2979 7 6.9594326 0.040567398071289063 0.0016457137862744275 +2980 7 6.92361832 0.076381683349609375 0.005834161551319994 +2981 7 6.22655535 0.77344465255737305 0.59821663056959551 +2982 6 5.876878 0.12312221527099609 0.015159079893237504 +2983 6 6.50105 0.50104999542236328 0.25105109791275027 +2984 6 5.62402534 0.37597465515136719 0.14135694131618948 +2985 7 6.68020248 0.31979751586914063 0.10227045115607325 +2986 7 6.68020248 0.31979751586914063 0.10227045115607325 +2987 7 6.55058336 0.4494166374206543 0.20197531399048785 +2988 7 6.21850634 0.7814936637878418 0.61073234654054431 +2989 6 5.910959 0.089041233062744141 0.0079283411853339203 +2990 7 7.23028851 0.23028850555419922 0.053032795790386444 +2991 7 6.61063051 0.38936948776245117 0.15160859800039361 +2992 7 6.59718561 0.40281438827514648 0.16225943140148047 +2993 7 6.55058336 0.4494166374206543 0.20197531399048785 +2994 7 6.55058336 0.4494166374206543 0.20197531399048785 +2995 6 6.2750206 0.27502059936523438 0.075636330075212754 +2996 8 6.401823 1.5981769561767578 2.5541695832544065 +2997 6 6.18262243 0.18262243270874023 0.033350952928458355 +2998 7 6.541024 0.45897579193115234 0.21065877757882845 +2999 7 6.55058336 0.4494166374206543 0.20197531399048785 +3000 7 6.68020248 0.31979751586914063 0.10227045115607325 +3001 7 6.59718561 0.40281438827514648 0.16225943140148047 +3002 7 6.61063051 0.38936948776245117 0.15160859800039361 +3003 7 6.21850634 0.7814936637878418 0.61073234654054431 +3004 6 6.146488 0.14648818969726563 0.021458789720782079 +3005 6 6.42360735 0.42360734939575195 0.17944318646209467 +3006 6 5.910959 0.089041233062744141 0.0079283411853339203 +3007 7 7.23028851 0.23028850555419922 0.053032795790386444 +3008 7 7.15494442 0.15494441986083984 0.024007773246012221 +3009 6 5.6800313 0.31996870040893555 0.10237996924138315 +3010 5 5.513453 0.51345300674438477 0.26363399013484923 +3011 6 6.520062 0.52006196975708008 0.27046445238761407 +3012 6 6.48770046 0.48770046234130859 0.23785174096792616 +3013 6 6.24235773 0.24235773086547852 0.058737269710263718 +3014 6 5.79948 0.20052003860473633 0.040208285882044947 +3015 6 6.15257168 0.15257167816162109 0.023278116977053287 +3016 6 6.24235773 0.24235773086547852 0.058737269710263718 +3017 6 6.489136 0.4891362190246582 0.2392542407617384 +3018 8 6.62297249 1.3770275115966797 1.8962047676941438 +3019 6 6.15257168 0.15257167816162109 0.023278116977053287 +3020 6 5.213552 0.78644800186157227 0.61850045963205957 +3021 4 4.974067 0.97406721115112305 0.94880693183972653 +3022 5 4.710317 0.28968286514282227 0.083916162357354551 +3023 6 5.79948 0.20052003860473633 0.040208285882044947 +3024 6 6.24235773 0.24235773086547852 0.058737269710263718 +3025 7 6.508888 0.49111223220825195 0.24119122462457199 +3026 6 5.723984 0.2760162353515625 0.07618496217764914 +3027 5 5.5033226 0.50332260131835938 0.25333364099788014 +3028 6 5.96375751 0.036242485046386719 0.0013135177223375649 +3029 8 7.416451 0.58354902267456055 0.34052946186443478 +3030 8 7.416451 0.58354902267456055 0.34052946186443478 +3031 6 6.04504347 0.045043468475341797 0.0020289140522891103 +3032 5 5.87561035 0.8756103515625 0.76669348776340485 +3033 6 5.65504551 0.34495449066162109 0.11899360062761843 +3034 6 5.53221226 0.46778774261474609 0.21882537214059994 +3035 7 6.369083 0.63091707229614258 0.398056352114736 +3036 5 5.41204548 0.41204547882080078 0.16978147661666299 +3037 6 5.73057842 0.26942157745361328 0.07258798639759334 +3038 6 6.314134 0.31413412094116211 0.098680245939476663 +3039 6 5.26212549 0.73787450790405273 0.54445878941464798 +3040 5 5.86243534 0.86243534088134766 0.74379471720112633 +3041 6 5.70183754 0.29816246032714844 0.088900852748338366 +3042 6 5.73057842 0.26942157745361328 0.07258798639759334 +3043 6 5.6588273 0.34117269515991211 0.11639880792267832 +3044 6 5.51266575 0.48733425140380859 0.23749467259131052 +3045 6 5.94866943 0.05133056640625 0.002634827047586441 +3046 6 6.56467533 0.56467533111572266 0.31885822957065102 +3047 5 5.94285536 0.9428553581237793 0.88897622634272011 +3048 6 6.12261629 0.12261629104614258 0.015034754829912345 +3049 5 5.07569933 0.075699329376220703 0.0057303884680095507 +3050 4 3.875888 0.12411189079284668 0.0154037614361755 +3051 5 5.07569933 0.075699329376220703 0.0057303884680095507 +3052 7 6.43984032 0.56015968322753906 0.31377887071357691 +3053 5 5.956705 0.95670509338378906 0.91528463570648455 +3054 6 5.982073 0.017927169799804688 0.00032138341703102924 +3055 6 6.134855 0.13485479354858398 0.018185815343031209 +3056 5 5.5363574 0.53635740280151367 0.28767926353998519 +3057 5 6.647654 1.6476540565490723 2.7147638900626134 +3058 5 5.50795 0.5079498291015625 0.25801302888430655 +3059 6 5.59066057 0.40933942794799805 0.16755876727279428 +3060 5 5.509139 0.50913906097412109 0.2592225834096098 +3061 5 5.509139 0.50913906097412109 0.2592225834096098 +3062 8 7.033389 0.96661090850830078 0.93433664844724262 +3063 5 5.509139 0.50913906097412109 0.2592225834096098 +3064 5 5.22793436 0.22793436050415039 0.051954072698435994 +3065 6 6.23876572 0.23876571655273438 0.057009067400940694 +3066 5 5.22793436 0.22793436050415039 0.051954072698435994 +3067 4 5.505729 1.5057291984558105 2.2672204190823777 +3068 6 6.50907 0.50906991958618164 0.25915218302748144 +3069 8 6.38527441 1.6147255897521973 2.6073387302005813 +3070 8 7.033389 0.96661090850830078 0.93433664844724262 +3071 7 6.54769325 0.45230674743652344 0.204581393776607 +3072 6 6.571671 0.5716710090637207 0.32680774260393264 +3073 5 6.574811 1.5748109817504883 2.4800296282419367 +3074 5 6.086039 1.0860390663146973 1.1794808535616994 +3075 7 6.844268 0.15573215484619141 0.024252504053038137 +3076 5 5.242751 0.24275112152099609 0.058928106999701413 +3077 5 5.50795 0.5079498291015625 0.25801302888430655 +3078 5 6.399005 1.3990049362182617 1.9572148115630625 +3079 5 5.968719 0.9687190055847168 0.93841651178104257 +3080 6 5.59066057 0.40933942794799805 0.16755876727279428 +3081 5 5.509139 0.50913906097412109 0.2592225834096098 +3082 6 6.13533974 0.13533973693847656 0.018316844394576037 +3083 7 7.16997147 0.16997146606445313 0.02889029927609954 +3084 6 6.52068233 0.52068233489990234 0.27111009387681406 +3085 6 5.80988169 0.19011831283569336 0.036144972875490566 +3086 7 7.16997147 0.16997146606445313 0.02889029927609954 +3087 3 5.34159374 2.3415937423706055 5.4830612543091775 +3088 6 6.286271 0.28627109527587891 0.081951139990451338 +3089 7 7.03953838 0.039538383483886719 0.0015632837685188861 +3090 6 6.52068233 0.52068233489990234 0.27111009387681406 +3091 6 5.47072268 0.52927732467651367 0.28013448641672767 +3092 6 5.913515 0.086484909057617188 0.0074796394947043154 +3093 7 6.608788 0.39121198654174805 0.15304681841394085 +3094 6 5.412697 0.58730316162109375 0.34492500365013257 +3095 6 5.412697 0.58730316162109375 0.34492500365013257 +3096 7 6.48468733 0.51531267166137695 0.26554714957478609 +3097 5 5.1353054 0.13530540466308594 0.018307552531041438 +3098 7 6.575067 0.42493295669555664 0.18056801768602782 +3099 7 6.55274343 0.44725656509399414 0.20003843501967822 +3100 7 6.564502 0.43549823760986328 0.18965871496129694 +3101 6 6.057678 0.05767822265625 0.0033267773687839508 +3102 6 5.620618 0.37938213348388672 0.14393080320678564 +3103 7 6.608788 0.39121198654174805 0.15304681841394085 +3104 5 5.81254339 0.81254339218139648 0.66022676417765069 +3105 6 5.8328824 0.16711759567260742 0.027928290783393095 +3106 6 5.913515 0.086484909057617188 0.0074796394947043154 +3107 6 5.97155666 0.028443336486816406 0.00080902339050226146 +3108 5 5.34724665 0.34724664688110352 0.1205802337701698 +3109 4 5.416677 1.4166769981384277 2.0069737170545068 +3110 6 6.21659756 0.21659755706787109 0.046914501727769675 +3111 7 6.4117794 0.58822059631347656 0.34600346992738196 +3112 5 5.77784157 0.77784156799316406 0.60503750489806407 +3113 6 5.67790174 0.3220982551574707 0.1037472859754871 +3114 6 6.22823238 0.22823238372802734 0.052090020982177521 +3115 6 6.22823238 0.22823238372802734 0.052090020982177521 +3116 7 6.6314764 0.36852359771728516 0.13580964207449142 +3117 7 6.4117794 0.58822059631347656 0.34600346992738196 +3118 7 6.842666 0.1573338508605957 0.024753940626624171 +3119 5 4.480663 0.51933717727661133 0.26971110370163842 +3120 6 5.473927 0.52607297897338867 0.27675277920593544 +3121 5 5.77784157 0.77784156799316406 0.60503750489806407 +3122 6 6.684882 0.68488216400146484 0.46906357856732939 +3123 5 5.57188 0.57187986373901367 0.32704657855015284 +3124 6 5.67790174 0.3220982551574707 0.1037472859754871 +3125 5 5.86090946 0.86090946197509766 0.74116510171825212 +3126 7 6.18981934 0.8101806640625 0.65639270842075348 +3127 5 5.27245855 0.27245855331420898 0.07423366327407166 +3128 6 6.35644531 0.3564453125 0.12705326080322266 +3129 6 6.19748068 0.19748067855834961 0.038998618403866203 +3130 6 6.409672 0.40967178344726563 0.1678309701528633 +3131 5 5.323311 0.32331085205078125 0.10452990705380216 +3132 6 6.22823238 0.22823238372802734 0.052090020982177521 +3133 6 6.804864 0.80486392974853516 0.64780594541025494 +3134 6 6.25683546 0.2568354606628418 0.065964453853894156 +3135 6 5.50061226 0.49938774108886719 0.24938811594984145 +3136 5 5.691658 0.69165802001953125 0.47839081665733829 +3137 6 5.91075134 0.0892486572265625 0.0079653228167444468 +3138 6 6.17344761 0.17344760894775391 0.030084073049692961 +3139 6 5.802101 0.19789886474609375 0.039163960667792708 +3140 6 5.50061226 0.49938774108886719 0.24938811594984145 +3141 7 5.9250927 1.0749073028564453 1.1554257097341178 +3142 6 5.879329 0.12067079544067383 0.014561440872284948 +3143 5 5.691658 0.69165802001953125 0.47839081665733829 +3144 6 5.77687073 0.2231292724609375 0.049786672228947282 +3145 6 5.77687073 0.2231292724609375 0.049786672228947282 +3146 6 5.77687073 0.2231292724609375 0.049786672228947282 +3147 6 5.7887 0.21129989624023438 0.044647646151133813 +3148 6 5.77687073 0.2231292724609375 0.049786672228947282 +3149 6 5.7887 0.21129989624023438 0.044647646151133813 +3150 6 6.552973 0.55297279357910156 0.30577891043867567 +3151 6 5.77687073 0.2231292724609375 0.049786672228947282 +3152 6 6.29596758 0.29596757888793945 0.087596807752788663 +3153 6 6.57904625 0.57904624938964844 0.33529455893221893 +3154 6 6.63049746 0.63049745559692383 0.39752704151419493 +3155 7 6.82934952 0.17065048217773438 0.029121587067493238 +3156 5 5.67358 0.67358016967773438 0.45371024498308543 +3157 7 6.82934952 0.17065048217773438 0.029121587067493238 +3158 7 6.98705864 0.012941360473632813 0.00016747881090850569 +3159 6 6.197915 0.19791507720947266 0.039170377786831523 +3160 6 5.27915764 0.72084236145019531 0.51961371006109403 +3161 5 5.67358 0.67358016967773438 0.45371024498308543 +3162 7 6.82934952 0.17065048217773438 0.029121587067493238 +3163 7 6.98705864 0.012941360473632813 0.00016747881090850569 +3164 6 6.049068 0.049067974090576172 0.0024076660813534545 +3165 6 5.795661 0.20433902740478516 0.041754438120733539 +3166 6 6.68478 0.68478012084960938 0.46892381391080562 +3167 7 6.718583 0.28141689300537109 0.079195467668796482 +3168 6 6.54174137 0.54174137115478516 0.29348371322066669 +3169 6 5.92151976 0.078480243682861328 0.0061591486485212954 +3170 6 5.791986 0.20801401138305664 0.043269828931670418 +3171 6 6.27425241 0.27425241470336914 0.075214386970628766 +3172 8 6.91158056 1.0884194374084473 1.1846568717285209 +3173 8 6.943484 1.056516170501709 1.1162264185315962 +3174 8 7.140918 0.85908222198486328 0.73802226413044991 +3175 6 5.82636833 0.17363166809082031 0.030147956164000789 +3176 6 6.27425241 0.27425241470336914 0.075214386970628766 +3177 5 5.40304852 0.40304851531982422 0.16244810570151458 +3178 6 5.904733 0.095266819000244141 0.009075766802425278 +3179 4 5.34976625 1.3497662544250488 1.8218689415846256 +3180 6 6.09114075 0.0911407470703125 0.0083066357765346766 +3181 6 5.82293367 0.17706632614135742 0.031352483853197555 +3182 5 5.466745 0.46674489974975586 0.21785080144240965 +3183 6 6.09114075 0.0911407470703125 0.0083066357765346766 +3184 7 6.72175 0.27825021743774414 0.077423183504151893 +3185 6 6.193929 0.19392919540405273 0.037608532830063268 +3186 4 4.74268866 0.74268865585327148 0.55158643953313913 +3187 7 6.51981544 0.48018455505371094 0.23057720691213035 +3188 8 6.383476 1.6165242195129395 2.6131505522719181 +3189 5 6.088178 1.0881781578063965 1.1841317031269227 +3190 7 6.87083149 0.12916851043701172 0.016684504088516405 +3191 6 6.10227966 0.1022796630859375 0.010461129480972886 +3192 6 5.82293367 0.17706632614135742 0.031352483853197555 +3193 5 5.466745 0.46674489974975586 0.21785080144240965 +3194 5 5.14224625 0.14224624633789063 0.020233994597219862 +3195 6 6.35519457 0.3551945686340332 0.12616318158711692 +3196 7 6.662787 0.33721303939819336 0.11371263394016751 +3197 6 6.28416348 0.28416347503662109 0.08074888054488838 +3198 7 6.662787 0.33721303939819336 0.11371263394016751 +3199 7 6.551546 0.44845390319824219 0.20111090329373837 +3200 7 6.88238239 0.11761760711669922 0.013833901503858215 +3201 6 6.28416348 0.28416347503662109 0.08074888054488838 +3202 7 6.82695961 0.17304039001464844 0.029942976576421643 +3203 7 6.662787 0.33721303939819336 0.11371263394016751 +3204 5 5.4833374 0.48333740234375 0.23361504450440407 +3205 7 6.790349 0.20965099334716797 0.043953539011454268 +3206 7 6.6648407 0.3351593017578125 0.11233175755478442 +3207 6 5.90315056 0.096849441528320313 0.0093798143243475351 +3208 5 5.82796144 0.82796144485473633 0.68552015416594259 +3209 5 5.283647 0.28364706039428711 0.080455654870320359 +3210 5 5.10347 0.1034698486328125 0.010706009576097131 +3211 6 6.325734 0.32573413848876953 0.10610272897702089 +3212 5 5.89880943 0.89880943298339844 0.80785839681993821 +3213 6 6.095028 0.095027923583984375 0.0090303062606835738 +3214 6 6.032912 0.032911777496337891 0.0010831850979684532 +3215 6 6.215619 0.21561908721923828 0.046491590773257485 +3216 5 6.05285549 1.0528554916381836 1.1085046862726813 +3217 5 5.10347 0.1034698486328125 0.010706009576097131 +3218 4 4.99512243 0.99512243270874023 0.99026865608016124 +3219 7 7.1460166 0.14601659774780273 0.021320846817843631 +3220 5 5.281718 0.28171777725219727 0.079364906019918635 +3221 6 6.06428576 0.064285755157470703 0.0041326583161662711 +3222 6 6.43231153 0.4323115348815918 0.18689326319167776 +3223 6 6.325734 0.32573413848876953 0.10610272897702089 +3224 6 6.32958174 0.32958173751831055 0.10862412170558855 +3225 7 6.761118 0.23888206481933594 0.057064640892349416 +3226 6 5.82882 0.17117977142333984 0.029302514144546876 +3227 6 5.391242 0.60875797271728516 0.3705862693468589 +3228 6 5.322149 0.67785120010375977 0.45948224948210736 +3229 7 6.31338024 0.68661975860595703 0.4714466929081027 +3230 6 5.74693727 0.25306272506713867 0.064040742818406216 +3231 6 6.2914443 0.29144430160522461 0.084939780938157128 +3232 5 5.656669 0.65666913986206055 0.43121435924717844 +3233 6 6.092935 0.092935085296630859 0.0086369300790920533 +3234 6 5.68389225 0.31610774993896484 0.099924109571475128 +3235 6 6.32958174 0.32958173751831055 0.10862412170558855 +3236 6 6.649334 0.64933395385742188 0.42163458363211248 +3237 7 6.340934 0.65906620025634766 0.43436825632034015 +3238 5 5.51837444 0.51837444305419922 0.26871206321175123 +3239 7 6.528462 0.47153806686401367 0.22234814850185103 +3240 6 6.119747 0.11974716186523438 0.014339382774778642 +3241 7 6.288209 0.71179103851318359 0.50664648250767641 +3242 6 6.735002 0.73500204086303711 0.54022800007282967 +3243 7 6.528462 0.47153806686401367 0.22234814850185103 +3244 7 6.99367666 0.0063233375549316406 3.9984597833608859E-05 +3245 5 5.51837444 0.51837444305419922 0.26871206321175123 +3246 6 6.341593 0.34159278869628906 0.11668563328930759 +3247 6 6.160589 0.16058921813964844 0.025788896982703591 +3248 7 6.334379 0.66562080383300781 0.44305105449529947 +3249 7 6.340934 0.65906620025634766 0.43436825632034015 +3250 6 6.49080849 0.49080848693847656 0.24089297085083672 +3251 6 5.777203 0.22279691696166992 0.049638466207625243 +3252 8 7.08904171 0.91095829010009766 0.82984500630209368 +3253 8 6.85280943 1.1471905708312988 1.3160462058042413 +3254 5 5.71421432 0.71421432495117188 0.51010210196545813 +3255 6 6.17674065 0.17674064636230469 0.031237256076565245 +3256 6 6.17674065 0.17674064636230469 0.031237256076565245 +3257 6 6.17674065 0.17674064636230469 0.031237256076565245 +3258 6 6.17674065 0.17674064636230469 0.031237256076565245 +3259 6 6.17674065 0.17674064636230469 0.031237256076565245 +3260 6 6.17674065 0.17674064636230469 0.031237256076565245 +3261 5 6.501572 1.5015721321105957 2.2547188679311603 +3262 7 6.08501053 0.91498947143554688 0.83720573283790145 +3263 8 6.942888 1.0571122169494629 1.1174862392238083 +3264 6 5.505711 0.49428892135620117 0.24432153777547683 +3265 3 4.54897 1.5489702224731445 2.3993087501085029 +3266 6 6.58011961 0.58011960983276367 0.33653876171251795 +3267 6 5.685798 0.31420183181762695 0.098722791117552333 +3268 6 6.51728153 0.51728153228759766 0.26758018364580494 +3269 5 5.194649 0.19464921951293945 0.037888318656996489 +3270 5 5.62863445 0.62863445281982422 0.3951812752720798 +3271 7 6.91132069 0.088679313659667969 0.007864020671149774 +3272 7 6.28210831 0.71789169311523438 0.51536848304385785 +3273 7 6.65070963 0.34929037094116211 0.12200376323221462 +3274 5 6.301177 1.3011770248413086 1.6930616499748794 +3275 4 4.98606348 0.98606348037719727 0.9723211873335913 +3276 8 6.586558 1.4134421348571777 1.9978186685896162 +3277 7 6.193134 0.80686616897583008 0.65103301463773278 +3278 5 5.194649 0.19464921951293945 0.037888318656996489 +3279 6 6.136546 0.13654613494873047 0.018644846969436912 +3280 5 5.62863445 0.62863445281982422 0.3951812752720798 +3281 6 6.2605443 0.2605443000793457 0.067883332303836141 +3282 7 6.755175 0.24482488632202148 0.059939224962590743 +3283 6 5.89885426 0.10114574432373047 0.010230461594801454 +3284 6 6.46161127 0.46161127090454102 0.21308496542610555 +3285 7 6.49714661 0.5028533935546875 0.25286153540946543 +3286 7 6.49714661 0.5028533935546875 0.25286153540946543 +3287 7 6.49714661 0.5028533935546875 0.25286153540946543 +3288 6 5.89885426 0.10114574432373047 0.010230461594801454 +3289 5 5.394889 0.39488887786865234 0.15593722586436343 +3290 5 5.02319241 0.023192405700683594 0.00053788768218510086 +3291 8 7.547108 0.45289182662963867 0.20511100662793069 +3292 5 5.335712 0.33571195602416992 0.1127025174175742 +3293 7 6.790994 0.20900583267211914 0.043683438090965865 +3294 6 5.969035 0.030964851379394531 0.0009588220209479914 +3295 5 5.335712 0.33571195602416992 0.1127025174175742 +3296 5 5.394889 0.39488887786865234 0.15593722586436343 +3297 5 5.25800228 0.25800228118896484 0.066565177098709682 +3298 6 6.58663559 0.58663558959960938 0.34414131498488132 +3299 7 6.85647964 0.14352035522460938 0.02059809236379806 +3300 5 5.02319241 0.023192405700683594 0.00053788768218510086 +3301 8 7.547108 0.45289182662963867 0.20511100662793069 +3302 6 6.49868536 0.49868535995483398 0.24868708823328234 +3303 7 7.06750154 0.067501544952392578 0.0045564585709598759 +3304 7 6.8259 0.17409992218017578 0.030310782903143263 +3305 7 6.88384533 0.11615467071533203 0.013491907528987213 +3306 7 6.8259 0.17409992218017578 0.030310782903143263 +3307 3 4.26481676 1.2648167610168457 1.5997614389491446 +3308 6 5.821937 0.17806291580200195 0.031706401983910837 +3309 7 6.864188 0.13581180572509766 0.018444846574311669 +3310 7 6.63826466 0.36173534393310547 0.1308524590504021 +3311 7 6.64104462 0.35895538330078125 0.12884896720061079 +3312 7 6.83067465 0.16932535171508789 0.028671074733438218 +3313 7 6.495117 0.5048828125 0.25490665435791016 +3314 6 5.24939156 0.75060844421386719 0.56341303652516217 +3315 7 6.582058 0.41794204711914063 0.17467555475013796 +3316 6 6.150711 0.1507110595703125 0.022713823476806283 +3317 6 6.219473 0.21947288513183594 0.048168347308092052 +3318 7 6.88627434 0.11372566223144531 0.012933526249980787 +3319 5 5.747709 0.74770879745483398 0.55906844579135395 +3320 5 5.46364069 0.46364068984985352 0.21496268928444806 +3321 6 6.665048 0.66504812240600586 0.44228900511575375 +3322 7 6.532551 0.46744918823242188 0.21850874357915018 +3323 6 6.240052 0.24005222320556641 0.057625069865935075 +3324 6 6.08869743 0.088697433471679688 0.0078672347044630442 +3325 7 6.89654064 0.10345935821533203 0.010703838802328391 +3326 5 5.79227972 0.79227972030639648 0.62770715520878184 +3327 7 6.35024261 0.64975738525390625 0.42218465969199315 +3328 5 6.04183865 1.0418386459350586 1.0854277641637964 +3329 6 6.247655 0.24765491485595703 0.061332956852311327 +3330 6 5.831267 0.16873311996459961 0.028470865772987963 +3331 6 5.919561 0.080439090728759766 0.0064704473172696453 +3332 7 6.377422 0.62257814407348633 0.3876035454779867 +3333 6 5.8897295 0.11027050018310547 0.012159583210632263 +3334 6 6.143303 0.14330291748046875 0.020535726158414036 +3335 6 5.75408459 0.24591541290283203 0.060474390303170367 +3336 6 5.75408459 0.24591541290283203 0.060474390303170367 +3337 6 5.75408459 0.24591541290283203 0.060474390303170367 +3338 6 5.60831547 0.39168453216552734 0.15341677273772802 +3339 6 5.82486 0.1751399040222168 0.030673985980911311 +3340 6 6.15751743 0.15751743316650391 0.024811741751364025 +3341 6 5.82486 0.1751399040222168 0.030673985980911311 +3342 5 6.1723876 1.1723875999450684 1.3744926845049577 +3343 7 5.75408459 1.245915412902832 1.5523052161088344 +3344 6 5.75408459 0.24591541290283203 0.060474390303170367 +3345 6 5.966821 0.033178806304931641 0.0011008331878201716 +3346 6 6.03729343 0.037293434143066406 0.0013908002301832312 +3347 6 5.92844629 0.071553707122802734 0.0051199330030158308 +3348 6 5.60831547 0.39168453216552734 0.15341677273772802 +3349 6 5.91756773 0.082432270050048828 0.006795079145604177 +3350 6 6.548047 0.54804706573486328 0.30035558626059355 +3351 6 6.277173 0.27717304229736328 0.076824895376375935 +3352 6 6.47151852 0.47151851654052734 0.22232971144057956 +3353 6 6.58518934 0.5851893424987793 0.34244656657415362 +3354 7 6.602699 0.39730119705200195 0.15784824117895369 +3355 6 6.42606449 0.42606449127197266 0.18153095072284486 +3356 6 6.10781574 0.10781574249267578 0.011624234329246974 +3357 7 6.543994 0.45600605010986328 0.20794151773679914 +3358 6 6.47151852 0.47151851654052734 0.22232971144057956 +3359 6 6.58518934 0.5851893424987793 0.34244656657415362 +3360 7 6.2223 0.77769994735717773 0.60481720811935702 +3361 6 5.91756773 0.082432270050048828 0.006795079145604177 +3362 6 6.548047 0.54804706573486328 0.30035558626059355 +3363 6 6.277173 0.27717304229736328 0.076824895376375935 +3364 6 5.90372133 0.096278667449951172 0.0092695818059382873 +3365 7 6.63396263 0.36603736877441406 0.13398335533929639 +3366 6 5.96370554 0.036294460296630859 0.0013172878482237138 +3367 6 6.489716 0.4897160530090332 0.23982181257474622 +3368 6 6.01148844 0.011488437652587891 0.00013198419969739916 +3369 7 6.62011242 0.37988758087158203 0.14431457410046278 +3370 6 6.489716 0.4897160530090332 0.23982181257474622 +3371 6 5.96370554 0.036294460296630859 0.0013172878482237138 +3372 6 6.022456 0.022456169128417969 0.00050427953192411223 +3373 7 6.69619131 0.30380868911743164 0.092299719583252227 +3374 5 5.58121252 0.58121252059936523 0.33780799410146756 +3375 6 5.89713144 0.10286855697631836 0.010581940014390057 +3376 6 6.01148844 0.011488437652587891 0.00013198419969739916 +3377 6 5.62079573 0.37920427322387695 0.14379588083124872 +3378 8 6.87112474 1.1288752555847168 1.2743593426714597 +3379 5 5.21237 0.21236991882324219 0.045100982420990476 +3380 7 6.88039255 0.11960744857788086 0.014305941755310414 +3381 7 6.271736 0.72826385498046875 0.53036824247101322 +3382 7 6.88039255 0.11960744857788086 0.014305941755310414 +3383 6 6.329866 0.32986593246459961 0.10881153340073979 +3384 6 5.979552 0.020448207855224609 0.00041812920449046942 +3385 6 6.449695 0.44969511032104492 0.20222569224665676 +3386 8 6.87112474 1.1288752555847168 1.2743593426714597 +3387 5 5.21237 0.21236991882324219 0.045100982420990476 +3388 6 6.05053949 0.050539493560791016 0.0025542404093812365 +3389 7 6.30515575 0.69484424591064453 0.48280852607513225 +3390 6 6.66295433 0.66295433044433594 0.43950844425489777 +3391 8 6.74995852 1.2500414848327637 1.5626037138029005 +3392 6 6.621238 0.62123823165893555 0.38593694047472127 +3393 6 6.36947775 0.36947774887084961 0.13651380691067061 +3394 5 5.39704227 0.39704227447509766 0.15764256772035878 +3395 5 5.373434 0.37343406677246094 0.13945300222621881 +3396 6 6.138471 0.13847112655639648 0.019174252889797572 +3397 6 5.92073 0.079269886016845703 0.0062837148291237099 +3398 5 5.2734704 0.27347040176391602 0.07478606064091764 +3399 6 6.54232168 0.54232168197631836 0.29411280674162299 +3400 6 5.57562637 0.42437362670898438 0.18009297504613642 +3401 5 5.95026827 0.95026826858520508 0.90300978227992346 +3402 6 5.57562637 0.42437362670898438 0.18009297504613642 +3403 5 5.576545 0.57654476165771484 0.33240386219495122 +3404 6 5.64468765 0.35531234741210938 0.12624686422350351 +3405 6 5.69383144 0.30616855621337891 0.093739184813784959 +3406 6 6.54232168 0.54232168197631836 0.29411280674162299 +3407 5 5.2734704 0.27347040176391602 0.07478606064091764 +3408 6 5.49997 0.5000300407409668 0.25003004164341291 +3409 3 5.422972 2.4229722023010254 5.8707942931234811 +3410 7 6.42703629 0.57296371459960938 0.32828741824778263 +3411 6 6.082336 0.082335948944091797 0.0067792084885240911 +3412 6 5.93208647 0.067913532257080078 0.0046122478636334563 +3413 6 5.80584955 0.19415044784545898 0.037694396398592289 +3414 7 6.42703629 0.57296371459960938 0.32828741824778263 +3415 7 6.906441 0.093558788299560547 0.0087532468680819875 +3416 6 5.7981596 0.20184040069580078 0.040739547353041416 +3417 4 5.648217 1.6482172012329102 2.7166199424400475 +3418 6 5.7981596 0.20184040069580078 0.040739547353041416 +3419 7 6.906441 0.093558788299560547 0.0087532468680819875 +3420 5 5.076156 0.076156139373779297 0.0057997575643184973 +3421 8 6.9551363 1.0448637008666992 1.0917401533888551 +3422 8 7.30042028 0.69957971572875977 0.48941177865913232 +3423 5 6.032946 1.0329461097717285 1.0669776656925478 +3424 6 6.488739 0.488739013671875 0.23886582348495722 +3425 6 6.02926636 0.029266357421875 0.0008565196767449379 +3426 6 6.02926636 0.029266357421875 0.0008565196767449379 +3427 6 6.38952971 0.38952970504760742 0.15173339111447603 +3428 6 6.488739 0.488739013671875 0.23886582348495722 +3429 5 6.032946 1.0329461097717285 1.0669776656925478 +3430 6 6.02926636 0.029266357421875 0.0008565196767449379 +3431 6 5.95420551 0.045794486999511719 0.0020971350395484478 +3432 5 5.72369337 0.7236933708190918 0.52373209496749951 +3433 7 6.750839 0.2491607666015625 0.062081087613478303 +3434 6 5.810501 0.1894989013671875 0.035909833619371057 +3435 6 6.1824975 0.18249750137329102 0.033305338007494356 +3436 6 5.727087 0.27291297912597656 0.074481494175415719 +3437 5 5.06997871 0.069978713989257813 0.0048970204115903471 +3438 5 5.142187 0.14218711853027344 0.020217176675942028 +3439 5 5.06997871 0.069978713989257813 0.0048970204115903471 +3440 5 6.299023 1.2990231513977051 1.687461147867225 +3441 5 5.871353 0.8713531494140625 0.75925631099380553 +3442 7 6.475973 0.52402687072753906 0.27460416124449694 +3443 6 5.77484274 0.22515726089477539 0.050695792133637951 +3444 5 5.142187 0.14218711853027344 0.020217176675942028 +3445 8 7.56190634 0.43809366226196289 0.19192605691409881 +3446 6 5.56571674 0.43428325653076172 0.18860194690296339 +3447 6 5.97198 0.028019905090332031 0.00078511508127121488 +3448 7 7.236706 0.23670578002929688 0.056029626299277879 +3449 8 7.56190634 0.43809366226196289 0.19192605691409881 +3450 7 6.3905983 0.60940170288085938 0.37137043547409121 +3451 7 6.3905983 0.60940170288085938 0.37137043547409121 +3452 5 5.2537384 0.2537384033203125 0.064383177319541574 +3453 6 6.451767 0.4517669677734375 0.20409339317120612 +3454 5 5.83826256 0.83826255798339844 0.70268411611687043 +3455 6 6.087614 0.087614059448242188 0.0076762234130001161 +3456 5 5.18407774 0.18407773971557617 0.033884614258795409 +3457 7 6.77673864 0.22326135635375977 0.049845633240920506 +3458 7 6.964019 0.035981178283691406 0.0012946451906827861 +3459 6 5.74584675 0.25415325164794922 0.064593875323225802 +3460 6 6.082861 0.082860946655273438 0.0068659364806080703 +3461 8 6.961732 1.0382680892944336 1.0780006252471139 +3462 6 6.55186653 0.55186653137207031 0.30455666844864027 +3463 7 6.69814539 0.30185461044311523 0.091116205845764853 +3464 5 5.50059557 0.5005955696105957 0.25059592431375677 +3465 6 6.59844732 0.59844732284545898 0.35813919822089701 +3466 6 6.55186653 0.55186653137207031 0.30455666844864027 +3467 5 5.563209 0.56320905685424805 0.31720444172265161 +3468 8 6.88234329 1.1176567077636719 1.2491565164091298 +3469 6 5.74584675 0.25415325164794922 0.064593875323225802 +3470 8 6.961732 1.0382680892944336 1.0780006252471139 +3471 6 6.082861 0.082860946655273438 0.0068659364806080703 +3472 6 6.01162863 0.011628627777099609 0.0001352249839783326 +3473 8 7.18201542 0.81798458099365234 0.66909877474336099 +3474 6 5.63225842 0.36774158477783203 0.13523387317491142 +3475 6 5.40958738 0.59041261672973633 0.34858705799365453 +3476 8 7.50562334 0.49437665939331055 0.24440828135288939 +3477 7 6.33354568 0.66645431518554688 0.44416135422943626 +3478 6 5.40958738 0.59041261672973633 0.34858705799365453 +3479 7 7.05457735 0.054577350616455078 0.0029786872003114695 +3480 8 7.18201542 0.81798458099365234 0.66909877474336099 +3481 5 5.544877 0.54487705230712891 0.29689100213090569 +3482 8 7.38687229 0.61312770843505859 0.37592558685082622 +3483 7 6.93566942 0.064330577850341797 0.0041384232465588866 +3484 8 7.50562334 0.49437665939331055 0.24440828135288939 +3485 7 5.966811 1.0331888198852539 1.0674791375358836 +3486 6 5.97899151 0.021008491516113281 0.00044135671578260371 +3487 6 5.63225842 0.36774158477783203 0.13523387317491142 +3488 6 5.864976 0.13502407073974609 0.018231499679131957 +3489 8 5.93400049 2.0659995079040527 4.2683539666597881 +3490 7 6.33354568 0.66645431518554688 0.44416135422943626 +3491 6 5.643201 0.35679912567138672 0.12730561607986601 +3492 7 6.964281 0.035718917846679688 0.0012758410921378527 +3493 7 6.964281 0.035718917846679688 0.0012758410921378527 +3494 6 6.46383333 0.46383333206176758 0.21514135993152195 +3495 7 6.202251 0.79774904251098633 0.63640353482719547 +3496 7 6.71060753 0.28939247131347656 0.083748002452921355 +3497 6 6.189627 0.18962717056274414 0.035958463815632058 +3498 6 5.998056 0.0019440650939941406 3.7793890896864468E-06 +3499 7 6.951072 0.048927783966064453 0.0023939280438298738 +3500 7 6.964281 0.035718917846679688 0.0012758410921378527 +3501 6 6.46383333 0.46383333206176758 0.21514135993152195 +3502 5 5.359978 0.35997819900512695 0.12958430375897478 +3503 7 6.623074 0.37692594528198242 0.14207316822671601 +3504 7 6.968294 0.031705856323242188 0.0010052613251900766 +3505 7 6.662663 0.33733701705932617 0.11379626307848412 +3506 6 6.008993 0.0089931488037109375 8.0876725405687466E-05 +3507 7 6.8172183 0.18278169631958008 0.033409148509463193 +3508 5 5.359978 0.35997819900512695 0.12958430375897478 +3509 6 5.552432 0.44756793975830078 0.20031706069948996 +3510 6 6.08410835 0.084108352661132813 0.0070742149873694871 +3511 7 6.244049 0.755950927734375 0.57146180514246225 +3512 6 6.395756 0.39575576782226563 0.15662262776459102 +3513 6 6.185595 0.18559503555297852 0.034445517221911359 +3514 6 6.555742 0.55574178695678711 0.30884893376992295 +3515 7 6.56011248 0.43988752365112305 0.19350103346391734 +3516 7 6.702535 0.29746484756469727 0.088485335536688581 +3517 7 6.74328136 0.25671863555908203 0.065904457843316777 +3518 5 5.76964235 0.76964235305786133 0.59234935162044167 +3519 7 6.80649 0.19351005554199219 0.037446141595864901 +3520 5 5.17342043 0.17342042922973633 0.030074645274225986 +3521 7 6.38570261 0.61429738998413086 0.37736128334131536 +3522 5 5.27163553 0.27163553237915039 0.07378586245090446 +3523 5 5.17342043 0.17342042922973633 0.030074645274225986 +3524 6 6.421357 0.42135715484619141 0.17754185194007732 +3525 6 6.421357 0.42135715484619141 0.17754185194007732 +3526 6 5.650917 0.34908294677734375 0.12185890373075381 +3527 6 5.721257 0.27874279022216797 0.077697543100839539 +3528 4 4.36278439 0.36278438568115234 0.13161251049405109 +3529 7 6.8538866 0.14611339569091797 0.021349124400330766 +3530 5 5.328351 0.32835102081298828 0.10781439286893146 +3531 5 5.26288748 0.26288747787475586 0.069109826023350251 +3532 6 5.973373 0.026627063751220703 0.00070900052401157154 +3533 6 5.69047642 0.30952358245849609 0.095804848097941431 +3534 5 5.328351 0.32835102081298828 0.10781439286893146 +3535 5 5.26288748 0.26288747787475586 0.069109826023350251 +3536 6 6.31200361 0.31200361251831055 0.09734625422447607 +3537 5 5.415464 0.41546392440795898 0.17261027248446226 +3538 7 6.860719 0.13928079605102539 0.01939914014860733 +3539 6 6.250553 0.25055313110351563 0.062776871505775489 +3540 6 6.65458345 0.65458345413208008 0.42847949842348498 +3541 6 6.17114735 0.17114734649658203 0.02929141421282111 +3542 6 5.865911 0.13408899307250977 0.017979858063199572 +3543 6 6.16405964 0.16405963897705078 0.02691556514128024 +3544 6 6.16405964 0.16405963897705078 0.02691556514128024 +3545 6 6.40442944 0.40442943572998047 0.1635631684848704 +3546 6 5.865911 0.13408899307250977 0.017979858063199572 +3547 6 6.40442944 0.40442943572998047 0.1635631684848704 +3548 6 6.439151 0.43915081024169922 0.19285343413594092 +3549 6 6.16405964 0.16405963897705078 0.02691556514128024 +3550 6 6.221413 0.22141313552856445 0.049023776584590451 +3551 6 5.89747572 0.1025242805480957 0.010511228101904635 +3552 6 5.89747572 0.1025242805480957 0.010511228101904635 +3553 6 5.89747572 0.1025242805480957 0.010511228101904635 +3554 6 5.779677 0.22032308578491211 0.04854226212978574 +3555 6 5.95665646 0.043343544006347656 0.0018786628070301958 +3556 7 6.283507 0.71649312973022461 0.51336240495061247 +3557 6 5.779677 0.22032308578491211 0.04854226212978574 +3558 6 5.89747572 0.1025242805480957 0.010511228101904635 +3559 4 4.46924639 0.46924638748168945 0.22019217216461584 +3560 6 6.027207 0.027206897735595703 0.0007402152843951626 +3561 5 4.87542772 0.1245722770690918 0.015518252214178574 +3562 6 6.710927 0.71092700958251953 0.50541721295394382 +3563 5 4.87542772 0.1245722770690918 0.015518252214178574 +3564 6 6.027207 0.027206897735595703 0.0007402152843951626 +3565 6 5.886134 0.11386585235595703 0.012965432332748605 +3566 6 5.784216 0.21578407287597656 0.046562766106944764 +3567 6 6.24212027 0.24212026596069336 0.058622223188876887 +3568 7 6.412253 0.58774709701538086 0.34544665005000752 +3569 6 5.886134 0.11386585235595703 0.012965432332748605 +3570 6 6.24212027 0.24212026596069336 0.058622223188876887 +3571 4 4.17565727 0.17565727233886719 0.030855477325530956 +3572 6 5.784216 0.21578407287597656 0.046562766106944764 +3573 6 5.893206 0.10679388046264648 0.011404932904270026 +3574 6 5.71906376 0.28093624114990234 0.078925171591436083 +3575 7 6.310657 0.68934297561645508 0.47519373803174858 +3576 5 5.51320839 0.51320838928222656 0.2633828508296574 +3577 7 6.553375 0.4466252326965332 0.19947409848123243 +3578 4 4.48985052 0.48985052108764648 0.23995353300983879 +3579 7 6.35095358 0.64904642105102539 0.42126125667914494 +3580 5 5.59056139 0.5905613899230957 0.34876275526789868 +3581 7 6.5851016 0.41489839553833008 0.1721406786202806 +3582 6 6.40672 0.40672016143798828 0.16542128972014325 +3583 6 5.589996 0.4100041389465332 0.1681033939532881 +3584 7 6.35095358 0.64904642105102539 0.42126125667914494 +3585 7 6.038584 0.96141576766967773 0.92432027832387575 +3586 7 6.453697 0.54630279541015625 0.29844674427295104 +3587 6 5.888291 0.1117091178894043 0.012478927019628827 +3588 6 5.888291 0.1117091178894043 0.012478927019628827 +3589 6 5.888291 0.1117091178894043 0.012478927019628827 +3590 7 6.386294 0.61370611190795898 0.37663519179318428 +3591 5 5.373103 0.37310314178466797 0.13920595440959005 +3592 7 6.2784214 0.72157859802246094 0.52067567312406027 +3593 7 6.453697 0.54630279541015625 0.29844674427295104 +3594 7 6.25252342 0.74747657775878906 0.55872123429799103 +3595 7 6.293587 0.70641279220581055 0.49901903299200967 +3596 7 6.48933029 0.51066970825195313 0.26078355092613492 +3597 6 6.12615252 0.12615251541137695 0.0159144571446177 +3598 7 6.79546547 0.20453453063964844 0.041834374223981285 +3599 6 5.39613247 0.60386753082275391 0.36465599478196964 +3600 6 6.126243 0.12624311447143555 0.015937323951447979 +3601 7 6.5767746 0.42322540283203125 0.17911974160233513 +3602 6 6.2805624 0.28056240081787109 0.078715260752687755 +3603 7 6.97933 0.020669937133789063 0.000427246301114792 +3604 6 6.16348 0.16347980499267578 0.026725646640443301 +3605 5 5.215407 0.21540689468383789 0.046400130277334029 +3606 5 5.326845 0.32684516906738281 0.10682776454268605 +3607 6 6.120127 0.12012720108032227 0.014430544439392179 +3608 6 6.303937 0.30393695831298828 0.092377674628551176 +3609 6 6.303937 0.30393695831298828 0.092377674628551176 +3610 5 5.215407 0.21540689468383789 0.046400130277334029 +3611 6 6.120127 0.12012720108032227 0.014430544439392179 +3612 6 5.96534 0.034659862518310547 0.0012013060697881883 +3613 6 6.303937 0.30393695831298828 0.092377674628551176 +3614 5 5.326845 0.32684516906738281 0.10682776454268605 +3615 6 5.992802 0.0071978569030761719 5.18091439971613E-05 +3616 5 5.1797595 0.17975950241088867 0.03231347870701029 +3617 5 5.709625 0.7096247673034668 0.5035673103704994 +3618 7 5.93767166 1.0623283386230469 1.1285414990416029 +3619 6 5.93743849 0.062561511993408203 0.0039139427829013584 +3620 7 6.57639551 0.42360448837280273 0.17944076256958397 +3621 7 5.93767166 1.0623283386230469 1.1285414990416029 +3622 6 5.992802 0.0071978569030761719 5.18091439971613E-05 +3623 6 5.93743849 0.062561511993408203 0.0039139427829013584 +3624 7 6.70226431 0.29773569107055664 0.088646541737261941 +3625 5 5.1797595 0.17975950241088867 0.03231347870701029 +3626 5 5.709625 0.7096247673034668 0.5035673103704994 +3627 5 5.4083004 0.40830039978027344 0.16670921646073111 +3628 6 5.4083004 0.59169960021972656 0.35010841690018424 +3629 6 5.439508 0.56049203872680664 0.31415132547613211 +3630 6 5.9350605 0.064939498901367188 0.0042171385175606702 +3631 6 5.9350605 0.064939498901367188 0.0042171385175606702 +3632 6 6.000576 0.000576019287109375 3.3179821912199259E-07 +3633 6 5.9350605 0.064939498901367188 0.0042171385175606702 +3634 7 6.35045671 0.64954328536987305 0.42190647956908833 +3635 6 5.988852 0.011147975921630859 0.00012427736714926141 +3636 7 6.46329165 0.53670835494995117 0.28805585827308278 +3637 7 6.37344074 0.62655925750732422 0.39257650316812942 +3638 7 6.816023 0.18397712707519531 0.033847583286842564 +3639 6 6.42620373 0.42620372772216797 0.18164961752427189 +3640 6 6.23901272 0.23901271820068359 0.057127079461679386 +3641 6 5.96011972 0.039880275726318359 0.0015904363920071773 +3642 6 5.96011972 0.039880275726318359 0.0015904363920071773 +3643 6 6.23901272 0.23901271820068359 0.057127079461679386 +3644 7 5.85681343 1.1431865692138672 1.306875532030972 +3645 6 6.322827 0.32282686233520508 0.10421718304519345 +3646 7 5.682053 1.3179469108581543 1.7369840598405517 +3647 7 6.89193344 0.10806655883789063 0.011678381139063276 +3648 5 5.93311071 0.93311071395874023 0.87069560450458994 +3649 6 6.4393816 0.43938159942626953 0.19305618991438678 +3650 4 5.088321 1.0883212089538574 1.1844430538587858 +3651 6 5.47234964 0.52765035629272461 0.27841489849583922 +3652 6 5.75456667 0.24543333053588867 0.060237519737938783 +3653 6 5.47234964 0.52765035629272461 0.27841489849583922 +3654 6 6.005105 0.0051050186157226563 2.6061215066874865E-05 +3655 7 7.06382561 0.063825607299804688 0.0040737081471888814 +3656 7 6.57216263 0.42783737182617188 0.18304481673112605 +3657 8 6.74494457 1.2550554275512695 1.5751641262259 +3658 7 6.426601 0.57339906692504883 0.32878648995051662 +3659 8 7.28102732 0.71897268295288086 0.51692171883246374 +3660 8 7.43201637 0.56798362731933594 0.3226054009028303 +3661 6 5.87479973 0.12520027160644531 0.015675108010327676 +3662 4 4.444296 0.44429588317871094 0.19739883180955076 +3663 6 6.57355452 0.57355451583862305 0.3289647826388773 +3664 8 7.28719854 0.71280145645141602 0.50808591631925992 +3665 8 7.28102732 0.71897268295288086 0.51692171883246374 +3666 7 6.201429 0.79857110977172852 0.63771581736205007 +3667 8 7.43201637 0.56798362731933594 0.3226054009028303 +3668 5 5.08625174 0.086251735687255859 0.007439361909064246 +3669 7 7.070973 0.070972919464111328 0.0050371552972592326 +3670 6 5.50858164 0.49141836166381836 0.24149200618035138 +3671 7 6.98739767 0.012602329254150391 0.00015881870263001474 +3672 8 6.814751 1.185248851776123 1.4048148406366181 +3673 7 7.064693 0.064692974090576172 0.0041851808966839599 +3674 5 5.351553 0.35155296325683594 0.12358948597466224 +3675 6 5.79090071 0.20909929275512695 0.043722514230694287 +3676 7 7.064693 0.064692974090576172 0.0041851808966839599 +3677 6 6.661447 0.66144704818725586 0.43751219755563397 +3678 5 5.223467 0.22346687316894531 0.04993744340390549 +3679 7 6.295772 0.70422792434692383 0.49593696942997667 +3680 6 6.05833054 0.058330535888671875 0.0034024514170596376 +3681 8 6.96025133 1.0397486686706543 1.081077294002398 +3682 7 6.61870956 0.38129043579101563 0.14538239642570261 +3683 6 6.05833054 0.058330535888671875 0.0034024514170596376 +3684 7 6.939511 0.060489177703857422 0.0036589406192888418 +3685 6 6.05833054 0.058330535888671875 0.0034024514170596376 +3686 5 5.18703556 0.18703556060791016 0.034982300931915233 +3687 5 6.00566769 1.0056676864624023 1.0113674955946408 +3688 6 6.442951 0.44295120239257813 0.19620576770103071 +3689 8 6.96025133 1.0397486686706543 1.081077294002398 +3690 7 6.398886 0.60111379623413086 0.3613377960230082 +3691 6 6.19952154 0.19952154159545898 0.03980884556062847 +3692 7 6.295772 0.70422792434692383 0.49593696942997667 +3693 7 6.939511 0.060489177703857422 0.0036589406192888418 +3694 5 5.223467 0.22346687316894531 0.04993744340390549 +3695 6 6.562827 0.56282711029052734 0.31677435607798543 +3696 7 6.61870956 0.38129043579101563 0.14538239642570261 +3697 6 6.20227432 0.20227432250976563 0.040914901546784677 +3698 6 6.24476767 0.24476766586303711 0.059911210252039382 +3699 5 5.18703556 0.18703556060791016 0.034982300931915233 +3700 5 5.53890038 0.53890037536621094 0.29041361456984305 +3701 5 5.22507954 0.22507953643798828 0.050660797723139694 +3702 6 5.941513 0.0584869384765625 0.003420721972361207 +3703 6 5.941513 0.0584869384765625 0.003420721972361207 +3704 6 5.941513 0.0584869384765625 0.003420721972361207 +3705 6 5.941513 0.0584869384765625 0.003420721972361207 +3706 6 6.31908274 0.31908273696899414 0.1018137930316243 +3707 6 6.21938229 0.21938228607177734 0.048128587442079152 +3708 5 5.010412 0.010412216186523438 0.00010841424591490068 +3709 5 5.063287 0.063286781311035156 0.0040052166887107887 +3710 5 4.81725 0.18275022506713867 0.03339764476208984 +3711 6 5.941513 0.0584869384765625 0.003420721972361207 +3712 5 5.657181 0.6571807861328125 0.43188658566214144 +3713 5 5.03699732 0.036997318267822266 0.0013688015590105351 +3714 4 5.321164 1.3211641311645508 1.7454746614757823 +3715 6 5.612789 0.38721084594726563 0.14993223921919707 +3716 5 5.60599041 0.60599040985107422 0.36722437683147291 +3717 6 5.615464 0.38453578948974609 0.14786777339850232 +3718 5 5.22507954 0.22507953643798828 0.050660797723139694 +3719 5 5.412348 0.41234779357910156 0.17003070286955335 +3720 7 6.9458456 0.054154396057128906 0.0029326986123123788 +3721 5 5.20603 0.20602989196777344 0.042448316384252394 +3722 5 5.092179 0.092178821563720703 0.0084969351448762609 +3723 7 6.59399366 0.4060063362121582 0.16484114504442005 +3724 6 6.11295557 0.11295557022094727 0.012758960843939349 +3725 6 6.23914957 0.23914957046508789 0.057192517053636038 +3726 7 6.5052247 0.49477529525756836 0.24480259279721395 +3727 7 6.59399366 0.4060063362121582 0.16484114504442005 +3728 7 6.74835062 0.25164937973022461 0.06332741031860678 +3729 5 5.165275 0.16527509689331055 0.02731585765309319 +3730 6 5.69498062 0.30501937866210938 0.093036821359419264 +3731 6 6.02322769 0.023227691650390625 0.00053952565940562636 +3732 5 5.165275 0.16527509689331055 0.02731585765309319 +3733 6 6.547697 0.54769706726074219 0.29997207748601795 +3734 5 5.53902769 0.53902769088745117 0.29055085154345761 +3735 6 6.158505 0.15850496292114258 0.025123823270632784 +3736 4 6.12302828 2.1230282783508301 4.5072490706772896 +3737 5 5.46979046 0.46979045867919922 0.22070307506601239 +3738 6 5.572047 0.42795276641845703 0.18314357028521044 +3739 7 6.902693 0.097307205200195313 0.0094686921838729177 +3740 7 6.902693 0.097307205200195313 0.0094686921838729177 +3741 7 6.902693 0.097307205200195313 0.0094686921838729177 +3742 7 6.902693 0.097307205200195313 0.0094686921838729177 +3743 7 6.902693 0.097307205200195313 0.0094686921838729177 +3744 7 6.902693 0.097307205200195313 0.0094686921838729177 +3745 7 6.902693 0.097307205200195313 0.0094686921838729177 +3746 5 6.3074255 1.3074254989624023 1.7093614353370867 +3747 6 5.65592 0.34407997131347656 0.11839102665908285 +3748 5 5.44331 0.44330978393554688 0.19652356453298125 +3749 6 6.37409163 0.37409162521362305 0.13994454405496981 +3750 7 6.902693 0.097307205200195313 0.0094686921838729177 +3751 5 5.414906 0.41490602493286133 0.17214700952558815 +3752 5 5.4259696 0.42596960067749023 0.18145010070134049 +3753 5 5.418661 0.41866111755371094 0.17527713135132217 +3754 8 7.4993434 0.5006566047668457 0.25065703589666555 +3755 6 6.004721 0.0047211647033691406 2.2289396156338626E-05 +3756 5 5.414906 0.41490602493286133 0.17214700952558815 +3757 5 5.4259696 0.42596960067749023 0.18145010070134049 +3758 5 5.418661 0.41866111755371094 0.17527713135132217 +3759 6 6.004721 0.0047211647033691406 2.2289396156338626E-05 +3760 6 6.099519 0.099518775939941406 0.0099039867645842605 +3761 7 6.424038 0.57596206665039063 0.33173230222018901 +3762 5 5.39447737 0.39447736740112305 0.15561239339172062 +3763 5 6.23878574 1.2387857437133789 1.5345901188275093 +3764 8 7.4993434 0.5006566047668457 0.25065703589666555 +3765 5 5.23694038 0.23694038391113281 0.056140745527955005 +3766 5 5.23694038 0.23694038391113281 0.056140745527955005 +3767 5 5.23694038 0.23694038391113281 0.056140745527955005 +3768 6 6.041478 0.041478157043457031 0.0017204375117216841 +3769 5 5.23694038 0.23694038391113281 0.056140745527955005 +3770 4 5.936505 1.9365048408508301 3.7500509986386987 +3771 6 5.83699274 0.16300725936889648 0.026571366606958691 +3772 6 6.041478 0.041478157043457031 0.0017204375117216841 +3773 5 5.532972 0.53297185897827148 0.28405900246275451 +3774 5 5.341634 0.34163379669189453 0.11671365104211873 +3775 6 6.535575 0.53557491302490234 0.28684048746163171 +3776 5 6.542175 1.5421748161315918 2.378303163510509 +3777 6 6.535575 0.53557491302490234 0.28684048746163171 +3778 7 6.77695847 0.22304153442382813 0.049747526078135706 +3779 7 7.021159 0.021159172058105469 0.00044771056218451122 +3780 5 5.341634 0.34163379669189453 0.11671365104211873 +3781 6 6.22220469 0.22220468521118164 0.049374922129800325 +3782 6 6.19974375 0.19974374771118164 0.039897564749708181 +3783 5 5.29999733 0.29999732971191406 0.089998397834278876 +3784 6 5.83858252 0.16141748428344727 0.026055604232396945 +3785 7 6.682988 0.31701183319091797 0.1004965023830664 +3786 5 5.253827 0.25382709503173828 0.064428194172251096 +3787 5 5.3683567 0.36835670471191406 0.13568666190622025 +3788 5 5.49224758 0.49224758148193359 0.24230768147481285 +3789 6 5.41641331 0.58358669281005859 0.34057342802498169 +3790 5 5.29999733 0.29999732971191406 0.089998397834278876 +3791 5 5.318728 0.31872797012329102 0.10158751893891349 +3792 6 6.15546274 0.15546274185180664 0.024168664104081472 +3793 6 5.484121 0.51587915420532227 0.26613130174359867 +3794 5 5.630953 0.63095283508300781 0.39810148009928525 +3795 6 5.83858252 0.16141748428344727 0.026055604232396945 +3796 6 6.275716 0.27571582794189453 0.076019217777684389 +3797 5 4.949187 0.050813198089599609 0.0025819811000928894 +3798 5 5.619088 0.61908817291259766 0.38327016584025841 +3799 5 5.74249935 0.74249935150146484 0.55130528698009584 +3800 5 5.288076 0.28807592391967773 0.082987737942175954 +3801 6 6.12135649 0.12135648727416992 0.014727397003525766 +3802 5 5.619088 0.61908817291259766 0.38327016584025841 +3803 6 5.972367 0.027633190155029297 0.00076359319814400806 +3804 5 5.288076 0.28807592391967773 0.082987737942175954 +3805 6 6.12135649 0.12135648727416992 0.014727397003525766 +3806 5 4.949187 0.050813198089599609 0.0025819811000928894 +3807 5 5.49812555 0.49812555313110352 0.24812906668216783 +3808 6 5.46538258 0.53461742401123047 0.28581579005640378 +3809 6 5.972367 0.027633190155029297 0.00076359319814400806 +3810 3 5.01898527 2.0189852714538574 4.0763015263476063 +3811 5 5.67463636 0.6746363639831543 0.45513422360841105 +3812 5 5.619088 0.61908817291259766 0.38327016584025841 +3813 5 5.74249935 0.74249935150146484 0.55130528698009584 +3814 5 5.54712248 0.54712247848510742 0.29934300646368683 +3815 7 6.68376064 0.31623935699462891 0.10000733091237635 +3816 5 5.502157 0.50215721130371094 0.2521618648643198 +3817 6 6.224747 0.2247471809387207 0.050511295339902063 +3818 6 6.36671352 0.36671352386474609 0.1344788085852997 +3819 6 6.36671352 0.36671352386474609 0.1344788085852997 +3820 5 5.81098461 0.81098461151123047 0.65769604010802141 +3821 6 6.05161476 0.051614761352539063 0.00266408358947956 +3822 6 6.34748936 0.34748935699462891 0.12074885322454065 +3823 5 5.35581064 0.35581064224243164 0.12660121313297168 +3824 7 6.313596 0.68640422821044922 0.47115076450518245 +3825 6 6.502141 0.50214099884033203 0.25214558271636633 +3826 6 6.36671352 0.36671352386474609 0.1344788085852997 +3827 5 5.444129 0.44412899017333984 0.1972505599123906 +3828 6 6.224747 0.2247471809387207 0.050511295339902063 +3829 7 6.802661 0.19733905792236328 0.03894270378168585 +3830 7 6.51380157 0.48619842529296875 0.23638890875736251 +3831 5 5.103173 0.10317277908325195 0.010644622343761512 +3832 5 5.103173 0.10317277908325195 0.010644622343761512 +3833 6 6.3959136 0.39591360092163086 0.15674757939473238 +3834 5 5.180339 0.18033885955810547 0.032522104266718088 +3835 5 4.90732861 0.092671394348144531 0.0085879873304293142 +3836 6 6.09283924 0.092839241027832031 0.0086191246746238903 +3837 6 6.09283924 0.092839241027832031 0.0086191246746238903 +3838 5 5.180339 0.18033885955810547 0.032522104266718088 +3839 5 4.90732861 0.092671394348144531 0.0085879873304293142 +3840 6 6.257716 0.25771617889404297 0.066417628863746359 +3841 6 6.037991 0.037991046905517578 0.0014433196449772367 +3842 6 6.084455 0.084455013275146484 0.0071326492673051689 +3843 7 7.1089077 0.10890769958496094 0.011860887028888101 +3844 6 6.257716 0.25771617889404297 0.066417628863746359 +3845 5 5.053433 0.053432941436767578 0.0028550792305850337 +3846 6 6.37613249 0.37613248825073242 0.14147564871768736 +3847 5 5.053433 0.053432941436767578 0.0028550792305850337 +3848 6 5.7364707 0.26352930068969727 0.069447692322000876 +3849 5 5.233253 0.23325300216674805 0.054406963019800969 +3850 6 6.37613249 0.37613248825073242 0.14147564871768736 +3851 7 6.929842 0.070158004760742188 0.0049221456320083234 +3852 6 6.31295061 0.31295061111450195 0.097938084996940233 +3853 7 7.062208 0.062208175659179688 0.0038698571188433561 +3854 6 6.633592 0.63359212875366211 0.40143898561859714 +3855 6 6.38073063 0.38073062896728516 0.14495581183382455 +3856 6 6.31295061 0.31295061111450195 0.097938084996940233 +3857 6 6.104832 0.10483217239379883 0.010989784368803157 +3858 6 6.46388531 0.46388530731201172 0.21518957833995955 +3859 5 5.37704372 0.37704372406005859 0.14216196985307761 +3860 5 5.37704372 0.37704372406005859 0.14216196985307761 +3861 6 5.91738462 0.082615375518798828 0.0068253002721121447 +3862 6 5.55067539 0.44932460784912109 0.20189260321876645 +3863 6 5.55067539 0.44932460784912109 0.20189260321876645 +3864 7 6.45273542 0.54726457595825195 0.29949851609876532 +3865 6 6.76371431 0.76371431350708008 0.5832595526555906 +3866 6 6.109606 0.10960578918457031 0.01201342902277247 +3867 5 5.37704372 0.37704372406005859 0.14216196985307761 +3868 6 4.58308935 1.4169106483459473 2.0076357853961326 +3869 6 5.91738462 0.082615375518798828 0.0068253002721121447 +3870 6 5.722472 0.27752780914306641 0.077021684847750294 +3871 6 5.55067539 0.44932460784912109 0.20189260321876645 +3872 4 4.840269 0.84026908874511719 0.70605214150054962 +3873 5 5.002661 0.0026612281799316406 7.0821354256622726E-06 +3874 5 5.39184475 0.39184474945068359 0.153542307672069 +3875 7 6.180214 0.81978607177734375 0.6720492034801282 +3876 5 5.301948 0.30194807052612305 0.091172637294448577 +3877 5 5.831956 0.83195590972900391 0.6921506357330145 +3878 5 5.28575039 0.28575038909912109 0.081653284870299103 +3879 4 4.310555 0.31055498123168945 0.096444396367814988 +3880 6 5.79356766 0.20643234252929688 0.042614312042132951 +3881 6 5.79356766 0.20643234252929688 0.042614312042132951 +3882 5 5.91559362 0.91559362411499023 0.83831168452002203 +3883 6 6.63259 0.63258981704711914 0.40016987663170767 +3884 6 5.79356766 0.20643234252929688 0.042614312042132951 +3885 6 6.19061327 0.1906132698059082 0.036333418626099956 +3886 6 6.63259 0.63258981704711914 0.40016987663170767 +3887 6 6.19061327 0.1906132698059082 0.036333418626099956 +3888 6 5.79356766 0.20643234252929688 0.042614312042132951 +3889 6 6.067399 0.067399024963378906 0.004542628566014173 +3890 6 6.32966375 0.32966375350952148 0.10867819037798654 +3891 5 5.91559362 0.91559362411499023 0.83831168452002203 +3892 5 5.64307261 0.64307260513305664 0.41354237547261619 +3893 5 4.68508339 0.31491661071777344 0.099172471705969656 +3894 6 6.1910696 0.19106960296630859 0.036507593177702802 +3895 6 6.36921835 0.36921834945678711 0.13632218957559417 +3896 6 5.7608676 0.23913240432739258 0.057184306799399565 +3897 6 6.14779139 0.14779138565063477 0.021842293672534652 +3898 7 6.195396 0.80460405349731445 0.64738768290430926 +3899 5 5.64307261 0.64307260513305664 0.41354237547261619 +3900 5 4.68508339 0.31491661071777344 0.099172471705969656 +3901 4 4.17080164 0.17080163955688477 0.029173200075319983 +3902 6 5.770632 0.22936820983886719 0.05260977568468661 +3903 6 5.90663528 0.093364715576171875 0.0087169701146194711 +3904 7 7.11299229 0.11299228668212891 0.012767256849656405 +3905 7 6.885009 0.11499118804931641 0.013222973328993248 +3906 7 6.885009 0.11499118804931641 0.013222973328993248 +3907 7 6.712919 0.28708076477050781 0.08241536550121964 +3908 7 6.27674341 0.72325658798217773 0.5231000920596216 +3909 7 6.27674341 0.72325658798217773 0.5231000920596216 +3910 6 6.75025 0.75024986267089844 0.56287485643770196 +3911 6 5.52746964 0.47253036499023438 0.22328494583780412 +3912 7 6.885009 0.11499118804931641 0.013222973328993248 +3913 6 5.81515455 0.1848454475402832 0.03416783947636759 +3914 7 6.27674341 0.72325658798217773 0.5231000920596216 +3915 7 6.949869 0.050130844116210938 0.0025131015318038408 +3916 6 6.75025 0.75024986267089844 0.56287485643770196 +3917 5 5.268847 0.26884698867797852 0.072278703321217108 +3918 7 6.590874 0.40912580490112305 0.1673839242359918 +3919 6 6.449676 0.4496760368347168 0.20220853810337758 +3920 6 5.750168 0.2498321533203125 0.062416104832664132 +3921 5 5.21401262 0.21401262283325195 0.045801402731967755 +3922 7 6.712919 0.28708076477050781 0.08241536550121964 +3923 5 5.01745749 0.017457485198974609 0.00030476378947241756 +3924 5 5.01745749 0.017457485198974609 0.00030476378947241756 +3925 5 5.337299 0.33729887008666992 0.11377052776174423 +3926 6 6.01554155 0.015541553497314453 0.00024153988510988711 +3927 5 6.019873 1.0198731422424316 1.0401412262674512 +3928 5 5.003989 0.0039892196655273438 1.5913873539830092E-05 +3929 5 5.003989 0.0039892196655273438 1.5913873539830092E-05 +3930 6 6.21500063 0.21500062942504883 0.046225270653167172 +3931 6 6.49620342 0.49620342254638672 0.246217836546748 +3932 8 6.58245039 1.4175496101379395 2.0094468972022241 +3933 4 5.16961765 1.1696176528930664 1.3680054539590856 +3934 6 5.78646135 0.21353864669799805 0.045598753633612432 +3935 5 5.20276928 0.20276927947998047 0.041115380700830428 +3936 6 5.77042866 0.22957134246826172 0.052703001282679907 +3937 5 5.439976 0.43997621536254883 0.19357907008475195 +3938 6 5.80691767 0.19308233261108398 0.037280787166537266 +3939 6 6.347791 0.34779119491577148 0.12095871526094015 +3940 5 5.31281853 0.31281852722167969 0.097855430973140756 +3941 5 5.240841 0.24084091186523438 0.058004344828077592 +3942 6 5.859107 0.14089298248291016 0.019850832512929628 +3943 6 5.75497866 0.24502134323120117 0.060035458638822092 +3944 6 6.324921 0.3249211311340332 0.1055737414574196 +3945 6 6.347791 0.34779119491577148 0.12095871526094015 +3946 6 6.510848 0.51084804534912109 0.26096572543701768 +3947 7 6.556688 0.44331216812133789 0.19652567840444135 +3948 5 5.53018427 0.53018426895141602 0.28109535904354743 +3949 5 5.31281853 0.31281852722167969 0.097855430973140756 +3950 5 5.240841 0.24084091186523438 0.058004344828077592 +3951 5 5.341845 0.34184503555297852 0.11685802833221715 +3952 6 6.173548 0.17354822158813477 0.030118985216404326 +3953 7 6.220626 0.77937412261962891 0.60742402300911635 +3954 5 5.341845 0.34184503555297852 0.11685802833221715 +3955 6 6.173548 0.17354822158813477 0.030118985216404326 +3956 5 5.43610573 0.43610572814941406 0.19018820612473064 +3957 5 6.18706274 1.1870627403259277 1.4091179494701009 +3958 6 5.60434771 0.39565229415893555 0.15654073787322886 +3959 6 5.60434771 0.39565229415893555 0.15654073787322886 +3960 6 5.297151 0.70284891128540039 0.49399659209507263 +3961 5 5.06962442 0.069624423980712891 0.0048475604146460682 +3962 7 7.028598 0.028597831726074219 0.00081783597943285713 +3963 7 6.325783 0.67421722412109375 0.45456886530155316 +3964 5 4.965347 0.034653186798095703 0.0012008433552637143 +3965 4 5.681409 1.6814088821411133 2.8271358289430282 +3966 6 5.60434771 0.39565229415893555 0.15654073787322886 +3967 4 5.27433443 1.2743344306945801 1.6239282412536795 +3968 6 5.352264 0.6477360725402832 0.41956201966991102 +3969 6 6.230219 0.23021888732910156 0.05300073608304956 +3970 7 6.150303 0.84969711303710938 0.72198518390359823 +3971 6 6.230219 0.23021888732910156 0.05300073608304956 +3972 6 5.467714 0.53228616714477539 0.28332856373367576 +3973 4 5.27433443 1.2743344306945801 1.6239282412536795 +3974 6 5.352264 0.6477360725402832 0.41956201966991102 +3975 7 7.04335546 0.043355464935302734 0.0018796963397562649 +3976 7 6.96596 0.034039974212646484 0.0011587198443976376 +3977 6 6.59142256 0.59142255783081055 0.34978064191113845 +3978 7 5.87656736 1.1234326362609863 1.2621008882163096 +3979 6 6.093575 0.093575000762939453 0.0087562807677841192 +3980 5 5.85666466 0.85666465759277344 0.73387433556854376 +3981 7 6.5405407 0.45945930480957031 0.21110285277609364 +3982 7 7.04335546 0.043355464935302734 0.0018796963397562649 +3983 6 5.918784 0.081215858459472656 0.0065960156653090962 +3984 7 6.96596 0.034039974212646484 0.0011587198443976376 +3985 6 6.074771 0.074770927429199219 0.0055906915886225761 +3986 6 6.074771 0.074770927429199219 0.0055906915886225761 +3987 6 5.67436457 0.32563543319702148 0.10603843535341184 +3988 6 5.886932 0.1130681037902832 0.012784396094730255 +3989 6 6.074771 0.074770927429199219 0.0055906915886225761 +3990 6 5.67436457 0.32563543319702148 0.10603843535341184 +3991 5 5.804823 0.80482292175292969 0.64773993537892238 +3992 7 6.027041 0.97295904159545898 0.94664929662235409 +3993 7 6.51755476 0.48244524002075195 0.23275340961868096 +3994 7 6.51755476 0.48244524002075195 0.23275340961868096 +3995 5 5.24649429 0.24649429321289063 0.060759436586522497 +3996 7 6.51755476 0.48244524002075195 0.23275340961868096 +3997 7 6.50444174 0.49555826187133789 0.2455779909089415 +3998 6 5.828133 0.17186689376831055 0.029538229173567743 +3999 6 5.828133 0.17186689376831055 0.029538229173567743 +4000 6 5.828133 0.17186689376831055 0.029538229173567743 +4001 5 5.27771664 0.27771663665771484 0.077126530276473204 +4002 6 5.52785969 0.47214031219482422 0.22291647439942608 +4003 6 6.39396763 0.39396762847900391 0.15521049228937045 +4004 7 6.80423975 0.19576025009155273 0.038322075515907272 +4005 6 6.39396763 0.39396762847900391 0.15521049228937045 +4006 6 6.263591 0.26359081268310547 0.069480116530939995 +4007 5 5.27771664 0.27771663665771484 0.077126530276473204 +4008 6 5.52785969 0.47214031219482422 0.22291647439942608 +4009 6 6.05668068 0.056680679321289063 0.0032126994083228055 +4010 6 6.50581741 0.50581741333007813 0.2558512556279311 +4011 7 6.50444174 0.49555826187133789 0.2455779909089415 +4012 6 5.828133 0.17186689376831055 0.029538229173567743 +4013 6 5.30343056 0.69656944274902344 0.48520898857168504 +4014 6 6.02893639 0.028936386108398438 0.00083731444101431407 +4015 5 4.810185 0.18981504440307617 0.036029751081741779 +4016 5 5.26828766 0.26828765869140625 0.071978267806116492 +4017 6 6.23065472 0.23065471649169922 0.053201598239866144 +4018 6 6.02893639 0.028936386108398438 0.00083731444101431407 +4019 5 4.810185 0.18981504440307617 0.036029751081741779 +4020 4 4.564721 0.56472110748291016 0.31890992923672457 +4021 5 5.7971487 0.79714870452880859 0.63544605713195779 +4022 5 5.26828766 0.26828765869140625 0.071978267806116492 +4023 6 6.20194 0.20194005966186523 0.04077978769623769 +4024 6 6.412005 0.41200494766235352 0.16974807689825866 +4025 6 6.69098759 0.69098758697509766 0.47746384535366815 +4026 6 6.20194 0.20194005966186523 0.04077978769623769 +4027 5 5.12840748 0.12840747833251953 0.016488480491716473 +4028 6 6.43639851 0.43639850616455078 0.19044365618265147 +4029 6 6.277379 0.27737903594970703 0.076939129584388866 +4030 5 5.70900774 0.70900774002075195 0.50269197540933419 +4031 5 5.239645 0.23964500427246094 0.057429728072747821 +4032 5 5.288952 0.28895187377929688 0.083493185360566713 +4033 6 6.17503452 0.17503452301025391 0.030637084245427104 +4034 5 5.288952 0.28895187377929688 0.083493185360566713 +4035 6 6.004663 0.0046629905700683594 2.1743481056546443E-05 +4036 5 5.2976017 0.29760169982910156 0.088566771741170669 +4037 5 5.277965 0.27796506881713867 0.077264579482516638 +4038 5 5.239645 0.23964500427246094 0.057429728072747821 +4039 4 5.144952 1.1449518203735352 1.3109146709766719 +4040 5 5.53936768 0.53936767578125 0.29091748967766762 +4041 5 5.26961851 0.26961851119995117 0.072694141581678196 +4042 7 6.827147 0.17285299301147461 0.02987815719302489 +4043 7 6.827147 0.17285299301147461 0.02987815719302489 +4044 7 6.827147 0.17285299301147461 0.02987815719302489 +4045 7 6.827147 0.17285299301147461 0.02987815719302489 +4046 7 6.900583 0.099417209625244141 0.0098837815696697362 +4047 6 6.45626259 0.45626258850097656 0.20817554966561147 +4048 6 6.45626259 0.45626258850097656 0.20817554966561147 +4049 6 6.36476469 0.36476469039916992 0.13305327936200229 +4050 7 6.827147 0.17285299301147461 0.02987815719302489 +4051 6 6.154264 0.15426397323608398 0.023797373438583236 +4052 5 5.26961851 0.26961851119995117 0.072694141581678196 +4053 7 6.827147 0.17285299301147461 0.02987815719302489 +4054 7 6.900583 0.099417209625244141 0.0098837815696697362 +4055 6 6.154264 0.15426397323608398 0.023797373438583236 +4056 5 5.72192574 0.72192573547363281 0.52117676753914566 +4057 6 6.28457451 0.28457450866699219 0.080982650983060012 +4058 6 6.45626259 0.45626258850097656 0.20817554966561147 +4059 6 6.36476469 0.36476469039916992 0.13305327936200229 +4060 5 5.026752 0.026751995086669922 0.00071566924111721164 +4061 5 5.026752 0.026751995086669922 0.00071566924111721164 +4062 6 6.181349 0.18134880065917969 0.032887387500522891 +4063 5 5.542329 0.54232883453369141 0.29412056476667203 +4064 5 6.017733 1.017733097076416 1.0357806568847536 +4065 8 7.28579235 0.71420764923095703 0.51009256622000976 +4066 6 6.3217063 0.32170629501342773 0.1034949402512666 +4067 5 5.3749 0.37489986419677734 0.14054990817476209 +4068 6 6.3217063 0.32170629501342773 0.1034949402512666 +4069 6 6.01176167 0.011761665344238281 0.00013833677166985581 +4070 5 5.54320049 0.54320049285888672 0.29506677544213744 +4071 6 5.95156765 0.048432350158691406 0.0023456925418940955 +4072 7 6.375497 0.62450313568115234 0.39000416647559177 +4073 5 4.75059748 0.24940252304077148 0.062201618499102551 +4074 4 4.751452 0.75145196914672852 0.56468006193449582 +4075 6 5.54982948 0.45017051696777344 0.20265349434703239 +4076 5 5.47206354 0.47206354141235352 0.2228439871307728 +4077 6 6.145912 0.14591217041015625 0.021290361473802477 +4078 6 6.0084424 0.0084424018859863281 7.127414960450551E-05 +4079 6 5.85908842 0.14091157913208008 0.019856073133496466 +4080 6 5.70578527 0.29421472549438477 0.086562304697736181 +4081 6 5.54982948 0.45017051696777344 0.20265349434703239 +4082 6 5.970536 0.029463768005371094 0.00086811362507432932 +4083 5 5.298877 0.29887676239013672 0.089327319096810243 +4084 8 6.58710766 1.4128923416137695 1.9962647689908408 +4085 6 6.01709652 0.017096519470214844 0.00029229097799543524 +4086 6 5.86715746 0.1328425407409668 0.017647140630515423 +4087 6 5.782139 0.21786117553710938 0.047463491806411184 +4088 6 6.13932657 0.13932657241821289 0.019411893781807521 +4089 6 5.446138 0.55386209487915039 0.30676322014392099 +4090 6 5.61793041 0.38206958770751953 0.14597716985099396 +4091 6 5.91474152 0.08525848388671875 0.0072690090746618807 +4092 6 5.31591749 0.6840825080871582 0.46796887787081687 +4093 6 5.465329 0.53467082977294922 0.28587289621009404 +4094 7 7.123422 0.12342214584350586 0.015233026084615631 +4095 6 5.465329 0.53467082977294922 0.28587289621009404 +4096 5 5.018344 0.018343925476074219 0.00033649960187176475 +4097 6 5.91474152 0.08525848388671875 0.0072690090746618807 +4098 5 6.169531 1.1695308685302734 1.3678024524451757 +4099 6 5.31591749 0.6840825080871582 0.46796887787081687 +4100 6 5.939181 0.060819149017333984 0.0036989688871926774 +4101 5 5.16942263 0.16942262649536133 0.02870402636858671 +4102 5 5.16942263 0.16942262649536133 0.02870402636858671 +4103 7 6.51642942 0.48357057571411133 0.23384050169647708 +4104 7 6.36017942 0.63982057571411133 0.40937036910713687 +4105 7 6.237228 0.7627720832824707 0.58182125103508042 +4106 5 5.777478 0.77747821807861328 0.60447237958669575 +4107 6 6.35006475 0.35006475448608398 0.12254533233340226 +4108 6 6.460335 0.46033477783203125 0.21190810768166557 +4109 6 6.188783 0.18878316879272461 0.035639084819422351 +4110 5 5.25196362 0.25196361541748047 0.063485663494248001 +4111 6 5.82661 0.17338991165161133 0.030064061462553582 +4112 6 6.39617157 0.39617156982421875 0.15695191273698583 +4113 6 6.293958 0.29395818710327148 0.086411415765041966 +4114 6 6.1024003 0.10240030288696289 0.010485822031341741 +4115 6 6.111546 0.11154603958129883 0.012442518946272685 +4116 6 5.35386133 0.64613866806030273 0.41749517836274208 +4117 6 5.35386133 0.64613866806030273 0.41749517836274208 +4118 8 6.299891 1.7001090049743652 2.8903706287949262 +4119 7 6.55539131 0.44460868835449219 0.19767688576030196 +4120 5 5.399425 0.39942502975463867 0.15954035439449399 +4121 6 5.72290039 0.277099609375 0.076784193515777588 +4122 6 5.21427965 0.7857203483581543 0.61735646582405934 +4123 6 6.13230848 0.1323084831237793 0.017505534706515391 +4124 7 6.89120436 0.1087956428527832 0.011836491903750357 +4125 5 5.71330929 0.71330928802490234 0.50881014038259309 +4126 5 5.71330929 0.71330928802490234 0.50881014038259309 +4127 5 5.45007563 0.45007562637329102 0.20256806945531025 +4128 5 5.2206955 0.22069549560546875 0.048706501780543476 +4129 7 6.7309947 0.26900529861450195 0.072363850682677366 +4130 6 6.10853529 0.1085352897644043 0.011779909124243204 +4131 5 5.25512648 0.2551264762878418 0.065089518903050703 +4132 5 5.25512648 0.2551264762878418 0.065089518903050703 +4133 6 5.91269064 0.087309360504150391 0.0076229244316436962 +4134 6 6.46735764 0.46735763549804688 0.21842315945832524 +4135 5 6.234082 1.2340822219848633 1.5229589306190974 +4136 6 6.15041971 0.15041971206665039 0.022626089778214009 +4137 5 5.25512648 0.2551264762878418 0.065089518903050703 +4138 6 5.782483 0.21751689910888672 0.047313601397945604 +4139 7 6.259784 0.74021577835083008 0.5479193985195252 +4140 6 5.97505045 0.024949550628662109 0.00062248007657217386 +4141 6 5.97505045 0.024949550628662109 0.00062248007657217386 +4142 6 5.95528173 0.044718265533447266 0.0019997232723198977 +4143 6 5.9106245 0.089375495910644531 0.0079879792692736373 +4144 6 5.97505045 0.024949550628662109 0.00062248007657217386 +4145 6 5.852694 0.14730596542358398 0.02169904744937412 +4146 7 6.523179 0.47682094573974609 0.22735821429614589 +4147 7 6.259784 0.74021577835083008 0.5479193985195252 +4148 6 5.75195456 0.24804544448852539 0.061526542531510131 +4149 7 6.537818 0.46218204498291016 0.21361224270458479 +4150 5 4.77180052 0.22819948196411133 0.052075003568688771 +4151 6 6.32452536 0.32452535629272461 0.10531670687691985 +4152 6 5.75195456 0.24804544448852539 0.061526542531510131 +4153 5 5.170621 0.17062091827392578 0.029111497752637661 +4154 5 5.251261 0.25126123428344727 0.063132207853641376 +4155 5 5.170621 0.17062091827392578 0.029111497752637661 +4156 5 5.24522638 0.24522638320922852 0.060135979021879393 +4157 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4158 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4159 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4160 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4161 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4162 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4163 5 5.36412 0.3641200065612793 0.13258337917818608 +4164 5 5.45350027 0.45350027084350586 0.20566249565513317 +4165 7 6.24862051 0.75137948989868164 0.56457113784040303 +4166 7 6.608236 0.39176416397094727 0.15347916017185526 +4167 8 7.272698 0.72730207443237305 0.5289683074736331 +4168 6 6.20588732 0.2058873176574707 0.042389587572188248 +4169 7 6.45273829 0.54726171493530273 0.29949538463392855 +4170 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4171 5 6.104036 1.1040358543395996 1.2188951676673696 +4172 6 6.12530661 0.12530660629272461 0.015701745580599891 +4173 5 5.36438942 0.36438941955566406 0.13277964908411377 +4174 6 5.650722 0.34927797317504883 0.12199510254527013 +4175 7 6.15029955 0.8497004508972168 0.72199085625493353 +4176 6 6.024892 0.024891853332519531 0.00061960436232766369 +4177 6 6.16297245 0.16297245025634766 0.026560019542557711 +4178 7 6.49049425 0.5095057487487793 0.25959610800805422 +4179 5 5.18898153 0.18898153305053711 0.03571401983413125 +4180 6 5.39173031 0.60826969146728516 0.36999201755770628 +4181 6 6.128771 0.12877082824707031 0.016581926207436481 +4182 6 5.00667524 0.99332475662231445 0.98669407211878024 +4183 7 6.849729 0.15027093887329102 0.022581355069860365 +4184 7 6.827616 0.17238378524780273 0.029716169416360572 +4185 5 5.18898153 0.18898153305053711 0.03571401983413125 +4186 5 5.53638172 0.53638172149658203 0.28770535115563689 +4187 6 6.540024 0.5400238037109375 0.29162570857442915 +4188 6 6.1729784 0.17297840118408203 0.029921527276201232 +4189 5 5.27973557 0.27973556518554688 0.078251986429677345 +4190 6 6.06486464 0.064864635467529297 0.0042074209343354596 +4191 5 5.72331667 0.72331666946411133 0.52318700432465448 +4192 6 6.09024668 0.090246677398681641 0.0081444627815017157 +4193 6 6.07189274 0.071892738342285156 0.0051685658263522782 +4194 6 6.09024668 0.090246677398681641 0.0081444627815017157 +4195 8 7.08787155 0.91212844848632813 0.83197830653807614 +4196 6 6.10373 0.10373020172119141 0.010759954749119061 +4197 5 5.4061327 0.40613269805908203 0.16494376843274949 +4198 5 5.31334829 0.31334829330444336 0.098187152916807463 +4199 6 6.07189274 0.071892738342285156 0.0051685658263522782 +4200 6 6.07644367 0.076443672180175781 0.0058436350163901807 +4201 6 6.212351 0.21235084533691406 0.045092881515301997 +4202 6 6.73774624 0.73774623870849609 0.5442695127285333 +4203 5 5.166097 0.16609716415405273 0.027588267940018341 +4204 6 5.9662466 0.033753395080566406 0.0011392916794648045 +4205 6 6.212351 0.21235084533691406 0.045092881515301997 +4206 6 5.40494728 0.59505271911621094 0.35408773852759623 +4207 7 6.56026649 0.43973350524902344 0.19336555563859292 +4208 6 6.45183754 0.45183753967285156 0.20415716225761571 +4209 6 6.54847145 0.54847145080566406 0.30082093234886997 +4210 6 5.76230145 0.23769855499267578 0.056500603045606113 +4211 6 5.6053896 0.39461040496826172 0.15571737170921551 +4212 4 4.70839453 0.70839452743530273 0.50182280650028588 +4213 4 4.801995 0.80199480056762695 0.64319566013750773 +4214 5 5.177825 0.17782497406005859 0.031621721399460512 +4215 5 5.177825 0.17782497406005859 0.031621721399460512 +4216 5 5.177825 0.17782497406005859 0.031621721399460512 +4217 4 4.757621 0.75762081146240234 0.573989293960949 +4218 6 6.213321 0.21332120895385742 0.0455059381895353 +4219 5 5.177825 0.17782497406005859 0.031621721399460512 +4220 6 5.96347 0.036530017852783203 0.0013344422043246595 +4221 6 6.60098 0.60097980499267578 0.36117672600903461 +4222 4 4.757621 0.75762081146240234 0.573989293960949 +4223 4 4.059132 0.059132099151611328 0.0034966051500759932 +4224 7 6.79212 0.20788002014160156 0.043214102774072671 +4225 5 5.432003 0.43200302124023438 0.18662661036069039 +4226 7 6.107426 0.89257383346557617 0.79668804818743411 +4227 7 5.97871161 1.0212883949279785 1.0430299856145666 +4228 6 5.510249 0.48975086212158203 0.23985590694883285 +4229 6 5.80424643 0.19575357437133789 0.038319461879154915 +4230 6 5.396756 0.60324382781982422 0.36390311580271373 +4231 6 6.1630497 0.16304969787597656 0.026585203977447236 +4232 6 6.13954067 0.13954067230224609 0.01947159922656283 +4233 6 5.72124863 0.27875137329101563 0.077702328111627139 +4234 6 5.7411046 0.2588953971862793 0.067026826684241314 +4235 5 5.14966774 0.14966773986816406 0.022400432357244426 +4236 5 5.14966774 0.14966773986816406 0.022400432357244426 +4237 5 5.848475 0.84847497940063477 0.71990979066890759 +4238 5 5.14966774 0.14966773986816406 0.022400432357244426 +4239 7 7.004218 0.0042181015014648438 1.7792380276659969E-05 +4240 6 5.67437744 0.32562255859375 0.10603005066514015 +4241 6 6.63750553 0.63750553131103516 0.40641330245216523 +4242 7 6.52567434 0.47432565689086914 0.22498482878495452 +4243 6 6.34608126 0.34608125686645508 0.11977223635426526 +4244 5 5.37140274 0.37140274047851563 0.13793999563495163 +4245 5 5.37140274 0.37140274047851563 0.13793999563495163 +4246 6 6.447334 0.44733381271362305 0.20010753999690678 +4247 6 5.344269 0.655731201171875 0.42998340819031 +4248 6 6.11358738 0.11358737945556641 0.012902092771582829 +4249 6 5.7725997 0.22740030288696289 0.051710897753082463 +4250 6 5.846038 0.15396213531494141 0.023704339110736328 +4251 6 5.97603559 0.023964405059814453 0.00057429270987086056 +4252 6 5.846038 0.15396213531494141 0.023704339110736328 +4253 4 5.0890975 1.0890974998474121 1.1861333641738838 +4254 5 5.86293364 0.86293363571166992 0.74465445964256105 +4255 5 5.16529655 0.16529655456542969 0.027322950951202074 +4256 5 5.16529655 0.16529655456542969 0.027322950951202074 +4257 5 5.908326 0.90832614898681641 0.8250563929332202 +4258 6 5.94830847 0.051691532135009766 0.0026720144944647473 +4259 6 6.22315025 0.22315025329589844 0.049796035546023631 +4260 6 6.07941341 0.079413414001464844 0.0063064903233680525 +4261 7 6.507631 0.49236917495727539 0.24242740444810806 +4262 6 6.53947639 0.53947639465332031 0.29103478038814501 +4263 6 5.886932 0.1130681037902832 0.012784396094730255 +4264 6 6.00057936 0.00057935714721679688 3.3565470403118525E-07 +4265 6 6.07941341 0.079413414001464844 0.0063064903233680525 +4266 7 6.507631 0.49236917495727539 0.24242740444810806 +4267 7 6.451244 0.54875612258911133 0.30113328207903578 +4268 6 6.318875 0.31887483596801758 0.10168116101363012 +4269 5 5.13934755 0.13934755325317383 0.019417740597646116 +4270 6 5.95621538 0.043784618377685547 0.0019170928064795589 +4271 5 5.09802628 0.098026275634765625 0.0096091507148230448 +4272 6 5.854124 0.14587593078613281 0.021279787182720611 +4273 6 5.854124 0.14587593078613281 0.021279787182720611 +4274 6 5.854124 0.14587593078613281 0.021279787182720611 +4275 6 5.854124 0.14587593078613281 0.021279787182720611 +4276 7 7.046975 0.046975135803222656 0.0022066633837312111 +4277 5 5.79051447 0.79051446914672852 0.62491312593033399 +4278 4 5.078443 1.0784430503845215 1.1630394129226715 +4279 6 5.880997 0.1190028190612793 0.014161670944531579 +4280 6 5.854124 0.14587593078613281 0.021279787182720611 +4281 5 5.25452375 0.25452375411987305 0.064782341411273592 +4282 5 5.25452375 0.25452375411987305 0.064782341411273592 +4283 6 6.114523 0.11452293395996094 0.013115502402797574 +4284 6 6.114523 0.11452293395996094 0.013115502402797574 +4285 6 6.114523 0.11452293395996094 0.013115502402797574 +4286 6 6.114523 0.11452293395996094 0.013115502402797574 +4287 5 5.39032745 0.39032745361328125 0.15235552104422823 +4288 6 6.004046 0.0040459632873535156 1.6369818922612467E-05 +4289 6 5.732962 0.26703786849975586 0.071309223212892903 +4290 5 5.25452375 0.25452375411987305 0.064782341411273592 +4291 5 5.467843 0.46784305572509766 0.21887712479019683 +4292 6 6.089267 0.089266777038574219 0.0079685574828545214 +4293 5 5.467843 0.46784305572509766 0.21887712479019683 +4294 5 5.730375 0.73037481307983398 0.53344736758140243 +4295 5 5.467843 0.46784305572509766 0.21887712479019683 +4296 6 6.089267 0.089266777038574219 0.0079685574828545214 +4297 6 6.27618456 0.2761845588684082 0.076277910557337236 +4298 6 6.14334249 0.14334249496459961 0.020547070862676264 +4299 6 5.49535656 0.50464344024658203 0.25466500178390561 +4300 5 5.36093473 0.36093473434448242 0.1302738824563221 +4301 5 4.92026329 0.079736709594726563 0.0063579428569937591 +4302 6 5.65997934 0.34002065658569336 0.11561404690496602 +4303 6 6.65942574 0.65942573547363281 0.43484230060494156 +4304 6 6.226901 0.22690105438232422 0.051484088479810453 +4305 6 5.85030174 0.14969825744628906 0.022409568282455439 +4306 6 5.848189 0.15181112289428711 0.023046617034424344 +4307 7 6.80309725 0.19690275192260742 0.038770693714695881 +4308 6 6.33258 0.3325800895690918 0.11060951597778512 +4309 6 6.47826147 0.47826147079467773 0.22873403444668838 +4310 6 5.765576 0.23442411422729492 0.054954665331251817 +4311 5 6.292986 1.2929859161376953 1.6718125793304353 +4312 6 6.65942574 0.65942573547363281 0.43484230060494156 +4313 6 6.360401 0.36040115356445313 0.12988899149058852 +4314 7 6.33959246 0.66040754318237305 0.43613812309217792 +4315 7 6.92102432 0.078975677490234375 0.0062371576350415125 +4316 5 5.01756859 0.017568588256835938 0.00030865529333823361 +4317 7 6.519351 0.48064899444580078 0.23102345586175943 +4318 7 6.33959246 0.66040754318237305 0.43613812309217792 +4319 7 6.92102432 0.078975677490234375 0.0062371576350415125 +4320 5 5.445865 0.44586515426635742 0.1987957357889627 +4321 6 5.78976154 0.21023845672607422 0.044200208686561382 +4322 7 6.291827 0.70817279815673828 0.50150871204914438 +4323 6 5.83348227 0.16651773452758789 0.027728155912200236 +4324 6 5.809565 0.19043493270874023 0.036265463595782421 +4325 5 5.299449 0.29944896697998047 0.089669683825377433 +4326 5 5.29262638 0.29262638092041016 0.085630198810576985 +4327 5 5.299449 0.29944896697998047 0.089669683825377433 +4328 5 5.946722 0.94672203063964844 0.89628260329845943 +4329 5 5.48733234 0.48733234405517578 0.23749281356231222 +4330 5 5.299449 0.29944896697998047 0.089669683825377433 +4331 5 5.29262638 0.29262638092041016 0.085630198810576985 +4332 8 7.71554661 0.28445339202880859 0.080913732236695068 +4333 8 7.71554661 0.28445339202880859 0.080913732236695068 +4334 8 7.71554661 0.28445339202880859 0.080913732236695068 +4335 8 7.71554661 0.28445339202880859 0.080913732236695068 +4336 8 7.71554661 0.28445339202880859 0.080913732236695068 +4337 8 7.71554661 0.28445339202880859 0.080913732236695068 +4338 8 7.71554661 0.28445339202880859 0.080913732236695068 +4339 8 6.04854059 1.9514594078063965 3.8081938203160917 +4340 8 7.71554661 0.28445339202880859 0.080913732236695068 +4341 6 5.575844 0.42415618896484375 0.17990847263718024 +4342 6 6.168419 0.16841888427734375 0.028364920581225306 +4343 6 6.13987732 0.1398773193359375 0.019565664464607835 +4344 6 5.505574 0.49442577362060547 0.24445684562033421 +4345 6 6.18214941 0.18214941024780273 0.033178407653622344 +4346 6 5.505574 0.49442577362060547 0.24445684562033421 +4347 7 6.39332151 0.60667848587036133 0.36805878521795421 +4348 6 5.3287344 0.67126560211181641 0.45059750857853942 +4349 5 5.195148 0.19514799118041992 0.038082738461753252 +4350 6 6.27555752 0.27555751800537109 0.075931945729280415 +4351 6 6.577435 0.57743501663208008 0.3334311984328906 +4352 5 5.55883074 0.55883073806762695 0.31229179380920868 +4353 6 6.081543 0.08154296875 0.0066492557525634766 +4354 6 6.198324 0.19832420349121094 0.039332489690423245 +4355 6 6.577435 0.57743501663208008 0.3334311984328906 +4356 5 5.71000528 0.71000528335571289 0.50410750239302615 +4357 6 6.10561037 0.10561037063598633 0.011153550385870403 +4358 5 5.32538462 0.32538461685180664 0.10587514888379701 +4359 6 5.172522 0.82747793197631836 0.68471972790780455 +4360 5 5.55883074 0.55883073806762695 0.31229179380920868 +4361 6 6.424677 0.42467689514160156 0.18035046526711085 +4362 6 6.7563 0.75629997253417969 0.57198964845520095 +4363 5 5.358533 0.35853290557861328 0.12854584438264283 +4364 6 5.98848152 0.011518478393554688 0.00013267534450278617 +4365 5 5.57603741 0.57603740692138672 0.33181909417271527 +4366 6 6.462703 0.46270322799682617 0.2140942771986829 +4367 5 5.358533 0.35853290557861328 0.12854584438264283 +4368 6 6.105439 0.10543918609619141 0.011117421964627283 +4369 6 5.98848152 0.011518478393554688 0.00013267534450278617 +4370 5 5.333513 0.33351278305053711 0.11123077645811463 +4371 5 5.492916 0.49291610717773438 0.24296628871525172 +4372 6 6.02280045 0.022800445556640625 0.00051986031758133322 +4373 6 6.335739 0.3357391357421875 0.112720767268911 +4374 5 5.087471 0.08747100830078125 0.0076511772931553423 +4375 6 6.00574255 0.0057425498962402344 3.2976879310808727E-05 +4376 5 5.154143 0.15414285659790039 0.023760020240160884 +4377 6 6.444363 0.44436311721801758 0.19745857994371363 +4378 5 4.961815 0.03818511962890625 0.0014581033610738814 +4379 5 5.154143 0.15414285659790039 0.023760020240160884 +4380 6 6.220297 0.22029685974121094 0.048530706411838764 +4381 6 6.53089428 0.53089427947998047 0.28184873598456761 +4382 6 6.150495 0.15049505233764648 0.022648760778110955 +4383 6 6.444363 0.44436311721801758 0.19745857994371363 +4384 5 5.165444 0.16544389724731445 0.027371683136379943 +4385 5 5.165444 0.16544389724731445 0.027371683136379943 +4386 6 6.21841431 0.218414306640625 0.047704809345304966 +4387 6 6.187394 0.18739414215087891 0.03511656451246381 +4388 6 5.922006 0.077993869781494141 0.0060830437234926649 +4389 4 5.714946 1.7149457931518555 2.9410390734492466 +4390 5 5.35680151 0.35680150985717773 0.1273073174363617 +4391 5 5.47833633 0.47833633422851563 0.22880564864317421 +4392 5 5.35680151 0.35680150985717773 0.1273073174363617 +4393 6 6.07811356 0.078113555908203125 0.0061017276166239753 +4394 6 6.04085064 0.040850639343261719 0.0016687747347532422 +4395 5 5.425962 0.42596197128295898 0.18144360097926437 +4396 5 5.30192947 0.30192947387695313 0.09116140719561372 +4397 5 5.30192947 0.30192947387695313 0.09116140719561372 +4398 5 5.30192947 0.30192947387695313 0.09116140719561372 +4399 5 5.425962 0.42596197128295898 0.18144360097926437 +4400 5 5.30192947 0.30192947387695313 0.09116140719561372 +4401 6 6.783476 0.78347587585449219 0.61383444804596365 +4402 6 6.418589 0.41858911514282227 0.17521684731605092 +4403 5 5.434056 0.43405580520629883 0.18840444203328843 +4404 5 5.20643759 0.20643758773803711 0.042616477631099769 +4405 5 5.20643759 0.20643758773803711 0.042616477631099769 +4406 7 6.76489973 0.23510026931762695 0.055272136633220725 +4407 6 6.146746 0.14674615859985352 0.021534435063813362 +4408 5 5.20643759 0.20643758773803711 0.042616477631099769 +4409 7 6.76489973 0.23510026931762695 0.055272136633220725 +4410 5 5.436403 0.43640279769897461 0.19044740183949216 +4411 7 6.83644533 0.16355466842651367 0.026750129564106828 +4412 7 6.42539024 0.57460975646972656 0.33017637223019847 +4413 7 6.83644533 0.16355466842651367 0.026750129564106828 +4414 7 6.42539024 0.57460975646972656 0.33017637223019847 +4415 5 5.271081 0.27108097076416016 0.073484892710439453 +4416 5 5.436403 0.43640279769897461 0.19044740183949216 +4417 6 5.89872456 0.10127544403076172 0.010256715563627949 +4418 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4419 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4420 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4421 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4422 6 5.89872456 0.10127544403076172 0.010256715563627949 +4423 6 5.89872456 0.10127544403076172 0.010256715563627949 +4424 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4425 6 5.983991 0.016008853912353516 0.00025628340358707646 +4426 6 5.894488 0.10551214218139648 0.011132812147707227 +4427 5 5.35989761 0.35989761352539063 0.12952629222127143 +4428 6 6.60903931 0.609039306640625 0.37092887703329325 +4429 6 5.85716152 0.14283847808837891 0.020402830822604301 +4430 5 5.111895 0.11189508438110352 0.012520509908654276 +4431 6 6.36502934 0.36502933502197266 0.13324641542658355 +4432 6 6.47130966 0.47130966186523438 0.22213279736752156 +4433 5 4.872597 0.12740278244018555 0.016231468973501251 +4434 6 5.947105 0.052895069122314453 0.0027978883374544239 +4435 6 6.02649736 0.026497364044189453 0.00070211030129030405 +4436 6 6.37150526 0.3715052604675293 0.13801615855504679 +4437 6 6.098565 0.098565101623535156 0.0097150792580578127 +4438 5 5.40876055 0.40876054763793945 0.16708518530526817 +4439 5 5.16147566 0.16147565841674805 0.026074388261122294 +4440 5 5.21609259 0.21609258651733398 0.046696005947751473 +4441 6 6.1700573 0.17005729675292969 0.02891948417891399 +4442 5 5.21609259 0.21609258651733398 0.046696005947751473 +4443 5 5.16147566 0.16147565841674805 0.026074388261122294 +4444 6 6.320595 0.32059478759765625 0.10278101783478633 +4445 6 6.320595 0.32059478759765625 0.10278101783478633 +4446 6 6.645172 0.645172119140625 0.41624706331640482 +4447 6 6.36602974 0.36602973937988281 0.13397777011050493 +4448 5 5.847049 0.84704923629760742 0.71749240871235997 +4449 6 5.793397 0.20660305023193359 0.042684820365138876 +4450 6 5.833044 0.16695594787597656 0.027874288531165803 +4451 5 5.19033146 0.19033145904541016 0.036226064302354644 +4452 5 5.161993 0.16199302673339844 0.026241740710247541 +4453 6 6.36602974 0.36602973937988281 0.13397777011050493 +4454 6 6.1052494 0.10524940490722656 0.011077437233325327 +4455 5 5.200701 0.20070123672485352 0.04028098642288569 +4456 5 5.200701 0.20070123672485352 0.04028098642288569 +4457 5 5.200701 0.20070123672485352 0.04028098642288569 +4458 7 6.673865 0.32613515853881836 0.10636414163514019 +4459 5 5.821137 0.8211369514465332 0.67426589303090623 +4460 6 6.1052494 0.10524940490722656 0.011077437233325327 +4461 6 5.98693657 0.013063430786132813 0.00017065322390408255 +4462 6 6.67417669 0.67417669296264648 0.45451421333405051 +4463 6 6.33628 0.33627986907958984 0.11308415034818609 +4464 5 5.349133 0.34913301467895508 0.12189386193881546 +4465 5 5.349133 0.34913301467895508 0.12189386193881546 +4466 5 6.05041742 1.050417423248291 1.1033767630635793 +4467 5 5.78669357 0.78669357299804688 0.61888677779643331 +4468 6 5.97731924 0.022680759429931641 0.00051441684831843304 +4469 6 6.47565556 0.47565555572509766 0.22624820769215148 +4470 6 6.09460974 0.094609737396240234 0.0089510024101855379 +4471 6 6.26841545 0.26841545104980469 0.072046854362270096 +4472 5 5.9054985 0.90549850463867188 0.81992754190287087 +4473 5 4.971588 0.028411865234375 0.00080723408609628677 +4474 6 5.60179853 0.39820146560668945 0.15856440721131548 +4475 6 6.574111 0.57411098480224609 0.32960342287060485 +4476 6 6.48994637 0.48994636535644531 0.2400474409259914 +4477 5 5.15824556 0.15824556350708008 0.025041658369673314 +4478 5 5.15824556 0.15824556350708008 0.025041658369673314 +4479 5 4.929186 0.070814132690429688 0.0050146413886977825 +4480 5 5.79505539 0.79505538940429688 0.63211307222081814 +4481 5 5.15824556 0.15824556350708008 0.025041658369673314 +4482 6 6.54232645 0.54232645034790039 0.29411797874695367 +4483 4 4.647926 0.64792585372924805 0.41980791193077494 +4484 5 4.929186 0.070814132690429688 0.0050146413886977825 +4485 6 6.410453 0.41045284271240234 0.1684715360906921 +4486 6 5.825172 0.17482805252075195 0.030564847948198803 +4487 6 6.18555546 0.18555545806884766 0.034430828019139881 +4488 6 6.67726374 0.67726373672485352 0.4586861690825117 +4489 6 6.67726374 0.67726373672485352 0.4586861690825117 +4490 6 6.24990368 0.24990367889404297 0.062451848724776937 +4491 6 6.589973 0.58997297286987305 0.34806810871691596 +4492 6 6.4081974 0.40819740295410156 0.16662511977847316 +4493 6 5.683591 0.31640911102294922 0.100114725538333 +4494 6 5.80311632 0.1968836784362793 0.038763182834600229 +4495 6 5.7241993 0.27580070495605469 0.076066028854256729 +4496 6 5.80311632 0.1968836784362793 0.038763182834600229 +4497 5 5.33129835 0.3312983512878418 0.10975859756604223 +4498 5 5.844083 0.84408283233642578 0.71247582784508268 +4499 6 6.172046 0.17204618453979492 0.029599889614701169 +4500 6 5.94066572 0.059334278106689453 0.0035205565584419674 +4501 6 5.41101 0.58899021148681641 0.34690946922728472 +4502 6 5.978266 0.021734237670898438 0.00047237708713510074 +4503 7 6.416181 0.58381891250610352 0.34084452259980935 +4504 5 5.47851944 0.47851943969726563 0.22898085416818503 +4505 5 5.381122 0.38112211227416992 0.14525406446432498 +4506 6 6.166681 0.16668081283569336 0.02778249336756744 +4507 5 6.054818 1.0548181533813477 1.1126413367028363 +4508 4 6.027106 2.0271058082580566 4.1091579578735491 +4509 5 5.122678 0.12267780303955078 0.015049843358610815 +4510 6 6.68740225 0.68740224838256836 0.4725218510814102 +4511 6 6.36493731 0.36493730545043945 0.13317923690942735 +4512 6 6.36493731 0.36493730545043945 0.13317923690942735 +4513 6 6.164821 0.16482114791870117 0.027166010801238372 +4514 5 5.031131 0.031130790710449219 0.00096912613025779137 +4515 6 6.46412563 0.46412563323974609 0.2154126034301953 +4516 6 6.50871849 0.50871849060058594 0.25879450267893844 +4517 6 5.833926 0.16607379913330078 0.027580506758567935 +4518 6 5.402982 0.59701776504516602 0.35643021177952505 +4519 6 6.0442524 0.044252395629882813 0.0019582745189836714 +4520 5 5.30472231 0.30472230911254883 0.092855685670883759 +4521 5 5.121645 0.12164497375488281 0.014797499639826128 +4522 6 5.402982 0.59701776504516602 0.35643021177952505 +4523 5 5.842279 0.84227895736694336 0.70943384202314519 +4524 6 5.87058544 0.12941455841064453 0.016748127928622125 +4525 6 6.0442524 0.044252395629882813 0.0019582745189836714 +4526 6 6.299826 0.29982614517211914 0.089895717328772662 +4527 6 5.833926 0.16607379913330078 0.027580506758567935 +4528 6 5.237529 0.76247119903564453 0.58136232935885346 +4529 6 5.69664 0.3033599853515625 0.092027280712500215 +4530 6 5.64880562 0.35119438171386719 0.12333749374738545 +4531 6 5.64880562 0.35119438171386719 0.12333749374738545 +4532 6 6.077145 0.077145099639892578 0.005951366398448954 +4533 5 5.602151 0.60215091705322266 0.36258572690803703 +4534 6 6.231445 0.2314448356628418 0.053566711954999846 +4535 6 5.57208443 0.42791557312011719 0.18311173771871836 +4536 6 5.59737539 0.40262460708618164 0.16210657423130215 +4537 5 4.976461 0.023539066314697266 0.00055408764296771551 +4538 6 6.41039228 0.41039228439331055 0.16842182708955988 +4539 5 5.97664833 0.97664833068847656 0.95384196183658787 +4540 6 6.63202429 0.63202428817749023 0.39945470084626322 +4541 6 6.28159428 0.28159427642822266 0.079295336517134274 +4542 5 5.80930328 0.80930328369140625 0.65497180499369279 +4543 5 5.80930328 0.80930328369140625 0.65497180499369279 +4544 6 6.63202429 0.63202428817749023 0.39945470084626322 +4545 6 6.421122 0.42112207412719727 0.17734380131719263 +4546 6 6.49023533 0.49023532867431641 0.24033067748041503 +4547 6 6.170671 0.17067098617553711 0.029128585522130379 +4548 5 5.426098 0.42609786987304688 0.18155939471034799 +4549 5 5.80930328 0.80930328369140625 0.65497180499369279 +4550 6 5.9298563 0.070143699645996094 0.0049201386000277125 +4551 6 6.185342 0.18534183502197266 0.03435159580931213 +4552 6 6.360096 0.36009597778320313 0.12966911321564112 +4553 6 6.63202429 0.63202428817749023 0.39945470084626322 +4554 6 6.28159428 0.28159427642822266 0.079295336517134274 +4555 5 5.24526024 0.24526023864746094 0.060152584661409492 +4556 5 5.984321 0.98432111740112305 0.96888806216179546 +4557 6 5.4269495 0.57305049896240234 0.32838687436105829 +4558 6 6.144445 0.14444494247436523 0.020864341406422682 +4559 7 6.00908756 0.99091243743896484 0.98190745867123042 +4560 6 6.886959 0.88695907592773438 0.78669640237058047 +4561 6 5.88928938 0.11071062088012695 0.012256841575663202 +4562 7 6.39880657 0.60119342803955078 0.36143353791794652 +4563 7 6.4868784 0.51312160491943359 0.2632937814350953 +4564 7 6.37610674 0.62389326095581055 0.38924280106607512 +4565 5 5.434809 0.43480920791625977 0.18905904728876521 +4566 5 6.31403875 1.3140387535095215 1.726697845724857 +4567 5 5.434809 0.43480920791625977 0.18905904728876521 +4568 6 6.10477066 0.10477066040039063 0.01097689128073398 +4569 6 5.72730541 0.27269458770751953 0.074362338164974062 +4570 6 5.96737432 0.032625675201416016 0.001064434682348292 +4571 7 6.693068 0.30693197250366211 0.094207235744988793 +4572 7 6.583151 0.41684913635253906 0.1737632024778577 +4573 6 6.29685974 0.2968597412109375 0.088125705951824784 +4574 7 6.972795 0.027204990386962891 0.00074011150195474329 +4575 7 6.80273867 0.19726133346557617 0.038912033680617242 +4576 5 5.50844669 0.50844669342041016 0.25851804005014856 +4577 6 6.16599226 0.16599225997924805 0.027553430373018273 +4578 7 6.80359745 0.19640254974365234 0.038573961545807833 +4579 6 5.99077368 0.0092263221740722656 8.5125020859777578E-05 +4580 6 6.38746357 0.38746356964111328 0.15012801779903384 +4581 6 6.2404747 0.24047470092773438 0.057828081786283292 +4582 6 5.851914 0.1480860710144043 0.021929484428483192 +4583 6 5.7020545 0.29794549942016602 0.088771520624732148 +4584 6 5.8770256 0.12297439575195313 0.015122702010557987 +4585 6 6.630063 0.63006305694580078 0.3969794557278874 +4586 6 6.3478 0.34779977798461914 0.12096468556615037 +4587 6 6.250844 0.25084400177001953 0.062922713223997562 +4588 5 6.321037 1.3210368156433105 1.7451382682850181 +4589 6 6.3478 0.34779977798461914 0.12096468556615037 +4590 6 6.10267162 0.10267162322998047 0.010541462216679065 +4591 6 5.775976 0.22402381896972656 0.050186671465780819 +4592 6 6.61496735 0.61496734619140625 0.3781848368817009 +4593 6 6.114566 0.11456584930419922 0.013125333826792485 +4594 6 6.84284067 0.84284067153930664 0.71038039760082938 +4595 6 6.3083787 0.30837869644165039 0.095097420419051559 +4596 6 6.37121439 0.37121438980102539 0.13780012319534762 +4597 6 5.23584557 0.76415443420410156 0.58393199931379058 +4598 6 6.114566 0.11456584930419922 0.013125333826792485 +4599 7 6.487642 0.51235818862915039 0.26251091345534405 +4600 6 5.531089 0.46891117095947266 0.21987768625058379 +4601 6 6.02429676 0.024296760559082031 0.00059033257366536418 +4602 6 6.0132575 0.013257503509521484 0.00017576139930497447 +4603 6 6.24240875 0.24240875244140625 0.058762003260198981 +4604 6 6.490737 0.49073696136474609 0.2408227652495043 +4605 6 6.656058 0.65605783462524414 0.43041188237316419 +4606 5 6.035766 1.0357661247253418 1.0728114651285523 +4607 6 6.12503147 0.12503147125244141 0.015632868803550082 +4608 7 6.87997866 0.12002134323120117 0.014405122831021799 +4609 4 4.067561 0.067561149597167969 0.0045645089348909096 +4610 6 5.50612164 0.49387836456298828 0.24391583898341196 +4611 5 6.099027 1.099027156829834 1.2078606914494685 +4612 5 5.244759 0.24475908279418945 0.059907008610252888 +4613 5 5.484865 0.48486518859863281 0.23509425111478777 +4614 5 5.145983 0.14598321914672852 0.021311100272441763 +4615 7 6.84344435 0.1565556526184082 0.024509672366775703 +4616 5 5.49089861 0.49089860916137695 0.24098144447657432 +4617 7 7.312341 0.31234121322631836 0.097557033479688471 +4618 7 6.84344435 0.1565556526184082 0.024509672366775703 +4619 5 4.66447926 0.33552074432373047 0.11257416987155011 +4620 6 6.068257 0.068256855010986328 0.0046589982559908094 +4621 7 6.135589 0.8644108772277832 0.74720616466970569 +4622 7 7.02965355 0.029653549194335938 0.00087933297982090153 +4623 6 6.50581074 0.50581073760986328 0.25584450228143396 +4624 6 6.71426725 0.71426725387573242 0.51017770995917999 +4625 5 5.14590549 0.14590549468994141 0.02128841338071652 +4626 6 5.999968 3.1948089599609375E-05 1.0206804290646687E-09 +4627 6 6.156812 0.15681219100952148 0.024590063249206651 +4628 6 6.156812 0.15681219100952148 0.024590063249206651 +4629 7 6.295945 0.70405483245849609 0.495693207108161 +4630 7 6.22476864 0.77523136138916016 0.60098366368129064 +4631 7 6.39587164 0.60412836074829102 0.36497107626041725 +4632 6 5.999968 3.1948089599609375E-05 1.0206804290646687E-09 +4633 6 5.802772 0.19722795486450195 0.03889886618003402 +4634 6 6.481858 0.4818577766418457 0.23218691691022286 +4635 6 5.53023243 0.46976757049560547 0.22068157028934365 +4636 5 5.23276567 0.23276567459106445 0.054179859267833308 +4637 6 6.34772 0.34772014617919922 0.12090930005888367 +4638 5 5.23276567 0.23276567459106445 0.054179859267833308 +4639 6 5.48935652 0.51064348220825195 0.26075676592176933 +4640 6 6.34772 0.34772014617919922 0.12090930005888367 +4641 6 6.322356 0.32235622406005859 0.1039135351902587 +4642 7 6.412917 0.58708286285400391 0.34466628785685316 +4643 6 5.87477064 0.1252293586730957 0.01568239227367485 +4644 6 6.3486805 0.34868049621582031 0.12157808844131068 +4645 7 7.15717 0.15716981887817383 0.024702351966197966 +4646 7 6.150801 0.84919881820678711 0.72113863284380386 +4647 7 6.15693331 0.84306669235229492 0.71076144775383909 +4648 5 4.876851 0.12314891815185547 0.015165656041972397 +4649 5 4.79058552 0.20941448211669922 0.043854425320205337 +4650 5 4.79058552 0.20941448211669922 0.043854425320205337 +4651 7 7.01707125 0.017071247100830078 0.00029142747757759935 +4652 5 5.10504 0.10504007339477539 0.011033417018779801 +4653 7 6.820096 0.17990398406982422 0.032365443484195566 +4654 7 6.48909 0.5109100341796875 0.26102906302548945 +4655 7 6.48909 0.5109100341796875 0.26102906302548945 +4656 7 6.48909 0.5109100341796875 0.26102906302548945 +4657 7 6.48909 0.5109100341796875 0.26102906302548945 +4658 6 6.70158052 0.70158052444458008 0.49221523227993202 +4659 6 6.05639267 0.056392669677734375 0.003180133193382062 +4660 6 6.17747974 0.17747974395751953 0.031499059515226691 +4661 5 5.755897 0.75589704513549805 0.57138034284457717 +4662 6 6.5815897 0.58158969879150391 0.33824657774039224 +4663 7 6.41941929 0.58058071136474609 0.33707396240879461 +4664 7 6.31732941 0.68267059326171875 0.46603913890430704 +4665 6 6.5815897 0.58158969879150391 0.33824657774039224 +4666 5 5.17189026 0.1718902587890625 0.029546261066570878 +4667 7 6.31732941 0.68267059326171875 0.46603913890430704 +4668 7 6.41941929 0.58058071136474609 0.33707396240879461 +4669 5 5.65773964 0.65773963928222656 0.43262143308311352 +4670 6 5.511123 0.4888768196105957 0.23900054475257093 +4671 5 5.307423 0.30742311477661133 0.094508971498953542 +4672 5 5.307423 0.30742311477661133 0.094508971498953542 +4673 7 6.804415 0.19558477401733398 0.038253403827411603 +4674 7 6.674548 0.32545185089111328 0.10591890724845143 +4675 6 5.994039 0.0059609413146972656 3.5532821357264766E-05 +4676 6 5.834837 0.16516304016113281 0.02727882983526797 +4677 7 6.804415 0.19558477401733398 0.038253403827411603 +4678 6 5.511123 0.4888768196105957 0.23900054475257093 +4679 5 5.21835136 0.21835136413574219 0.04767731821993948 +4680 4 4.445275 0.44527482986450195 0.19826967411086116 +4681 6 6.520746 0.52074623107910156 0.27117663718308904 +4682 6 6.029323 0.029323101043701172 0.00085984425481910876 +4683 6 6.217881 0.21788120269775391 0.047472218489019724 +4684 6 5.87797546 0.1220245361328125 0.014889987418428063 +4685 5 5.614559 0.61455917358398438 0.37768297783622984 +4686 4 4.445275 0.44527482986450195 0.19826967411086116 +4687 6 5.873857 0.12614297866821289 0.015912051067289212 +4688 6 5.873857 0.12614297866821289 0.015912051067289212 +4689 6 5.873857 0.12614297866821289 0.015912051067289212 +4690 6 5.873857 0.12614297866821289 0.015912051067289212 +4691 7 6.21955347 0.78044652938842773 0.609096785234442 +4692 5 5.3218236 0.3218235969543457 0.10357042755663315 +4693 6 5.873857 0.12614297866821289 0.015912051067289212 +4694 7 6.21955347 0.78044652938842773 0.609096785234442 +4695 7 6.933452 0.066547870635986328 0.0044286190861839714 +4696 6 6.37950754 0.37950754165649414 0.14402597417415564 +4697 7 6.933452 0.066547870635986328 0.0044286190861839714 +4698 6 5.58320951 0.41679048538208008 0.17371430870502991 +4699 5 5.746622 0.74662208557128906 0.55744453866282129 +4700 5 5.746622 0.74662208557128906 0.55744453866282129 +4701 6 5.35992 0.64007997512817383 0.40970237456008363 +4702 6 5.35992 0.64007997512817383 0.40970237456008363 +4703 7 6.871542 0.12845802307128906 0.016501463691383833 +4704 6 5.208801 0.7911992073059082 0.6259961856414975 +4705 6 6.086628 0.086627960205078125 0.0075044034892925993 +4706 7 6.45238543 0.54761457443237305 0.29988172213074904 +4707 6 5.954611 0.045389175415039063 0.0020601772448571865 +4708 6 5.937922 0.062077999114990234 0.0038536779741207283 +4709 6 6.36317444 0.3631744384765625 0.13189567276276648 +4710 7 6.88844156 0.11155843734741211 0.012445284943396473 +4711 6 5.954611 0.045389175415039063 0.0020601772448571865 +4712 6 6.086628 0.086627960205078125 0.0075044034892925993 +4713 6 6.17846537 0.17846536636352539 0.03184988699126734 +4714 7 6.45238543 0.54761457443237305 0.29988172213074904 +4715 6 6.0296874 0.029687404632568359 0.00088134199381784128 +4716 6 5.500597 0.49940299987792969 0.24940335628707544 +4717 6 5.83446074 0.16553926467895508 0.027403248150449144 +4718 6 5.7104845 0.28951549530029297 0.08381922201897396 +4719 6 6.0296874 0.029687404632568359 0.00088134199381784128 +4720 5 6.018594 1.0185937881469727 1.0375333052515998 +4721 6 5.741637 0.25836277008056641 0.06675132096370362 +4722 6 5.74905825 0.25094175338745117 0.062971763593168362 +4723 6 5.188327 0.81167316436767578 0.65881332575463603 +4724 6 5.741637 0.25836277008056641 0.06675132096370362 +4725 6 5.933058 0.066942214965820313 0.004481260144530097 +4726 6 6.58313274 0.58313274383544922 0.34004379693305964 +4727 6 5.74905825 0.25094175338745117 0.062971763593168362 +4728 6 6.12326145 0.12326145172119141 0.0151933854804156 +4729 5 4.763585 0.23641490936279297 0.055892009369017615 +4730 5 5.75737047 0.7573704719543457 0.57361003178834835 +4731 6 6.438391 0.43839120864868164 0.19218685182045192 +4732 6 6.438391 0.43839120864868164 0.19218685182045192 +4733 6 5.58918953 0.41081047058105469 0.1687652427390276 +4734 6 6.27040625 0.27040624618530273 0.07311953797602655 +4735 6 6.182541 0.1825408935546875 0.033321177819743752 +4736 6 6.14279032 0.14279031753540039 0.020389074781860472 +4737 7 6.86660957 0.13339042663574219 0.017793005918065319 +4738 6 6.558869 0.5588688850402832 0.31233443066616928 +4739 6 6.27040625 0.27040624618530273 0.07311953797602655 +4740 5 5.17440128 0.17440128326416016 0.030415807604185829 +4741 6 6.253006 0.2530059814453125 0.064012026647105813 +4742 6 6.10954475 0.10954475402832031 0.012000053135125199 +4743 5 5.667788 0.66778802871704102 0.4459408512977916 +4744 5 5.227569 0.2275691032409668 0.051787696749897805 +4745 3 4.15831566 1.1583156585693359 1.3416951648869144 +4746 6 5.612184 0.38781595230102539 0.1504012128591512 +4747 6 6.03694153 0.0369415283203125 0.0013646765146404505 +4748 5 5.36980057 0.36980056762695313 0.13675245981721673 +4749 6 5.3687706 0.63122940063476563 0.39845055622572545 +4750 5 5.667788 0.66778802871704102 0.4459408512977916 +4751 6 5.72508335 0.27491664886474609 0.0755791638230221 +4752 7 6.44327545 0.55672454833984375 0.30994222272420302 +4753 6 6.50943756 0.50943756103515625 0.25952662859344855 +4754 6 6.04133129 0.041331291198730469 0.0017082756321542547 +4755 6 6.22371769 0.22371768951416016 0.050049604601554165 +4756 7 6.88606071 0.11393928527832031 0.01298216072973446 +4757 7 6.88606071 0.11393928527832031 0.01298216072973446 +4758 6 6.42606163 0.42606163024902344 0.18152851277045556 +4759 6 5.800061 0.19993877410888672 0.03997551339216443 +4760 6 5.800061 0.19993877410888672 0.03997551339216443 +4761 6 5.90801764 0.091982364654541016 0.0084607554074409563 +4762 7 6.444339 0.55566120147705078 0.30875937082691962 +4763 7 6.45304155 0.54695844650268555 0.29916354220063113 +4764 6 6.3152113 0.31521129608154297 0.099358161177406146 +4765 8 7.632688 0.36731195449829102 0.13491807191735461 +4766 8 6.674454 1.3255457878112793 1.7570716355842251 +4767 7 5.7801075 1.2198925018310547 1.4881377160236298 +4768 6 5.662743 0.33725690841674805 0.11374222227482278 +4769 6 5.662743 0.33725690841674805 0.11374222227482278 +4770 6 5.662743 0.33725690841674805 0.11374222227482278 +4771 6 5.662743 0.33725690841674805 0.11374222227482278 +4772 5 5.26093054 0.26093053817749023 0.068084745753594689 +4773 7 6.377726 0.62227392196655273 0.38722483395963536 +4774 4 4.799238 0.79923820495605469 0.63878170826137648 +4775 6 5.86095858 0.13904142379760742 0.019332517531665872 +4776 6 5.65545845 0.34454154968261719 0.11870887945769937 +4777 6 6.325419 0.32541894912719727 0.1058974924510494 +4778 6 5.73885965 0.26114034652709961 0.068194280584293665 +4779 4 4.23472452 0.23472452163696289 0.05509560105770106 +4780 5 5.33977365 0.33977365493774414 0.11544613658975322 +4781 5 5.29841661 0.2984166145324707 0.089052475829021205 +4782 6 5.57891226 0.42108774185180664 0.17731488633785375 +4783 6 5.57891226 0.42108774185180664 0.17731488633785375 +4784 5 5.45173359 0.45173358917236328 0.20406323558654549 +4785 7 6.26505136 0.73494863510131836 0.5401494962372908 +4786 8 7.59331274 0.40668725967407227 0.16539452718120629 +4787 8 7.5935235 0.40647649765014648 0.16522314314192954 +4788 5 5.45173359 0.45173358917236328 0.20406323558654549 +4789 6 6.32882261 0.32882261276245117 0.10812431066392492 +4790 6 6.273167 0.27316713333129883 0.074620282732439591 +4791 6 5.57891226 0.42108774185180664 0.17731488633785375 +4792 6 6.35385656 0.35385656356811523 0.12521446758023558 +4793 6 5.326376 0.67362403869628906 0.45376934550949954 +4794 5 5.326376 0.32637596130371094 0.10652126811692142 +4795 7 6.731957 0.26804304122924805 0.071847071951424368 +4796 7 6.731957 0.26804304122924805 0.071847071951424368 +4797 6 6.430296 0.43029594421386719 0.1851545996069035 +4798 5 5.443855 0.44385480880737305 0.19700709130142968 +4799 6 5.85747528 0.14252471923828125 0.020313295593950897 +4800 7 6.090511 0.90948915481567383 0.82717052272732872 +4801 7 6.731957 0.26804304122924805 0.071847071951424368 +4802 8 7.11547756 0.88452243804931641 0.78237994341270678 +4803 7 6.62180328 0.37819671630859375 0.14303275622660294 +4804 4 4.869589 0.86958885192871094 0.75618477139869356 +4805 6 5.678698 0.32130193710327148 0.10323493478631462 +4806 6 5.321511 0.67848920822143555 0.46034760567295052 +4807 6 6.257139 0.25713920593261719 0.06612057122765691 +4808 5 5.25239038 0.25239038467407227 0.063700906275926172 +4809 6 5.896619 0.10338115692138672 0.010687663606404385 +4810 5 5.50128031 0.50128030776977539 0.25128194695776074 +4811 6 6.553216 0.55321598052978516 0.30604792111353163 +4812 7 6.650127 0.34987306594848633 0.12241116227619386 +4813 5 5.011426 0.011425971984863281 0.00013055283579888055 +4814 6 6.38597345 0.38597345352172852 0.14897550682348992 +4815 7 6.08776045 0.91223955154418945 0.83218099940154389 +4816 6 5.67866659 0.32133340835571289 0.10325515932549933 +4817 6 6.323233 0.32323312759399414 0.1044796547741953 +4818 6 6.488521 0.48852109909057617 0.23865286425666454 +4819 6 6.38597345 0.38597345352172852 0.14897550682348992 +4820 5 5.011426 0.011425971984863281 0.00013055283579888055 +4821 6 5.849298 0.15070199966430664 0.022711092702820679 +4822 6 6.066161 0.066161155700683594 0.0043772985236500972 +4823 7 6.421701 0.57829904556274414 0.33442978609878082 +4824 5 5.58794451 0.58794450759887695 0.34567874401568588 +4825 6 6.2006855 0.20068550109863281 0.040274670351209352 +4826 6 6.2006855 0.20068550109863281 0.040274670351209352 +4827 6 6.222501 0.22250080108642578 0.049506606484101212 +4828 5 5.58794451 0.58794450759887695 0.34567874401568588 +4829 7 6.64049864 0.35950136184692383 0.12924122916979286 +4830 6 5.825965 0.17403507232666016 0.030288206399745832 +4831 6 5.265776 0.73422384262084961 0.53908465107292614 +4832 5 5.54404974 0.54404973983764648 0.29599011941741082 +4833 6 6.187524 0.18752384185791016 0.035165191265150497 +4834 7 6.51944542 0.48055458068847656 0.23093270502067753 +4835 6 6.157933 0.15793323516845703 0.024942906770775153 +4836 5 5.189078 0.18907785415649414 0.035750434932424469 +4837 6 6.775595 0.77559518814086914 0.6015478958672702 +4838 6 6.283699 0.28369903564453125 0.080485142825637013 +4839 4 4.806295 0.80629491806030273 0.6501114948898703 +4840 7 6.78762436 0.21237564086914063 0.045103412834578194 +4841 6 6.64768744 0.64768743515014648 0.41949901365137521 +4842 6 5.82111263 0.17888736724853516 0.032000690161112288 +4843 5 5.69835854 0.69835853576660156 0.48770464447807171 +4844 6 5.99322653 0.0067734718322753906 4.5879920662628138E-05 +4845 5 5.24329 0.24328994750976563 0.059189998559304513 +4846 6 6.49306726 0.49306726455688477 0.24311532737760899 +4847 7 6.83293533 0.16706466674804688 0.027910602875635959 +4848 6 6.14575 0.14575004577636719 0.021243075843813131 +4849 5 5.2928853 0.29288530349731445 0.085781801004713998 +4850 6 6.14575 0.14575004577636719 0.021243075843813131 +4851 5 5.2928853 0.29288530349731445 0.085781801004713998 +4852 5 5.812308 0.81230783462524414 0.65984401819355298 +4853 5 5.880716 0.88071584701538086 0.77566040318401974 +4854 6 6.773512 0.77351188659667969 0.59832063870635466 +4855 6 5.990097 0.0099029541015625 9.8068499937653542E-05 +4856 6 5.990097 0.0099029541015625 9.8068499937653542E-05 +4857 6 6.072716 0.072716236114501953 0.0052876509946599981 +4858 5 5.16453362 0.16453361511230469 0.027071310501924017 +4859 6 6.25013876 0.25013875961303711 0.062569399060748765 +4860 6 5.51640558 0.48359441757202148 0.23386356070682268 +4861 6 6.30488443 0.30488443374633789 0.092954517940825099 +4862 6 6.22345257 0.22345256805419922 0.049931050170016533 +4863 7 7.229968 0.22996807098388672 0.052885313672049961 +4864 5 5.21371746 0.21371746063232422 0.045675152979129052 +4865 6 6.7802043 0.78020429611206055 0.60871874367171586 +4866 6 6.162457 0.16245698928833008 0.026392273368628594 +4867 6 5.48054552 0.5194544792175293 0.26983295597915458 +4868 6 6.255599 0.25559902191162109 0.06533086000217736 +4869 6 5.276372 0.72362804412841797 0.52363754624911962 +4870 7 6.32495165 0.6750483512878418 0.45569027657643346 +4871 6 6.275876 0.27587604522705078 0.076107592330117768 +4872 5 5.51944447 0.51944446563720703 0.26982255288112356 +4873 6 6.36134958 0.36134958267211914 0.13057352089731467 +4874 6 5.839919 0.16008090972900391 0.025625897659665497 +4875 6 5.54447174 0.45552825927734375 0.20750599500024691 +4876 7 6.754775 0.24522495269775391 0.060135277425615641 +4877 5 4.56240654 0.43759346008300781 0.19148803630741895 +4878 4 4.348716 0.34871578216552734 0.12160269673131552 +4879 6 5.42275333 0.57724666595458984 0.33321371335568983 +4880 6 5.42275333 0.57724666595458984 0.33321371335568983 +4881 6 5.956958 0.043042182922363281 0.0018526295107221813 +4882 5 5.613491 0.61349105834960938 0.37637127867492381 +4883 6 5.962695 0.037304878234863281 0.0013916539401179762 +4884 5 5.39742565 0.39742565155029297 0.15794714851017488 +4885 6 5.42275333 0.57724666595458984 0.33321371335568983 +4886 7 7.14290667 0.14290666580200195 0.020422315130645075 +4887 7 6.002443 0.99755716323852539 0.99512029392849399 +4888 5 5.83609962 0.83609962463378906 0.69906258231276297 +4889 6 5.956958 0.043042182922363281 0.0018526295107221813 +4890 6 6.54341841 0.54341840744018555 0.29530356554482751 +4891 6 5.73423624 0.26576375961303711 0.070630375923656175 +4892 5 6.00746965 1.007469654083252 1.0149951038986273 +4893 6 6.28490925 0.28490924835205078 0.081173279796530551 +4894 5 5.443358 0.44335794448852539 0.19656626694109036 +4895 6 5.4413476 0.55865240097045898 0.31209250511005848 +4896 7 7.037857 0.0378570556640625 0.0014331566635519266 +4897 6 5.9355073 0.064492702484130859 0.0041593086737066187 diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE-out.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE-out.txt new file mode 100644 index 0000000000..0209b5a363 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.529227 +L2(avg): 0.479877 +RMS(avg): 0.692731 +Loss-fn(avg): 0.479877 +R Squared: 0.383532 +L1(avg): 0.519622 +L2(avg): 0.463327 +RMS(avg): 0.680681 +Loss-fn(avg): 0.463327 +R Squared: 0.413465 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.524425 (0.0048) +L2(avg): 0.471602 (0.0083) +RMS(avg): 0.686706 (0.0060) +Loss-fn(avg): 0.471602 (0.0083) +R Squared: 0.398499 (0.0150) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l1: 0.344282018934789 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] (%Time%) Iteration: 50 Training-l1: 0.345211959030736 +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE-rp.txt new file mode 100644 index 0000000000..e2cc16093d --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.524425 0.471602 0.686706 0.471602 0.398499 50 0.2 20 10 + 1 Mae LightGBMR %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Mae + diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE.txt new file mode 100644 index 0000000000..23cd505851 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-CV-wine.MAE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +5 6 5.80925941 0.19074058532714844 0.036381970890943194 +6 6 5.25261068 0.74738931655883789 0.55859079050628679 +8 6 5.54791927 0.45208072662353516 0.20437698338446353 +9 6 5.8812604 0.11873960494995117 0.014099093783670469 +10 5 5.785368 0.78536796569824219 0.61680284154499532 +11 5 5.39364529 0.39364528656005859 0.15495661163095065 +18 6 6.00869131 0.0086913108825683594 7.5538884857451194E-05 +20 8 7.3507967 0.64920330047607422 0.42146492534902791 +21 7 5.944835 1.0551648139953613 1.1133727846938655 +25 6 5.694817 0.30518293380737305 0.093136623087275439 +28 6 5.61064863 0.38935136795043945 0.15159448772487849 +31 6 5.437836 0.5621638298034668 0.31602817153930118 +32 6 5.90667772 0.093322277069091797 0.0087090473973603366 +35 5 6.36959553 1.3695955276489258 1.8757919093559394 +37 6 5.738825 0.26117515563964844 0.068212461923394585 +40 6 5.940867 0.059133052825927734 0.00349671793651396 +41 6 5.764175 0.2358250617980957 0.055613459772075657 +44 6 5.675231 0.32476902008056641 0.10547491640409135 +45 7 5.761184 1.2388157844543457 1.5346645478132359 +46 4 5.20731735 1.2073173522949219 1.4576151891524205 +48 6 5.509978 0.49002218246459961 0.24012173930736935 +50 6 6.087853 0.087852954864501953 0.0077181416784242174 +51 7 6.269763 0.73023700714111328 0.53324608659841033 +52 7 5.902807 1.0971927642822266 1.2038319619932736 +54 6 5.920922 0.079078197479248047 0.0062533613165669522 +56 6 6.12345076 0.12345075607299805 0.015240089174994864 +60 6 5.55601835 0.44398164749145508 0.19711970330922668 +63 6 5.4165206 0.58347940444946289 0.3404482154166999 +64 6 5.797542 0.20245790481567383 0.040989203222352444 +66 7 6.7072444 0.2927556037902832 0.085705843550613281 +68 8 6.16529369 1.8347063064575195 3.3661472309549936 +69 5 5.56024361 0.56024360656738281 0.31387289869962842 +70 6 5.368725 0.63127517700195313 0.39850834909884725 +71 5 5.117893 0.11789321899414063 0.0138988110848004 +72 5 4.764992 0.23500776290893555 0.055228648627462462 +73 6 4.900103 1.0998969078063965 1.2097732078020726 +74 8 6.16529369 1.8347063064575195 3.3661472309549936 +76 7 6.41728163 0.5827183723449707 0.33956070146837192 +77 7 6.43876266 0.56123733520507813 0.31498734642809723 +79 5 5.14644241 0.14644241333007813 0.021445380421937443 +82 5 5.25564528 0.2556452751159668 0.065354506689118352 +88 5 5.28622627 0.28622627258300781 0.08192547911676229 +90 6 5.28622627 0.71377372741699219 0.50947293395074666 +91 5 5.319233 0.31923294067382813 0.10190967041125987 +92 7 6.542394 0.45760583877563477 0.20940310368155224 +93 7 6.542394 0.45760583877563477 0.20940310368155224 +95 6 5.60025549 0.39974451065063477 0.15979567379531545 +96 6 5.275809 0.72419118881225586 0.52445287795330842 +97 7 5.49176 1.5082402229309082 2.2747885700666757 +98 4 4.39247751 0.39247751235961914 0.154038597707995 +99 6 5.275809 0.72419118881225586 0.52445287795330842 +100 5 5.7011075 0.70110750198364258 0.49155172933774338 +102 5 5.43836355 0.43836355209350586 0.19216260380403583 +104 5 5.7011075 0.70110750198364258 0.49155172933774338 +105 6 6.030436 0.030436038970947266 0.00092635246824102069 +106 5 5.72359943 0.72359943389892578 0.52359614073884586 +108 6 5.951213 0.048787117004394531 0.002380182785600482 +109 5 5.5798564 0.57985639572143555 0.33623343965905406 +111 5 5.28739548 0.28739547729492188 0.082596160369575955 +112 5 5.051069 0.051068782806396484 0.0026080205773268972 +113 5 5.307395 0.30739498138427734 0.094491674580240215 +115 4 4.551975 0.55197477340698242 0.30467615047768959 +117 6 6.53130627 0.53130626678466797 0.28228634912466077 +120 5 5.270566 0.27056598663330078 0.073205953122851497 +121 5 5.90539455 0.90539455413818359 0.81973929866308026 +122 5 5.915443 0.91544294357299805 0.83803578293759529 +123 6 5.816056 0.1839442253112793 0.033835478025366683 +125 6 6.380141 0.38014078140258789 0.14450701368537011 +128 7 5.995385 1.0046148300170898 1.0092509566902663 +129 6 5.84000444 0.15999555587768555 0.025598577900609598 +131 7 6.206945 0.79305505752563477 0.62893632426698787 +132 5 5.42901468 0.42901468276977539 0.18405359803205101 +133 5 5.59301567 0.59301567077636719 0.35166758578634472 +137 5 5.48119164 0.48119163513183594 0.23154538972084993 +138 7 6.38292551 0.61707448959350586 0.38078092570708577 +141 5 5.48119164 0.48119163513183594 0.23154538972084993 +144 6 5.967776 0.032224178314208984 0.0010383976680259366 +145 6 5.676757 0.32324314117431641 0.10448612831623905 +147 4 5.13458252 1.13458251953125 1.2872774936258793 +150 7 6.13511133 0.86488866806030273 0.74803240813912453 +151 6 6.027541 0.027541160583496094 0.0007585155262859189 +152 6 5.62424946 0.37575054168701172 0.14118846957808273 +154 6 5.33823538 0.66176462173461914 0.43793241457956356 +156 6 5.97231054 0.027689456939697266 0.00076670602561534906 +161 5 5.71372271 0.71372270584106445 0.50940010083309062 +164 5 5.853947 0.85394716262817383 0.72922575656070876 +167 7 6.47956038 0.52043962478637695 0.27085740304778483 +169 5 4.20788145 0.79211854934692383 0.627451796219475 +171 6 6.20117569 0.20117568969726563 0.040471658125170507 +173 7 6.575046 0.42495393753051758 0.18058584902269104 +174 5 5.22949076 0.22949075698852539 0.052666007543166415 +176 4 6.469169 2.4691691398620605 6.0967962412471479 +177 5 5.554319 0.55431890487670898 0.30726944830371394 +179 6 5.21643 0.7835698127746582 0.61398165149171291 +180 6 5.23204136 0.76795864105224609 0.58976047436681256 +181 5 5.114332 0.11433219909667969 0.013071851750282804 +183 6 5.728629 0.27137088775634766 0.073642158721668238 +187 5 6.144768 1.144768238067627 1.310494318888459 +188 8 6.912892 1.0871081352233887 1.1818040976688735 +189 4 5.552815 1.5528149604797363 2.4112343014896851 +191 5 5.36272526 0.36272525787353516 0.13156961269942258 +192 6 6.28948736 0.28948736190795898 0.083802932704429622 +196 5 5.54256725 0.54256725311279297 0.29437922415036155 +198 5 5.42950869 0.42950868606567383 0.18447771140586156 +199 5 5.22549 0.22549009323120117 0.050845782145415797 +201 5 5.42950869 0.42950868606567383 0.18447771140586156 +202 5 4.930763 0.069237232208251953 0.0047937943238594016 +204 4 5.89362049 1.893620491027832 3.5857985640404877 +205 5 5.62215757 0.62215757369995117 0.38708004651221017 +206 5 6.09528875 1.0952887535095215 1.1996574535644413 +207 4 4.813859 0.81385898590087891 0.66236644893160701 +209 6 5.444507 0.55549287796020508 0.30857233746451129 +210 5 5.19806051 0.19806051254272461 0.039227966628686772 +211 7 6.47038841 0.52961158752441406 0.2804884336401301 +212 5 6.09528875 1.0952887535095215 1.1996574535644413 +216 5 5.82277775 0.82277774810791016 0.67696322278152365 +218 5 5.279291 0.27929115295410156 0.078003548118431354 +219 5 6.20777273 1.2077727317810059 1.4587149716337535 +223 6 5.773505 0.22649478912353516 0.051299889500114659 +226 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +228 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +233 6 5.95629835 0.043701648712158203 0.0019098341001608787 +237 6 5.319764 0.68023586273193359 0.462720828946658 +239 6 5.79168749 0.2083125114440918 0.043394102424144876 +240 5 5.103008 0.10300779342651367 0.010610605506599313 +241 5 5.67736959 0.67736959457397461 0.45882956765331073 +242 7 6.24281359 0.7571864128112793 0.57333126374601306 +244 5 5.46525669 0.46525669097900391 0.21646378850073233 +246 7 6.98627472 0.01372528076171875 0.00018838333198800683 +247 7 5.997908 1.0020918846130371 1.0041881452073085 +248 7 6.137768 0.86223220825195313 0.74344438094703946 +249 5 5.48982763 0.48982763290405273 0.23993110995638744 +250 4 5.08111 1.0811100006103516 1.1687988334197144 +252 5 5.46525669 0.46525669097900391 0.21646378850073233 +254 6 5.661961 0.33803892135620117 0.11427031235166396 +257 7 5.922548 1.0774521827697754 1.1609032061553535 +258 6 6.399062 0.39906215667724609 0.15925060489189491 +259 4 4.36215544 0.36215543746948242 0.13115656088871219 +260 6 6.13484335 0.13484334945678711 0.018182728892725208 +262 5 5.512335 0.51233482360839844 0.26248697148184874 +267 5 5.598096 0.59809589385986328 0.35771869825202884 +268 6 5.598096 0.40190410614013672 0.16152691053230228 +269 6 5.598096 0.40190410614013672 0.16152691053230228 +271 5 5.62772274 0.62772274017333984 0.39403583853072632 +272 5 5.44098473 0.44098472595214844 0.19446752852309146 +275 6 5.79458046 0.20541954040527344 0.042197187580313766 +276 6 5.819891 0.18010902404785156 0.032439260543469572 +277 5 4.75812 0.24187994003295898 0.058505905390347834 +278 4 5.19088364 1.1908836364746094 1.4182038356229896 +279 7 6.35347462 0.64652538299560547 0.41799507085761434 +280 8 6.60628176 1.3937182426452637 1.9424505398822021 +283 5 5.44280434 0.44280433654785156 0.19607568046558299 +284 5 5.440112 0.44011211395263672 0.19369867284785869 +285 5 5.241145 0.24114513397216797 0.058150975638454838 +288 7 6.387907 0.61209297180175781 0.37465780612910748 +290 7 6.387907 0.61209297180175781 0.37465780612910748 +291 6 6.120554 0.12055397033691406 0.014533259763993556 +293 7 6.009457 0.99054288864135742 0.98117521423796461 +296 5 4.96861649 0.031383514404296875 0.00098492497636470944 +297 7 6.430575 0.56942510604858398 0.32424495139844112 +299 6 6.040891 0.040891170501708984 0.001672087824999835 +300 6 5.68149137 0.31850862503051758 0.10144774421883085 +301 6 5.41270971 0.58729028701782227 0.34490988122547606 +303 6 5.678506 0.32149410247802734 0.10335845792815235 +304 6 5.49561548 0.50438451766967773 0.25440374166487345 +308 7 5.756687 1.2433128356933594 1.5458268073998624 +309 6 5.778518 0.2214818000793457 0.049054187766387258 +311 8 5.75409937 2.2459006309509277 5.0440696441057753 +312 6 6.003036 0.0030360221862792969 9.2174307155801216E-06 +314 5 5.69624 0.69623994827270508 0.48475006557077904 +316 6 6.010912 0.010911941528320313 0.00011907046791748144 +317 5 6.118836 1.1188359260559082 1.2517938294333817 +319 6 5.91781473 0.082185268402099609 0.0067544183423251525 +321 5 6.118836 1.1188359260559082 1.2517938294333817 +323 6 5.817978 0.1820220947265625 0.033132042968645692 +327 6 5.612565 0.38743495941162109 0.15010584777428448 +328 6 5.507632 0.49236822128295898 0.24242646532934486 +329 5 5.871286 0.87128591537475586 0.75913914633042623 +331 5 6.08688164 1.0868816375732422 1.1813116940938926 +332 6 6.02704 0.027040004730224609 0.00073116185581056925 +333 5 5.85901356 0.85901355743408203 0.73790429185555695 +336 6 6.04825258 0.048252582550048828 0.0023283117227492767 +338 5 5.77029 0.77028989791870117 0.59334652683560307 +343 5 6.06355762 1.0635576248168945 1.1311548213061542 +344 6 6.182091 0.18209123611450195 0.0331572182697073 +346 7 5.75412464 1.245875358581543 1.5522054091206883 +347 6 6.342347 0.34234714508056641 0.11720156774481438 +348 6 5.79792 0.20207977294921875 0.040836234635207802 +349 5 6.08598661 1.0859866142272949 1.1793669262808635 +350 7 6.854967 0.14503288269042969 0.021034537061495939 +352 6 5.489034 0.51096582412719727 0.26108607342598589 +353 7 6.611001 0.38899898529052734 0.15132021055705991 +354 6 5.52786064 0.47213935852050781 0.22291557386415661 +355 6 6.276119 0.27611923217773438 0.076241830378421582 +358 6 5.28521156 0.71478843688964844 0.51092250951114693 +360 6 5.749971 0.25002908706665039 0.062514544379382642 +361 5 5.09363651 0.093636512756347656 0.0087677965211696574 +366 6 5.87889862 0.12110137939453125 0.014665544091258198 +368 6 5.62576056 0.37423944473266602 0.14005516199381418 +370 6 5.31511259 0.68488740921020508 0.4690707632946669 +371 6 5.62576056 0.37423944473266602 0.14005516199381418 +373 6 5.85963631 0.14036369323730469 0.019701966379216174 +376 7 5.57551432 1.4244856834411621 2.0291594623288347 +377 7 5.73623 1.2637701034545898 1.5971148743856247 +378 6 5.619952 0.38004779815673828 0.14443632888378488 +379 7 5.57551432 1.4244856834411621 2.0291594623288347 +381 6 5.39476871 0.60523128509521484 0.36630490845800523 +383 6 5.85963631 0.14036369323730469 0.019701966379216174 +384 7 6.641092 0.35890817642211914 0.128815079102651 +387 5 5.16575956 0.16575956344604492 0.027476232873823392 +388 6 5.79469872 0.20530128479003906 0.042148617536440725 +389 7 5.889894 1.1101059913635254 1.2323353120611955 +391 5 5.161842 0.16184186935424805 0.026192790676077493 +392 6 4.993642 1.0063581466674805 1.0127567193640061 +395 5 5.118578 0.11857795715332031 0.014060731922654668 +396 5 6.19858265 1.198582649230957 1.4366003670374994 +398 5 5.2838583 0.28385829925537109 0.08057553405615181 +399 6 6.63788939 0.63788938522338867 0.40690286778067275 +404 6 6.922693 0.92269277572631836 0.85136195837753803 +406 7 7.06596661 0.065966606140136719 0.0043515931256479234 +409 5 6.19858265 1.198582649230957 1.4366003670374994 +413 5 6.020768 1.0207681655883789 1.0419676478786641 +414 6 5.695077 0.30492305755615234 0.092978071029392595 +415 6 6.16900349 0.16900348663330078 0.028562178494212276 +416 6 5.963897 0.036102771759033203 0.0013034101286848454 +418 6 5.963897 0.036102771759033203 0.0013034101286848454 +419 6 5.949179 0.050820827484130859 0.0025827565061717905 +422 6 6.07098675 0.070986747741699219 0.0050391183549436391 +423 6 6.07098675 0.070986747741699219 0.0050391183549436391 +428 5 5.7041 0.70410013198852539 0.49575699586625888 +429 5 5.346765 0.34676504135131836 0.12024599390338153 +430 5 5.213252 0.21325206756591797 0.045476444321138842 +434 8 6.47353649 1.526463508605957 2.3300908431056087 +436 5 5.53445244 0.53445243835449219 0.28563940886306227 +439 5 5.28787327 0.28787326812744141 0.082871018502373772 +440 7 6.07598972 0.92401027679443359 0.85379499162172579 +441 6 5.75848246 0.24151754379272461 0.058330723959670649 +442 8 7.165652 0.83434820175170898 0.69613692176631048 +449 7 6.35148335 0.64851665496826172 0.42057385177122342 +450 5 5.120258 0.12025785446166992 0.014461951559724184 +451 5 5.365356 0.3653559684753418 0.13348498370055495 +452 7 5.664081 1.3359189033508301 1.7846793163300845 +453 7 6.27505159 0.72494840621948242 0.5255501916801677 +454 7 6.35148335 0.64851665496826172 0.42057385177122342 +455 6 6.007873 0.0078730583190917969 6.198504729582055E-05 +456 7 6.707905 0.29209518432617188 0.085319596706540324 +457 5 5.548654 0.54865407943725586 0.30102129888314266 +464 5 4.955248 0.044752120971679688 0.0020027523314638529 +465 5 5.86635351 0.86635351181030273 0.75056840742604436 +466 6 6.02778864 0.027788639068603516 0.00077220846128511766 +467 6 5.234385 0.76561498641967773 0.58616630743040332 +474 6 5.60722351 0.3927764892578125 0.1542733705136925 +480 5 5.260892 0.26089191436767578 0.068064590982430673 +482 5 5.68141937 0.68141937255859375 0.46433236129814759 +483 5 5.260892 0.26089191436767578 0.068064590982430673 +484 5 5.635592 0.63559198379516602 0.40397716986467458 +487 6 5.75940228 0.24059772491455078 0.05788726523405785 +489 6 5.510854 0.48914623260498047 0.23926403687164566 +492 6 5.79296 0.20703983306884766 0.042865492477176304 +493 6 6.572476 0.57247591018676758 0.32772866774416798 +495 6 6.27768564 0.27768564224243164 0.077109315907591736 +497 6 6.73239136 0.732391357421875 0.53639710042625666 +501 6 6.09444 0.094439983367919922 0.0089189104585329915 +502 6 4.93793154 1.0620684623718262 1.1279894187648551 +504 6 6.10658 0.10657978057861328 0.011359249628185353 +507 7 6.01234531 0.98765468597412109 0.97546177872663975 +510 6 5.070314 0.92968606948852539 0.86431618780102326 +513 6 5.1853447 0.81465530395507813 0.66366326426214073 +514 7 5.73061 1.2693901062011719 1.6113512417214224 +517 6 6.6399765 0.63997650146484375 0.40956992242718115 +519 5 5.082864 0.082863807678222656 0.006866410622933472 +520 5 5.31589842 0.31589841842651367 0.099791810764372713 +521 5 5.31589842 0.31589841842651367 0.099791810764372713 +522 6 6.029837 0.029837131500244141 0.00089025441616286116 +523 6 6.27957726 0.27957725524902344 0.078163441652577603 +527 6 6.60642529 0.60642528533935547 0.3677516266989187 +528 6 6.449012 0.44901180267333984 0.20161159893996228 +529 6 6.22961235 0.22961235046386719 0.05272183148554177 +531 5 5.883754 0.88375377655029297 0.78102073756690515 +532 6 5.89077663 0.10922336578369141 0.011929743633118051 +533 6 5.89077663 0.10922336578369141 0.011929743633118051 +534 6 5.89077663 0.10922336578369141 0.011929743633118051 +535 5 5.346645 0.34664487838745117 0.12016267171225081 +538 5 5.79111242 0.79111242294311523 0.62585886573492644 +539 6 4.73198748 1.268012523651123 1.6078557601360899 +540 4 5.58705235 1.5870523452758789 2.5187351466456676 +541 5 4.98033667 0.019663333892822266 0.00038664669978061283 +544 6 5.297719 0.70228099822998047 0.49319860047489783 +546 6 5.97325468 0.026745319366455078 0.00071531210801367706 +547 6 5.00359249 0.99640750885009766 0.99282792369285744 +548 7 6.20132637 0.79867362976074219 0.63787956687519909 +549 5 4.98033667 0.019663333892822266 0.00038664669978061283 +557 6 5.614946 0.38505411148071289 0.14826666876820127 +558 5 5.63443756 0.63443756103515625 0.40251101885223761 +559 6 7.161683 1.1616830825805664 1.3495075843538871 +560 7 5.784691 1.2153091430664063 1.4769763132208027 +561 5 5.333059 0.33305883407592773 0.11092818695601636 +563 7 5.43116951 1.5688304901123047 2.4612291067060141 +565 6 5.93264961 0.067350387573242188 0.0045360747062659357 +566 6 4.46060658 1.539393424987793 2.3697321168956478 +569 6 5.11153841 0.88846158981323242 0.78936399657345646 +577 7 6.873437 0.12656307220458984 0.016018211245864222 +578 7 6.35843754 0.64156246185302734 0.41160239245891717 +581 5 5.36346531 0.36346530914306641 0.13210703095046483 +582 6 5.353838 0.64616203308105469 0.41752537299544201 +584 7 6.347109 0.65289115905761719 0.42626686557559879 +586 6 5.49523 0.50476980209350586 0.25479255310551707 +590 5 5.23018074 0.23018074035644531 0.052983173231041292 +593 5 5.085209 0.085208892822265625 0.0072605554159963503 +594 5 4.95861244 0.041387557983398438 0.0017129299558291677 +600 6 5.57480049 0.42519950866699219 0.18079462217065156 +602 5 5.085209 0.085208892822265625 0.0072605554159963503 +604 6 5.64044237 0.3595576286315918 0.12928168830717368 +606 5 5.693975 0.69397497177124023 0.48160126144489368 +607 5 5.693975 0.69397497177124023 0.48160126144489368 +609 6 5.524192 0.47580814361572266 0.22639338953104016 +612 5 5.31914854 0.31914854049682617 0.1018557909012543 +613 5 5.47212744 0.47212743759155273 0.22290431732676552 +614 5 5.47212744 0.47212743759155273 0.22290431732676552 +617 6 5.64316273 0.35683727264404297 0.12733283914803906 +618 6 5.71493149 0.28506851196289063 0.081264056512736715 +619 6 5.982226 0.017774105072021484 0.00031591881111125986 +621 5 5.498616 0.49861621856689453 0.24861813341794914 +622 6 5.97288942 0.027110576629638672 0.00073498336519151053 +624 5 5.18843842 0.18843841552734375 0.035509036446455866 +627 6 5.47441864 0.52558135986328125 0.27623576583573595 +629 6 5.612334 0.38766622543334961 0.15028510234174064 +633 5 5.130599 0.13059902191162109 0.017056104524272087 +634 6 6.27952433 0.27952432632446289 0.078133849007144818 +638 5 5.46523762 0.46523761749267578 0.2164460407302613 +639 5 5.31655645 0.31655645370483398 0.1002079883821807 +641 4 5.31725073 1.3172507286071777 1.7351494820161406 +642 6 5.8524847 0.14751529693603516 0.021760762830126623 +644 5 5.4044795 0.4044795036315918 0.16360366885805888 +645 5 5.498191 0.49819087982177734 0.2481941527375966 +649 7 6.201396 0.79860401153564453 0.63776836724082386 +652 7 6.201396 0.79860401153564453 0.63776836724082386 +653 6 5.41541433 0.58458566665649414 0.34174040166021769 +654 7 7.25669 0.25669002532958984 0.065889769103705476 +656 6 6.05820942 0.058209419250488281 0.0033883364894791157 +657 5 5.41170025 0.41170024871826172 0.16949709479467856 +660 5 5.218737 0.21873712539672852 0.047845930026824135 +661 7 7.051301 0.051301002502441406 0.0026317928577554994 +665 5 5.25191 0.25191020965576172 0.063458753728809825 +668 6 5.54373264 0.45626735687255859 0.20817990094747074 +670 6 5.238275 0.76172494888305664 0.58022489775089525 +678 7 6.917017 0.082983016967773438 0.0068861811050737742 +679 7 6.917017 0.082983016967773438 0.0068861811050737742 +680 5 5.33085632 0.3308563232421875 0.10946590662933886 +681 5 4.892623 0.10737705230712891 0.011529831362167897 +682 6 5.313394 0.68660593032836914 0.4714277035620853 +683 5 5.51385975 0.51385974884033203 0.26405184147824912 +685 5 5.8867135 0.88671350479125977 0.78626083957919946 +688 6 5.619183 0.38081693649291992 0.1450215391198526 +689 7 6.298906 0.70109415054321289 0.49153300792590926 +691 6 5.242263 0.75773715972900391 0.57416560323417798 +692 5 5.242263 0.24226284027099609 0.058691283776170167 +693 5 5.38634968 0.38634967803955078 0.14926607372126455 +694 6 5.18373251 0.81626749038696289 0.66629261586263056 +696 6 6.368618 0.36861801147460938 0.13587923838349525 +697 5 5.601098 0.60109806060791016 0.36131887846659083 +698 5 5.601098 0.60109806060791016 0.36131887846659083 +700 5 4.656213 0.34378719329833984 0.11818963427595008 +702 4 5.09696865 1.0969686508178711 1.2033402208771804 +704 6 6.340482 0.34048223495483398 0.11592815231983877 +705 5 4.518304 0.48169612884521484 0.23203116054446582 +706 5 5.316164 0.31616401672363281 0.099959685470821569 +707 6 6.184279 0.18427896499633789 0.033958736940121526 +711 6 6.457628 0.45762777328491211 0.20942317888170692 +712 6 6.457628 0.45762777328491211 0.20942317888170692 +714 6 6.295977 0.29597711563110352 0.087602452977307621 +718 7 6.52073431 0.47926568984985352 0.22969560146725598 +719 7 6.42389059 0.57610940933227539 0.33190205152118324 +720 5 5.19151926 0.19151926040649414 0.036679627106650514 +721 5 5.675269 0.67526912689208984 0.45598839373360534 +722 6 6.34894657 0.34894657135009766 0.12176370965698879 +723 8 6.46900225 1.5309977531433105 2.3439541201298653 +724 7 5.61504459 1.3849554061889648 1.9181014771320406 +725 5 5.293491 0.29349088668823242 0.086136900569044883 +726 7 6.81589365 0.18410634994506836 0.033895148090095972 +727 5 5.53785133 0.53785133361816406 0.28928405707483762 +728 5 6.199583 1.1995830535888672 1.438999502457591 +729 5 5.00468874 0.0046887397766113281 2.1984280692777247E-05 +732 7 4.63813353 2.3618664741516113 5.5784132417213641 +735 6 5.423086 0.57691383361816406 0.33282957142000669 +738 7 6.386245 0.61375522613525391 0.37669547760833666 +749 6 6.437719 0.43771886825561523 0.19159780762697665 +752 6 5.85753632 0.14246368408203125 0.020295901282224804 +757 6 5.437741 0.56225919723510742 0.31613540487546743 +758 7 6.76649237 0.23350763320922852 0.0545258147669756 +760 6 5.98200846 0.017991542816162109 0.00032369561290579441 +761 6 5.923116 0.076883792877197266 0.005911117607183769 +764 6 5.51022 0.48977994918823242 0.23988439862682753 +765 6 5.8884306 0.11156940460205078 0.01244773204325611 +770 7 6.357949 0.64205121994018555 0.41222976902668051 +773 5 5.643422 0.64342212677001953 0.41399203321725508 +774 9 5.385422 3.6145777702331543 13.065172457063682 +778 7 5.48641634 1.5135836601257324 2.2909354961996087 +779 8 6.92966747 1.0703325271606445 1.1456117186980919 +780 4 4.419568 0.41956806182861328 0.17603735850661906 +781 6 5.43529367 0.56470632553100586 0.31889323409473036 +782 7 5.48641634 1.5135836601257324 2.2909354961996087 +783 8 6.92966747 1.0703325271606445 1.1456117186980919 +784 5 5.181534 0.1815338134765625 0.032954525435343385 +785 6 5.83593655 0.16406345367431641 0.026916816831544566 +786 6 5.83314848 0.16685152053833008 0.027839429905952784 +788 7 5.66685 1.3331499099731445 1.7772886824614034 +792 5 5.650315 0.6503148078918457 0.42290934936340818 +794 5 5.241264 0.24126386642456055 0.058208253242128194 +795 5 5.309075 0.30907487869262695 0.095527280638862067 +799 8 6.387804 1.6121959686279297 2.5991758412601484 +802 5 5.40781832 0.40781831741333008 0.16631578001783964 +806 5 5.720001 0.720001220703125 0.51840175781399012 +810 5 5.14145136 0.14145135879516602 0.02000848690499879 +816 5 4.93575239 0.064247608184814453 0.0041277551574694371 +817 5 4.872991 0.12700891494750977 0.01613126447614377 +819 5 4.872991 0.12700891494750977 0.01613126447614377 +821 6 5.016827 0.98317289352416992 0.96662893856068877 +826 6 5.95949173 0.040508270263671875 0.0016409199597546831 +827 9 6.604491 2.3955087661743164 5.7384622488179957 +829 7 5.97121668 1.0287833213806152 1.0583951223509303 +836 8 6.864734 1.1352658271789551 1.2888284983603171 +838 8 6.864734 1.1352658271789551 1.2888284983603171 +840 7 6.47057533 0.52942466735839844 0.28029047840755084 +841 7 6.015294 0.98470592498779297 0.96964575870606495 +845 8 6.51863337 1.4813666343688965 2.1944471054214318 +848 7 6.015294 0.98470592498779297 0.96964575870606495 +850 7 6.28177261 0.71822738647460938 0.5158505786821479 +851 5 5.376349 0.37634897232055664 0.14163854896673911 +854 7 6.6217103 0.37828969955444336 0.14310309678899102 +855 7 6.141239 0.85876083374023438 0.73747016956622247 +856 5 5.376349 0.37634897232055664 0.14163854896673911 +858 7 5.7223134 1.277686595916748 1.6324830373853274 +859 5 5.4418416 0.44184160232543945 0.19522400154551178 +860 8 5.917643 2.0823569297790527 4.3362103829988428 +861 7 5.812392 1.1876077651977539 1.4104122039580034 +862 6 5.99450731 0.0054926872253417969 3.0169612955432967E-05 +863 6 6.19006824 0.19006824493408203 0.0361259377323222 +864 5 5.983109 0.9831089973449707 0.96650330066063361 +870 5 5.25949574 0.25949573516845703 0.067338036570617987 +871 5 5.097201 0.097200870513916016 0.0094480092286630679 +872 6 5.8650465 0.13495349884033203 0.018212446849247499 +874 5 5.70609665 0.70609664916992188 0.49857247796899173 +876 9 6.585497 2.4145030975341797 5.8298252080021484 +881 6 4.8947916 1.1052083969116211 1.2214856006039554 +885 7 6.47537041 0.52462959289550781 0.27523620974170626 +887 7 6.98054171 0.019458293914794922 0.00037862520207454509 +888 6 5.94279051 0.057209491729736328 0.0032729259439747693 +890 6 5.56031656 0.43968343734741211 0.19332152507763567 +895 6 5.81204939 0.18795061111450195 0.035325432218314745 +896 6 5.99438763 0.0056123733520507813 3.1498734642809723E-05 +898 6 5.335319 0.66468095779418945 0.44180077565420106 +900 7 6.235049 0.76495122909545898 0.58515038289465338 +902 5 5.44993544 0.4499354362487793 0.20244189679237934 +904 8 5.86388254 2.1361174583435059 4.5629977958399195 +906 4 4.79390144 0.79390144348144531 0.63027950196192251 +908 4 5.38352728 1.3835272789001465 1.9141477314608437 +910 5 5.037945 0.037944793701171875 0.0014398073690244928 +912 5 5.076084 0.076084136962890625 0.0057887958973878995 +914 4 5.011776 1.0117759704589844 1.0236906143982196 +918 6 6.556393 0.55639314651489258 0.30957333348874272 +919 7 5.32240725 1.6775927543640137 2.8143174494946379 +920 7 5.549413 1.4505867958068848 2.1042020521692848 +921 6 5.48633146 0.51366853713989258 0.2638553660474372 +924 8 6.586571 1.413428783416748 1.9977809257909485 +925 5 5.22027159 0.22027158737182617 0.048519572203304051 +926 5 4.644633 0.35536718368530273 0.12628583524042369 +927 7 5.53496361 1.4650363922119141 2.1463316305053013 +930 7 6.20272636 0.79727363586425781 0.63564525044421316 +934 5 5.356482 0.35648202896118164 0.12707943697228075 +935 5 5.21572351 0.21572351455688477 0.046536634732774473 +936 5 5.39356565 0.39356565475463867 0.15489392460244744 +937 5 5.48697138 0.48697137832641602 0.2371411233091294 +938 6 5.733418 0.26658201217651367 0.071065969216078884 +940 5 5.48649 0.48648977279663086 0.23667229903571751 +944 7 5.61722565 1.3827743530273438 1.9120649113901891 +950 5 5.26733351 0.2673335075378418 0.071467204252485317 +953 5 5.79355431 0.79355430603027344 0.62972843661918887 +955 5 5.26733351 0.2673335075378418 0.071467204252485317 +956 5 4.970438 0.029561996459960938 0.000873911634698743 +958 7 5.838447 1.161552906036377 1.3492051535215523 +959 6 5.76039362 0.23960638046264648 0.057411217558410499 +960 6 5.76039362 0.23960638046264648 0.057411217558410499 +964 6 5.433831 0.56616878509521484 0.32054709321619157 +965 5 5.850355 0.85035514831542969 0.72310387826655642 +968 7 6.966538 0.033462047576904297 0.0011197086280390067 +969 7 5.98017645 1.0198235511779785 1.040040075537263 +970 7 6.274452 0.72554779052734375 0.52641959633911029 +971 7 6.336352 0.66364812850952148 0.44042883847419034 +972 6 5.526252 0.47374820709228516 0.2244373637231547 +974 6 7.051524 1.0515241622924805 1.1057030638849028 +976 6 6.41369772 0.41369771957397461 0.17114580318070693 +980 6 5.652429 0.34757089614868164 0.12080552784959764 +982 6 6.40746641 0.40746641159057617 0.16602887657450083 +983 6 6.51755238 0.51755237579345703 0.26786046168945177 +985 6 6.25447845 0.25447845458984375 0.064759283850435168 +986 6 5.613062 0.38693809509277344 0.14972108943402418 +989 7 5.79079962 1.209200382232666 1.4621655643916256 +992 5 5.663801 0.66380119323730469 0.44063202414326952 +994 6 5.55731869 0.44268131256103516 0.1959667444907609 +995 6 5.59174728 0.40825271606445313 0.16667028017400298 +997 6 5.473357 0.52664279937744141 0.277352638136108 +998 6 5.78107262 0.21892738342285156 0.047929199212376261 +999 7 5.74751568 1.2524843215942383 1.5687169758393793 +1002 6 5.24164534 0.75835466384887695 0.57510179618134316 +1004 6 6.97149324 0.97149324417114258 0.94379912347017125 +1006 6 6.97149324 0.97149324417114258 0.94379912347017125 +1007 5 4.93337536 0.066624641418457031 0.0044388428441379801 +1015 5 5.16026 0.16026020050048828 0.025683331864456704 +1016 5 5.38627958 0.38627958297729492 0.14921191622511287 +1017 6 5.939317 0.060682773590087891 0.0036823990105858684 +1018 6 5.7577734 0.24222660064697266 0.058673726060987974 +1021 7 6.02436972 0.97563028335571289 0.95185444980074863 +1025 6 6.155214 0.15521383285522461 0.024091333909609602 +1026 6 6.420076 0.42007589340209961 0.17646375621757215 +1027 4 4.320953 0.3209528923034668 0.10301075907796076 +1030 6 6.197439 0.19743919372558594 0.038982235219009453 +1032 6 5.37426758 0.625732421875 0.39154106378555298 +1033 6 5.37426758 0.625732421875 0.39154106378555298 +1034 3 4.92883873 1.9288387298583984 3.7204188458017597 +1037 5 4.7021246 0.29787540435791016 0.088729756521388481 +1039 5 5.92955065 0.9295506477355957 0.86406440670566553 +1040 4 5.261669 1.2616691589355469 1.5918090666091302 +1044 7 5.83602762 1.1639723777770996 1.3548316962280751 +1045 5 6.239166 1.2391657829284668 1.5355318375807201 +1047 5 3.99405575 1.0059442520141602 1.0119238381603282 +1049 6 7.25993538 1.2599353790283203 1.5874371593272372 +1051 6 5.60375547 0.39624452590942383 0.15700972431318405 +1052 5 5.979352 0.97935199737548828 0.95913033476335841 +1053 4 5.19417763 1.1941776275634766 1.4260602061731333 +1054 5 3.99405575 1.0059442520141602 1.0119238381603282 +1058 6 5.740259 0.25974082946777344 0.067465298492606962 +1059 4 5.367808 1.3678078651428223 1.8708983559465651 +1060 7 6.01093769 0.98906230926513672 0.97824425160888495 +1061 5 5.697409 0.69740915298461914 0.4863795266667239 +1064 6 5.840905 0.15909481048583984 0.025311158723525295 +1065 5 5.58919859 0.58919858932495117 0.34715497766251247 +1068 7 4.898771 2.101229190826416 4.415164112381035 +1069 6 6.51569176 0.51569175720214844 0.26593798844623961 +1071 5 5.58919859 0.58919858932495117 0.34715497766251247 +1072 7 5.658098 1.3419017791748047 1.8007003849525063 +1074 6 4.78750324 1.2124967575073242 1.470148386965775 +1075 7 6.55795527 0.44204473495483398 0.19540354770128943 +1076 6 5.85578537 0.14421463012695313 0.020797859542653896 +1077 5 5.646455 0.64645481109619141 0.41790382278941252 +1079 6 5.67320061 0.32679939270019531 0.10679784306921647 +1080 7 5.97999525 1.0200047492980957 1.0404096885906711 +1082 6 5.49658728 0.50341272354125977 0.25342437022322883 +1083 6 6.262478 0.26247787475585938 0.0688946347363526 +1084 7 5.99038124 1.0096187591552734 1.019330038838234 +1085 5 4.72637224 0.27362775802612305 0.074872149962402545 +1086 8 6.815828 1.1841721534729004 1.4022636890606464 +1088 6 6.262478 0.26247787475585938 0.0688946347363526 +1090 6 5.95233536 0.047664642333984375 0.0022719181288266554 +1091 6 6.284743 0.28474283218383789 0.081078480480073267 +1092 6 6.023808 0.023808002471923828 0.00056682098170313111 +1094 5 5.72295761 0.72295761108398438 0.52266770742426161 +1095 8 6.37091827 1.6290817260742188 2.6539072702289559 +1098 6 5.96830368 0.031696319580078125 0.0010046566749224439 +1099 7 6.86467171 0.13532829284667969 0.018313746844796697 +1100 6 5.49658728 0.50341272354125977 0.25342437022322883 +1101 6 6.43475533 0.43475532531738281 0.18901219289182336 +1103 5 4.511087 0.48891305923461914 0.2390359794901542 +1112 6 5.26224566 0.73775434494018555 0.54428147347812228 +1119 5 4.98052025 0.019479751586914063 0.00037946072188788094 +1122 7 6.588348 0.4116520881652832 0.1694574416908381 +1125 6 4.712504 1.2874960899353027 1.6576461815986931 +1126 7 7.344084 0.34408378601074219 0.11839365179548622 +1129 7 6.40953732 0.59046268463134766 0.34864618194205832 +1130 6 5.62957954 0.37042045593261719 0.13721131417332799 +1133 5 5.253349 0.25334882736206055 0.064185628325731159 +1134 5 5.680931 0.68093109130859375 0.46366715111071244 +1135 6 5.65637636 0.34362363815307617 0.11807720469755623 +1136 8 6.62064457 1.3793554306030273 1.902621403934063 +1137 8 6.2427845 1.7572154998779297 3.0878063130112423 +1138 5 5.055894 0.055893898010253906 0.0031241278347806656 +1140 6 5.753335 0.24666500091552734 0.060843622676657105 +1141 5 4.90070629 0.099293708801269531 0.0098592406075113104 +1143 5 5.72487831 0.72487831115722656 0.52544856598615297 +1144 5 5.61719847 0.61719846725463867 0.38093394798147528 +1146 5 5.02811861 0.028118610382080078 0.00079065624981922156 +1147 5 5.056607 0.056606769561767578 0.0032043263602190564 +1148 6 6.078053 0.078052997589111328 0.0060922704326458188 +1151 5 5.05896759 0.05896759033203125 0.0034771767095662653 +1153 6 5.77633762 0.22366237640380859 0.050024858618598955 +1155 4 6.221552 2.2215518951416016 4.9352928228072415 +1158 6 5.825183 0.17481708526611328 0.030561013300939521 +1159 6 5.808246 0.19175386428833008 0.036769544469507309 +1164 6 5.17904854 0.82095146179199219 0.67396130261840881 +1165 5 6.273182 1.2731819152832031 1.6209921894042054 +1166 5 4.81632471 0.18367528915405273 0.033736611845824882 +1168 5 5.876407 0.87640714645385742 0.76808948635539309 +1169 6 6.071286 0.071286201477050781 0.005081722521026677 +1170 6 5.34411 0.65588998794555664 0.43019167628722244 +1174 6 5.6522193 0.34778070449829102 0.12095141842132762 +1175 5 5.39869833 0.39869832992553711 0.15896035828541244 +1177 6 5.67815351 0.32184648513793945 0.10358515999564588 +1181 6 5.36447144 0.635528564453125 0.40389655623584986 +1182 5 6.27437162 1.2743716239929199 1.6240230360383521 +1184 7 6.60242748 0.39757251739501953 0.15806390658781311 +1186 5 5.32623339 0.3262333869934082 0.10642822278919084 +1187 8 6.35104036 1.6489596366882324 2.7190678834269875 +1191 7 6.0864296 0.91357040405273438 0.83461088316107634 +1195 6 5.57003355 0.42996644973754883 0.1848711478999121 +1198 6 5.755423 0.24457693099975586 0.059817875177259339 +1199 7 5.731105 1.268895149230957 1.6100948997418527 +1200 6 6.085916 0.085916042327880859 0.0073815663292862155 +1201 7 5.94414234 1.0558576583862305 1.1148353947728538 +1202 5 5.404809 0.40480899810791016 0.16387032494913001 +1204 6 5.518382 0.48161792755126953 0.23195582813877991 +1206 6 5.445193 0.55480718612670898 0.30781101377783671 +1207 5 5.404809 0.40480899810791016 0.16387032494913001 +1208 6 6.66462374 0.66462373733520508 0.44172471222941567 +1210 6 4.54080772 1.4591922760009766 2.1292420983409102 +1212 6 6.115354 0.11535406112670898 0.013306559418424513 +1213 6 5.518382 0.48161792755126953 0.23195582813877991 +1214 6 4.642589 1.3574109077453613 1.8425643724660858 +1216 8 6.710257 1.2897429466247559 1.6634368683683078 +1218 8 6.31677532 1.6832246780395508 2.8332453167613494 +1220 6 5.611329 0.38867092132568359 0.15106508508415573 +1221 7 7.4408474 0.44084739685058594 0.19434642730993801 +1229 3 6.484815 3.4848151206970215 12.143936425438596 +1231 7 6.67793751 0.32206249237060547 0.10372424899196631 +1232 7 6.457521 0.54247903823852539 0.29428350692819549 +1233 6 6.70588541 0.70588541030883789 0.49827421248687642 +1234 6 6.234978 0.23497819900512695 0.055214754007693045 +1238 7 6.59822941 0.40177059173583984 0.1614196083837669 +1240 6 5.63298655 0.36701345443725586 0.13469887573796768 +1243 7 6.59822941 0.40177059173583984 0.1614196083837669 +1246 7 5.8469286 1.153071403503418 1.3295736615773421 +1248 7 5.684961 1.3150391578674316 1.7293279867246838 +1249 5 4.7347455 0.26525449752807617 0.070359948458872168 +1251 5 5.594396 0.59439611434936523 0.35330674075362367 +1253 7 6.62163353 0.37836647033691406 0.14316118587521487 +1254 5 5.51827049 0.51827049255371094 0.26860430345186614 +1255 6 5.69098949 0.30901050567626953 0.095487492618303804 +1257 6 5.76259565 0.23740434646606445 0.05636082372097917 +1259 6 5.48381853 0.51618146896362305 0.26644330890144374 +1260 6 5.49859047 0.50140953063964844 0.25141151741627255 +1261 6 5.657525 0.34247493743896484 0.11728908277382288 +1263 6 4.709868 1.2901320457458496 1.664440695460371 +1265 7 6.08131742 0.91868257522583008 0.84397767402356294 +1266 8 6.710818 1.289182186126709 1.6619907090264405 +1268 5 5.2311573 0.23115730285644531 0.05343369866386638 +1269 6 5.478538 0.52146196365356445 0.27192257953743137 +1274 6 5.478538 0.52146196365356445 0.27192257953743137 +1277 5 5.2311573 0.23115730285644531 0.05343369866386638 +1280 6 6.807374 0.80737400054931641 0.65185277676300757 +1281 7 6.404438 0.59556198120117188 0.354694073452265 +1282 5 4.99746656 0.0025334358215332031 6.4182970618276158E-06 +1285 6 6.807374 0.80737400054931641 0.65185277676300757 +1290 6 5.89834833 0.10165166854858398 0.010333061718711178 +1291 6 5.971956 0.028044223785400391 0.00078647848772561701 +1293 4 5.190955 1.1909551620483398 1.4183741980095874 +1296 6 6.45353 0.45352983474731445 0.20568931100592636 +1297 7 6.804424 0.19557619094848633 0.038250046465918786 +1300 6 5.398065 0.60193490982055664 0.36232563566068166 +1301 5 6.25851965 1.2585196495056152 1.5838717081917366 +1302 6 5.77307749 0.22692251205444336 0.051493826477098992 +1306 8 6.853728 1.1462721824645996 1.3139399162921563 +1308 6 5.370329 0.62967109680175781 0.39648569014752866 +1313 5 4.95963049 0.040369510650634766 0.0016296973901717138 +1314 6 5.40624571 0.59375429153442383 0.35254415871554556 +1320 6 5.42479229 0.57520771026611328 0.33086390994958492 +1323 5 6.09546757 1.0954675674438477 1.2000491913213409 +1324 6 5.879797 0.12020301818847656 0.014448765581619227 +1325 7 6.58349276 0.41650724411010742 0.17347828439619661 +1327 6 5.74115562 0.25884437561035156 0.067000410785112763 +1328 6 6.5878973 0.58789730072021484 0.34562323619411472 +1330 5 5.31433058 0.3143305778503418 0.098803712171729785 +1331 6 5.859345 0.1406550407409668 0.019783840485843029 +1334 6 5.78381538 0.21618461608886719 0.046735788233490894 +1336 8 5.991396 2.0086040496826172 4.0344902284014097 +1337 5 5.665654 0.66565418243408203 0.44309549059198616 +1338 5 5.665654 0.66565418243408203 0.44309549059198616 +1340 6 5.678114 0.32188606262207031 0.10361063731033937 +1341 5 4.881372 0.11862802505493164 0.014072608328433489 +1344 8 6.458304 1.5416960716247559 2.3768267772632043 +1345 8 7.06284952 0.93715047836303711 0.87825101909606929 +1346 7 6.51082373 0.48917627334594727 0.23929342640462892 +1348 8 5.991396 2.0086040496826172 4.0344902284014097 +1350 7 6.269445 0.73055505752563477 0.53371069207628352 +1354 5 6.408069 1.4080691337585449 1.9826586854435391 +1355 5 5.80267048 0.80267047882080078 0.6442798975704136 +1356 6 5.897979 0.10202121734619141 0.010408328788798826 +1361 7 6.297319 0.70268106460571289 0.49376067855541805 +1363 4 5.39580774 1.3958077430725098 1.9482792556211734 +1365 7 6.33742571 0.66257429122924805 0.43900469139794041 +1366 6 5.644856 0.35514402389526367 0.12612727770851961 +1367 5 5.3965373 0.39653730392456055 0.1572418334037593 +1370 6 5.53704166 0.46295833587646484 0.21433042075750564 +1372 6 4.98262644 1.0173735618591309 1.0350489643699348 +1373 6 4.98262644 1.0173735618591309 1.0350489643699348 +1375 7 6.539049 0.46095085144042969 0.21247568744365708 +1379 6 4.545688 1.4543118476867676 2.1150229503220999 +1380 7 6.878299 0.12170076370239258 0.014811075885745595 +1381 7 6.69022655 0.30977344512939453 0.095959587307334004 +1382 6 4.617643 1.382357120513916 1.9109112086355253 +1383 6 5.60604048 0.39395952224731445 0.15520410516933225 +1384 6 4.96960258 1.0303974151611328 1.0617188331707439 +1386 7 6.814375 0.18562507629394531 0.034456668949133018 +1388 7 6.14732 0.85268020629882813 0.72706353421381209 +1389 6 5.456267 0.54373311996459961 0.29564570574643767 +1393 6 5.9041357 0.095864295959472656 0.0091899632398053654 +1394 7 6.814375 0.18562507629394531 0.034456668949133018 +1395 7 6.31325054 0.68674945831298828 0.47162481849318283 +1398 7 6.0729084 0.92709159851074219 0.85949883202920319 +1400 7 6.0729084 0.92709159851074219 0.85949883202920319 +1403 8 6.553515 1.4464850425720215 2.0923189783845828 +1404 5 4.51477766 0.48522233963012695 0.23544071887613427 +1406 8 5.84692955 2.1530704498291016 4.6357123619272897 +1407 6 6.19066143 0.19066143035888672 0.03635178102649661 +1408 7 6.0729084 0.92709159851074219 0.85949883202920319 +1409 6 5.880574 0.11942577362060547 0.014262515404880105 +1411 6 6.30539227 0.30539226531982422 0.09326443571717391 +1413 6 5.36225033 0.63774967193603516 0.40672464405452047 +1416 6 5.817216 0.18278408050537109 0.033410020086193981 +1419 7 5.729145 1.2708549499511719 1.6150723038153956 +1420 4 5.15809631 1.1580963134765625 1.3411870712880045 +1421 6 6.552526 0.55252599716186523 0.30528497753971351 +1424 6 5.36225033 0.63774967193603516 0.40672464405452047 +1425 6 5.522351 0.47764921188354492 0.22814876961297159 +1426 6 6.43497562 0.43497562408447266 0.18920379354767647 +1427 5 6.09880924 1.0988092422485352 1.2073817508508 +1431 5 5.47524738 0.47524738311767578 0.2258600751601989 +1434 5 6.09880924 1.0988092422485352 1.2073817508508 +1436 5 4.29367065 0.706329345703125 0.49890114460140467 +1437 7 6.381414 0.61858606338500977 0.38264871781416332 +1438 5 5.76378441 0.76378440856933594 0.58336662277361029 +1439 5 5.28301859 0.28301858901977539 0.080099521730744527 +1440 5 5.32609844 0.32609844207763672 0.10634019392546179 +1442 5 5.15215874 0.15215873718261719 0.02315228130100877 +1443 6 6.60022068 0.60022068023681641 0.36026486498394661 +1447 6 5.92240143 0.07759857177734375 0.00602153834188357 +1456 6 6.18065453 0.18065452575683594 0.032636057676427299 +1457 6 6.200436 0.20043611526489258 0.040174636302481304 +1458 6 6.735425 0.73542499542236328 0.54084992389198305 +1459 6 6.14485168 0.1448516845703125 0.020982010522857308 +1460 6 6.245408 0.24540805816650391 0.060225115013054165 +1461 6 6.01023769 0.010237693786621094 0.00010481037406862015 +1462 6 5.92240143 0.07759857177734375 0.00602153834188357 +1463 6 5.547709 0.45229101181030273 0.20456715936438741 +1464 8 6.88174152 1.1182584762573242 1.2505020197213526 +1465 5 5.582034 0.58203411102294922 0.33876370639427478 +1470 7 6.841235 0.15876483917236328 0.025206274157426378 +1471 6 6.24523163 0.24523162841796875 0.060138551576528698 +1474 4 4.629509 0.62950897216796875 0.39628154603997245 +1478 6 5.93162775 0.068372249603271484 0.0046747645158120577 +1480 6 6.046388 0.046388149261474609 0.0021518603919048473 +1482 6 5.490122 0.50987815856933594 0.25997573658605688 +1484 3 4.92298555 1.9229855537414551 3.6978734398983306 +1485 6 5.54977131 0.45022869110107422 0.20270587429058651 +1486 6 5.915575 0.084424972534179688 0.0071275759873969946 +1488 6 5.247855 0.75214481353759766 0.56572182053150755 +1489 5 5.878215 0.87821483612060547 0.77126129838234192 +1492 5 5.32583046 0.32583045959472656 0.10616548839971074 +1494 8 6.80715847 1.1928415298461914 1.4228709153258023 +1495 7 6.69690275 0.30309724807739258 0.091867941792088459 +1498 6 5.70931149 0.29068851470947266 0.084499812583999301 +1502 5 5.34187937 0.34187936782836914 0.11688150214672532 +1503 7 6.465032 0.53496789932250977 0.28619065330553894 +1505 7 5.42042446 1.5795755386352539 2.4950588822548525 +1506 6 6.12831974 0.12831974029541016 0.016465955749481509 +1508 6 5.17407465 0.82592535018920898 0.68215268408516749 +1509 5 5.704465 0.70446491241455078 0.4962708128232407 +1510 5 5.57555246 0.57555246353149414 0.33126063827717189 +1511 6 5.37051249 0.62948751449584961 0.39625453090616247 +1514 7 6.654268 0.34573221206665039 0.11953076246049932 +1518 6 6.37047958 0.37047958374023438 0.13725512196833733 +1519 5 5.5685 0.56850004196166992 0.32319229771042046 +1521 5 5.34187937 0.34187936782836914 0.11688150214672532 +1522 5 6.161465 1.1614651679992676 1.3490013364755669 +1523 6 5.701397 0.29860305786132813 0.089163786164135672 +1524 6 5.57626057 0.42373943328857422 0.17955510732372204 +1525 5 5.21797943 0.21797943115234375 0.047515032405499369 +1528 6 6.10163975 0.10163974761962891 0.01033063829618186 +1529 6 5.57626057 0.42373943328857422 0.17955510732372204 +1531 7 5.82842255 1.1715774536132813 1.3725937298149802 +1534 6 5.86905527 0.13094472885131836 0.017146522013945287 +1535 6 6.004974 0.0049738883972167969 2.4739565787967877E-05 +1536 5 5.1332283 0.13322830200195313 0.017749780454323627 +1537 6 5.380709 0.61929082870483398 0.38352113051792003 +1539 6 6.15297651 0.15297651290893555 0.023401813501777724 +1541 4 4.89264536 0.89264535903930664 0.79681573701441266 +1544 5 5.1332283 0.13322830200195313 0.017749780454323627 +1545 6 6.029986 0.029985904693603516 0.00089915448029387335 +1546 6 5.563477 0.4365229606628418 0.19055229518585293 +1547 6 5.563477 0.4365229606628418 0.19055229518585293 +1548 6 7.126276 1.1262760162353516 1.2684976647469739 +1550 6 5.78761339 0.2123866081237793 0.045108071310323794 +1553 7 6.29732943 0.70267057418823242 0.49374593583002024 +1555 7 6.534805 0.4651951789855957 0.21640655455144042 +1556 6 5.79464149 0.20535850524902344 0.042172115678113187 +1557 6 5.78761339 0.2123866081237793 0.045108071310323794 +1558 4 5.60473728 1.6047372817993164 2.5751817435966586 +1563 6 6.508431 0.50843095779418945 0.25850203884351686 +1565 6 5.905046 0.094954013824462891 0.0090162647413762897 +1566 5 5.85104227 0.85104227066040039 0.7242729464508102 +1568 6 5.8718257 0.1281743049621582 0.016428652452532333 +1570 5 5.52583742 0.52583742141723633 0.27650499376272819 +1574 4 6.22960234 2.2296023368835449 4.9711265806365645 +1575 6 5.44509125 0.55490875244140625 0.30792372353607789 +1577 4 5.4131093 1.413109302520752 1.9968779008706861 +1579 4 5.4505353 1.4505352973937988 2.1040526489853164 +1582 7 6.07192755 0.92807245254516602 0.86131847717319943 +1583 5 5.42974424 0.42974424362182617 0.18468011492609548 +1584 6 5.56638336 0.43361663818359375 0.18802338890964165 +1586 5 5.02551937 0.025519371032714844 0.00065123829790536547 +1590 6 6.50889826 0.50889825820922852 0.25897743720838662 +1591 6 6.791677 0.79167699813842773 0.62675246938147211 +1593 6 5.138271 0.86172914505004883 0.74257711942868809 +1594 6 5.59737825 0.40262174606323242 0.16210427040300601 +1595 6 5.506587 0.49341297149658203 0.24345636044108687 +1601 6 5.445505 0.55449485778808594 0.30746454731342965 +1602 5 6.579205 1.5792050361633301 2.4938885462436247 +1604 5 5.067999 0.067998886108398438 0.004623848511982942 +1605 9 6.921087 2.0789132118225098 4.3218801422901834 +1606 6 6.41273069 0.41273069381713867 0.17034662561877667 +1608 5 5.352296 0.35229587554931641 0.12411238392905943 +1611 6 5.439003 0.56099700927734375 0.31471764441812411 +1612 7 5.95403051 1.0459694862365723 1.0940521661379989 +1614 5 5.99248362 0.99248361587524414 0.98502372778079916 +1615 6 6.17295 0.17294979095458984 0.029911630191236327 +1618 6 5.036212 0.96378803253173828 0.92888737165139901 +1620 7 5.95403051 1.0459694862365723 1.0940521661379989 +1622 6 5.21739149 0.7826085090637207 0.61247607845893981 +1624 7 5.79714 1.2028598785400391 1.4468718874013575 +1625 6 6.154775 0.15477514266967773 0.023955344788419097 +1627 5 4.874259 0.12574100494384766 0.015810800324288721 +1630 5 5.171584 0.17158412933349609 0.029441113439133915 +1631 6 5.820287 0.17971277236938477 0.032296680552690304 +1635 6 5.85868073 0.14131927490234375 0.019971137458924204 +1637 6 6.16494942 0.16494941711425781 0.027208310206333408 +1638 5 5.0219636 0.021963596343994141 0.00048239956436191278 +1640 5 5.314522 0.31452178955078125 0.098923956102225929 +1643 7 6.005394 0.99460601806640625 0.98924113117391244 +1645 7 6.072939 0.92706108093261719 0.8594422477799526 +1648 5 6.300005 1.3000049591064453 1.6900128937013505 +1649 4 5.1877737 1.1877737045288086 1.4108063731700895 +1650 7 6.635081 0.36491918563842773 0.13316601204701328 +1652 4 5.59403658 1.5940365791320801 2.5409526156111042 +1661 6 5.57137442 0.42862558364868164 0.18371989095817298 +1662 7 5.93672 1.0632801055908203 1.130564582945226 +1666 5 5.0802207 0.080220699310302734 0.0064353605978340056 +1670 6 5.47703 0.52297019958496094 0.27349782965393388 +1671 7 6.782234 0.21776580810546875 0.047421947179827839 +1672 5 5.58361244 0.58361244201660156 0.34060348247658112 +1675 5 5.515949 0.51594877243041992 0.26620313577245724 +1676 7 6.782234 0.21776580810546875 0.047421947179827839 +1678 6 5.84444141 0.15555858612060547 0.024198473715841828 +1682 7 6.28926134 0.7107386589050293 0.50514944126211958 +1683 7 6.28926134 0.7107386589050293 0.50514944126211958 +1686 5 6.27901173 1.2790117263793945 1.6358709962159992 +1687 7 6.0611124 0.93888759613037109 0.88150991816746682 +1689 6 6.20967627 0.20967626571655273 0.043964136404838428 +1691 7 6.28926134 0.7107386589050293 0.50514944126211958 +1692 6 6.29506445 0.29506444931030273 0.087063029246792212 +1693 5 5.413152 0.41315221786499023 0.17069475512676036 +1694 6 5.864325 0.13567495346069336 0.018407692996561309 +1695 6 6.37711525 0.37711524963378906 0.14221591150635504 +1696 6 5.542532 0.45746803283691406 0.20927700106767588 +1698 6 6.29506445 0.29506444931030273 0.087063029246792212 +1700 6 6.019749 0.019749164581298828 0.00039002950165922812 +1703 5 5.314096 0.31409597396850586 0.09865628086322431 +1705 6 6.80662727 0.80662727355957031 0.65064755845014588 +1708 4 5.587132 1.5871319770812988 2.5189879126739925 +1710 5 5.041333 0.041333198547363281 0.0017084333021557541 +1712 6 5.72083235 0.27916765213012695 0.077934577995847576 +1717 6 5.54116535 0.45883464813232422 0.21052923432671378 +1718 4 5.17026567 1.1702656745910645 1.3695217491260792 +1722 6 6.35374975 0.35374975204467773 0.12513888707167098 +1726 6 6.738525 0.7385249137878418 0.54541904828533916 +1727 6 5.399927 0.60007286071777344 0.36008743817001232 +1729 6 6.474758 0.47475814819335938 0.22539529927598778 +1730 6 5.602798 0.3972020149230957 0.15776944065896714 +1732 5 5.432952 0.43295192718505859 0.18744737125325628 +1733 6 5.758369 0.24163103103637695 0.058385555159702562 +1737 6 5.744494 0.25550603866577148 0.065283335794674713 +1738 5 5.71241426 0.71241426467895508 0.50753408451805626 +1741 6 6.7084403 0.70844030380249023 0.50188766405176466 +1742 6 5.48805237 0.5119476318359375 0.26209037774242461 +1745 5 5.133648 0.13364791870117188 0.017861766173155047 +1750 6 6.308025 0.30802488327026367 0.094879328713659561 +1751 7 6.39781 0.60219001770019531 0.36263281741776154 +1752 6 5.633576 0.3664240837097168 0.13426660912250554 +1757 5 5.08499527 0.084995269775390625 0.0072241958841914311 +1759 5 4.57264137 0.42735862731933594 0.18263539634426706 +1760 6 5.35816765 0.64183235168457031 0.41194876766894595 +1761 6 5.830978 0.1690220832824707 0.028568464637146462 +1762 7 6.204322 0.79567813873291016 0.63310370045746822 +1763 6 6.088181 0.088181018829345703 0.0077758920817814214 +1764 5 5.18299437 0.18299436569213867 0.033486937875068179 +1766 5 5.059079 0.059079170227050781 0.0034903483547168435 +1769 7 6.512047 0.48795318603515625 0.2380983117618598 +1770 6 5.67229652 0.32770347595214844 0.10738956815112033 +1771 6 5.850691 0.14930915832519531 0.022293224759778241 +1777 6 5.850691 0.14930915832519531 0.022293224759778241 +1778 8 7.38504457 0.61495542526245117 0.37817017505972217 +1780 5 5.904208 0.90420818328857422 0.81759243872602383 +1781 4 5.6435194 1.643519401550293 2.7011560232722331 +1782 6 6.042781 0.042780876159667969 0.0018302033649888472 +1786 7 6.63890934 0.36109066009521484 0.13038646480799798 +1787 7 6.88856936 0.11143064498901367 0.012416788642667598 +1790 5 5.07970238 0.079702377319335938 0.0063524689503537957 +1791 5 5.499499 0.49949884414672852 0.24949909530391778 +1792 6 5.63644028 0.36355972290039063 0.13217567211540882 +1793 5 5.090697 0.090696811676025391 0.0082259116481964156 +1796 5 6.436928 1.4369277954101563 2.0647614892222919 +1797 8 6.802576 1.1974239349365234 1.4338240799588675 +1798 6 5.83613729 0.16386270523071289 0.026850986165527502 +1799 6 5.91608953 0.083910465240478516 0.0070409661768735532 +1804 6 5.375231 0.62476921081542969 0.39033656678293482 +1806 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1807 6 5.644393 0.35560703277587891 0.12645636175966501 +1808 5 5.25200033 0.25200033187866211 0.063504167266955847 +1809 6 5.644393 0.35560703277587891 0.12645636175966501 +1811 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1813 6 6.00334644 0.0033464431762695313 1.1198681932000909E-05 +1815 6 5.752005 0.24799489974975586 0.061501470301891459 +1819 6 6.7389946 0.73899459838867188 0.54611301644763444 +1820 6 5.752005 0.24799489974975586 0.061501470301891459 +1822 7 6.971259 0.028740882873535156 0.00082603834835026646 +1833 7 6.58283949 0.4171605110168457 0.17402289195183585 +1834 6 5.627404 0.37259578704833984 0.13882762052617181 +1837 7 6.70057869 0.29942131042480469 0.089653121136507252 +1838 6 5.41108942 0.58891057968139648 0.34681567086067844 +1839 6 5.501237 0.49876308441162109 0.24876461437179387 +1840 5 6.12066841 1.1206684112548828 1.2558976879845432 +1842 6 6.20005941 0.20005941390991211 0.040023769093977535 +1846 5 5.35677 0.35677003860473633 0.12728486044602505 +1848 5 4.703982 0.29601812362670898 0.087626729515477564 +1849 6 5.983951 0.016048908233642578 0.00025756745549188054 +1850 7 5.676928 1.3230719566345215 1.7505194024327011 +1851 6 6.48563433 0.48563432693481445 0.23584069949743025 +1852 7 6.038734 0.96126604080200195 0.92403240119915608 +1853 5 5.17571163 0.17571163177490234 0.030874577540998871 +1855 6 6.008804 0.0088038444519042969 7.7507677133326069E-05 +1856 4 4.440154 0.44015407562255859 0.19373561028714903 +1857 5 5.032861 0.032861232757568359 0.0010798606183470838 +1860 6 5.77942848 0.22057151794433594 0.04865179452826851 +1864 6 6.325848 0.32584810256958008 0.10617698594819558 +1865 6 5.458929 0.54107093811035156 0.29275776006761589 +1869 7 6.116072 0.88392782211303711 0.78132839470549698 +1870 6 5.875573 0.12442684173583984 0.015482038944355736 +1872 5 4.96669054 0.033309459686279297 0.0011095201045918657 +1875 5 5.0912385 0.091238498687744141 0.0083244636427934893 +1880 5 5.175462 0.17546176910400391 0.03078683241710678 +1881 6 5.950545 0.049455165863037109 0.002445813430540511 +1882 5 5.175462 0.17546176910400391 0.03078683241710678 +1886 5 4.60353565 0.39646434783935547 0.15718397910768545 +1891 5 5.446395 0.44639492034912109 0.19926842491349817 +1893 5 5.2195406 0.21954059600830078 0.048198073295679933 +1895 6 5.80891371 0.1910862922668457 0.036513971092290376 +1896 6 5.608869 0.39113092422485352 0.1529833998849881 +1897 6 5.608869 0.39113092422485352 0.1529833998849881 +1898 6 5.20592976 0.79407024383544922 0.63054755214488978 +1904 6 5.80891371 0.1910862922668457 0.036513971092290376 +1907 7 6.76484728 0.2351527214050293 0.055296802384191324 +1908 7 6.8543663 0.14563369750976563 0.021209173850365914 +1909 5 5.87015438 0.87015438079833984 0.75716864642254222 +1910 5 5.54551744 0.5455174446105957 0.29758928237447435 +1911 6 5.793866 0.20613384246826172 0.042491161010730139 +1912 6 5.967311 0.032689094543457031 0.0010685769020710723 +1913 6 5.73380566 0.26619434356689453 0.070859428547009884 +1914 6 6.51671028 0.51671028137207031 0.26698951487560407 +1915 7 6.8543663 0.14563369750976563 0.021209173850365914 +1916 5 5.54551744 0.5455174446105957 0.29758928237447435 +1918 6 5.754359 0.24564123153686523 0.060339614630947835 +1920 7 5.34622431 1.653775691986084 2.7349740394040509 +1922 5 5.769138 0.76913785934448242 0.59157304667701283 +1923 5 4.63728237 0.36271762847900391 0.13156407800943271 +1925 6 5.87001657 0.12998342514038086 0.016895690811224995 +1926 6 5.80602169 0.19397830963134766 0.037627584607434983 +1927 5 5.79432964 0.79432964324951172 0.63095958214489656 +1929 5 5.39010525 0.39010524749755859 0.15218210412513145 +1930 6 5.574939 0.42506122589111328 0.18067704575605603 +1931 3 5.49573374 2.4957337379455566 6.2286868907197004 +1933 5 4.799954 0.20004606246948242 0.040018427109544064 +1938 5 5.91960573 0.91960573196411133 0.84567470226124897 +1940 5 4.84486437 0.1551356315612793 0.024067064179916997 +1941 5 5.34108162 0.34108161926269531 0.11633667099886225 +1943 5 5.51694345 0.51694345474243164 0.26723053540104047 +1944 5 5.21851873 0.21851873397827148 0.047750437099466581 +1946 6 4.722785 1.2772150039672852 1.6312781663591522 +1948 7 6.280798 0.71920204162597656 0.51725157667897292 +1949 5 5.261702 0.26170206069946289 0.068487968574345359 +1950 5 5.22447157 0.2244715690612793 0.050387485316832681 +1951 4 4.855174 0.85517406463623047 0.73132268082645169 +1952 7 6.520986 0.47901391983032227 0.22945433539121041 +1953 6 6.01531935 0.015319347381591797 0.00023468240419788344 +1955 5 5.68653727 0.68653726577758789 0.47133341730136635 +1959 5 5.41501045 0.41501045227050781 0.17223367549377144 +1960 5 5.41501045 0.41501045227050781 0.17223367549377144 +1966 6 5.78424644 0.21575355529785156 0.046549596623663092 +1969 7 6.70432138 0.29567861557006836 0.087425843705432271 +1970 6 5.3136754 0.6863245964050293 0.47104145163052635 +1972 5 5.7198534 0.71985340118408203 0.51818891919629095 +1974 5 5.129496 0.12949609756469727 0.016769239284485593 +1975 6 5.346977 0.65302276611328125 0.42643873306224123 +1977 6 5.750509 0.24949121475219727 0.062245866238527015 +1978 6 5.46808672 0.53191328048706055 0.28293173795850635 +1979 6 5.278212 0.72178792953491211 0.52097781522229525 +1980 8 7.46080828 0.53919172286987305 0.29072771401138198 +1982 8 7.46080828 0.53919172286987305 0.29072771401138198 +1984 8 7.46080828 0.53919172286987305 0.29072771401138198 +1985 6 6.078637 0.078637123107910156 0.0061837971306886175 +1986 6 5.89531374 0.10468626022338867 0.010959213079559049 +1989 7 6.54342365 0.45657634735107422 0.20846196096044878 +1990 4 5.04370642 1.0437064170837402 1.0893230850617783 +1992 5 5.810789 0.81078910827636719 0.65737897809958667 +1993 6 5.87721062 0.12278938293457031 0.015077232561452547 +1996 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +1997 6 6.140746 0.14074611663818359 0.019809469348729181 +1998 6 6.140746 0.14074611663818359 0.019809469348729181 +2001 5 4.93630362 0.063696384429931641 0.0040572293894456379 +2002 6 6.542301 0.54230117797851563 0.29409056763688568 +2003 6 5.87721062 0.12278938293457031 0.015077232561452547 +2004 6 5.55052233 0.4494776725769043 0.20203017814515078 +2005 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +2007 6 5.74052048 0.25947952270507813 0.067329622703255154 +2008 5 6.02844238 1.0284423828125 1.0576937347650528 +2011 5 6.02844238 1.0284423828125 1.0576937347650528 +2019 6 5.84197569 0.15802431106567383 0.024971682887780844 +2022 6 5.573394 0.42660617828369141 0.1819928313498167 +2024 5 4.792466 0.20753383636474609 0.043070293236269208 +2025 5 5.124267 0.1242671012878418 0.015442312462482732 +2027 5 5.156991 0.15699100494384766 0.024646175633279199 +2028 6 5.789144 0.21085596084594727 0.044460236224267646 +2029 6 5.573394 0.42660617828369141 0.1819928313498167 +2031 5 5.7133007 0.71330070495605469 0.50879789569080458 +2032 6 5.85084 0.14915990829467773 0.022248678242476672 +2034 5 5.98954344 0.98954343795776367 0.97919621560527048 +2035 5 5.27746 0.27746009826660156 0.076984106130112195 +2037 5 5.7133007 0.71330070495605469 0.50879789569080458 +2038 5 5.343353 0.3433527946472168 0.11789114159205383 +2039 5 5.00838852 0.008388519287109375 7.0367255830205977E-05 +2043 6 6.453859 0.45385885238647461 0.20598785788956775 +2048 5 5.30091667 0.30091667175292969 0.090550843338860432 +2050 3 5.17047644 2.1704764366149902 4.7109679619009057 +2051 5 5.27376 0.27375984191894531 0.074944451047485927 +2052 5 5.27376 0.27375984191894531 0.074944451047485927 +2057 7 6.840732 0.15926790237426758 0.025366264726699228 +2058 5 5.52679253 0.52679252624511719 0.27751036570771248 +2060 5 5.52702427 0.52702426910400391 0.27775458022460953 +2061 6 6.108241 0.10824108123779297 0.011716131667526497 +2062 5 6.280643 1.2806429862976074 1.6400464583532539 +2063 5 5.4906826 0.49068260192871094 0.2407694158355298 +2064 6 5.73145771 0.26854228973388672 0.07211496137551876 +2065 5 5.608661 0.60866117477416992 0.37046842567747262 +2066 5 5.57306 0.57306003570556641 0.32839780452286504 +2067 5 5.59425449 0.59425449371337891 0.35313840329854429 +2069 7 6.59054 0.40946006774902344 0.16765754708103486 +2070 6 5.66930771 0.33069229125976563 0.10935739149863366 +2071 6 5.56511641 0.43488359451293945 0.18912374077649474 +2073 5 5.19534159 0.19534158706665039 0.038158335637717755 +2074 6 5.73145771 0.26854228973388672 0.07211496137551876 +2076 5 5.3422966 0.34229660034179688 0.11716696260555182 +2078 6 6.25093269 0.25093269348144531 0.062967216657852987 +2079 4 5.891479 1.8914790153503418 3.5776928655106985 +2080 5 5.3422966 0.34229660034179688 0.11716696260555182 +2082 6 5.71104145 0.28895854949951172 0.083497043328861764 +2084 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2085 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2086 5 5.576943 0.57694292068481445 0.3328631337283241 +2087 6 6.12987661 0.12987661361694336 0.016867934764604797 +2089 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2090 5 5.118404 0.11840391159057617 0.014019486279948978 +2091 5 5.15253925 0.15253925323486328 0.023268223777449748 +2094 5 5.23734331 0.23734331130981445 0.056331847423507497 +2096 5 5.091876 0.091876029968261719 0.0084412048827289254 +2097 5 5.54533148 0.54533147811889648 0.29738642102734048 +2099 5 5.692176 0.69217586517333984 0.47910742832846154 +2102 5 5.36260748 0.36260747909545898 0.13148418389596372 +2103 5 5.19033051 0.19033050537109375 0.036225701274815947 +2104 5 5.692176 0.69217586517333984 0.47910742832846154 +2106 5 5.2858057 0.28580570220947266 0.081684899415449763 +2110 5 5.56804276 0.56804275512695313 0.32267257165221963 +2111 5 5.56804276 0.56804275512695313 0.32267257165221963 +2112 5 5.56804276 0.56804275512695313 0.32267257165221963 +2113 5 5.44544268 0.44544267654418945 0.19841917808685139 +2114 6 5.8123064 0.18769359588623047 0.035228885936703591 +2115 5 5.56804276 0.56804275512695313 0.32267257165221963 +2116 4 6.282538 2.2825379371643066 5.2099794345942883 +2118 6 6.26503849 0.26503849029541016 0.070245401338070224 +2120 5 5.75094 0.75093984603881836 0.56391065236880422 +2121 7 6.83608341 0.16391658782958984 0.026868647765695641 +2122 5 5.36746025 0.36746025085449219 0.13502703595804633 +2123 5 5.75094 0.75093984603881836 0.56391065236880422 +2124 7 6.83608341 0.16391658782958984 0.026868647765695641 +2125 5 5.64372635 0.64372634887695313 0.41438361223845277 +2128 6 4.90525 1.094749927520752 1.1984774038066917 +2129 5 5.9750185 0.97501850128173828 0.95066107784168707 +2131 6 5.445048 0.55495214462280273 0.30797188282144816 +2132 6 5.445048 0.55495214462280273 0.30797188282144816 +2134 6 6.177456 0.17745590209960938 0.031490597189986147 +2136 6 5.946258 0.053741931915283203 0.0028881952459869353 +2137 5 5.778809 0.7788090705871582 0.60654356842883317 +2139 5 5.538669 0.53866910934448242 0.29016440936197796 +2142 5 5.330624 0.33062410354614258 0.10931229784569041 +2143 7 6.23745155 0.76254844665527344 0.5814801334963704 +2146 6 5.73914528 0.26085472106933594 0.068045185504161054 +2147 5 5.35492229 0.35492229461669922 0.12596983521598304 +2148 5 5.538669 0.53866910934448242 0.29016440936197796 +2150 6 6.503435 0.50343513488769531 0.25344693503939197 +2152 6 5.99008369 0.0099163055419921875 9.8333115602144971E-05 +2157 6 6.22612 0.2261199951171875 0.051130252191796899 +2158 6 5.796968 0.20303201675415039 0.041221999827257605 +2161 7 6.53926039 0.4607396125793457 0.21228099059976557 +2162 6 4.85092163 1.149078369140625 1.3203810984268785 +2166 5 5.25865555 0.25865554809570313 0.066902692560688592 +2167 7 6.79769468 0.20230531692504883 0.040927441256144448 +2168 7 6.79769468 0.20230531692504883 0.040927441256144448 +2171 7 6.79769468 0.20230531692504883 0.040927441256144448 +2172 5 4.813034 0.1869659423828125 0.034956263611093163 +2173 5 5.442636 0.44263601303100586 0.19592664003198479 +2174 7 6.79769468 0.20230531692504883 0.040927441256144448 +2176 5 4.813034 0.1869659423828125 0.034956263611093163 +2179 6 5.76867342 0.23132658004760742 0.053511986636522124 +2182 5 5.577924 0.57792377471923828 0.33399588938573288 +2184 6 5.91915846 0.080841541290283203 0.006535354798188564 +2186 5 4.922956 0.077044010162353516 0.0059357795018968318 +2189 6 6.28398132 0.2839813232421875 0.080645391950383782 +2192 6 5.59625 0.40374994277954102 0.16301401629448264 +2197 6 6.48611832 0.48611831665039063 0.23631101778300945 +2198 5 4.96211147 0.037888526916503906 0.001435540471902641 +2201 6 5.58790541 0.4120945930480957 0.16982195361947561 +2202 5 4.96211147 0.037888526916503906 0.001435540471902641 +2203 5 5.48719835 0.4871983528137207 0.23736223498440268 +2204 5 5.430422 0.43042182922363281 0.18526295107221813 +2205 5 5.39430428 0.39430427551269531 0.15547586168759153 +2206 6 5.69371843 0.30628156661987305 0.093808398051123731 +2209 6 6.150735 0.15073490142822266 0.022721010508576001 +2210 7 5.605151 1.3948488235473633 1.9456032405514634 +2211 6 5.680932 0.31906795501708984 0.10180435991878767 +2215 6 5.54389143 0.45610857009887695 0.20803502771764215 +2216 5 5.73479843 0.73479843139648438 0.53992873478273395 +2219 7 6.477956 0.52204418182373047 0.27253012777600816 +2222 7 6.15957642 0.840423583984375 0.70631180051714182 +2224 7 6.15957642 0.840423583984375 0.70631180051714182 +2226 5 5.15487766 0.15487766265869141 0.023987090390619414 +2227 5 5.184053 0.18405294418334961 0.033875486262559207 +2232 6 5.49912739 0.50087261199951172 0.25087337345121341 +2233 5 5.451901 0.45190095901489258 0.20421447675857962 +2235 6 5.78070831 0.21929168701171875 0.048088843992445618 +2238 6 5.69238758 0.30761241912841797 0.094625400402037485 +2239 6 5.78070831 0.21929168701171875 0.048088843992445618 +2240 5 5.031944 0.031943798065185547 0.0010204062348293519 +2241 5 5.031944 0.031943798065185547 0.0010204062348293519 +2245 7 5.60611153 1.3938884735107422 1.942925076586107 +2247 6 5.69238758 0.30761241912841797 0.094625400402037485 +2252 5 5.115737 0.11573696136474609 0.01339504422594473 +2253 5 5.045958 0.045958042144775391 0.002112141637780951 +2254 6 5.71639729 0.28360271453857422 0.080430499693648017 +2255 6 5.658473 0.34152698516845703 0.11664068159825547 +2258 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2259 6 5.492666 0.50733423233032227 0.25738802329419741 +2260 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2266 5 5.407028 0.4070281982421875 0.16567195416428149 +2267 6 6.3755393 0.37553930282592773 0.14102976796698385 +2270 7 6.147446 0.8525538444519043 0.72684805768972183 +2271 6 5.66193 0.33806991577148438 0.11429126794973854 +2272 6 6.210824 0.21082401275634766 0.044446764354688639 +2273 5 5.395995 0.39599514007568359 0.15681215096356027 +2274 7 6.147446 0.8525538444519043 0.72684805768972183 +2275 4 5.2996974 1.2996973991394043 1.689213329329732 +2276 6 4.88525772 1.1147422790527344 1.2426503487076843 +2278 6 4.88525772 1.1147422790527344 1.2426503487076843 +2280 6 5.89824867 0.10175132751464844 0.010353332650993252 +2282 5 5.15755272 0.15755271911621094 0.024822859300911659 +2283 5 5.15755272 0.15755271911621094 0.024822859300911659 +2284 5 5.15755272 0.15755271911621094 0.024822859300911659 +2285 5 5.15755272 0.15755271911621094 0.024822859300911659 +2287 5 5.05347538 0.053475379943847656 0.0028596162601388642 +2289 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2290 7 5.835172 1.164827823638916 1.3568238587233736 +2291 6 5.959846 0.040153980255126953 0.0016123421303291252 +2292 6 5.248393 0.75160694122314453 0.56491299409481144 +2293 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2295 6 5.12605143 0.87394857406616211 0.76378611011227804 +2296 7 6.03202057 0.96797943115234375 0.93698417913401499 +2297 6 5.631292 0.36870813369750977 0.13594568785470074 +2298 8 6.72130346 1.2786965370178223 1.6350648337813709 +2299 7 7.42436934 0.42436933517456055 0.18008933263649851 +2300 7 6.75962543 0.24037456512451172 0.057779931558798125 +2304 6 4.80764866 1.1923513412475586 1.4217017209748519 +2306 5 5.49572039 0.49572038650512695 0.24573870159679245 +2310 5 5.3208 0.32079982757568359 0.10291252937258832 +2311 7 6.820328 0.1796717643737793 0.032281942913186867 +2314 6 6.682396 0.68239593505859375 0.4656642121844925 +2315 6 6.07943535 0.079435348510742188 0.0063099745930230711 +2317 5 5.659352 0.65935182571411133 0.43474483007253184 +2318 4 5.559793 1.5597929954528809 2.4329541886638708 +2319 7 6.76099253 0.23900747299194336 0.057124572145994534 +2321 5 5.34529972 0.34529972076416016 0.11923189715980698 +2324 5 5.15271664 0.15271663665771484 0.023322371112044493 +2327 6 5.214839 0.78516101837158203 0.61647782477029978 +2328 5 5.454279 0.45427894592285156 0.20636936070877709 +2329 5 5.28656 0.28656005859375 0.082116667181253433 +2331 5 5.65846634 0.65846633911132813 0.43357791974267457 +2332 6 5.549059 0.45094108581542969 0.20334786287639872 +2333 8 7.05028725 0.94971275329589844 0.90195431377287605 +2334 5 5.55771875 0.55771875381469727 0.3110502083566189 +2335 5 5.80538654 0.80538654327392578 0.64864748408672313 +2336 5 4.931768 0.068232059478759766 0.0046556139407130104 +2337 4 5.43987751 1.4398775100708008 2.073247244007689 +2338 5 5.62999249 0.62999248504638672 0.39689053121492179 +2339 6 5.726933 0.27306699752807617 0.074565585138998358 +2340 6 5.72369 0.27630996704101563 0.076347197886207141 +2342 8 6.948141 1.0518589019775391 1.1064071496693941 +2344 6 5.726933 0.27306699752807617 0.074565585138998358 +2345 6 5.7398963 0.26010370254516602 0.067653936077704202 +2347 6 6.165467 0.1654667854309082 0.027379257080838215 +2349 5 5.23369 0.23368978500366211 0.05461091561505782 +2350 5 5.568386 0.56838607788085938 0.32306273352878634 +2351 6 5.85764074 0.14235925674438477 0.020266157980813659 +2355 7 6.288256 0.71174383163452148 0.50657928186979007 +2358 5 5.388339 0.38833904266357422 0.15080721205686132 +2359 5 5.16930962 0.16930961608886719 0.028665746100159595 +2365 5 5.35451746 0.35451745986938477 0.12568262935224084 +2366 5 5.35875034 0.35875034332275391 0.1287018088341938 +2367 6 5.4548583 0.54514169692993164 0.29717946973164544 +2370 7 6.466535 0.53346490859985352 0.28458480870745007 +2374 6 6.31197357 0.31197357177734375 0.097327509487513453 +2375 6 6.86937952 0.86937952041625977 0.75582075051920583 +2376 6 6.31197357 0.31197357177734375 0.097327509487513453 +2379 4 5.02809525 1.0280952453613281 1.0569798335345695 +2380 4 4.7932725 0.79327249526977539 0.62928125175153582 +2381 6 6.17565966 0.1756596565246582 0.030856314930360895 +2383 6 6.298069 0.29806900024414063 0.088845128906541504 +2386 4 5.639759 1.6397590637207031 2.6888097870541969 +2387 4 5.656129 1.6561288833618164 2.7427628783052569 +2389 8 6.87059641 1.1294035911560059 1.2755524717160824 +2391 6 5.81390524 0.18609476089477539 0.034631260032483624 +2392 7 5.867315 1.1326851844787598 1.282975727137682 +2393 6 5.867315 0.13268518447875977 0.017605358180162511 +2396 5 4.986103 0.013896942138671875 0.00019312500080559403 +2401 4 5.2634654 1.263465404510498 1.5963448283948765 +2403 6 5.8889246 0.11107540130615234 0.01233774477532279 +2406 6 6.67324924 0.67324924468994141 0.4532645454755766 +2415 5 5.575652 0.57565212249755859 0.3313753661359442 +2419 5 5.29736567 0.29736566543579102 0.088426338980070796 +2420 7 6.390013 0.60998678207397461 0.37208387430496259 +2422 5 4.129732 0.87026786804199219 0.75736616214635433 +2423 6 5.695272 0.30472803115844727 0.092859172973703608 +2424 5 4.129732 0.87026786804199219 0.75736616214635433 +2426 6 6.139751 0.13975095748901367 0.019530330119096107 +2427 6 5.70700836 0.29299163818359375 0.085844100045505911 +2428 6 6.139751 0.13975095748901367 0.019530330119096107 +2429 6 5.70700836 0.29299163818359375 0.085844100045505911 +2430 5 5.071437 0.071436882019042969 0.0051032281126026646 +2431 5 5.05151 0.051509857177734375 0.0026532653864705935 +2433 6 5.243469 0.75653076171875 0.57233879342675209 +2435 4 5.316507 1.3165068626403809 1.7331903193792186 +2436 5 5.155265 0.15526485443115234 0.024107175021526928 +2437 6 5.73321342 0.26678657531738281 0.071175076769577572 +2439 6 6.48072529 0.48072528839111328 0.23109680289871903 +2440 5 5.442191 0.44219112396240234 0.19553299011113268 +2441 6 6.501268 0.50126791000366211 0.2512695175994395 +2443 5 5.342942 0.34294223785400391 0.11760937850431219 +2444 5 5.51007938 0.51007938385009766 0.26018097782889527 +2450 5 4.93648863 0.063511371612548828 0.0040336943241072731 +2452 7 6.282725 0.71727514266967773 0.51448363029180655 +2453 6 6.289039 0.28903913497924805 0.083543621549551972 +2455 6 5.800432 0.19956779479980469 0.039827304721256951 +2456 6 5.58649731 0.41350269317626953 0.1709844772640281 +2459 5 5.312827 0.31282711029052734 0.097860800932721759 +2461 5 4.82629 0.17370986938476563 0.030175118721672334 +2464 5 5.128059 0.12805891036987305 0.016399084525119179 +2465 5 5.15147066 0.15147066116333008 0.022943361193256351 +2466 5 5.25195169 0.25195169448852539 0.063479656355639236 +2467 6 5.73090935 0.26909065246582031 0.072409779244480887 +2470 5 5.555554 0.55555391311645508 0.30864015037900572 +2472 6 5.55089235 0.44910764694213867 0.20169767854190468 +2475 5 4.549733 0.45026683807373047 0.20274022546891501 +2477 7 6.442016 0.5579838752746582 0.31134600506652532 +2478 6 5.4986105 0.50138950347900391 0.25139143419892207 +2483 6 5.4986105 0.50138950347900391 0.25139143419892207 +2486 5 5.90252447 0.90252447128295898 0.81455042126458466 +2488 6 6.14779329 0.14779329299926758 0.021842857455567355 +2495 5 5.80160046 0.80160045623779297 0.64256329144063784 +2496 5 5.507049 0.5070490837097168 0.25709877329086339 +2499 6 6.47504044 0.47504043579101563 0.22566341563651804 +2502 4 5.087182 1.0871820449829102 1.1819647989332225 +2503 4 5.087182 1.0871820449829102 1.1819647989332225 +2504 6 5.14028358 0.85971641540527344 0.73911231491729268 +2505 6 4.786265 1.2137351036071777 1.4731529017283265 +2511 6 5.52970362 0.47029638290405273 0.22117868777263539 +2512 6 5.368275 0.63172483444213867 0.39907626645094751 +2513 5 5.0458374 0.04583740234375 0.002101067453622818 +2514 7 7.08240938 0.082409381866455078 0.0067913062196112151 +2517 6 5.202719 0.79728078842163086 0.63565665558621731 +2518 7 6.73800659 0.261993408203125 0.068640545941889286 +2519 5 5.57040739 0.57040739059448242 0.32536459124480643 +2522 8 5.97161341 2.0283865928649902 4.1143521701144437 +2523 5 6.07080841 1.0708084106445313 1.1466306523070671 +2525 8 5.97161341 2.0283865928649902 4.1143521701144437 +2526 7 6.761754 0.23824596405029297 0.05676113938625349 +2531 4 4.59851 0.59850978851318359 0.35821396694609575 +2532 4 4.59851 0.59850978851318359 0.35821396694609575 +2534 7 5.81611061 1.1838893890380859 1.4015940854769724 +2536 6 5.57678366 0.42321634292602539 0.17911207291967912 +2537 6 5.19452047 0.80547952651977539 0.64879726764252155 +2538 6 5.19452047 0.80547952651977539 0.64879726764252155 +2541 6 5.609927 0.39007282257080078 0.15215680690835143 +2545 6 5.838851 0.16114902496337891 0.025969008246647718 +2546 5 5.32331467 0.32331466674804688 0.10453237373440061 +2547 5 4.96645546 0.033544540405273438 0.0011252361910010222 +2548 6 5.4387145 0.56128549575805664 0.31504140774836742 +2551 6 5.4387145 0.56128549575805664 0.31504140774836742 +2552 5 5.353321 0.35332107543945313 0.12483578234969173 +2554 7 6.789461 0.21053886413574219 0.044326613311568508 +2555 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2556 5 5.757903 0.75790309906005859 0.57441710756484099 +2557 7 6.789461 0.21053886413574219 0.044326613311568508 +2558 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2560 6 5.797521 0.20247888565063477 0.040997699134322829 +2562 6 5.797521 0.20247888565063477 0.040997699134322829 +2563 5 5.38012266 0.38012266159057617 0.14449323785470369 +2564 6 5.353371 0.64662885665893555 0.41812887826404221 +2566 7 6.133521 0.86647891998291016 0.75078571877475042 +2567 5 6.320251 1.3202509880065918 1.7430626713323818 +2568 6 5.507352 0.49264812469482422 0.24270217476532707 +2569 6 6.26709557 0.26709556579589844 0.071340041267831111 +2571 6 6.63272762 0.63272762298583984 0.40034424488931108 +2574 5 5.683056 0.68305587768554688 0.46656533204077277 +2575 6 5.839933 0.16006708145141602 0.025621470564374249 +2579 6 5.78327656 0.21672344207763672 0.046969050345978758 +2581 7 6.762539 0.23746109008789063 0.056387769305729307 +2583 7 6.762539 0.23746109008789063 0.056387769305729307 +2584 7 6.762539 0.23746109008789063 0.056387769305729307 +2586 7 6.762539 0.23746109008789063 0.056387769305729307 +2592 5 5.72321844 0.72321844100952148 0.52304491341624271 +2593 5 5.95471859 0.95471858978271484 0.91148758567669574 +2595 5 4.99312162 0.0068783760070800781 4.7312056494774879E-05 +2596 5 5.190575 0.19057512283325195 0.03631887744290907 +2599 6 5.51631451 0.48368549346923828 0.23395165659258055 +2600 7 7.0145216 0.014521598815917969 0.00021087683217047015 +2602 6 6.44506168 0.44506168365478516 0.19807990225763206 +2607 6 5.741097 0.25890302658081055 0.067030777172703893 +2609 6 5.34973574 0.65026426315307617 0.4228436119340131 +2610 5 5.306729 0.30672883987426758 0.09408258121061408 +2611 5 5.490591 0.49059104919433594 0.24067957754959934 +2612 7 6.794416 0.20558404922485352 0.042264801295686993 +2617 7 6.7212 0.27880001068115234 0.077729445955810661 +2618 7 6.34141541 0.6585845947265625 0.43373366841115057 +2619 6 5.4213624 0.57863759994506836 0.33482147207018897 +2621 5 5.406546 0.40654611587524414 0.16527974433324744 +2623 7 6.7212 0.27880001068115234 0.077729445955810661 +2626 7 6.210718 0.78928184509277344 0.6229658309930528 +2628 6 6.039976 0.039976119995117188 0.0015980901698640082 +2633 5 5.61942339 0.61942338943481445 0.38368533537891381 +2635 6 6.508563 0.50856304168701172 0.25863636736994522 +2638 6 6.643812 0.64381217956542969 0.41449412255678908 +2639 6 5.83244467 0.16755533218383789 0.028074789343236262 +2641 5 5.974963 0.97496318817138672 0.95055321828931483 +2644 6 5.97672844 0.023271560668945313 0.0005415655359684024 +2648 6 5.681986 0.31801414489746094 0.10113299635486328 +2650 5 5.43078232 0.43078231811523438 0.18557340560073499 +2652 7 6.80547237 0.19452762603759766 0.037840997291823442 +2653 5 5.53509569 0.5350956916809082 0.28632739925546957 +2654 5 4.69185925 0.30814075469970703 0.094950724706905021 +2658 7 6.433773 0.56622695922851563 0.3206129693571711 +2660 6 5.36555243 0.63444757461547852 0.40252372493546318 +2661 6 5.99006748 0.0099325180053710938 9.8654913927020971E-05 +2664 7 6.39382029 0.60617971420288086 0.36745384591108632 +2665 5 5.5541 0.55410003662109375 0.30702685058349743 +2666 7 7.24123526 0.24123525619506836 0.058194448831500267 +2668 6 6.05001354 0.050013542175292969 0.0025013544009198085 +2669 5 5.359341 0.35934114456176758 0.12912605817496114 +2670 7 7.24123526 0.24123525619506836 0.058194448831500267 +2674 7 5.814148 1.18585205078125 1.4062450863420963 +2679 6 5.801769 0.19823122024536133 0.039295616679964951 +2680 6 6.4041853 0.40418529510498047 0.16336575277910015 +2681 6 6.436047 0.43604707717895508 0.19013705351630961 +2683 5 5.13188839 0.13188838958740234 0.017394547307958419 +2694 6 6.096805 0.096805095672607422 0.0093712265481826762 +2697 5 5.839328 0.83932781219482422 0.70447117632375011 +2698 6 5.567016 0.4329838752746582 0.18747503624786077 +2699 6 5.349456 0.65054416656494141 0.42320771265167423 +2700 7 6.18181944 0.81818056106567383 0.66941943050574082 +2703 5 5.502043 0.50204277038574219 0.25204694329659105 +2706 6 5.34128857 0.65871143341064453 0.43390075250590598 +2707 5 5.502043 0.50204277038574219 0.25204694329659105 +2709 5 6.00174236 1.0017423629760742 1.0034877617808888 +2710 5 6.00174236 1.0017423629760742 1.0034877617808888 +2711 5 5.634198 0.63419818878173828 0.40220734265403735 +2712 5 5.598766 0.59876585006713867 0.35852054320662319 +2716 5 6.00174236 1.0017423629760742 1.0034877617808888 +2717 6 6.102189 0.10218906402587891 0.010442604806485178 +2718 6 5.481989 0.51801109313964844 0.26833549261573353 +2721 5 5.2267313 0.22673130035400391 0.051407082560217532 +2722 7 6.82906866 0.17093133926391602 0.029217522742555957 +2723 6 6.35023165 0.35023164749145508 0.12266220690457885 +2724 6 6.0606904 0.060690402984619141 0.0036833250144354679 +2727 6 6.046403 0.046402931213378906 0.0021532320251935744 +2728 6 5.72376347 0.27623653411865234 0.07630662278188538 +2729 7 6.391809 0.60819101333618164 0.36989630870289147 +2730 5 4.92892742 0.071072578430175781 0.0050513114047134877 +2731 5 4.87044954 0.12955045700073242 0.01678332090909862 +2732 5 5.122189 0.12218904495239258 0.014930162706377814 +2733 7 6.391809 0.60819101333618164 0.36989630870289147 +2739 7 6.561662 0.43833780288696289 0.19214002943976993 +2740 6 5.54297924 0.45702075958251953 0.20886797468938312 +2743 6 5.184127 0.81587314605712891 0.6656489904571572 +2744 6 5.184127 0.81587314605712891 0.6656489904571572 +2745 7 6.623061 0.37693881988525391 0.14208287393648789 +2749 6 5.746345 0.25365495681762695 0.064340837118152194 +2752 6 6.251609 0.25160884857177734 0.063307012679615582 +2753 8 6.050957 1.949042797088623 3.7987678248830434 +2754 5 4.81832361 0.18167638778686523 0.033006309879283435 +2755 5 4.869156 0.1308441162109375 0.017120182747021317 +2756 6 4.98410654 1.0158934593200684 1.0320395206892954 +2757 5 6.02096272 1.0209627151489258 1.0423648657242666 +2758 6 5.85482025 0.14517974853515625 0.021077159384731203 +2759 6 5.76916265 0.23083734512329102 0.053285879903569366 +2760 6 5.790269 0.20973110198974609 0.043987135141833278 +2761 5 5.21827745 0.2182774543762207 0.047645047088963111 +2762 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2764 6 6.01250744 0.012507438659667969 0.00015643602182535687 +2768 6 5.40108156 0.59891843795776367 0.35870329532576761 +2769 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2770 7 5.56935453 1.4306454658508301 2.0467464489595386 +2771 6 5.949611 0.050388813018798828 0.0025390324774434703 +2773 7 6.69609451 0.30390548706054688 0.092358545065508224 +2776 8 6.39705944 1.602940559387207 2.5694184369285722 +2778 7 6.69609451 0.30390548706054688 0.092358545065508224 +2779 5 6.23984575 1.2398457527160645 1.5372174905280644 +2780 5 4.92480946 0.075190544128417969 0.0056536179263275699 +2781 6 4.922699 1.077301025390625 1.1605774993076921 +2782 6 5.967141 0.032858848571777344 0.001079703929462994 +2784 6 5.967141 0.032858848571777344 0.001079703929462994 +2787 5 5.24805164 0.24805164337158203 0.061529617779342516 +2789 5 5.13498068 0.13498067855834961 0.018219783584072502 +2792 5 5.36231041 0.36231040954589844 0.13126883286531665 +2793 7 7.17724466 0.17724466323852539 0.031415670646538274 +2795 8 6.13639641 1.8636035919189453 3.4730183478131949 +2797 5 5.25386858 0.25386857986450195 0.064449255842419007 +2800 5 5.43601561 0.43601560592651367 0.19010960861146486 +2804 8 6.13639641 1.8636035919189453 3.4730183478131949 +2808 6 5.34821272 0.65178728103637695 0.42482665972079303 +2809 7 6.775078 0.22492218017578125 0.050589987135026604 +2810 7 6.34518576 0.65481424331665039 0.42878169325035742 +2811 5 5.64365244 0.64365243911743164 0.41428846238181904 +2813 7 6.775078 0.22492218017578125 0.050589987135026604 +2814 7 6.75550842 0.2444915771484375 0.059776131296530366 +2818 4 6.14127731 2.1412773132324219 4.5850685321638593 +2823 6 6.314358 0.31435823440551758 0.098821099538554336 +2830 5 5.750116 0.75011587142944336 0.5626738205703532 +2831 5 5.03467941 0.034679412841796875 0.001202661675051786 +2833 7 6.039263 0.96073722839355469 0.92301602202132926 +2836 6 5.626615 0.37338495254516602 0.13941632278715588 +2837 6 5.79493475 0.20506525039672852 0.042051756920272965 +2839 7 5.811762 1.1882381439208984 1.4119098866685817 +2840 6 6.206232 0.20623207092285156 0.042531667077128077 +2842 6 5.49120951 0.50879049301147461 0.25886776577885939 +2844 5 5.98960352 0.98960351943969727 0.97931512568743528 +2846 7 7.02146339 0.021463394165039063 0.00046067728908383287 +2847 5 6.279372 1.2793722152709961 1.636793265207416 +2848 5 4.989665 0.010334968566894531 0.000106811575278698 +2850 5 5.96404171 0.96404170989990234 0.92937641842672747 +2852 5 6.11551476 1.1155147552490234 1.2443731691782887 +2854 6 6.2158227 0.21582269668579102 0.046579436404726948 +2856 7 6.999945 5.4836273193359375E-05 3.007016857736744E-09 +2860 6 5.620766 0.37923383712768555 0.14381830322258793 +2861 6 6.2158227 0.21582269668579102 0.046579436404726948 +2863 6 6.51361275 0.51361274719238281 0.26379805407850654 +2865 6 6.3260293 0.32602930068969727 0.10629510490821303 +2868 5 5.85081 0.85081005096435547 0.72387774282196915 +2869 6 6.71658325 0.716583251953125 0.51349155697971582 +2870 7 6.785292 0.21470785140991211 0.046099461457060897 +2871 6 6.188884 0.18888378143310547 0.035677082888469158 +2872 7 7.21496725 0.21496725082397461 0.046210918926817612 +2873 8 6.90970373 1.0902962684631348 1.188745953024636 +2879 6 6.59125471 0.59125471115112305 0.34958213345839795 +2881 7 6.59642029 0.4035797119140625 0.16287658386863768 +2890 8 6.60879755 1.391202449798584 1.9354442563255816 +2891 6 5.983416 0.016583919525146484 0.0002750263868165348 +2893 7 8.001547 1.0015468597412109 1.0030961122574809 +2895 5 5.61847734 0.61847734451293945 0.3825142256757772 +2896 5 5.420413 0.42041301727294922 0.1767471050925451 +2898 5 5.98123741 0.98123741149902344 0.96282685772530385 +2902 5 5.24436 0.24435997009277344 0.059711794983741129 +2903 6 6.211409 0.21140909194946289 0.044693804158896455 +2904 7 5.93855953 1.0614404678344727 1.1266558667566642 +2905 5 5.624597 0.62459707260131836 0.39012150310213656 +2906 5 5.20248127 0.20248126983642578 0.040998664634571469 +2910 5 5.051263 0.051262855529785156 0.0026278803570676246 +2911 5 5.24436 0.24435997009277344 0.059711794983741129 +2913 5 5.6902194 0.69021940231323242 0.47640282332963579 +2919 5 6.3524003 1.3524003028869629 1.828986579248749 +2920 4 5.501398 1.5013980865478516 2.25419621428955 +2923 6 6.342757 0.34275722503662109 0.11748251531480491 +2924 6 6.131525 0.13152503967285156 0.017298836060945177 +2927 7 6.7712183 0.22878170013427734 0.052341066316330398 +2929 6 6.131525 0.13152503967285156 0.017298836060945177 +2933 6 6.342757 0.34275722503662109 0.11748251531480491 +2934 5 5.17446136 0.17446136474609375 0.030436767789069563 +2937 5 5.629732 0.62973213195800781 0.39656255802037776 +2940 6 5.882038 0.11796188354492188 0.01391500596946571 +2941 5 5.606404 0.60640382766723633 0.36772560220947526 +2943 8 7.503963 0.49603700637817383 0.24605271169662046 +2944 6 5.882038 0.11796188354492188 0.01391500596946571 +2947 6 6.19522524 0.19522523880004883 0.03811289386453609 +2948 6 5.376883 0.62311697006225586 0.38827475837956626 +2949 6 5.449442 0.55055809020996094 0.30311421069563949 +2950 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2953 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2955 5 6.26787 1.2678699493408203 1.6074942084414943 +2956 6 6.107019 0.10701894760131836 0.011453055145693725 +2959 7 6.84598875 0.15401124954223633 0.02371946498556099 +2961 6 6.47835541 0.47835540771484375 0.2288238960900344 +2962 5 5.656493 0.65649318695068359 0.4309833045126652 +2964 5 6.28570461 1.2857046127319336 1.6530363512001713 +2965 8 7.26401472 0.73598527908325195 0.54167433102725226 +2967 6 6.001534 0.0015339851379394531 2.353110403419123E-06 +2968 5 6.08952665 1.0895266532897949 1.187068328228861 +2970 5 6.08952665 1.0895266532897949 1.187068328228861 +2971 5 5.307669 0.30766916275024414 0.094660313707436217 +2975 6 5.86485529 0.13514471054077148 0.018264092787148911 +2981 7 6.371684 0.62831592559814453 0.39478090236025309 +2984 6 4.61855555 1.3814444541931152 1.9083887800209141 +2985 7 6.5449214 0.4550786018371582 0.20709653385006277 +2987 7 6.43420458 0.5657954216003418 0.32012445910390852 +2989 6 6.208233 0.20823287963867188 0.043360932162613608 +2991 7 6.8057766 0.19422340393066406 0.037722730634413892 +2994 7 6.43420458 0.5657954216003418 0.32012445910390852 +2996 8 5.816692 2.1833081245422363 4.7668343666921373 +2997 6 6.396095 0.39609479904174805 0.15689108982792277 +2999 7 6.43420458 0.5657954216003418 0.32012445910390852 +3000 7 6.5449214 0.4550786018371582 0.20709653385006277 +3001 7 6.53180838 0.46819162368774414 0.21920339649136622 +3002 7 6.8057766 0.19422340393066406 0.037722730634413892 +3004 6 6.315313 0.31531286239624023 0.099422201192510329 +3005 6 6.09739447 0.097394466400146484 0.0094856820853692625 +3006 6 6.208233 0.20823287963867188 0.043360932162613608 +3013 6 6.648943 0.64894294738769531 0.42112694896422909 +3014 6 5.18606234 0.81393766403198242 0.66249452092984029 +3016 6 6.648943 0.64894294738769531 0.42112694896422909 +3020 6 3.73379683 2.2662031650543213 5.1356767853022234 +3022 5 5.03272629 0.032726287841796875 0.001071009915904142 +3023 6 5.18606234 0.81393766403198242 0.66249452092984029 +3026 6 5.998491 0.0015091896057128906 2.2776532659918303E-06 +3027 5 5.75025034 0.75025033950805664 0.56287557193195425 +3028 6 5.90629435 0.093705654144287109 0.0087807496186087519 +3029 8 7.02977467 0.97022533416748047 0.94133719906039914 +3031 6 6.082838 0.082838058471679688 0.0068621439313574228 +3033 6 5.665061 0.33493900299072266 0.11218413572441932 +3034 6 5.48654842 0.51345157623291016 0.26363252113605995 +3037 6 5.750472 0.24952793121337891 0.062264188455628755 +3038 6 6.538831 0.53883123397827148 0.29033909871054675 +3039 6 5.39716959 0.60283041000366211 0.36340450322518336 +3040 5 6.07817554 1.0781755447387695 1.1624625052727424 +3043 6 5.391435 0.60856485366821289 0.37035118112021337 +3044 6 5.65663147 0.3433685302734375 0.11790194758214056 +3045 6 6.14122248 0.14122247695922852 0.019943787998499829 +3046 6 6.496725 0.49672508239746094 0.24673580748276436 +3049 5 5.29757261 0.29757261276245117 0.088549459866271718 +3050 4 4.71068048 0.71068048477172852 0.50506675143537905 +3053 5 5.75403357 0.75403356552124023 0.56856661793267449 +3055 6 6.435923 0.43592309951782227 0.19002894869322517 +3056 5 5.76071835 0.76071834564208984 0.57869240139643807 +3058 5 5.476526 0.47652578353881836 0.22707682237728477 +3059 6 5.52979374 0.47020626068115234 0.22109392758375179 +3062 8 6.831621 1.1683788299560547 1.3651090902894794 +3064 5 5.3336153 0.33361530303955078 0.1112991704221713 +3065 6 6.481476 0.481475830078125 0.2318189749494195 +3066 5 5.3336153 0.33361530303955078 0.1112991704221713 +3069 8 4.845862 3.1541380882263184 9.9485870795999745 +3070 8 6.831621 1.1683788299560547 1.3651090902894794 +3072 6 6.86424732 0.86424732208251953 0.74692343372680625 +3073 5 6.54508257 1.5450825691223145 2.3872801454056116 +3074 5 6.22429562 1.2242956161499023 1.498899755723869 +3075 7 6.37249041 0.62750959396362305 0.39376829051639106 +3076 5 5.2231307 0.22313070297241211 0.049787310608962798 +3077 5 5.476526 0.47652578353881836 0.22707682237728477 +3078 5 6.578264 1.5782642364501953 2.490918000057718 +3079 5 5.94544172 0.94544172286987305 0.89386005134315383 +3080 6 5.52979374 0.47020626068115234 0.22109392758375179 +3084 6 6.806603 0.80660295486450195 0.65060832679614578 +3086 7 6.88708639 0.11291360855102539 0.012749482996014194 +3088 6 6.47210026 0.47210025787353516 0.22287865348425839 +3090 6 6.806603 0.80660295486450195 0.65060832679614578 +3091 6 5.508926 0.4910740852355957 0.24115375718997711 +3094 6 3.811624 2.1883759498596191 4.7889892979239903 +3095 6 3.811624 2.1883759498596191 4.7889892979239903 +3097 5 6.40035963 1.4003596305847168 1.9610070949713645 +3099 7 6.603572 0.39642810821533203 0.157155244983187 +3101 6 5.885584 0.11441612243652344 0.013091049073409522 +3102 6 5.330082 0.66991806030273438 0.44879020751977805 +3104 5 5.992548 0.99254798889160156 0.98515151025276282 +3105 6 5.881699 0.1183009147644043 0.013995106434094851 +3106 6 6.09651566 0.096515655517578125 0.0093152717599878088 +3108 5 5.790182 0.79018211364746094 0.62438777272836887 +3111 7 6.55089045 0.44910955429077148 0.20169939175525542 +3112 5 5.66179132 0.66179132461547852 0.43796775733630966 +3113 6 5.53946257 0.46053743362426758 0.21209472776922667 +3114 6 6.314805 0.31480503082275391 0.099102207431315037 +3115 6 6.314805 0.31480503082275391 0.099102207431315037 +3116 7 6.43430138 0.56569862365722656 0.32001493280768045 +3117 7 6.55089045 0.44910955429077148 0.20169939175525542 +3119 5 4.536246 0.46375417709350586 0.21506793677167479 +3120 6 5.40785 0.59215021133422852 0.35064187278317149 +3122 6 7.08013153 1.0801315307617188 1.1666841237456538 +3124 6 5.53946257 0.46053743362426758 0.21209472776922667 +3125 5 5.7089 0.70889997482299805 0.50253917430404726 +3126 7 6.19258261 0.80741739273071289 0.65192284608406226 +3128 6 6.53799 0.53799009323120117 0.28943334041491653 +3131 5 5.507035 0.5070347785949707 0.25708426670485096 +3133 6 6.68867445 0.6886744499206543 0.47427249797351578 +3135 6 5.426291 0.57370901107788086 0.32914202939196002 +3138 6 6.12315273 0.12315273284912109 0.01516659560820699 +3140 6 5.426291 0.57370901107788086 0.32914202939196002 +3141 7 5.541848 1.4581518173217773 2.1262067223588019 +3143 5 5.435146 0.43514585494995117 0.18935191508012394 +3144 6 5.710051 0.28994894027709961 0.084070387967813076 +3145 6 5.710051 0.28994894027709961 0.084070387967813076 +3146 6 5.710051 0.28994894027709961 0.084070387967813076 +3147 6 5.56390429 0.4360957145690918 0.19017947226552678 +3151 6 5.710051 0.28994894027709961 0.084070387967813076 +3154 6 6.867949 0.86794900894165039 0.75333548212279311 +3157 7 6.779997 0.22000312805175781 0.048401376352558145 +3158 7 6.926802 0.073197841644287109 0.0053579240213821322 +3159 6 6.36980534 0.36980533599853516 0.13675598653298948 +3162 7 6.779997 0.22000312805175781 0.048401376352558145 +3164 6 6.23988962 0.23988962173461914 0.057547030615978656 +3166 6 6.897838 0.89783811569213867 0.80611328198961019 +3167 7 6.39587927 0.60412073135375977 0.36496185805140158 +3168 6 6.723877 0.723876953125 0.52399784326553345 +3172 8 6.64314556 1.3568544387817383 1.841053968041706 +3173 8 6.6659255 1.3340744972229004 1.7797547641405345 +3174 8 6.88348532 1.1165146827697754 1.2466050368404922 +3175 6 5.76850462 0.23149538040161133 0.053590111147286734 +3176 6 6.294718 0.29471778869628906 0.086858574974030489 +3177 5 5.992035 0.992034912109375 0.98413326684385538 +3178 6 6.112884 0.1128840446472168 0.012742807535914835 +3179 4 5.79313755 1.7931375503540039 3.2153422744895579 +3181 6 6.601753 0.60175323486328125 0.36210695566842332 +3182 5 6.2163825 1.2163825035095215 1.479586394844091 +3183 6 6.049875 0.049874782562255859 0.0024874939356323011 +3189 5 6.140699 1.1406989097595215 1.3011940027265609 +3190 7 7.06220675 0.062206745147705078 0.0038696791418715293 +3192 6 6.601753 0.60175323486328125 0.36210695566842332 +3193 5 6.2163825 1.2163825035095215 1.479586394844091 +3195 6 6.242802 0.24280214309692383 0.058952880692459075 +3197 6 6.737725 0.73772478103637695 0.54423785255517032 +3199 7 6.66018629 0.3398137092590332 0.11547335700038275 +3200 7 6.8083353 0.19166469573974609 0.036735355593009444 +3201 6 6.737725 0.73772478103637695 0.54423785255517032 +3204 5 5.61776447 0.61776447296142578 0.38163294405330817 +3206 7 6.68098974 0.31901025772094727 0.10176754453118519 +3208 5 6.008159 1.0081591606140137 1.0163848931299526 +3209 5 5.57621145 0.57621145248413086 0.3320196379738718 +3211 6 6.456321 0.45632076263427734 0.20822863841112849 +3212 5 6.188125 1.1881251335144043 1.411641332888621 +3215 6 6.065724 0.065723896026611328 0.0043196305089168163 +3216 5 6.28508568 1.2850856781005859 1.6514452000592428 +3217 5 5.11301851 0.11301851272583008 0.012773184218758615 +3218 4 5.18631649 1.1863164901733398 1.4073468148571919 +3220 5 6.04402351 1.0440235137939453 1.0899850973546563 +3224 6 6.42197561 0.42197561264038086 0.17806341766322475 +3225 7 6.61993027 0.38006973266601563 0.14445300168881658 +3228 6 5.33879328 0.66120672225952148 0.43719432956117998 +3229 7 6.44850826 0.55149173736572266 0.30414313638266322 +3230 6 5.59285069 0.40714931488037109 0.16577056460755557 +3231 6 6.36423445 0.36423444747924805 0.1326667327305131 +3233 6 6.892843 0.89284276962280273 0.7971682112677172 +3234 6 5.69793034 0.30206966400146484 0.091246081909957866 +3235 6 6.42197561 0.42197561264038086 0.17806341766322475 +3237 7 6.369823 0.63017702102661133 0.39712307782997414 +3238 5 5.682729 0.68272876739501953 0.46611856982872268 +3243 7 6.61330032 0.38669967651367188 0.14953663981577847 +3245 5 5.682729 0.68272876739501953 0.46611856982872268 +3249 7 6.369823 0.63017702102661133 0.39712307782997414 +3250 6 6.864999 0.86499881744384766 0.74822295417925488 +3254 5 6.04639673 1.0463967323303223 1.0949461214315761 +3257 6 6.379424 0.37942409515380859 0.1439626439832864 +3259 6 6.379424 0.37942409515380859 0.1439626439832864 +3260 6 6.379424 0.37942409515380859 0.1439626439832864 +3261 5 6.71544456 1.7154445648193359 2.9427500549682009 +3262 7 5.91904974 1.0809502601623535 1.1684534649450597 +3265 3 5.408037 2.4080371856689453 5.7986430875644146 +3268 6 6.56899548 0.56899547576904297 0.32375585144563956 +3270 5 5.907564 0.90756416320800781 0.82367271033945144 +3276 8 6.294619 1.705380916595459 2.9083240706879678 +3279 6 6.2112565 0.21125650405883789 0.04462931050716179 +3280 5 5.907564 0.90756416320800781 0.82367271033945144 +3285 7 6.21512938 0.78487062454223633 0.61602189726932011 +3286 7 6.21512938 0.78487062454223633 0.61602189726932011 +3289 5 5.373417 0.37341690063476563 0.13944018167967442 +3291 8 7.06327868 0.9367213249206543 0.877446840561106 +3292 5 5.3677 0.36770009994506836 0.13520336349961326 +3294 6 5.762234 0.23776578903198242 0.056532570434001173 +3301 8 7.06327868 0.9367213249206543 0.877446840561106 +3304 7 7.03957 0.039569854736328125 0.0015657734038541093 +3307 3 5.551138 2.5511379241943359 6.5083047082625853 +3312 7 6.90318632 0.096813678741455078 0.0093728883914536709 +3315 7 6.349025 0.65097522735595703 0.42376874663113995 +3320 5 5.555195 0.55519485473632813 0.30824132672569249 +3322 7 6.713857 0.28614282608032227 0.081877716917233556 +3324 6 6.09259033 0.09259033203125 0.0085729695856571198 +3325 7 6.805244 0.19475603103637695 0.037929911625042223 +3327 7 6.30779028 0.69220972061157227 0.47915429730915093 +3329 6 6.29850864 0.29850864410400391 0.089107410604810866 +3331 6 5.92293072 0.077069282531738281 0.0059396743099568994 +3334 6 6.29176331 0.2917633056640625 0.085125826532021165 +3338 6 4.452654 1.5473461151123047 2.3942799999531417 +3339 6 5.92551756 0.074482440948486328 0.005547634009644753 +3340 6 6.308332 0.30833196640014648 0.095068601504181061 +3341 6 5.92551756 0.074482440948486328 0.005547634009644753 +3345 6 5.78186 0.2181401252746582 0.047585114254843575 +3348 6 4.452654 1.5473461151123047 2.3942799999531417 +3349 6 5.860938 0.13906192779541016 0.019338219762175868 +3350 6 6.46421 0.46421003341674805 0.21549095512477834 +3352 6 6.52834654 0.52834653854370117 0.27915006479111071 +3353 6 6.487485 0.48748493194580078 0.23764155887420202 +3354 7 6.862117 0.13788318634033203 0.019011773075362726 +3358 6 6.52834654 0.52834653854370117 0.27915006479111071 +3360 7 5.929071 1.0709290504455566 1.1468890310882216 +3362 6 6.46421 0.46421003341674805 0.21549095512477834 +3364 6 6.19586229 0.1958622932434082 0.038362037914566827 +3367 6 6.58196354 0.58196353912353516 0.33868156086919043 +3368 6 5.94375134 0.056248664855957031 0.0031639122980777756 +3373 7 6.703072 0.29692792892456055 0.08816619497542888 +3374 5 5.55829239 0.55829238891601563 0.31169039152155165 +3375 6 5.945457 0.054543018341064453 0.0029749408497536933 +3377 6 6.07918072 0.079180717468261719 0.0062695860187886865 +3378 8 6.5126605 1.4873394966125488 2.2121787781836701 +3379 5 5.142003 0.14200305938720703 0.020164868875326647 +3380 7 6.76761866 0.23238134384155273 0.054001088965605959 +3381 7 6.304437 0.69556283950805664 0.48380766370451056 +3385 6 6.483192 0.48319196701049805 0.23347447698347423 +3386 8 6.5126605 1.4873394966125488 2.2121787781836701 +3388 6 6.310103 0.31010293960571289 0.096163833152104417 +3391 8 6.59127235 1.4087276458740234 1.984513580249768 +3392 6 6.58681345 0.58681344985961914 0.34435002493614775 +3393 6 6.242813 0.2428131103515625 0.058958206558600068 +3394 5 5.517561 0.51756095886230469 0.26786934613846825 +3395 5 5.42729425 0.42729425430297852 0.18258037976033847 +3396 6 6.080851 0.080851078033447266 0.006536896819170579 +3398 5 5.633409 0.63340902328491211 0.40120699077874633 +3402 6 5.25966454 0.74033546447753906 0.5480965999631735 +3403 5 6.20717239 1.2071723937988281 1.457265188349993 +3404 6 5.354333 0.64566707611083984 0.41688597317352105 +3407 5 5.633409 0.63340902328491211 0.40120699077874633 +3410 7 6.016722 0.98327779769897461 0.96683522744774564 +3412 6 5.838692 0.16130781173706055 0.026020210127398968 +3413 6 5.566281 0.43371915817260742 0.18811230816595526 +3415 7 6.75017834 0.24982166290283203 0.062410863255536242 +3417 4 6.68368769 2.683687686920166 7.202179600926911 +3418 6 5.59492636 0.40507364273071289 0.16408465603512923 +3419 7 6.75017834 0.24982166290283203 0.062410863255536242 +3420 5 5.18478537 0.18478536605834961 0.034145631509318264 +3421 8 6.518584 1.4814162254333496 2.1945940329771929 +3424 6 6.5416193 0.54161930084228516 0.29335146704488579 +3426 6 6.227545 0.22754478454589844 0.05177662897403934 +3427 6 6.292055 0.29205513000488281 0.085296198962169001 +3428 6 6.5416193 0.54161930084228516 0.29335146704488579 +3429 5 5.917385 0.91738510131835938 0.8415954241208965 +3430 6 6.227545 0.22754478454589844 0.05177662897403934 +3432 5 5.899042 0.89904212951660156 0.80827675064574578 +3433 7 7.028948 0.028947830200195313 0.00083797687329933979 +3434 6 5.98812 0.011879920959472656 0.00014113252200331772 +3436 6 6.27996063 0.27996063232421875 0.078377955651376396 +3438 5 5.35919762 0.35919761657714844 0.12902292775470414 +3440 5 6.570556 1.5705561637878418 2.4666466636119821 +3441 5 6.18622065 1.186220645904541 1.4071194207701865 +3443 6 6.24534845 0.24534845352172852 0.060195863645503778 +3444 5 5.35919762 0.35919761657714844 0.12902292775470414 +3445 8 7.20836258 0.79163742065429688 0.62668980578018818 +3446 6 5.34057474 0.65942525863647461 0.43484167172778143 +3447 6 6.26559734 0.26559734344482422 0.07054194884494791 +3448 7 6.77392 0.22607994079589844 0.051112139630276943 +3449 8 7.20836258 0.79163742065429688 0.62668980578018818 +3453 6 5.924129 0.075870990753173828 0.0057564072378681885 +3460 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3462 6 6.51762867 0.51762866973876953 0.26793943973552814 +3464 5 5.63632774 0.63632774353027344 0.40491299718632945 +3466 6 6.51762867 0.51762866973876953 0.26793943973552814 +3468 8 6.82865238 1.1713476181030273 1.3720552424356356 +3469 6 5.73325253 0.26674747467041016 0.071154215243041108 +3471 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3474 6 5.795674 0.20432615280151367 0.041749176718667513 +3476 8 7.431058 0.56894207000732422 0.32369507902421901 +3479 7 7.04171276 0.041712760925292969 0.0017399544240106479 +3485 7 5.834083 1.165916919708252 1.3593622636619784 +3486 6 6.16977739 0.16977739334106445 0.028824363289686517 +3489 8 4.801781 3.198218822479248 10.228603636460548 +3492 7 6.888686 0.11131381988525391 0.012390766497446748 +3495 7 6.191298 0.80870199203491211 0.65399891192123505 +3496 7 6.308696 0.69130420684814453 0.4779015064059422 +3498 6 5.77528572 0.22471427917480469 0.05049650726505206 +3499 7 7.09658337 0.096583366394042969 0.0093283466640059487 +3501 6 6.357981 0.35798120498657227 0.12815054312363827 +3505 7 6.31529951 0.68470048904418945 0.4688147596973522 +3508 5 5.14080048 0.14080047607421875 0.019824774062726647 +3509 6 5.64398 0.35601997375488281 0.12675022171242745 +3510 6 6.093127 0.093126773834228516 0.0086725960047715489 +3512 6 6.499861 0.49986076354980469 0.24986078293659375 +3514 6 6.82486 0.8248600959777832 0.68039417793647772 +3515 7 6.633162 0.36683797836303711 0.13457010236948008 +3521 7 6.103966 0.89603376388549805 0.80287650602281246 +3524 6 7.059881 1.0598812103271484 1.1233481800045411 +3525 6 7.059881 1.0598812103271484 1.1233481800045411 +3530 5 5.521842 0.52184200286865234 0.27231907595796656 +3534 5 5.521842 0.52184200286865234 0.27231907595796656 +3535 5 5.33379745 0.33379745483398438 0.11142074085364584 +3538 7 6.42016 0.57984018325805664 0.33621463812073671 +3539 6 6.67678165 0.67678165435791016 0.45803340767542977 +3540 6 6.71353674 0.71353673934936523 0.50913467840132398 +3545 6 6.0961237 0.096123695373535156 0.009239764812264184 +3548 6 6.183013 0.18301296234130859 0.033493744384941238 +3549 6 6.090422 0.090422153472900391 0.0081761658386767522 +3550 6 6.07437038 0.074370384216308594 0.0055309540484813624 +3552 6 5.76073647 0.23926353454589844 0.057247038963396335 +3553 6 5.76073647 0.23926353454589844 0.057247038963396335 +3554 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3556 7 6.27572966 0.72427034378051758 0.52456753087994912 +3557 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3558 6 5.76073647 0.23926353454589844 0.057247038963396335 +3559 4 4.07595253 0.075952529907226563 0.0057687867993081454 +3561 5 4.905119 0.094881057739257813 0.0090024151177203748 +3562 6 6.55745363 0.55745363235473633 0.31075455222548953 +3563 5 4.905119 0.094881057739257813 0.0090024151177203748 +3565 6 6.04586554 0.045865535736083984 0.002103647368357997 +3569 6 6.04586554 0.045865535736083984 0.002103647368357997 +3570 6 6.00234652 0.0023465156555175781 5.5061357215890894E-06 +3571 4 4.425938 0.42593812942504883 0.18142329009810965 +3575 7 6.21730042 0.7826995849609375 0.61261864029802382 +3583 6 5.68802 0.31197977066040039 0.097331377301316024 +3584 7 6.31275463 0.68724536895751953 0.47230619715355715 +3586 7 6.36759567 0.63240432739257813 0.39993523330485914 +3587 6 5.788671 0.21132898330688477 0.04465993918552158 +3592 7 6.515574 0.48442602157592773 0.2346685703798812 +3598 7 6.75961447 0.24038553237915039 0.057785204177207561 +3599 6 5.357542 0.64245796203613281 0.41275223298362107 +3600 6 6.2097683 0.20976829528808594 0.044002737708069617 +3605 5 5.239256 0.23925590515136719 0.057243388149800012 +3607 6 6.00548553 0.00548553466796875 3.0091090593487024E-05 +3613 6 6.04967546 0.049675464630126953 0.0024676517862189939 +3614 5 5.464339 0.46433877944946289 0.21561050210061694 +3615 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3616 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3620 7 6.543914 0.45608615875244141 0.20801458420555718 +3622 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3625 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3627 5 5.06645775 0.066457748413085938 0.0044166323241370264 +3628 6 4.948763 1.0512371063232422 1.1050994537108636 +3629 6 5.165518 0.83448219299316406 0.69636053042268031 +3631 6 5.855898 0.14410209655761719 0.020765414232300827 +3635 6 5.803308 0.19669198989868164 0.038687738890303081 +3637 7 5.53476954 1.4652304649353027 2.1469003153745234 +3638 7 6.54559469 0.45440530776977539 0.20648418372934429 +3639 6 6.441782 0.44178199768066406 0.19517133347471827 +3640 6 6.44922447 0.44922447204589844 0.20180262628491619 +3643 6 6.44922447 0.44922447204589844 0.20180262628491619 +3645 6 6.42862368 0.42862367630004883 0.18371825588496904 +3646 7 5.662194 1.337806224822998 1.789725495175162 +3647 7 6.61878443 0.38121557235717773 0.14532531260761061 +3650 4 4.981792 0.98179197311401367 0.96391547847110814 +3652 6 6.1309557 0.13095569610595703 0.01714939434259577 +3653 6 5.460203 0.53979682922363281 0.29138061683988781 +3655 7 6.627825 0.37217521667480469 0.13851439190693782 +3656 7 6.350513 0.64948701858520508 0.42183338731069853 +3658 7 6.351104 0.64889621734619141 0.42106630088619568 +3660 8 7.266342 0.7336578369140625 0.53825382166542113 +3661 6 5.73333931 0.26666069030761719 0.071107923755334923 +3668 5 4.298321 0.70167922973632813 0.49235374144336674 +3677 6 6.48859262 0.48859262466430664 0.23872275287635603 +3679 7 6.182809 0.81719112396240234 0.66780133308293443 +3680 6 6.29749 0.29749011993408203 0.088500371458394511 +3681 8 6.875233 1.1247668266296387 1.2651004142865077 +3684 7 6.99874163 0.0012583732604980469 1.5835032627364853E-06 +3687 5 6.75047874 1.7504787445068359 3.0641758349702286 +3688 6 6.5764 0.57639980316162109 0.33223673308475554 +3697 6 6.29749 0.29749011993408203 0.088500371458394511 +3698 6 6.28198338 0.28198337554931641 0.079514624086186814 +3699 5 5.228925 0.22892522811889648 0.052406760069288794 +3702 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3703 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3704 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3706 6 6.62652731 0.62652730941772461 0.39253646944621323 +3714 4 6.085308 2.0853080749511719 4.3485097674565623 +3716 5 6.05689526 1.0568952560424805 1.1170275822451003 +3718 5 5.2608223 0.26082229614257813 0.068028270165086724 +3720 7 7.306124 0.30612421035766602 0.093712032167104553 +3721 5 5.29979467 0.29979467391967773 0.089876846510605901 +3723 7 6.609133 0.39086723327636719 0.15277719404912204 +3724 6 6.398474 0.39847421646118164 0.15878170118435264 +3728 7 6.39105129 0.60894870758056641 0.37081852846404217 +3730 6 5.40976429 0.59023571014404297 0.34837819352924271 +3731 6 6.323588 0.32358789443969727 0.10470912542791666 +3733 6 6.918565 0.91856479644775391 0.84376128527310357 +3734 5 5.592469 0.59246921539306641 0.35101977118847572 +3735 6 6.6319313 0.63193130493164063 0.39933717415260617 +3738 6 5.686131 0.31386899948120117 0.098513748835330261 +3739 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3741 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3744 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3745 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3748 5 5.54170942 0.54170942306518555 0.29344909903761618 +3749 6 6.36270332 0.36270332336425781 0.13155370077947737 +3750 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3753 5 5.294697 0.29469680786132813 0.086846208563656546 +3757 5 5.228405 0.22840499877929688 0.052168843467370607 +3759 6 6.1390934 0.13909339904785156 0.019346973658684874 +3762 5 5.38635254 0.3863525390625 0.14926828444004059 +3764 8 7.7105546 0.28944540023803711 0.083778639718957493 +3766 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3767 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3769 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3771 6 5.881416 0.11858415603637695 0.014062202062859797 +3772 6 6.194134 0.19413423538208008 0.037688101347384872 +3776 5 6.84388638 1.8438863754272461 3.3999169654862271 +3778 7 6.78043842 0.21956157684326172 0.048207286025899521 +3779 7 7.006796 0.0067958831787109375 4.6184028178686276E-05 +3782 6 6.213825 0.21382522583007813 0.045721227201283909 +3785 7 6.614752 0.38524818420410156 0.14841616343255737 +3786 5 5.138664 0.13866376876831055 0.019227640769031495 +3790 5 5.36643553 0.36643552780151367 0.1342749960351739 +3794 5 5.73072529 0.73072528839111328 0.53395944709427567 +3795 6 5.587233 0.41276693344116211 0.17037654134242075 +3796 6 6.35663176 0.35663175582885742 0.12718620926557378 +3797 5 5.010817 0.010817050933837891 0.00011700859090524318 +3799 5 6.00536442 1.0053644180297852 1.0107576130403686 +3802 5 5.56199741 0.56199741363525391 0.31584109293271467 +3803 6 6.127415 0.12741518020629883 0.016234628147003605 +3804 5 5.23174334 0.23174333572387695 0.053704973652429544 +3806 5 5.010817 0.010817050933837891 0.00011700859090524318 +3807 5 5.76871 0.76871013641357422 0.59091527382497588 +3810 3 5.63473034 2.634730339050293 6.9418039595120717 +3811 5 5.71404 0.71403980255126953 0.50985283962745598 +3812 5 5.56199741 0.56199741363525391 0.31584109293271467 +3813 5 6.00536442 1.0053644180297852 1.0107576130403686 +3814 5 5.584843 0.58484315872192383 0.34204152030383739 +3816 5 5.614201 0.61420106887817383 0.37724295301109123 +3817 6 6.45202875 0.45202875137329102 0.20432999206809654 +3818 6 6.95391655 0.95391654968261719 0.90995678375838907 +3819 6 6.95391655 0.95391654968261719 0.90995678375838907 +3822 6 6.508243 0.50824308395385742 0.25831103238692776 +3825 6 6.22035742 0.22035741806030273 0.048557391694203034 +3826 6 6.95391655 0.95391654968261719 0.90995678375838907 +3827 5 5.79172754 0.79172754287719727 0.62683250215036423 +3828 6 6.45202875 0.45202875137329102 0.20432999206809654 +3829 7 6.896923 0.10307693481445313 0.010624854490743019 +3831 5 5.33792543 0.33792543411254883 0.11419359902015458 +3832 5 5.33792543 0.33792543411254883 0.11419359902015458 +3835 5 4.95905542 0.040944576263427734 0.0016764583253916499 +3836 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3837 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3840 6 6.563122 0.56312179565429688 0.31710615674091969 +3842 6 6.269664 0.26966381072998047 0.072718570817414729 +3844 6 6.563122 0.56312179565429688 0.31710615674091969 +3845 5 5.040678 0.040678024291992188 0.0016547016602999065 +3846 6 6.333541 0.33354091644287109 0.11124954294155032 +3847 5 5.040678 0.040678024291992188 0.0016547016602999065 +3849 5 5.18588829 0.18588829040527344 0.034554456509795273 +3851 7 7.063238 0.063238143920898438 0.003999062846560264 +3852 6 6.40936041 0.40936040878295898 0.16757594427895128 +3856 6 6.40936041 0.40936040878295898 0.16757594427895128 +3857 6 6.131547 0.13154697418212891 0.017304606416473689 +3858 6 6.55600739 0.55600738525390625 0.30914421245688573 +3859 5 5.479981 0.4799809455871582 0.23038170812674252 +3861 6 5.770308 0.22969198226928711 0.052758406718794504 +3864 7 6.434293 0.56570720672607422 0.32002464374181727 +3865 6 7.211348 1.2113480567932129 1.4673641146966929 +3867 5 5.479981 0.4799809455871582 0.23038170812674252 +3868 6 5.64784956 0.35215044021606445 0.12400993254436798 +3871 6 5.47240543 0.52759456634521484 0.27835602643699531 +3873 5 5.128382 0.12838220596313477 0.016481990807960756 +3874 5 5.36483431 0.36483430862426758 0.13310407274934732 +3877 5 5.846487 0.84648704528808594 0.71654031784055405 +3878 5 5.39803934 0.39803934097290039 0.15843531696214086 +3879 4 5.068995 1.0689949989318848 1.1427503077413803 +3880 6 5.62090158 0.37909841537475586 0.14371560853965093 +3881 6 5.62090158 0.37909841537475586 0.14371560853965093 +3882 5 5.83923769 0.83923768997192383 0.70431990026941094 +3883 6 6.642903 0.64290285110473633 0.41332407595859877 +3884 6 5.62090158 0.37909841537475586 0.14371560853965093 +3885 6 6.30556154 0.30556154251098633 0.093367856261693305 +3887 6 6.30556154 0.30556154251098633 0.093367856261693305 +3890 6 6.616883 0.6168828010559082 0.38054439023858322 +3892 5 6.207933 1.2079329490661621 1.4591020094396754 +3895 6 5.99532557 0.0046744346618652344 2.1850339408047148E-05 +3896 6 5.653739 0.34626102447509766 0.11989669707054418 +3898 7 6.063343 0.93665695190429688 0.87732624555064831 +3899 5 6.207933 1.2079329490661621 1.4591020094396754 +3901 4 4.564142 0.56414222717285156 0.31825645247954526 +3902 6 5.68136072 0.31863927841186523 0.10153098974683417 +3905 7 7.138951 0.13895082473754883 0.019307331695245011 +3906 7 7.138951 0.13895082473754883 0.019307331695245011 +3908 7 6.148028 0.85197210311889648 0.72585646449283558 +3909 7 6.148028 0.85197210311889648 0.72585646449283558 +3910 6 6.63435841 0.63435840606689453 0.40241058734773105 +3911 6 5.38463831 0.61536169052124023 0.37867001016115864 +3913 6 5.75083733 0.24916267395019531 0.062082038090011338 +3914 7 6.148028 0.85197210311889648 0.72585646449283558 +3915 7 7.09318256 0.093182563781738281 0.0086829901929377229 +3917 5 5.26391649 0.2639164924621582 0.069651914993528408 +3920 6 5.7849946 0.21500539779663086 0.046227321081687478 +3922 7 6.80864763 0.19135236740112305 0.036615728510014378 +3923 5 5.02166033 0.021660327911376953 0.00046916980522837548 +3925 5 5.87787962 0.87787961959838867 0.7706726265062116 +3926 6 5.86510658 0.13489341735839844 0.018196234046627069 +3927 5 6.15729952 1.1572995185852051 1.3393421757175474 +3928 5 5.181213 0.1812129020690918 0.032838115876302254 +3930 6 6.24382734 0.24382734298706055 0.059451773188129664 +3931 6 6.76949167 0.76949167251586914 0.5921174340712696 +3932 8 6.814661 1.1853389739990234 1.4050284832810576 +3933 4 5.36573 1.365729808807373 1.8652179106650237 +3936 6 5.942126 0.057874202728271484 0.0033494233414330665 +3937 5 5.47661352 0.47661352157592773 0.22716044894900733 +3940 5 5.20407343 0.20407342910766602 0.041645964467761587 +3941 5 5.28040171 0.28040170669555664 0.078625117117780974 +3942 6 5.689291 0.31070899963378906 0.096540082453429932 +3943 6 5.534346 0.46565389633178711 0.21683355116897474 +3944 6 6.19307756 0.19307756423950195 0.037278945812659003 +3945 6 6.19931555 0.19931554794311523 0.039726687651864268 +3946 6 6.649443 0.64944314956665039 0.42177640451905063 +3947 7 6.5232563 0.47674369812011719 0.22728455369724543 +3949 5 5.20407343 0.20407342910766602 0.041645964467761587 +3950 5 5.28040171 0.28040170669555664 0.078625117117780974 +3951 5 5.33914328 0.33914327621459961 0.11501816180157221 +3952 6 6.17257738 0.1725773811340332 0.029782952479081359 +3953 7 6.01015 0.98985004425048828 0.97980311010269361 +3954 5 5.33914328 0.33914327621459961 0.11501816180157221 +3956 5 5.874935 0.87493515014648438 0.76551151696185116 +3959 6 5.762868 0.23713207244873047 0.056231619783829956 +3960 6 5.484553 0.51544713973999023 0.26568575386613702 +3962 7 6.894317 0.1056828498840332 0.011168864759611097 +3963 7 6.40009546 0.59990453720092773 0.35988545375425929 +3965 4 5.771997 1.7719969749450684 3.1399732792144732 +3967 4 5.61956 1.6195597648620605 2.6229738319600528 +3970 7 6.26989174 0.73010826110839844 0.53305807293872931 +3973 4 5.61956 1.6195597648620605 2.6229738319600528 +3978 7 5.6615057 1.3384943008422852 1.7915669933872778 +3982 7 7.10843658 0.10843658447265625 0.011758492852095515 +3985 6 6.1268425 0.12684249877929688 0.016089019496575929 +3990 6 5.793903 0.20609712600708008 0.042476025348378244 +3993 7 6.273067 0.72693300247192383 0.52843159008284601 +3994 7 6.273067 0.72693300247192383 0.52843159008284601 +3995 5 4.49924231 0.50075769424438477 0.25075826834495274 +3996 7 6.273067 0.72693300247192383 0.52843159008284601 +3997 7 6.61189747 0.38810253143310547 0.15062357490478462 +4002 6 5.52411652 0.47588348388671875 0.2264650902361609 +4003 6 6.44395447 0.4439544677734375 0.19709556945599616 +4004 7 6.93372965 0.066270351409912109 0.0043917594759932399 +4006 6 6.54262829 0.54262828826904297 0.2944454592297916 +4009 6 6.030793 0.030793190002441406 0.00094822055052645737 +4010 6 6.702753 0.70275306701660156 0.49386187320124009 +4011 7 6.61189747 0.38810253143310547 0.15062357490478462 +4014 6 6.416903 0.41690301895141602 0.17380812721080474 +4015 5 4.63322 0.36677980422973633 0.13452742479080371 +4017 6 6.302566 0.3025660514831543 0.091546215510106776 +4018 6 6.416903 0.41690301895141602 0.17380812721080474 +4019 5 4.63322 0.36677980422973633 0.13452742479080371 +4021 5 5.672981 0.67298078536987305 0.45290313747705113 +4022 5 5.24404049 0.24404048919677734 0.059555760367402399 +4024 6 6.498086 0.49808597564697266 0.24808963913619664 +4025 6 7.268845 1.2688450813293457 1.6099678404136739 +4027 5 5.43563271 0.43563270568847656 0.18977585426546284 +4029 6 6.150405 0.15040493011474609 0.022621643002821656 +4031 5 5.149139 0.1491389274597168 0.022242419683834669 +4032 5 5.507375 0.50737476348876953 0.25742915062528482 +4033 6 5.997153 0.0028471946716308594 8.1065174981631571E-06 +4034 5 5.507375 0.50737476348876953 0.25742915062528482 +4035 6 6.290976 0.29097604751586914 0.084667060227957336 +4037 5 5.21681929 0.21681928634643555 0.047010602931777612 +4039 4 5.56902456 1.5690245628356934 2.4618380787817387 +4043 7 6.615785 0.38421487808227539 0.14762107253977774 +4044 7 6.615785 0.38421487808227539 0.14762107253977774 +4047 6 6.399214 0.39921379089355469 0.15937165083960281 +4049 6 6.340012 0.3400120735168457 0.11560821013722489 +4050 7 6.615785 0.38421487808227539 0.14762107253977774 +4051 6 6.762627 0.76262712478637695 0.58160013145993616 +4052 5 5.392097 0.39209699630737305 0.15374005451326411 +4053 7 6.615785 0.38421487808227539 0.14762107253977774 +4054 7 6.69855261 0.30144739151000977 0.090870529848189108 +4055 6 6.762627 0.76262712478637695 0.58160013145993616 +4056 5 5.68365574 0.68365573883056641 0.46738516923596762 +4059 6 6.340012 0.3400120735168457 0.11560821013722489 +4064 5 6.0256834 1.0256834030151367 1.0520264432207114 +4066 6 6.278558 0.27855777740478516 0.077594435352693836 +4070 5 5.71400928 0.71400928497314453 0.50980925902786112 +4071 6 6.35261631 0.35261631011962891 0.12433826216238231 +4075 6 5.782519 0.21748113632202148 0.047298044655917693 +4078 6 5.879521 0.12047910690307617 0.014515215200162856 +4082 6 5.96297741 0.037022590637207031 0.0013706722174902097 +4085 6 5.42402267 0.57597732543945313 0.3317498794203857 +4086 6 5.6922617 0.30773830413818359 0.094702863833845186 +4087 6 5.65787649 0.34212350845336914 0.11704849503644255 +4088 6 5.93835 0.061649799346923828 0.0038006977595159697 +4091 6 5.59978676 0.40021324157714844 0.16017063873368897 +4094 7 7.09430265 0.094302654266357422 0.0088929906016801397 +4096 5 5.004691 0.0046911239624023438 2.2006644030625466E-05 +4097 6 5.59978676 0.40021324157714844 0.16017063873368897 +4099 6 5.251464 0.74853610992431641 0.56030630786062829 +4100 6 6.169235 0.1692352294921875 0.02864056290127337 +4101 5 5.35461 0.35460996627807617 0.12574822818373832 +4102 5 5.35461 0.35460996627807617 0.12574822818373832 +4103 7 6.459716 0.54028415679931641 0.29190697008834832 +4105 7 6.1171217 0.88287830352783203 0.77947409884018271 +4107 6 6.4520607 0.45206069946289063 0.20435887599887792 +4108 6 6.504417 0.50441694259643555 0.25443645197833575 +4109 6 6.58853436 0.58853435516357422 0.34637268720780412 +4111 6 5.88097429 0.11902570724487305 0.014167118985142224 +4112 6 6.374791 0.37479114532470703 0.14046840261380567 +4119 7 6.504891 0.49510908126831055 0.24513300235435054 +4120 5 5.821947 0.82194709777832031 0.67559703154620365 +4122 6 5.31796741 0.68203258514404297 0.46516844719826622 +4125 5 5.840767 0.84076690673828125 0.70688899146625772 +4126 5 5.781769 0.781768798828125 0.61116245482116938 +4128 5 5.52519 0.52518987655639648 0.27582440643732298 +4131 5 5.383935 0.38393497467041016 0.14740606477516849 +4132 5 5.383935 0.38393497467041016 0.14740606477516849 +4133 6 6.15966272 0.15966272354125977 0.025492185288612745 +4134 6 6.03338528 0.033385276794433594 0.0011145767066409462 +4136 6 6.40281725 0.4028172492980957 0.16226173633208418 +4137 5 5.383935 0.38393497467041016 0.14740606477516849 +4138 6 5.73121643 0.2687835693359375 0.072244607144966722 +4139 7 6.34555149 0.65444850921630859 0.42830285121544875 +4140 6 5.88961172 0.11038827896118164 0.012185572132011657 +4141 6 5.88961172 0.11038827896118164 0.012185572132011657 +4143 6 5.593262 0.4067378044128418 0.16543564153857915 +4147 7 6.34555149 0.65444850921630859 0.42830285121544875 +4149 7 6.661175 0.33882522583007813 0.11480253365880344 +4150 5 5.02091932 0.020919322967529297 0.00043761807341979875 +4151 6 6.47969961 0.47969961166381836 0.23011171743041814 +4152 6 5.66785336 0.33214664459228516 0.11032139351391379 +4154 5 5.15050268 0.15050268173217773 0.022651057208577186 +4155 5 5.12121248 0.12121248245239258 0.014692465902271579 +4159 7 7.171123 0.17112302780151367 0.029283090643957621 +4160 7 7.171123 0.17112302780151367 0.029283090643957621 +4162 7 7.171123 0.17112302780151367 0.029283090643957621 +4163 5 5.196028 0.19602823257446289 0.038427067966267714 +4165 7 6.1403017 0.85969829559326172 0.7390811594459592 +4166 7 6.264687 0.73531293869018555 0.54068511780519657 +4168 6 6.413434 0.41343402862548828 0.17092769602550106 +4169 7 6.41145468 0.58854532241821289 0.34638559654035816 +4170 7 7.171123 0.17112302780151367 0.029283090643957621 +4171 5 6.396712 1.3967118263244629 1.9508039257946166 +4174 6 5.622606 0.37739419937133789 0.14242638171913313 +4177 6 6.333195 0.33319520950317383 0.1110190476358639 +4178 7 6.451308 0.54869222640991211 0.30106315932266625 +4179 5 5.080747 0.080747127532958984 0.0065200986048239429 +4180 6 5.17860174 0.82139825820922852 0.67469509858915444 +4181 6 5.97988 0.020120143890380859 0.00040482019016963022 +4184 7 6.664118 0.33588218688964844 0.11281684346977272 +4186 5 5.63166 0.63165998458862305 0.39899433613049951 +4187 6 6.629633 0.62963294982910156 0.39643765151049593 +4188 6 6.45284367 0.45284366607666016 0.20506738590574969 +4189 5 5.431086 0.43108606338500977 0.18583519404478466 +4195 8 6.864855 1.1351451873779297 1.2885545964272751 +4196 6 6.342234 0.34223413467407227 0.11712420293611103 +4199 6 6.092705 0.09270477294921875 0.0085941749275662005 +4203 5 5.11989164 0.11989164352416992 0.014374006186926636 +4205 6 6.4625473 0.46254730224609375 0.2139500068151392 +4206 6 5.41587734 0.58412265777587891 0.34119927932715655 +4207 7 6.66556644 0.33443355560302734 0.11184580311328318 +4208 6 6.23236465 0.23236465454101563 0.053993332679965533 +4210 6 5.624344 0.3756561279296875 0.14111752645112574 +4211 6 5.50366735 0.49633264541625977 0.24634609490590265 +4212 4 5.101606 1.1016058921813965 1.2135355416887705 +4213 4 4.66811943 0.66811943054199219 0.44638357346775592 +4215 5 5.144476 0.14447593688964844 0.020873296340141678 +4218 6 6.2664175 0.26641750335693359 0.070978286094941723 +4221 6 6.68571949 0.68571949005126953 0.47021121903617313 +4222 4 4.72174644 0.72174644470214844 0.52091793044019141 +4223 4 4.507802 0.50780200958251953 0.25786288093604526 +4225 5 5.66852236 0.66852235794067383 0.44692214306655842 +4227 7 5.712353 1.2876467704772949 1.6580342055206074 +4228 6 5.54079962 0.45920038223266602 0.21086499104262657 +4229 6 5.635159 0.36484098434448242 0.13310894385745087 +4230 6 5.206867 0.79313278198242188 0.62905960985517595 +4231 6 6.206823 0.20682287216186523 0.042775700449283249 +4233 6 5.66782 0.33218002319335938 0.11034356780874077 +4235 5 5.115067 0.1150670051574707 0.013240415675909389 +4236 5 5.115067 0.1150670051574707 0.013240415675909389 +4237 5 6.068968 1.0689678192138672 1.142692198514851 +4240 6 5.92421675 0.075783252716064453 0.0057431013922268903 +4241 6 6.78847551 0.78847551345825195 0.62169363532325406 +4244 5 5.40309143 0.4030914306640625 0.16248270147480071 +4249 6 5.87049532 0.12950468063354492 0.016771462305996465 +4251 6 5.72442341 0.27557659149169922 0.07594245777818287 +4253 4 5.871702 1.8717021942138672 3.503269103825005 +4254 5 5.62651348 0.62651348114013672 0.39251914205033245 +4256 5 5.298669 0.29866886138916016 0.089203088763497362 +4257 5 6.2595787 1.2595787048339844 1.5865385136712575 +4260 6 6.039149 0.039148807525634766 0.0015326291306791973 +4261 7 6.67396927 0.32603073120117188 0.10629603768757079 +4262 6 6.53447533 0.53447532653808594 0.28566387467799359 +4263 6 5.570907 0.4290928840637207 0.18412070315412166 +4266 7 6.67396927 0.32603073120117188 0.10629603768757079 +4268 6 6.223932 0.22393178939819336 0.050145446303076824 +4271 5 4.947084 0.052916049957275391 0.0028001083430808649 +4272 6 5.83227158 0.16772842407226563 0.028132824241765775 +4274 6 5.83227158 0.16772842407226563 0.028132824241765775 +4275 6 5.83227158 0.16772842407226563 0.028132824241765775 +4278 4 4.781235 0.7812352180480957 0.61032846591865564 +4279 6 6.009532 0.0095319747924804688 9.0858543444483075E-05 +4281 5 5.3883934 0.38839340209960938 0.15084943479450885 +4288 6 6.39963055 0.39963054656982422 0.15970457375169644 +4291 5 5.64141655 0.64141654968261719 0.41141519020675332 +4292 6 6.14931154 0.14931154251098633 0.022293936727010077 +4295 5 5.64141655 0.64141654968261719 0.41141519020675332 +4297 6 6.430081 0.43008089065551758 0.18496957250704327 +4300 5 5.76332045 0.7633204460144043 0.5826581033036291 +4301 5 5.09951735 0.099517345428466797 0.0099037020411287813 +4304 6 6.01407433 0.014074325561523438 0.00019808664001175202 +4306 6 6.01468229 0.014682292938232422 0.00021556972592406964 +4307 7 6.38643 0.61357021331787109 0.37646840667093784 +4308 6 6.37244368 0.37244367599487305 0.13871429178857397 +4310 6 5.634999 0.36500120162963867 0.13322587719108014 +4311 5 6.35202742 1.352027416229248 1.8279781342355363 +4314 7 6.330645 0.66935491561889648 0.44803600306318003 +4315 7 6.70243 0.29757022857666016 0.088548040935165773 +4318 7 6.330645 0.66935491561889648 0.44803600306318003 +4319 7 6.70243 0.29757022857666016 0.088548040935165773 +4322 7 6.258191 0.74180889129638672 0.55028043120637449 +4323 6 6.030255 0.030254840850830078 0.00091535539490905649 +4324 6 6.287142 0.28714179992675781 0.082450413265178213 +4325 5 5.33152676 0.33152675628662109 0.10990999013392866 +4327 5 5.33152676 0.33152675628662109 0.10990999013392866 +4331 5 5.30460739 0.30460739135742188 0.092785662869573571 +4336 8 7.803421 0.1965789794921875 0.038643295178189874 +4338 8 7.803421 0.1965789794921875 0.038643295178189874 +4339 8 5.894702 2.1052980422973633 4.4322798469011104 +4342 6 6.53088236 0.53088235855102539 0.28183607862069948 +4344 6 5.308004 0.69199609756469727 0.47885859904477002 +4345 6 6.16504431 0.16504430770874023 0.027239623507057331 +4346 6 5.308004 0.69199609756469727 0.47885859904477002 +4347 7 6.508878 0.49112176895141602 0.24120059193796806 +4348 6 5.203784 0.79621601104736328 0.63395993624817493 +4350 6 6.67189741 0.67189741134643555 0.45144613137404122 +4356 5 5.61585426 0.61585426330566406 0.3792764736317622 +4357 6 6.30698061 0.30698060989379883 0.094237094850768699 +4359 6 5.048261 0.95173883438110352 0.90580680886910159 +4360 5 5.47202253 0.47202253341674805 0.22280527205316503 +4364 6 6.12464428 0.12464427947998047 0.01553619640708348 +4367 5 5.313826 0.31382608413696289 0.098486811084740111 +4368 6 6.25579929 0.25579929351806641 0.06543327856434189 +4371 5 5.73987532 0.73987531661987305 0.54741548414335739 +4373 6 6.28148031 0.28148031234741211 0.079231166239196682 +4374 5 5.319378 0.31937789916992188 0.10200224247819278 +4377 6 7.22142553 1.2214255332946777 1.4918803333841879 +4379 5 5.134177 0.13417720794677734 0.018003523132392729 +4381 6 6.37373829 0.37373828887939453 0.13968030857449776 +4383 6 7.22142553 1.2214255332946777 1.4918803333841879 +4384 5 5.17954 0.17954015731811523 0.032234668089813567 +4385 5 5.17954 0.17954015731811523 0.032234668089813567 +4387 6 6.33638859 0.33638858795166016 0.1131572821041118 +4389 4 5.846869 1.8468689918518066 3.4109250730637086 +4390 5 5.244622 0.24462223052978516 0.059840035669367353 +4391 5 5.60372734 0.60372734069824219 0.3644867019065714 +4392 5 5.244622 0.24462223052978516 0.059840035669367353 +4394 6 5.95294666 0.047053337097167969 0.0022140165319797234 +4395 5 5.325285 0.32528495788574219 0.10581030382672907 +4396 5 5.33716774 0.33716773986816406 0.11368208480780595 +4401 6 7.114057 1.1140570640563965 1.2411231419739579 +4402 6 6.401035 0.40103483200073242 0.16082893647785568 +4404 5 5.16598129 0.16598129272460938 0.027549789534532465 +4405 5 5.16598129 0.16598129272460938 0.027549789534532465 +4407 6 6.38966656 0.38966655731201172 0.15184002588739531 +4409 7 6.784521 0.21547889709472656 0.046431155093159759 +4412 7 6.24230337 0.75769662857055664 0.57410418094718807 +4416 5 5.28144741 0.28144741058349609 0.079212644924155029 +4420 6 5.910447 0.089552879333496094 0.0080197181969197118 +4423 6 5.82727575 0.17272424697875977 0.029833665494379602 +4424 6 5.910447 0.089552879333496094 0.0080197181969197118 +4425 6 5.76691437 0.23308563232421875 0.054328911995980889 +4427 5 5.505483 0.50548315048217773 0.25551321542138794 +4429 6 5.82788134 0.1721186637878418 0.029624834424112123 +4430 5 5.208692 0.20869207382202148 0.043552381676136065 +4432 6 6.75506926 0.75506925582885742 0.57012958109794454 +4433 5 4.73662949 0.26337051391601563 0.06936402760038618 +4434 6 5.983093 0.016907215118408203 0.00028585392306013091 +4435 6 5.998494 0.0015058517456054688 2.2675894797430374E-06 +4438 5 5.61417246 0.61417245864868164 0.37720780896256656 +4441 6 6.13689232 0.13689231872558594 0.018739506926067406 +4444 6 6.323481 0.32348108291625977 0.10464001100467613 +4450 6 5.931922 0.068078041076660156 0.0046346196768354275 +4451 5 5.0867095 0.086709499359130859 0.0075185372791111149 +4452 5 5.28290367 0.28290367126464844 0.08003448721501627 +4454 6 5.866116 0.13388395309448242 0.017924912896205569 +4458 7 6.727507 0.27249288558959961 0.074252372696946622 +4463 6 6.66014862 0.66014862060546875 0.43579620128730312 +4464 5 5.33912659 0.3391265869140625 0.11500684195198119 +4467 5 5.814492 0.81449222564697266 0.66339758563935902 +4468 6 6.148203 0.14820289611816406 0.021964098417811329 +4469 6 6.15595961 0.1559596061706543 0.02432339875690559 +4471 6 6.1687336 0.16873359680175781 0.028471026689658174 +4474 6 5.58603525 0.41396474838256836 0.17136681290344313 +4476 6 6.43061924 0.43061923980712891 0.18543292969206959 +4477 5 5.274904 0.27490377426147461 0.07557208510320379 +4479 5 4.76414776 0.23585224151611328 0.055626279828175029 +4480 5 6.48533058 1.4853305816650391 2.2062069368294033 +4483 4 5.231788 1.231788158416748 1.5173020672157236 +4484 5 4.76414776 0.23585224151611328 0.055626279828175029 +4485 6 6.311954 0.31195402145385742 0.097315311501233737 +4487 6 6.056974 0.056973934173583984 0.003246029175215881 +4488 6 6.68880939 0.68880939483642578 0.47445838241492311 +4490 6 6.510393 0.51039314270019531 0.26050116011538194 +4492 6 5.89441824 0.10558176040649414 0.011147508130534334 +4495 6 5.144858 0.85514211654663086 0.7312680394918516 +4500 6 5.839706 0.1602940559387207 0.025694184369285722 +4501 6 4.62486744 1.3751325607299805 1.8909895595797934 +4502 6 6.01956224 0.019562244415283203 0.00038268140656327887 +4505 5 5.376757 0.37675714492797852 0.14194594625428181 +4506 6 6.49714661 0.4971466064453125 0.24715474830009043 +4508 4 6.290004 2.290003776550293 5.2441172966146041 +4510 6 7.13127375 1.1312737464904785 1.2797802894986035 +4513 6 6.11181831 0.11181831359863281 0.012503335256042192 +4515 6 6.48865747 0.48865747451782227 0.23878612740213612 +4518 6 5.303486 0.69651412963867188 0.48513193278631661 +4519 6 6.31545067 0.31545066833496094 0.099509124152973527 +4523 5 5.89000559 0.89000558853149414 0.79210994761729125 +4524 6 5.74650574 0.2534942626953125 0.064259341219440103 +4525 6 6.31545067 0.31545066833496094 0.099509124152973527 +4529 6 5.78503227 0.21496772766113281 0.046211123935790965 +4537 5 5.41821861 0.41821861267089844 0.17490680798437097 +4538 6 7.013766 1.013765811920166 1.0277211214181534 +4539 5 6.30204439 1.3020443916320801 1.6953195977805535 +4540 6 6.81689167 0.81689167022705078 0.66731200088634068 +4541 6 6.21650553 0.21650552749633789 0.046874643436467522 +4545 6 6.73921871 0.73921871185302734 0.54644430395364907 +4546 6 6.66135359 0.66135358810424805 0.43738856849836338 +4547 6 6.231135 0.23113489151000977 0.053423338073343984 +4548 5 5.619266 0.61926603317260742 0.38349041984133692 +4550 6 6.00123453 0.0012345314025878906 1.5240677839756245E-06 +4553 6 6.81689167 0.81689167022705078 0.66731200088634068 +4555 5 5.438729 0.43872880935668945 0.19248296815953836 +4559 7 5.820478 1.1795220375061035 1.3912722369625499 +4560 6 7.43508 1.4350800514221191 2.0594547539897121 +4562 7 6.60676956 0.39323043823242188 0.15463017755246256 +4563 7 6.51218367 0.48781633377075195 0.23796477549353767 +4569 6 5.791381 0.20861911773681641 0.043521936285287666 +4571 7 6.183002 0.81699800491333008 0.66748574003236172 +4574 7 7.28964 0.28963994979858398 0.083891300519326251 +4575 7 6.81097269 0.18902730941772461 0.035731323705704199 +4576 5 6.063239 1.0632390975952148 1.1304773786550868 +4578 7 6.65358162 0.34641838073730469 0.12000569451265619 +4581 6 6.3172965 0.31729650497436523 0.10067707206894738 +4582 6 5.9126215 0.087378501892089844 0.0076350025929059484 +4588 5 6.453704 1.4537038803100586 2.1132549716285212 +4589 6 6.48201656 0.48201656341552734 0.23233996740691509 +4591 6 5.233967 0.76603317260742188 0.5868068215349922 +4592 6 6.46258 0.46258020401000977 0.21398044514194225 +4594 6 7.097535 1.0975351333618164 1.2045833689635401 +4595 6 6.03428125 0.034281253814697266 0.0011752043631076958 +4601 6 6.55298138 0.55298137664794922 0.30578840291946108 +4603 6 6.15366173 0.15366172790527344 0.023611926622834289 +4604 6 6.37432575 0.37432575225830078 0.14011976880374277 +4610 6 5.418315 0.58168506622314453 0.33835751626702404 +4611 5 5.78711462 0.78711462020874023 0.61954942534634938 +4612 5 5.5359993 0.53599929809570313 0.28729524755908642 +4614 5 4.7773695 0.22263050079345703 0.049564339883545472 +4616 5 5.515364 0.51536417007446289 0.26560022779653991 +4618 7 6.754185 0.24581480026245117 0.060424916028068765 +4620 6 5.92583847 0.074161529541015625 0.0054999324638629332 +4622 7 7.02194071 0.021940708160400391 0.00048139467457986029 +4626 6 6.392011 0.39201116561889648 0.15367275396988589 +4627 6 5.879169 0.12083101272583008 0.01460013363634971 +4628 6 5.879169 0.12083101272583008 0.01460013363634971 +4629 7 6.207745 0.79225492477416992 0.62766786582892564 +4631 7 6.29134655 0.70865345001220703 0.50218971221420361 +4633 6 5.58980465 0.41019535064697266 0.16826022569239285 +4634 6 6.5506444 0.5506443977355957 0.30320925275759691 +4637 6 6.52179 0.5217900276184082 0.2722648329220192 +4638 5 5.39053345 0.390533447265625 0.1525163734331727 +4640 6 6.52179 0.5217900276184082 0.2722648329220192 +4643 6 5.714403 0.28559684753417969 0.081565559321461478 +4646 7 6.041397 0.9586029052734375 0.91891952999867499 +4649 5 4.65491056 0.34508943557739258 0.11908671854712338 +4651 7 7.295845 0.29584503173828125 0.08752428280422464 +4652 5 5.108062 0.10806179046630859 0.011677350558784383 +4656 7 6.557833 0.44216680526733398 0.19551148368032045 +4657 7 6.557833 0.44216680526733398 0.19551148368032045 +4661 5 6.112563 1.1125631332397461 1.237796725444241 +4664 7 6.18966246 0.81033754348754883 0.65664693438543509 +4667 7 6.18966246 0.81033754348754883 0.65664693438543509 +4668 7 6.281588 0.71841192245483398 0.5161156903252504 +4669 5 6.191474 1.1914739608764648 1.4196101994466517 +4673 7 6.867097 0.13290309906005859 0.017663233739767747 +4674 7 7.240729 0.24072885513305664 0.057950381693672171 +4678 6 5.62289524 0.37710475921630859 0.14220799942359008 +4679 5 5.20689535 0.20689535140991211 0.042805686435031021 +4682 6 5.69725657 0.30274343490600586 0.091653587378687007 +4684 6 6.23112869 0.23112869262695313 0.053420472555444576 +4685 5 5.61776447 0.61776447296142578 0.38163294405330817 +4686 4 4.58701658 0.58701658248901367 0.34458846811708099 +4688 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4692 5 5.97440958 0.97440958023071289 0.9494740300453941 +4693 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4694 7 6.101005 0.89899492263793945 0.80819187092879474 +4695 7 7.00340128 0.0034012794494628906 1.1568701893338584E-05 +4698 6 5.45968676 0.5403132438659668 0.29193840149696371 +4699 5 5.73117447 0.73117446899414063 0.53461610410886351 +4700 5 5.73117447 0.73117446899414063 0.53461610410886351 +4702 6 5.335329 0.66467094421386719 0.44178746408215375 +4703 7 6.74484062 0.25515937805175781 0.065106308207759866 +4704 6 5.266865 0.73313522338867188 0.53748725577315781 +4705 6 5.828863 0.17113685607910156 0.029287823508639121 +4709 6 6.635482 0.63548183441162109 0.40383716186715901 +4710 7 6.614615 0.38538503646850586 0.14852162633383159 +4711 6 6.165267 0.16526699066162109 0.027313178202348354 +4714 7 6.478859 0.52114105224609375 0.27158799633616582 +4717 6 5.71084 0.28915977478027344 0.083613375350978458 +4720 5 6.142657 1.1426568031311035 1.3056645697417935 +4721 6 6.462371 0.46237087249755859 0.21378682373415359 +4724 6 6.462371 0.46237087249755859 0.21378682373415359 +4726 6 7.20805073 1.2080507278442383 1.4593865610449939 +4728 6 6.28587675 0.28587675094604492 0.081725516731466996 +4731 6 7.07015753 1.070157527923584 1.1452371345715164 +4732 6 7.07015753 1.070157527923584 1.1452371345715164 +4736 6 5.969431 0.030569076538085938 0.00093446844039135613 +4739 6 6.319568 0.31956815719604492 0.10212380709367608 +4740 5 5.16463041 0.16463041305541992 0.027103172902798178 +4741 6 6.012568 0.012567996978759766 0.0001579545480581146 +4742 6 6.012427 0.012426853179931641 0.00015442667995557713 +4744 5 5.40579844 0.40579843521118164 0.16467237001984358 +4745 3 5.750404 2.750403881072998 7.5647215090214104 +4747 6 6.406887 0.40688705444335938 0.1655570750735933 +4749 6 4.94821072 1.0517892837524414 1.1062606974164737 +4750 5 5.616849 0.61684894561767578 0.38050262170963833 +4751 6 5.60638952 0.39361047744750977 0.15492920795645659 +4753 6 6.76105976 0.76105976104736328 0.5792119598854697 +4755 6 6.18791866 0.18791866302490234 0.035313423913066799 +4760 6 5.879002 0.12099790573120117 0.014640493191336645 +4761 6 6.61741972 0.61741971969604492 0.38120711026954268 +4763 7 7.51052475 0.51052474975585938 0.26063552011328284 +4765 8 6.80642462 1.193575382232666 1.4246221930718548 +4767 7 5.490513 1.5094871520996094 2.2785514623537892 +4768 6 5.81628227 0.18371772766113281 0.033752203456970165 +4769 6 5.81628227 0.18371772766113281 0.033752203456970165 +4777 6 6.61448669 0.6144866943359375 0.37759389751590788 +4778 6 5.598406 0.40159416198730469 0.16127787094228552 +4779 4 4.22890425 0.22890424728393555 0.052397154424625114 +4780 5 5.38402939 0.38402938842773438 0.14747857117617968 +4781 5 5.58836842 0.58836841583251953 0.34617739274926862 +4782 6 5.827879 0.17212104797363281 0.029625655155541608 +4786 8 7.105712 0.89428806304931641 0.79975113971249812 +4787 8 6.78330564 1.2166943550109863 1.4803451535156 +4788 5 5.76242447 0.76242446899414063 0.5812910709209973 +4790 6 6.38086653 0.38086652755737305 0.1450593118136112 +4792 6 6.63710833 0.63710832595825195 0.40590701900532622 +4795 7 6.71729469 0.28270530700683594 0.079922290609829361 +4798 5 5.69227552 0.6922755241394043 0.47924540132248694 +4799 6 5.45217276 0.54782724380493164 0.30011468905490801 +4805 6 5.90260267 0.097397327423095703 0.0094862393891617103 +4806 6 5.250485 0.74951505661010742 0.56177282008525253 +4809 6 6.050518 0.050518035888671875 0.0025520719500491396 +4810 5 5.885007 0.88500690460205078 0.78323722119330341 +4814 6 6.350416 0.35041618347167969 0.12279150163885788 +4818 6 6.8706255 0.87062549591064453 0.75798875412965572 +4819 6 6.350416 0.35041618347167969 0.12279150163885788 +4820 5 5.317319 0.31731891632080078 0.10069129465500737 +4821 6 5.720231 0.27976894378662109 0.078270661907481553 +4823 7 6.112958 0.88704204559326172 0.7868435906502782 +4824 5 5.68046 0.68045997619628906 0.46302577920505428 +4825 6 5.996681 0.00331878662109375 1.101434463635087E-05 +4827 6 6.57971 0.57971000671386719 0.33606369188419194 +4831 6 5.615018 0.38498210906982422 0.14821122430385003 +4833 6 6.23332357 0.23332357406616211 0.054439890215007836 +4838 6 6.469409 0.46940898895263672 0.22034479890953662 +4840 7 6.805491 0.19450902938842773 0.037833762513628244 +4842 6 6.237228 0.2372279167175293 0.056277084470139016 +4843 5 6.383863 1.3838629722595215 1.9150767259909571 +4847 7 6.12764263 0.87235736846923828 0.76100737832257437 +4848 6 6.16121864 0.16121864318847656 0.02599145091153332 +4855 6 5.96981859 0.030181407928466797 0.00091091738454451843 +4857 6 5.92357826 0.076421737670898438 0.0058402819886396173 +4858 5 5.098244 0.098244190216064453 0.0096519209112102544 +4861 6 6.082398 0.082397937774658203 0.0067894201495164452 +4863 7 7.10627174 0.10627174377441406 0.011293683524854714 +4864 5 5.585732 0.58573198318481445 0.34308195612561576 +4865 6 6.84959269 0.84959268569946289 0.72180773159402634 +4868 6 6.06707 0.06707000732421875 0.0044983858824707568 +4870 7 6.40111876 0.59888124465942383 0.35865874520482066 +4873 6 6.464158 0.46415805816650391 0.21544270296089962 +4874 6 5.7968936 0.20310640335083008 0.04125221108211008 +4875 6 5.778002 0.22199821472167969 0.049283207339613 +4877 5 4.3623414 0.63765859603881836 0.40660848510219694 +4884 5 5.72053432 0.72053432464599609 0.51916971299306169 +4885 6 5.674971 0.32502889633178711 0.10564378345065961 +4890 6 6.390395 0.39039516448974609 0.15240838445697591 +4891 6 5.462591 0.53740882873535156 0.28880824920270243 +4892 5 6.01234436 1.0123443603515625 1.0248411039356142 +4893 6 6.095607 0.095606803894042969 0.0091406609508339898 +4895 6 5.20881939 0.79118061065673828 0.62596675867916929 +4897 6 5.75556135 0.24443864822387695 0.059750252745516264 +0 6 5.58289576 0.41710424423217773 0.17397595055649617 +1 6 5.33015347 0.66984653472900391 0.44869438008845464 +2 6 5.70412 0.29587984085083008 0.087544880221912535 +3 6 5.96136 0.038640022277832031 0.0014930513216313557 +4 6 5.96136 0.038640022277832031 0.0014930513216313557 +7 6 5.58289576 0.41710424423217773 0.17397595055649617 +12 5 6.31212759 1.3121275901794434 1.7216788129101133 +13 7 6.37878036 0.62121963500976563 0.38591383492166642 +14 5 5.109386 0.10938596725463867 0.011965289832232884 +15 7 6.31677771 0.68322229385375977 0.46679270281879326 +16 6 5.103471 0.89652919769287109 0.80376460231582314 +17 8 6.87536 1.1246399879455566 1.2648151024861818 +19 5 5.5723834 0.57238340377807617 0.32762276092057618 +22 8 6.29127455 1.7087254524230957 2.9197426717585131 +23 5 5.02370834 0.023708343505859375 0.0005620855517918244 +24 6 5.29549646 0.70450353622436523 0.4963252325526355 +26 6 6.15262365 0.15262365341186523 0.023293979580785162 +27 6 5.88923931 0.11076068878173828 0.012267930179405084 +29 7 6.59755468 0.40244531631469727 0.16196223262363674 +30 6 5.72036743 0.279632568359375 0.078194373287260532 +33 6 6.059624 0.059624195098876953 0.0035550446411889425 +34 5 5.379803 0.37980318069458008 0.14425045606571985 +36 5 5.22603941 0.22603940963745117 0.051093814709247454 +38 5 5.35056067 0.35056066513061523 0.12289277993681935 +39 5 5.35056067 0.35056066513061523 0.12289277993681935 +42 6 5.401128 0.59887218475341797 0.35864789367133199 +43 6 5.739065 0.26093482971191406 0.06808698535678559 +47 5 4.90973663 0.09026336669921875 0.0081474753678776324 +49 5 6.105748 1.105748176574707 1.2226790299982895 +53 6 6.438474 0.43847417831420898 0.19225960504832074 +55 6 5.841298 0.15870189666748047 0.025186292005855648 +57 6 5.543428 0.45657205581665039 0.20845804215264252 +58 6 5.454844 0.54515600204467773 0.29719506656533667 +59 6 6.401974 0.40197420120239258 0.16158325843230159 +61 6 5.543428 0.45657205581665039 0.20845804215264252 +62 5 5.132821 0.13282108306884766 0.01764144010758173 +65 5 5.030684 0.030683994293212891 0.00094150750578592124 +67 5 5.35860634 0.35860633850097656 0.12859850601307699 +75 5 5.270853 0.27085304260253906 0.07336137068705284 +78 5 5.718807 0.71880722045898438 0.51668382018397097 +80 6 6.57747 0.57746982574462891 0.33347139964553207 +81 6 6.31010628 0.31010627746582031 0.096165903323708335 +83 6 5.57204151 0.42795848846435547 0.18314846784869587 +84 5 5.23093128 0.23093128204345703 0.0533292570262347 +85 6 5.24266 0.7573399543762207 0.57356380649457606 +86 6 5.35685825 0.64314174652099609 0.41363130611807719 +87 6 5.65553427 0.34446573257446289 0.11865664091806138 +89 6 5.24266 0.7573399543762207 0.57356380649457606 +94 7 5.96693134 1.0330686569213867 1.0672308499133578 +101 5 5.630641 0.63064098358154297 0.39770805017269595 +103 5 5.20167637 0.20167636871337891 0.040673357697414758 +107 6 6.142988 0.14298820495605469 0.020445626756554702 +110 6 5.58482647 0.41517353057861328 0.17236906049311074 +114 5 5.187309 0.18730878829956055 0.03508458217424959 +116 6 6.17693758 0.17693758010864258 0.03130690725470231 +118 5 5.14454842 0.14454841613769531 0.020894244607916335 +119 5 5.04438543 0.044385433197021484 0.0019700666800872568 +124 6 5.616926 0.38307380676269531 0.14674554142766283 +126 5 5.909863 0.90986299514770508 0.82785066993915279 +127 7 6.253766 0.74623394012451172 0.55686509339375334 +130 5 4.510829 0.48917102813720703 0.23928829476881219 +134 5 5.024521 0.0245208740234375 0.00060127326287329197 +135 5 5.717012 0.71701192855834961 0.51410610569496384 +136 6 5.90298939 0.097010612487792969 0.0094110589352567331 +139 6 5.826573 0.17342710494995117 0.030076960731321378 +140 5 5.57194567 0.5719456672668457 0.32712184630531738 +142 6 6.106359 0.10635900497436523 0.011312237939137049 +143 6 5.740864 0.25913619995117188 0.06715157012513373 +146 6 5.35438347 0.64561653137207031 0.41682070558090345 +148 7 6.588247 0.41175317764282227 0.16954067929896155 +149 6 5.54737234 0.45262765884399414 0.20487179755059515 +153 5 6.004873 1.0048727989196777 1.0097693420086671 +155 6 6.044978 0.044978141784667969 0.0020230332384016947 +157 7 6.268512 0.73148822784423828 0.53507502747470426 +158 8 6.197546 1.8024539947509766 3.2488404031937534 +159 8 6.197546 1.8024539947509766 3.2488404031937534 +160 7 6.268512 0.73148822784423828 0.53507502747470426 +162 5 5.403021 0.40302085876464844 0.1624258125993947 +163 6 6.044978 0.044978141784667969 0.0020230332384016947 +165 5 5.61569548 0.61569547653198242 0.37908091982194492 +166 6 5.592527 0.40747308731079102 0.16603431688258752 +168 5 5.02263451 0.022634506225585938 0.00051232087207608856 +170 6 6.00712061 0.0071206092834472656 5.0703076567515382E-05 +172 4 4.794153 0.79415321350097656 0.63067932651392766 +175 6 6.07389736 0.073897361755371094 0.0054608200744041824 +178 4 4.40795135 0.40795135498046875 0.16642430803040043 +182 5 5.4483614 0.44836139678955078 0.201027942131077 +184 5 5.538105 0.53810501098632813 0.28955700284859631 +185 5 5.6508255 0.65082550048828125 0.42357383208582178 +186 6 5.94136524 0.058634757995605469 0.0034380348452032194 +190 6 5.13912439 0.86087560653686523 0.7411068099302156 +193 5 6.05295324 1.0529532432556152 1.1087105324825188 +194 5 5.24736834 0.24736833572387695 0.061191093518800699 +195 6 5.170604 0.82939577102661133 0.68789734499682709 +197 5 5.028246 0.028245925903320313 0.00079783233013586141 +200 5 5.404038 0.4040379524230957 0.16324666699824775 +203 6 6.53488255 0.53488254547119141 0.28609933744974114 +208 5 5.381865 0.38186502456665039 0.14582089698728851 +213 6 5.96111059 0.038889408111572266 0.0015123860632684227 +214 7 6.242515 0.75748491287231445 0.57378339322917782 +215 5 5.28750134 0.28750133514404297 0.082657017709607317 +217 5 5.28750134 0.28750133514404297 0.082657017709607317 +220 5 5.716736 0.71673583984375 0.51371026411652565 +221 6 5.08587837 0.91412162780761719 0.8356183504256478 +222 7 6.242515 0.75748491287231445 0.57378339322917782 +224 6 5.92879 0.071209907531738281 0.0050708509306787164 +225 5 5.738681 0.73868083953857422 0.54564938270141283 +227 6 5.37215567 0.62784433364868164 0.39418850729475707 +229 5 5.738681 0.73868083953857422 0.54564938270141283 +230 4 4.821786 0.82178592681884766 0.67533210951751244 +231 6 5.877407 0.12259292602539063 0.015029025511466898 +232 6 5.765742 0.23425817489624023 0.054876892505717478 +234 6 6.02762 0.027619838714599609 0.0007628554906204954 +235 6 6.02762 0.027619838714599609 0.0007628554906204954 +236 6 6.02762 0.027619838714599609 0.0007628554906204954 +238 7 6.67725468 0.32274532318115234 0.10416454363530647 +243 6 5.970998 0.029002189636230469 0.00084112700369587401 +245 6 5.6585145 0.34148550033569336 0.11661234693951883 +251 3 5.30328751 2.3032875061035156 5.3051333357725525 +253 3 5.191571 2.1915712356567383 4.8029844809580027 +255 8 5.873038 2.1269621849060059 4.5239681360201303 +256 7 6.39684772 0.60315227508544922 0.36379266694075341 +261 5 5.67542458 0.67542457580566406 0.45619835760226124 +263 6 5.66006374 0.33993625640869141 0.11555665842115559 +264 6 5.546553 0.45344686508178711 0.20561405945250044 +265 5 5.67542458 0.67542457580566406 0.45619835760226124 +266 6 5.002925 0.99707508087158203 0.99415871689507185 +270 6 5.002925 0.99707508087158203 0.99415871689507185 +273 5 5.215361 0.21536111831665039 0.046380411282598288 +274 5 5.734063 0.73406314849853516 0.53884870598358248 +281 8 6.663667 1.3363327980041504 1.7857853470216014 +282 4 5.0554595 1.0554594993591309 1.1139947547874272 +286 6 5.21452475 0.78547525405883789 0.61697137473879593 +287 7 6.53254032 0.46745967864990234 0.21851855116346997 +289 7 6.53254032 0.46745967864990234 0.21851855116346997 +292 5 5.402362 0.40236186981201172 0.16189507427861827 +294 3 4.562488 1.5624880790710449 2.4413689972391239 +295 6 5.045992 0.95400810241699219 0.91013145947727025 +298 6 5.77189255 0.22810745239257813 0.052033009837032296 +302 6 6.09933758 0.099337577819824219 0.0098679543671096326 +305 6 5.46788454 0.53211545944213867 0.28314686217731833 +306 5 5.295121 0.29512119293212891 0.087096518517682853 +307 6 5.46788454 0.53211545944213867 0.28314686217731833 +310 7 6.4347477 0.56525230407714844 0.31951016726452508 +313 6 5.421862 0.57813787460327148 0.33424340205078806 +315 6 5.478924 0.52107620239257813 0.27152040869987104 +318 7 6.748587 0.25141286849975586 0.063208430447275532 +320 7 5.75241947 1.2475805282592773 1.5564571744916975 +322 6 6.058367 0.058366775512695313 0.0034066804837493692 +324 5 4.546028 0.45397186279296875 0.20609045220771804 +325 5 4.917919 0.082080841064453125 0.0067372644698480144 +326 6 5.749149 0.25085115432739258 0.062926301627385328 +330 8 6.98020029 1.0197997093200684 1.0399914471292959 +334 5 6.214921 1.2149209976196289 1.4760330304570743 +335 6 6.24653053 0.24653053283691406 0.060777303620852763 +337 6 5.20219231 0.79780769348144531 0.6364971157781838 +339 7 6.743009 0.25699090957641602 0.066044327604913633 +340 7 5.70599937 1.2940006256103516 1.6744376190799812 +341 6 5.213163 0.78683710098266602 0.61911262348280616 +342 6 5.38700151 0.61299848556518555 0.37576714330521099 +345 6 5.97763968 0.022360324859619141 0.00049998412782770174 +351 7 6.794541 0.2054591178894043 0.042213449123892133 +356 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +357 6 5.097309 0.90269088745117188 0.81485083828738425 +359 6 5.955685 0.044314861297607422 0.0019638069318261842 +362 6 6.04658127 0.046581268310546875 0.0021698145574191585 +363 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +364 7 6.6094327 0.39056730270385742 0.15254281794136659 +365 7 6.87111664 0.12888336181640625 0.016610920953098685 +367 6 5.37173843 0.62826156616210938 0.39471259551646654 +369 5 5.892208 0.89220809936523438 0.79603529257292394 +372 5 4.765526 0.23447418212890625 0.054978142085019499 +374 7 6.53566933 0.46433067321777344 0.2156029740908707 +375 7 6.53566933 0.46433067321777344 0.2156029740908707 +380 7 5.85971642 1.1402835845947266 1.3002466532961989 +382 6 5.252193 0.74780702590942383 0.55921534799949768 +385 7 6.53566933 0.46433067321777344 0.2156029740908707 +386 7 6.42074728 0.57925271987915039 0.33553371348739347 +390 7 5.82244158 1.177558422088623 1.3866438374318477 +393 6 6.1026063 0.10260629653930664 0.01052805208951213 +394 5 5.14353275 0.14353275299072266 0.020601651181095804 +397 6 6.52884865 0.52884864807128906 0.27968089256683015 +400 6 6.52884865 0.52884864807128906 0.27968089256683015 +401 5 5.14353275 0.14353275299072266 0.020601651181095804 +402 5 4.94096375 0.0590362548828125 0.0034852793905884027 +403 5 5.666886 0.6668858528137207 0.44473674068308355 +405 5 5.10803747 0.10803747177124023 0.011672095306721531 +407 5 5.069229 0.0692291259765625 0.0047926718834787607 +408 6 6.01091671 0.010916709899902344 0.00011917455503862584 +410 6 5.872228 0.12777185440063477 0.01632564677697701 +411 6 5.823905 0.17609500885009766 0.031009452141915972 +412 5 5.69728041 0.6972804069519043 0.48619996591901327 +417 5 5.06454945 0.064549446105957031 0.0041666309925858513 +420 7 6.685552 0.31444787979125977 0.098877469105218552 +421 6 5.986877 0.013123035430908203 0.00017221405892087205 +424 7 5.922215 1.0777850151062012 1.1616205387874743 +425 6 5.986877 0.013123035430908203 0.00017221405892087205 +426 6 5.986877 0.013123035430908203 0.00017221405892087205 +427 5 5.250166 0.25016593933105469 0.062582997201388935 +431 5 4.95284557 0.047154426574707031 0.0022235399455894367 +432 7 6.270196 0.72980403900146484 0.53261393534285162 +433 4 5.13603973 1.1360397338867188 1.2905862769694068 +435 7 6.93598032 0.064019680023193359 0.0040985194302720629 +437 8 6.529011 1.4709892272949219 2.1638093068177113 +438 7 6.270196 0.72980403900146484 0.53261393534285162 +443 6 5.58504343 0.41495656967163086 0.17218895471364704 +444 6 5.70104074 0.29895925521850586 0.089376636280803723 +445 3 5.536319 2.5363187789916992 6.432912948665944 +446 5 6.67247 1.6724700927734375 2.7971562112215906 +447 6 5.70106936 0.29893064498901367 0.089359530513547725 +448 6 5.70106936 0.29893064498901367 0.089359530513547725 +458 6 5.050184 0.94981622695922852 0.90215086499506469 +459 5 4.837731 0.16226911544799805 0.026331265828275718 +460 5 5.73105049 0.73105049133300781 0.53443482087823213 +461 5 5.95119953 0.95119953155517578 0.90478054883078585 +462 5 5.154207 0.15420722961425781 0.023779869665304432 +463 6 5.12796068 0.8720393180847168 0.76045257228565788 +468 5 5.164256 0.16425609588623047 0.026980065035786538 +469 5 5.38181925 0.38181924819946289 0.14578593829560305 +470 6 5.00187445 0.99812555313110352 0.99625461981327135 +471 5 5.26753426 0.26753425598144531 0.071574578123545507 +472 6 6.08648539 0.086485385894775391 0.0074797219733682141 +473 7 6.078559 0.92144107818603516 0.84905366056864295 +475 5 6.01866531 1.0186653137207031 1.0376790213776985 +476 7 6.40013742 0.59986257553100586 0.35983510952269171 +477 6 6.20083 0.20082998275756836 0.040332681974405205 +478 6 5.15129375 0.84870624542236328 0.72030229101892473 +479 6 6.16166544 0.16166543960571289 0.026135714362908402 +481 6 6.04767036 0.047670364379882813 0.0022724636401108 +485 6 6.47117424 0.47117424011230469 0.22200516454540775 +486 6 5.911162 0.088838100433349609 0.0078922080886059121 +488 6 5.887391 0.11260890960693359 0.012680766522862541 +490 6 6.33496237 0.33496236801147461 0.11219978798385455 +491 7 6.21005774 0.78994226455688477 0.62400878133325932 +494 6 6.653475 0.65347480773925781 0.42702932434985996 +496 4 5.23894358 1.2389435768127441 1.534981186525556 +498 5 5.103715 0.10371494293212891 0.010756789387414756 +499 4 5.23894358 1.2389435768127441 1.534981186525556 +500 6 5.311577 0.68842315673828125 0.47392644273350015 +503 5 5.137176 0.1371760368347168 0.018817265081679579 +505 6 6.13015556 0.13015556335449219 0.01694047067212523 +506 5 4.47576427 0.52423572540283203 0.27482309578863351 +508 6 6.28651571 0.28651571273803711 0.0820912536457854 +509 7 5.931798 1.068202018737793 1.1410555528354962 +511 6 5.925795 0.074204921722412109 0.0055063704078293085 +512 6 6.149516 0.14951610565185547 0.022355065849296807 +515 6 5.6218214 0.37817859649658203 0.14301905084812461 +516 5 6.00719738 1.007197380065918 1.0144465624116492 +518 6 6.805467 0.80546712875366211 0.64877729550266849 +524 5 4.9252224 0.074777603149414063 0.0055916899327712599 +525 6 5.24856 0.75144004821777344 0.56466214606552967 +526 4 6.14279747 2.1427974700927734 4.5915809978359903 +530 6 6.371907 0.37190723419189453 0.13831499084426468 +536 5 5.10018253 0.10018253326416016 0.010036539971224556 +537 6 5.88101053 0.11898946762084961 0.014158493404693218 +542 6 4.932093 1.0679068565368652 1.1404250542384489 +543 6 6.03408527 0.034085273742675781 0.0011618058861131431 +545 6 6.42284536 0.42284536361694336 0.17879820153234505 +550 7 5.2345643 1.7654356956481934 3.1167631954688204 +551 7 5.86865425 1.1313457489013672 1.2799432035571954 +552 7 6.50745964 0.49254035949707031 0.24259600573350326 +553 7 5.2345643 1.7654356956481934 3.1167631954688204 +554 7 6.50745964 0.49254035949707031 0.24259600573350326 +555 7 5.86865425 1.1313457489013672 1.2799432035571954 +556 5 4.872683 0.12731695175170898 0.016209606203346993 +562 6 5.048077 0.95192289352416992 0.90615719521542815 +564 5 5.479501 0.47950077056884766 0.22992098897611868 +567 5 5.58539 0.58539009094238281 0.34268155857353122 +568 6 5.553329 0.4466710090637207 0.19951499033800246 +570 5 5.11044836 0.11044836044311523 0.012198840324572302 +571 7 6.777907 0.22209310531616211 0.049325347428975874 +572 5 5.358643 0.3586430549621582 0.12862484087258963 +573 7 6.902201 0.097798824310302734 0.0095646100364774611 +574 7 6.177025 0.82297515869140625 0.6772881118231453 +575 6 5.791957 0.20804309844970703 0.043281930812554492 +576 6 5.791957 0.20804309844970703 0.043281930812554492 +579 7 6.542046 0.45795392990112305 0.20972180191188272 +580 5 5.11044836 0.11044836044311523 0.012198840324572302 +583 6 5.35542774 0.64457225799560547 0.41547339577755338 +585 6 5.35542774 0.64457225799560547 0.41547339577755338 +587 7 6.5687685 0.43123149871826172 0.18596060548679816 +588 7 7.028516 0.028515815734863281 0.0008131517470246763 +589 6 5.828428 0.17157220840454102 0.029437022696811255 +591 6 6.46318531 0.46318531036376953 0.21454063173678151 +592 5 5.396524 0.39652395248413086 0.15723124489363727 +595 7 5.208214 1.7917861938476563 3.2104977644630708 +596 5 5.396524 0.39652395248413086 0.15723124489363727 +597 6 6.225943 0.22594308853149414 0.051050279255150599 +598 8 6.305187 1.6948127746582031 2.8723903411446372 +599 7 5.93457365 1.0654263496398926 1.1351333065069866 +601 6 6.00369453 0.0036945343017578125 1.3649583706865087E-05 +603 5 4.94606066 0.053939342498779297 0.0029094526692006184 +605 6 5.596465 0.40353488922119141 0.16284040681875922 +608 5 5.19934368 0.19934368133544922 0.039737903288369125 +610 8 7.12691069 0.87308931350708008 0.76228494936026436 +611 6 5.7924037 0.2075963020324707 0.0430962246175568 +615 5 5.39173031 0.39173030853271484 0.15345263462313596 +616 7 6.271933 0.72806692123413086 0.53008144179534611 +620 5 5.06031942 0.060319423675537109 0.0036384328725489468 +623 5 5.17006063 0.17006063461303711 0.028920619444988915 +625 8 6.47763872 1.5223612785339355 2.3175838623794789 +626 4 4.67777538 0.67777538299560547 0.45937946979483968 +628 6 5.57972527 0.42027473449707031 0.17663085245658294 +630 5 6.085581 1.0855808258056641 1.1784857293569075 +631 5 6.085581 1.0855808258056641 1.1784857293569075 +632 6 6.34318829 0.34318828582763672 0.11777819952931168 +635 6 5.886408 0.11359214782714844 0.012903176047984743 +636 7 6.597964 0.40203619003295898 0.16163309809621751 +637 5 5.137594 0.13759422302246094 0.018932170209154719 +640 7 6.2694006 0.73059940338134766 0.53377548822118115 +643 5 5.46275139 0.46275138854980469 0.21413884760477231 +646 4 4.810526 0.81052589416503906 0.6569522251120361 +647 6 5.254026 0.74597406387329102 0.55647730397163286 +648 5 5.21467161 0.21467161178588867 0.046083900906751296 +650 7 6.55360842 0.44639158248901367 0.1992654449170459 +651 7 6.55360842 0.44639158248901367 0.1992654449170459 +655 6 6.979067 0.97906684875488281 0.95857189433081658 +658 5 5.783849 0.78384876251220703 0.61441888249191834 +659 4 4.837211 0.83721113204956055 0.70092247962770671 +662 4 4.75797558 0.75797557830810547 0.57452697731150693 +663 5 5.03337 0.033370018005371094 0.001113558101678791 +664 6 5.933576 0.066423892974853516 0.0044121335579347942 +666 6 6.59370661 0.59370660781860352 0.35248753616747308 +667 6 5.933576 0.066423892974853516 0.0044121335579347942 +669 5 5.512285 0.51228523254394531 0.26243615948260413 +671 6 6.38181257 0.38181257247924805 0.14578084050322104 +672 8 6.718115 1.2818851470947266 1.6432295303420688 +673 6 6.24267769 0.24267768859863281 0.058892460543574998 +674 5 5.43839359 0.43839359283447266 0.1921889422383174 +675 6 4.94588137 1.0541186332702637 1.1111660930075686 +676 6 4.91327667 1.0867233276367188 1.1809675908298232 +677 7 6.845388 0.15461206436157227 0.023904890446146965 +684 5 5.50572443 0.50572443008422852 0.25575719918401774 +686 7 6.338226 0.6617741584777832 0.43794503682897812 +687 4 4.83409 0.83409023284912109 0.69570651653430104 +690 4 6.03202963 2.0320296287536621 4.1291444121327459 +695 5 5.266163 0.26616287231445313 0.070842674598679878 +699 5 5.75083971 0.7508397102355957 0.56376027046667332 +701 7 7.302115 0.30211496353149414 0.091273451189636035 +703 6 5.64697838 0.35302162170410156 0.12462426539059379 +708 6 6.142319 0.1423192024230957 0.02025475537834609 +709 5 5.07981443 0.079814434051513672 0.0063703438829634251 +710 5 5.186609 0.18660879135131836 0.03482284100959987 +713 5 5.75211859 0.75211858749389648 0.56568236965381402 +715 7 6.74210548 0.25789451599121094 0.066509581378340954 +716 6 5.201803 0.79819679260253906 0.63711811972098076 +717 5 5.72647953 0.72647953033447266 0.52777250799499598 +730 6 6.32876348 0.32876348495483398 0.10808542903964735 +731 6 5.886897 0.11310291290283203 0.012792268907105608 +733 6 5.84083 0.15917015075683594 0.02533513689195388 +734 5 5.29676867 0.2967686653137207 0.088071640712087174 +736 6 5.84083 0.15917015075683594 0.02533513689195388 +737 5 5.29676867 0.2967686653137207 0.088071640712087174 +739 6 5.71197033 0.28802967071533203 0.082961091212382598 +740 3 5.478546 2.478546142578125 6.1431909808889031 +741 6 6.318698 0.31869792938232422 0.10156837019258091 +742 6 6.342546 0.34254598617553711 0.11733775264497126 +743 5 5.46122837 0.46122837066650391 0.21273160990767792 +744 5 5.2266674 0.22666740417480469 0.051378112115344265 +745 6 7.068423 1.068422794342041 1.1415272674696553 +746 6 5.776893 0.22310686111450195 0.049776671476365664 +747 6 6.22603226 0.22603225708007813 0.051090581240714528 +748 6 6.02232647 0.022326469421386719 0.0004984712368241162 +750 6 6.22603226 0.22603225708007813 0.051090581240714528 +751 6 5.94263268 0.057367324829101563 0.0032910099580476526 +753 6 5.776893 0.22310686111450195 0.049776671476365664 +754 5 4.951338 0.048662185668945313 0.0023680083140789066 +755 7 6.66953325 0.33046674728393555 0.10920827106042452 +756 5 5.26670647 0.26670646667480469 0.071132339366158703 +759 7 6.447287 0.55271291732788086 0.30549156898109686 +762 5 5.25446272 0.25446271896362305 0.064751275342359804 +763 6 5.75677967 0.24322032928466797 0.059156128577342315 +766 5 5.064814 0.064814090728759766 0.0042008663569959026 +767 6 5.377497 0.62250280380249023 0.38750974074196165 +768 7 5.636545 1.3634548187255859 1.8590090427060204 +769 7 5.636545 1.3634548187255859 1.8590090427060204 +771 7 5.73526955 1.2647304534912109 1.5995431199880841 +772 7 5.55488348 1.4451165199279785 2.0883617561687515 +775 6 6.36388731 0.36388731002807617 0.13241397439946923 +776 6 5.966575 0.033424854278564453 0.0011172208835432684 +777 5 5.746976 0.74697589874267578 0.55797299330242822 +787 6 5.64129162 0.35870838165283203 0.1286717030679938 +789 6 5.627616 0.37238407135009766 0.13866989659527462 +790 6 5.64129162 0.35870838165283203 0.1286717030679938 +791 7 6.673766 0.32623386383056641 0.10642853390982054 +793 7 6.673766 0.32623386383056641 0.10642853390982054 +796 6 5.34205 0.65794992446899414 0.43289810310875509 +797 6 5.96610975 0.033890247344970703 0.0011485488651032938 +798 6 5.429145 0.57085514068603516 0.32587559164767299 +800 6 5.14655 0.85344982147216797 0.72837659777087538 +801 5 5.268791 0.26879119873046875 0.072248708514962345 +803 7 5.87979031 1.1202096939086914 1.2548697583270041 +804 6 5.493222 0.50677776336669922 0.25682370144295419 +805 6 5.14655 0.85344982147216797 0.72837659777087538 +807 6 5.285724 0.71427583694458008 0.51018997124288035 +808 6 5.1317997 0.86820030212402344 0.75377176460824558 +809 6 5.285931 0.71406888961791992 0.50989437912016911 +811 6 5.13246775 0.86753225326538086 0.75261221045570892 +812 7 4.98973751 2.0102624893188477 4.0411552759624101 +813 6 5.52920055 0.47079944610595703 0.22165211845367594 +814 6 4.9766 1.023399829864502 1.0473472117666915 +815 5 5.0497756 0.049775600433349609 0.0024776103985004738 +818 5 5.0497756 0.049775600433349609 0.0024776103985004738 +820 9 6.84990168 2.1500983238220215 4.6229228021022664 +822 5 6.04735231 1.0473523139953613 1.0969468696314379 +823 6 6.01296329 0.012963294982910156 0.00016804701681394363 +824 5 5.36770439 0.36770439147949219 0.13520651951330365 +825 6 5.936046 0.063953876495361328 0.0040900983187839302 +828 7 6.322937 0.67706298828125 0.45841429010033607 +830 6 5.498639 0.50136089324951172 0.25136274527994829 +831 4 6.24087048 2.240870475769043 5.021500489173377 +832 8 7.105262 0.89473819732666016 0.80055644175536145 +833 6 6.312468 0.31246805191040039 0.097636283464680673 +834 6 5.498639 0.50136089324951172 0.25136274527994829 +835 8 6.844221 1.1557788848876953 1.3358248307522445 +837 8 7.18123341 0.81876659393310547 0.67037873534081882 +839 7 6.57121944 0.42878055572509766 0.18385276496792358 +842 7 6.47577953 0.52422046661376953 0.27480709761675826 +843 7 6.238966 0.76103401184082031 0.57917276717853383 +844 8 6.69551563 1.3044843673706055 1.7016794647142888 +846 5 5.71414852 0.71414852142333984 0.51000811065114249 +847 5 5.787212 0.78721189498901367 0.61970256761219389 +849 6 6.185082 0.18508195877075195 0.034255331462418326 +852 7 6.56788826 0.43211174011230469 0.18672055594288395 +853 5 5.15344524 0.15344524383544922 0.023545442855720466 +857 5 5.152636 0.15263605117797852 0.023297764119206477 +865 6 6.67667437 0.67667436599731445 0.45788819759786747 +866 7 6.56788826 0.43211174011230469 0.18672055594288395 +867 8 6.099201 1.9007987976074219 3.6130360689858207 +868 7 5.922011 1.0779891014099121 1.1620605027585498 +869 6 6.14752531 0.14752531051635742 0.021763717242947678 +873 3 5.358975 2.3589749336242676 5.5647627374676176 +875 7 5.889844 1.1101560592651367 1.2324464759230978 +877 6 5.43060732 0.56939268112182617 0.32420802531510162 +878 6 5.736863 0.26313686370849609 0.069241009042343649 +879 8 6.83100033 1.1689996719360352 1.3665602329865578 +880 7 5.889844 1.1101560592651367 1.2324464759230978 +882 6 6.42099428 0.42099428176879883 0.17723618528202678 +883 6 6.42099428 0.42099428176879883 0.17723618528202678 +884 6 6.170308 0.17030811309814453 0.029004853387050389 +886 6 5.88422441 0.11577558517456055 0.013403986122511924 +889 7 7.024262 0.024261951446533203 0.00058864228799393459 +891 7 6.097072 0.90292787551879883 0.81527874838889147 +892 5 6.012046 1.0120458602905273 1.0242368233311936 +893 7 6.14825344 0.85174655914306641 0.72547220101205312 +894 7 6.097072 0.90292787551879883 0.81527874838889147 +897 6 5.666549 0.3334507942199707 0.11118943216592925 +899 6 6.04876375 0.048763751983642578 0.0023779035075222055 +901 6 5.33798742 0.66201257705688477 0.43826065218149779 +903 6 5.26283264 0.7371673583984375 0.5434157142881304 +905 4 5.24363136 1.2436313629150391 1.5466189668259176 +907 8 6.86781025 1.1321897506713867 1.2818536315253368 +909 5 6.248672 1.2486720085144043 1.5591817848473966 +911 5 5.25836658 0.25836658477783203 0.066753292129760666 +913 5 4.977968 0.022031784057617188 0.00048539950876147486 +915 5 4.99300337 0.0069966316223144531 4.8952854058370576E-05 +916 7 6.15890551 0.8410944938659668 0.70743994761164686 +917 6 5.846199 0.15380096435546875 0.023654736636672169 +922 6 5.560354 0.43964576721191406 0.19328840062735253 +923 6 5.761621 0.23837900161743164 0.056824548412123477 +928 5 5.72981834 0.72981834411621094 0.53263481540852808 +929 5 5.295482 0.29548215866088867 0.087309706086898586 +931 5 5.389781 0.38978099822998047 0.15192922658116004 +932 6 5.69497633 0.3050236701965332 0.093039439380163458 +933 5 5.538747 0.53874683380126953 0.29024815093089273 +939 7 5.803188 1.1968121528625488 1.4323593292394889 +941 6 5.732951 0.26704883575439453 0.071315080677777587 +942 7 5.749693 1.2503070831298828 1.5632678021247557 +943 7 6.44949245 0.55050754547119141 0.30305855762071587 +945 7 6.4388504 0.56114959716796875 0.3148888704017736 +946 5 5.1143384 0.11433839797973633 0.013073269252572572 +947 5 5.71162844 0.71162843704223633 0.50641503240717611 +948 4 4.53004 0.53003978729248047 0.28094217611305794 +949 5 5.905949 0.90594911575317383 0.82074380033395755 +951 6 5.823733 0.17626714706420898 0.031070107134155478 +952 6 6.14641857 0.14641857147216797 0.02143839807195036 +954 6 5.823733 0.17626714706420898 0.031070107134155478 +957 7 6.496833 0.50316715240478516 0.25317718325914029 +961 7 7.02436543 0.024365425109863281 0.00059367394078435609 +962 6 5.981644 0.018355846405029297 0.00033693709724502696 +963 6 6.624413 0.62441301345825195 0.38989161137601513 +966 6 5.28590059 0.71409940719604492 0.50993796335774277 +967 6 5.76070356 0.23929643630981445 0.057262784430577085 +973 7 6.95576334 0.044236660003662109 0.001956882088279599 +975 5 5.028304 0.028304100036621094 0.0008011220788830542 +977 5 6.259195 1.2591948509216309 1.5855716725875482 +978 7 6.75888824 0.24111175537109375 0.058134878578130156 +979 5 5.79845238 0.79845237731933594 0.63752619884689921 +981 7 6.75888824 0.24111175537109375 0.058134878578130156 +984 5 6.57471 1.5747098922729492 2.4797112448222833 +987 6 5.45699358 0.54300642013549805 0.29485597230836902 +988 5 6.57471 1.5747098922729492 2.4797112448222833 +990 6 5.941643 0.058356761932373047 0.003405511663231664 +991 4 4.65947 0.6594700813293457 0.43490078816853384 +993 4 5.050729 1.0507287979125977 1.1040310067628525 +996 5 4.98931551 0.010684490203857422 0.00011415833091632521 +1000 7 5.531526 1.4684739112854004 2.156415628125842 +1001 5 5.625949 0.62594890594482422 0.3918120328535224 +1003 7 5.821002 1.1789979934692383 1.39003626860449 +1005 6 6.94355631 0.94355630874633789 0.89029850777501451 +1008 7 5.755313 1.2446870803833008 1.5492459280731055 +1009 6 5.539026 0.46097421646118164 0.21249722824200035 +1010 6 5.8711915 0.12880849838256836 0.016591629255572116 +1011 7 6.22115 0.77885007858276367 0.60660744490837715 +1012 6 5.37709761 0.62290239334106445 0.38800739163002618 +1013 5 5.706299 0.706298828125 0.49885803461074829 +1014 5 6.018917 1.0189170837402344 1.0381920235377038 +1019 6 5.86288 0.13711977005004883 0.018801831338578268 +1020 7 6.04661751 0.95338249206542969 0.9089381761768891 +1022 8 6.47417259 1.5258274078369141 2.3281492785063165 +1023 6 5.778368 0.22163200378417969 0.049120745101390639 +1024 6 6.23468876 0.23468875885009766 0.055078813530599291 +1028 7 6.22779942 0.77220058441162109 0.59629374256564915 +1029 4 5.16414261 1.1641426086425781 1.3552280132571468 +1031 6 5.641769 0.3582310676574707 0.12832949783501135 +1035 6 6.0397377 0.039737701416015625 0.0015790849138284102 +1036 5 6.4997263 1.4997262954711914 2.2491789613277433 +1038 7 6.298605 0.70139503479003906 0.49195499482812011 +1041 5 5.75377655 0.75377655029296875 0.56817908777156845 +1042 4 5.44314528 1.4431452751159668 2.0826682850895395 +1043 5 5.344182 0.34418201446533203 0.11846125908141403 +1046 5 5.74131536 0.74131536483764648 0.54954847014437291 +1048 5 4.73738956 0.26261043548583984 0.068964240826062451 +1050 5 5.55853367 0.55853366851806641 0.31195985886824928 +1055 5 5.41344547 0.41344547271728516 0.17093715891041938 +1056 6 6.15539265 0.15539264678955078 0.024146874676262087 +1057 5 5.06872654 0.068726539611816406 0.0047233372470145696 +1062 5 5.54800034 0.54800033569335938 0.30030436792003457 +1063 5 5.465916 0.46591615676879883 0.21707786513820793 +1066 6 5.303662 0.69633817672729492 0.48488685636789342 +1067 7 6.23767567 0.76232433319091797 0.58113838897497772 +1070 7 5.98001146 1.0199885368347168 1.0403766152742264 +1073 5 5.61771059 0.61771059036254883 0.3815663734460486 +1078 5 5.622996 0.62299585342407227 0.38812383338358813 +1081 6 5.522897 0.47710323333740234 0.22762749526100379 +1087 8 6.06489849 1.9351015090942383 3.7446178504987984 +1089 7 5.919071 1.0809288024902344 1.1684070760529721 +1093 7 5.85336637 1.1466336250305176 1.3147686700506256 +1096 6 6.022913 0.022912979125976563 0.00052500461242743768 +1097 7 6.048806 0.95119380950927734 0.90476966324877139 +1102 5 6.4617486 1.4617486000061035 2.1367089696198036 +1104 5 5.21519136 0.21519136428833008 0.046307323264272782 +1105 7 6.68964672 0.31035327911376953 0.096319157856669335 +1106 8 7.11303139 0.88696861267089844 0.78671331986333826 +1107 7 6.73190355 0.2680964469909668 0.07187570488918027 +1108 7 6.457533 0.54246711730957031 0.29427057336215512 +1109 4 5.380625 1.3806247711181641 1.9061247586250829 +1110 7 6.73190355 0.2680964469909668 0.07187570488918027 +1111 6 6.65884066 0.65884065628051758 0.43407101036814311 +1113 5 6.05984068 1.0598406791687012 1.1232622652207738 +1114 4 4.139369 0.13936901092529297 0.019423721206294431 +1115 8 5.95124435 2.0487556457519531 4.1973996960005024 +1116 5 4.5486455 0.4513545036315918 0.20372088794852061 +1117 5 5.65911961 0.65911960601806641 0.43443865503741108 +1118 5 4.5486455 0.4513545036315918 0.20372088794852061 +1120 6 6.233022 0.23302221298217773 0.054299351743111401 +1121 6 5.3402257 0.6597743034362793 0.43530213147482755 +1123 5 5.054469 0.054469108581542969 0.0029668837896679179 +1124 5 5.44738436 0.44738435745239258 0.20015276329309017 +1127 7 6.207802 0.79219818115234375 0.62757795822108164 +1128 5 5.9157033 0.91570329666137695 0.83851252751651373 +1131 6 5.68809128 0.31190872192382813 0.09728705081215594 +1132 5 5.68820238 0.6882023811340332 0.4736225173985531 +1139 5 6.475313 1.4753131866455078 2.176548998690123 +1142 5 5.302902 0.3029022216796875 0.091749755898490548 +1145 5 5.27104568 0.27104568481445313 0.073465763256535865 +1149 5 5.626558 0.62655782699584961 0.39257471056976101 +1150 5 5.44962835 0.44962835311889648 0.20216565592841107 +1152 4 4.617794 0.61779403686523438 0.38166947198624257 +1154 4 5.561507 1.5615072250366211 2.4383048138415688 +1156 6 5.28412676 0.71587324142456055 0.51247449778770715 +1157 6 5.28412676 0.71587324142456055 0.51247449778770715 +1160 6 6.12439537 0.12439537048339844 0.015474208197701955 +1161 6 5.28412676 0.71587324142456055 0.51247449778770715 +1162 7 5.895931 1.1040692329406738 1.2189688711262079 +1163 6 5.38675928 0.61324071884155273 0.37606417924530433 +1167 6 5.6267643 0.37323570251464844 0.13930488963160315 +1171 5 4.62260342 0.37739658355712891 0.14242818128059298 +1172 6 6.08686447 0.086864471435546875 0.007545436397776939 +1173 5 6.14243841 1.1424384117126465 1.3051655245565144 +1176 7 5.70132732 1.2986726760864258 1.6865507196134786 +1178 5 4.72919655 0.27080345153808594 0.073334509364940459 +1179 5 5.89185 0.89184999465942383 0.79539641297401431 +1180 5 4.62260342 0.37739658355712891 0.14242818128059298 +1183 6 6.31216526 0.31216526031494141 0.097447149747495132 +1185 5 5.091198 0.091197967529296875 0.0083170692814746872 +1188 6 5.85175133 0.14824867248535156 0.021977668893669033 +1189 5 4.64966965 0.35033035278320313 0.12273135608120356 +1190 6 6.08686447 0.086864471435546875 0.007545436397776939 +1192 6 5.676918 0.32308197021484375 0.10438195947790518 +1193 7 5.63304329 1.3669567108154297 1.8685706492433383 +1194 6 5.49325037 0.50674962997436523 0.25679518747915608 +1196 7 6.384342 0.61565780639648438 0.37903453457693104 +1197 7 5.63304329 1.3669567108154297 1.8685706492433383 +1203 6 5.79636669 0.20363330841064453 0.041466524294264673 +1205 5 4.809882 0.19011783599853516 0.03614479156476591 +1209 6 6.37570572 0.37570571899414063 0.14115478728490416 +1211 5 5.21409225 0.21409225463867188 0.045835493496269919 +1215 5 5.92623568 0.92623567581176758 0.85791252714648181 +1217 5 4.785647 0.21435308456420898 0.045947244862190928 +1219 8 6.444028 1.5559720993041992 2.4210491738131168 +1222 6 5.445072 0.55492782592773438 0.30794489198888186 +1223 5 5.92623568 0.92623567581176758 0.85791252714648181 +1224 7 6.926713 0.073287010192871094 0.0053709858630099916 +1225 6 6.43942976 0.43942975997924805 0.19309851395541955 +1226 7 6.926713 0.073287010192871094 0.0053709858630099916 +1227 5 5.9939723 0.9939723014831543 0.98798093611571858 +1228 6 5.81761837 0.18238162994384766 0.033263058940974588 +1230 6 5.57155275 0.42844724655151367 0.18356704307757354 +1235 5 5.28322 0.28321981430053711 0.080213463212430725 +1236 6 6.43942976 0.43942975997924805 0.19309851395541955 +1237 5 6.46537447 1.4653744697570801 2.1473223366158436 +1239 5 4.89298248 0.10701751708984375 0.011452748964074999 +1241 7 6.052218 0.94778203964233398 0.89829079466858275 +1242 7 6.815272 0.18472814559936523 0.034124487776580281 +1244 5 5.30364943 0.3036494255065918 0.092202973610483241 +1245 4 4.78280544 0.78280544281005859 0.61278436129305192 +1247 6 6.118482 0.11848211288452148 0.014038011073580492 +1250 7 5.700158 1.2998418807983398 1.6895889150773655 +1252 6 5.364317 0.63568305969238281 0.40409295237986953 +1256 6 5.792476 0.20752382278442383 0.043066137023060946 +1258 6 5.448007 0.55199289321899414 0.30469615416427587 +1262 6 5.792476 0.20752382278442383 0.043066137023060946 +1264 5 5.94851971 0.94851970672607422 0.89968963404771785 +1267 7 5.84828329 1.1517167091369629 1.3264513781052756 +1270 7 5.84828329 1.1517167091369629 1.3264513781052756 +1271 5 5.750962 0.7509617805480957 0.56394359584396625 +1272 5 5.325394 0.3253941535949707 0.10588135519378739 +1273 5 5.750962 0.7509617805480957 0.56394359584396625 +1275 6 5.57314968 0.42685031890869141 0.18220119475245156 +1276 7 5.84828329 1.1517167091369629 1.3264513781052756 +1278 6 5.582913 0.41708707809448242 0.17396163071339288 +1279 6 5.870985 0.12901496887207031 0.016644862193061272 +1283 8 7.097483 0.90251684188842773 0.81453664989226127 +1284 7 6.70399857 0.29600143432617188 0.087616849123151042 +1286 7 5.92860174 1.0713982582092285 1.1478942276937687 +1287 7 6.18289757 0.81710243225097656 0.66765638479046174 +1288 7 6.390159 0.60984086990356445 0.37190588660473622 +1289 6 6.822798 0.82279777526855469 0.67699617898688302 +1292 6 6.85950375 0.85950374603271484 0.73874668944426958 +1294 4 5.04547739 1.0454773902893066 1.0930229736061392 +1295 6 5.91815662 0.081843376159667969 0.0066983382212129072 +1298 6 6.40000439 0.40000438690185547 0.16000350954072928 +1299 5 5.940148 0.94014787673950195 0.88387803013779376 +1303 6 5.843109 0.156890869140625 0.024614744819700718 +1304 5 5.16638374 0.16638374328613281 0.027683550029905746 +1305 7 5.97077465 1.0292253494262695 1.0593048199016266 +1307 5 5.20232058 0.20232057571411133 0.040933615357289455 +1309 6 5.4209795 0.57902050018310547 0.33526473963229364 +1310 6 5.561529 0.43847084045410156 0.19225667792852619 +1311 6 5.60187 0.39812994003295898 0.15850744915064752 +1312 5 5.23645258 0.23645257949829102 0.055909822351395633 +1315 6 5.977113 0.022887229919433594 0.00052382529338501627 +1316 6 5.794509 0.20549106597900391 0.042226578197187337 +1317 5 6.033325 1.0333251953125 1.0677609592676163 +1318 6 6.41278648 0.41278648376464844 0.17039268117878237 +1319 5 5.517551 0.51755094528198242 0.26785898096227356 +1321 6 6.57573557 0.57573556900024414 0.33147144541203488 +1322 6 6.117485 0.11748504638671875 0.013802736124489456 +1326 6 5.27129364 0.72870635986328125 0.53101295890519395 +1329 5 5.212231 0.21223115921020508 0.045042064939707416 +1332 7 5.65819645 1.3418035507202148 1.8004367687253762 +1333 8 7.320398 0.67960214614868164 0.46185907704989404 +1335 6 5.220176 0.77982378005981445 0.60812512794677787 +1339 6 5.988458 0.011541843414306641 0.00013321414940037357 +1342 6 5.988458 0.011541843414306641 0.00013321414940037357 +1343 6 6.080612 0.0806121826171875 0.0064983239863067865 +1347 7 6.320307 0.67969322204589844 0.461982876095135 +1349 4 5.433452 1.4334521293640137 2.054785007178225 +1351 7 6.73481274 0.26518726348876953 0.070324284716662078 +1352 6 5.220176 0.77982378005981445 0.60812512794677787 +1353 5 5.60115767 0.60115766525268555 0.36139053849205993 +1357 6 5.43090153 0.56909847259521484 0.3238730715102065 +1358 8 6.70303535 1.2969646453857422 1.682117291380564 +1359 7 6.42182732 0.57817268371582031 0.33428365219515399 +1360 6 5.811853 0.18814706802368164 0.035399319205907886 +1362 7 6.01781368 0.98218631744384766 0.96468996217390668 +1364 5 5.5021925 0.50219249725341797 0.25219730429762421 +1368 6 6.07387352 0.073873519897460938 0.005457296942040557 +1369 5 5.11232948 0.11232948303222656 0.012617912758287275 +1371 7 6.37426662 0.62573337554931641 0.39154225727634184 +1374 7 6.685261 0.31473922729492188 0.099060781198204495 +1376 6 5.576482 0.42351818084716797 0.17936764950809447 +1377 6 5.5179 0.48210000991821289 0.23242041956314097 +1378 7 6.305254 0.69474601745605469 0.48267202877104864 +1385 5 5.41952467 0.4195246696472168 0.17600094844260639 +1387 6 6.671762 0.67176198959350586 0.45126417066262547 +1390 6 6.13112974 0.13112974166870117 0.017195009150100304 +1391 6 6.25453854 0.25453853607177734 0.064789866345563496 +1392 6 6.671762 0.67176198959350586 0.45126417066262547 +1396 7 6.07236338 0.92763662338256836 0.86050970504061297 +1397 7 6.44414234 0.55585765838623047 0.30897773638662329 +1399 6 6.28654957 0.28654956817626953 0.08211065502200654 +1401 6 4.96816349 1.0318365097045898 1.0646865827593501 +1402 8 6.401021 1.5989789962768555 2.5567338305345402 +1405 4 4.93992 0.93991994857788086 0.8834495097346462 +1410 6 6.77783632 0.77783632278442383 0.60502934504279438 +1412 8 6.74131536 1.2586846351623535 1.584287010793787 +1414 6 6.098223 0.098223209381103516 0.0096477988611241017 +1415 5 4.419557 0.58044290542602539 0.33691396645940586 +1417 3 5.175881 2.1758809089660645 4.7344577300029869 +1418 5 5.22850561 0.22850561141967773 0.052214814450280755 +1422 5 5.371983 0.37198305130004883 0.13837139045449476 +1423 4 5.391678 1.3916778564453125 1.9367672561202198 +1428 7 6.444281 0.55571889877319336 0.30882349445369073 +1429 5 5.612692 0.61269187927246094 0.37539133892641985 +1430 4 4.96963263 0.96963262557983398 0.94018742858884252 +1432 7 6.47275925 0.52724075317382813 0.27798281180730555 +1433 6 6.397414 0.39741420745849609 0.15793805228986457 +1435 5 6.0038023 1.0038022994995117 1.0076190564805074 +1441 5 5.365135 0.36513519287109375 0.13332370907301083 +1444 6 6.2645 0.26450014114379883 0.069960324665089502 +1445 6 5.902387 0.097612857818603516 0.0095282700115149055 +1446 6 6.31714964 0.31714963912963867 0.10058389360006004 +1448 6 5.80783939 0.19216060638427734 0.036925698645973171 +1449 6 6.078127 0.078126907348632813 0.0061038136518618558 +1450 6 6.2645 0.26450014114379883 0.069960324665089502 +1451 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1452 6 6.2645 0.26450014114379883 0.069960324665089502 +1453 7 6.87757158 0.12242841720581055 0.014988717339520008 +1454 5 5.756866 0.7568659782409668 0.57284610901865562 +1455 5 5.01117373 0.011173725128173828 0.00012485213323998323 +1466 6 6.078127 0.078126907348632813 0.0061038136518618558 +1467 7 6.7072196 0.29278039932250977 0.085720362227448277 +1468 5 5.14014864 0.14014863967895508 0.019641641203861582 +1469 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1472 5 5.114336 0.11433601379394531 0.013072724050289253 +1473 6 6.27588654 0.27588653564453125 0.076113380549941212 +1475 6 5.69343758 0.30656242370605469 0.093980519628530601 +1476 5 5.377952 0.37795209884643555 0.14284778902242579 +1477 6 5.12870932 0.87129068374633789 0.75914745558316099 +1479 6 5.97060442 0.029395580291748047 0.00086410014068860619 +1481 6 5.87255526 0.12744474411010742 0.01624216280129076 +1483 4 5.11274862 1.1127486228942871 1.2382094977531324 +1487 6 5.67100143 0.32899856567382813 0.1082400562154362 +1490 6 6.281177 0.28117704391479492 0.079060530024662512 +1491 5 5.67186 0.6718602180480957 0.4513961525956347 +1493 8 7.152326 0.84767389297485352 0.71855102883114341 +1496 5 3.60124254 1.3987574577331543 1.9565224255641169 +1497 7 6.07676363 0.92323637008666992 0.85236539505081055 +1499 6 6.293631 0.29363107681274414 0.08621920927021165 +1500 7 6.680092 0.31990814208984375 0.10234121937537566 +1501 5 5.673793 0.67379283905029297 0.45399678995545401 +1504 8 6.313339 1.6866607666015625 2.8448245415929705 +1507 6 5.803581 0.19641876220703125 0.038580330146942288 +1512 7 6.51168633 0.48831367492675781 0.2384502451204753 +1513 6 6.43545341 0.43545341491699219 0.18961967656287015 +1515 6 6.255807 0.25580692291259766 0.06543718181001168 +1516 6 5.870338 0.12966203689575195 0.016812243811955341 +1517 6 5.82861662 0.17138338088989258 0.029372263245249997 +1520 6 5.817548 0.18245220184326172 0.033288805957454315 +1526 6 5.99440527 0.0055947303771972656 3.1301007993533858E-05 +1527 6 6.2122364 0.21223640441894531 0.045044291360682109 +1530 5 5.113673 0.11367321014404297 0.012921598704451753 +1532 7 5.49979448 1.5002055168151855 2.250616592682718 +1533 6 6.35571957 0.35571956634521484 0.1265364098808277 +1538 6 5.86379766 0.13620233535766602 0.018551076156882118 +1540 6 6.057325 0.057324886322021484 0.0032861425918326859 +1542 6 6.2134366 0.21343660354614258 0.045555183733313243 +1543 6 6.21323347 0.21323347091674805 0.045468513119203635 +1549 6 5.80053139 0.19946861267089844 0.039787727440852905 +1551 6 5.668514 0.33148622512817383 0.10988311744972634 +1552 7 6.59583855 0.40416145324707031 0.1633464802907838 +1554 7 6.49526739 0.50473260879516602 0.2547550063811741 +1559 4 5.70196152 1.7019615173339844 2.8966730064857984 +1560 6 6.42826653 0.42826652526855469 0.18341221666560159 +1561 5 4.75953627 0.2404637336730957 0.0578228072120055 +1562 7 6.818427 0.18157291412353516 0.032968723143312673 +1564 5 4.75953627 0.2404637336730957 0.0578228072120055 +1567 5 5.400646 0.40064620971679688 0.16051738536043558 +1569 5 5.62976 0.62975978851318359 0.39659739122816973 +1571 6 5.641856 0.35814380645751953 0.12826698610388121 +1572 6 5.927081 0.072918891906738281 0.0053171647969065816 +1573 5 5.42326546 0.42326545715332031 0.17915364721920923 +1576 6 5.35206366 0.64793634414672852 0.41982150606622781 +1578 5 5.85142469 0.8514246940612793 0.72492400965734305 +1580 5 4.616376 0.38362407684326172 0.14716743233384477 +1581 6 6.01939154 0.019391536712646484 0.00037603169607791642 +1585 5 5.148195 0.14819478988647461 0.021961695749496357 +1587 6 5.495188 0.50481176376342773 0.25483491683394277 +1588 5 5.148195 0.14819478988647461 0.021961695749496357 +1589 6 6.458008 0.4580078125 0.20977115631103516 +1592 6 6.190008 0.19000816345214844 0.036103102178458357 +1596 5 6.11365128 1.1136512756347656 1.2402191637229407 +1597 6 5.53800058 0.46199941635131836 0.21344346070895881 +1598 6 5.62568235 0.37431764602661133 0.1401137001269035 +1599 6 5.89610243 0.1038975715637207 0.010794705376838465 +1600 6 5.408455 0.59154510498046875 0.34992561122635379 +1603 7 5.886322 1.113677978515625 1.2402786398306489 +1607 7 5.848945 1.151054859161377 1.3249272887990173 +1609 7 6.117519 0.88248109817504883 0.77877288863624017 +1610 6 6.04807568 0.048075675964355469 0.0023112706194297061 +1613 7 6.5623827 0.43761730194091797 0.19150890295804857 +1616 6 5.323467 0.67653322219848633 0.45769720073826647 +1617 6 5.734267 0.26573276519775391 0.07061390249964461 +1619 8 6.94580841 1.0541915893554688 1.1113199070678093 +1621 5 4.691925 0.308074951171875 0.094910175539553165 +1623 6 5.742188 0.2578120231628418 0.066467039287317675 +1626 6 5.93749475 0.062505245208740234 0.003906905678604744 +1628 6 5.542873 0.45712709426879883 0.20896518031463529 +1629 6 5.527357 0.47264289855957031 0.22339130955879227 +1632 8 7.01878834 0.98121166229248047 0.96277632621877274 +1633 7 6.146297 0.85370302200317383 0.7288088497773515 +1634 6 5.76403952 0.23596048355102539 0.055677349797633724 +1636 5 5.08614254 0.086142539978027344 0.0074205371938660392 +1639 5 5.69386959 0.69386959075927734 0.48145500898044702 +1641 6 5.7167654 0.28323459625244141 0.080221836514283495 +1642 7 5.635858 1.3641419410705566 1.860883235387746 +1644 7 5.635858 1.3641419410705566 1.860883235387746 +1646 6 5.7167654 0.28323459625244141 0.080221836514283495 +1647 7 6.595718 0.4042820930480957 0.16344401075934911 +1651 6 5.04891062 0.95108938217163086 0.9045710128796145 +1653 6 5.019502 0.98049783706665039 0.9613760084923797 +1654 5 4.9331913 0.066808700561523438 0.0044634024707193021 +1655 5 5.45447063 0.45447063446044922 0.20654355758688325 +1656 5 5.669732 0.66973209381103516 0.4485410774805132 +1657 6 6.788385 0.78838491439819336 0.62155077325064667 +1658 5 5.26004457 0.26004457473754883 0.067623180850432618 +1659 5 5.377065 0.37706518173217773 0.14217815127472022 +1660 6 5.44472837 0.55527162551879883 0.30832657810628916 +1663 6 5.019502 0.98049783706665039 0.9613760084923797 +1664 4 5.48985672 1.4898567199707031 2.2196730460418621 +1665 8 6.362209 1.6377911567687988 2.6823598731900802 +1667 6 5.853944 0.14605617523193359 0.021332406323381292 +1668 7 5.82933331 1.1706666946411133 1.3704605099419496 +1669 6 5.130034 0.86996603012084961 0.75684089356423101 +1673 5 5.570712 0.57071208953857422 0.32571228914548556 +1674 6 5.60828924 0.39171075820922852 0.15343731809684868 +1677 6 6.09377146 0.093771457672119141 0.0087930862739540316 +1679 5 5.491922 0.49192190170288086 0.24198715737497878 +1680 5 5.252373 0.25237321853637695 0.06369224143440988 +1681 6 6.32914257 0.32914257049560547 0.10833483171245462 +1684 7 6.160416 0.8395838737487793 0.70490108105900617 +1685 7 6.60589075 0.39410924911499023 0.15532210023798143 +1688 3 5.280151 2.2801508903503418 5.1990880827654564 +1690 4 4.54363966 0.5436396598815918 0.29554407979617281 +1697 6 6.475748 0.47574806213378906 0.22633621862405562 +1699 6 6.27966833 0.27966833114624023 0.078214375446123086 +1701 5 5.80198145 0.80198144912719727 0.6431742447441593 +1702 4 4.358819 0.35881900787353516 0.12875108041134808 +1704 5 5.21234035 0.21234035491943359 0.045088426327311026 +1706 6 5.9945097 0.0054903030395507813 3.0143427466100547E-05 +1707 5 5.331367 0.33136701583862305 0.10980409918579426 +1709 5 5.9493103 0.949310302734375 0.90119005087763071 +1711 5 6.35904932 1.3590493202209473 1.8470150547930189 +1713 6 5.38475227 0.61524772644042969 0.3785297648901178 +1714 5 5.44625664 0.44625663757324219 0.19914498657817603 +1715 8 6.32466841 1.6753315925598145 2.8067359450290041 +1716 6 6.47190332 0.47190332412719727 0.2226927473222986 +1719 6 5.64309549 0.35690450668334961 0.12738082689088515 +1720 7 6.133768 0.86623191833496094 0.75035773634226643 +1721 7 5.710882 1.2891178131103516 1.6618247360784153 +1723 8 6.32466841 1.6753315925598145 2.8067359450290041 +1724 6 6.21978569 0.21978569030761719 0.048305749663995812 +1725 6 5.76422739 0.23577260971069336 0.055588723489790937 +1728 5 5.44625664 0.44625663757324219 0.19914498657817603 +1731 6 5.48901033 0.51098966598510742 0.26111043874357165 +1734 6 5.853075 0.14692497253417969 0.021586947554169456 +1735 6 6.83932734 0.83932733535766602 0.70447037587859995 +1736 5 5.51393652 0.51393651962280273 0.2641307462019995 +1739 4 4.88872051 0.88872051239013672 0.78982414914298715 +1740 6 5.182924 0.81707620620727539 0.66761352675007402 +1743 6 5.31297255 0.6870274543762207 0.47200672306667002 +1744 5 5.49808359 0.49808359146118164 0.2480872640828693 +1746 5 5.721136 0.72113609313964844 0.52003726482871571 +1747 6 5.31297255 0.6870274543762207 0.47200672306667002 +1748 5 5.6907835 0.69078350067138672 0.47718184479981574 +1749 6 6.03195 0.031949996948242188 0.0010208023049926851 +1753 7 6.0383625 0.96163749694824219 0.9247466755368805 +1754 6 6.89634943 0.89634943008422852 0.80344230081232126 +1755 6 5.46218824 0.5378117561340332 0.2892414850359728 +1756 5 4.970864 0.029136180877685547 0.00084891703613720892 +1758 5 5.600766 0.60076618194580078 0.36092000536973501 +1765 5 5.022516 0.022515773773193359 0.00050696006860562193 +1767 5 5.19753265 0.19753265380859375 0.039019149320665747 +1768 5 5.18421936 0.1842193603515625 0.033936772728338838 +1772 6 5.92966461 0.07033538818359375 0.0049470668309368193 +1773 6 6.00829 0.0082898139953613281 6.8721016077688546E-05 +1774 6 6.18911743 0.189117431640625 0.03576540295034647 +1775 6 6.62580347 0.62580347061157227 0.39162998382948899 +1776 5 6.09891748 1.0989174842834473 1.2076196372638606 +1779 8 6.89703655 1.1029634475708008 1.2165283666772666 +1783 6 4.682983 1.3170170783996582 1.7345339847963714 +1784 7 6.949775 0.050224781036376953 0.00252252863015201 +1785 6 6.21301842 0.21301841735839844 0.045376846133876825 +1788 5 6.638938 1.6389379501342773 2.686117604390347 +1789 7 6.133875 0.86612510681152344 0.75017270064927288 +1794 5 5.16400242 0.16400241851806641 0.026896793279775011 +1795 6 5.117132 0.88286781311035156 0.77945557542625465 +1800 6 5.411709 0.58829116821289063 0.34608649859728757 +1801 5 5.03533125 0.035331249237060547 0.0012482971726512915 +1802 6 6.0186944 0.018694400787353516 0.00034948062079820374 +1803 6 5.90830851 0.091691493988037109 0.0084073300697582454 +1805 5 5.02972 0.029719829559326172 0.00088326826903539768 +1810 6 5.339474 0.66052579879760742 0.43629433087721736 +1812 6 6.510603 0.51060295104980469 0.26071537362076924 +1814 7 6.66430044 0.33569955825805664 0.11269419341465436 +1816 7 6.76522 0.23477983474731445 0.055121570803976283 +1817 4 4.97468042 0.97468042373657227 0.95000192841530406 +1818 6 6.40402842 0.40402841567993164 0.16323896067683563 +1821 5 5.90967035 0.90967035293579102 0.82750015101032659 +1823 6 5.56408072 0.43591928482055664 0.19002562287846558 +1824 5 5.042905 0.042904853820800781 0.0018408264813842834 +1825 5 5.518146 0.51814603805541992 0.26847531675252867 +1826 5 5.042905 0.042904853820800781 0.0018408264813842834 +1827 6 5.56408072 0.43591928482055664 0.19002562287846558 +1828 6 5.545804 0.45419597625732422 0.20629398484834383 +1829 7 6.212104 0.78789615631103516 0.62078035312970314 +1830 7 6.212104 0.78789615631103516 0.62078035312970314 +1831 7 6.59027052 0.4097294807434082 0.16787824739026291 +1832 7 6.212104 0.78789615631103516 0.62078035312970314 +1835 5 5.389878 0.3898777961730957 0.15200469594878996 +1836 6 6.027217 0.027216911315917969 0.00074076026157854358 +1841 7 6.989911 0.010088920593261719 0.00010178631873714039 +1843 6 6.90099573 0.90099573135375977 0.81179330791769644 +1844 6 6.373012 0.37301206588745117 0.13913800129762421 +1845 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1847 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1854 7 5.83561754 1.1643824577331543 1.3557865078767009 +1858 5 4.889405 0.1105952262878418 0.012231304077658933 +1859 6 5.98256636 0.017433643341064453 0.00030393192014344095 +1861 6 5.883474 0.11652612686157227 0.013578338241359234 +1862 7 6.15355825 0.84644174575805664 0.7164636289619466 +1863 5 5.2479043 0.24790430068969727 0.061456542300447836 +1866 6 5.2747364 0.72526359558105469 0.52600728307515965 +1867 6 6.31448936 0.31448936462402344 0.098903560461621964 +1868 7 6.509657 0.49034309387207031 0.24043634970803396 +1871 6 6.063482 0.063481807708740234 0.004029939909969471 +1873 5 5.26915 0.2691497802734375 0.072441604221239686 +1874 5 6.16405 1.1640501022338867 1.3550126405107221 +1876 6 6.09814024 0.098140239715576172 0.0096315066514307546 +1877 6 5.8294735 0.17052650451660156 0.029079288742650533 +1878 6 5.96899843 0.031001567840576172 0.00096109720857384673 +1879 6 5.671555 0.3284449577331543 0.10787609026033351 +1883 5 5.34378052 0.343780517578125 0.11818504426628351 +1884 5 6.07482862 1.0748286247253418 1.1552565725289696 +1885 6 5.671555 0.3284449577331543 0.10787609026033351 +1887 5 6.237499 1.2374992370605469 1.5314043617254356 +1888 5 6.03254032 1.0325403213500977 1.0661395152137629 +1889 5 5.779849 0.77984905242919922 0.60816454457471991 +1890 5 5.34378052 0.343780517578125 0.11818504426628351 +1892 5 5.42887926 0.4288792610168457 0.18393742053035567 +1894 5 5.260407 0.2604069709777832 0.067811790533824023 +1899 7 6.92687559 0.073124408721923828 0.0053471791509309696 +1900 6 5.50394869 0.49605131149291992 0.24606690363384587 +1901 5 5.78969 0.78969001770019531 0.62361032405533479 +1902 6 5.770987 0.22901296615600586 0.052446938667571885 +1903 5 5.426101 0.4261012077331543 0.18156223923165271 +1905 6 5.591873 0.4081268310546875 0.16656751022674143 +1906 5 5.753492 0.75349187850952148 0.56775001097980748 +1917 6 5.890733 0.10926723480224609 0.01193932860132918 +1919 6 5.31168365 0.68831634521484375 0.47377939108991995 +1921 5 5.53998232 0.53998231887817383 0.2915809047010498 +1924 4 5.33742476 1.3374247550964355 1.7887049755447606 +1928 6 5.972093 0.027906894683837891 0.00077879477089481952 +1932 6 4.882628 1.1173720359802246 1.2485202667905924 +1934 6 5.90029144 0.09970855712890625 0.0099417963647283614 +1935 5 5.31565857 0.3156585693359375 0.099640332395210862 +1936 6 5.893681 0.10631895065307617 0.011303719267971246 +1937 7 5.95812225 1.0418777465820313 1.0855092388228513 +1939 5 5.204067 0.20406723022460938 0.041643434451543726 +1942 5 4.610965 0.38903522491455078 0.15134840622431511 +1945 6 5.78697824 0.21302175521850586 0.045378268196373028 +1947 5 5.06945372 0.069453716278076172 0.004823818704835503 +1954 5 5.205833 0.20583295822143555 0.042367206690187231 +1956 5 5.56439972 0.56439971923828125 0.3185470430762507 +1957 6 5.642328 0.35767221450805664 0.12792941303109728 +1958 6 5.27635431 0.72364568710327148 0.5236630804631659 +1961 5 5.182421 0.18242120742797852 0.033277496919481564 +1962 5 5.22548151 0.22548151016235352 0.050841911425095532 +1963 6 5.27635431 0.72364568710327148 0.5236630804631659 +1964 5 5.29695 0.29694986343383789 0.088179221393374974 +1965 6 5.109696 0.8903040885925293 0.79264137016457425 +1967 7 5.887322 1.112678050994873 1.2380524451657493 +1968 6 6.275273 0.27527284622192383 0.075775139867118924 +1971 7 6.79392147 0.20607852935791016 0.042468360262319038 +1973 5 5.14016438 0.14016437530517578 0.01964605210469017 +1976 5 5.727278 0.72727823257446289 0.52893362757663454 +1981 8 7.917678 0.082322120666503906 0.0067769315510304295 +1983 8 7.917678 0.082322120666503906 0.0067769315510304295 +1987 5 6.051807 1.0518069267272949 1.1062978111115171 +1988 6 5.8307457 0.16925430297851563 0.028647019076743163 +1991 8 7.917678 0.082322120666503906 0.0067769315510304295 +1994 6 5.769981 0.23001909255981445 0.052908782942040489 +1995 6 5.94961 0.050389766693115234 0.0025391285873865854 +1999 6 6.65559149 0.65559148788452148 0.42980019898664068 +2000 5 5.357441 0.35744094848632813 0.12776403165480588 +2006 6 5.94961 0.050389766693115234 0.0025391285873865854 +2009 7 6.79772854 0.20227146148681641 0.040913744132012653 +2010 6 6.05053043 0.050530433654785156 0.0025533247253406444 +2012 5 6.21455526 1.2145552635192871 1.475144488142405 +2013 6 5.76146269 0.23853731155395508 0.056900049003388631 +2014 5 6.133267 1.1332669258117676 1.2842939251388543 +2015 6 6.11094332 0.11094331741333008 0.012308419678674909 +2016 7 6.91747046 0.082529544830322266 0.0068111257699001726 +2017 5 6.133267 1.1332669258117676 1.2842939251388543 +2018 7 5.97948074 1.0205192565917969 1.0414595530746737 +2020 6 6.263805 0.26380491256713867 0.069593031894555679 +2021 6 5.830813 0.16918706893920898 0.028624264296240653 +2023 6 5.830813 0.16918706893920898 0.028624264296240653 +2026 5 4.90337944 0.096620559692382813 0.0093355325552693103 +2030 6 5.54503059 0.45496940612792969 0.20699716051240102 +2033 5 6.1886487 1.1886487007141113 1.412885733709345 +2036 6 5.323167 0.67683315277099609 0.45810311668992654 +2040 6 5.88102674 0.1189732551574707 0.014154635442764629 +2041 5 5.21115 0.21115016937255859 0.044584394026060181 +2042 6 5.5706563 0.42934370040893555 0.1843360130808378 +2044 6 5.277161 0.7228388786315918 0.5224960444613771 +2045 5 5.605945 0.60594511032104492 0.3671694767219833 +2046 5 5.02834129 0.028341293334960938 0.00080322890789830126 +2047 5 5.283352 0.28335189819335938 0.080288298209779896 +2049 7 5.77500868 1.2249913215637207 1.500603737906431 +2053 5 6.44825459 1.4482545852661133 2.0974413437443218 +2054 5 6.44825459 1.4482545852661133 2.0974413437443218 +2055 6 5.996897 0.0031027793884277344 9.6272399332519853E-06 +2056 5 5.142752 0.14275217056274414 0.020378182200374795 +2059 5 5.23273373 0.23273372650146484 0.054164987451258639 +2068 6 6.51137161 0.51137161254882813 0.26150092612078879 +2072 5 5.86525726 0.86525726318359375 0.74867013149196282 +2075 5 5.43223667 0.43223667144775391 0.18682854014423356 +2077 6 5.75369072 0.24630928039550781 0.060668261608952889 +2081 5 5.72838259 0.72838258743286133 0.53054119367538988 +2083 5 4.76489258 0.235107421875 0.055275499820709229 +2088 6 5.42661333 0.57338666915893555 0.32877227236917861 +2092 5 4.94481134 0.055188655853271484 0.0030457877348908369 +2093 5 5.41896248 0.41896247863769531 0.1755295585062413 +2095 5 5.394303 0.3943028450012207 0.15547473357605668 +2098 6 5.387457 0.61254310607910156 0.37520905680503347 +2100 5 5.62809563 0.62809562683105469 0.39450411644429551 +2101 6 6.321963 0.32196283340454102 0.10366006609388023 +2105 5 4.7825017 0.2174983024597168 0.04730551157285845 +2107 6 6.202732 0.20273208618164063 0.041100298767560162 +2108 6 5.387457 0.61254310607910156 0.37520905680503347 +2109 6 5.90480042 0.0951995849609375 0.0090629609767347574 +2117 5 5.76381731 0.76381731033325195 0.58341688356472332 +2119 4 5.78921556 1.7892155647277832 3.2012923370641602 +2126 5 4.936701 0.063299179077148438 0.0040067860718409065 +2127 5 4.90092373 0.099076271057128906 0.009816107486585679 +2130 5 6.140603 1.1406030654907227 1.3009753530068338 +2133 6 6.445718 0.44571781158447266 0.19866436756365147 +2135 5 5.743049 0.74304914474487305 0.5521220315060873 +2138 5 5.635716 0.63571596145629883 0.40413478365030642 +2140 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2141 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2144 6 6.080732 0.080731868743896484 0.0065176346308817301 +2145 6 5.74060965 0.25939035415649414 0.067283355829431457 +2149 6 6.53114653 0.53114652633666992 0.28211663243951079 +2151 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2153 6 5.755437 0.24456310272216797 0.059811111213093682 +2154 4 4.18521452 0.18521451950073242 0.034304418233887191 +2155 5 6.15803671 1.1580367088317871 1.3410490190019573 +2156 4 6.28683329 2.2868332862854004 5.229606479262884 +2159 4 5.38970137 1.3897013664245605 1.9312698878422907 +2160 6 6.376475 0.37647485733032227 0.1417333182018865 +2163 6 6.237965 0.23796510696411133 0.056627392132440946 +2164 5 5.71715 0.71715021133422852 0.51430442561672862 +2165 5 5.130902 0.13090181350708008 0.017135284779442372 +2169 7 6.87379265 0.12620735168457031 0.015928295619232813 +2170 7 6.87379265 0.12620735168457031 0.015928295619232813 +2175 7 6.838287 0.1617131233215332 0.026151134254405406 +2177 7 4.953657 2.0463428497314453 4.1875190586470126 +2178 5 5.037093 0.037093162536621094 0.0013759027069681906 +2180 6 5.44559526 0.55440473556518555 0.30736461081710331 +2181 6 5.98071527 0.019284725189208984 0.0003719006256233115 +2183 5 5.60916948 0.60916948318481445 0.37108745924365394 +2185 7 5.64677954 1.3532204627990723 1.8312056209381353 +2187 5 5.58004 0.58003997802734375 0.33644637610996142 +2188 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2190 6 6.555541 0.55554103851318359 0.30862584547230654 +2191 5 5.58781052 0.58781051635742188 0.34552120314037893 +2193 6 5.92142963 0.078570365905761719 0.0061733023985652835 +2194 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2195 5 5.58004 0.58003997802734375 0.33644637610996142 +2196 6 5.494919 0.5050811767578125 0.25510699511505663 +2199 6 5.91814041 0.081859588623046875 0.0067009922495344654 +2200 5 5.42772627 0.42772626876831055 0.18294976099446103 +2207 7 6.20115471 0.79884529113769531 0.63815379917286918 +2208 5 6.01227665 1.0122766494750977 1.0247040150725297 +2212 6 6.209624 0.20962381362915039 0.043942143240428777 +2213 6 6.27866745 0.27866744995117188 0.077655547662288882 +2214 5 6.01227665 1.0122766494750977 1.0247040150725297 +2217 6 5.81703329 0.18296670913696289 0.03347681665240998 +2218 6 5.859478 0.14052200317382813 0.019746433375985362 +2220 6 5.89436436 0.10563564300537109 0.011158889073158207 +2221 6 5.753357 0.24664306640625 0.060832802206277847 +2223 6 5.88092756 0.11907243728637695 0.014178245321318173 +2225 4 5.87550926 1.8755092620849609 3.5175349921664747 +2228 7 6.017545 0.98245477676391602 0.96521738838623605 +2229 6 6.303792 0.30379199981689453 0.092289579152748047 +2230 7 6.017545 0.98245477676391602 0.96521738838623605 +2231 6 6.303792 0.30379199981689453 0.092289579152748047 +2234 5 5.575778 0.57577800750732422 0.3315203139291043 +2236 5 5.2704854 0.27048540115356445 0.073162352237204686 +2237 4 5.158827 1.1588268280029297 1.3428796172993316 +2242 5 5.53293753 0.53293752670288086 0.28402240736818385 +2243 5 6.28247452 1.2824745178222656 1.6447408888634527 +2244 5 5.33255053 0.3325505256652832 0.11058985212025618 +2246 4 5.158827 1.1588268280029297 1.3428796172993316 +2248 6 5.680154 0.31984615325927734 0.10230156175475713 +2249 5 5.066627 0.066627025604248047 0.0044391605408691248 +2250 6 4.959182 1.0408182144165039 1.0833025554611595 +2251 7 6.41361332 0.58638668060302734 0.3438493391886368 +2256 5 5.84614134 0.84614133834838867 0.71595516446200236 +2257 6 5.53059244 0.46940755844116211 0.22034345592169302 +2261 6 5.198945 0.80105495452880859 0.6416890401751516 +2262 6 5.498481 0.50151920318603516 0.25152151116435562 +2263 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2264 6 6.58286762 0.58286762237548828 0.33973466521365481 +2265 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2268 6 5.49432945 0.50567054748535156 0.25570270259413519 +2269 6 5.713871 0.28612899780273438 0.081869803383597173 +2277 6 6.468116 0.46811580657958984 0.21913240836965997 +2279 5 5.187639 0.18763923645019531 0.035208483055612305 +2281 6 5.578538 0.42146205902099609 0.17763026719421759 +2286 5 5.24503756 0.24503755569458008 0.060043403700774434 +2288 5 5.06648064 0.066480636596679688 0.0044196750422997866 +2294 7 7.13601 0.13601016998291016 0.018498766338780115 +2301 5 5.900166 0.90016603469848633 0.81029889002479649 +2302 5 5.0114007 0.011400699615478516 0.00012997595172237197 +2303 5 5.16666365 0.16666364669799805 0.027776771130675115 +2305 7 6.700686 0.29931402206420898 0.089588883804253783 +2307 5 5.45757151 0.45757150650024414 0.20937168356090297 +2308 5 5.029569 0.029569149017333984 0.00087433457360930333 +2309 6 5.427362 0.57263803482055664 0.32791431892314904 +2312 5 5.029569 0.029569149017333984 0.00087433457360930333 +2313 7 6.80353832 0.19646167755126953 0.038597190746259002 +2316 7 6.64999628 0.35000371932983398 0.1225026035447172 +2320 6 6.219693 0.21969318389892578 0.048265095051647222 +2322 6 5.3386817 0.66131830215454102 0.43734189676456481 +2323 6 6.07975531 0.079755306243896484 0.0063609088740577135 +2325 6 5.010644 0.98935604095458984 0.97882537577334006 +2326 5 5.27927828 0.27927827835083008 0.077996356758603724 +2330 6 5.41974068 0.58025932312011719 0.33670088206781656 +2341 5 5.20041227 0.20041227340698242 0.040165079332155074 +2343 5 6.428549 1.4285488128662109 2.0407517107414606 +2346 4 5.21786 1.217860221862793 1.4831835199956913 +2348 6 5.806993 0.19300699234008789 0.037251699092166746 +2352 6 5.25599861 0.74400138854980469 0.55353806616403745 +2353 7 6.67731333 0.32268667221069336 0.10412668842241146 +2354 6 6.64218235 0.64218235015869141 0.41239817085534014 +2356 6 5.86749458 0.13250541687011719 0.017557685499923537 +2357 5 5.94600058 0.94600057601928711 0.89491708982882301 +2360 6 6.17621469 0.17621469497680664 0.031051618725769004 +2361 5 5.13946867 0.13946866989135742 0.019451509881264428 +2362 6 6.729167 0.72916698455810547 0.53168449136956042 +2363 5 5.514287 0.51428699493408203 0.26449111315832852 +2364 5 5.378189 0.3781890869140625 0.14302698546089232 +2368 6 5.58730936 0.41269063949584961 0.17031356392749331 +2369 6 6.56191969 0.5619196891784668 0.31575373708642474 +2371 5 4.946381 0.053618907928466797 0.0028749872874413995 +2372 4 5.022731 1.022730827331543 1.0459783451742624 +2373 3 4.65867138 1.6586713790893555 2.7511907438101844 +2377 6 5.68505859 0.31494140625 0.099188089370727539 +2378 5 5.365645 0.36564493179321289 0.13369621614606331 +2382 8 5.980098 2.019902229309082 4.0800050159677994 +2384 8 5.980098 2.019902229309082 4.0800050159677994 +2385 5 6.06373739 1.0637373924255371 1.1315372400442811 +2388 4 5.438252 1.4382519721984863 2.0685687355328355 +2390 8 6.577091 1.4229087829589844 2.0246694046218181 +2394 5 4.748077 0.2519230842590332 0.063465240382583943 +2395 5 5.46794844 0.46794843673706055 0.21897573944465876 +2397 6 6.152169 0.15216922760009766 0.023155473828410322 +2398 6 6.355004 0.35500383377075195 0.12602772199193168 +2399 6 5.84902763 0.15097236633300781 0.022792655396187911 +2400 4 5.51223755 1.512237548828125 2.2868624040856957 +2402 6 5.63959646 0.36040353775024414 0.12989071002289165 +2404 5 5.11211967 0.11211967468261719 0.01257082145093591 +2405 5 5.799807 0.79980707168579102 0.63969135191860005 +2407 6 6.790098 0.79009819030761719 0.62425515032737167 +2408 5 4.92498446 0.075015544891357422 0.0056273319753472606 +2409 4 6.467688 2.4676880836486816 6.0894844781817028 +2410 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2411 6 5.02752256 0.97247743606567383 0.94571236365686673 +2412 4 4.89793873 0.89793872833251953 0.80629395983942231 +2413 4 6.467688 2.4676880836486816 6.0894844781817028 +2414 4 4.812013 0.81201314926147461 0.65936535457353784 +2416 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2417 5 4.905179 0.094820976257324219 0.0089910175383920432 +2418 5 5.212003 0.21200323104858398 0.044945369975039284 +2421 5 5.728902 0.72890186309814453 0.53129792602794623 +2425 6 5.87789345 0.12210655212402344 0.014910010071616853 +2432 5 5.243106 0.24310588836669922 0.059100472958562023 +2434 6 5.20914364 0.79085636138916016 0.62545378434970189 +2438 5 4.97508335 0.024916648864746094 0.0006208393906490528 +2442 5 5.124124 0.12412405014038086 0.015406779823251782 +2445 5 5.283511 0.28351116180419922 0.08037857886756683 +2446 5 5.283511 0.28351116180419922 0.08037857886756683 +2447 6 5.54187 0.4581298828125 0.20988298952579498 +2448 6 6.25477743 0.25477743148803711 0.064911539595641443 +2449 6 6.04059029 0.040590286254882813 0.0016475713382533286 +2451 5 5.102657 0.10265684127807617 0.010538427061192124 +2454 5 5.52015066 0.52015066146850586 0.27055671062612419 +2457 6 6.17909145 0.17909145355224609 0.03207374873545632 +2458 6 5.62500525 0.37499475479125977 0.14062106612095704 +2460 5 5.3468256 0.34682559967041016 0.12028799658673961 +2462 5 5.26428 0.26427984237670898 0.069843835086658146 +2463 7 5.87194967 1.1280503273010254 1.2724975409239505 +2468 6 5.542082 0.45791816711425781 0.20968904777328135 +2469 5 5.144967 0.14496707916259766 0.021015454040934856 +2471 7 7.0686183 0.068618297576904297 0.0047084707623525901 +2473 6 5.332778 0.66722202301025391 0.44518522798989579 +2474 7 6.526948 0.47305202484130859 0.22377821820646204 +2476 6 5.40006 0.59993982315063477 0.35992779140201492 +2479 6 5.451382 0.54861783981323242 0.30098153416133755 +2480 5 5.305516 0.30551576614379883 0.093339883362432374 +2481 6 5.63753748 0.36246252059936523 0.13137907883924527 +2482 6 5.44933271 0.55066728591918945 0.30323445978160635 +2484 5 5.035196 0.035195827484130859 0.0012387462722927012 +2485 6 5.351825 0.64817476272583008 0.42013052303468612 +2487 6 6.216436 0.21643590927124023 0.046844502822068534 +2489 6 5.25572443 0.74427556991577148 0.55394612397344645 +2490 6 5.24163437 0.75836563110351563 0.57511843043903355 +2491 5 5.23166561 0.23166561126708984 0.053668955443754385 +2492 6 5.25572443 0.74427556991577148 0.55394612397344645 +2493 4 5.047504 1.0475039482116699 1.0972645215190369 +2494 4 5.047504 1.0475039482116699 1.0972645215190369 +2497 5 5.789101 0.78910112380981445 0.62268058359791212 +2498 5 5.789101 0.78910112380981445 0.62268058359791212 +2500 5 5.789101 0.78910112380981445 0.62268058359791212 +2501 5 5.42734766 0.42734766006469727 0.18262602256277205 +2506 6 5.75300074 0.24699926376342773 0.061008636299675345 +2507 7 6.718815 0.28118515014648438 0.079065088662900962 +2508 6 5.369476 0.6305241584777832 0.39756071442411667 +2509 5 5.12915134 0.12915134429931641 0.016680069734320568 +2510 6 5.33514929 0.66485071182250977 0.44202646901089793 +2515 7 6.553418 0.44658184051513672 0.19943534027788701 +2516 6 5.71722269 0.28277730941772461 0.079963006721527563 +2520 5 5.229541 0.22954082489013672 0.052688990291244409 +2521 7 6.4475956 0.55240440368652344 0.30515062521226355 +2524 5 5.229541 0.22954082489013672 0.052688990291244409 +2527 6 6.322875 0.32287502288818359 0.10424828040504508 +2528 6 6.20776 0.20775985717773438 0.043164158254512586 +2529 5 5.05015 0.050149917602539063 0.0025150142355414573 +2530 6 5.70940733 0.29059267044067383 0.084444100113842069 +2533 5 6.127435 1.1274352073669434 1.2711101468105426 +2535 6 5.85946 0.14054012298583984 0.019751526168874989 +2539 5 5.761463 0.76146316528320313 0.57982615208311472 +2540 5 6.34781027 1.3478102684020996 1.8165925196101398 +2542 5 6.003742 1.0037422180175781 1.0074984402308473 +2543 6 5.67026138 0.32973861694335938 0.10872755550371949 +2544 6 5.91505241 0.084947586059570313 0.0072160923773481045 +2549 5 5.905257 0.90525722503662109 0.81949064348100364 +2550 5 5.18551636 0.185516357421875 0.034416318871080875 +2553 7 6.659942 0.3400578498840332 0.11563934126775166 +2559 5 5.171946 0.17194604873657227 0.029565443676119685 +2561 5 5.419591 0.41959095001220703 0.17605656533214642 +2565 5 5.66264248 0.66264247894287109 0.43909505489955336 +2570 5 6.09423256 1.0942325592041016 1.1973448936223576 +2572 5 5.85262251 0.85262250900268555 0.7269651428580346 +2573 5 5.33394337 0.33394336700439453 0.11151817236623174 +2576 5 5.82261133 0.82261133193969727 0.6766894034356028 +2577 5 5.780506 0.78050613403320313 0.60918982526345644 +2578 7 6.720284 0.27971601486206055 0.078241048970312477 +2580 5 5.43206549 0.43206548690795898 0.18668058497701168 +2582 7 6.81294441 0.18705558776855469 0.034989792915439466 +2585 7 6.81294441 0.18705558776855469 0.034989792915439466 +2587 6 5.354246 0.64575386047363281 0.41699804831660003 +2588 7 6.81294441 0.18705558776855469 0.034989792915439466 +2589 4 4.78625631 0.78625631332397461 0.61819899024180813 +2590 6 6.1274457 0.12744569778442383 0.016242405883758693 +2591 7 6.415467 0.5845332145690918 0.34167907893447591 +2594 7 6.423638 0.57636213302612305 0.33219330838642236 +2597 6 6.22214746 0.22214746475219727 0.049349496095828727 +2598 5 5.194394 0.19439411163330078 0.037789070637700206 +2601 5 5.68621063 0.68621063232421875 0.47088503191480413 +2603 7 6.966857 0.033143043518066406 0.0010984613336404436 +2604 7 6.966857 0.033143043518066406 0.0010984613336404436 +2605 6 5.794412 0.20558786392211914 0.042266369792059777 +2606 6 6.468554 0.46855401992797852 0.21954286959066849 +2608 6 6.152119 0.15211915969848633 0.023140238747373587 +2613 5 5.2531476 0.25314760208129883 0.064083708439511611 +2614 5 6.55887175 1.5588717460632324 2.430081120674231 +2615 7 6.630824 0.36917591094970703 0.13629085322554602 +2616 7 6.630824 0.36917591094970703 0.13629085322554602 +2620 5 5.45543861 0.45543861389160156 0.20742433102350333 +2622 7 6.30767059 0.69232940673828125 0.47932000743458048 +2624 5 6.55887175 1.5588717460632324 2.430081120674231 +2625 5 4.713512 0.28648805618286133 0.082075406335434309 +2627 7 6.145278 0.85472202301025391 0.73054973661874101 +2629 5 4.998917 0.0010828971862792969 1.1726663160516182E-06 +2630 6 5.7854867 0.21451330184936523 0.046015956670316882 +2631 7 7.168283 0.16828298568725586 0.02831916327181716 +2632 5 5.06333447 0.063334465026855469 0.0040112544602379785 +2634 5 5.30502844 0.30502843856811523 0.093042348335302449 +2636 5 5.49951124 0.4995112419128418 0.24951148079730956 +2637 5 5.30502844 0.30502843856811523 0.093042348335302449 +2640 6 6.370355 0.37035512924194336 0.13716292175581657 +2642 5 5.604046 0.60404586791992188 0.3648714105511317 +2643 5 5.61569834 0.61569833755493164 0.37908444286790655 +2645 7 6.34942675 0.6505732536315918 0.42324555834079547 +2646 7 6.021215 0.97878503799438477 0.95802015060166923 +2647 5 5.82385874 0.82385873794555664 0.67874322008924537 +2649 6 5.82408476 0.17591524124145508 0.030946172101039338 +2651 5 4.96879244 0.031207561492919922 0.0009739118943343783 +2655 5 5.67757463 0.67757463455200195 0.459107385388279 +2656 4 5.873171 1.8731708526611328 3.5087690432592353 +2657 7 6.70312071 0.29687929153442383 0.088137313741981416 +2659 6 6.201171 0.20117092132568359 0.040469739587024378 +2662 6 6.45812464 0.45812463760375977 0.20987818357957622 +2663 8 5.65337 2.3466300964355469 5.506672809497104 +2667 7 6.00120831 0.99879169464111328 0.99758484928406688 +2671 7 6.983855 0.016145229339599609 0.00026066843042826804 +2672 7 5.72459126 1.2754087448120117 1.6266674663429512 +2673 6 5.512653 0.48734712600708008 0.23750722122736079 +2675 7 5.69395638 1.3060436248779297 1.7057499500842823 +2676 6 6.307566 0.30756616592407227 0.094596946421233952 +2677 6 6.443829 0.44382905960083008 0.19698423414615718 +2678 5 5.273363 0.27336311340332031 0.074727391769556561 +2682 6 6.5731144 0.57311439514160156 0.32846010991852381 +2684 6 6.47421932 0.47421932220458984 0.2248839655521806 +2685 7 6.35321856 0.64678144454956055 0.41832623701361626 +2686 6 6.623215 0.6232151985168457 0.3883971836623914 +2687 5 5.35341358 0.35341358184814453 0.12490115983473515 +2688 6 5.92039251 0.079607486724853516 0.0063373519426477287 +2689 6 5.86066055 0.13933944702148438 0.019415481496253051 +2690 6 5.578879 0.42112112045288086 0.17734299809148979 +2691 6 6.09161 0.091609954833984375 0.0083923838246846572 +2692 6 5.729569 0.2704310417175293 0.073132948324428071 +2693 6 6.20171928 0.20171928405761719 0.040690669560717652 +2695 6 6.645086 0.64508581161499023 0.41613570434697067 +2696 6 5.84798431 0.15201568603515625 0.023108768800739199 +2701 5 5.37176561 0.3717656135559082 0.13820967142260088 +2702 5 5.37176561 0.3717656135559082 0.13820967142260088 +2704 6 5.31003237 0.68996763229370117 0.47605533361297603 +2705 6 5.31003237 0.68996763229370117 0.47605533361297603 +2708 6 5.497318 0.50268220901489258 0.25268940326009215 +2713 6 5.497318 0.50268220901489258 0.25268940326009215 +2714 6 5.59170675 0.40829324722290039 0.16670337572782046 +2715 6 6.01414633 0.014146327972412109 0.0002001185951030493 +2719 6 6.004554 0.0045537948608398438 2.0737047634611372E-05 +2720 7 6.80529833 0.1947016716003418 0.037908740923967343 +2725 5 5.448 0.44799995422363281 0.2007039589843771 +2726 6 5.924554 0.075446128845214844 0.0056921183577287593 +2734 6 5.794034 0.20596599578857422 0.042421991421178973 +2735 6 5.434296 0.5657038688659668 0.32002086724992296 +2736 6 6.01298857 0.012988567352294922 0.00016870288186510152 +2737 7 6.007834 0.99216604232788086 0.98439345554857027 +2738 5 4.610934 0.38906621932983398 0.15137252302361048 +2741 5 4.610934 0.38906621932983398 0.15137252302361048 +2742 6 6.00884151 0.0088415145874023438 7.8172380199248437E-05 +2746 6 5.95755863 0.042441368103027344 0.0018012697264566668 +2747 6 5.59035969 0.40964031219482422 0.16780518537507305 +2748 8 6.45529556 1.5447044372558594 2.3861117984779412 +2750 8 6.45529556 1.5447044372558594 2.3861117984779412 +2751 6 6.10585451 0.10585451126098633 0.011205177554302281 +2763 6 5.63824034 0.36175966262817383 0.13087005350485015 +2765 6 6.276466 0.27646589279174805 0.076433389877138325 +2766 6 6.528149 0.52814912796020508 0.27894150136512508 +2767 6 5.705548 0.29445219039916992 0.086702092430869016 +2772 7 6.990375 0.0096249580383300781 9.2639817239614786E-05 +2774 8 6.647418 1.3525819778442383 1.8294780067890315 +2775 8 6.647418 1.3525819778442383 1.8294780067890315 +2777 6 6.116481 0.11648082733154297 0.013567783135840727 +2783 6 6.070306 0.070305824279785156 0.004942908927660028 +2785 5 5.43653631 0.43653631210327148 0.19056395178472485 +2786 6 6.944194 0.94419384002685547 0.89150200754465914 +2788 5 5.14618063 0.14618062973022461 0.021368776508325027 +2790 6 5.996413 0.0035867691040039063 1.2864912605436984E-05 +2791 5 5.06431532 0.064315319061279297 0.0041364602659541561 +2794 5 5.196513 0.19651317596435547 0.038617428327597736 +2796 7 6.7877326 0.21226739883422852 0.045057448607849437 +2798 7 5.97907734 1.0209226608276367 1.0422830793913818 +2799 7 6.517823 0.48217678070068359 0.23249444784687512 +2801 5 5.36617851 0.36617851257324219 0.13408670307035209 +2802 6 5.80672932 0.19327068328857422 0.037353557018832362 +2803 8 6.202484 1.797515869140625 3.2310632998123765 +2805 6 6.34842634 0.34842634201049805 0.12140091580681656 +2806 5 5.6479187 0.647918701171875 0.41979864332824945 +2807 5 5.6928525 0.69285249710083008 0.48004458273885575 +2812 6 6.332061 0.33206081390380859 0.1102643841304598 +2815 5 5.5959425 0.59594249725341797 0.35514746003264008 +2816 5 5.84147549 0.84147548675537109 0.70808099481018871 +2817 7 7.080033 0.080032825469970703 0.0064052531527067913 +2819 6 6.2077837 0.20778369903564453 0.043174065584935306 +2820 5 5.42021656 0.42021656036376953 0.17658195760395756 +2821 5 5.69374561 0.69374561309814453 0.48128297569292044 +2822 5 5.76683855 0.76683855056762695 0.58804136263665896 +2824 6 5.575345 0.42465496063232422 0.18033183558964083 +2825 6 5.79173851 0.20826148986816406 0.043372848162107402 +2826 6 5.548999 0.45100116729736328 0.20340205290358426 +2827 7 6.41423273 0.58576726913452148 0.34312329358931493 +2828 7 6.41423273 0.58576726913452148 0.34312329358931493 +2829 5 5.660426 0.66042613983154297 0.43616268617279275 +2832 6 6.22251129 0.22251129150390625 0.049511274846736342 +2834 6 6.2342124 0.23421239852905273 0.054855447624731823 +2835 6 5.79173851 0.20826148986816406 0.043372848162107402 +2838 7 6.53514433 0.46485567092895508 0.21609079479480897 +2841 6 5.84660959 0.15339040756225586 0.02352861713211496 +2843 6 5.64633465 0.35366535186767578 0.12507918111168692 +2845 7 6.833482 0.16651821136474609 0.027728314716114255 +2849 5 5.037817 0.037817001342773438 0.001430125590559328 +2851 5 5.75162268 0.75162267684936523 0.56493664835420532 +2853 6 6.388475 0.38847494125366211 0.15091277998203623 +2855 7 6.26280069 0.73719930648803711 0.54346281748644287 +2857 8 6.98407269 1.0159273147583008 1.0321083088720115 +2858 7 6.26280069 0.73719930648803711 0.54346281748644287 +2859 6 6.298114 0.29811382293701172 0.088871851426119974 +2862 6 6.979329 0.97932910919189453 0.95908550411058968 +2864 6 6.388475 0.38847494125366211 0.15091277998203623 +2866 7 6.742437 0.25756311416625977 0.066338757779021762 +2867 7 6.51812935 0.48187065124511719 0.23219932453139336 +2874 7 6.914118 0.085882186889648438 0.007375750024948502 +2875 6 6.06492567 0.064925670623779297 0.004215342705947478 +2876 5 6.01396847 1.0139684677124023 1.0281320535150371 +2877 5 5.71460772 0.71460771560668945 0.51066418720461115 +2878 6 7.44846964 1.4484696388244629 2.09806429459627 +2880 5 5.61933041 0.61933040618896484 0.38357015203018818 +2882 5 5.98323154 0.98323154449462891 0.96674427008929342 +2883 7 6.836774 0.16322612762451172 0.026642768739293388 +2884 7 6.89757824 0.10242176055908203 0.010490217036021932 +2885 6 6.65348339 0.65348339080810547 0.4270405420620591 +2886 5 5.506567 0.50656700134277344 0.25661012684940943 +2887 5 6.570382 1.5703821182250977 2.4660999972411446 +2888 4 5.380556 1.3805561065673828 1.9059351633804908 +2889 6 6.397633 0.39763307571411133 0.15811206290186419 +2892 5 5.364448 0.36444807052612305 0.13282239611021396 +2894 7 6.20067549 0.79932451248168945 0.63891967625409052 +2897 5 5.364448 0.36444807052612305 0.13282239611021396 +2899 5 5.146842 0.14684200286865234 0.021562573806477303 +2900 6 6.481261 0.48126077651977539 0.23161193501641719 +2901 7 6.732033 0.26796722412109375 0.071806433203164488 +2907 6 5.935697 0.064302921295166016 0.0041348656870923151 +2908 6 6.063202 0.063201904296875 0.0039944807067513466 +2909 6 6.188701 0.18870115280151367 0.035608125068620211 +2912 7 6.732033 0.26796722412109375 0.071806433203164488 +2914 6 6.351888 0.35188817977905273 0.12382529106821494 +2915 6 6.351888 0.35188817977905273 0.12382529106821494 +2916 6 7.193787 1.1937870979309082 1.4251276351862998 +2917 7 6.77892828 0.22107172012329102 0.048872705438270714 +2918 6 6.00741529 0.0074152946472167969 5.498659470504208E-05 +2921 6 5.207289 0.79271078109741211 0.62839038246806922 +2922 8 6.728791 1.2712087631225586 1.6159717194395853 +2925 5 5.5744133 0.57441329956054688 0.32995063871203456 +2926 8 6.433487 1.5665130615234375 2.4539631719235331 +2928 7 6.725618 0.27438211441040039 0.07528554470832205 +2930 8 6.32433462 1.6756653785705566 2.8078544609400069 +2931 8 6.433487 1.5665130615234375 2.4539631719235331 +2932 6 6.040474 0.04047393798828125 0.0016381396562792361 +2935 4 5.525333 1.5253329277038574 2.3266405403376211 +2936 5 5.521468 0.52146816253662109 0.27192904453931988 +2938 8 6.206464 1.7935361862182617 3.2167720512743472 +2939 8 6.206464 1.7935361862182617 3.2167720512743472 +2942 5 5.47682953 0.47682952880859375 0.22736639954382554 +2945 8 6.9402957 1.0597043037414551 1.1229732113681621 +2946 6 6.150122 0.15012216567993164 0.022536664628432845 +2951 5 5.433133 0.43313312530517578 0.1876043042366291 +2952 5 5.218945 0.21894502639770508 0.047936924584291773 +2954 7 6.82631826 0.17368173599243164 0.030165345417344724 +2957 6 6.40513372 0.40513372421264648 0.1641333344944087 +2958 5 5.433133 0.43313312530517578 0.1876043042366291 +2960 7 6.320663 0.6793370246887207 0.46149879311292352 +2963 7 6.758505 0.24149513244628906 0.058319898995250696 +2966 6 6.074806 0.07480621337890625 0.0055959695600904524 +2969 6 6.37035227 0.37035226821899414 0.13716080257495378 +2972 6 5.967377 0.032622814178466797 0.0010642480049227743 +2973 6 6.074806 0.07480621337890625 0.0055959695600904524 +2974 6 6.11917543 0.11917543411254883 0.014202784095914467 +2976 6 6.85677767 0.85677766799926758 0.73406797238226318 +2977 6 5.64738846 0.35261154174804688 0.1243348993739346 +2978 6 5.64738846 0.35261154174804688 0.1243348993739346 +2979 7 7.00416327 0.0041632652282714844 1.7332777360934415E-05 +2980 7 6.459112 0.54088783264160156 0.29255964749972918 +2982 6 6.08631945 0.086319446563720703 0.0074510468550670339 +2983 6 6.486003 0.48600292205810547 0.23619884024901694 +2986 7 6.642583 0.35741710662841797 0.1277469881106299 +2988 7 6.099473 0.90052700042724609 0.81094887849849329 +2990 7 7.303502 0.30350208282470703 0.092113514278935327 +2992 7 6.31785631 0.6821436882019043 0.46532001135369683 +2993 7 6.642583 0.35741710662841797 0.1277469881106299 +2995 6 6.261716 0.26171588897705078 0.068495206543047971 +2998 7 6.02018 0.97981977462768555 0.9600467907514485 +3003 7 6.099473 0.90052700042724609 0.81094887849849329 +3007 7 7.303502 0.30350208282470703 0.092113514278935327 +3008 7 7.05388927 0.053889274597167969 0.0029040539166089729 +3009 6 5.962095 0.037905216217041016 0.0014368054164606292 +3010 5 5.75205231 0.75205230712890625 0.56558267265791073 +3011 6 6.4816947 0.48169469833374023 0.23202978240283301 +3012 6 6.84173775 0.84173774719238281 0.70852243504850776 +3015 6 6.66586542 0.66586542129516602 0.44337675927658893 +3017 6 7.075902 1.075901985168457 1.1575650816894267 +3018 8 7.011235 0.98876476287841797 0.97765575631001411 +3019 6 6.66586542 0.66586542129516602 0.44337675927658893 +3021 4 5.329598 1.3295979499816895 1.7678307085955112 +3024 6 6.08960772 0.089607715606689453 0.0080295426962493366 +3025 7 5.93795824 1.0620417594909668 1.1279326989026686 +3030 8 7.151422 0.84857797622680664 0.72008458173718282 +3032 5 6.76317167 1.7631716728210449 3.1087743478385619 +3035 7 6.09332848 0.90667152404785156 0.82205325251925387 +3036 5 5.510598 0.51059818267822266 0.26071050415430364 +3041 6 5.37881136 0.62118864059448242 0.38587532720362105 +3042 6 5.661942 0.3380579948425293 0.11428320787695156 +3047 5 5.774637 0.77463722229003906 0.60006282615722739 +3048 6 6.35629272 0.356292724609375 0.12694450560957193 +3051 5 4.92406559 0.075934410095214844 0.005766034636508266 +3052 7 5.75310135 1.2468986511230469 1.5547562461724738 +3054 6 6.408374 0.40837383270263672 0.16676918723624112 +3057 5 6.842451 1.8424510955810547 3.3946260396078287 +3060 5 5.91603136 0.9160313606262207 0.83911345365072521 +3061 5 5.91603136 0.9160313606262207 0.83911345365072521 +3063 5 5.91603136 0.9160313606262207 0.83911345365072521 +3067 4 5.671678 1.6716780662536621 2.7945075571935831 +3068 6 6.87566 0.87565994262695313 0.76678033512143884 +3071 7 6.60551071 0.39448928833007813 0.15562179860717151 +3081 5 5.91603136 0.9160313606262207 0.83911345365072521 +3082 6 5.680128 0.31987190246582031 0.10231803398710326 +3083 7 6.60002565 0.39997434616088867 0.1599794775868304 +3085 6 6.02571249 0.025712490081787109 0.00066113214620600047 +3087 3 5.521938 2.5219378471374512 6.360170504824282 +3089 7 6.60497332 0.39502668380737305 0.15604608091985028 +3092 6 5.875346 0.12465381622314453 0.015538573898993491 +3093 7 6.42221928 0.57778072357177734 0.33383056453112658 +3096 7 6.04160261 0.95839738845825195 0.91852555420359749 +3098 7 6.134868 0.86513185501098633 0.74845312655475027 +3100 7 6.25054932 0.74945068359375 0.56167632713913918 +3103 7 6.42221928 0.57778072357177734 0.33383056453112658 +3107 6 5.812541 0.18745899200439453 0.035140873683303653 +3109 4 5.29554653 1.2955465316772461 1.6784408157409416 +3110 6 6.20626926 0.20626926422119141 0.042547009362351673 +3118 7 6.6532855 0.34671449661254883 0.12021094216129313 +3121 5 5.4326396 0.43263959884643555 0.18717702249000467 +3123 5 6.173872 1.1738719940185547 1.3779754583410977 +3127 5 5.83897829 0.83897829055786133 0.70388457202739119 +3129 6 6.11212063 0.11212062835693359 0.012571035303153621 +3130 6 6.62801 0.62800979614257813 0.39439630405104253 +3132 6 6.119272 0.11927223205566406 0.014225865339540178 +3134 6 6.2366147 0.23661470413208008 0.055986518211511793 +3136 5 5.514752 0.51475191116333008 0.26496953004630086 +3137 6 5.9501214 0.049878597259521484 0.0024878744645775441 +3139 6 5.58149433 0.41850566864013672 0.17514699468392791 +3142 6 5.798257 0.20174312591552734 0.040700288854168321 +3148 6 5.95302 0.046979904174804688 0.0022071113962738309 +3149 6 6.175666 0.17566585540771484 0.030858492756124178 +3150 6 6.9550066 0.95500659942626953 0.91203760494772723 +3152 6 6.06551075 0.065510749816894531 0.0042916583415717469 +3153 6 6.341843 0.3418431282043457 0.11685672430053273 +3155 7 7.05393267 0.053932666778564453 0.0029087325458476698 +3156 5 5.629764 0.62976408004760742 0.39660279651820929 +3160 6 5.82131863 0.17868137359619141 0.031927033270221727 +3161 5 5.629764 0.62976408004760742 0.39660279651820929 +3163 7 7.06213474 0.062134742736816406 0.0038607262549703592 +3165 6 5.43980265 0.56019735336303711 0.31382107471495146 +3169 6 6.016192 0.016191959381103516 0.00026217954859930614 +3170 6 6.274177 0.27417707443237305 0.07517306814429503 +3171 6 6.243532 0.24353218078613281 0.059307923078449676 +3180 6 6.34757662 0.34757661819458008 0.1208095055155809 +3184 7 6.41739655 0.58260345458984375 0.33942678530002013 +3185 6 6.49914455 0.49914455413818359 0.24914528592580609 +3186 4 5.41402626 1.4140262603759766 1.9994702650328691 +3187 7 6.36057663 0.63942337036132813 0.40886224656424019 +3188 8 6.252697 1.7473030090332031 3.0530678053764859 +3191 6 6.047302 0.047301769256591797 0.0022374573748038529 +3194 5 5.340684 0.34068393707275391 0.11606554497939214 +3196 7 6.3920126 0.60798740386962891 0.36964868326413125 +3198 7 6.3920126 0.60798740386962891 0.36964868326413125 +3202 7 6.708888 0.29111194610595703 0.084746165165597631 +3203 7 6.3920126 0.60798740386962891 0.36964868326413125 +3205 7 6.96342325 0.036576747894287109 0.0013378584865222365 +3207 6 6.063226 0.063226222991943359 0.0039975552738269471 +3210 5 5.12971735 0.12971735000610352 0.016826590892605964 +3213 6 5.94969034 0.050309658050537109 0.0025310616931619734 +3214 6 6.1900773 0.19007730484008789 0.036129381815271699 +3219 7 6.91940975 0.080590248107910156 0.0064947880900945165 +3221 6 6.66447926 0.66447925567626953 0.44153268122408917 +3222 6 6.301735 0.30173492431640625 0.091043964552227408 +3223 6 6.180912 0.18091201782226563 0.032729158192523755 +3226 6 6.033703 0.033702850341796875 0.0011358821211615577 +3227 6 5.27611446 0.72388553619384766 0.52401026951065433 +3232 5 6.434669 1.434669017791748 2.0582751906115391 +3236 6 6.92699432 0.92699432373046875 0.8593184762285091 +3239 7 6.684847 0.31515312194824219 0.099321490273723612 +3240 6 6.14441633 0.14441633224487305 0.020856077019061559 +3241 7 6.31036854 0.68963146209716797 0.47559155351427762 +3242 6 6.469078 0.46907806396484375 0.22003423009300604 +3244 7 6.741383 0.25861692428588867 0.066882713527093074 +3246 6 6.53103065 0.53103065490722656 0.28199355645119795 +3247 6 6.181634 0.18163394927978516 0.032990891530971567 +3248 7 6.287761 0.71223878860473633 0.50728409199314228 +3251 6 5.55754375 0.44245624542236328 0.19576752911325457 +3252 8 6.597662 1.4023380279541016 1.9665519446461985 +3253 8 6.34131336 1.658686637878418 2.7512413626764101 +3255 6 6.1782856 0.17828559875488281 0.031785754723387072 +3256 6 6.1782856 0.17828559875488281 0.031785754723387072 +3258 6 6.1782856 0.17828559875488281 0.031785754723387072 +3263 8 6.55796432 1.4420356750488281 2.0794668881135294 +3264 6 4.65063143 1.3493685722351074 1.8207955437358123 +3266 6 6.52961636 0.52961635589599609 0.2804934844325544 +3267 6 5.60741472 0.39258527755737305 0.15412320015479963 +3269 5 5.20599842 0.20599842071533203 0.042435349337210937 +3271 7 6.82550669 0.17449331283569336 0.030447916224375149 +3272 7 5.845716 1.1542840003967285 1.3323715535718748 +3273 7 6.585916 0.41408395767211914 0.17146552400140536 +3274 5 6.55339956 1.5533995628356934 2.4130502018181232 +3275 4 5.209161 1.2091608047485352 1.4620698517401252 +3277 7 5.775679 1.2243208885192871 1.4989616380646567 +3278 5 5.20599842 0.20599842071533203 0.042435349337210937 +3281 6 6.54781961 0.54781961441040039 0.30010632993275976 +3282 7 6.30941963 0.69058036804199219 0.47690124472501338 +3283 6 6.47506571 0.47506570816040039 0.22568742706994271 +3284 6 6.076994 0.076993942260742188 0.0059280671448505018 +3287 7 6.56880236 0.4311976432800293 0.18593140757025139 +3288 6 6.47506571 0.47506570816040039 0.22568742706994271 +3290 5 5.51041555 0.51041555404663086 0.26052403781272915 +3293 7 6.16678238 0.83321762084960938 0.6942516036942834 +3295 5 5.39381552 0.39381551742553711 0.15509066176514352 +3296 5 5.47942972 0.47942972183227539 0.22985285817617296 +3297 5 5.28573465 0.28573465347290039 0.081644292195278467 +3298 6 6.50759029 0.50759029388427734 0.25764790644552704 +3299 7 6.7499404 0.25005960464477539 0.062529805875101374 +3300 5 5.51041555 0.51041555404663086 0.26052403781272915 +3302 6 6.70693874 0.70693874359130859 0.49976238719045796 +3303 7 6.506652 0.49334812164306641 0.24339236912874185 +3305 7 6.431296 0.56870412826538086 0.32342438550608676 +3306 7 6.60756159 0.39243841171264648 0.15400790698754463 +3308 6 5.94220924 0.057790756225585938 0.0033397715051250998 +3309 7 7.01701355 0.0170135498046875 0.00028946087695658207 +3310 7 6.482798 0.51720190048217773 0.26749780586237648 +3311 7 6.162655 0.83734512329101563 0.70114685549924616 +3313 7 5.716633 1.2833671569824219 1.6470312596211443 +3314 6 4.96552658 1.0344734191894531 1.070135255009518 +3316 6 6.66608953 0.66608953475952148 0.44367526831615578 +3317 6 6.324064 0.32406377792358398 0.10501733216210596 +3318 7 6.45378256 0.54621744155883789 0.29835349346308249 +3319 5 6.07571745 1.0757174491882324 1.1571680304880374 +3321 6 7.0864 1.086400032043457 1.1802650296240245 +3323 6 6.006462 0.00646209716796875 4.1758699808269739E-05 +3326 5 5.880373 0.88037300109863281 0.77505662106341333 +3328 5 6.10443 1.1044301986694336 1.2197660637330046 +3330 6 5.89951468 0.10048532485961914 0.010097300512143192 +3332 7 6.57549572 0.42450428009033203 0.18020388381501107 +3333 6 5.77693367 0.22306632995605469 0.049758587560063461 +3335 6 5.480915 0.51908493041992188 0.26944916498905513 +3336 6 5.480915 0.51908493041992188 0.26944916498905513 +3337 6 5.480915 0.51908493041992188 0.26944916498905513 +3342 5 6.37601328 1.3760132789611816 1.8934125438775027 +3343 7 5.399277 1.6007227897644043 2.5623134496711373 +3344 6 5.480915 0.51908493041992188 0.26944916498905513 +3346 6 6.18561268 0.18561267852783203 0.034452066430276318 +3347 6 5.61463 0.38536977767944336 0.1485098655487036 +3351 6 6.587807 0.58780717849731445 0.34551727909297369 +3355 6 6.764193 0.76419305801391602 0.58399102991666041 +3356 6 5.75061131 0.24938869476318359 0.062194721075684356 +3357 7 6.187659 0.81234121322631836 0.65989824670600683 +3359 6 6.55126047 0.55126047134399414 0.30388810726640259 +3361 6 6.112465 0.11246490478515625 0.012648354808334261 +3363 6 6.587807 0.58780717849731445 0.34551727909297369 +3365 7 6.378836 0.62116384506225586 0.3858445224125262 +3366 6 6.07021 0.070209980010986328 0.0049294412931430998 +3369 7 6.64197254 0.35802745819091797 0.12818366081864951 +3370 6 6.12879467 0.12879467010498047 0.01658806704745075 +3371 6 6.07021 0.070209980010986328 0.0049294412931430998 +3372 6 5.995269 0.0047311782836914063 2.2384047952073161E-05 +3376 6 5.968429 0.031570911407470703 0.00099672244709836377 +3382 7 6.80490828 0.19509172439575195 0.038060780927708038 +3383 6 6.54890728 0.54890727996826172 0.30129920200215565 +3384 6 5.939944 0.060056209564208984 0.0036067483072201867 +3387 5 5.34240532 0.34240531921386719 0.11724140262595029 +3389 7 6.63416529 0.36583471298217773 0.13383503722275236 +3390 6 6.90913439 0.9091343879699707 0.82652533538953321 +3397 6 5.771987 0.22801303863525391 0.051989945787681791 +3399 6 6.254692 0.25469207763671875 0.064868054410908371 +3400 6 5.488096 0.51190376281738281 0.26204546238659532 +3401 5 6.17827 1.1782698631286621 1.3883198703572361 +3405 6 5.978143 0.021856784820556641 0.00047771904269211518 +3406 6 6.254692 0.25469207763671875 0.064868054410908371 +3408 6 5.355218 0.64478206634521484 0.41574391308040504 +3409 3 6.249504 3.2495040893554688 10.559276826737914 +3411 6 6.2559967 0.2559967041015625 0.065534312510862947 +3414 7 6.424868 0.57513189315795898 0.33077669452745795 +3416 6 5.658931 0.34106922149658203 0.11632821385228453 +3422 8 6.920657 1.0793428421020508 1.1649809707969325 +3423 5 5.87612247 0.87612247467041016 0.76759059062260349 +3425 6 5.945171 0.054829120635986328 0.0030062324697155418 +3431 6 5.9485817 0.051418304443359375 0.0026438420318299904 +3435 6 6.27855062 0.27855062484741211 0.07759045060288372 +3437 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3439 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3442 7 6.433718 0.56628179550170898 0.32067507191663935 +3450 7 6.13693428 0.86306571960449219 0.74488243635641993 +3451 7 6.13693428 0.86306571960449219 0.74488243635641993 +3452 5 5.50814629 0.50814628601074219 0.258212647986511 +3454 5 5.78949451 0.78949451446533203 0.62330158837085037 +3455 6 6.10091829 0.10091829299926758 0.010184501861886019 +3456 5 5.165694 0.16569423675537109 0.027454580093944969 +3457 7 6.41468048 0.58531951904296875 0.34259893937269226 +3458 7 7.00273228 0.0027322769165039063 7.4653371484600939E-06 +3459 6 5.586149 0.41385078430175781 0.17127247166718007 +3461 8 5.846415 2.1535849571228027 4.6379281675456241 +3463 7 6.44663429 0.55336570739746094 0.30621360612349235 +3465 6 6.514682 0.51468181610107422 0.26489737182509998 +3467 5 5.617366 0.61736583709716797 0.38114057681468694 +3470 8 5.846415 2.1535849571228027 4.6379281675456241 +3472 6 6.150368 0.15036821365356445 0.022610599677364007 +3473 8 7.01380634 0.98619365692138672 0.97257792895197781 +3475 6 5.450064 0.54993581771850586 0.3024294036097217 +3477 7 5.99216938 1.0078306198120117 1.0157225582306637 +3478 6 5.450064 0.54993581771850586 0.3024294036097217 +3480 8 7.01380634 0.98619365692138672 0.97257792895197781 +3481 5 5.58673239 0.58673238754272461 0.34425489459158598 +3482 8 7.08236551 0.91763448715209961 0.84205305201089686 +3483 7 6.701889 0.2981109619140625 0.088870145613327622 +3484 8 7.058996 0.94100379943847656 0.88548815055764862 +3487 6 5.8508 0.1491999626159668 0.02226062884460589 +3488 6 5.71093845 0.28906154632568359 0.083556577564195322 +3490 7 5.99216938 1.0078306198120117 1.0157225582306637 +3491 6 5.7541585 0.24584150314331055 0.060438044667762369 +3493 7 6.74980736 0.25019264221191406 0.062596358216978842 +3494 6 6.46438169 0.46438169479370117 0.21565035845947023 +3497 6 6.36502266 0.36502265930175781 0.13324154180372716 +3500 7 6.74980736 0.25019264221191406 0.062596358216978842 +3502 5 5.36248827 0.3624882698059082 0.1313977457468809 +3503 7 6.881829 0.11817121505737305 0.01396443606813591 +3504 7 6.456562 0.54343795776367188 0.29532481393835042 +3506 6 6.33520365 0.33520364761352539 0.11236148537341251 +3507 7 7.048058 0.048058032989501953 0.002309574534820058 +3511 7 6.360972 0.63902807235717773 0.40835687726053038 +3513 6 6.1044445 0.10444450378417969 0.010908654370723525 +3516 7 7.216322 0.21632194519042969 0.046795183970971266 +3517 7 6.28893232 0.71106767654418945 0.50561724062595204 +3518 5 5.6771 0.67710018157958984 0.45846465589511354 +3519 7 6.63483524 0.36516475677490234 0.13334529959047359 +3520 5 4.63872862 0.36127138137817383 0.13051701100289392 +3522 5 5.43848848 0.43848848342895508 0.19227215009982501 +3523 5 4.63872862 0.36127138137817383 0.13051701100289392 +3526 6 5.771936 0.22806406021118164 0.052013215560009485 +3527 6 5.60652447 0.39347553253173828 0.15482299470113503 +3528 4 4.22449064 0.22449064254760742 0.050396048591437648 +3529 7 6.925511 0.074489116668701172 0.0055486285020833748 +3531 5 5.419897 0.41989707946777344 0.17631355734556564 +3532 6 6.31524754 0.31524753570556641 0.099381008768432366 +3533 6 5.39744234 0.60255765914916992 0.36307573259932724 +3536 6 6.21340227 0.21340227127075195 0.045540529383515604 +3537 5 5.512594 0.51259422302246094 0.26275283747600042 +3541 6 6.600255 0.60025501251220703 0.36030608004602982 +3542 6 5.77705956 0.22294044494628906 0.049702441992849344 +3543 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3544 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3546 6 5.77705956 0.22294044494628906 0.049702441992849344 +3547 6 6.06106949 0.061069488525390625 0.0037294824287528172 +3551 6 5.96327829 0.036721706390380859 0.0013484837202213384 +3555 6 5.940423 0.059576988220214844 0.0035494175253916183 +3560 6 5.945829 0.054171085357666016 0.0029345064888275374 +3564 6 5.945829 0.054171085357666016 0.0029345064888275374 +3566 6 5.766171 0.23382902145385742 0.054676011274068514 +3567 6 6.155753 0.15575313568115234 0.024259039274511451 +3568 7 6.18249464 0.8175053596496582 0.66831501305591701 +3572 6 5.766171 0.23382902145385742 0.054676011274068514 +3573 6 6.43890572 0.43890571594238281 0.19263822748689563 +3574 6 5.84190035 0.15809965133666992 0.024995499752776595 +3576 5 5.53407145 0.53407144546508789 0.28523230886116835 +3577 7 6.537883 0.46211719512939453 0.2135523020342589 +3578 4 5.00972128 1.0097212791442871 1.0195370615567754 +3579 7 6.75660372 0.24339628219604492 0.059241750186856734 +3580 5 5.873912 0.87391185760498047 0.76372193486258766 +3581 7 6.92469168 0.075308322906494141 0.0056713434989887901 +3582 6 6.65167 0.65166997909545898 0.42467376165427595 +3585 7 5.9642787 1.0357213020324707 1.0727186154838364 +3588 6 5.67989063 0.32010936737060547 0.10247000707840925 +3589 6 5.67989063 0.32010936737060547 0.10247000707840925 +3590 7 6.14944029 0.85055971145629883 0.72345182275262232 +3591 5 5.725536 0.72553586959838867 0.52640229807389005 +3593 7 6.46629429 0.53370571136474609 0.28484178634334967 +3594 7 6.41927671 0.58072328567504883 0.33723953452522437 +3595 7 6.160583 0.8394169807434082 0.70462086756037934 +3596 7 6.45985126 0.54014873504638672 0.29176065597221168 +3597 6 5.80583334 0.19416666030883789 0.037700691975487644 +3601 7 6.27083 0.72916984558105469 0.53168866370469914 +3602 6 6.525956 0.52595615386962891 0.27662987579333276 +3603 7 7.042205 0.042204856872558594 0.0017812499436331564 +3604 6 6.36735773 0.36735773086547852 0.13495170242663335 +3606 5 5.287236 0.28723621368408203 0.082504642451567634 +3608 6 6.211688 0.21168804168701172 0.044811826993282011 +3609 6 6.211688 0.21168804168701172 0.044811826993282011 +3610 5 5.13587236 0.13587236404418945 0.018461299310956747 +3611 6 6.12487125 0.12487125396728516 0.015592830067362229 +3612 6 6.04896259 0.048962593078613281 0.0023973355209818692 +3617 5 5.854528 0.85452795028686523 0.73021801782147122 +3618 7 5.47124434 1.5287556648254395 2.3370938827358714 +3619 6 5.60418129 0.39581871032714844 0.15667245144504705 +3621 7 5.47124434 1.5287556648254395 2.3370938827358714 +3623 6 5.60418129 0.39581871032714844 0.15667245144504705 +3624 7 6.501575 0.49842500686645508 0.24842748746982579 +3626 5 5.854528 0.85452795028686523 0.73021801782147122 +3630 6 5.904811 0.095189094543457031 0.0090609637200032012 +3632 6 5.92054844 0.079451560974121094 0.006312550541224482 +3633 6 5.904811 0.095189094543457031 0.0090609637200032012 +3634 7 6.57682848 0.4231715202331543 0.17907413553643892 +3636 7 5.96985435 1.0301456451416016 1.0612000502042065 +3641 6 5.971013 0.028986930847167969 0.00084024215993849793 +3642 6 5.971013 0.028986930847167969 0.00084024215993849793 +3644 7 5.678783 1.3212170600891113 1.7456145198705144 +3648 5 5.74037838 0.74037837982177734 0.54816014530752 +3649 6 6.519111 0.51911115646362305 0.26947639276500013 +3651 6 5.12625 0.87375020980834961 0.76343942914013496 +3654 6 6.135282 0.13528203964233398 0.018301230249790024 +3657 8 5.38427353 2.6157264709472656 6.8420249708142364 +3659 8 6.844641 1.1553587913513184 1.3348539367527792 +3662 4 4.4436326 0.44363260269165039 0.19680988617096773 +3663 6 6.863979 0.86397886276245117 0.74645947530029844 +3664 8 6.80742931 1.192570686340332 1.4222248419182506 +3665 8 6.844641 1.1553587913513184 1.3348539367527792 +3666 7 5.95530224 1.0446977615356445 1.0913934129575864 +3667 8 7.26183653 0.73816347122192383 0.54488531024639997 +3669 7 6.904336 0.095664024353027344 0.0091516055554166087 +3670 6 5.6326046 0.36739540100097656 0.13497938067666837 +3671 7 6.716537 0.2834630012512207 0.08035127307834955 +3672 8 6.25013828 1.7498617172241211 3.0620160294065499 +3673 7 6.419122 0.58087778091430664 0.33741899635992922 +3674 5 5.183054 0.18305397033691406 0.033508756056107813 +3675 6 5.74832344 0.25167655944824219 0.063341090575704584 +3676 7 6.419122 0.58087778091430664 0.33741899635992922 +3678 5 5.605777 0.60577678680419922 0.36696551543082023 +3682 7 6.35266447 0.64733552932739258 0.41904328752957554 +3683 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3685 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3686 5 4.976153 0.023847103118896484 0.00056868432716328243 +3689 8 7.283064 0.71693611145019531 0.51399738790132687 +3690 7 6.09959555 0.90040445327758789 0.81072817948211195 +3691 6 6.28709745 0.28709745407104492 0.082424948134075748 +3692 7 6.131696 0.86830377578735352 0.75395144704657469 +3693 7 7.00987864 0.0098786354064941406 9.7587437494439655E-05 +3694 5 5.605777 0.60577678680419922 0.36696551543082023 +3695 6 6.348696 0.34869623184204102 0.12158906210083842 +3696 7 6.35266447 0.64733552932739258 0.41904328752957554 +3700 5 5.18188858 0.18188858032226563 0.033083455651649274 +3701 5 5.09758472 0.097584724426269531 0.0095227784413509653 +3705 6 5.87677574 0.12322425842285156 0.015184217863861704 +3707 6 6.29291725 0.29291725158691406 0.085800516277231509 +3708 5 4.619965 0.3800349235534668 0.14442654312028935 +3709 5 5.35854626 0.35854625701904297 0.12855541842236562 +3710 5 4.773655 0.22634506225585938 0.051232087207608856 +3711 6 5.87677574 0.12322425842285156 0.015184217863861704 +3712 5 5.613295 0.61329507827758789 0.37613085303951266 +3713 5 4.951788 0.048212051391601563 0.0023244018993864302 +3715 6 5.41483 0.58516979217529297 0.34242368567447556 +3717 6 5.635741 0.36425876617431641 0.13268444873483531 +3719 5 5.69777346 0.69777345657348633 0.48688779669851101 +3722 5 5.10440445 0.10440444946289063 0.010900289067649283 +3725 6 6.60588837 0.60588836669921875 0.36710071290144697 +3726 7 6.394304 0.60569620132446289 0.36686788829888428 +3727 7 6.48175955 0.51824045181274414 0.26857316589507718 +3729 5 5.45680952 0.45680952072143555 0.20867493822174765 +3732 5 5.45680952 0.45680952072143555 0.20867493822174765 +3736 4 6.64277124 2.6427712440490723 6.9842398483726811 +3737 5 5.82993937 0.82993936538696289 0.6887993502189147 +3740 7 6.85790253 0.14209747314453125 0.02019169187406078 +3742 7 6.85790253 0.14209747314453125 0.02019169187406078 +3743 7 6.85790253 0.14209747314453125 0.02019169187406078 +3746 5 6.410911 1.4109110832214355 1.9906700847570846 +3747 6 5.903495 0.096505165100097656 0.0093132468909971067 +3751 5 5.30141163 0.30141162872314453 0.090848969929538725 +3752 5 5.49193048 0.49193048477172852 0.24199560184774782 +3754 8 7.51627445 0.48372554779052734 0.23399040558524575 +3755 6 6.62061739 0.62061738967895508 0.38516594437191998 +3756 5 5.30141163 0.30141162872314453 0.090848969929538725 +3758 5 5.33939171 0.33939170837402344 0.11518673171303817 +3760 6 6.52007627 0.52007627487182617 0.27047933168455529 +3761 7 6.4862113 0.51378870010375977 0.26397882835431119 +3763 5 6.282187 1.2821869850158691 1.6440034645440846 +3765 5 5.128152 0.12815189361572266 0.016422907837295497 +3768 6 5.7956624 0.20433759689331055 0.041753853504133076 +3770 4 6.34593534 2.3459353446960449 5.5034126414941511 +3773 5 5.937312 0.93731212615966797 0.87855402184595732 +3774 5 5.42767525 0.42767524719238281 0.18290611706106574 +3775 6 6.66805124 0.66805124282836914 0.44629246304452863 +3777 6 6.66805124 0.66805124282836914 0.44629246304452863 +3780 5 5.42767525 0.42767524719238281 0.18290611706106574 +3781 6 6.38605833 0.38605833053588867 0.14904103457615747 +3783 5 5.32522774 0.32522773742675781 0.10577308119172812 +3784 6 5.75775862 0.24224138259887695 0.058680887443415486 +3787 5 5.47676039 0.4767603874206543 0.22730046701349238 +3788 5 5.52795649 0.52795648574829102 0.27873805084368541 +3789 6 5.364557 0.63544321060180664 0.40378807389993199 +3791 5 5.39469528 0.39469528198242188 0.15578436561918352 +3792 6 5.909566 0.090434074401855469 0.0081783218129203306 +3793 6 5.29336739 0.70663261413574219 0.49932965136031271 +3798 5 5.59243059 0.59243059158325195 0.35097400584368188 +3800 5 5.20580673 0.20580673217773438 0.042356411009677686 +3801 6 5.628341 0.3716588020324707 0.13813026512821125 +3805 6 5.628341 0.3716588020324707 0.13813026512821125 +3808 6 5.647771 0.35222911834716797 0.12406535181162326 +3809 6 5.84592 0.15407991409301758 0.023740619926911677 +3815 7 6.376214 0.62378597259521484 0.38910893960655812 +3820 5 5.81555 0.81554985046386719 0.66512155859163613 +3821 6 6.02812147 0.028121471405029297 0.00079081715398388042 +3823 5 5.43096447 0.43096446990966797 0.18573037432452111 +3824 7 6.106088 0.89391183853149414 0.79907837506675605 +3830 7 5.819285 1.1807150840759277 1.3940881097644251 +3833 6 5.623856 0.3761439323425293 0.14148425783810126 +3834 5 5.299482 0.29948186874389648 0.089689389706336442 +3838 5 5.299482 0.29948186874389648 0.089689389706336442 +3839 5 5.062541 0.062541007995605469 0.0039113776811063872 +3841 6 6.151886 0.151885986328125 0.023069352842867374 +3843 7 6.883123 0.11687707901000977 0.013660251597912065 +3848 6 5.52939653 0.47060346603393555 0.22146762224315353 +3850 6 6.316198 0.31619787216186523 0.099981094359691269 +3853 7 7.27425861 0.27425861358642578 0.075217787126348412 +3854 6 7.09188 1.0918798446655273 1.1922015951868161 +3855 6 6.427566 0.4275660514831543 0.18281272838089535 +3860 5 5.274571 0.27457094192504883 0.075389202149608536 +3862 6 5.437691 0.56230878829956055 0.31619117339892 +3863 6 5.437691 0.56230878829956055 0.31619117339892 +3866 6 5.87392473 0.12607526779174805 0.015894973148760982 +3869 6 5.405648 0.59435176849365234 0.35325402471153211 +3870 6 5.75473547 0.24526453018188477 0.060154689765340663 +3872 4 5.027593 1.0275931358337402 1.0559476528126197 +3875 7 6.12440825 0.87559175491333008 0.76666092127220509 +3876 5 5.308399 0.30839920043945313 0.095110066831693985 +3886 6 6.642862 0.64286184310913086 0.41327134932566878 +3888 6 5.67370367 0.32629632949829102 0.1064692946440573 +3889 6 5.64668274 0.3533172607421875 0.12483308673836291 +3891 5 5.865996 0.86599588394165039 0.74994887100388041 +3893 5 4.624341 0.37565898895263672 0.14111967598091724 +3894 6 6.324618 0.32461786270141602 0.10537675678483538 +3897 6 6.015486 0.015485763549804688 0.00023980887272045948 +3900 5 4.624341 0.37565898895263672 0.14111967598091724 +3903 6 6.194684 0.19468402862548828 0.037901871001849941 +3904 7 6.61869669 0.38130331039428711 0.14539221451764206 +3907 7 6.946438 0.053562164306640625 0.002868905445211567 +3912 7 7.01307535 0.013075351715087891 0.00017096482247325184 +3916 6 6.58867741 0.58867740631103516 0.34654108870108757 +3918 7 6.268551 0.73144912719726563 0.53501782567764167 +3919 6 6.237363 0.23736286163330078 0.056341128082749492 +3921 5 5.30553961 0.30553960800170898 0.093354452057837989 +3924 5 4.881786 0.11821413040161133 0.013974580626609168 +3929 5 5.26826143 0.26826143264770508 0.071964196246199208 +3934 6 6.38188839 0.38188838958740234 0.14583874210165959 +3935 5 5.359629 0.35962915420532227 0.12933312855443546 +3938 6 6.10134935 0.1013493537902832 0.010271691513707992 +3939 6 6.249502 0.24950218200683594 0.062251338826172287 +3948 5 5.736434 0.73643398284912109 0.54233501109501958 +3955 6 5.976232 0.023767948150634766 0.00056491535929126258 +3957 5 6.780936 1.7809357643127441 3.1717321966082181 +3958 6 5.82819653 0.17180347442626953 0.029516433824937849 +3961 5 4.857042 0.14295816421508789 0.020437036715748036 +3964 5 5.03904772 0.039047718048095703 0.0015247242847635789 +3966 6 5.764548 0.23545217514038086 0.055437726778336582 +3968 6 5.10690451 0.89309549331665039 0.79761956018251112 +3969 6 6.148906 0.14890623092651367 0.022173065608740217 +3971 6 6.148906 0.14890623092651367 0.022173065608740217 +3972 6 5.454913 0.54508686065673828 0.29711968566061842 +3974 6 5.10690451 0.89309549331665039 0.79761956018251112 +3975 7 6.77839375 0.22160625457763672 0.049109332067928335 +3976 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3977 6 6.793038 0.79303789138793945 0.62890909717702925 +3979 6 6.155224 0.15522384643554688 0.024094442502246238 +3980 5 5.886582 0.8865818977355957 0.78602746139245028 +3981 7 6.80097628 0.19902372360229492 0.039610442556522685 +3983 6 5.608051 0.39194917678833008 0.15362415718504963 +3984 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3986 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3987 6 5.70724154 0.29275846481323242 0.085707518719800646 +3988 6 5.9042244 0.095775604248046875 0.0091729663690784946 +3989 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3991 5 5.926727 0.9267268180847168 0.85882259535742378 +3992 7 6.098081 0.90191888809204102 0.8134576806971836 +3998 6 5.93369 0.066309928894042969 0.0043970066699330346 +3999 6 5.93369 0.066309928894042969 0.0043970066699330346 +4000 6 5.93369 0.066309928894042969 0.0043970066699330346 +4001 5 5.49348354 0.49348354339599609 0.24352600760266796 +4005 6 6.2540493 0.25404930114746094 0.064541047413513297 +4007 5 5.49348354 0.49348354339599609 0.24352600760266796 +4008 6 5.61225367 0.38774633407592773 0.15034721958932096 +4012 6 5.93369 0.066309928894042969 0.0043970066699330346 +4013 6 5.200166 0.79983377456665039 0.63973406693753532 +4016 5 5.1244154 0.12441539764404297 0.015479191170925333 +4020 4 4.586666 0.58666610717773438 0.34417712131107692 +4023 6 6.271843 0.27184295654296875 0.073898593022022396 +4026 6 6.271843 0.27184295654296875 0.073898593022022396 +4028 6 6.18963432 0.18963432312011719 0.035961176505225012 +4030 5 6.190148 1.190147876739502 1.4164519685075447 +4036 5 5.464335 0.46433496475219727 0.21560695949142428 +4038 5 5.17922926 0.1792292594909668 0.032123127457680312 +4040 5 5.52691 0.52690982818603516 0.27763396703903709 +4041 5 5.26324558 0.26324558258056641 0.069298236748181807 +4042 7 6.8913846 0.10861539840698242 0.01179730477110752 +4045 7 6.8913846 0.10861539840698242 0.01179730477110752 +4046 7 6.91408825 0.085911750793457031 0.0073808289243970648 +4048 6 6.34028769 0.34028768539428711 0.11579570883100132 +4057 6 6.27755642 0.27755641937255859 0.077037565934915619 +4058 6 6.34028769 0.34028768539428711 0.11579570883100132 +4060 5 5.11373043 0.11373043060302734 0.012934610845150019 +4061 5 5.11373043 0.11373043060302734 0.012934610845150019 +4062 6 6.122509 0.12250900268554688 0.015008455739007331 +4063 5 5.579146 0.57914590835571289 0.33540998316516379 +4065 8 7.120815 0.87918519973754883 0.77296661543755363 +4067 5 5.2989316 0.29893159866333008 0.089360100679414245 +4068 6 6.5147295 0.51472949981689453 0.26494645798175043 +4069 6 5.64842272 0.3515772819519043 0.12360658518468881 +4072 7 6.107794 0.89220619201660156 0.7960318890727649 +4073 5 4.71371031 0.28628969192504883 0.081961787702539368 +4074 4 5.083258 1.0832581520080566 1.1734482238919099 +4076 5 5.92422056 0.92422056198120117 0.85418364718884732 +4077 6 6.005199 0.0051989555358886719 2.7029138664147467E-05 +4079 6 5.716552 0.28344821929931641 0.080342893023953366 +4080 6 5.704811 0.29518890380859375 0.087136488931719214 +4081 6 5.569051 0.43094921112060547 0.18571722256547218 +4083 5 4.93252039 0.067479610443115234 0.0045534978255545866 +4084 8 5.853612 2.146388053894043 4.6069816778990571 +4089 6 5.53380537 0.46619462966918945 0.2173374327323927 +4090 6 5.56470728 0.43529272079467773 0.18947975277683327 +4092 6 5.215562 0.78443813323974609 0.61534318488065765 +4093 6 5.03059769 0.96940231323242188 0.93974084490037058 +4095 6 5.03059769 0.96940231323242188 0.93974084490037058 +4098 5 6.015106 1.015106201171875 1.0304405996575952 +4104 7 6.56624937 0.43375062942504883 0.18813960852662603 +4106 5 6.116082 1.1160821914672852 1.2456394581104178 +4110 5 5.31600857 0.31600856781005859 0.0998614149293644 +4113 6 6.51928663 0.5192866325378418 0.26965860673249153 +4114 6 5.713825 0.28617477416992188 0.081896001371205784 +4115 6 5.93225 0.067749977111816406 0.0045900593986516469 +4116 6 5.14707851 0.85292148590087891 0.72747506111136317 +4117 6 5.14707851 0.85292148590087891 0.72747506111136317 +4118 8 6.23626661 1.7637333869934082 3.1107554603952394 +4121 6 5.7118 0.28819990158081055 0.083059183271188886 +4123 6 6.95849562 0.9584956169128418 0.91871384764112918 +4124 7 6.216066 0.78393411636352539 0.61455269879866137 +4127 5 5.599305 0.59930515289306641 0.3591666662841817 +4129 7 5.934724 1.0652761459350586 1.1348132670982523 +4130 6 5.946668 0.053331851959228516 0.0028442864334010665 +4135 5 6.103442 1.1034421920776367 1.2175846712571001 +4142 6 6.252783 0.25278282165527344 0.063899154924001778 +4144 6 5.86206245 0.13793754577636719 0.019026766534807393 +4145 6 5.94314146 0.056858539581298828 0.0032328935233181255 +4146 7 5.79053 1.2094697952270508 1.4628171855665641 +4148 6 5.52015257 0.47984743118286133 0.23025355721279084 +4153 5 5.20253658 0.20253658294677734 0.041021067431756819 +4156 5 5.38787365 0.38787364959716797 0.15044596805182664 +4157 7 6.977525 0.022474765777587891 0.00050511509675743582 +4158 7 6.977525 0.022474765777587891 0.00050511509675743582 +4161 7 6.977525 0.022474765777587891 0.00050511509675743582 +4164 5 5.730478 0.73047780990600586 0.53359783076507483 +4167 8 6.453016 1.5469841957092285 2.3931601017741286 +4172 6 6.139005 0.13900518417358398 0.019322441227132003 +4173 5 5.60594034 0.60594034194946289 0.36716369800183202 +4175 7 6.018053 0.98194694519042969 0.96421980316881672 +4176 6 6.32258368 0.32258367538452148 0.10406022762458633 +4182 6 5.23854876 0.76145124435424805 0.57980799752863277 +4183 7 6.72853756 0.27146244049072266 0.073691856597179139 +4185 5 5.278079 0.27807903289794922 0.077327948537458724 +4190 6 5.69684839 0.30315160751342773 0.091900897137975335 +4191 5 5.73005342 0.73005342483520508 0.53297800311361243 +4192 6 5.830771 0.16922903060913086 0.028638464800906149 +4193 6 6.13968849 0.13968849182128906 0.019512874747306341 +4194 6 5.830771 0.16922903060913086 0.028638464800906149 +4197 5 5.29363 0.29363012313842773 0.086218649214288234 +4198 5 5.067099 0.067099094390869141 0.0045022884680747666 +4200 6 6.08601665 0.086016654968261719 0.0073988649319289834 +4201 6 6.131825 0.13182497024536133 0.017377822780190399 +4202 6 6.68126154 0.68126153945922852 0.46411728514635797 +4204 6 5.799505 0.20049476623535156 0.040198151287768269 +4209 6 6.531081 0.53108119964599609 0.28204724061743036 +4214 5 5.212247 0.21224689483642578 0.045048744367704785 +4216 5 5.212247 0.21224689483642578 0.045048744367704785 +4217 4 5.07387161 1.0738716125488281 1.1532002402382204 +4219 5 5.212247 0.21224689483642578 0.045048744367704785 +4220 6 6.067357 0.067357063293457031 0.0045369739755187766 +4224 7 6.365413 0.63458681106567383 0.40270042077850121 +4226 7 5.527336 1.4726638793945313 2.1687389016733505 +4232 6 6.64348555 0.64348554611206055 0.4140736480551368 +4234 6 5.63266134 0.36733865737915039 0.13493768920511684 +4238 5 5.22960567 0.22960567474365234 0.052718765874487872 +4239 7 6.749726 0.2502741813659668 0.062637165858404842 +4242 7 6.697168 0.30283212661743164 0.091707296911636149 +4243 6 6.37470675 0.37470674514770508 0.1404051448591872 +4245 5 5.29424858 0.29424858093261719 0.086582227380858967 +4246 6 6.760518 0.76051807403564453 0.5783877409348861 +4247 6 5.40436745 0.59563255310058594 0.35477813831312233 +4248 6 5.580484 0.41951608657836914 0.17599374689802971 +4250 6 5.488685 0.51131486892700195 0.26144289518583719 +4252 6 5.488685 0.51131486892700195 0.26144289518583719 +4255 5 5.07407 0.074069976806640625 0.0054863614641362801 +4258 6 5.98729753 0.012702465057373047 0.00016135261853378324 +4259 6 6.60455 0.60454988479614258 0.36548056320702926 +4264 6 6.177701 0.17770099639892578 0.031577644121171033 +4265 6 5.908764 0.091236114501953125 0.0083240285894135013 +4267 7 6.820651 0.17934894561767578 0.032166044294172025 +4269 5 5.326494 0.32649421691894531 0.10659847368151532 +4270 6 5.813092 0.18690776824951172 0.034934513832013181 +4273 6 5.918317 0.081683158874511719 0.0066721384437187226 +4276 7 7.633585 0.63358497619628906 0.40142992206165218 +4277 5 5.82106733 0.82106733322143555 0.67415156568335988 +4280 6 5.918317 0.081683158874511719 0.0066721384437187226 +4282 5 5.33614159 0.33614158630371094 0.11299116604277515 +4283 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4284 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4285 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4286 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4287 5 5.39428425 0.39428424835205078 0.15546006849854166 +4289 6 5.64777946 0.35222053527832031 0.12405930547174648 +4290 5 5.33614159 0.33614158630371094 0.11299116604277515 +4293 5 5.299876 0.29987621307373047 0.089925743167441397 +4294 5 6.0532794 1.0532793998718262 1.1093974941943543 +4296 6 6.14942265 0.14942264556884766 0.022327127008793468 +4298 6 6.638621 0.63862085342407227 0.40783659442809039 +4299 6 5.2250433 0.77495670318603516 0.60055789181296859 +4302 6 5.51465559 0.48534440994262695 0.23555919626255672 +4303 6 6.4400897 0.44008970260620117 0.19367894634001459 +4305 6 5.619583 0.3804168701171875 0.1447169950697571 +4309 6 6.74624825 0.74624824523925781 0.55688644352267147 +4312 6 6.4400897 0.44008970260620117 0.19367894634001459 +4313 6 6.62467575 0.62467575073242188 0.39021979355311487 +4316 5 4.71171951 0.28828048706054688 0.083105639219866134 +4317 7 7.19724035 0.19724035263061523 0.038903756705849446 +4320 5 5.338316 0.33831596374511719 0.11445769132478745 +4321 6 5.84775972 0.15224027633666992 0.02317710173906562 +4326 5 5.14266634 0.14266633987426758 0.020353684533120031 +4328 5 5.84332 0.84331989288330078 0.7111884417327019 +4329 5 5.784898 0.78489780426025391 0.61606456313256786 +4330 5 5.43720341 0.43720340728759766 0.191146819343885 +4332 8 7.57545471 0.4245452880859375 0.18023870163597167 +4333 8 7.57545471 0.4245452880859375 0.18023870163597167 +4334 8 7.57545471 0.4245452880859375 0.18023870163597167 +4335 8 7.57545471 0.4245452880859375 0.18023870163597167 +4337 8 7.57545471 0.4245452880859375 0.18023870163597167 +4340 8 7.57545471 0.4245452880859375 0.18023870163597167 +4341 6 5.22670174 0.77329826354980469 0.59799020440914319 +4343 6 6.110325 0.11032485961914063 0.012171574649983086 +4349 5 4.938276 0.061724185943603516 0.0038098751304005418 +4351 6 6.868826 0.86882591247558594 0.75485846618903452 +4352 5 5.5040555 0.50405550003051758 0.25407194711101511 +4353 6 5.86647367 0.13352632522583008 0.017829279528314146 +4354 6 6.25179052 0.25179052352905273 0.063398467739034459 +4355 6 6.868826 0.86882591247558594 0.75485846618903452 +4358 5 5.730952 0.73095178604125977 0.53429051351690759 +4361 6 6.518792 0.51879215240478516 0.26914529739678983 +4362 6 6.90053844 0.90053844451904297 0.81096949005677743 +4363 5 5.40533924 0.40533924102783203 0.16429990031701891 +4365 5 5.36372948 0.36372947692871094 0.13229913238683366 +4366 6 6.705825 0.70582485198974609 0.49818872168634698 +4369 6 6.32576561 0.32576560974121094 0.10612323249006295 +4370 5 5.68760538 0.68760538101196289 0.47280115999660666 +4372 6 6.074046 0.074046134948730469 0.0054828301008456037 +4375 6 5.893817 0.10618305206298828 0.01127484054541128 +4376 5 5.17443466 0.17443466186523438 0.030427451260038652 +4378 5 5.038073 0.038073062896728516 0.0014495581183382455 +4380 6 6.3993845 0.39938449859619141 0.15950797771893122 +4382 6 5.917463 0.082537174224853516 0.0068123851290238235 +4386 6 6.25856447 0.25856447219848633 0.066855586283281809 +4388 6 5.614622 0.38537788391113281 0.14851611340782256 +4393 6 5.164492 0.83550786972045898 0.69807340036481946 +4397 5 5.397777 0.39777708053588867 0.15822660579965486 +4398 5 5.397777 0.39777708053588867 0.15822660579965486 +4399 5 5.684684 0.68468379974365234 0.46879190563140583 +4400 5 5.397777 0.39777708053588867 0.15822660579965486 +4403 5 5.706885 0.70688486099243164 0.4996862067002894 +4406 7 6.86297035 0.13702964782714844 0.018777124383632326 +4408 5 5.08429337 0.084293365478515625 0.0071053714636946097 +4410 5 5.277465 0.27746486663818359 0.076986752218545007 +4411 7 6.745393 0.25460720062255859 0.064824826608855801 +4413 7 6.745393 0.25460720062255859 0.064824826608855801 +4414 7 6.442507 0.55749320983886719 0.3107986790164432 +4415 5 4.99544764 0.0045523643493652344 2.0724021169371554E-05 +4417 6 5.8144083 0.18559169769287109 0.034444278252522054 +4418 6 5.931572 0.06842803955078125 0.004682396596763283 +4419 6 5.931572 0.06842803955078125 0.004682396596763283 +4421 6 5.931572 0.06842803955078125 0.004682396596763283 +4422 6 5.8144083 0.18559169769287109 0.034444278252522054 +4426 6 5.705164 0.29483604431152344 0.086928293025266612 +4428 6 6.468404 0.46840381622314453 0.21940213505240536 +4431 6 6.39723539 0.39723539352416992 0.15779595786830214 +4436 6 6.40647268 0.40647268295288086 0.1652200419869132 +4437 6 5.883115 0.11688518524169922 0.013662146528986341 +4439 5 5.15067148 0.15067148208618164 0.022701895514046555 +4440 5 5.1135397 0.11353969573974609 0.012891262508674117 +4442 5 5.1135397 0.11353969573974609 0.012891262508674117 +4443 5 5.15067148 0.15067148208618164 0.022701895514046555 +4445 6 6.049947 0.049946784973144531 0.0024946813291535364 +4446 6 7.41717434 1.4171743392944336 2.0083831079546144 +4447 6 6.83694124 0.83694124221801758 0.70047064292543837 +4448 5 5.7396884 0.73968839645385742 0.54713892384847895 +4449 6 5.59850836 0.40149164199829102 0.16119553859448388 +4453 6 6.83694124 0.83694124221801758 0.70047064292543837 +4455 5 5.36782932 0.36782932281494141 0.13529841072249837 +4456 5 5.36782932 0.36782932281494141 0.13529841072249837 +4457 5 5.36782932 0.36782932281494141 0.13529841072249837 +4459 5 5.74466658 0.74466657638549805 0.5545283099856988 +4460 6 6.03332043 0.033320426940917969 0.001110250851525052 +4461 6 6.06109 0.061089992523193359 0.0037319871864838206 +4462 6 6.87517548 0.87517547607421875 0.76593211392173544 +4465 5 5.08348751 0.083487510681152344 0.0069701644397355267 +4466 5 6.087393 1.0873928070068359 1.1824231167302059 +4470 6 6.019186 0.019186019897460938 0.000368103359505767 +4472 5 6.441713 1.4417128562927246 2.0785359599997264 +4473 5 5.164528 0.16452789306640625 0.02706942759687081 +4475 6 6.676889 0.67688894271850586 0.45817864077457671 +4478 5 5.13800049 0.13800048828125 0.019044134765863419 +4481 5 5.13800049 0.13800048828125 0.019044134765863419 +4482 6 6.622241 0.62224102020263672 0.38718388722281816 +4486 6 5.631071 0.36892890930175781 0.13610854011858464 +4489 6 6.71970654 0.71970653533935547 0.51797749701017892 +4491 6 6.941034 0.94103384017944336 0.88554468836287015 +4493 6 5.62146044 0.3785395622253418 0.14329220016975341 +4494 6 5.2161746 0.78382539749145508 0.61438225375263755 +4496 6 5.2161746 0.78382539749145508 0.61438225375263755 +4497 5 5.11741972 0.11741971969604492 0.01378739057349776 +4498 5 5.85148859 0.85148859024047852 0.72503281930971752 +4499 6 6.16708231 0.16708230972290039 0.027916498222339214 +4503 7 5.85099649 1.1490035057067871 1.3202090561264868 +4504 5 5.362151 0.36215114593505859 0.13115345250207611 +4507 5 6.42801046 1.4280104637145996 2.0392138844783858 +4509 5 5.371576 0.37157583236694336 0.13806859919918679 +4511 6 6.220184 0.2201838493347168 0.048480927507853266 +4512 6 6.220184 0.2201838493347168 0.048480927507853266 +4514 5 4.845057 0.15494298934936523 0.024007329948517508 +4516 6 6.39635229 0.39635229110717773 0.15709513866590896 +4517 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4520 5 5.155404 0.15540409088134766 0.024150431462658162 +4521 5 5.37260532 0.37260532379150391 0.13883472731777147 +4522 6 5.769117 0.23088312149047852 0.053307015789187062 +4526 6 5.97513342 0.024866580963134766 0.00061834684879613633 +4527 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4528 6 4.818622 1.1813778877258301 1.395653713607544 +4530 6 5.28060865 0.7193913459777832 0.51752390866772657 +4531 6 5.28060865 0.7193913459777832 0.51752390866772657 +4532 6 6.008641 0.0086407661437988281 7.466283955182007E-05 +4533 5 5.92288446 0.92288446426391602 0.85171573437969528 +4534 6 6.12120628 0.12120628356933594 0.014690963176690275 +4535 6 5.525482 0.474517822265625 0.22516716364771128 +4536 6 5.28060865 0.7193913459777832 0.51752390866772657 +4542 5 6.20716143 1.2071614265441895 1.4572387097362025 +4543 5 6.20716143 1.2071614265441895 1.4572387097362025 +4544 6 6.543812 0.54381179809570313 0.29573127174808178 +4549 5 6.20716143 1.2071614265441895 1.4572387097362025 +4551 6 5.996477 0.0035228729248046875 1.2410633644321933E-05 +4552 6 6.598306 0.59830617904663086 0.3579702838853791 +4554 6 6.31430149 0.31430149078369141 0.098785427108850854 +4556 5 6.612007 1.6120071411132813 2.5985670230002142 +4557 6 5.471904 0.52809619903564453 0.27888559543589508 +4558 6 6.156162 0.15616178512573242 0.024386503133655424 +4561 6 6.82648325 0.82648324966430664 0.68307456197567262 +4564 7 6.24290752 0.75709247589111328 0.57318901705093595 +4565 5 6.27208471 1.2720847129821777 1.6181995170029495 +4566 5 6.538882 1.538881778717041 2.368157128867324 +4567 5 6.27208471 1.2720847129821777 1.6181995170029495 +4568 6 6.33394957 0.33394956588745117 0.11152231255641709 +4570 6 6.37727451 0.37727451324462891 0.14233605834397167 +4572 7 6.25381851 0.74618148803710938 0.5567868130892748 +4573 6 6.933242 0.93324184417724609 0.87094033972334728 +4577 6 5.9036355 0.096364498138427734 0.0092861165014710423 +4579 6 6.24599648 0.24599647521972656 0.060514265820529545 +4580 6 6.653771 0.65377092361450195 0.42741642056375895 +4583 6 5.49828339 0.50171661376953125 0.25171956053236499 +4584 6 5.967186 0.03281402587890625 0.0010767602943815291 +4585 6 6.15143728 0.15143728256225586 0.022933250549840523 +4586 6 6.189822 0.18982219696044922 0.036032466458891577 +4587 6 6.33160353 0.3316035270690918 0.1099608991646619 +4590 6 6.05400848 0.05400848388671875 0.0029169163317419589 +4593 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4596 6 6.55546 0.55545997619628906 0.30853578515598201 +4597 6 4.86262274 1.1373772621154785 1.2936270363773019 +4598 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4599 7 6.113054 0.88694620132446289 0.78667356404389466 +4600 6 5.383654 0.61634588241577148 0.37988224677087601 +4602 6 5.796041 0.20395898818969727 0.041599268863365069 +4605 6 6.691703 0.69170284271240234 0.47845282261641842 +4606 5 5.867839 0.86783885955810547 0.75314428615911311 +4607 6 6.22378063 0.22378063201904297 0.050077771266842319 +4608 7 6.26591825 0.73408174514770508 0.53887600855910023 +4609 4 3.5493567 0.45064330101013184 0.20307938474530829 +4613 5 5.46949959 0.46949958801269531 0.22042986314409063 +4615 7 6.76983929 0.23016071319580078 0.052973953898799664 +4617 7 6.599219 0.40078115463256836 0.16062553390861467 +4619 5 4.840745 0.15925502777099609 0.025362163870340737 +4621 7 5.61909 1.3809099197387695 1.9069122064329349 +4623 6 6.6815424 0.68154239654541016 0.46450003828886111 +4624 6 6.745368 0.74536800384521484 0.55557346115620021 +4625 5 5.35424328 0.35424327850341797 0.12548830036485015 +4630 7 6.001225 0.99877500534057617 0.99755151129306796 +4632 6 6.16925764 0.16925764083862305 0.028648148982256316 +4635 6 5.69187737 0.30812263488769531 0.094939558130135993 +4636 5 5.49239874 0.49239873886108398 0.24245651803198598 +4639 6 5.240025 0.75997495651245117 0.57756193452610205 +4641 6 6.17320633 0.17320632934570313 0.03000043252541218 +4642 7 6.39035463 0.60964536666870117 0.3716674731006151 +4644 6 6.755946 0.75594615936279297 0.57145459585535718 +4645 7 6.61975336 0.38024663925170898 0.14458750666221931 +4647 7 6.0159874 0.98401260375976563 0.96828080435807351 +4648 5 4.8469286 0.15307140350341797 0.023430854570506199 +4650 5 4.755362 0.24463796615600586 0.059847734484947068 +4653 7 6.709774 0.29022598266601563 0.084231121014454402 +4654 7 6.45592451 0.54407548904418945 0.29601813777867392 +4655 7 6.45592451 0.54407548904418945 0.29601813777867392 +4658 6 6.760667 0.76066684722900391 0.57861405247331277 +4659 6 5.703014 0.29698610305786133 0.08820074540949463 +4660 6 6.24925375 0.24925374984741211 0.062127431812996292 +4662 6 6.67323542 0.67323541641235352 0.45324592591191504 +4663 7 6.38869667 0.61130332946777344 0.37369176061838516 +4665 6 6.67323542 0.67323541641235352 0.45324592591191504 +4666 5 5.14793062 0.14793062210083008 0.021883468955138596 +4670 6 5.702476 0.29752397537231445 0.088520515921345577 +4671 5 5.34669828 0.34669828414916992 0.12019970023197857 +4672 5 5.34669828 0.34669828414916992 0.12019970023197857 +4675 6 5.8778615 0.12213850021362305 0.014917813234433197 +4676 6 5.78406429 0.21593570709228516 0.04662822959744517 +4677 7 6.76541662 0.23458337783813477 0.055029361157949097 +4680 4 4.34068155 0.34068155288696289 0.11606392047747249 +4681 6 6.104238 0.10423803329467773 0.010865567585142344 +4683 6 5.93819046 0.061809539794921875 0.0038204192096600309 +4687 6 5.817554 0.18244600296020508 0.03328654399615516 +4689 6 5.817554 0.18244600296020508 0.03328654399615516 +4690 6 5.817554 0.18244600296020508 0.03328654399615516 +4691 7 6.33023167 0.66976833343505859 0.44858962047237583 +4696 6 6.19866753 0.19866752624511719 0.039468785984354327 +4697 7 6.837097 0.16290283203125 0.026537332683801651 +4701 6 5.201102 0.79889822006225586 0.63823836601864059 +4706 7 6.528003 0.47199678421020508 0.2227809643047749 +4707 6 5.96410131 0.035898685455322266 0.0012887156174201664 +4708 6 6.331786 0.33178615570068359 0.11008205311463826 +4712 6 6.04505348 0.045053482055664063 0.0020298162453400437 +4713 6 6.10136843 0.10136842727661133 0.01027555804853364 +4715 6 5.3946147 0.60538530349731445 0.36649136569053553 +4716 6 5.74300957 0.25699043273925781 0.066044082519510994 +4718 6 5.63362646 0.36637353897094727 0.13422957005809621 +4719 6 5.3946147 0.60538530349731445 0.36649136569053553 +4722 6 5.84657 0.15342998504638672 0.023540760311334452 +4723 6 5.28928041 0.71071958541870117 0.50512232909773047 +4725 6 6.00947142 0.0094714164733886719 8.9707730012378306E-05 +4727 6 5.84657 0.15342998504638672 0.023540760311334452 +4729 5 5.473 0.47300004959106445 0.22372904691314943 +4730 5 5.29477644 0.29477643966674805 0.086893149382603951 +4733 6 5.96345949 0.036540508270263672 0.0013352087446492078 +4734 6 6.066205 0.066205024719238281 0.0043831052980749519 +4735 6 5.78232241 0.21767759323120117 0.047383534594928278 +4737 7 6.585888 0.41411209106445313 0.17148882396577392 +4738 6 6.43513536 0.4351353645324707 0.18934278546680616 +4743 5 5.96722364 0.9672236442565918 0.93552157800900204 +4746 6 5.36194372 0.63805627822875977 0.40711581418713649 +4748 5 5.523394 0.52339410781860352 0.27394139209923196 +4752 7 6.93892431 0.061075687408447266 0.0037302395924143639 +4754 6 5.938266 0.061734199523925781 0.0038111113908598782 +4756 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4757 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4758 6 6.21085 0.21084976196289063 0.044457622119807638 +4759 6 5.674312 0.32568788528442383 0.10607259862104002 +4762 7 6.27820635 0.72179365158081055 0.52098607546236053 +4764 6 6.137934 0.13793420791625977 0.019025845713485978 +4766 8 6.511512 1.4884881973266602 2.2155971135807704 +4770 6 5.603624 0.39637613296508789 0.15711403878435704 +4771 6 5.603624 0.39637613296508789 0.15711403878435704 +4772 5 5.26272154 0.26272153854370117 0.06902260681476946 +4773 7 5.97403574 1.0259642601013184 1.0526026630052456 +4774 4 5.354617 1.3546171188354492 1.8349875386420536 +4775 6 5.57587957 0.42412042617797852 0.17987813590139012 +4776 6 5.650073 0.34992694854736328 0.12244886931966903 +4783 6 5.35315752 0.64684247970581055 0.41840519355196193 +4784 5 5.531172 0.53117179870605469 0.28214347974062548 +4785 7 6.33343124 0.66656875610351563 0.4443139066133881 +4789 6 5.343524 0.65647602081298828 0.43096076590245502 +4791 6 5.35315752 0.64684247970581055 0.41840519355196193 +4793 6 5.07362556 0.92637443542480469 0.85816959460862563 +4794 5 5.07362556 0.073625564575195313 0.0054207237590162549 +4796 7 6.493846 0.50615406036376953 0.25619193282273045 +4797 6 6.459453 0.45945310592651367 0.21109715654552019 +4800 7 6.00343752 0.99656248092651367 0.99313677839040793 +4801 7 6.493846 0.50615406036376953 0.25619193282273045 +4802 8 6.794405 1.2055950164794922 1.453459343760187 +4803 7 6.66979647 0.33020353317260742 0.10903437331967325 +4804 4 5.978493 1.9784932136535645 3.914435396473209 +4807 6 6.04026556 0.040265560150146484 0.0016213153342050646 +4808 5 5.662127 0.66212701797485352 0.43841218793227199 +4811 6 6.34599733 0.34599733352661133 0.11971415480752512 +4812 7 6.139992 0.86000776290893555 0.7396133522636319 +4813 5 5.13426828 0.13426828384399414 0.018027972046411378 +4815 7 5.8541317 1.1458683013916016 1.3130141641340742 +4816 6 5.439974 0.56002616882324219 0.31362930976683856 +4817 6 6.275693 0.27569293975830078 0.076006597032574064 +4822 6 6.09246 0.092460155487060547 0.0085488803526914126 +4826 6 6.226658 0.22665786743164063 0.051373788868659176 +4828 5 5.32722235 0.32722234725952148 0.10707446454603087 +4829 7 6.61797571 0.38202428817749023 0.1459425567575181 +4830 6 5.84604 0.15396022796630859 0.023703751795437711 +4832 5 5.717937 0.71793699264526367 0.51543352540852538 +4834 7 6.58480167 0.41519832611083984 0.17238965000524331 +4835 6 6.32257843 0.32257843017578125 0.10405684361467138 +4836 5 5.107541 0.10754108428955078 0.011565084810172266 +4837 6 6.83404541 0.83404541015625 0.69563174620270729 +4839 4 4.61754942 0.61754941940307617 0.38136728540507647 +4841 6 5.934297 0.065702915191650391 0.0043168730646812037 +4844 6 5.908849 0.091151237487792969 0.0083085480955560342 +4845 5 5.235182 0.23518180847167969 0.055310483036009828 +4846 6 6.62231541 0.62231540679931641 0.38727646553979866 +4849 5 5.278072 0.27807188034057617 0.077323970636143713 +4850 6 6.022924 0.022923946380615234 0.0005255073176613223 +4851 5 5.278072 0.27807188034057617 0.077323970636143713 +4852 5 6.418775 1.4187750816345215 2.0129227322670431 +4853 5 5.904184 0.90418386459350586 0.81754846099124734 +4854 6 7.04106474 1.0410647392272949 1.0838157912623956 +4856 6 5.81926346 0.18073654174804688 0.032665697523043491 +4859 6 6.03407764 0.034077644348144531 0.0011612858443186269 +4860 6 6.10150051 0.10150051116943359 0.010302353767656314 +4862 6 6.09098768 0.090987682342529297 0.0082787583380650176 +4866 6 5.99347734 0.0065226554870605469 4.254503460288106E-05 +4867 6 4.705145 1.2948551177978516 1.676649776087288 +4869 6 5.51711273 0.48288726806640625 0.23318011366063729 +4871 6 6.68095255 0.68095254898071289 0.46369637396333019 +4872 5 5.705171 0.70517110824584961 0.49726629190467975 +4876 7 6.81956148 0.18043851852416992 0.032558058967197212 +4878 4 4.51450825 0.51450824737548828 0.26471873661739664 +4879 6 5.44779968 0.5522003173828125 0.30492519051767886 +4880 6 5.44779968 0.5522003173828125 0.30492519051767886 +4881 6 5.75216627 0.2478337287902832 0.061421557126095649 +4882 5 5.97157431 0.97157430648803711 0.94395663302771027 +4883 6 6.152341 0.15234088897705078 0.023207746454318112 +4886 7 6.863344 0.13665580749511719 0.018674809722142527 +4887 7 4.93395472 2.0660452842712402 4.2685431166594299 +4888 5 6.00417376 1.004173755645752 1.0083649315276944 +4889 6 5.75216627 0.2478337287902832 0.061421557126095649 +4894 5 5.44779968 0.4477996826171875 0.20052455575205386 +4896 7 6.65991926 0.34008073806762695 0.11565490840462189 diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-out.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-out.txt new file mode 100644 index 0000000000..4792a52b30 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-out.txt @@ -0,0 +1,32 @@ +maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.407028 +L2(avg): 0.274963 +RMS(avg): 0.524369 +Loss-fn(avg): 0.274963 +R Squared: 0.649369 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.407028 (0.0000) +L2(avg): 0.274963 (0.0000) +RMS(avg): 0.524369 (0.0000) +Loss-fn(avg): 0.274963 (0.0000) +R Squared: 0.649369 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l1: 0.407028426136092 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-rp.txt new file mode 100644 index 0000000000..cf5f4d432b --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.407028 0.274963 0.524369 0.274963 0.649369 50 0.2 20 10 + 1 Mae LightGBMR %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Mae + diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE.txt new file mode 100644 index 0000000000..c0618c3738 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +0 6 5.680711 0.31928920745849609 0.10194559799947456 +1 6 5.534508 0.46549177169799805 0.21668258951854114 +2 6 5.711945 0.2880549430847168 0.082975650235539433 +3 6 5.78378773 0.21621227264404297 0.046747746841901971 +4 6 5.78378773 0.21621227264404297 0.046747746841901971 +5 6 5.711945 0.2880549430847168 0.082975650235539433 +6 6 5.29387236 0.70612764358520508 0.49861624903519441 +7 6 5.680711 0.31928920745849609 0.10194559799947456 +8 6 5.534508 0.46549177169799805 0.21668258951854114 +9 6 5.93140268 0.068597316741943359 0.0047055918641945027 +10 5 5.76748276 0.76748275756835938 0.58902978316473309 +11 5 5.426882 0.42688179016113281 0.18222806277117343 +12 5 5.87265 0.872650146484375 0.76151827815920115 +13 7 6.908373 0.091627120971679688 0.0083955292975588236 +14 5 5.333195 0.33319520950317383 0.1110190476358639 +15 7 6.38952065 0.61047935485839844 0.37268504270832636 +16 6 4.975053 1.0249471664428711 1.0505166939992705 +17 8 7.327068 0.67293214797973633 0.45283767578462175 +18 6 5.770521 0.22947883605957031 0.052660536199255148 +19 5 5.274254 0.27425384521484375 0.075215171615127474 +20 8 7.327068 0.67293214797973633 0.45283767578462175 +21 7 6.28790045 0.71209955215454102 0.50708577217869788 +22 8 6.739554 1.2604460716247559 1.5887242994742792 +23 5 4.72103071 0.27896928787231445 0.077823863575986252 +24 6 5.4655714 0.53442859649658203 0.28561392475330649 +25 6 5.91425276 0.085747241973876953 0.0073525895061266056 +26 6 5.993135 0.0068650245666503906 4.7128562300713384E-05 +27 6 6.12550831 0.12550830841064453 0.015752335480101465 +28 6 5.638529 0.36147117614746094 0.13066141118542873 +29 7 6.716088 0.28391218185424805 0.080606127005239614 +30 6 5.67022943 0.32977056503295898 0.10874862556215703 +31 6 5.82089472 0.17910528182983398 0.03207870197934426 +32 6 5.84701443 0.15298557281494141 0.023404585489515739 +33 6 6.165793 0.16579294204711914 0.027487299632639406 +34 5 5.41362047 0.4136204719543457 0.17108189481973568 +35 5 5.8876605 0.88766050338745117 0.78794116927406321 +36 5 5.140776 0.14077615737915039 0.019817926486439319 +37 6 5.909733 0.090267181396484375 0.0081481640372658148 +38 5 5.090864 0.090864181518554688 0.0082562994830368552 +39 5 5.090864 0.090864181518554688 0.0082562994830368552 +40 6 6.039511 0.039511203765869141 0.0015611352230280318 +41 6 5.72844 0.2715601921081543 0.073744937937817667 +42 6 5.414184 0.5858159065246582 0.34318027633730708 +43 6 5.830394 0.16960620880126953 0.028766266063939838 +44 6 5.829722 0.17027807235717773 0.028994621925676256 +45 7 5.971135 1.028864860534668 1.0585629012430218 +46 4 4.886475 0.8864750862121582 0.78583807847485332 +47 5 4.886475 0.1135249137878418 0.012887906050536913 +48 6 5.414184 0.5858159065246582 0.34318027633730708 +49 5 6.006579 1.0065789222717285 1.0132011267617145 +50 6 5.98721075 0.012789249420166016 0.00016356490073121677 +51 7 6.01847124 0.98152875900268555 0.96339870474935196 +52 7 6.326056 0.67394399642944336 0.45420051032328956 +53 6 6.149549 0.14954900741577148 0.022364905619042474 +54 6 5.874616 0.12538385391235352 0.015721110821914408 +55 6 6.26666641 0.26666641235351563 0.071110975477495231 +56 6 5.986947 0.013052940368652344 0.00017037925226759398 +57 6 5.81298637 0.18701362609863281 0.034974096346559236 +58 6 5.459394 0.54060602188110352 0.29225487089411217 +59 6 5.94256067 0.057439327239990234 0.0032992763137826842 +60 6 5.57885647 0.42114353179931641 0.17736187437640183 +61 6 5.81298637 0.18701362609863281 0.034974096346559236 +62 5 5.00168037 0.0016803741455078125 2.823657268891111E-06 +63 6 5.459394 0.54060602188110352 0.29225487089411217 +64 6 5.89929 0.10070991516113281 0.010142487011762569 +65 5 5.041315 0.041315078735351563 0.0017069357309082989 +66 7 6.70074558 0.29925441741943359 0.0895532063450446 +67 5 4.98183537 0.018164634704589844 0.00032995395395118976 +68 8 6.812332 1.1876678466796875 1.4105549140367657 +69 5 5.2840085 0.28400850296020508 0.080660829753696817 +70 6 5.4217205 0.57827949523925781 0.3344071746141708 +71 5 5.10868025 0.10868024826049805 0.011811396361963489 +72 5 4.84936762 0.15063238143920898 0.022690114338047351 +73 6 5.2388835 0.76111650466918945 0.57929833367984429 +74 8 6.812332 1.1876678466796875 1.4105549140367657 +75 5 5.2840085 0.28400850296020508 0.080660829753696817 +76 7 6.727201 0.27279901504516602 0.074419302609612714 +77 7 6.238829 0.76117086410522461 0.57938108436269431 +78 5 5.73537064 0.73537063598632813 0.54076997227093671 +79 5 5.206772 0.2067718505859375 0.042754598194733262 +80 6 6.218928 0.21892786026000977 0.047929407998026363 +81 6 5.88246059 0.11753940582275391 0.013815511921166035 +82 5 5.21755552 0.21755552291870117 0.047330405552429511 +83 6 5.64936066 0.35063934326171875 0.12294794904300943 +84 5 5.252364 0.25236415863037109 0.063687668561215105 +85 6 5.436144 0.56385612487792969 0.31793372956235544 +86 6 5.301076 0.69892406463623047 0.48849484812762967 +87 6 5.4996624 0.50033760070800781 0.25033771468224586 +88 5 5.252364 0.25236415863037109 0.063687668561215105 +89 6 5.436144 0.56385612487792969 0.31793372956235544 +90 6 5.301076 0.69892406463623047 0.48849484812762967 +91 5 5.332184 0.332183837890625 0.11034610215574503 +92 7 6.585561 0.41443920135498047 0.17175985161975404 +93 7 6.735927 0.26407289505004883 0.069734493900114103 +94 7 5.97698069 1.0230193138122559 1.0465685164328988 +95 6 5.79194736 0.20805263519287109 0.043285899010697904 +96 6 5.435262 0.56473779678344727 0.31892877911582218 +97 7 5.901606 1.0983939170837402 1.2064691970865624 +98 4 4.174137 0.17413711547851563 0.030323734987177886 +99 6 5.435262 0.56473779678344727 0.31892877911582218 +100 5 5.56997252 0.56997251510620117 0.32486866797648872 +101 5 5.66165352 0.66165351867675781 0.4377853787773347 +102 5 5.32760572 0.3276057243347168 0.10732551061687445 +103 5 5.209554 0.20955419540405273 0.043912960811439916 +104 5 5.56997252 0.56997251510620117 0.32486866797648872 +105 6 5.946871 0.053129196166992188 0.0028227114853507373 +106 5 5.66165352 0.66165351867675781 0.4377853787773347 +107 6 5.82830763 0.1716923713684082 0.029478270386107397 +108 6 5.82830763 0.1716923713684082 0.029478270386107397 +109 5 5.289993 0.2899928092956543 0.084095829443185721 +110 6 5.77061224 0.22938776016235352 0.052618744512301419 +111 5 5.123654 0.12365388870239258 0.015290284191223691 +112 5 5.275713 0.27571296691894531 0.076017640127247432 +113 5 5.38431644 0.38431644439697266 0.14769912943393138 +114 5 5.38431644 0.38431644439697266 0.14769912943393138 +115 4 4.31654739 0.31654739379882813 0.10020225252083037 +116 6 6.187931 0.18793106079101563 0.03531808361003641 +117 6 6.22085571 0.220855712890625 0.048777245916426182 +118 5 5.275713 0.27571296691894531 0.076017640127247432 +119 5 5.423021 0.42302083969116211 0.17894663081301587 +120 5 5.28126144 0.28126144409179688 0.079107999932602979 +121 5 5.637559 0.63755893707275391 0.40648139824133978 +122 5 5.77775145 0.77775144577026367 0.60489731139773539 +123 6 5.84558964 0.15441036224365234 0.023842559968215937 +124 6 5.741732 0.25826787948608398 0.066702297574238401 +125 6 6.478015 0.47801494598388672 0.22849828858397814 +126 5 5.651976 0.65197610855102539 0.42507284612133844 +127 7 6.109841 0.89015913009643555 0.79238327689404287 +128 7 6.330519 0.66948080062866211 0.44820454241039442 +129 6 6.17036 0.17036008834838867 0.029022559702070794 +130 5 5.10576 0.10576009750366211 0.011185198223984116 +131 7 6.109841 0.89015913009643555 0.79238327689404287 +132 5 5.40527 0.40527009963989258 0.16424385366212846 +133 5 5.542647 0.54264688491821289 0.29446564171144018 +134 5 5.281421 0.28142118453979492 0.079197883107781308 +135 5 5.44356537 0.44356536865234375 0.19675023626768962 +136 6 6.00983572 0.0098357200622558594 9.6741389143062406E-05 +137 5 5.241497 0.24149703979492188 0.05832082022971008 +138 7 6.315238 0.68476200103759766 0.46889899806501489 +139 6 5.888501 0.11149883270263672 0.012431989694050571 +140 5 5.400142 0.40014219284057617 0.16011377449126485 +141 5 5.241497 0.24149703979492188 0.05832082022971008 +142 6 5.877977 0.12202310562133789 0.014889638305476183 +143 6 5.74312925 0.25687074661254883 0.065982580465288265 +144 6 5.827976 0.17202377319335938 0.029592178543680348 +145 6 5.97833 0.021669864654541016 0.00046958303414612601 +146 6 5.659865 0.34013509750366211 0.11569188455382573 +147 4 4.66095638 0.66095638275146484 0.43686333989990089 +148 7 6.526716 0.47328376770019531 0.22399752476849244 +149 6 5.537257 0.46274280548095703 0.21413090402438684 +150 7 6.371533 0.62846708297729492 0.3949708743859901 +151 6 5.87430143 0.12569856643676758 0.015800129604258473 +152 6 5.537257 0.46274280548095703 0.21413090402438684 +153 5 5.83971643 0.83971643447875977 0.70512369033372124 +154 6 5.504298 0.49570178985595703 0.24572026446639939 +155 6 5.923597 0.076403141021728516 0.0058374399579861347 +156 6 5.923597 0.076403141021728516 0.0058374399579861347 +157 7 6.4670825 0.53291749954223633 0.28400106131834946 +158 8 7.183791 0.81620883941650391 0.66619686954163626 +159 8 7.183791 0.81620883941650391 0.66619686954163626 +160 7 6.4670825 0.53291749954223633 0.28400106131834946 +161 5 5.491083 0.49108314514160156 0.24116265544216731 +162 5 5.358941 0.35894107818603516 0.1288386976093534 +163 6 5.923597 0.076403141021728516 0.0058374399579861347 +164 5 5.557883 0.55788278579711914 0.31123320268875432 +165 5 5.80627 0.80627012252807617 0.65007151048143896 +166 6 5.4762373 0.52376270294189453 0.27432736899299925 +167 7 6.891704 0.10829591751098633 0.011728005749546355 +168 5 5.28792524 0.28792524337768555 0.082900945774099455 +169 5 4.44647264 0.5535273551940918 0.30639253294816626 +170 6 6.20261526 0.20261526107788086 0.041052944021657822 +171 6 5.813782 0.1862177848815918 0.034677063406206798 +172 4 4.291095 0.29109477996826172 0.084736170924770704 +173 7 6.75989151 0.24010848999023438 0.057652086965390481 +174 5 5.5592947 0.55929470062255859 0.31281056214447744 +175 6 6.190523 0.19052314758300781 0.036299069764936576 +176 4 5.546434 1.5464339256286621 2.3914578863352745 +177 5 5.45982838 0.45982837677001953 0.21144213608295104 +178 4 4.225169 0.22516918182373047 0.050701160443168192 +179 6 5.508888 0.49111223220825195 0.24119122462457199 +180 6 5.42470741 0.57529258728027344 0.33096156097963103 +181 5 5.16715574 0.16715574264526367 0.02794104229928962 +182 5 5.24366856 0.24366855621337891 0.059374365287112596 +183 6 5.64808273 0.35191726684570313 0.12384576270414982 +184 5 5.23220968 0.23220968246459961 0.053921336630310179 +185 5 5.196457 0.1964569091796875 0.038595317164435983 +186 6 5.80372334 0.19627666473388672 0.03852452911905857 +187 5 5.99319839 0.99319839477539063 0.98644305138441268 +188 8 7.04508162 0.95491838455200195 0.91186912115540508 +189 4 5.48485327 1.4848532676696777 2.2047892265093196 +190 6 5.43693161 0.56306838989257813 0.31704601169622038 +191 5 5.24366856 0.24366855621337891 0.059374365287112596 +192 6 6.261883 0.26188278198242188 0.068582591498852707 +193 5 6.014933 1.0149331092834473 1.0300892163197659 +194 5 5.24624968 0.24624967575073242 0.060638902807340855 +195 6 5.24624968 0.75375032424926758 0.56813955130587601 +196 5 5.24624968 0.24624967575073242 0.060638902807340855 +197 5 5.250086 0.25008583068847656 0.062542922711145366 +198 5 5.28796864 0.28796863555908203 0.082925935065759404 +199 5 5.250086 0.25008583068847656 0.062542922711145366 +200 5 5.24837 0.24837017059326172 0.061687741640525928 +201 5 5.28796864 0.28796863555908203 0.082925935065759404 +202 5 5.249635 0.24963521957397461 0.062317742851746516 +203 6 6.88108873 0.8810887336730957 0.77631735660565937 +204 4 5.611186 1.6111860275268555 2.5959204152977691 +205 5 5.433936 0.43393611907958984 0.18830055544185598 +206 5 5.67375565 0.67375564575195313 0.45394667018263135 +207 4 4.45758867 0.45758867263793945 0.20938739332655132 +208 5 5.070417 0.070416927337646484 0.0049585436556753848 +209 6 5.637781 0.36221885681152344 0.13120250022984692 +210 5 5.36824369 0.36824369430541992 0.13560341839570356 +211 7 6.63713264 0.36286735534667969 0.13167271757629351 +212 5 5.67375565 0.67375564575195313 0.45394667018263135 +213 6 6.07086134 0.070861339569091797 0.0050213294455261348 +214 7 6.495806 0.50419378280639648 0.25421137062062371 +215 5 5.224705 0.22470521926879883 0.05049243556663896 +216 5 5.80051565 0.80051565170288086 0.64082530862128806 +217 5 5.224705 0.22470521926879883 0.05049243556663896 +218 5 5.27940559 0.27940559387207031 0.078067485887004295 +219 5 5.922441 0.92244100570678711 0.85089740900934885 +220 5 5.80051565 0.80051565170288086 0.64082530862128806 +221 6 5.132604 0.86739587783813477 0.75237560889058841 +222 7 6.495806 0.50419378280639648 0.25421137062062371 +223 6 5.823209 0.17679119110107422 0.031255125250936544 +224 6 5.77888727 0.22111272811889648 0.048890838536181036 +225 5 5.44676161 0.4467616081237793 0.19959593449334534 +226 6 5.878103 0.12189722061157227 0.014858932392826318 +227 6 5.50031567 0.49968433380126953 0.24968443344641855 +228 6 5.878103 0.12189722061157227 0.014858932392826318 +229 5 5.44676161 0.4467616081237793 0.19959593449334534 +230 4 4.546661 0.5466609001159668 0.29883813971559903 +231 6 5.757604 0.24239587783813477 0.058755761592919953 +232 6 5.72927952 0.27072048187255859 0.073289579305310326 +233 6 6.163166 0.16316604614257813 0.026623158613801934 +234 6 6.163166 0.16316604614257813 0.026623158613801934 +235 6 6.163166 0.16316604614257813 0.026623158613801934 +236 6 6.163166 0.16316604614257813 0.026623158613801934 +237 6 5.487222 0.51277780532836914 0.26294107763737884 +238 7 6.68565941 0.31434059143066406 0.098810007420979673 +239 6 5.802817 0.19718313217163086 0.038881187613014845 +240 5 5.11719465 0.11719465255737305 0.013734586588043385 +241 5 5.726284 0.72628402709960938 0.52748848802002613 +242 7 6.105395 0.89460515975952148 0.80031839186835896 +243 6 5.960915 0.039084911346435547 0.0015276302949587262 +244 5 5.216609 0.21660900115966797 0.046919459383389039 +245 6 6.00468969 0.0046896934509277344 2.1993224663674482E-05 +246 7 6.8084445 0.19155550003051758 0.03669350959194162 +247 7 6.10422945 0.89577054977416992 0.80240487784271863 +248 7 6.269913 0.7300868034362793 0.53302674055180432 +249 5 5.307523 0.30752277374267578 0.094570256370388961 +250 4 5.00461149 1.0046114921569824 1.0092442501738788 +251 3 4.74934769 1.7493476867675781 3.0602173291990766 +252 5 5.216609 0.21660900115966797 0.046919459383389039 +253 3 4.21514 1.2151398658752441 1.4765648936393063 +254 6 5.52048063 0.47951936721801758 0.22993882353716799 +255 8 6.49816942 1.5018305778503418 2.2554950845662916 +256 7 5.884387 1.1156129837036133 1.2445923294080785 +257 7 5.884387 1.1156129837036133 1.2445923294080785 +258 6 6.539793 0.53979301452636719 0.29137649853146286 +259 4 4.220551 0.2205510139465332 0.048642749752843883 +260 6 6.21442842 0.21442842483520508 0.045979549377307194 +261 5 5.38486671 0.38486671447753906 0.14812238791273558 +262 5 5.504349 0.5043492317199707 0.2543681475365247 +263 6 5.68215 0.31785011291503906 0.10102869428010308 +264 6 5.6343627 0.36563730239868164 0.13369063690538496 +265 5 5.38486671 0.38486671447753906 0.14812238791273558 +266 6 5.274923 0.72507715225219727 0.52573687671815605 +267 5 5.280154 0.28015422821044922 0.078486391584192461 +268 6 5.36846256 0.63153743743896484 0.39883953488697443 +269 6 5.36846256 0.63153743743896484 0.39883953488697443 +270 6 5.274923 0.72507715225219727 0.52573687671815605 +271 5 5.087133 0.087132930755615234 0.0075921476220628392 +272 5 5.316086 0.3160858154296875 0.099910242715850472 +273 5 4.99754 0.0024600028991699219 6.0516142639244208E-06 +274 5 5.4562726 0.45627260208129883 0.20818468741003926 +275 6 5.997397 0.0026030540466308594 6.7758903696812922E-06 +276 6 5.95126629 0.048733711242675781 0.0023749746114845038 +277 5 5.10343027 0.10343027114868164 0.010697820989889806 +278 4 4.91050863 0.91050863265991211 0.82902597014822277 +279 7 6.508873 0.49112701416015625 0.24120574403787032 +280 8 6.665929 1.334071159362793 1.7797458582435866 +281 8 7.08416 0.91584014892578125 0.83876317838439718 +282 4 4.9356513 0.93565130233764648 0.87544335956613395 +283 5 5.27014065 0.27014064788818359 0.072975969641447591 +284 5 5.23520041 0.23520040512084961 0.055319230569011779 +285 5 5.231636 0.23163604736328125 0.053655258438084275 +286 6 5.39945173 0.60054826736450195 0.36065822143450532 +287 7 6.163166 0.83683395385742188 0.70029106632864568 +288 7 6.163166 0.83683395385742188 0.70029106632864568 +289 7 6.163166 0.83683395385742188 0.70029106632864568 +290 7 6.163166 0.83683395385742188 0.70029106632864568 +291 6 5.971399 0.028601169586181641 0.00081802690169752168 +292 5 5.279406 0.27940607070922852 0.078067752349170405 +293 7 5.74141073 1.2585892677307129 1.5840469448469321 +294 3 3.64403057 0.64403057098388672 0.41477537636183115 +295 6 5.698216 0.30178403854370117 0.091073605919746115 +296 5 5.033449 0.033449172973632813 0.0011188471726200078 +297 7 6.434052 0.5659480094909668 0.32029714944678744 +298 6 5.95223331 0.047766685485839844 0.0022816562423031428 +299 6 5.994336 0.0056638717651367188 3.207944337191293E-05 +300 6 5.8504715 0.14952850341796875 0.022358773334417492 +301 6 5.46959 0.53040981292724609 0.2813345696495162 +302 6 5.8504715 0.14952850341796875 0.022358773334417492 +303 6 5.84660339 0.1533966064453125 0.023530518868938088 +304 6 5.49118376 0.50881624221801758 0.25889396834486433 +305 6 5.49118376 0.50881624221801758 0.25889396834486433 +306 5 5.209182 0.20918178558349609 0.043757019419899734 +307 6 5.46011972 0.53988027572631836 0.29147071211832554 +308 7 6.02967453 0.97032546997070313 0.94153151767386589 +309 6 5.84821558 0.15178442001342773 0.023038510158812642 +310 7 6.60169029 0.39830970764160156 0.15865062320153811 +311 8 7.12271929 0.87728071212768555 0.76962144787125908 +312 6 6.070884 0.070884227752685547 0.0050245737440945959 +313 6 5.46675158 0.5332484245300293 0.28435388226375835 +314 5 5.307043 0.30704307556152344 0.094275450250279391 +315 6 5.632986 0.36701393127441406 0.13469922574950033 +316 6 6.04914 0.049139976501464844 0.002414737290564517 +317 5 6.03052044 1.0305204391479492 1.0619723755016821 +318 7 6.39483166 0.60516834259033203 0.36622872287352948 +319 6 6.043684 0.043684005737304688 0.0019082923572568689 +320 7 6.36964655 0.63035345077514648 0.39734547290413502 +321 5 6.03052044 1.0305204391479492 1.0619723755016821 +322 6 6.04914 0.049139976501464844 0.002414737290564517 +323 6 5.951385 0.048614978790283203 0.0023634161627796857 +324 5 5.121614 0.12161397933959961 0.014789959970812561 +325 5 4.52251625 0.47748374938964844 0.22799073093119659 +326 6 5.72818375 0.27181625366210938 0.073884075754904188 +327 6 5.414321 0.58567905426025391 0.34301995459918544 +328 6 5.475126 0.52487421035766602 0.27549293669858343 +329 5 5.86220741 0.86220741271972656 0.7434016225488449 +330 8 7.05833244 0.94166755676269531 0.886737787459424 +331 5 6.04914 1.0491399765014648 1.1006946902934942 +332 6 6.296459 0.29645919799804688 0.08788805607764516 +333 5 5.67379332 0.67379331588745117 0.45399743253460656 +334 5 5.57425976 0.57425975799560547 0.32977426965317136 +335 6 6.296459 0.29645919799804688 0.08788805607764516 +336 6 6.168834 0.16883420944213867 0.028504990277951947 +337 6 5.571726 0.42827415466308594 0.18341875155238085 +338 5 5.1820116 0.18201160430908203 0.033128224103165849 +339 7 6.845515 0.15448522567749023 0.023865684952625088 +340 7 5.794984 1.2050161361694336 1.4520638884287109 +341 6 5.49368334 0.5063166618347168 0.25635656205145096 +342 6 5.494451 0.50554895401000977 0.25557974490061497 +343 5 5.40403748 0.4040374755859375 0.16324628167785704 +344 6 5.93613958 0.063860416412353516 0.0040781527843591903 +345 6 5.949069 0.050930976867675781 0.0025939644046957255 +346 7 6.168058 0.83194208145141602 0.69212762688971452 +347 6 6.40999 0.40998983383178711 0.16809166384541641 +348 6 5.99639034 0.0036096572875976563 1.3029625733906869E-05 +349 5 5.87430143 0.87430143356323242 0.76440299673072332 +350 7 6.90420866 0.095791339874267578 0.0091759807949074457 +351 7 6.78889275 0.21110725402832031 0.044566272703377763 +352 6 5.511934 0.48806619644165039 0.23820861210901967 +353 7 6.78889275 0.21110725402832031 0.044566272703377763 +354 6 5.65645266 0.34354734420776367 0.11802477771220765 +355 6 6.17624664 0.17624664306640625 0.031062879192177206 +356 6 6.17624664 0.17624664306640625 0.031062879192177206 +357 6 5.61167145 0.38832855224609375 0.15079906448954716 +358 6 5.29756641 0.70243358612060547 0.49341294291025406 +359 6 5.91268969 0.087310314178466797 0.0076230909619425802 +360 6 5.86551237 0.13448762893676758 0.018086922337033684 +361 5 5.08086443 0.080864429473876953 0.0065390559541356197 +362 6 6.06830931 0.068309307098388672 0.004666161436261973 +363 6 6.17624664 0.17624664306640625 0.031062879192177206 +364 7 6.6356883 0.36431169509887695 0.13272301118581709 +365 7 6.97618628 0.023813724517822266 0.0005670934754107293 +366 6 5.7951417 0.20485830307006836 0.041966924336747979 +367 6 5.22309 0.77690982818603516 0.60358888113205467 +368 6 5.72964668 0.27035331726074219 0.07309091615388752 +369 5 5.901571 0.90157079696655273 0.81282990194290505 +370 6 5.22309 0.77690982818603516 0.60358888113205467 +371 6 5.72964668 0.27035331726074219 0.07309091615388752 +372 5 4.81994867 0.18005132675170898 0.032418480265050675 +373 6 5.73458433 0.26541566848754883 0.07044547707869242 +374 7 6.622659 0.37734079360961914 0.14238607452193719 +375 7 6.622659 0.37734079360961914 0.14238607452193719 +376 7 5.72573566 1.2742643356323242 1.6237495970644886 +377 7 5.80524874 1.1947512626647949 1.4274305796391218 +378 6 5.56888628 0.43111371994018555 0.18585903952066474 +379 7 5.72573566 1.2742643356323242 1.6237495970644886 +380 7 5.80524874 1.1947512626647949 1.4274305796391218 +381 6 5.465357 0.53464317321777344 0.28584332266837009 +382 6 5.3793335 0.62066650390625 0.38522690907120705 +383 6 5.73458433 0.26541566848754883 0.07044547707869242 +384 7 6.5848403 0.41515970230102539 0.17235757841467603 +385 7 6.622659 0.37734079360961914 0.14238607452193719 +386 7 6.736278 0.26372194290161133 0.069549263167800746 +387 5 5.15757132 0.15757131576538086 0.024828719552033363 +388 6 5.866982 0.13301801681518555 0.017693792797444985 +389 7 5.79346561 1.2065343856811523 1.4557252238309957 +390 7 5.79346561 1.2065343856811523 1.4557252238309957 +391 5 4.9216423 0.078357696533203125 0.006139928605989553 +392 6 5.582333 0.41766691207885742 0.17444564944548802 +393 6 6.033824 0.033823966979980469 0.0011440607422628091 +394 5 5.2088747 0.20887470245361328 0.043628641325085482 +395 5 5.09981632 0.099816322326660156 0.0099632982028197148 +396 5 6.02121162 1.0212116241455078 1.0428731812899059 +397 6 6.29722261 0.29722261428833008 0.088341282444389435 +398 5 5.280024 0.28002405166625977 0.078413469511588119 +399 6 6.517963 0.51796293258666992 0.26828559953378317 +400 6 6.29722261 0.29722261428833008 0.088341282444389435 +401 5 5.2088747 0.20887470245361328 0.043628641325085482 +402 5 5.03644276 0.036442756652832031 0.0013280745124575333 +403 5 5.31974745 0.3197474479675293 0.10223843048174786 +404 6 6.64804 0.64803981781005859 0.41995560546729394 +405 5 5.09981632 0.099816322326660156 0.0099632982028197148 +406 7 7.076631 0.076631069183349609 0.0058723207641833142 +407 5 5.05094671 0.050946712493896484 0.0025955675139357481 +408 6 5.99687767 0.0031223297119140625 9.7489428299013525E-06 +409 5 6.02121162 1.0212116241455078 1.0428731812899059 +410 6 5.5693655 0.43063449859619141 0.18544607138119318 +411 6 5.84123039 0.15876960754394531 0.025207788279658416 +412 5 5.79458427 0.79458427429199219 0.63136416895213188 +413 5 5.79458427 0.79458427429199219 0.63136416895213188 +414 6 5.5693655 0.43063449859619141 0.18544607138119318 +415 6 5.84123039 0.15876960754394531 0.025207788279658416 +416 6 5.82386971 0.17613029479980469 0.031021880746266106 +417 5 5.18994951 0.18994951248168945 0.036080817292031497 +418 6 5.82386971 0.17613029479980469 0.031021880746266106 +419 6 5.795103 0.20489692687988281 0.041982750644820044 +420 7 6.7393136 0.26068639755249023 0.067957397868894986 +421 6 6.021837 0.021837234497070313 0.0004768648104800377 +422 6 6.021837 0.021837234497070313 0.0004768648104800377 +423 6 6.021837 0.021837234497070313 0.0004768648104800377 +424 7 5.91769934 1.0823006629943848 1.1713747251180848 +425 6 6.021837 0.021837234497070313 0.0004768648104800377 +426 6 6.021837 0.021837234497070313 0.0004768648104800377 +427 5 5.31993246 0.31993246078491211 0.10235677946388932 +428 5 5.541713 0.54171323776245117 0.29345323196707795 +429 5 5.29234028 0.29234027862548828 0.08546283850682812 +430 5 5.31993246 0.31993246078491211 0.10235677946388932 +431 5 4.993221 0.0067791938781738281 4.5957469637869508E-05 +432 7 6.71159029 0.28840970993041992 0.08318016078214896 +433 4 4.595131 0.59513092041015625 0.35418081242823973 +434 8 6.86301756 1.1369824409484863 1.2927290710251782 +435 7 6.96430874 0.035691261291503906 0.0012738661325784051 +436 5 5.21484661 0.21484661102294922 0.046159066268046445 +437 8 7.18364525 0.81635475158691406 0.66643508043853217 +438 7 6.71159029 0.28840970993041992 0.08318016078214896 +439 5 4.960922 0.039078235626220703 0.001527108499658425 +440 7 6.418142 0.58185815811157227 0.33855891616099143 +441 6 5.929764 0.0702362060546875 0.004933124640956521 +442 8 7.54107952 0.45892047882080078 0.21060800588111306 +443 6 5.76989126 0.23010873794555664 0.052950031278896859 +444 6 5.795 0.20499992370605469 0.042024968719488243 +445 3 5.248956 2.2489562034606934 5.0578040050843356 +446 5 6.340478 1.3404779434204102 1.7968811167966123 +447 6 5.84383631 0.15616369247436523 0.024387098847228117 +448 6 5.84383631 0.15616369247436523 0.024387098847228117 +449 7 6.47833157 0.52166843414306641 0.27213795518127881 +450 5 4.94290733 0.057092666625976563 0.003259572582464898 +451 5 5.55804157 0.55804157257080078 0.31141039671729231 +452 7 6.32008076 0.67991924285888672 0.46229017680980178 +453 7 6.45778561 0.54221439361572266 0.29399644864406582 +454 7 6.47833157 0.52166843414306641 0.27213795518127881 +455 6 5.84383631 0.15616369247436523 0.024387098847228117 +456 7 6.69056559 0.30943441390991211 0.095749656511770809 +457 5 5.666873 0.66687297821044922 0.44471956906727428 +458 6 5.436703 0.56329679489135742 0.31730327913487599 +459 5 4.90243149 0.097568511962890625 0.009519614526652731 +460 5 5.666873 0.66687297821044922 0.44471956906727428 +461 5 5.6149745 0.6149744987487793 0.37819363411131235 +462 5 5.289179 0.28917884826660156 0.08362440628479817 +463 6 5.08662176 0.91337823867797852 0.83425980689048629 +464 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +465 5 5.33792353 0.33792352676391602 0.11419230994056306 +466 6 6.279598 0.27959823608398438 0.078175173621275462 +467 6 5.08662176 0.91337823867797852 0.83425980689048629 +468 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +469 5 5.35536432 0.35536432266235352 0.1262838018212733 +470 6 5.00434446 0.99565553665161133 0.99132994766500815 +471 5 5.415714 0.41571378707885742 0.1728179527674456 +472 6 6.255002 0.25500202178955078 0.065026031116758531 +473 7 6.1227684 0.87723159790039063 0.76953527635487262 +474 6 5.61289 0.38711023330688477 0.14985433273091076 +475 5 5.6727953 0.67279529571533203 0.45265350993668108 +476 7 6.37792349 0.62207651138305664 0.3869791860145142 +477 6 6.137163 0.13716316223144531 0.018813733073329786 +478 6 5.165093 0.83490705490112305 0.69706979032366689 +479 6 6.256819 0.25681877136230469 0.06595588132404373 +480 5 5.14719439 0.14719438552856445 0.021666187131131665 +481 6 6.024329 0.024329185485839844 0.00059190926640440011 +482 5 5.55854845 0.5585484504699707 0.31197637152240532 +483 5 5.14719439 0.14719438552856445 0.021666187131131665 +484 5 4.807844 0.19215583801269531 0.036923866082361201 +485 6 6.0983386 0.098338603973388672 0.0096704810314349743 +486 6 5.87475061 0.12524938583374023 0.015687408651729129 +487 6 6.023153 0.023152828216552734 0.00053605345442520047 +488 6 6.29130173 0.29130172729492188 0.084856696325005032 +489 6 5.48021841 0.51978158950805664 0.2701729007915219 +490 6 5.77609539 0.22390460968017578 0.050133274236031866 +491 7 6.43585968 0.56414031982421875 0.31825430045137182 +492 6 5.79112244 0.2088775634765625 0.043629836523905396 +493 6 6.26251125 0.26251125335693359 0.068912158139028179 +494 6 6.30851841 0.30851840972900391 0.095183609141713532 +495 6 6.354451 0.35445117950439453 0.12563563865205651 +496 4 4.753712 0.75371217727661133 0.56808204617504998 +497 6 6.817308 0.81730794906616211 0.66799228360673624 +498 5 5.29211855 0.29211854934692383 0.085333246872551172 +499 4 4.753712 0.75371217727661133 0.56808204617504998 +500 6 5.484865 0.51513481140136719 0.26536387391752214 +501 6 6.044801 0.044801235198974609 0.0020071506753538415 +502 6 5.19564533 0.80435466766357422 0.64698643139217893 +503 5 5.20786428 0.20786428451538086 0.043207560777091203 +504 6 6.26455355 0.26455354690551758 0.069988579180289889 +505 6 6.26455355 0.26455354690551758 0.069988579180289889 +506 5 4.85467 0.14532995223999023 0.021120795018077843 +507 7 6.225348 0.77465200424194336 0.60008572767605983 +508 6 5.982076 0.017923831939697266 0.00032126375140251184 +509 7 6.225348 0.77465200424194336 0.60008572767605983 +510 6 5.31798172 0.68201828002929688 0.46514893429412041 +511 6 5.64203167 0.35796833038330078 0.12814132555740798 +512 6 6.37156963 0.37156963348388672 0.13806399252734991 +513 6 5.88133144 0.11866855621337891 0.014082226233767869 +514 7 6.026742 0.97325801849365234 0.94723117056219053 +515 6 5.47360754 0.52639245986938477 0.27708902180734185 +516 5 6.01606941 1.0160694122314453 1.0323970504723547 +517 6 5.994919 0.0050811767578125 2.5818357244133949E-05 +518 6 6.21694946 0.216949462890625 0.047067069448530674 +519 5 5.25397635 0.25397634506225586 0.064503983851182056 +520 5 5.16614771 0.16614770889282227 0.027605061170334011 +521 5 5.16614771 0.16614770889282227 0.027605061170334011 +522 6 6.029863 0.029862880706787109 0.00089179164410779777 +523 6 6.17634344 0.17634344100952148 0.031097009187078584 +524 5 4.46065855 0.53934144973754883 0.29088919940500091 +525 6 5.49068642 0.50931358337402344 0.25940032620928832 +526 4 4.83760929 0.83760929107666016 0.7015893244979452 +527 6 6.53003359 0.53003358840942383 0.28093560484217051 +528 6 6.38529253 0.38529253005981445 0.14845033371989302 +529 6 6.527589 0.52758884429931641 0.27834998862908833 +530 6 6.089735 0.089735031127929688 0.00805237581153051 +531 5 5.81951237 0.81951236724853516 0.67160052007329796 +532 6 5.66872072 0.33127927780151367 0.10974595990069247 +533 6 5.66872072 0.33127927780151367 0.10974595990069247 +534 6 5.66872072 0.33127927780151367 0.10974595990069247 +535 5 5.35391045 0.35391044616699219 0.12525260390611948 +536 5 5.35391045 0.35391044616699219 0.12525260390611948 +537 6 5.66872072 0.33127927780151367 0.10974595990069247 +538 5 5.69457865 0.69457864761352539 0.48243949772063388 +539 6 5.44028759 0.55971240997314453 0.31327798187794542 +540 4 5.25917149 1.2591714859008789 1.5855128309058273 +541 5 5.079481 0.079481124877929688 0.0063172492118610535 +542 6 5.75632048 0.24367952346801758 0.05937971015760013 +543 6 5.91034174 0.089658260345458984 0.008038603648174103 +544 6 5.429198 0.57080221176147461 0.3258151649517913 +545 6 6.05427027 0.054270267486572266 0.0029452619330641028 +546 6 5.790551 0.20944881439208984 0.043868805850252102 +547 6 5.43407631 0.56592369079589844 0.32026962380405166 +548 7 6.30033445 0.69966554641723633 0.48953187684332988 +549 5 5.079481 0.079481124877929688 0.0063172492118610535 +550 7 5.43548965 1.5645103454589844 2.4476926210481906 +551 7 6.03222 0.96778011322021484 0.93659834754453186 +552 7 6.296845 0.7031550407409668 0.49442701131943068 +553 7 5.43548965 1.5645103454589844 2.4476926210481906 +554 7 6.296845 0.7031550407409668 0.49442701131943068 +555 7 6.03222 0.96778011322021484 0.93659834754453186 +556 5 5.032953 0.032952785491943359 0.0010858860716780327 +557 6 5.60137033 0.39862966537475586 0.15890561011678983 +558 5 5.41377 0.41377019882202148 0.17120577743321519 +559 6 6.48004532 0.48004531860351563 0.23044350791315082 +560 7 6.00349665 0.99650335311889648 0.9930189327772041 +561 5 5.24001074 0.24001073837280273 0.057605154534257963 +562 6 5.28676558 0.71323442459106445 0.50870334442174681 +563 7 5.429729 1.5702710151672363 2.4657510610743429 +564 5 5.3263216 0.32632160186767578 0.1064857878454859 +565 6 5.754887 0.24511289596557617 0.060080331768631368 +566 6 5.328569 0.67143106460571289 0.450819674517561 +567 5 5.592988 0.59298801422119141 0.3516347850099919 +568 6 5.67043066 0.32956933975219727 0.10861594970469923 +569 6 5.49481869 0.50518131256103516 0.2552081585608903 +570 5 5.04753637 0.047536373138427734 0.0022597067711558338 +571 7 6.6258 0.37419986724853516 0.14002554064882133 +572 5 5.35135746 0.35135746002197266 0.12345206471309211 +573 7 6.7393136 0.26068639755249023 0.067957397868894986 +574 7 6.16289759 0.83710241317749023 0.70074045014757758 +575 6 5.978729 0.021271228790283203 0.00045246517424857302 +576 6 5.980228 0.019772052764892578 0.00039093407053769624 +577 7 6.7393136 0.26068639755249023 0.067957397868894986 +578 7 6.6258 0.37419986724853516 0.14002554064882133 +579 7 6.59008455 0.40991544723510742 0.16803067388195814 +580 5 5.04753637 0.047536373138427734 0.0022597067711558338 +581 5 5.48165464 0.48165464401245117 0.23199119609876107 +582 6 5.431743 0.56825685501098633 0.32291585326697714 +583 6 5.640394 0.35960578918457031 0.12931632361505763 +584 7 6.35053444 0.64946556091308594 0.42180551481214934 +585 6 5.640394 0.35960578918457031 0.12931632361505763 +586 6 5.52043533 0.47956466674804688 0.22998226959316526 +587 7 6.54887772 0.45112228393554688 0.20351131506322417 +588 7 6.77563524 0.2243647575378418 0.050339544425014537 +589 6 5.89532852 0.10467147827148438 0.010956118363537826 +590 5 4.98952246 0.010477542877197266 0.00010977890474350716 +591 6 6.436891 0.43689107894897461 0.19087381486519917 +592 5 5.309803 0.30980300903320313 0.095977904406026937 +593 5 5.04597664 0.045976638793945313 0.0021138513147889171 +594 5 4.88176441 0.11823558807373047 0.013979654287140875 +595 7 5.559344 1.4406561851501465 2.0754902438113731 +596 5 5.309803 0.30980300903320313 0.095977904406026937 +597 6 6.028057 0.028057098388671875 0.00078720076999161392 +598 8 6.58157253 1.4184274673461914 2.0119364801221309 +599 7 6.23756 0.76244020462036133 0.58131506562153845 +600 6 5.6493926 0.35060739517211914 0.12292554554937851 +601 6 5.82520628 0.17479372024536133 0.030552844637213639 +602 5 5.04597664 0.045976638793945313 0.0021138513147889171 +603 5 4.88176441 0.11823558807373047 0.013979654287140875 +604 6 5.64465666 0.35534334182739258 0.12626889058105917 +605 6 5.64465666 0.35534334182739258 0.12626889058105917 +606 5 5.487342 0.48734188079833984 0.23750210878006328 +607 5 5.487342 0.48734188079833984 0.23750210878006328 +608 5 5.295503 0.29550313949584961 0.087322105451903553 +609 6 5.45708036 0.54291963577270508 0.29476173090756674 +610 8 7.10623741 0.89376258850097656 0.79881156460396596 +611 6 5.615421 0.38457918167114258 0.14790114697484569 +612 5 5.25086737 0.25086736679077148 0.062934435720535475 +613 5 5.33452845 0.33452844619750977 0.11190928131532019 +614 5 5.33452845 0.33452844619750977 0.11190928131532019 +615 5 5.25086737 0.25086736679077148 0.062934435720535475 +616 7 6.00642872 0.99357128143310547 0.98718389128862327 +617 6 5.77096748 0.22903251647949219 0.05245589360492886 +618 6 5.84212971 0.15787029266357422 0.024923029305682576 +619 6 5.984556 0.015443801879882813 0.00023851101650507189 +620 5 5.22900248 0.22900247573852539 0.05244213389437391 +621 5 5.36206055 0.362060546875 0.13108783960342407 +622 6 5.93520927 0.064790725708007813 0.0041978381377703045 +623 5 4.71454334 0.28545665740966797 0.081485503259500547 +624 5 5.071442 0.071442127227783203 0.0051039775428307621 +625 8 6.65726042 1.3427395820617676 1.8029495852354103 +626 4 4.52697849 0.52697849273681641 0.27770633180716686 +627 6 5.39603329 0.60396671295166016 0.36477579035363306 +628 6 5.39603329 0.60396671295166016 0.36477579035363306 +629 6 5.55218744 0.44781255722045898 0.20053608640432685 +630 5 5.42956257 0.42956256866455078 0.1845240003976869 +631 5 5.42956257 0.42956256866455078 0.1845240003976869 +632 6 5.772721 0.2272791862487793 0.051655828501907308 +633 5 5.31113052 0.31113052368164063 0.096802202766411938 +634 6 6.38461 0.38461017608642578 0.14792498754923145 +635 6 6.17356 0.17356014251708984 0.030123123070552538 +636 7 6.31279945 0.68720054626464844 0.47224459078643122 +637 5 5.275313 0.27531290054321289 0.075797193205517033 +638 5 5.26560354 0.26560354232788086 0.070545241697118399 +639 5 5.257151 0.25715112686157227 0.066126702046176433 +640 7 6.23770428 0.76229572296142578 0.58109476924528281 +641 4 5.22752 1.2275199890136719 1.5068053234281251 +642 6 5.822799 0.1772007942199707 0.031400121472188403 +643 5 5.47019768 0.47019767761230469 0.22108585603200481 +644 5 5.47785473 0.47785472869873047 0.2283451417397373 +645 5 5.157337 0.15733718872070313 0.024754990954534151 +646 4 4.80251074 0.80251073837280273 0.64402348520366104 +647 6 6.12228966 0.12228965759277344 0.01495476035415777 +648 5 5.202234 0.20223379135131836 0.040898506364328568 +649 7 6.353786 0.64621400833129883 0.41759254456360395 +650 7 6.353786 0.64621400833129883 0.41759254456360395 +651 7 6.353786 0.64621400833129883 0.41759254456360395 +652 7 6.353786 0.64621400833129883 0.41759254456360395 +653 6 5.529214 0.47078609466552734 0.22163954693041887 +654 7 6.675183 0.32481718063354492 0.10550620083472495 +655 6 6.66171551 0.66171550750732422 0.43786741287567565 +656 6 6.07065535 0.070655345916748047 0.0049921779066153249 +657 5 4.939713 0.060286998748779297 0.0036345222181353165 +658 5 5.754849 0.75484895706176758 0.56979694797723823 +659 4 4.11328363 0.11328363418579102 0.012833181774340119 +660 5 5.09369659 0.09369659423828125 0.0087790517718531191 +661 7 7.069395 0.069395065307617188 0.0048156750890484545 +662 4 4.37782669 0.37782669067382813 0.1427530081855366 +663 5 5.09369659 0.09369659423828125 0.0087790517718531191 +664 6 5.83840847 0.16159152984619141 0.026111822518032568 +665 5 5.153395 0.15339517593383789 0.023530079999773079 +666 6 6.53245831 0.53245830535888672 0.28351184694565745 +667 6 5.83840847 0.16159152984619141 0.026111822518032568 +668 6 5.71215439 0.28784561157226563 0.082855096101411618 +669 5 5.498241 0.49824094772338867 0.24824404198830052 +670 6 5.217243 0.78275680541992188 0.61270821643120144 +671 6 6.30048275 0.30048274993896484 0.090289883010882477 +672 8 7.20319748 0.79680252075195313 0.63489425707666669 +673 6 6.011775 0.011775016784667969 0.00013865102027921239 +674 5 5.35568476 0.35568475723266602 0.12651164652766056 +675 6 5.22133827 0.77866172790527344 0.60631408650442609 +676 6 5.413211 0.58678913116455078 0.34432148445284838 +677 7 6.71524572 0.28475427627563477 0.081084997857260532 +678 7 6.71524572 0.28475427627563477 0.081084997857260532 +679 7 6.71524572 0.28475427627563477 0.081084997857260532 +680 5 5.32334 0.32333993911743164 0.1045487162284644 +681 5 4.97009945 0.029900550842285156 0.00089404294067207957 +682 6 5.39260864 0.607391357421875 0.36892426107078791 +683 5 5.29420948 0.29420948028564453 0.086559218289949058 +684 5 5.5085063 0.50850629806518555 0.25857865517195933 +685 5 5.22983646 0.22983646392822266 0.052824800151029194 +686 7 5.97222853 1.0277714729309082 1.0563142005705686 +687 4 4.579601 0.57960081100463867 0.33593710011723488 +688 6 5.6276 0.37239980697631836 0.13868161623599917 +689 7 6.439974 0.56002616882324219 0.31362930976683856 +690 4 5.59999561 1.5999956130981445 2.5599859619333074 +691 6 5.26191568 0.73808431625366211 0.54476845789963591 +692 5 5.24829674 0.24829673767089844 0.061651269938010955 +693 5 5.16820669 0.16820669174194336 0.028293491146769156 +694 6 5.43879366 0.56120634078979492 0.31495255694267144 +695 5 5.37247038 0.37247037887573242 0.13873418313983166 +696 6 6.118032 0.11803197860717773 0.013931547973925262 +697 5 5.424995 0.42499494552612305 0.1806207037227523 +698 5 5.424995 0.42499494552612305 0.1806207037227523 +699 5 5.522417 0.52241706848144531 0.27291959344074712 +700 5 5.177611 0.17761087417602539 0.031545622625571923 +701 7 7.084567 0.084567070007324219 0.0071515893296236754 +702 4 4.96964169 0.96964168548583984 0.94020499823182035 +703 6 5.691428 0.30857181549072266 0.095216565315240587 +704 6 6.480943 0.48094320297241211 0.23130636448536279 +705 5 5.20250845 0.20250844955444336 0.041009672140944531 +706 5 5.320039 0.32003879547119141 0.10242483060665108 +707 6 6.23916864 0.23916864395141602 0.057201640249559205 +708 6 6.148995 0.14899492263793945 0.022199486971885563 +709 5 4.75704765 0.24295234680175781 0.0590258428164816 +710 5 5.37451839 0.37451839447021484 0.14026402779654745 +711 6 6.10724831 0.10724830627441406 0.011502199198730523 +712 6 6.10724831 0.10724830627441406 0.011502199198730523 +713 5 5.6087265 0.60872650146484375 0.37054795358562842 +714 6 6.025354 0.025353908538818359 0.00064282067819476651 +715 7 6.566482 0.4335179328918457 0.18793779813881883 +716 6 5.37237167 0.62762832641601563 0.39391731611976866 +717 5 5.390794 0.39079380035400391 0.15271979439512506 +718 7 6.566482 0.4335179328918457 0.18793779813881883 +719 7 6.615624 0.38437604904174805 0.1477449470769443 +720 5 5.196617 0.19661712646484375 0.038658294419292361 +721 5 5.14307642 0.14307641983032227 0.020470861911462634 +722 6 6.191565 0.19156503677368164 0.036697163314101999 +723 8 6.70217752 1.2978224754333496 1.6843431777399474 +724 7 5.99594545 1.0040545463562012 1.0081255320585569 +725 5 5.34394455 0.34394454956054688 0.11829785317240749 +726 7 6.90710545 0.092894554138183594 0.0086293981885319226 +727 5 5.340127 0.34012699127197266 0.11568637019172456 +728 5 6.005658 1.0056581497192383 1.0113483140967219 +729 5 5.0085516 0.0085515975952148438 7.3129821430484299E-05 +730 6 6.216481 0.21648120880126953 0.046864113764058857 +731 6 5.50056076 0.49943923950195313 0.24943955395428929 +732 7 6.1538806 0.84611940383911133 0.71591804555305316 +733 6 5.917358 0.082642078399658203 0.006829713122215253 +734 5 5.30464649 0.30464649200439453 0.092809485090583621 +735 6 5.54713726 0.45286273956298828 0.20508466088449495 +736 6 5.917358 0.082642078399658203 0.006829713122215253 +737 5 5.30464649 0.30464649200439453 0.092809485090583621 +738 7 6.35726547 0.64273452758789063 0.41310767295362893 +739 6 5.54713726 0.45286273956298828 0.20508466088449495 +740 3 3.93911076 0.93911075592041016 0.88192901188540418 +741 6 6.073226 0.073225975036621094 0.0053620434200638556 +742 6 6.25418758 0.25418758392333984 0.064611327820784936 +743 5 5.543552 0.54355192184448242 0.29544869174083033 +744 5 5.537819 0.53781890869140625 0.28924917854601517 +745 6 6.385117 0.3851170539855957 0.14831514527054424 +746 6 5.829892 0.17010784149169922 0.028936677736965066 +747 6 6.05567837 0.055678367614746094 0.0031000806202428066 +748 6 5.95539427 0.044605731964111328 0.001989671324054143 +749 6 6.11404753 0.11404752731323242 0.013006838486262495 +750 6 6.05567837 0.055678367614746094 0.0031000806202428066 +751 6 6.03684855 0.036848545074462891 0.0013578152741047234 +752 6 6.08775139 0.087751388549804688 0.0077003061924187932 +753 6 5.829892 0.17010784149169922 0.028936677736965066 +754 5 5.335464 0.3354640007019043 0.11253609576692725 +755 7 6.634498 0.36550188064575195 0.13359162475558151 +756 5 5.459274 0.4592738151550293 0.21093243728705602 +757 6 5.965418 0.034582138061523438 0.001195924272906268 +758 7 6.82623148 0.17376852035522461 0.030195498666444109 +759 7 6.87592745 0.12407255172729492 0.015393998092122274 +760 6 5.95539427 0.044605731964111328 0.001989671324054143 +761 6 5.779576 0.22042417526245117 0.048586817040131791 +762 5 5.325914 0.32591390609741211 0.10621987418767276 +763 6 5.965965 0.034035205841064453 0.0011583952366436279 +764 6 5.52306747 0.47693252563476563 0.22746463400835637 +765 6 5.928421 0.0715789794921875 0.0051235503051429987 +766 5 5.19307232 0.19307231903076172 0.037276920375916234 +767 6 5.473008 0.52699184417724609 0.27772040382933483 +768 7 6.3073473 0.69265270233154297 0.47976776604718907 +769 7 6.3073473 0.69265270233154297 0.47976776604718907 +770 7 6.366083 0.63391685485839844 0.40185057887356379 +771 7 6.00737333 0.99262666702270508 0.98530770008460422 +772 7 5.81501532 1.1849846839904785 1.4041887012920142 +773 5 5.39121532 0.39121532440185547 0.15304943004684901 +774 9 6.090269 2.9097309112548828 8.4665339759121707 +775 6 6.3398385 0.33983850479125977 0.11549020933875909 +776 6 6.049326 0.049325942993164063 0.0024330486521648709 +777 5 5.56175232 0.5617523193359375 0.3155656682793051 +778 7 6.200076 0.79992389678955078 0.63987824065497989 +779 8 7.166649 0.83335113525390625 0.69447411462897435 +780 4 4.306471 0.30647087097167969 0.093924394754139939 +781 6 5.39670324 0.60329675674438477 0.36396697669829337 +782 7 6.200076 0.79992389678955078 0.63987824065497989 +783 8 7.166649 0.83335113525390625 0.69447411462897435 +784 5 5.56175232 0.5617523193359375 0.3155656682793051 +785 6 5.8870883 0.11291170120239258 0.012749052268418382 +786 6 5.62655067 0.37344932556152344 0.13946439876235672 +787 6 5.62655067 0.37344932556152344 0.13946439876235672 +788 7 5.87119961 1.1288003921508789 1.274190325319978 +789 6 5.8870883 0.11291170120239258 0.012749052268418382 +790 6 5.62655067 0.37344932556152344 0.13946439876235672 +791 7 6.791107 0.208892822265625 0.043636211194097996 +792 5 5.34000731 0.34000730514526367 0.11560496755214444 +793 7 6.791107 0.208892822265625 0.043636211194097996 +794 5 5.328908 0.32890796661376953 0.10818045050200453 +795 5 5.189716 0.18971586227416992 0.03599210839843181 +796 6 5.31731224 0.68268775939941406 0.46606257683379226 +797 6 5.86112165 0.13887834548950195 0.019287194845901467 +798 6 5.7783494 0.22165060043334961 0.049128988672464402 +799 8 6.69024658 1.30975341796875 1.7154540158808231 +800 6 5.462918 0.53708219528198242 0.2884572844889135 +801 5 5.281977 0.28197717666625977 0.079511128160675071 +802 5 5.42389345 0.42389345169067383 0.17968565838623363 +803 7 5.8122654 1.1877346038818359 1.4107134892583417 +804 6 5.451923 0.54807710647583008 0.30038851464291838 +805 6 5.462918 0.53708219528198242 0.2884572844889135 +806 5 5.32510662 0.32510662078857422 0.1056943148805658 +807 6 5.34558773 0.65441226959228516 0.42825541859292571 +808 6 5.27500248 0.72499752044677734 0.52562140465397533 +809 6 5.34558773 0.65441226959228516 0.42825541859292571 +810 5 5.281977 0.28197717666625977 0.079511128160675071 +811 6 5.31018972 0.68981027603149414 0.47583821691864614 +812 7 5.168549 1.8314509391784668 3.3542125426176881 +813 6 5.58469772 0.41530227661132813 0.1724759809585521 +814 6 5.335502 0.66449785232543945 0.44155739574512154 +815 5 5.2698555 0.26985549926757813 0.072821990484953858 +816 5 5.22790766 0.22790765762329102 0.051941900403335239 +817 5 5.063816 0.063816070556640625 0.0040724908612901345 +818 5 5.2698555 0.26985549926757813 0.072821990484953858 +819 5 5.063816 0.063816070556640625 0.0040724908612901345 +820 9 7.47892332 1.5210766792297363 2.3136742640965622 +821 6 5.18003941 0.81996059417724609 0.67233537600350246 +822 5 5.799497 0.79949712753295898 0.63919565693345248 +823 6 5.812003 0.18799686431884766 0.035342820993719215 +824 5 5.22790766 0.22790765762329102 0.051941900403335239 +825 6 5.97561169 0.024388313293457031 0.00059478982529981295 +826 6 5.901674 0.098326206207275391 0.0096680428271156416 +827 9 6.82888842 2.1711115837097168 4.7137255089185146 +828 7 6.37836266 0.62163734436035156 0.38643298790339031 +829 7 6.119482 0.88051795959472656 0.77531187716886052 +830 6 5.980976 0.019023895263671875 0.0003619085910031572 +831 4 5.924944 1.9249439239501953 3.7054091103527753 +832 8 7.287973 0.71202707290649414 0.50698255255178992 +833 6 6.375841 0.37584114074707031 0.14125656307805912 +834 6 5.980976 0.019023895263671875 0.0003619085910031572 +835 8 6.824942 1.1750578880310059 1.3807610402238879 +836 8 6.996419 1.0035810470581055 1.0071749180142433 +837 8 6.996419 1.0035810470581055 1.0071749180142433 +838 8 6.996419 1.0035810470581055 1.0071749180142433 +839 7 6.26726866 0.73273134231567383 0.53689522001172918 +840 7 6.27416039 0.72583961486816406 0.52684314651196473 +841 7 6.315333 0.68466711044311523 0.46876905212252495 +842 7 6.315333 0.68466711044311523 0.46876905212252495 +843 7 6.216423 0.78357696533203125 0.6139928605989553 +844 8 6.64945936 1.3505406379699707 1.8239600148083355 +845 8 6.64945936 1.3505406379699707 1.8239600148083355 +846 5 5.850869 0.85086917877197266 0.72397835938409116 +847 5 5.22373867 0.22373867034912109 0.050058992609592678 +848 7 6.315333 0.68466711044311523 0.46876905212252495 +849 6 6.091377 0.091376781463623047 0.0083497161906507245 +850 7 6.216423 0.78357696533203125 0.6139928605989553 +851 5 5.26563931 0.26563930511474609 0.07056424042184517 +852 7 6.802008 0.19799184799194336 0.039200771871264806 +853 5 5.06763172 0.067631721496582031 0.004574049752591236 +854 7 6.802008 0.19799184799194336 0.039200771871264806 +855 7 6.67673635 0.32326364517211914 0.10449938428996575 +856 5 5.26563931 0.26563930511474609 0.07056424042184517 +857 5 5.278694 0.27869415283203125 0.077670430822763592 +858 7 6.01344061 0.98655939102172852 0.97329943201316382 +859 5 5.39770174 0.39770174026489258 0.15816667420972408 +860 8 6.41191339 1.5880866050720215 2.5220190652091787 +861 7 6.09758043 0.9024195671081543 0.8143610750996686 +862 6 5.68773556 0.31226444244384766 0.097509082014767046 +863 6 6.32151937 0.32151937484741211 0.1033747084022707 +864 5 5.586795 0.58679485321044922 0.34432819975427265 +865 6 6.401601 0.40160083770751953 0.16128323284738144 +866 7 6.802008 0.19799184799194336 0.039200771871264806 +867 8 6.85899353 1.1410064697265625 1.301895763957873 +868 7 6.32456255 0.67543745040893555 0.45621574941492327 +869 6 6.04672527 0.046725273132324219 0.0021832511492902995 +870 5 5.081021 0.081020832061767578 0.0065643752279811451 +871 5 5.06763172 0.067631721496582031 0.004574049752591236 +872 6 5.7612443 0.23875570297241211 0.057004285701850677 +873 3 4.103586 1.1035861968994141 1.2179024939869123 +874 5 5.22211456 0.22211456298828125 0.049334879091475159 +875 7 6.17575169 0.82424831390380859 0.67938528297327139 +876 9 7.38359642 1.6164035797119141 2.6127605325054901 +877 6 5.57609 0.42391014099121094 0.17969980763518834 +878 6 5.83978128 0.16021871566772461 0.025670036850215183 +879 8 7.260392 0.73960781097412109 0.54701971405393124 +880 7 6.17575169 0.82424831390380859 0.67938528297327139 +881 6 5.044123 0.95587682723999023 0.91370050885439014 +882 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +883 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +884 6 5.8775425 0.12245750427246094 0.014995840352639789 +885 7 6.52155638 0.47844362258911133 0.228908299996192 +886 6 5.89761448 0.10238552093505859 0.010482794897143322 +887 7 6.7517786 0.24822139739990234 0.061613862127160246 +888 6 5.89761448 0.10238552093505859 0.010482794897143322 +889 7 6.7517786 0.24822139739990234 0.061613862127160246 +890 6 5.35475159 0.6452484130859375 0.41634551458992064 +891 7 6.24612236 0.75387763977050781 0.56833149574595154 +892 5 5.746893 0.74689292907714844 0.55784904750544229 +893 7 6.4414587 0.55854129791259766 0.31196838147388917 +894 7 6.24612236 0.75387763977050781 0.56833149574595154 +895 6 6.04552126 0.045521259307861328 0.0020721850489735516 +896 6 6.043535 0.043535232543945313 0.001895316472655395 +897 6 5.37033558 0.62966442108154297 0.39647728317595465 +898 6 5.89646244 0.10353755950927734 0.010720026229137147 +899 6 6.043535 0.043535232543945313 0.001895316472655395 +900 7 6.437248 0.56275177001953125 0.31668955466011539 +901 6 5.793899 0.2061009407043457 0.042477597759216223 +902 5 5.28579044 0.28579044342041016 0.081676177550434659 +903 6 5.409873 0.59012699127197266 0.34824986582771089 +904 8 5.79865074 2.2013492584228516 4.8459385575588385 +905 4 4.89676857 0.89676856994628906 0.80419386804351234 +906 4 4.57636929 0.57636928558349609 0.33220155336402968 +907 8 6.83107567 1.1689243316650391 1.3663840931585582 +908 4 5.50111961 1.5011196136474609 2.2533600944771024 +909 5 5.838393 0.83839321136474609 0.70290317686249182 +910 5 5.26750469 0.26750469207763672 0.071558760283551237 +911 5 5.197639 0.19763898849487305 0.039061169773276561 +912 5 5.24751234 0.2475123405456543 0.061262358722387944 +913 5 4.95306063 0.046939373016357422 0.0022033047391687433 +914 4 4.5945096 0.59450960159301758 0.35344166638628849 +915 5 4.95306063 0.046939373016357422 0.0022033047391687433 +916 7 6.440396 0.55960416793823242 0.31315682477384144 +917 6 5.95007324 0.0499267578125 0.0024926811456680298 +918 6 6.325206 0.32520580291748047 0.10575881425120315 +919 7 5.990829 1.0091710090637207 1.0184261255346883 +920 7 6.069497 0.93050289154052734 0.86583563116528239 +921 6 5.535707 0.46429300308227539 0.21556799271115779 +922 6 5.535707 0.46429300308227539 0.21556799271115779 +923 6 5.70260572 0.2973942756652832 0.088443355198478457 +924 8 6.935463 1.0645370483398438 1.1332391272881068 +925 5 5.005663 0.0056629180908203125 3.2068641303339973E-05 +926 5 5.006425 0.0064249038696289063 4.1279389733972494E-05 +927 7 5.692542 1.3074579238891602 1.7094462227405529 +928 5 5.34776735 0.34776735305786133 0.12094213185287117 +929 5 5.56059361 0.56059360504150391 0.31426519001342967 +930 7 6.387425 0.61257505416870117 0.37524819698978717 +931 5 5.51956034 0.51956033706665039 0.26994294385281137 +932 6 5.69498348 0.30501651763916016 0.093035076032720099 +933 5 5.52175 0.52174997329711914 0.27222303463554454 +934 5 5.398334 0.39833402633666992 0.15866999653758285 +935 5 5.399966 0.39996576309204102 0.15997261164579868 +936 5 5.148321 0.14832115173339844 0.021999164051521802 +937 5 5.56059361 0.56059360504150391 0.31426519001342967 +938 6 5.893504 0.10649585723876953 0.011341367609020381 +939 7 5.759181 1.240818977355957 1.539631734566683 +940 5 5.41476154 0.41476154327392578 0.17202713777896861 +941 6 5.678872 0.32112789154052734 0.10312312272526469 +942 7 5.951344 1.0486559867858887 1.0996793786218859 +943 7 6.59410334 0.40589666366577148 0.16475210157500442 +944 7 5.97247076 1.027529239654541 1.0558163383450392 +945 7 6.28033543 0.71966457366943359 0.51791709859480761 +946 5 4.995405 0.0045948028564453125 2.1112213289598003E-05 +947 5 5.556999 0.55699920654296875 0.31024811608949676 +948 4 4.46932173 0.46932172775268555 0.22026288414076589 +949 5 5.3680234 0.36802339553833008 0.13544121966356215 +950 5 5.094201 0.094201087951660156 0.0088738449712764123 +951 6 5.8765893 0.12341070175170898 0.015230201306849267 +952 6 5.794643 0.20535707473754883 0.042171528144763215 +953 5 5.681073 0.68107318878173828 0.46386068847732531 +954 6 5.8765893 0.12341070175170898 0.015230201306849267 +955 5 5.094201 0.094201087951660156 0.0088738449712764123 +956 5 4.910827 0.089172840118408203 0.0079517954147831915 +957 7 6.410335 0.58966493606567383 0.3477047368253352 +958 7 6.40000057 0.59999942779541016 0.35999931335481961 +959 6 5.77616739 0.22383260726928711 0.050101036076966921 +960 6 5.77616739 0.22383260726928711 0.050101036076966921 +961 7 6.829785 0.17021512985229492 0.028973190430633622 +962 6 5.77616739 0.22383260726928711 0.050101036076966921 +963 6 6.27916765 0.27916765213012695 0.077934577995847576 +964 6 5.445577 0.55442285537719727 0.30738470256460459 +965 5 5.65728569 0.65728569030761719 0.43202447868316085 +966 6 5.425735 0.5742650032043457 0.32978029390528718 +967 6 5.847084 0.15291595458984375 0.023383289168123156 +968 7 6.935579 0.064421176910400391 0.0041500880345211044 +969 7 6.58235359 0.41764640808105469 0.17442852218300686 +970 7 6.57454634 0.42545366287231445 0.181010819251469 +971 7 6.667626 0.33237409591674805 0.11047253963647563 +972 6 5.847084 0.15291595458984375 0.023383289168123156 +973 7 6.935579 0.064421176910400391 0.0041500880345211044 +974 6 6.34301424 0.34301424026489258 0.11765876902450145 +975 5 5.274759 0.27475881576538086 0.075492406840794501 +976 6 6.03319836 0.033198356628417969 0.0011021308828276233 +977 5 5.74932528 0.74932527542114258 0.56148836838497118 +978 7 6.81341648 0.18658351898193359 0.034813409555681574 +979 5 5.48856926 0.48856925964355469 0.23869992146865116 +980 6 5.61005259 0.38994741439819336 0.15205898599583634 +981 7 6.81341648 0.18658351898193359 0.034813409555681574 +982 6 6.38202953 0.38202953338623047 0.14594656437930098 +983 6 6.28082752 0.28082752227783203 0.078864097268706246 +984 5 6.16001749 1.1600174903869629 1.3456405780036675 +985 6 5.89866829 0.10133171081542969 0.01026811561678187 +986 6 5.61840868 0.3815913200378418 0.1456119355282226 +987 6 5.59948635 0.40051364898681641 0.16041118302473478 +988 5 6.16001749 1.1600174903869629 1.3456405780036675 +989 7 6.30157232 0.69842767715454102 0.48780122021548777 +990 6 5.96048832 0.039511680603027344 0.0015611729040756472 +991 4 4.604853 0.60485315322875977 0.36584733697077354 +992 5 5.62472773 0.62472772598266602 0.39028473161147303 +993 4 4.80034733 0.80034732818603516 0.64055584573452506 +994 6 5.684209 0.31579113006591797 0.09972403782830952 +995 6 5.80417538 0.19582462310791016 0.03834728301535506 +996 5 4.886474 0.1135258674621582 0.012888122583035511 +997 6 5.55949831 0.44050168991088867 0.19404173881434872 +998 6 5.67601442 0.32398557662963867 0.10496665386403947 +999 7 6.07843542 0.92156457901000977 0.84928127328589653 +1000 7 5.663046 1.3369541168212891 1.787446310485393 +1001 5 5.360303 0.36030292510986328 0.12981819784272375 +1002 6 5.364488 0.63551187515258789 0.40387534345995846 +1003 7 5.83212233 1.1678776741027832 1.3639382616677267 +1004 6 6.53543663 0.53543663024902344 0.28669238501242944 +1005 6 6.39813471 0.39813470840454102 0.1585112460363689 +1006 6 6.53543663 0.53543663024902344 0.28669238501242944 +1007 5 5.15309 0.15309000015258789 0.02343654814671936 +1008 7 6.193991 0.80600881576538086 0.64965021109151166 +1009 6 5.99658966 0.00341033935546875 1.1630414519459009E-05 +1010 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1011 7 6.34206772 0.65793228149414063 0.4328748870320851 +1012 6 5.97693157 0.023068428039550781 0.0005321523722159327 +1013 5 5.46526432 0.46526432037353516 0.21647088781264756 +1014 5 5.52939034 0.52939033508300781 0.28025412687929929 +1015 5 5.2178936 0.21789360046386719 0.047477621123107383 +1016 5 5.223675 0.22367477416992188 0.05003040459996555 +1017 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1018 6 6.049116 0.049116134643554688 0.0024123946823237929 +1019 6 5.821385 0.17861509323120117 0.031903351529990687 +1020 7 6.07170248 0.92829751968383789 0.8617362850511654 +1021 7 6.07170248 0.92829751968383789 0.8617362850511654 +1022 8 7.050686 0.94931411743164063 0.90119729355501477 +1023 6 5.75873566 0.24126434326171875 0.058208483329508454 +1024 6 5.8799963 0.12000370025634766 0.014400888075215335 +1025 6 5.94306231 0.056937694549560547 0.0032419010606190568 +1026 6 6.319114 0.31911420822143555 0.10183387788879372 +1027 4 4.486199 0.48619890213012695 0.23638937243254077 +1028 7 6.42486572 0.57513427734375 0.33077943697571754 +1029 4 4.84544 0.84543991088867188 0.71476864292344544 +1030 6 5.735335 0.26466512680053711 0.070047629344344386 +1031 6 5.634032 0.36596822738647461 0.13393274345639838 +1032 6 5.66100645 0.33899354934692383 0.11491662649882528 +1033 6 5.66100645 0.33899354934692383 0.11491662649882528 +1034 3 4.125488 1.1254878044128418 1.2667227978820392 +1035 6 6.138177 0.13817691802978516 0.019092860676209966 +1036 5 5.83896446 0.83896446228027344 0.70386136896922835 +1037 5 4.90821743 0.091782569885253906 0.0084240401347415172 +1038 7 6.129409 0.87059116363525391 0.75792897419978544 +1039 5 5.80689764 0.80689764022827148 0.65108380180595304 +1040 4 4.708788 0.70878791809082031 0.5023803128315194 +1041 5 5.35757828 0.35757827758789063 0.12786222460272256 +1042 4 5.14486027 1.1448602676391602 1.3107050324188094 +1043 5 5.193105 0.19310522079467773 0.037289626298161238 +1044 7 5.90646 1.0935401916503906 1.1958301507547731 +1045 5 5.8116107 0.81161069869995117 0.65871192624422292 +1046 5 5.47202826 0.47202825546264648 0.22281067395510945 +1047 5 4.55644464 0.44355535507202148 0.19674135301306706 +1048 5 5.14154768 0.14154767990112305 0.020035745685390793 +1049 6 6.93397 0.93396997451782227 0.87229991330082157 +1050 5 5.74641466 0.7464146614074707 0.55713484676402913 +1051 6 5.719286 0.28071403503417969 0.078800369465170661 +1052 5 5.93918657 0.93918657302856445 0.88207141895713903 +1053 4 4.582541 0.58254098892211914 0.33935400377436054 +1054 5 4.55644464 0.44355535507202148 0.19674135301306706 +1055 5 5.63114262 0.63114261627197266 0.39834100207463052 +1056 6 5.77064943 0.22935056686401367 0.052601682520844406 +1057 5 5.126986 0.12698602676391602 0.016125450993285995 +1058 6 5.77064943 0.22935056686401367 0.052601682520844406 +1059 4 4.764793 0.76479291915893555 0.58490820919564612 +1060 7 6.389546 0.61045408248901367 0.37265418682750351 +1061 5 5.530722 0.53072214126586914 0.28166599122982916 +1062 5 4.86435127 0.13564872741699219 0.018400577249849448 +1063 5 5.185606 0.18560600280761719 0.034449588278221199 +1064 6 5.9687047 0.031295299530029297 0.00097939577267425193 +1065 5 5.57840729 0.57840728759765625 0.33455499034607783 +1066 6 5.432509 0.56749105453491211 0.32204609697714659 +1067 7 6.191147 0.8088531494140625 0.65424341731704772 +1068 7 6.02748346 0.97251653671264648 0.94578841417956028 +1069 6 6.485815 0.48581504821777344 0.23601626107483753 +1070 7 5.874095 1.1259050369262695 1.2676621521759444 +1071 5 5.57840729 0.57840728759765625 0.33455499034607783 +1072 7 6.143502 0.85649776458740234 0.73358842074321728 +1073 5 5.889502 0.88950204849243164 0.79121389427223221 +1074 6 5.229453 0.77054691314697266 0.59374254536032822 +1075 7 6.860558 0.13944196701049805 0.019444062163756826 +1076 6 5.789614 0.21038579940795898 0.044262184592525955 +1077 5 5.7062 0.70620012283325195 0.49871861348970015 +1078 5 5.34196043 0.34196043014526367 0.11693693578513376 +1079 6 5.595201 0.40479898452758789 0.16386221787456634 +1080 7 6.304265 0.69573497772216797 0.48404715922606556 +1081 6 5.60046434 0.3995356559753418 0.15962874039564667 +1082 6 5.60046434 0.3995356559753418 0.15962874039564667 +1083 6 6.12530851 0.12530851364135742 0.015702223591006259 +1084 7 6.0881176 0.91188240051269531 0.83152951236479566 +1085 5 4.941861 0.058138847351074219 0.0033801255713115097 +1086 8 7.36834431 0.63165569305419922 0.39898891456778074 +1087 8 6.271207 1.7287931442260742 2.9887257355230759 +1088 6 6.12530851 0.12530851364135742 0.015702223591006259 +1089 7 6.3522625 0.64773750305175781 0.41956387285972596 +1090 6 5.683116 0.31688404083251953 0.10041549533434591 +1091 6 6.12395525 0.12395524978637695 0.015364903949603104 +1092 6 5.620014 0.37998580932617188 0.14438921528926585 +1093 7 6.19363451 0.8063654899597168 0.65022530339797413 +1094 5 5.29982042 0.2998204231262207 0.089892286123586018 +1095 8 6.90607738 1.0939226150512695 1.196666687720608 +1096 6 5.973055 0.026945114135742188 0.00072603917578817345 +1097 7 6.0881176 0.91188240051269531 0.83152951236479566 +1098 6 6.02920532 0.029205322265625 0.00085295084863901138 +1099 7 7.05420256 0.054202556610107422 0.0029379171430718998 +1100 6 5.60046434 0.3995356559753418 0.15962874039564667 +1101 6 6.717598 0.71759796142578125 0.51494683424243703 +1102 5 6.292189 1.2921891212463379 1.6697527250673829 +1103 5 5.21190643 0.21190643310546875 0.044904336391482502 +1104 5 4.941861 0.058138847351074219 0.0033801255713115097 +1105 7 6.66590166 0.33409833908081055 0.11162170017655626 +1106 8 7.36834431 0.63165569305419922 0.39898891456778074 +1107 7 6.877219 0.12278079986572266 0.015075124815666641 +1108 7 6.55390263 0.44609737396240234 0.19900286705615144 +1109 4 4.86790562 0.86790561676025391 0.75326015960399673 +1110 7 6.877219 0.12278079986572266 0.015075124815666641 +1111 6 6.00191641 0.0019164085388183594 3.6726216876559192E-06 +1112 6 5.69383526 0.30616474151611328 0.093736848947628459 +1113 5 5.76925039 0.76925039291381836 0.59174616699806393 +1114 4 4.30118465 0.30118465423583984 0.0907121959471624 +1115 8 6.56404 1.4359598159790039 2.0619805931064548 +1116 5 4.86854839 0.13145160675048828 0.017279524917285016 +1117 5 5.349912 0.34991216659545898 0.12243852433152824 +1118 5 4.86854839 0.13145160675048828 0.017279524917285016 +1119 5 5.1008563 0.10085630416870117 0.010171994090569569 +1120 6 6.10804558 0.10804557800292969 0.011673846925987164 +1121 6 5.57668161 0.42331838607788086 0.1791984559915818 +1122 7 6.76281452 0.23718547821044922 0.056256951073919481 +1123 5 5.12697363 0.12697362899780273 0.016122302460871651 +1124 5 5.59565544 0.59565544128417969 0.35480540473145084 +1125 6 5.312439 0.68756103515625 0.47274017706513405 +1126 7 7.215483 0.21548318862915039 0.046433004581786008 +1127 7 6.62216425 0.37783575057983398 0.14275985441622652 +1128 5 5.652318 0.65231800079345703 0.42551877415917261 +1129 7 6.32973528 0.67026472091674805 0.44925479610560615 +1130 6 6.008838 0.0088381767272949219 7.8113367862897576E-05 +1131 6 5.69190931 0.3080906867980957 0.094919871291722302 +1132 5 5.54256248 0.54256248474121094 0.29437404984855675 +1133 5 5.666878 0.66687822341918945 0.44472656487073436 +1134 5 5.67285061 0.67285060882568359 0.45272794179709308 +1135 6 5.64160347 0.35839653015136719 0.12844807282453985 +1136 8 7.27833652 0.72166347503662109 0.52079817120193184 +1137 8 6.927531 1.0724692344665527 1.1501902588772737 +1138 5 5.07826948 0.078269481658935547 0.006126111759158448 +1139 5 5.83621359 0.83621358871459961 0.69925316595094955 +1140 6 5.928343 0.071657180786132813 0.0051347515582165215 +1141 5 4.850951 0.14904880523681641 0.02221554634252243 +1142 5 5.07826948 0.078269481658935547 0.006126111759158448 +1143 5 5.90772963 0.9077296257019043 0.82397307337691927 +1144 5 5.90772963 0.9077296257019043 0.82397307337691927 +1145 5 5.13637543 0.13637542724609375 0.01859825715655461 +1146 5 5.33813667 0.33813667297363281 0.1143364096096775 +1147 5 4.88847 0.11152982711791992 0.012438902336953106 +1148 6 6.21973848 0.21973848342895508 0.048285001099657165 +1149 5 5.244409 0.24440908432006836 0.059735800498174285 +1150 5 5.07894039 0.078940391540527344 0.006231585416571761 +1151 5 5.13637543 0.13637542724609375 0.01859825715655461 +1152 4 4.63385725 0.63385725021362305 0.40177501364837553 +1153 6 5.98369 0.016310214996337891 0.00026602311322676542 +1154 4 5.617376 1.6173758506774902 2.6159046423547352 +1155 4 5.803424 1.8034238815307617 3.2523376964754789 +1156 6 5.578991 0.42100906372070313 0.17724863173498306 +1157 6 5.578991 0.42100906372070313 0.17724863173498306 +1158 6 5.70412 0.29587984085083008 0.087544880221912535 +1159 6 5.578991 0.42100906372070313 0.17724863173498306 +1160 6 6.017941 0.017940998077392578 0.00032187941201300418 +1161 6 5.578991 0.42100906372070313 0.17724863173498306 +1162 7 6.018001 0.98199892044067383 0.96432187974664885 +1163 6 5.70412 0.29587984085083008 0.087544880221912535 +1164 6 5.45376539 0.5462346076965332 0.29837224664538553 +1165 5 6.16789961 1.1678996086120605 1.3639894957962042 +1166 5 4.949173 0.0508270263671875 0.0025833866093307734 +1167 6 5.63779 0.36220979690551758 0.13119593697433629 +1168 5 5.710626 0.71062612533569336 0.50498949000962057 +1169 6 6.017941 0.017940998077392578 0.00032187941201300418 +1170 6 5.43487358 0.56512641906738281 0.31936786952792318 +1171 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1172 6 5.81844044 0.18155956268310547 0.032963874801680504 +1173 5 6.03744555 1.0374455451965332 1.076293259248132 +1174 6 6.07708836 0.077088356018066406 0.0059426146335681551 +1175 5 5.48079157 0.48079156875610352 0.23116053258695501 +1176 7 5.870003 1.1299967765808105 1.2768927150830223 +1177 6 5.4681325 0.53186750411987305 0.28288304193870317 +1178 5 4.922261 0.077738761901855469 0.0060433151020333753 +1179 5 5.81053 0.81053018569946289 0.6569591819300058 +1180 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1181 6 5.45621252 0.54378747940063477 0.29570482275289578 +1182 5 6.03744555 1.0374455451965332 1.076293259248132 +1183 6 6.10228348 0.10228347778320313 0.010461909827427007 +1184 7 6.92237663 0.077623367309570313 0.0060253871524764691 +1185 5 5.2008605 0.20086050033569336 0.040344940595105072 +1186 5 5.0423584 0.0423583984375 0.0017942339181900024 +1187 8 6.55680561 1.4431943893432617 2.0828100454318701 +1188 6 5.83443451 0.16556549072265625 0.027411931718233973 +1189 5 4.74727535 0.25272464752197266 0.06386974746510532 +1190 6 5.81844044 0.18155956268310547 0.032963874801680504 +1191 7 6.47237968 0.52762031555175781 0.27838319738293649 +1192 6 5.84241 0.15758991241455078 0.024834580494825786 +1193 7 6.388489 0.61151123046875 0.37394598498940468 +1194 6 5.450869 0.54913091659545898 0.30154476356096893 +1195 6 5.95843744 0.041562557220458984 0.0017274461627039273 +1196 7 6.47237968 0.52762031555175781 0.27838319738293649 +1197 7 6.388489 0.61151123046875 0.37394598498940468 +1198 6 5.84241 0.15758991241455078 0.024834580494825786 +1199 7 6.247097 0.75290298461914063 0.5668629042484099 +1200 6 6.368082 0.36808204650878906 0.13548439296209835 +1201 7 6.383849 0.61615085601806641 0.379641877371796 +1202 5 5.37665272 0.37665271759033203 0.14186726966818242 +1203 6 5.49147367 0.50852632522583008 0.2585990234476867 +1204 6 5.49147367 0.50852632522583008 0.2585990234476867 +1205 5 4.820721 0.17927885055541992 0.03214090625647259 +1206 6 5.5144763 0.48552370071411133 0.23573326395512595 +1207 5 5.37665272 0.37665271759033203 0.14186726966818242 +1208 6 6.214216 0.21421623229980469 0.045888594180723885 +1209 6 6.27291727 0.27291727066040039 0.074483836624722244 +1210 6 5.206366 0.79363393783569336 0.62985482728458919 +1211 5 5.30671549 0.30671548843383789 0.094074390845207745 +1212 6 5.91659546 0.083404541015625 0.0069563174620270729 +1213 6 5.49147367 0.50852632522583008 0.2585990234476867 +1214 6 5.434932 0.56506776809692383 0.31930158254203889 +1215 5 5.5278945 0.52789449691772461 0.27867259987601756 +1216 8 6.689088 1.3109121322631836 1.7184906185148066 +1217 5 4.755091 0.24490880966186523 0.059980325049991734 +1218 8 6.63341141 1.3665885925292969 1.8675643812312046 +1219 8 6.689088 1.3109121322631836 1.7184906185148066 +1220 6 5.60927534 0.39072465896606445 0.15266575912414737 +1221 7 6.98346758 0.016532421112060547 0.00027332094782650529 +1222 6 5.45542 0.54457998275756836 0.29656735762023345 +1223 5 5.5278945 0.52789449691772461 0.27867259987601756 +1224 7 6.87969351 0.12030649185180664 0.014473651981688818 +1225 6 6.18620157 0.18620157241821289 0.03467102557101498 +1226 7 6.87969351 0.12030649185180664 0.014473651981688818 +1227 5 6.072542 1.0725421905517578 1.1503467505135632 +1228 6 5.84670973 0.1532902717590332 0.023497907415958252 +1229 3 5.12617159 2.1261715888977051 4.5206056254357918 +1230 6 5.860294 0.13970613479614258 0.01951780409967796 +1231 7 6.78599644 0.21400356292724609 0.045797524945555779 +1232 7 6.88765144 0.11234855651855469 0.012622198151802877 +1233 6 6.57666636 0.57666635513305664 0.3325440851424446 +1234 6 6.01195574 0.011955738067626953 0.00014293967274170427 +1235 5 5.51621962 0.5162196159362793 0.2664826918773997 +1236 6 6.18620157 0.18620157241821289 0.03467102557101498 +1237 5 6.120411 1.1204109191894531 1.2553206278389553 +1238 7 6.923103 0.076897144317626953 0.0059131708042059472 +1239 5 5.1333437 0.13334369659423828 0.017780541421416274 +1240 6 5.67478561 0.32521438598632813 0.10576439685246442 +1241 7 6.386693 0.61330699920654297 0.3761454752757345 +1242 7 6.761541 0.23845911026000977 0.056862747265995495 +1243 7 6.923103 0.076897144317626953 0.0059131708042059472 +1244 5 5.49561262 0.49561262130737305 0.24563187039916556 +1245 4 4.910776 0.91077613830566406 0.82951317410697811 +1246 7 5.8812623 1.1187376976013184 1.2515740360342988 +1247 6 5.924655 0.075345039367675781 0.0056768749573166133 +1248 7 6.13088036 0.86911964416503906 0.75536895587356412 +1249 5 5.003289 0.0032892227172851563 1.0818986083904747E-05 +1250 7 6.48895645 0.51104354858398438 0.2611655085493112 +1251 5 5.63452435 0.63452434539794922 0.40262114490269596 +1252 6 5.67069244 0.32930755615234375 0.10844346653902903 +1253 7 6.81721258 0.18278741836547852 0.033411240312716473 +1254 5 5.828939 0.82893896102905273 0.68713980111192541 +1255 6 5.722976 0.2770237922668457 0.076742181481904481 +1256 6 5.81828737 0.18171262741088867 0.033019478960568449 +1257 6 5.969221 0.030778884887695313 0.00094733975492999889 +1258 6 5.33740044 0.66259956359863281 0.43903818168109865 +1259 6 5.84787655 0.15212345123291016 0.023141544415011595 +1260 6 5.859397 0.14060306549072266 0.019769222025388444 +1261 6 5.74161673 0.25838327407836914 0.066761916323457626 +1262 6 5.81828737 0.18171262741088867 0.033019478960568449 +1263 6 5.32097244 0.67902755737304688 0.46107842367200647 +1264 5 5.465101 0.46510076522827148 0.21631872181592371 +1265 7 6.204722 0.79527807235717773 0.63246721237214842 +1266 8 6.60801363 1.3919863700866699 1.9376260545070636 +1267 7 6.50023127 0.49976873397827148 0.24976878746224429 +1268 5 5.397177 0.39717721939086914 0.1577497436030626 +1269 6 5.59714651 0.40285348892211914 0.16229093353672397 +1270 7 6.50023127 0.49976873397827148 0.24976878746224429 +1271 5 5.15302753 0.15302753448486328 0.023417426310516021 +1272 5 5.176312 0.17631196975708008 0.03108591067962152 +1273 5 5.15302753 0.15302753448486328 0.023417426310516021 +1274 6 5.59714651 0.40285348892211914 0.16229093353672397 +1275 6 5.59203053 0.40796947479248047 0.16643909236245236 +1276 7 6.50023127 0.49976873397827148 0.24976878746224429 +1277 5 5.397177 0.39717721939086914 0.1577497436030626 +1278 6 5.566156 0.43384408950805664 0.18822069400107466 +1279 6 5.934077 0.065923213958740234 0.0043458701386498433 +1280 6 6.38662767 0.3866276741027832 0.14948095838212794 +1281 7 6.501193 0.49880695343017578 0.24880837679029355 +1282 5 4.947265 0.052734851837158203 0.0027809645982870279 +1283 8 7.58158 0.41841983795166016 0.17507516079149354 +1284 7 6.501193 0.49880695343017578 0.24880837679029355 +1285 6 6.38662767 0.3866276741027832 0.14948095838212794 +1286 7 6.139841 0.86015892028808594 0.73987336815116578 +1287 7 6.50392437 0.49607563018798828 0.24609103086640971 +1288 7 6.72525024 0.274749755859375 0.075487428344786167 +1289 6 6.28108 0.28107976913452148 0.079005836616715897 +1290 6 5.80168343 0.19831657409667969 0.039329463561443845 +1291 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1292 6 6.130666 0.13066577911376953 0.01707354583140841 +1293 4 4.788151 0.78815078735351563 0.62118166360596661 +1294 4 4.788151 0.78815078735351563 0.62118166360596661 +1295 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1296 6 6.36224365 0.36224365234375 0.13122046366333961 +1297 7 6.582107 0.4178929328918457 0.17463450336094866 +1298 6 6.55059576 0.55059576034545898 0.3031556913103941 +1299 5 5.97331524 0.97331523895263672 0.94734255437742831 +1300 6 5.93681765 0.063182353973388672 0.0039920098536185833 +1301 5 5.99956369 0.99956369400024414 0.9991275783634137 +1302 6 5.753585 0.24641513824462891 0.060720420356119575 +1303 6 6.10364437 0.10364437103271484 0.01074215564676706 +1304 5 4.612831 0.38716888427734375 0.1498997449525632 +1305 7 5.955537 1.0444631576538086 1.0909032876961646 +1306 8 6.829604 1.1703958511352539 1.3698264483546154 +1307 5 4.941627 0.058372974395751953 0.0034074041398071131 +1308 6 5.64012241 0.35987758636474609 0.12951187716771528 +1309 6 5.221883 0.77811717987060547 0.60546634560978418 +1310 6 5.45807457 0.54192543029785156 0.29368317200351157 +1311 6 5.909332 0.090668201446533203 0.0082207227535491256 +1312 5 5.35318565 0.35318565368652344 0.12474010596997687 +1313 5 4.43518734 0.56481266021728516 0.31901334114172641 +1314 6 5.36058331 0.63941669464111328 0.40885370938576671 +1315 6 5.82610559 0.17389440536499023 0.030239264217243544 +1316 6 5.933774 0.066226005554199219 0.0043858838116648258 +1317 5 5.721077 0.72107696533203125 0.5199519899324514 +1318 6 6.0769105 0.076910495758056641 0.0059152243577500485 +1319 5 5.427906 0.42790603637695313 0.18310357596783433 +1320 6 5.612823 0.3871769905090332 0.14990602197963199 +1321 6 6.429845 0.42984485626220703 0.18476660045507742 +1322 6 5.86295748 0.13704252243041992 0.018780652954092147 +1323 5 5.48062134 0.480621337890625 0.23099687043577433 +1324 6 5.85815763 0.14184236526489258 0.020119256583939205 +1325 7 6.76510859 0.23489141464233398 0.055173976672676872 +1326 6 5.478635 0.52136516571044922 0.27182163601628417 +1327 6 5.77933025 0.22066974639892578 0.048695136975766218 +1328 6 6.24729967 0.2472996711730957 0.061157127362321262 +1329 5 5.54726648 0.54726648330688477 0.29950060375108478 +1330 5 5.39347935 0.39347934722900391 0.15482599669576302 +1331 6 6.08679676 0.086796760559082031 0.0075336776435506181 +1332 7 6.21610069 0.78389930725097656 0.61449812390856096 +1333 8 7.01025534 0.98974466323852539 0.97959449840914203 +1334 6 5.852407 0.14759302139282227 0.021783699963862091 +1335 6 5.72382832 0.27617168426513672 0.076270799189842364 +1336 8 6.596054 1.4039459228515625 1.9710641542915255 +1337 5 5.49725866 0.49725866317749023 0.24726617810506468 +1338 5 5.49725866 0.49725866317749023 0.24726617810506468 +1339 6 5.488146 0.51185417175292969 0.26199469314087764 +1340 6 5.59975767 0.40024232864379883 0.16019392163821067 +1341 5 5.11727953 0.1172795295715332 0.013754488056520131 +1342 6 5.488146 0.51185417175292969 0.26199469314087764 +1343 6 5.54852057 0.45147943496704102 0.20383368019815862 +1344 8 6.80502939 1.1949706077575684 1.4279547534044923 +1345 8 7.36150551 0.63849449157714844 0.40767521577436128 +1346 7 6.67498064 0.32501935958862305 0.10563758410739865 +1347 7 6.64853954 0.35146045684814453 0.12352445272790646 +1348 8 6.596054 1.4039459228515625 1.9710641542915255 +1349 4 4.20987129 0.20987129211425781 0.044045959253708133 +1350 7 6.88175058 0.11824941635131836 0.013982924467427438 +1351 7 6.931576 0.068424224853515625 0.0046818745468044654 +1352 6 5.72382832 0.27617168426513672 0.076270799189842364 +1353 5 5.49725866 0.49725866317749023 0.24726617810506468 +1354 5 5.646412 0.64641189575195313 0.41784833896963391 +1355 5 5.556504 0.5565037727355957 0.30969644906895155 +1356 6 5.781893 0.21810722351074219 0.04757076094756485 +1357 6 5.502844 0.49715614318847656 0.24716423071004101 +1358 8 6.61071873 1.3892812728881836 1.9301024551978117 +1359 7 6.328941 0.67105913162231445 0.45032035813369475 +1360 6 6.152078 0.15207815170288086 0.023127764225364444 +1361 7 6.2568655 0.74313449859619141 0.55224888300381281 +1362 7 6.257044 0.74295616149902344 0.551983857909363 +1363 4 5.13123131 1.1312313079833984 1.2796842721618304 +1364 5 5.556504 0.5565037727355957 0.30969644906895155 +1365 7 6.42597771 0.57402229309082031 0.32950159296524362 +1366 6 6.17942142 0.17942142486572266 0.03219204770084616 +1367 5 5.251204 0.25120401382446289 0.063103456561520943 +1368 6 5.781893 0.21810722351074219 0.04757076094756485 +1369 5 4.914902 0.085097789764404297 0.0072416338227867527 +1370 6 5.61482573 0.38517427444458008 0.14835922169390869 +1371 7 6.18855333 0.8114466667175293 0.65844569292698907 +1372 6 5.690512 0.30948781967163086 0.095782710525099901 +1373 6 5.690512 0.30948781967163086 0.095782710525099901 +1374 7 6.57598352 0.42401647567749023 0.17978997164595967 +1375 7 6.474106 0.5258941650390625 0.27656467282213271 +1376 6 5.44045067 0.55954933166503906 0.31309545456679189 +1377 6 5.42730761 0.5726923942565918 0.32797657843934758 +1378 7 6.15234852 0.84765148162841797 0.71851303430685221 +1379 6 4.94880867 1.0511913299560547 1.105003212174779 +1380 7 6.84760427 0.15239572525024414 0.0232244570745479 +1381 7 7.003771 0.0037708282470703125 1.4219145668903366E-05 +1382 6 5.2290206 0.77097940444946289 0.59440924208524848 +1383 6 5.473995 0.52600479125976563 0.27668104042822961 +1384 6 5.33457041 0.66542959213256836 0.44279654208571628 +1385 5 5.29342842 0.29342842102050781 0.086100238262588391 +1386 7 6.966072 0.03392791748046875 0.001151103584561497 +1387 6 6.410287 0.41028690338134766 0.16833534308625531 +1388 7 6.245387 0.75461292266845703 0.56944066305823071 +1389 6 5.70716763 0.29283237457275391 0.085750799597917648 +1390 6 5.880706 0.11929416656494141 0.014231098176423984 +1391 6 6.2913146 0.29131460189819336 0.084864197279102882 +1392 6 6.410287 0.41028690338134766 0.16833534308625531 +1393 6 5.585095 0.41490507125854492 0.17214621815605824 +1394 7 6.966072 0.03392791748046875 0.001151103584561497 +1395 7 6.48753452 0.51246547698974609 0.26262086510632798 +1396 7 6.245387 0.75461292266845703 0.56944066305823071 +1397 7 6.31858444 0.68141555786132813 0.46432716249546502 +1398 7 6.31858444 0.68141555786132813 0.46432716249546502 +1399 6 6.270913 0.27091312408447266 0.073393920801208878 +1400 7 6.31858444 0.68141555786132813 0.46432716249546502 +1401 6 5.119604 0.88039588928222656 0.77509692186504253 +1402 8 6.57125139 1.428748607635498 2.0413225838203743 +1403 8 6.820425 1.1795749664306641 1.3913971014299022 +1404 5 5.219756 0.21975612640380859 0.048292755092006701 +1405 4 4.77159548 0.77159547805786133 0.59535958175933956 +1406 8 6.147219 1.852780818939209 3.4327967630290459 +1407 6 6.19692135 0.19692134857177734 0.038778017523327435 +1408 7 6.31858444 0.68141555786132813 0.46432716249546502 +1409 6 6.006806 0.0068058967590332031 4.6320230694618658E-05 +1410 6 6.78585 0.78585004806518555 0.61756029804405443 +1411 6 6.270913 0.27091312408447266 0.073393920801208878 +1412 8 6.838521 1.1614789962768555 1.3490334587922916 +1413 6 5.712056 0.28794384002685547 0.082911655009411334 +1414 6 6.27111959 0.27111959457397461 0.073505834561956362 +1415 5 4.7982645 0.20173549652099609 0.040697210556572827 +1416 6 5.83465528 0.1653447151184082 0.027338874817587566 +1417 3 3.94480681 0.94480681419372559 0.8926599161468971 +1418 5 5.14915037 0.14915037155151367 0.022245833333954579 +1419 7 5.99877644 1.0012235641479492 1.0024486254051226 +1420 4 4.949227 0.94922685623168945 0.90103162459149644 +1421 6 6.25533533 0.25533533096313477 0.065196131238053567 +1422 5 5.661264 0.66126394271850586 0.4372700019396234 +1423 4 4.768664 0.76866388320922852 0.5908441653502905 +1424 6 5.712056 0.28794384002685547 0.082911655009411334 +1425 6 5.82935858 0.17064142227172852 0.029118494994918365 +1426 6 6.34480238 0.3448023796081543 0.11888868098344574 +1427 5 5.729822 0.72982215881347656 0.53264038349516341 +1428 7 6.32088757 0.67911243438720703 0.46119369853931858 +1429 5 5.381057 0.38105678558349609 0.14520427383922652 +1430 4 4.68381166 0.68381166458129883 0.46759839261744673 +1431 5 5.381057 0.38105678558349609 0.14520427383922652 +1432 7 6.46803951 0.53196048736572266 0.28298196011837717 +1433 6 6.136118 0.13611793518066406 0.018528092277847463 +1434 5 5.729822 0.72982215881347656 0.53264038349516341 +1435 5 5.611653 0.61165285110473633 0.37411921026455275 +1436 5 4.68876076 0.31123924255371094 0.096869866105407709 +1437 7 6.32088757 0.67911243438720703 0.46119369853931858 +1438 5 5.26315546 0.26315546035766602 0.06925079631605513 +1439 5 5.47552 0.47552013397216797 0.22611939781290857 +1440 5 5.3382206 0.33822059631347656 0.11439317177064368 +1441 5 5.190989 0.19098901748657227 0.036476804800486207 +1442 5 5.26568127 0.26568126678466797 0.070586535520305915 +1443 6 6.41662264 0.41662263870239258 0.17357442307934434 +1444 6 6.25118971 0.2511897087097168 0.063096269761672374 +1445 6 6.20891047 0.20891046524047852 0.043643582486993182 +1446 6 6.29368258 0.29368257522583008 0.086249454991275343 +1447 6 5.892337 0.10766315460205078 0.011591354858865088 +1448 6 5.892337 0.10766315460205078 0.011591354858865088 +1449 6 6.1661396 0.16613960266113281 0.027602367572399089 +1450 6 6.25118971 0.2511897087097168 0.063096269761672374 +1451 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1452 6 6.25118971 0.2511897087097168 0.063096269761672374 +1453 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1454 5 5.479026 0.47902584075927734 0.22946575611513254 +1455 5 5.074789 0.074789047241210938 0.0055934015872480813 +1456 6 6.29368258 0.29368257522583008 0.086249454991275343 +1457 6 6.20891047 0.20891046524047852 0.043643582486993182 +1458 6 6.450489 0.45048904418945313 0.20294037893472705 +1459 6 6.16096926 0.16096925735473633 0.025911101813335335 +1460 6 6.26689243 0.26689243316650391 0.071231570881536754 +1461 6 6.07949543 0.079495429992675781 0.0063195233897204162 +1462 6 5.892337 0.10766315460205078 0.011591354858865088 +1463 6 5.363495 0.636505126953125 0.40513877663761377 +1464 8 7.07665825 0.92334175109863281 0.85255998932188959 +1465 5 5.519054 0.51905393600463867 0.26941698848190754 +1466 6 6.1661396 0.16613960266113281 0.027602367572399089 +1467 7 6.628117 0.37188291549682617 0.13829690283841956 +1468 5 5.396044 0.39604377746582031 0.1568506736693962 +1469 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1470 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1471 6 6.25118971 0.2511897087097168 0.063096269761672374 +1472 5 4.971684 0.028316020965576172 0.00080179704332294932 +1473 6 6.13895845 0.13895845413208008 0.019309451974777403 +1474 4 4.94047976 0.94047975540161133 0.88450217032027467 +1475 6 5.83468962 0.16531038284301758 0.02732752267570504 +1476 5 5.194277 0.19427680969238281 0.037743478784250328 +1477 6 4.945969 1.0540308952331543 1.1109811281060047 +1478 6 5.97336531 0.026634693145751953 0.00070940687896836607 +1479 6 5.95833 0.041669845581054688 0.0017363760307489429 +1480 6 5.83468962 0.16531038284301758 0.02732752267570504 +1481 6 5.83350468 0.16649532318115234 0.027720692641196365 +1482 6 5.766513 0.23348712921142578 0.054516239507393038 +1483 4 4.94047976 0.94047975540161133 0.88450217032027467 +1484 3 4.470957 1.4709568023681641 2.1637139144331741 +1485 6 5.71909666 0.28090333938598633 0.078906686078198618 +1486 6 5.822368 0.17763185501098633 0.031553075914644069 +1487 6 5.281767 0.71823310852050781 0.51585879817503155 +1488 6 5.49806166 0.5019383430480957 0.2519421002218678 +1489 5 5.55353355 0.55353355407714844 0.30639939548927941 +1490 6 6.164951 0.16495084762573242 0.027208782132447595 +1491 5 5.153073 0.15307283401489258 0.023431292513350854 +1492 5 5.51080036 0.51080036163330078 0.26091700944471086 +1493 8 7.14790726 0.85209274291992188 0.72606204253679607 +1494 8 6.94167757 1.0583224296569824 1.1200463651150585 +1495 7 6.684428 0.31557178497314453 0.099585551471136569 +1496 5 4.59208965 0.40791034698486328 0.16639085117731156 +1497 7 6.43388653 0.56611347198486328 0.32048446316275658 +1498 6 6.206013 0.20601320266723633 0.042441439673211789 +1499 6 6.377341 0.37734079360961914 0.14238607452193719 +1500 7 6.473521 0.52647876739501953 0.27717989251777908 +1501 5 5.64289665 0.64289665222167969 0.41331610543784336 +1502 5 5.318365 0.31836509704589844 0.10135633501704433 +1503 7 6.770466 0.22953414916992188 0.052685925635159947 +1504 8 6.64272928 1.3572707176208496 1.8421838009110161 +1505 7 6.01323271 0.98676729202270508 0.97370968860582252 +1506 6 5.81762934 0.18237066268920898 0.033259058609701242 +1507 6 5.59561062 0.40438938140869141 0.16353077179610409 +1508 6 5.72143364 0.27856636047363281 0.077599217187525937 +1509 5 5.64345741 0.64345741271972656 0.41403744198396453 +1510 5 5.424362 0.4243621826171875 0.18008326203562319 +1511 6 5.81927538 0.1807246208190918 0.032661388570204508 +1512 7 6.42719269 0.57280731201171875 0.32810821669409052 +1513 6 6.5397687 0.53976869583129883 0.29135024499942119 +1514 7 6.473521 0.52647876739501953 0.27717989251777908 +1515 6 6.226191 0.22619104385375977 0.051162388319653473 +1516 6 6.13849163 0.13849163055419922 0.019179931733560807 +1517 6 5.995002 0.0049982070922851563 2.4982074137369636E-05 +1518 6 6.13184547 0.13184547424316406 0.017383229078404838 +1519 5 5.64289665 0.64289665222167969 0.41331610543784336 +1520 6 5.77483654 0.22516345977783203 0.050698583619123383 +1521 5 5.318365 0.31836509704589844 0.10135633501704433 +1522 5 5.813046 0.81304597854614258 0.66104376323005454 +1523 6 5.70439 0.29560995101928711 0.087385243141625324 +1524 6 5.45256138 0.54743862152099609 0.29968904433280841 +1525 5 5.168963 0.16896295547485352 0.028548480322797332 +1526 6 6.030308 0.030307769775390625 0.0009185609087580815 +1527 6 6.06596 0.065959930419921875 0.0043507124210009351 +1528 6 5.98619127 0.013808727264404297 0.00019068094866270258 +1529 6 5.45256138 0.54743862152099609 0.29968904433280841 +1530 5 5.168963 0.16896295547485352 0.028548480322797332 +1531 7 6.09255266 0.90744733810424805 0.82346067143248547 +1532 7 6.17497635 0.82502365112304688 0.68066402491240297 +1533 6 6.188314 0.18831396102905273 0.035462147918451592 +1534 6 5.93772459 0.062275409698486328 0.003878226653114325 +1535 6 5.900267 0.099732875823974609 0.0099466465201203391 +1536 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1537 6 5.703288 0.29671192169189453 0.088037964474096952 +1538 6 5.74273157 0.25726842880249023 0.066187044458501987 +1539 6 6.188314 0.18831396102905273 0.035462147918451592 +1540 6 5.93772459 0.062275409698486328 0.003878226653114325 +1541 4 4.76091242 0.76091241836547852 0.57898770842280101 +1542 6 6.11882639 0.11882638931274414 0.014119710797103835 +1543 6 6.29636 0.29636001586914063 0.087829259005957283 +1544 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1545 6 6.044429 0.044428825378417969 0.0019739205245059566 +1546 6 5.64528561 0.35471439361572266 0.12582230103816983 +1547 6 5.64528561 0.35471439361572266 0.12582230103816983 +1548 6 6.87292671 0.87292671203613281 0.76200104458621354 +1549 6 5.900267 0.099732875823974609 0.0099466465201203391 +1550 6 6.021991 0.021990776062011719 0.00048359423180954764 +1551 6 6.07919264 0.079192638397216797 0.0062714739763123362 +1552 7 7.06551027 0.065510272979736328 0.0042915958658795716 +1553 7 6.482196 0.51780414581298828 0.26812113342111843 +1554 7 6.27147055 0.72852945327758789 0.53075516429294112 +1555 7 6.7877593 0.21224069595336914 0.045046113018770484 +1556 6 5.75313663 0.24686336517333984 0.060941521064705739 +1557 6 6.021991 0.021990776062011719 0.00048359423180954764 +1558 4 4.91349363 0.91349363327026367 0.83447061802530698 +1559 4 4.4660306 0.46603059768676758 0.21718451798028582 +1560 6 6.359429 0.35942888259887695 0.12918912164627727 +1561 5 4.71328 0.28671979904174805 0.082208243162540384 +1562 7 6.898671 0.10132884979248047 0.010267535800267069 +1563 6 6.359429 0.35942888259887695 0.12918912164627727 +1564 5 4.71328 0.28671979904174805 0.082208243162540384 +1565 6 5.96442747 0.035572528839111328 0.0012654048080094071 +1566 5 5.83771753 0.83771753311157227 0.70177066528253818 +1567 5 5.50233173 0.50233173370361328 0.25233717068567785 +1568 6 5.516011 0.48398876190185547 0.23424512164729094 +1569 5 5.306023 0.30602312088012695 0.093650150513212793 +1570 5 5.480161 0.48016119003295898 0.23055476841386735 +1571 6 5.516011 0.48398876190185547 0.23424512164729094 +1572 6 5.753487 0.24651288986206055 0.060768604868144394 +1573 5 5.619523 0.61952304840087891 0.38380880749991775 +1574 4 5.28259468 1.2825946807861328 1.6450491151808819 +1575 6 5.87912941 0.12087059020996094 0.014609699577704305 +1576 6 5.57926 0.42074012756347656 0.17702225494213053 +1577 4 4.433939 0.43393898010253906 0.18830303845243179 +1578 5 5.368031 0.36803102493286133 0.1354468353131324 +1579 4 5.156767 1.1567668914794922 1.3381096412231273 +1580 5 4.508023 0.49197721481323242 0.24204157989538544 +1581 6 5.6025157 0.39748430252075195 0.15799377075040866 +1582 7 6.667178 0.33282184600830078 0.11077038118037308 +1583 5 5.368031 0.36803102493286133 0.1354468353131324 +1584 6 5.357087 0.64291286468505859 0.41333695157754846 +1585 5 5.135726 0.13572597503662109 0.018421540299641492 +1586 5 4.884364 0.11563587188720703 0.013371654867114557 +1587 6 5.357087 0.64291286468505859 0.41333695157754846 +1588 5 5.135726 0.13572597503662109 0.018421540299641492 +1589 6 6.05095768 0.050957679748535156 0.00259668512535427 +1590 6 6.273106 0.27310609817504883 0.074586940860399409 +1591 6 6.14363956 0.14363956451416016 0.020632324493817578 +1592 6 5.825356 0.17464399337768555 0.030500524422905073 +1593 6 5.8224 0.17759990692138672 0.031541726938485226 +1594 6 5.46713 0.53286981582641602 0.28395024061887852 +1595 6 5.4586587 0.54134130477905273 0.29305040825988726 +1596 5 5.47208929 0.47208929061889648 0.2228682983170529 +1597 6 5.4586587 0.54134130477905273 0.29305040825988726 +1598 6 5.762172 0.23782777786254883 0.05656205192303787 +1599 6 5.875584 0.12441587448120117 0.015479309822922005 +1600 6 5.46713 0.53286981582641602 0.28395024061887852 +1601 6 5.634498 0.36550188064575195 0.13359162475558151 +1602 5 6.442401 1.4424009323120117 2.0805204495345606 +1603 7 6.492261 0.50773906707763672 0.25779896023686888 +1604 5 5.0516305 0.051630496978759766 0.0026657082182737213 +1605 9 7.458617 1.5413827896118164 2.3758609041115051 +1606 6 6.246019 0.24601888656616211 0.060525292547254139 +1607 7 6.15459061 0.84540939331054688 0.71471704229770694 +1608 5 5.464145 0.46414518356323242 0.21543075142494672 +1609 7 6.011046 0.98895406723022461 0.97803014709120362 +1610 6 6.246019 0.24601888656616211 0.060525292547254139 +1611 6 5.587227 0.41277313232421875 0.170381658768747 +1612 7 6.48129845 0.51870155334472656 0.26905130144223222 +1613 7 6.61206961 0.38793039321899414 0.15048998998304342 +1614 5 5.850582 0.85058212280273438 0.7234899476316059 +1615 6 6.102702 0.10270214080810547 0.010547729726567923 +1616 6 5.51687765 0.48312234878540039 0.23340720389592207 +1617 6 5.571805 0.42819499969482422 0.18335095776365051 +1618 6 5.28217125 0.71782875061035156 0.5152781152028183 +1619 8 7.13240433 0.86759567260742188 0.75272225112712476 +1620 7 6.48129845 0.51870155334472656 0.26905130144223222 +1621 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1622 6 5.239296 0.76070404052734375 0.57867063727462664 +1623 6 5.86622047 0.13377952575683594 0.01789696151172393 +1624 7 6.18613243 0.81386756896972656 0.66238041982069262 +1625 6 5.87100458 0.12899541854858398 0.016639818006524365 +1626 6 5.90693 0.093070030212402344 0.0086620305237374851 +1627 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1628 6 5.890122 0.1098780632019043 0.012073188773001675 +1629 6 5.977284 0.022716045379638672 0.00051601871768980345 +1630 5 5.31199455 0.31199455261230469 0.097340600859752158 +1631 6 5.890122 0.1098780632019043 0.012073188773001675 +1632 8 7.1502 0.84980010986328125 0.72216022672364488 +1633 7 6.04704762 0.95295238494873047 0.90811824797947338 +1634 6 5.547635 0.45236492156982422 0.20463402226687322 +1635 6 5.52456141 0.47543859481811523 0.22604185744262395 +1636 5 5.148717 0.14871692657470703 0.022116724249826802 +1637 6 6.15984631 0.15984630584716797 0.025550841492986365 +1638 5 5.09744549 0.097445487976074219 0.0094956231268952251 +1639 5 5.942503 0.94250297546386719 0.88831185875824303 +1640 5 5.148717 0.14871692657470703 0.022116724249826802 +1641 6 5.82682943 0.17317056655883789 0.029988045122308904 +1642 7 6.504058 0.49594211578369141 0.24595858220800437 +1643 7 5.77661276 1.2233872413635254 1.4966763423310567 +1644 7 6.504058 0.49594211578369141 0.24595858220800437 +1645 7 6.223316 0.77668380737304688 0.60323773663549218 +1646 6 5.82682943 0.17317056655883789 0.029988045122308904 +1647 7 6.27178574 0.72821426391601563 0.53029601417074446 +1648 5 5.7562747 0.75627470016479492 0.57195142210935046 +1649 4 4.85746956 0.85746955871582031 0.73525404412430362 +1650 7 6.80729961 0.19270038604736328 0.037133438782802841 +1651 6 5.34201 0.6579899787902832 0.43295081218843734 +1652 4 5.75338364 1.7533836364746094 3.0743541766569251 +1653 6 5.71115732 0.28884267807006836 0.083430092674689149 +1654 5 5.11912 0.11912012100219727 0.014189603227578118 +1655 5 5.338051 0.33805084228515625 0.11427837196970358 +1656 5 5.51299047 0.51299047470092773 0.26315922713388318 +1657 6 6.112662 0.11266183853149414 0.012692689861296458 +1658 5 5.144843 0.14484310150146484 0.020979524052563647 +1659 5 5.225776 0.22577619552612305 0.050974890466250145 +1660 6 5.27949429 0.72050571441650391 0.51912848450683668 +1661 6 5.528939 0.47106122970581055 0.22189868213195041 +1662 7 6.071942 0.92805814743041992 0.86129192501198304 +1663 6 5.71115732 0.28884267807006836 0.083430092674689149 +1664 4 5.10081768 1.1008176803588867 1.2117995653907201 +1665 8 7.05892038 0.94107961654663086 0.88563084467955377 +1666 5 4.735589 0.26441097259521484 0.069913162428747455 +1667 6 5.98559475 0.014405250549316406 0.00020751124338858062 +1668 7 6.120982 0.87901782989501953 0.77267234527334949 +1669 6 5.108951 0.89104890823364258 0.79396815686436639 +1670 6 5.488634 0.51136589050292969 0.26149507396985427 +1671 7 6.510288 0.48971223831176758 0.23981807635232144 +1672 5 5.421067 0.42106723785400391 0.1772976187940003 +1673 5 5.347374 0.34737396240234375 0.12066866975510493 +1674 6 5.980884 0.019115924835205078 0.00036541858230521029 +1675 5 5.338103 0.33810281753540039 0.11431351522537625 +1676 7 6.510288 0.48971223831176758 0.23981807635232144 +1677 6 5.90175 0.098249912261962891 0.009653045259483406 +1678 6 5.911432 0.088568210601806641 0.0078443279292059742 +1679 5 5.21312141 0.21312141418457031 0.045420737184031168 +1680 5 5.163654 0.16365385055541992 0.026782582801615717 +1681 6 5.914402 0.085597991943359375 0.0073270162247354165 +1682 7 6.543379 0.45662117004394531 0.20850289293230162 +1683 7 6.543379 0.45662117004394531 0.20850289293230162 +1684 7 6.06433344 0.93566656112670898 0.87547191361068144 +1685 7 6.543379 0.45662117004394531 0.20850289293230162 +1686 5 5.931283 0.93128299713134766 0.86728802074594569 +1687 7 6.06433344 0.93566656112670898 0.87547191361068144 +1688 3 3.90431213 0.9043121337890625 0.81778043531812727 +1689 6 6.370762 0.37076187133789063 0.13746436523797456 +1690 4 4.496808 0.49680805206298828 0.24681824059462087 +1691 7 6.543379 0.45662117004394531 0.20850289293230162 +1692 6 6.363645 0.36364507675170898 0.13223774184575632 +1693 5 5.39188766 0.39188766479492188 0.15357594181841705 +1694 6 5.71193361 0.28806638717651367 0.08298224342092908 +1695 6 6.55674648 0.55674648284912109 0.30996664616486669 +1696 6 5.720357 0.27964305877685547 0.078200240322075842 +1697 6 6.25116253 0.25116252899169922 0.063082615969506151 +1698 6 6.363645 0.36364507675170898 0.13223774184575632 +1699 6 6.13921261 0.13921260833740234 0.019380150320102985 +1700 6 5.93687057 0.063129425048828125 0.0039853243069956079 +1701 5 5.58175659 0.581756591796875 0.33844073209911585 +1702 4 4.31816 0.31816005706787109 0.10122582191343099 +1703 5 5.335852 0.33585214614868164 0.11279666407267541 +1704 5 5.335852 0.33585214614868164 0.11279666407267541 +1705 6 6.527788 0.52778816223144531 0.27856034419164644 +1706 6 5.994899 0.0051012039184570313 2.602228141768137E-05 +1707 5 5.3597784 0.35977840423583984 0.12944050015448738 +1708 4 4.58082151 0.58082151412963867 0.33735363127584606 +1709 5 5.794777 0.79477691650390625 0.63167034700745717 +1710 5 5.04373169 0.043731689453125 0.0019124606624245644 +1711 5 6.12955952 1.1295595169067383 1.275904702234584 +1712 6 5.66090155 0.33909845352172852 0.11498776118082787 +1713 6 5.46919 0.53080987930297852 0.28175912796564262 +1714 5 5.35511971 0.35511970520019531 0.12611000502147363 +1715 8 7.17331171 0.82668828964233398 0.68341352823176749 +1716 6 6.184057 0.18405723571777344 0.033877066020068014 +1717 6 5.552837 0.44716310501098633 0.19995484248306639 +1718 4 5.24975443 1.2497544288635254 1.5618861324639965 +1719 6 5.822894 0.17710590362548828 0.031366501099000743 +1720 7 6.265804 0.73419618606567383 0.53904403963338154 +1721 7 6.404914 0.59508609771728516 0.35412746369638626 +1722 6 6.21475172 0.2147517204284668 0.046118301426986363 +1723 8 7.17331171 0.82668828964233398 0.68341352823176749 +1724 6 6.31798267 0.31798267364501953 0.101112980738435 +1725 6 5.670131 0.32986879348754883 0.10881342091693114 +1726 6 6.60087347 0.60087347030639648 0.36104892731805194 +1727 6 6.0132947 0.013294696807861328 0.00017674896321295819 +1728 5 5.35511971 0.35511970520019531 0.12611000502147363 +1729 6 6.34329748 0.34329748153686523 0.11785316082955433 +1730 6 5.882648 0.11735200881958008 0.0137714939739908 +1731 6 5.65552044 0.34447956085205078 0.11866616784482176 +1732 5 5.520096 0.5200958251953125 0.27049966738559306 +1733 6 5.768575 0.23142480850219727 0.053557441990278676 +1734 6 5.80637026 0.19362974166870117 0.037492476858687951 +1735 6 6.50981569 0.50981569290161133 0.25991204072875007 +1736 5 5.328799 0.32879877090454102 0.10810863174833685 +1737 6 5.80637026 0.19362974166870117 0.037492476858687951 +1738 5 5.449398 0.44939804077148438 0.20195859904924873 +1739 4 4.25049448 0.25049448013305664 0.062747484577130308 +1740 6 5.324389 0.67561101913452148 0.45645024917598676 +1741 6 6.68758 0.68758010864257813 0.47276640580093954 +1742 6 5.503512 0.49648809432983398 0.24650042781127013 +1743 6 5.656073 0.34392690658569336 0.11828571707360425 +1744 5 5.665838 0.66583776473999023 0.44333992895394658 +1745 5 5.11254168 0.11254167556762695 0.012665628739569001 +1746 5 5.823897 0.82389688491821289 0.67880607697793494 +1747 6 5.656073 0.34392690658569336 0.11828571707360425 +1748 5 5.62416 0.62415981292724609 0.38957547207337484 +1749 6 5.776405 0.22359514236450195 0.049994787689001896 +1750 6 6.177006 0.17700576782226563 0.031331041842349805 +1751 7 6.46401453 0.53598546981811523 0.28728042385614572 +1752 6 5.49817276 0.50182723999023438 0.25183057879621629 +1753 7 6.345841 0.6541590690612793 0.42792408763511958 +1754 6 6.470667 0.47066688537597656 0.22152731698952266 +1755 6 5.503512 0.49648809432983398 0.24650042781127013 +1756 5 5.198939 0.19893884658813477 0.039576664681817419 +1757 5 5.099308 0.099308013916015625 0.009862081627943553 +1758 5 5.145771 0.14577102661132813 0.021249192199320532 +1759 5 4.837293 0.16270685195922852 0.026473519674482304 +1760 6 5.61023664 0.38976335525512695 0.1519154730997343 +1761 6 5.76614141 0.23385858535766602 0.054689837945488762 +1762 7 6.44400644 0.55599355697631836 0.30912883539917857 +1763 6 5.63683 0.36317014694213867 0.13189255562997459 +1764 5 5.198939 0.19893884658813477 0.039576664681817419 +1765 5 5.099308 0.099308013916015625 0.009862081627943553 +1766 5 5.14904 0.14904022216796875 0.022212987823877484 +1767 5 5.0502 0.050199985504150391 0.0025200385446169093 +1768 5 5.199506 0.19950580596923828 0.039802566615435353 +1769 7 6.637015 0.36298513412475586 0.131758207595567 +1770 6 5.911365 0.088634967803955078 0.0078561575176081533 +1771 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1772 6 5.90241241 0.09758758544921875 0.0095233368338085711 +1773 6 5.911365 0.088634967803955078 0.0078561575176081533 +1774 6 6.102439 0.10243892669677734 0.010493733702787722 +1775 6 6.09364557 0.093645572662353516 0.0087694932792601321 +1776 5 5.3519 0.35190010070800781 0.12383368087830604 +1777 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1778 8 7.2947197 0.70528030395507813 0.49742030714696739 +1779 8 7.2947197 0.70528030395507813 0.49742030714696739 +1780 5 5.846626 0.84662580490112305 0.71677525352447446 +1781 4 4.88433266 0.88433265686035156 0.7820442479896883 +1782 6 6.15452433 0.15452432632446289 0.023877767426029095 +1783 6 5.11111975 0.88888025283813477 0.79010810388558639 +1784 7 6.66374445 0.33625555038452148 0.11306779516439747 +1785 6 6.15452433 0.15452432632446289 0.023877767426029095 +1786 7 6.39855957 0.6014404296875 0.36173059046268463 +1787 7 6.86035776 0.13964223861694336 0.019499954805951347 +1788 5 6.093183 1.0931830406188965 1.1950491602967759 +1789 7 6.359563 0.64043712615966797 0.41015971256365447 +1790 5 5.47426462 0.47426462173461914 0.22492693142908138 +1791 5 5.364561 0.36456108093261719 0.13290478173075826 +1792 6 5.68573856 0.31426143646240234 0.098760250447412545 +1793 5 5.028987 0.028986930847167969 0.00084024215993849793 +1794 5 5.18260241 0.1826024055480957 0.033343638511951212 +1795 6 5.328547 0.67145299911499023 0.45084913002051508 +1796 5 6.180702 1.1807022094726563 1.3940577074536122 +1797 8 6.97266769 1.0273323059082031 1.0554116667626658 +1798 6 5.629581 0.37041902542114258 0.13721025439394907 +1799 6 5.702408 0.2975921630859375 0.088561095530167222 +1800 6 5.259844 0.74015617370605469 0.5478311614751874 +1801 5 5.11915636 0.1191563606262207 0.014198238277685959 +1802 6 5.629581 0.37041902542114258 0.13721025439394907 +1803 6 5.702408 0.2975921630859375 0.088561095530167222 +1804 6 5.259844 0.74015617370605469 0.5478311614751874 +1805 5 5.27370834 0.27370834350585938 0.074916257304721512 +1806 5 4.864911 0.13508892059326172 0.01824901646705257 +1807 6 6.16377926 0.16377925872802734 0.026823645589502121 +1808 5 5.27370834 0.27370834350585938 0.074916257304721512 +1809 6 6.16377926 0.16377925872802734 0.026823645589502121 +1810 6 5.287707 0.71229314804077148 0.5073615287458324 +1811 5 4.864911 0.13508892059326172 0.01824901646705257 +1812 6 6.20445538 0.20445537567138672 0.041802000640927872 +1813 6 5.9327035 0.067296504974365234 0.0045288195817647647 +1814 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1815 6 5.82937336 0.17062664031982422 0.029113450386830664 +1816 7 6.872754 0.12724590301513672 0.01619151983413758 +1817 4 4.45179462 0.45179462432861328 0.2041183825722328 +1818 6 6.37151432 0.37151432037353516 0.13802289024260972 +1819 6 6.391697 0.39169692993164063 0.15342648491787259 +1820 6 5.82937336 0.17062664031982422 0.029113450386830664 +1821 5 5.9026103 0.90261030197143555 0.81470535722496606 +1822 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1823 6 5.900709 0.099290847778320313 0.0098586724525375757 +1824 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1825 5 5.258325 0.25832509994506836 0.066731857261629557 +1826 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1827 6 5.900709 0.099290847778320313 0.0098586724525375757 +1828 6 5.753486 0.24651384353637695 0.060769075055077337 +1829 7 6.53176165 0.46823835372924805 0.21924715590307642 +1830 7 6.53176165 0.46823835372924805 0.21924715590307642 +1831 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1832 7 6.53176165 0.46823835372924805 0.21924715590307642 +1833 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1834 6 5.84620237 0.15379762649536133 0.023653709915606669 +1835 5 4.988597 0.011403083801269531 0.00013003032017877558 +1836 6 5.77450943 0.22549057006835938 0.050845997189753689 +1837 7 6.83298 0.16701984405517578 0.027895628308215237 +1838 6 5.66736031 0.33263969421386719 0.11064916616669507 +1839 6 5.77450943 0.22549057006835938 0.050845997189753689 +1840 5 6.134337 1.1343369483947754 1.2867203124935713 +1841 7 6.83298 0.16701984405517578 0.027895628308215237 +1842 6 5.98937035 0.010629653930664063 0.00011298954268568195 +1843 6 6.24796629 0.24796628952026367 0.061487280738447225 +1844 6 6.495384 0.49538421630859375 0.2454055217676796 +1845 5 5.18946362 0.18946361541748047 0.035896461567062943 +1846 5 5.40275526 0.4027552604675293 0.16221179983426737 +1847 5 5.18946362 0.18946361541748047 0.035896461567062943 +1848 5 5.044584 0.044583797454833984 0.0019877149954936613 +1849 6 5.91228 0.087719917297363281 0.0076947838906562538 +1850 7 5.84083033 1.1591696739196777 1.343674332935052 +1851 6 6.495384 0.49538421630859375 0.2454055217676796 +1852 7 6.6136837 0.38631629943847656 0.14924028321183869 +1853 5 5.151337 0.1513371467590332 0.022902931989165154 +1854 7 6.0943203 0.90567970275878906 0.82025572398924851 +1855 6 6.14251947 0.14251947402954102 0.020311800477657016 +1856 4 4.103467 0.10346698760986328 0.010705417525059602 +1857 5 4.735547 0.26445293426513672 0.069935354441440722 +1858 5 5.031725 0.031724929809570313 0.001006471171422163 +1859 6 6.14251947 0.14251947402954102 0.020311800477657016 +1860 6 6.02827644 0.028276443481445313 0.0007995572559593711 +1861 6 6.257553 0.2575531005859375 0.066333599621430039 +1862 7 6.827227 0.17277288436889648 0.029850469573148075 +1863 5 5.36154 0.36153984069824219 0.13071105641211034 +1864 6 6.25475264 0.25475263595581055 0.064898905526433737 +1865 6 5.23789167 0.76210832595825195 0.58080910049488921 +1866 6 5.73634434 0.26365566253662109 0.069514308387624624 +1867 6 6.45096254 0.45096254348754883 0.20336721562875937 +1868 7 6.6029706 0.39702939987182617 0.15763234436258244 +1869 7 5.99931145 1.0006885528564453 1.0013775798179267 +1870 6 6.02254629 0.022546291351318359 0.00050833525369853305 +1871 6 5.893417 0.1065831184387207 0.011359961136122365 +1872 5 5.104985 0.10498523712158203 0.011021900013474806 +1873 5 5.104985 0.10498523712158203 0.011021900013474806 +1874 5 5.75805473 0.75805473327636719 0.5746469786427042 +1875 5 5.14179373 0.14179372787475586 0.020105461264620317 +1876 6 5.905395 0.094604969024658203 0.0089501001641565381 +1877 6 5.79698658 0.20301342010498047 0.041214448742721288 +1878 6 5.723346 0.27665376663208008 0.076537306591717424 +1879 6 5.858292 0.1417078971862793 0.020081128124957104 +1880 5 5.428381 0.42838096618652344 0.18351025219089934 +1881 6 5.858292 0.1417078971862793 0.020081128124957104 +1882 5 5.428381 0.42838096618652344 0.18351025219089934 +1883 5 5.428381 0.42838096618652344 0.18351025219089934 +1884 5 6.015564 1.01556396484375 1.0313701666891575 +1885 6 5.858292 0.1417078971862793 0.020081128124957104 +1886 5 4.56712961 0.43287038803100586 0.18737677283411358 +1887 5 5.531196 0.53119611740112305 0.2821693151420277 +1888 5 5.54939 0.54938983917236328 0.30182919538583519 +1889 5 5.69010973 0.6901097297668457 0.4762514391188688 +1890 5 5.428381 0.42838096618652344 0.18351025219089934 +1891 5 5.475229 0.47522878646850586 0.22584239948832874 +1892 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1893 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1894 5 5.24567556 0.24567556381225586 0.060356482654469801 +1895 6 5.76433468 0.23566532135009766 0.055538143687044794 +1896 6 5.19419336 0.80580663681030273 0.64932433592753114 +1897 6 5.19419336 0.80580663681030273 0.64932433592753114 +1898 6 5.39263535 0.60736465454101563 0.36889182358572725 +1899 7 6.988717 0.011282920837402344 0.00012730430262308801 +1900 6 5.82769728 0.1723027229309082 0.02968822832940532 +1901 5 5.609328 0.60932779312133789 0.37128035947011995 +1902 6 5.70890331 0.29109668731689453 0.084737281366869865 +1903 5 5.44353 0.44353008270263672 0.19671893426220777 +1904 6 5.76433468 0.23566532135009766 0.055538143687044794 +1905 6 5.19419336 0.80580663681030273 0.64932433592753114 +1906 5 5.531166 0.53116607666015625 0.28213740099454299 +1907 7 6.67684364 0.32315635681152344 0.10443003094769665 +1908 7 6.82135153 0.17864847183227539 0.031915276488007294 +1909 5 5.497734 0.49773406982421875 0.24773920426378027 +1910 5 5.55095959 0.55095958709716797 0.30355646661428182 +1911 6 5.8620677 0.13793230056762695 0.019025319539878183 +1912 6 5.89195061 0.10804939270019531 0.01167467126288102 +1913 6 5.496035 0.50396490097045898 0.25398062141016453 +1914 6 6.51767254 0.51767253875732422 0.26798485738345335 +1915 7 6.82135153 0.17864847183227539 0.031915276488007294 +1916 5 5.55095959 0.55095958709716797 0.30355646661428182 +1917 6 5.8620677 0.13793230056762695 0.019025319539878183 +1918 6 5.76833 0.23166990280151367 0.053670943864062792 +1919 6 5.7990675 0.20093250274658203 0.040373870660005196 +1920 7 5.64435625 1.3556437492370605 1.8377699748455143 +1921 5 5.497734 0.49773406982421875 0.24773920426378027 +1922 5 5.60842752 0.60842752456665039 0.37018405265030196 +1923 5 4.886931 0.11306905746459961 0.012784611755932929 +1924 4 4.732981 0.73298120498657227 0.53726144686356747 +1925 6 5.821547 0.17845296859741211 0.031845462001228952 +1926 6 5.763718 0.2362818717956543 0.055829122939258014 +1927 5 5.778531 0.77853107452392578 0.60611063399937848 +1928 6 5.96423244 0.035767555236816406 0.0012793180076187127 +1929 5 5.5253 0.52530002593994141 0.27594011725250311 +1930 6 5.64313173 0.35686826705932617 0.12735496003392655 +1931 3 3.42147088 0.42147088050842285 0.17763770311654525 +1932 6 5.02350473 0.97649526596069336 0.95354300444364526 +1933 5 5.01699162 0.016991615295410156 0.00028871499034721637 +1934 6 5.91134 0.088659763336181641 0.0078605536348277383 +1935 5 5.5253 0.52530002593994141 0.27594011725250311 +1936 6 5.64313173 0.35686826705932617 0.12735496003392655 +1937 7 6.497361 0.50263881683349609 0.25264578018777684 +1938 5 5.77335072 0.77335071563720703 0.59807132937658025 +1939 5 5.323697 0.32369709014892578 0.10477980617088178 +1940 5 4.944163 0.055837154388427734 0.0031177878101971146 +1941 5 5.323697 0.32369709014892578 0.10477980617088178 +1942 5 4.944163 0.055837154388427734 0.0031177878101971146 +1943 5 5.497555 0.49755477905273438 0.24756075815821532 +1944 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1945 6 5.75811338 0.24188661575317383 0.058509134880523561 +1946 6 5.32988358 0.67011642456054688 0.44905602246581111 +1947 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1948 7 6.17266 0.82734012603759766 0.68449168415190798 +1949 5 5.2683053 0.26830530166625977 0.071987734902222655 +1950 5 5.237333 0.23733282089233398 0.056326867872712683 +1951 4 4.32389355 0.32389354705810547 0.10490702982588118 +1952 7 6.74338341 0.25661659240722656 0.065852075498696649 +1953 6 6.021135 0.021134853363037109 0.00044668202667708101 +1954 5 5.237333 0.23733282089233398 0.056326867872712683 +1955 5 5.424599 0.42459917068481445 0.1802844557462322 +1956 5 5.31968 0.31968021392822266 0.1021954391771942 +1957 6 5.79171038 0.20828962326049805 0.043384567158000209 +1958 6 5.584745 0.41525506973266602 0.17243677293868132 +1959 5 5.1785655 0.17856550216674805 0.031885638564062901 +1960 5 5.1785655 0.17856550216674805 0.031885638564062901 +1961 5 4.79571152 0.20428848266601563 0.041733784149982966 +1962 5 5.284309 0.28430891036987305 0.080831556515704506 +1963 6 5.584745 0.41525506973266602 0.17243677293868132 +1964 5 5.307627 0.30762720108032227 0.094634494844513029 +1965 6 5.294085 0.70591497421264648 0.49831595081764135 +1966 6 5.606551 0.39344882965087891 0.15480198155364633 +1967 7 5.817037 1.1829628944396973 1.3994012096211463 +1968 6 6.12541676 0.12541675567626953 0.015729362604361086 +1969 7 6.792339 0.20766115188598633 0.043123154002614683 +1970 6 5.87826252 0.12173748016357422 0.014820014076576626 +1971 7 6.792339 0.20766115188598633 0.043123154002614683 +1972 5 5.54269075 0.54269075393676758 0.29451325440845721 +1973 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1974 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1975 6 5.394777 0.60522317886352539 0.36629509623367085 +1976 5 5.1809783 0.18097829818725586 0.032753144414755297 +1977 6 5.852116 0.14788389205932617 0.021869645530614434 +1978 6 5.504246 0.49575376510620117 0.24577179561697449 +1979 6 5.38840532 0.61159467697143555 0.37404804889979459 +1980 8 7.70184755 0.29815244674682617 0.088894881501119016 +1981 8 7.70184755 0.29815244674682617 0.088894881501119016 +1982 8 7.70184755 0.29815244674682617 0.088894881501119016 +1983 8 7.70184755 0.29815244674682617 0.088894881501119016 +1984 8 7.70184755 0.29815244674682617 0.088894881501119016 +1985 6 5.962447 0.037552833557128906 0.0014102153081694269 +1986 6 5.814902 0.18509817123413086 0.034261332994219629 +1987 5 5.80614376 0.80614376068115234 0.64986776288515102 +1988 6 5.95589161 0.044108390808105469 0.001945550139680563 +1989 7 6.713367 0.28663301467895508 0.082158485103946077 +1990 4 4.43185854 0.43185853958129883 0.18650179820929225 +1991 8 7.70184755 0.29815244674682617 0.088894881501119016 +1992 5 5.683112 0.68311214447021484 0.46664220192269568 +1993 6 5.74645329 0.25354671478271484 0.06428593657710735 +1994 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1995 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1996 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1997 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1998 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1999 6 6.65917635 0.65917634963989258 0.43451345992457391 +2000 5 5.15526772 0.15526771545410156 0.024108063462335849 +2001 5 5.116252 0.11625194549560547 0.013514514831513225 +2002 6 6.24034739 0.24034738540649414 0.057766865671737833 +2003 6 5.74645329 0.25354671478271484 0.06428593657710735 +2004 6 5.97547865 0.024521350860595703 0.00060129664802843763 +2005 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +2006 6 6.05903625 0.0590362548828125 0.0034852793905884027 +2007 6 6.035142 0.035141944885253906 0.0012349562903182232 +2008 5 5.388008 0.38800811767578125 0.15055029938230291 +2009 7 6.72901726 0.27098274230957031 0.073431646629614988 +2010 6 6.07737875 0.077378749847412109 0.0059874709279483795 +2011 5 5.388008 0.38800811767578125 0.15055029938230291 +2012 5 5.91862154 0.91862154006958008 0.84386553387980712 +2013 6 5.776343 0.22365713119506836 0.05002251233440802 +2014 5 5.092607 0.092607021331787109 0.0085760603999460727 +2015 6 6.126408 0.12640810012817383 0.01597900777801442 +2016 7 6.912972 0.087028026580810547 0.0075738774105502671 +2017 5 5.092607 0.092607021331787109 0.0085760603999460727 +2018 7 6.232492 0.76750802993774414 0.58906857601891716 +2019 6 5.776343 0.22365713119506836 0.05002251233440802 +2020 6 6.10125542 0.10125541687011719 0.010252659445541212 +2021 6 5.754315 0.24568510055541992 0.060361168634926798 +2022 6 5.4808135 0.51918649673461914 0.26955461839156669 +2023 6 5.754315 0.24568510055541992 0.060361168634926798 +2024 5 4.96590948 0.034090518951416016 0.0011621634823768545 +2025 5 5.17452765 0.17452764511108398 0.030459898908020477 +2026 5 5.023958 0.023958206176757813 0.0005739956432080362 +2027 5 5.157997 0.15799713134765625 0.024963093514088541 +2028 6 5.89450932 0.10549068450927734 0.011128284518235887 +2029 6 5.4808135 0.51918649673461914 0.26955461839156669 +2030 6 5.95882463 0.041175365447998047 0.0016954107197761914 +2031 5 5.872901 0.87290096282958984 0.76195609090882499 +2032 6 5.861079 0.13892078399658203 0.019298984226225002 +2033 5 5.812295 0.81229496002197266 0.65982310207709816 +2034 5 5.461388 0.46138811111450195 0.212878989077808 +2035 5 5.35088253 0.35088253021240234 0.12311855000825744 +2036 6 5.8191 0.18090009689331055 0.032724845056009144 +2037 5 5.872901 0.87290096282958984 0.76195609090882499 +2038 5 5.41155052 0.41155052185058594 0.16937383203548961 +2039 5 4.945262 0.054738044738769531 0.0029962535418235348 +2040 6 5.609648 0.39035177230834961 0.15237450614426962 +2041 5 5.41155052 0.41155052185058594 0.16937383203548961 +2042 6 5.48308659 0.51691341400146484 0.26719947757464979 +2043 6 6.14729 0.14729022979736328 0.021694411793760082 +2044 6 5.79861736 0.20138263702392578 0.040554966494710243 +2045 5 4.945262 0.054738044738769531 0.0029962535418235348 +2046 5 5.277068 0.27706813812255859 0.076766753162701207 +2047 5 5.24007225 0.24007225036621094 0.057634685395896668 +2048 5 5.30321026 0.30321025848388672 0.091936460849865398 +2049 7 5.9215703 1.0784296989440918 1.1630106155646445 +2050 3 4.432997 1.4329972267150879 2.053481051773133 +2051 5 5.28876 0.28876018524169922 0.083382444580820447 +2052 5 5.28876 0.28876018524169922 0.083382444580820447 +2053 5 5.65129566 0.65129566192626953 0.42418603924397758 +2054 5 5.65129566 0.65129566192626953 0.42418603924397758 +2055 6 5.98419333 0.015806674957275391 0.00024985097320495697 +2056 5 5.28876 0.28876018524169922 0.083382444580820447 +2057 7 6.820425 0.17957496643066406 0.032247168568574125 +2058 5 5.500557 0.50055694580078125 0.25055725598940626 +2059 5 5.399121 0.39912080764770508 0.1592974190973564 +2060 5 5.51282835 0.51282835006713867 0.26299291663258373 +2061 6 5.91880846 0.081191539764404297 0.0065920661293148441 +2062 5 6.137123 1.1371231079101563 1.2930489625432529 +2063 5 5.53835773 0.53835773468017578 0.28982905048997054 +2064 6 5.8279 0.17210006713867188 0.029618433109135367 +2065 5 5.457421 0.45742082595825195 0.20923381202032942 +2066 5 5.50936365 0.50936365127563477 0.25945132924084646 +2067 5 5.50936365 0.50936365127563477 0.25945132924084646 +2068 6 6.24757767 0.24757766723632813 0.061294701314182021 +2069 7 6.39426327 0.60573673248291016 0.36691698907907266 +2070 6 5.37203646 0.62796354293823242 0.39433821125953727 +2071 6 6.07056141 0.070561408996582031 0.0049789124395829276 +2072 5 5.673299 0.67329883575439453 0.45333132222822314 +2073 5 5.340492 0.34049177169799805 0.11593464659404162 +2074 6 5.8279 0.17210006713867188 0.029618433109135367 +2075 5 5.53835773 0.53835773468017578 0.28982905048997054 +2076 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2077 6 5.62602234 0.3739776611328125 0.13985929102636874 +2078 6 6.08607531 0.086075305938720703 0.0074089582924443675 +2079 4 5.137181 1.1371808052062988 1.2931801837296462 +2080 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2081 5 5.31921959 0.31921958923339844 0.10190114615033963 +2082 6 5.793145 0.20685482025146484 0.04278891666126583 +2083 5 5.237396 0.2373957633972168 0.056356748478947338 +2084 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2085 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2086 5 5.515484 0.51548385620117188 0.26572360600403044 +2087 6 5.955682 0.044318199157714844 0.0019641027765828767 +2088 6 5.975536 0.024464130401611328 0.00059849367630704364 +2089 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2090 5 5.20975637 0.20975637435913086 0.04399773658428785 +2091 5 5.30951 0.30951023101806641 0.095796583104856836 +2092 5 5.085698 0.085698127746582031 0.007344169099269493 +2093 5 5.254017 0.25401687622070313 0.064524573404924013 +2094 5 5.254017 0.25401687622070313 0.064524573404924013 +2095 5 5.39610338 0.3961033821105957 0.15689788931945259 +2096 5 4.758813 0.24118709564208984 0.058171215104266594 +2097 5 5.65508652 0.65508651733398438 0.42913834519276861 +2098 6 6.13854647 0.13854646682739258 0.019195123470353792 +2099 5 5.38220358 0.38220357894897461 0.14607957576140507 +2100 5 5.65508652 0.65508651733398438 0.42913834519276861 +2101 6 6.26671 0.26670980453491211 0.071134119835051024 +2102 5 5.41741562 0.41741561889648438 0.17423579889873508 +2103 5 5.247345 0.247344970703125 0.061179534532129765 +2104 5 5.38220358 0.38220357894897461 0.14607957576140507 +2105 5 4.758813 0.24118709564208984 0.058171215104266594 +2106 5 5.057006 0.057005882263183594 0.0032496706126039498 +2107 6 5.77749348 0.22250652313232422 0.049509152836435533 +2108 6 6.13854647 0.13854646682739258 0.019195123470353792 +2109 6 5.957272 0.042727947235107422 0.001825677474926124 +2110 5 5.11222172 0.11222171783447266 0.012593713953719998 +2111 5 5.11222172 0.11222171783447266 0.012593713953719998 +2112 5 5.11222172 0.11222171783447266 0.012593713953719998 +2113 5 5.136051 0.13605117797851563 0.018509923029341735 +2114 6 5.957272 0.042727947235107422 0.001825677474926124 +2115 5 5.11222172 0.11222171783447266 0.012593713953719998 +2116 4 5.84926033 1.8492603302001953 3.4197637688521354 +2117 5 5.63614273 0.63614273071289063 0.40467757383885328 +2118 6 6.353011 0.35301113128662109 0.12461685881226003 +2119 4 5.739438 1.7394380569458008 3.0256447539513829 +2120 5 5.592541 0.59254121780395508 0.35110509479659413 +2121 7 6.842314 0.15768623352050781 0.024864948241884122 +2122 5 5.53295135 0.53295135498046875 0.28403714677551761 +2123 5 5.592541 0.59254121780395508 0.35110509479659413 +2124 7 6.842314 0.15768623352050781 0.024864948241884122 +2125 5 5.52707672 0.52707672119140625 0.2778098700218834 +2126 5 5.25731373 0.25731372833251953 0.066210354788381665 +2127 5 4.86935139 0.13064861297607422 0.017069060072572029 +2128 6 5.41065741 0.58934259414672852 0.34732469327559556 +2129 5 6.337489 1.337489128112793 1.7888771678199191 +2130 5 5.82943773 0.8294377326965332 0.68796695242076567 +2131 6 5.59359074 0.40640926361083984 0.16516848954870511 +2132 6 5.59359074 0.40640926361083984 0.16516848954870511 +2133 6 5.91878843 0.081211566925048828 0.0065953186024216848 +2134 6 6.26523066 0.26523065567016602 0.070347300707226168 +2135 5 5.80142641 0.80142641067504883 0.64228429172749202 +2136 6 6.29388428 0.29388427734375 0.08636796846985817 +2137 5 5.80142641 0.80142641067504883 0.64228429172749202 +2138 5 5.58149242 0.58149242401123047 0.33813343918245664 +2139 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2140 5 5.238538 0.23853778839111328 0.056900276490523538 +2141 5 5.238538 0.23853778839111328 0.056900276490523538 +2142 5 5.346484 0.34648418426513672 0.12005128994587722 +2143 7 6.779074 0.22092580795288086 0.048808212619633196 +2144 6 5.85388136 0.1461186408996582 0.021350657218363267 +2145 6 5.790298 0.2097020149230957 0.043974935062806253 +2146 6 5.929391 0.070609092712402344 0.0049856439736686298 +2147 5 5.50856447 0.50856447219848633 0.25863782238252497 +2148 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2149 6 6.505095 0.50509500503540039 0.25512096411171115 +2150 6 6.639851 0.63985109329223633 0.40940942158727012 +2151 5 5.238538 0.23853778839111328 0.056900276490523538 +2152 6 5.64773 0.35227012634277344 0.12409424191355356 +2153 6 5.92296648 0.077033519744873047 0.0059341631642837456 +2154 4 4.198002 0.19800186157226563 0.039204737186082639 +2155 5 5.715006 0.71500587463378906 0.51123340076082968 +2156 4 5.04174948 1.0417494773864746 1.085241973634993 +2157 6 6.246933 0.2469329833984375 0.06097589829005301 +2158 6 6.27462959 0.27462959289550781 0.075421413293952355 +2159 4 5.01505 1.015049934387207 1.0303263692994733 +2160 6 6.67232943 0.67232942581176758 0.45202685681238108 +2161 7 6.62193441 0.37806558609008789 0.14293358738564166 +2162 6 5.09313726 0.90686273574829102 0.8224000214888747 +2163 6 6.246933 0.2469329833984375 0.06097589829005301 +2164 5 5.51115274 0.51115274429321289 0.26127712799848268 +2165 5 5.17895126 0.17895126342773438 0.032023554682382382 +2166 5 5.17895126 0.17895126342773438 0.032023554682382382 +2167 7 6.7765646 0.22343540191650391 0.049923378829589637 +2168 7 6.7765646 0.22343540191650391 0.049923378829589637 +2169 7 6.7765646 0.22343540191650391 0.049923378829589637 +2170 7 6.7765646 0.22343540191650391 0.049923378829589637 +2171 7 6.7765646 0.22343540191650391 0.049923378829589637 +2172 5 4.84022141 0.15977859497070313 0.025529199410811998 +2173 5 5.25834274 0.25834274291992188 0.066740972819388844 +2174 7 6.7765646 0.22343540191650391 0.049923378829589637 +2175 7 6.770401 0.2295989990234375 0.052715700352564454 +2176 5 4.84022141 0.15977859497070313 0.025529199410811998 +2177 7 5.39672947 1.6032705307006836 2.5704763946132516 +2178 5 5.25834274 0.25834274291992188 0.066740972819388844 +2179 6 5.89384937 0.10615062713623047 0.011267955641415028 +2180 6 5.356053 0.64394712448120117 0.4146678991276076 +2181 6 6.08375168 0.083751678466796875 0.0070143436460057274 +2182 5 5.390071 0.39007091522216797 0.15215531890225975 +2183 5 5.441367 0.44136714935302734 0.19480496052801755 +2184 6 5.66160774 0.33839225769042969 0.11450932006482617 +2185 7 6.191624 0.80837583541870117 0.65347149128888304 +2186 5 5.19513273 0.19513273239135742 0.03807678325051711 +2187 5 5.130219 0.1302189826965332 0.016956983454520014 +2188 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2189 6 6.26448154 0.26448154449462891 0.06995048737826437 +2190 6 6.82654762 0.82654762268066406 0.68318097255905741 +2191 5 5.425485 0.42548513412475586 0.18103759936116148 +2192 6 5.45986128 0.54013872146606445 0.29174983842699476 +2193 6 6.26448154 0.26448154449462891 0.06995048737826437 +2194 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2195 5 5.130219 0.1302189826965332 0.016956983454520014 +2196 6 5.875051 0.12494897842407227 0.015612247209219277 +2197 6 6.14725447 0.14725446701049805 0.021683878054545858 +2198 5 5.17893553 0.17893552780151367 0.032017923109606272 +2199 6 5.539782 0.46021795272827148 0.21180056401340153 +2200 5 5.37913132 0.37913131713867188 0.14374055563530419 +2201 6 5.54702854 0.45297145843505859 0.20518314215678402 +2202 5 5.17893553 0.17893552780151367 0.032017923109606272 +2203 5 5.33585262 0.33585262298583984 0.11279698436646868 +2204 5 4.981754 0.018246173858642578 0.00033292286047981179 +2205 5 5.47519064 0.47519063949584961 0.22580614386447451 +2206 6 5.697418 0.302581787109375 0.091555737890303135 +2207 7 6.363133 0.63686704635620117 0.40559963473447169 +2208 5 5.92743444 0.92743444442749023 0.86013464871052747 +2209 6 6.38974 0.389739990234375 0.15189725998789072 +2210 7 5.881483 1.1185169219970703 1.2510801047938003 +2211 6 6.051986 0.051986217498779297 0.0027025668098303868 +2212 6 6.38974 0.389739990234375 0.15189725998789072 +2213 6 6.225851 0.22585105895996094 0.051008700833335752 +2214 5 5.92743444 0.92743444442749023 0.86013464871052747 +2215 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2216 5 5.22257233 0.22257232666015625 0.049538440594915301 +2217 6 5.75656176 0.2434382438659668 0.059262178576545921 +2218 6 6.004971 0.0049710273742675781 2.4711113155717612E-05 +2219 7 6.9423914 0.057608604431152344 0.0033187513045049855 +2220 6 5.98822832 0.011771678924560547 0.00013857242470294295 +2221 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2222 7 6.238345 0.76165485382080078 0.58011811634878541 +2223 6 5.76465273 0.23534727096557617 0.055388337950944333 +2224 7 6.238345 0.76165485382080078 0.58011811634878541 +2225 4 5.334978 1.3349781036376953 1.7821665371920972 +2226 5 5.42304373 0.42304372787475586 0.17896599569417049 +2227 5 5.3450017 0.3450016975402832 0.11902617130567705 +2228 7 6.38641167 0.61358833312988281 0.37649064255310805 +2229 6 6.327121 0.32712078094482422 0.10700800532595167 +2230 7 6.38641167 0.61358833312988281 0.37649064255310805 +2231 6 6.327121 0.32712078094482422 0.10700800532595167 +2232 6 5.600168 0.39983177185058594 0.15986544578117901 +2233 5 5.111535 0.11153507232666016 0.012440072358913312 +2234 5 5.26435328 0.26435327529907227 0.069882654161347091 +2235 6 5.37941647 0.62058353424072266 0.38512392297070619 +2236 5 5.251844 0.25184392929077148 0.063425364720615107 +2237 4 5.0567894 1.0567893981933594 1.1168038321338827 +2238 6 6.033932 0.033932209014892578 0.0011513948086303571 +2239 6 5.37941647 0.62058353424072266 0.38512392297070619 +2240 5 5.248432 0.24843215942382813 0.061718537835986353 +2241 5 5.251844 0.25184392929077148 0.063425364720615107 +2242 5 5.399409 0.39940881729125977 0.15952740333000293 +2243 5 5.80063057 0.80063056945800781 0.64100930875065387 +2244 5 5.151465 0.15146493911743164 0.022941627781847274 +2245 7 5.89144135 1.1085586547851563 1.2289022910990752 +2246 4 5.0567894 1.0567893981933594 1.1168038321338827 +2247 6 6.033932 0.033932209014892578 0.0011513948086303571 +2248 6 5.807818 0.19218206405639648 0.036933945744976882 +2249 5 5.127346 0.12734603881835938 0.016217013602727093 +2250 6 5.35683775 0.64316225051879883 0.41365768049240614 +2251 7 6.476783 0.52321720123291016 0.2737562396659996 +2252 5 5.24472237 0.24472236633300781 0.059889036583626876 +2253 5 5.127346 0.12734603881835938 0.016217013602727093 +2254 6 5.68012667 0.31987333297729492 0.10231894915000339 +2255 6 5.649487 0.35051298141479492 0.12285935014028837 +2256 5 5.77087641 0.77087640762329102 0.59425043583019033 +2257 6 5.534438 0.46556186676025391 0.21674785178129241 +2258 5 5.237371 0.23737096786499023 0.056344976385162227 +2259 6 5.534438 0.46556186676025391 0.21674785178129241 +2260 5 5.237371 0.23737096786499023 0.056344976385162227 +2261 6 5.32792854 0.67207145690917969 0.45168004319202737 +2262 6 5.51419926 0.48580074310302734 0.23600236199945357 +2263 5 5.17338371 0.17338371276855469 0.030061911853408674 +2264 6 6.11459446 0.11459445953369141 0.013131890155818837 +2265 5 5.17338371 0.17338371276855469 0.030061911853408674 +2266 5 5.259477 0.25947713851928711 0.06732838541415731 +2267 6 6.11459446 0.11459445953369141 0.013131890155818837 +2268 6 5.62352276 0.37647724151611328 0.14173511337958189 +2269 6 5.99339151 0.0066084861755371094 4.367208953226509E-05 +2270 7 6.46453953 0.53546047210693359 0.28671791718898021 +2271 6 5.59352732 0.40647268295288086 0.1652200419869132 +2272 6 6.096581 0.096580982208251953 0.0093278861243106803 +2273 5 4.882008 0.11799192428588867 0.013922094196686885 +2274 7 6.46453953 0.53546047210693359 0.28671791718898021 +2275 4 5.08899927 1.0889992713928223 1.1859194130940978 +2276 6 5.319647 0.68035316467285156 0.46288042868036428 +2277 6 6.20249128 0.20249128341674805 0.041002719859761783 +2278 6 5.319647 0.68035316467285156 0.46288042868036428 +2279 5 5.251488 0.25148820877075195 0.06324631915072132 +2280 6 6.21316671 0.21316671371459961 0.045440047835882069 +2281 6 6.06043863 0.060438632965087891 0.0036528283546886087 +2282 5 5.13450336 0.13450336456298828 0.018091155078764132 +2283 5 5.13450336 0.13450336456298828 0.018091155078764132 +2284 5 5.13450336 0.13450336456298828 0.018091155078764132 +2285 5 5.13450336 0.13450336456298828 0.018091155078764132 +2286 5 5.239092 0.23909187316894531 0.057164923815435031 +2287 5 5.03401 0.034009933471679688 0.0011566755747480784 +2288 5 5.13450336 0.13450336456298828 0.018091155078764132 +2289 7 7.010147 0.0101470947265625 0.0001029635313898325 +2290 7 6.22187948 0.77812051773071289 0.60547154011351267 +2291 6 6.003072 0.0030717849731445313 9.4358629212365486E-06 +2292 6 5.163496 0.83650398254394531 0.69973891281188116 +2293 7 7.010147 0.0101470947265625 0.0001029635313898325 +2294 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2295 6 5.405581 0.59441900253295898 0.3533339505722779 +2296 7 6.178634 0.8213658332824707 0.67464183208380746 +2297 6 5.51448441 0.48551559448242188 0.23572539248561952 +2298 8 7.070608 0.92939186096191406 0.8637692312222498 +2299 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2300 7 6.941374 0.058626174926757813 0.0034370283865428064 +2301 5 5.82642746 0.82642745971679688 0.68298234617395792 +2302 5 5.069897 0.069897174835205078 0.004885615049943226 +2303 5 5.160475 0.16047477722167969 0.025752154124347726 +2304 6 5.08372641 0.91627359390258789 0.83955729888316455 +2305 7 6.6948843 0.30511569976806641 0.093095590244956838 +2306 5 5.255328 0.25532817840576172 0.065192478688004485 +2307 5 5.56966 0.56966018676757813 0.32451272838807199 +2308 5 4.917936 0.082064151763916016 0.0067345250047310401 +2309 6 5.15906954 0.84093046188354492 0.7071640417236722 +2310 5 5.56966 0.56966018676757813 0.32451272838807199 +2311 7 6.76234055 0.23765945434570313 0.056482016239897348 +2312 5 4.917936 0.082064151763916016 0.0067345250047310401 +2313 7 6.685575 0.31442499160766602 0.098863075347480844 +2314 6 6.73747158 0.73747158050537109 0.54386433205309004 +2315 6 6.32627153 0.32627153396606445 0.10645311387656875 +2316 7 6.55684757 0.44315242767333984 0.1963840741527747 +2317 5 5.376687 0.37668704986572266 0.14189313353654143 +2318 4 5.363103 1.363102912902832 1.8580495511641857 +2319 7 7.1930356 0.19303560256958008 0.037262743859400871 +2320 6 6.450675 0.45067501068115234 0.20310796525245678 +2321 5 4.742714 0.25728607177734375 0.06619612273061648 +2322 6 5.43903542 0.56096458435058594 0.31468126489562565 +2323 6 6.52697325 0.52697324752807617 0.27770080361028704 +2324 5 5.214914 0.21491384506225586 0.046187960799443317 +2325 6 4.96547174 1.0345282554626465 1.0702487113505867 +2326 5 5.26503468 0.26503467559814453 0.070243379269413708 +2327 6 4.96547174 1.0345282554626465 1.0702487113505867 +2328 5 5.26503468 0.26503467559814453 0.070243379269413708 +2329 5 5.334872 0.33487176895141602 0.11213910164065055 +2330 6 5.69431925 0.30568075180053711 0.093440722021341571 +2331 5 5.632817 0.63281679153442383 0.40045709164792243 +2332 6 5.70019341 0.29980659484863281 0.089883994314732263 +2333 8 7.38234949 0.61765050888061523 0.38149215112048296 +2334 5 4.905586 0.094414234161376953 0.0089140476122793189 +2335 5 5.82466841 0.82466840744018555 0.68007798222993188 +2336 5 4.577453 0.4225468635559082 0.1785458519009353 +2337 4 5.1711154 1.1711153984069824 1.3715112763859452 +2338 5 5.36899 0.36898994445800781 0.13615357911112369 +2339 6 5.740299 0.25970077514648438 0.067444492611684836 +2340 6 5.75540924 0.24459075927734375 0.059824639523867518 +2341 5 5.36899 0.36898994445800781 0.13615357911112369 +2342 8 6.87260151 1.1273984909057617 1.2710273572965889 +2343 5 6.3333354 1.3333353996276855 1.7777832879003199 +2344 6 5.740299 0.25970077514648438 0.067444492611684836 +2345 6 5.8191905 0.18080949783325195 0.032692074506712743 +2346 4 5.19108963 1.1910896301269531 1.418694506995962 +2347 6 6.069222 0.069221973419189453 0.0047916816040469712 +2348 6 5.79119158 0.20880842208862305 0.043600957135140561 +2349 5 5.02437 0.024370193481445313 0.0005939063303230796 +2350 5 5.51743269 0.51743268966674805 0.26773658833576519 +2351 6 5.81947565 0.18052434921264648 0.032589040658649537 +2352 6 5.35855627 0.64144372940063477 0.41145005798739476 +2353 7 6.329165 0.67083501815795898 0.45001962158698916 +2354 6 6.09388351 0.093883514404296875 0.0088141142769018188 +2355 7 6.501256 0.49874401092529297 0.24874558843384875 +2356 6 5.91373 0.086269855499267578 0.0074424879678645084 +2357 5 5.588777 0.58877706527709961 0.34665843259631401 +2358 5 5.56147957 0.56147956848144531 0.31525930582211004 +2359 5 5.16718626 0.16718626022338867 0.027951245607482633 +2360 6 5.79588366 0.2041163444519043 0.041663482072408442 +2361 5 5.330882 0.33088207244873047 0.10948294586796692 +2362 6 6.38512039 0.38512039184570313 0.14831771621538792 +2363 5 5.396926 0.39692592620849609 0.15755019089647249 +2364 5 5.1075263 0.10752630233764648 0.01156190569440696 +2365 5 5.29107666 0.29107666015625 0.084725622087717056 +2366 5 5.311592 0.31159210205078125 0.097089638060424477 +2367 6 5.39217 0.60783004760742188 0.36945736677444074 +2368 6 5.97187042 0.02812957763671875 0.00079127313802018762 +2369 6 6.071237 0.071237087249755859 0.0050747225998293288 +2370 7 6.65556 0.34443998336791992 0.11863890214249295 +2371 5 5.03869963 0.038699626922607422 0.0014976611239490012 +2372 4 4.18628931 0.18628931045532227 0.034703707189919442 +2373 3 3.84731722 0.84731721878051758 0.71794646924195149 +2374 6 6.297287 0.2972869873046875 0.088379552820697427 +2375 6 6.81347132 0.81347131729125977 0.66173558405557742 +2376 6 6.297287 0.2972869873046875 0.088379552820697427 +2377 6 5.87790442 0.12209558486938477 0.014907331844597138 +2378 5 5.080402 0.080401897430419922 0.0064644651104117656 +2379 4 4.55011559 0.55011558532714844 0.30262715721983113 +2380 4 4.447009 0.44700908660888672 0.19981712351091119 +2381 6 6.23594141 0.23594141006469727 0.055668348983317628 +2382 8 7.02860928 0.97139072418212891 0.94359993902708084 +2383 6 6.467941 0.4679408073425293 0.21896859917637812 +2384 8 7.02860928 0.97139072418212891 0.94359993902708084 +2385 5 5.768393 0.76839303970336914 0.59042786346458342 +2386 4 4.982087 0.98208713531494141 0.96449514135110803 +2387 4 4.92572927 0.92572927474975586 0.85697469012870897 +2388 4 4.838168 0.83816814422607422 0.70252583799538115 +2389 8 7.15358829 0.84641170501708984 0.71641277438993711 +2390 8 6.68599939 1.3140006065368652 1.7265975939792497 +2391 6 5.951952 0.048048019409179688 0.002308612169144908 +2392 7 6.037923 0.96207714080810547 0.9255924248654992 +2393 6 6.037923 0.037922859191894531 0.0014381432492882595 +2394 5 5.070125 0.070125102996826172 0.004917530070315479 +2395 5 5.324506 0.32450580596923828 0.10530401810774492 +2396 5 4.995414 0.0045862197875976563 2.1033411940152291E-05 +2397 6 6.378008 0.37800788879394531 0.14288996399045573 +2398 6 6.13482952 0.13482952117919922 0.018178999781412131 +2399 6 6.16249466 0.16249465942382813 0.026404514341265894 +2400 4 4.94752169 0.94752168655395508 0.8977973464900515 +2401 4 5.241969 1.241969108581543 1.5424872666708325 +2402 6 5.76762533 0.23237466812133789 0.053997986384501928 +2403 6 5.933714 0.066286087036132813 0.0043938453345617745 +2404 5 5.02169943 0.021699428558349609 0.00047086519975891861 +2405 5 5.430184 0.43018388748168945 0.18505817704885885 +2406 6 6.83018541 0.8301854133605957 0.68920782055670315 +2407 6 6.28223658 0.28223657608032227 0.079657484877543538 +2408 5 5.383545 0.383544921875 0.14710670709609985 +2409 4 5.90790749 1.9079074859619141 3.6401109749895113 +2410 6 5.853688 0.14631223678588867 0.021407270633289954 +2411 6 5.365198 0.63480186462402344 0.40297340733013698 +2412 4 4.653695 0.65369510650634766 0.42731729227034521 +2413 4 5.90790749 1.9079074859619141 3.6401109749895113 +2414 4 4.4736166 0.47361660003662109 0.22431268383024872 +2415 5 5.58259344 0.58259344100952148 0.33941511750731479 +2416 6 5.853688 0.14631223678588867 0.021407270633289954 +2417 5 5.08736038 0.087360382080078125 0.0076318363571772352 +2418 5 5.1927886 0.19278860092163086 0.037167444645319847 +2419 5 5.01314974 0.013149738311767578 0.00017291561766796804 +2420 7 6.78615475 0.21384525299072266 0.045729792226666177 +2421 5 5.62462759 0.62462759017944336 0.39015962641337865 +2422 5 4.834279 0.16572093963623047 0.027463429833915143 +2423 6 5.79968929 0.20031070709228516 0.040124379375811259 +2424 5 4.834279 0.16572093963623047 0.027463429833915143 +2425 6 5.79968929 0.20031070709228516 0.040124379375811259 +2426 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2427 6 5.67294264 0.3270573616027832 0.10696651777857369 +2428 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2429 6 5.67294264 0.3270573616027832 0.10696651777857369 +2430 5 5.191099 0.19109916687011719 0.036518891578452894 +2431 5 5.090718 0.090717792510986328 0.0082297178780663671 +2432 5 5.212568 0.21256780624389648 0.045185072251342717 +2433 6 5.457381 0.54261922836303711 0.29443562698929782 +2434 6 5.55754471 0.44245529174804688 0.19576668519584928 +2435 4 5.018812 1.0188121795654297 1.0379782572308613 +2436 5 5.1477704 0.14777040481567383 0.021836092539388119 +2437 6 5.767265 0.23273515701293945 0.05416565330983758 +2438 5 5.1477704 0.14777040481567383 0.021836092539388119 +2439 6 5.80857754 0.19142246246337891 0.036642559135543706 +2440 5 5.177423 0.17742300033569336 0.031478921048119446 +2441 6 6.0388093 0.038809299468994141 0.0015061617252740689 +2442 5 5.33315 0.33314990997314453 0.11098886251511431 +2443 5 5.356635 0.35663509368896484 0.12718859005053673 +2444 5 5.33315 0.33314990997314453 0.11098886251511431 +2445 5 5.36508751 0.36508750915527344 0.13328888934120187 +2446 5 5.356635 0.35663509368896484 0.12718859005053673 +2447 6 5.930377 0.069622993469238281 0.0048473612196175964 +2448 6 6.02893972 0.028939723968505859 0.00083750762337331253 +2449 6 6.112941 0.11294078826904297 0.012755621654832794 +2450 5 5.138178 0.13817787170410156 0.019093124228675151 +2451 5 5.138178 0.13817787170410156 0.019093124228675151 +2452 7 6.46374655 0.53625345230102539 0.28756776510476811 +2453 6 6.33004045 0.33004045486450195 0.10892670184716735 +2454 5 5.5165844 0.51658439636230469 0.26685943856500671 +2455 6 5.63751173 0.3624882698059082 0.1313977457468809 +2456 6 5.84722948 0.1527705192565918 0.023338831553928685 +2457 6 5.84722948 0.1527705192565918 0.023338831553928685 +2458 6 5.63751173 0.3624882698059082 0.1313977457468809 +2459 5 5.22885036 0.22885036468505859 0.052372489416484314 +2460 5 5.22885036 0.22885036468505859 0.052372489416484314 +2461 5 4.82563972 0.17436027526855469 0.030401505591726163 +2462 5 4.90771 0.092289924621582031 0.0085174301866572932 +2463 7 6.190032 0.80996799468994141 0.65604815242204495 +2464 5 5.229953 0.22995281219482422 0.052878295836308098 +2465 5 5.131188 0.13118791580200195 0.017210269252473154 +2466 5 5.164425 0.16442489624023438 0.02703554650361184 +2467 6 5.66543436 0.33456563949584961 0.1119341671312668 +2468 6 5.811642 0.18835783004760742 0.035478672140243361 +2469 5 5.10665464 0.10665464401245117 0.011375213089422687 +2470 5 5.55674934 0.55674934387207031 0.3099698319019808 +2471 7 6.85693 0.14307022094726563 0.020469088121899404 +2472 6 5.627016 0.37298393249511719 0.13911701389952214 +2473 6 5.3198247 0.6801753044128418 0.46263844473310201 +2474 7 6.27704525 0.72295475006103516 0.52266357063581381 +2475 5 4.89538431 0.10461568832397461 0.010944442243498997 +2476 6 5.59821844 0.40178155899047852 0.16142842114481937 +2477 7 6.27704525 0.72295475006103516 0.52266357063581381 +2478 6 5.4796133 0.52038669586181641 0.27080231322997861 +2479 6 5.65785551 0.34214448928833008 0.11706285155037222 +2480 5 5.200323 0.20032310485839844 0.040129346340108896 +2481 6 5.394372 0.60562801361083984 0.36678529087021161 +2482 6 5.52501059 0.47498941421508789 0.22561494361639234 +2483 6 5.4796133 0.52038669586181641 0.27080231322997861 +2484 5 5.12939167 0.12939167022705078 0.01674220432414586 +2485 6 5.59504271 0.40495729446411133 0.16399041033969297 +2486 5 5.50079441 0.50079441070556641 0.25079504179393552 +2487 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2488 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2489 6 5.56793261 0.4320673942565918 0.18668223317968113 +2490 6 5.73469973 0.26530027389526367 0.070384235328901923 +2491 5 5.48845625 0.48845624923706055 0.23858950741873741 +2492 6 5.56793261 0.4320673942565918 0.18668223317968113 +2493 4 5.123062 1.1230621337890625 1.2612685563508421 +2494 4 5.123062 1.1230621337890625 1.2612685563508421 +2495 5 5.651345 0.65134477615356445 0.42425001742253698 +2496 5 5.6806283 0.68062829971313477 0.46325488237039281 +2497 5 5.313193 0.31319284439086914 0.098089757777643172 +2498 5 5.313193 0.31319284439086914 0.098089757777643172 +2499 6 6.38280439 0.38280439376831055 0.14653920388832375 +2500 5 5.313193 0.31319284439086914 0.098089757777643172 +2501 5 5.424 0.42399978637695313 0.17977581884770188 +2502 4 4.899974 0.89997386932373047 0.80995296546552709 +2503 4 4.899974 0.89997386932373047 0.80995296546552709 +2504 6 5.45203543 0.54796457290649414 0.30026517316059653 +2505 6 5.481323 0.5186772346496582 0.2690260737438166 +2506 6 5.456469 0.54353094100952148 0.29542588383469592 +2507 7 6.86489058 0.13510942459106445 0.018254556613328532 +2508 6 5.3075223 0.69247770309448242 0.47952536928301015 +2509 5 5.15516758 0.15516757965087891 0.02407697777471185 +2510 6 5.557624 0.44237613677978516 0.19569664639220719 +2511 6 5.422771 0.57722902297973633 0.33319334497014097 +2512 6 5.622964 0.37703609466552734 0.1421562166806325 +2513 5 5.087558 0.087557792663574219 0.0076663670561174513 +2514 7 6.945491 0.054509162902832031 0.0029712488403674797 +2515 7 6.896848 0.10315179824829102 0.010640293481856133 +2516 6 5.80096245 0.19903755187988281 0.039615947058337042 +2517 6 5.541327 0.45867300033569336 0.21038092123694696 +2518 7 6.896848 0.10315179824829102 0.010640293481856133 +2519 5 5.26988125 0.26988124847412109 0.072835888277950289 +2520 5 5.06689453 0.06689453125 0.0044748783111572266 +2521 7 6.889004 0.11099576950073242 0.012320060847059722 +2522 8 6.341771 1.658228874206543 2.7497229992522989 +2523 5 5.927134 0.92713403701782227 0.85957752259696463 +2524 5 5.06689453 0.06689453125 0.0044748783111572266 +2525 8 6.341771 1.658228874206543 2.7497229992522989 +2526 7 6.889004 0.11099576950073242 0.012320060847059722 +2527 6 6.22118 0.22117996215820313 0.048920575660304166 +2528 6 6.05786 0.057859897613525391 0.0033477677518476412 +2529 5 5.17878962 0.17878961563110352 0.031965726657517735 +2530 6 6.09709454 0.097094535827636719 0.0094273488875842304 +2531 4 4.63009644 0.630096435546875 0.3970215180888772 +2532 4 4.63009644 0.630096435546875 0.3970215180888772 +2533 5 5.742318 0.74231815338134766 0.55103624083949398 +2534 7 5.86696339 1.1330366134643555 1.2837719674507753 +2535 6 5.663614 0.33638620376586914 0.11315567808401283 +2536 6 5.621967 0.37803316116333008 0.14290907093914029 +2537 6 5.53835869 0.46164131164550781 0.21311270061778487 +2538 6 5.53835869 0.46164131164550781 0.21311270061778487 +2539 5 5.52992725 0.52992725372314453 0.280822894238554 +2540 5 5.604961 0.60496091842651367 0.36597771282345093 +2541 6 5.663614 0.33638620376586914 0.11315567808401283 +2542 5 5.57032871 0.57032871246337891 0.32527484026013553 +2543 6 5.621967 0.37803316116333008 0.14290907093914029 +2544 6 6.133279 0.13327884674072266 0.017763250988537038 +2545 6 5.878759 0.12124109268188477 0.014699402554697372 +2546 5 5.218156 0.21815586090087891 0.047591979645403626 +2547 5 5.08556461 0.085564613342285156 0.007321303056414763 +2548 6 5.635065 0.36493492126464844 0.13317749675843515 +2549 5 5.86682272 0.86682271957397461 0.75138162716962142 +2550 5 5.08556461 0.085564613342285156 0.007321303056414763 +2551 6 5.635065 0.36493492126464844 0.13317749675843515 +2552 5 4.91085434 0.089145660400390625 0.0079469487682217732 +2553 7 6.82945776 0.17054224014282227 0.029084655672932058 +2554 7 6.783399 0.21660089492797852 0.046915947683601189 +2555 7 6.82945776 0.17054224014282227 0.029084655672932058 +2556 5 5.36953926 0.36953926086425781 0.13655926532010199 +2557 7 6.783399 0.21660089492797852 0.046915947683601189 +2558 7 6.82945776 0.17054224014282227 0.029084655672932058 +2559 5 5.189397 0.18939685821533203 0.035871169901838584 +2560 6 5.70537949 0.29462051391601563 0.086801247220137157 +2561 5 5.28348732 0.28348731994628906 0.080365060570329661 +2562 6 5.70537949 0.29462051391601563 0.086801247220137157 +2563 5 5.189397 0.18939685821533203 0.035871169901838584 +2564 6 5.399755 0.60024499893188477 0.36029405874273834 +2565 5 5.337183 0.33718299865722656 0.11369237458347925 +2566 7 6.48339272 0.51660728454589844 0.26688308644588687 +2567 5 6.3172555 1.3172554969787598 1.7351620443207594 +2568 6 5.472037 0.52796316146850586 0.27874509986781959 +2569 6 6.171783 0.1717829704284668 0.029509388929227498 +2570 5 6.3172555 1.3172554969787598 1.7351620443207594 +2571 6 6.25385761 0.25385761260986328 0.064443687479979417 +2572 5 5.263467 0.26346683502197266 0.069414773156495357 +2573 5 5.41449165 0.41449165344238281 0.17180333077340038 +2574 5 5.74912739 0.74912738800048828 0.56119184345243411 +2575 6 6.094214 0.094213962554931641 0.0088762707403020613 +2576 5 5.55226135 0.5522613525390625 0.30499260150827467 +2577 5 5.6303606 0.63036060333251953 0.39735449023373803 +2578 7 6.90196466 0.098035335540771484 0.0096109270145916526 +2579 6 5.492593 0.50740718841552734 0.25746205485575047 +2580 5 5.378673 0.37867307662963867 0.1433932989641562 +2581 7 6.623414 0.37658596038818359 0.14181698556149058 +2582 7 6.623414 0.37658596038818359 0.14181698556149058 +2583 7 6.623414 0.37658596038818359 0.14181698556149058 +2584 7 6.623414 0.37658596038818359 0.14181698556149058 +2585 7 6.623414 0.37658596038818359 0.14181698556149058 +2586 7 6.623414 0.37658596038818359 0.14181698556149058 +2587 6 5.450896 0.54910421371459961 0.30151543751912868 +2588 7 6.623414 0.37658596038818359 0.14181698556149058 +2589 4 4.47188 0.47187995910644531 0.2226706958063005 +2590 6 6.29141 0.29140996932983398 0.084919770224814783 +2591 7 6.413187 0.58681297302246094 0.34434946530745947 +2592 5 5.89621 0.8962101936340332 0.80319271117355129 +2593 5 5.977096 0.9770960807800293 0.95471675107569354 +2594 7 6.802061 0.19793891906738281 0.039179815681563923 +2595 5 4.78572226 0.21427774429321289 0.04591495169938753 +2596 5 5.26803637 0.2680363655090332 0.071843493235292044 +2597 6 6.40936327 0.4093632698059082 0.16757828666618479 +2598 5 5.26803637 0.2680363655090332 0.071843493235292044 +2599 6 5.64444828 0.35555171966552734 0.12641702535711374 +2600 7 6.711269 0.28873109817504883 0.083365647053369685 +2601 5 5.516984 0.51698398590087891 0.26727244167796016 +2602 6 6.40936327 0.4093632698059082 0.16757828666618479 +2603 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2604 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2605 6 5.749763 0.25023698806762695 0.062618550197157674 +2606 6 6.066723 0.066722869873046875 0.0044519413640955463 +2607 6 6.004938 0.0049381256103515625 2.4385084543609992E-05 +2608 6 6.19136524 0.19136524200439453 0.036620655847400485 +2609 6 5.749763 0.25023698806762695 0.062618550197157674 +2610 5 5.21728945 0.21728944778442383 0.047214704118459849 +2611 5 5.43802834 0.43802833557128906 0.19186882276335382 +2612 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2613 5 5.316313 0.31631278991699219 0.10005378106507123 +2614 5 6.02755356 1.0275535583496094 1.0558663152769441 +2615 7 6.71482038 0.28517961502075195 0.081327412823384293 +2616 7 6.71482038 0.28517961502075195 0.081327412823384293 +2617 7 6.71482038 0.28517961502075195 0.081327412823384293 +2618 7 6.17836475 0.82163524627685547 0.67508447792442894 +2619 6 5.447172 0.55282783508300781 0.30561861524256528 +2620 5 5.23616838 0.23616838455200195 0.055775505861902275 +2621 5 5.316313 0.31631278991699219 0.10005378106507123 +2622 7 6.17836475 0.82163524627685547 0.67508447792442894 +2623 7 6.71482038 0.28517961502075195 0.081327412823384293 +2624 5 6.02755356 1.0275535583496094 1.0558663152769441 +2625 5 4.932907 0.0670928955078125 0.0045014566276222467 +2626 7 6.67024565 0.32975435256958008 0.10873793303858292 +2627 7 6.191726 0.8082737922668457 0.65330652326542804 +2628 6 6.10126448 0.10126447677612305 0.010254494256741964 +2629 5 4.569814 0.43018579483032227 0.18505981807379612 +2630 6 5.93529558 0.064704418182373047 0.0041866617323194077 +2631 7 6.506482 0.49351787567138672 0.24355989360719832 +2632 5 4.742157 0.257843017578125 0.066483021713793278 +2633 5 5.672364 0.67236423492431641 0.45207366440536134 +2634 5 5.179316 0.17931604385375977 0.032154243583363495 +2635 6 6.10950756 0.10950756072998047 0.01199190585703036 +2636 5 5.672364 0.67236423492431641 0.45207366440536134 +2637 5 5.179316 0.17931604385375977 0.032154243583363495 +2638 6 6.36789942 0.36789941787719727 0.13534998167438062 +2639 6 5.970108 0.0298919677734375 0.00089352973736822605 +2640 6 6.01226473 0.012264728546142578 0.00015042356631056464 +2641 5 5.388603 0.38860321044921875 0.1510124551714398 +2642 5 5.089852 0.089851856231689453 0.0080733560682801908 +2643 5 5.421518 0.42151784896850586 0.17767729699903612 +2644 6 5.965845 0.034154891967773438 0.0011665566453302745 +2645 7 6.45913172 0.54086828231811523 0.2925384988177484 +2646 7 5.962606 1.0373940467834473 1.0761864083017372 +2647 5 5.531743 0.53174304962158203 0.28275067082086025 +2648 6 6.055601 0.055601119995117188 0.0030914845447114203 +2649 6 5.965845 0.034154891967773438 0.0011665566453302745 +2650 5 5.375029 0.37502908706665039 0.14064681614604524 +2651 5 5.00735 0.0073499679565429688 5.4022028962208424E-05 +2652 7 6.862701 0.1372990608215332 0.018851032102475074 +2653 5 5.389191 0.3891911506652832 0.15146975175616717 +2654 5 4.99643946 0.0035605430603027344 1.2677466884269961E-05 +2655 5 5.479881 0.47988080978393555 0.23028559159888573 +2656 4 5.36642933 1.366429328918457 1.8671291109285448 +2657 7 6.66357 0.33643007278442383 0.11318519387373271 +2658 7 6.43240547 0.56759452819824219 0.32216354844058515 +2659 6 6.25220728 0.25220727920532227 0.063608511684151381 +2660 6 5.396139 0.60386085510253906 0.36464793232516968 +2661 6 5.94709873 0.052901268005371094 0.0027985441565760993 +2662 6 6.15312243 0.1531224250793457 0.023446477062179838 +2663 8 6.468452 1.531548023223877 2.3456393474409651 +2664 7 6.755112 0.2448878288269043 0.059970048707555179 +2665 5 5.26342249 0.26342248916625977 0.069391407798548244 +2666 7 6.840258 0.15974187850952148 0.025517467749750722 +2667 7 6.64892 0.35107994079589844 0.12325712482925155 +2668 6 5.510326 0.48967409133911133 0.23978071572878434 +2669 5 5.402378 0.40237808227539063 0.16190812109562103 +2670 7 6.840258 0.15974187850952148 0.025517467749750722 +2671 7 6.964588 0.035411834716796875 0.0012539980380097404 +2672 7 6.438929 0.56107091903686523 0.31480057618887258 +2673 6 5.11319351 0.88680648803710938 0.78642574722471181 +2674 7 5.93575 1.0642499923706055 1.1326280462608338 +2675 7 5.96326256 1.0367374420166016 1.0748245236791263 +2676 6 6.27718973 0.27718973159790039 0.076834147303316058 +2677 6 6.43075943 0.43075942993164063 0.18555368647503201 +2678 5 5.22192669 0.22192668914794922 0.049251455356170482 +2679 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2680 6 6.6857276 0.68572759628295898 0.47022233630400478 +2681 6 6.17682171 0.17682170867919922 0.031265916660231596 +2682 6 6.14539433 0.14539432525634766 0.021139509816748614 +2683 5 5.22192669 0.22192668914794922 0.049251455356170482 +2684 6 6.398973 0.39897298812866211 0.15917944525631356 +2685 7 6.462977 0.53702306747436523 0.28839377499957664 +2686 6 6.6857276 0.68572759628295898 0.47022233630400478 +2687 5 5.45965528 0.4596552848815918 0.21128298091957731 +2688 6 6.17682171 0.17682170867919922 0.031265916660231596 +2689 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2690 6 5.39443636 0.60556364059448242 0.36670732281004348 +2691 6 6.075588 0.075588226318359375 0.0057135799579555169 +2692 6 5.428855 0.57114505767822266 0.32620667691026028 +2693 6 6.246358 0.24635791778564453 0.06069222365567839 +2694 6 6.075588 0.075588226318359375 0.0057135799579555169 +2695 6 6.371832 0.37183189392089844 0.13825895733680227 +2696 6 5.633613 0.36638689041137695 0.13423935346531835 +2697 5 5.98760462 0.98760461807250977 0.97536288163814788 +2698 6 5.428855 0.57114505767822266 0.32620667691026028 +2699 6 5.39443636 0.60556364059448242 0.36670732281004348 +2700 7 6.802134 0.19786596298217773 0.039150939306864529 +2701 5 5.51507568 0.51507568359375 0.26530295982956886 +2702 5 5.51507568 0.51507568359375 0.26530295982956886 +2703 5 5.51507568 0.51507568359375 0.26530295982956886 +2704 6 5.557806 0.44219398498535156 0.19553552035722532 +2705 6 5.60688972 0.39311027526855469 0.15453568852171884 +2706 6 5.79417 0.20583009719848633 0.042366028912738329 +2707 5 5.51507568 0.51507568359375 0.26530295982956886 +2708 6 5.668365 0.3316349983215332 0.10998177211172333 +2709 5 5.385527 0.38552713394165039 0.14863117100526324 +2710 5 5.385527 0.38552713394165039 0.14863117100526324 +2711 5 5.449205 0.44920492172241211 0.20178506169963839 +2712 5 5.503833 0.50383281707763672 0.25384750756438734 +2713 6 5.668365 0.3316349983215332 0.10998177211172333 +2714 6 5.45965528 0.5403447151184082 0.29197241115639372 +2715 6 5.87323952 0.12676048278808594 0.016068219996668631 +2716 5 5.385527 0.38552713394165039 0.14863117100526324 +2717 6 6.10622644 0.10622644424438477 0.011284057456805385 +2718 6 5.66719341 0.33280658721923828 0.11076022449651646 +2719 6 6.14106846 0.14106845855712891 0.019900309999684396 +2720 7 6.80913448 0.19086551666259766 0.036429645450880344 +2721 5 5.197515 0.19751501083374023 0.039012179504652522 +2722 7 6.88614845 0.11385154724121094 0.012962174809217686 +2723 6 6.593465 0.59346485137939453 0.35220052982276684 +2724 6 6.14106846 0.14106845855712891 0.019900309999684396 +2725 5 5.453957 0.45395708084106445 0.20607703124574073 +2726 6 5.930292 0.069707870483398438 0.0048591872073302511 +2727 6 5.986483 0.013516902923583984 0.00018270666464559326 +2728 6 5.44713926 0.55286073684692383 0.30565499434692356 +2729 7 6.42816162 0.57183837890625 0.32699913159012794 +2730 5 5.11883736 0.11883735656738281 0.014122317315923283 +2731 5 5.159798 0.15979814529418945 0.025535447239462883 +2732 5 5.14337635 0.14337635040283203 0.020556777854835673 +2733 7 6.42816162 0.57183837890625 0.32699913159012794 +2734 6 5.868908 0.13109207153320313 0.017185131218866445 +2735 6 5.44713926 0.55286073684692383 0.30565499434692356 +2736 6 5.986483 0.013516902923583984 0.00018270666464559326 +2737 7 6.00914955 0.99085044860839844 0.98178461150746443 +2738 5 4.7449894 0.25501060485839844 0.065030408590246225 +2739 7 6.73053 0.26947021484375 0.072614196687936783 +2740 6 5.63796473 0.36203527450561523 0.13106953998635618 +2741 5 4.7449894 0.25501060485839844 0.065030408590246225 +2742 6 5.878949 0.12105083465576172 0.014653304570856562 +2743 6 5.44707775 0.55292224884033203 0.30572301326265006 +2744 6 5.44707775 0.55292224884033203 0.30572301326265006 +2745 7 6.68483162 0.31516838073730469 0.099331108216574648 +2746 6 5.846201 0.15379905700683594 0.02365414993619197 +2747 6 5.86011 0.13989019393920898 0.019569266360349502 +2748 8 7.558382 0.44161796569824219 0.19502642762745381 +2749 6 5.86011 0.13989019393920898 0.019569266360349502 +2750 8 7.558382 0.44161796569824219 0.19502642762745381 +2751 6 6.354132 0.35413217544555664 0.12540959768580251 +2752 6 6.444844 0.44484376907348633 0.19788597888350523 +2753 8 6.60379028 1.396209716796875 1.9494015732780099 +2754 5 5.163789 0.16378879547119141 0.026826769521903771 +2755 5 4.94988251 0.05011749267578125 0.0025117630721069872 +2756 6 5.5096693 0.49033069610595703 0.24042419154375239 +2757 5 5.64830256 0.64830255508422852 0.42029620292873915 +2758 6 5.50835371 0.49164628982543945 0.24171607429912001 +2759 6 5.96230745 0.037692546844482422 0.0014207280876235018 +2760 6 6.071012 0.071012020111083984 0.0050427070002569963 +2761 5 5.126366 0.12636613845825195 0.015968400948850103 +2762 5 4.961535 0.038465023040771484 0.0014795579975270812 +2763 6 5.63605547 0.36394453048706055 0.13245562127144694 +2764 6 5.87988043 0.12011957168579102 0.014428711501977887 +2765 6 6.52317953 0.52317953109741211 0.273716821759308 +2766 6 6.2780447 0.27804470062255859 0.077308855544288235 +2767 6 5.87988043 0.12011957168579102 0.014428711501977887 +2768 6 5.63605547 0.36394453048706055 0.13245562127144694 +2769 5 4.961535 0.038465023040771484 0.0014795579975270812 +2770 7 6.230737 0.76926279067993164 0.59176524112467632 +2771 6 5.9890213 0.01097869873046875 0.00012053182581439614 +2772 7 7.19588566 0.19588565826416016 0.038371191113583336 +2773 7 6.701176 0.29882383346557617 0.089295683447062402 +2774 8 7.11208963 0.88791036605834961 0.7883848181538724 +2775 8 7.11208963 0.88791036605834961 0.7883848181538724 +2776 8 7.11208963 0.88791036605834961 0.7883848181538724 +2777 6 5.92017651 0.079823493957519531 0.0063717901875861571 +2778 7 6.701176 0.29882383346557617 0.089295683447062402 +2779 5 6.13225031 1.1322503089904785 1.2819907622090341 +2780 5 4.9076457 0.092354297637939453 0.0085293162921971089 +2781 6 5.63751364 0.36248636245727539 0.13139636296750723 +2782 6 5.910954 0.089046001434326172 0.0079291903714420187 +2783 6 5.910954 0.089046001434326172 0.0079291903714420187 +2784 6 5.910954 0.089046001434326172 0.0079291903714420187 +2785 5 5.312507 0.31250715255737305 0.097660720399517231 +2786 6 6.226491 0.22649097442626953 0.051298161496561079 +2787 5 5.312507 0.31250715255737305 0.097660720399517231 +2788 5 5.288817 0.28881692886352539 0.083415218398158686 +2789 5 5.239505 0.23950481414794922 0.057362556000043696 +2790 6 5.910954 0.089046001434326172 0.0079291903714420187 +2791 5 5.335238 0.33523797988891602 0.11238450316000126 +2792 5 5.333069 0.33306884765625 0.11093485727906227 +2793 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2794 5 5.25789976 0.25789976119995117 0.06651228682699184 +2795 8 6.859369 1.1406311988830566 1.3010395318653991 +2796 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2797 5 5.25789976 0.25789976119995117 0.06651228682699184 +2798 7 6.24827337 0.75172662734985352 0.56509292226678554 +2799 7 6.445542 0.5544581413269043 0.30742383048368538 +2800 5 5.335238 0.33523797988891602 0.11238450316000126 +2801 5 5.333069 0.33306884765625 0.11093485727906227 +2802 6 5.92864656 0.071353435516357422 0.0050913127599869767 +2803 8 7.02032 0.97968006134033203 0.95977302258779673 +2804 8 6.859369 1.1406311988830566 1.3010395318653991 +2805 6 6.18910837 0.18910837173461914 0.0357619762601189 +2806 5 5.57462358 0.57462358474731445 0.33019226414785408 +2807 5 5.46513 0.46512985229492188 0.21634577949589584 +2808 6 5.404429 0.59557104110717773 0.35470486500548759 +2809 7 6.74964428 0.25035572052001953 0.062677986797098129 +2810 7 6.45263243 0.54736757278442383 0.29961125973591152 +2811 5 5.919209 0.91920900344848633 0.84494519202075935 +2812 6 6.11701441 0.11701440811157227 0.013692371705701589 +2813 7 6.74964428 0.25035572052001953 0.062677986797098129 +2814 7 6.791037 0.20896291732788086 0.043665500818178771 +2815 5 5.735541 0.73554086685180664 0.54102036680910714 +2816 5 5.957191 0.95719099044799805 0.91621459219481949 +2817 7 6.791037 0.20896291732788086 0.043665500818178771 +2818 4 4.92936659 0.9293665885925293 0.86372225599211561 +2819 6 6.16221571 0.1622157096862793 0.026313936469023247 +2820 5 5.37689543 0.37689542770385742 0.14205016342407362 +2821 5 5.44312143 0.44312143325805664 0.19635660461267435 +2822 5 5.83623457 0.83623456954956055 0.69928825530973882 +2823 6 5.95306063 0.046939373016357422 0.0022033047391687433 +2824 6 5.68058062 0.31941938400268555 0.10202874287665509 +2825 6 5.857073 0.14292716979980469 0.020428175866982201 +2826 6 5.466382 0.53361797332763672 0.28474814145829441 +2827 7 6.83924961 0.16075038909912109 0.02584068759551883 +2828 7 6.83924961 0.16075038909912109 0.02584068759551883 +2829 5 5.557639 0.55763912200927734 0.3109613903952777 +2830 5 5.962908 0.96290779113769531 0.92719141423367546 +2831 5 5.24277925 0.24277925491333008 0.058941766616271707 +2832 6 6.0280633 0.028063297271728516 0.00078754865376140515 +2833 7 6.12555552 0.87444448471069336 0.76465315684095003 +2834 6 6.29048538 0.29048538208007813 0.084381757202208973 +2835 6 5.857073 0.14292716979980469 0.020428175866982201 +2836 6 5.466382 0.53361797332763672 0.28474814145829441 +2837 6 5.772782 0.2272181510925293 0.051628088185907473 +2838 7 6.708939 0.2910609245300293 0.08471646178827541 +2839 7 6.07187033 0.92812967300415039 0.86142468991079113 +2840 6 6.175222 0.17522192001342773 0.030702721253192067 +2841 6 5.65299845 0.34700155258178711 0.12041007749417076 +2842 6 5.60486126 0.39513874053955078 0.15613462427518243 +2843 6 5.718894 0.28110599517822266 0.079020580525138939 +2844 5 6.00124359 1.0012435913085938 1.0024887291365303 +2845 7 6.4817934 0.51820659637451172 0.2685380765260561 +2846 7 6.708939 0.2910609245300293 0.08471646178827541 +2847 5 5.987009 0.98700904846191406 0.97418686174569302 +2848 5 5.18150425 0.18150424957275391 0.032943792612968537 +2849 5 5.016559 0.016559123992919922 0.00027420458741289622 +2850 5 5.75738764 0.75738763809204102 0.5736360343346405 +2851 5 5.504389 0.50438880920410156 0.25440807085033157 +2852 5 5.83271551 0.83271551132202148 0.69341512279629569 +2853 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2854 6 6.241845 0.24184513092041016 0.058489067349910329 +2855 7 6.551627 0.44837284088134766 0.2010382044400103 +2856 7 6.816518 0.18348217010498047 0.033665706746432988 +2857 8 7.0720315 0.92796850204467773 0.86112554078704306 +2858 7 6.551627 0.44837284088134766 0.2010382044400103 +2859 6 5.95013046 0.049869537353515625 0.0024869707558536902 +2860 6 6.036433 0.036433219909667969 0.0013273795129862265 +2861 6 6.241845 0.24184513092041016 0.058489067349910329 +2862 6 6.55694532 0.5569453239440918 0.31018809386318935 +2863 6 6.42587757 0.42587757110595703 0.18137170557110949 +2864 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2865 6 5.90828276 0.091717243194580078 0.0084120526992137457 +2866 7 6.816518 0.18348217010498047 0.033665706746432988 +2867 7 6.6592536 0.34074640274047852 0.11610811098057638 +2868 5 5.46810532 0.46810531616210938 0.21912258701922838 +2869 6 6.41052437 0.41052436828613281 0.16853025695672841 +2870 7 6.6592536 0.34074640274047852 0.11610811098057638 +2871 6 6.21243954 0.21243953704833984 0.045130556901312957 +2872 7 7.25975037 0.2597503662109375 0.067470252746716142 +2873 8 7.001045 0.99895477294921875 0.99791063839802518 +2874 7 7.061138 0.061138153076171875 0.0037378737615654245 +2875 6 6.21243954 0.21243953704833984 0.045130556901312957 +2876 5 5.88438272 0.88438272476196289 0.78213280385739381 +2877 5 5.50844669 0.50844669342041016 0.25851804005014856 +2878 6 6.67545128 0.67545127868652344 0.45623442987925955 +2879 6 6.11065865 0.11065864562988281 0.012245335852639982 +2880 5 5.591242 0.59124183654785156 0.34956690928447642 +2881 7 6.55750942 0.44249057769775391 0.19579791135129199 +2882 5 5.81471968 0.81471967697143555 0.66376815204444028 +2883 7 6.662797 0.33720302581787109 0.11370588062072784 +2884 7 7.0597086 0.059708595275878906 0.0035651163498187088 +2885 6 6.686732 0.68673181533813477 0.47160058619761003 +2886 5 5.475714 0.47571420669555664 0.22630400645198279 +2887 5 6.349974 1.3499741554260254 1.8224302203182106 +2888 4 4.76470327 0.76470327377319336 0.58477109691943951 +2889 6 6.016396 0.016396045684814453 0.00026883031409852265 +2890 8 7.01523542 0.98476457595825195 0.96976127006223578 +2891 6 6.067511 0.067511081695556641 0.0045577461517041229 +2892 5 5.22424173 0.22424173355102539 0.050284355065969066 +2893 7 7.046794 0.046793937683105469 0.002189672603890358 +2894 7 6.419709 0.58029079437255859 0.33673740603353508 +2895 5 4.983767 0.016232967376708984 0.00026350922985329817 +2896 5 5.330299 0.33029890060424805 0.10909736374037493 +2897 5 5.22424173 0.22424173355102539 0.050284355065969066 +2898 5 5.48931837 0.4893183708190918 0.23943246802105023 +2899 5 5.496111 0.49611091613769531 0.24612604111098335 +2900 6 6.3282485 0.32824850082397461 0.10774707829318686 +2901 7 6.920011 0.079988956451416016 0.0063982331541865278 +2902 5 5.336474 0.33647394180297852 0.11321471351243417 +2903 6 6.15183258 0.15183258056640625 0.023053132521454245 +2904 7 6.646972 0.3530278205871582 0.12462864210851876 +2905 5 5.2062397 0.20623970031738281 0.042534813987003872 +2906 5 5.24921036 0.24921035766601563 0.062105802368023433 +2907 6 6.15183258 0.15183258056640625 0.023053132521454245 +2908 6 5.733736 0.26626396179199219 0.070896497349167475 +2909 6 6.14865255 0.14865255355834961 0.022097581679417999 +2910 5 5.23128128 0.23128128051757813 0.053491030717850663 +2911 5 5.336474 0.33647394180297852 0.11321471351243417 +2912 7 6.920011 0.079988956451416016 0.0063982331541865278 +2913 5 5.80159569 0.80159568786621094 0.64255564680570387 +2914 6 6.119406 0.11940622329711914 0.014257846162081478 +2915 6 6.119406 0.11940622329711914 0.014257846162081478 +2916 6 6.460953 0.4609532356262207 0.21247788543428214 +2917 7 6.76917076 0.23082923889160156 0.053282137527276063 +2918 6 6.048738 0.048738002777099609 0.0023753929147005692 +2919 5 6.120949 1.1209487915039063 1.2565261931740679 +2920 4 5.38337946 1.3833794593811035 1.9137387286375542 +2921 6 5.487146 0.51285409927368164 0.2630193271418193 +2922 8 7.27026224 0.72973775863647461 0.53251719637978567 +2923 6 6.23462057 0.23462057113647461 0.055046812400405543 +2924 6 6.256033 0.25603294372558594 0.065552868272789055 +2925 5 5.70803 0.70803022384643555 0.50130679788003363 +2926 8 7.411671 0.58832883834838867 0.34613082203236445 +2927 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2928 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2929 6 6.256033 0.25603294372558594 0.065552868272789055 +2930 8 7.243917 0.75608301162719727 0.57166152047125252 +2931 8 7.411671 0.58832883834838867 0.34613082203236445 +2932 6 5.79003048 0.20996952056884766 0.044087199567911739 +2933 6 6.23462057 0.23462057113647461 0.055046812400405543 +2934 5 5.283217 0.28321695327758789 0.080211842623839402 +2935 4 4.40132046 0.40132045745849609 0.16105810957469657 +2936 5 5.679378 0.67937803268432617 0.46155451129402536 +2937 5 5.70803 0.70803022384643555 0.50130679788003363 +2938 8 7.24698639 0.75301361083984375 0.56702949811005965 +2939 8 7.24698639 0.75301361083984375 0.56702949811005965 +2940 6 6.015029 0.015028953552246094 0.00022586944487557048 +2941 5 5.612932 0.61293220520019531 0.37568588817157433 +2942 5 5.347385 0.34738492965698242 0.12067628935278663 +2943 8 7.24698639 0.75301361083984375 0.56702949811005965 +2944 6 6.015029 0.015028953552246094 0.00022586944487557048 +2945 8 7.686467 0.31353282928466797 0.098302835039248748 +2946 6 6.27776 0.27776002883911133 0.077150633620703957 +2947 6 6.27776 0.27776002883911133 0.077150633620703957 +2948 6 5.29857063 0.70142936706542969 0.4920031569818093 +2949 6 5.494495 0.50550508499145508 0.25553539095221822 +2950 5 4.77643776 0.22356224060058594 0.049980075422354275 +2951 5 5.552394 0.55239391326904297 0.30513903541668697 +2952 5 4.928295 0.071704864501953125 0.0051415875932434574 +2953 5 4.77643776 0.22356224060058594 0.049980075422354275 +2954 7 6.866023 0.13397693634033203 0.017949819471141382 +2955 5 6.01920748 1.0192074775695801 1.0387838823337461 +2956 6 5.89857435 0.1014256477355957 0.01028716201858515 +2957 6 6.41994429 0.41994428634643555 0.17635320363501705 +2958 5 5.552394 0.55239391326904297 0.30513903541668697 +2959 7 6.62191057 0.37808942794799805 0.14295161552604441 +2960 7 6.618574 0.38142585754394531 0.14548568480313406 +2961 6 6.2394104 0.239410400390625 0.057317339815199375 +2962 5 5.42872238 0.42872238159179688 0.18380288047774229 +2963 7 6.95440626 0.045593738555908203 0.0020787889955045102 +2964 5 5.79420662 0.79420661926269531 0.63076415408067987 +2965 8 7.7110405 0.28895950317382813 0.083497594474465586 +2966 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2967 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2968 5 5.54127026 0.54127025604248047 0.29297349007629236 +2969 6 6.31686449 0.3168644905090332 0.10040310534554919 +2970 5 5.54127026 0.54127025604248047 0.29297349007629236 +2971 5 5.045367 0.045366764068603516 0.002058143282056335 +2972 6 5.917624 0.082376003265380859 0.006785805913978038 +2973 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2974 6 5.935218 0.064782142639160156 0.0041967260049204924 +2975 6 5.877206 0.12279415130615234 0.015078403594998235 +2976 6 6.488263 0.48826313018798828 0.23840088430097239 +2977 6 5.50998831 0.49001169204711914 0.24011145834288072 +2978 6 5.50998831 0.49001169204711914 0.24011145834288072 +2979 7 6.82792854 0.17207145690917969 0.029608586282847682 +2980 7 6.935555 0.064445018768310547 0.0041531604440478986 +2981 7 6.40632153 0.59367847442626953 0.35245413099710277 +2982 6 5.90127659 0.098723411560058594 0.0097463119900567108 +2983 6 6.29355 0.29355001449584961 0.086171611010513516 +2984 6 5.86181259 0.13818740844726563 0.019095759853371419 +2985 7 6.436311 0.56368923187255859 0.31774555012907513 +2986 7 6.436311 0.56368923187255859 0.31774555012907513 +2987 7 6.436311 0.56368923187255859 0.31774555012907513 +2988 7 6.269313 0.73068714141845703 0.53390369863427622 +2989 6 6.10555744 0.10555744171142578 0.011142373500661051 +2990 7 7.20846272 0.20846271514892578 0.04345670360726217 +2991 7 6.710715 0.28928518295288086 0.083685917076081751 +2992 7 6.5014677 0.49853229522705078 0.24853444938435132 +2993 7 6.436311 0.56368923187255859 0.31774555012907513 +2994 7 6.436311 0.56368923187255859 0.31774555012907513 +2995 6 6.129989 0.1299891471862793 0.016897178386216183 +2996 8 6.42057562 1.5794243812561035 2.4945813761062254 +2997 6 6.217876 0.21787595748901367 0.047469932851754493 +2998 7 6.66316128 0.33683872222900391 0.11346032479286805 +2999 7 6.436311 0.56368923187255859 0.31774555012907513 +3000 7 6.436311 0.56368923187255859 0.31774555012907513 +3001 7 6.5014677 0.49853229522705078 0.24853444938435132 +3002 7 6.710715 0.28928518295288086 0.083685917076081751 +3003 7 6.269313 0.73068714141845703 0.53390369863427622 +3004 6 6.32833624 0.32833623886108398 0.1078046857494428 +3005 6 6.53760242 0.53760242462158203 0.28901636695900379 +3006 6 6.10555744 0.10555744171142578 0.011142373500661051 +3007 7 7.20846272 0.20846271514892578 0.04345670360726217 +3008 7 7.2333436 0.23334360122680664 0.054449236233494958 +3009 6 5.714875 0.28512477874755859 0.081296139455844241 +3010 5 5.49859047 0.49859046936035156 0.24859245613697567 +3011 6 6.578227 0.57822704315185547 0.33434651343213773 +3012 6 6.490192 0.49019193649291992 0.24028813460267884 +3013 6 6.142816 0.14281606674194336 0.02039642891963922 +3014 6 5.70586872 0.29413127899169922 0.086513209281292802 +3015 6 6.18539858 0.18539857864379883 0.034372632963140859 +3016 6 6.142816 0.14281606674194336 0.02039642891963922 +3017 6 6.595993 0.5959930419921875 0.35520770610310137 +3018 8 6.70484924 1.2951507568359375 1.6774154829327017 +3019 6 6.18539858 0.18539857864379883 0.034372632963140859 +3020 6 5.724778 0.27522182464599609 0.075747052761471423 +3021 4 4.71791 0.71790981292724609 0.51539449949723348 +3022 5 4.8001194 0.19988059997558594 0.039952254246600205 +3023 6 5.70586872 0.29413127899169922 0.086513209281292802 +3024 6 6.142816 0.14281606674194336 0.02039642891963922 +3025 7 6.297473 0.70252704620361328 0.49354425064757379 +3026 6 5.74832726 0.25167274475097656 0.063339170450490201 +3027 5 5.63797855 0.63797855377197266 0.40701663507297781 +3028 6 6.04139233 0.041392326354980469 0.0017133246810772107 +3029 8 7.32478333 0.6752166748046875 0.45591755793429911 +3030 8 7.32478333 0.6752166748046875 0.45591755793429911 +3031 6 5.770422 0.22957801818847656 0.052706066435348475 +3032 5 6.11206055 1.112060546875 1.2366786599159241 +3033 6 5.547751 0.45224905014038086 0.20452920335287672 +3034 6 5.473764 0.52623605728149414 0.27692438798317198 +3035 7 6.44003153 0.55996847152709961 0.31356468910439617 +3036 5 5.454294 0.45429420471191406 0.20638322443483048 +3037 6 5.60835171 0.39164829254150391 0.15338838505067542 +3038 6 6.35107 0.35106992721557617 0.12325009379514995 +3039 6 5.549563 0.45043706893920898 0.20289355307454571 +3040 5 5.781478 0.78147792816162109 0.61070775220377982 +3041 6 5.62197447 0.37802553176879883 0.14290330266908313 +3042 6 5.60835171 0.39164829254150391 0.15338838505067542 +3043 6 5.745906 0.25409412384033203 0.064563823770185991 +3044 6 5.62443 0.37556982040405273 0.14105268999833243 +3045 6 6.139705 0.13970518112182617 0.019517537632282256 +3046 6 6.6571207 0.65712070465087891 0.43180762048086763 +3047 5 6.00035667 1.0003566741943359 1.0007134756051528 +3048 6 5.87789154 0.12210845947265625 0.014910475874785334 +3049 5 5.17909861 0.17909860610961914 0.032076310710408507 +3050 4 4.05022049 0.050220489501953125 0.002522097565815784 +3051 5 5.17909861 0.17909860610961914 0.032076310710408507 +3052 7 6.18944025 0.81055974960327148 0.65700710767691817 +3053 5 5.895031 0.89503097534179688 0.80108044682128821 +3054 6 6.16691256 0.16691255569458008 0.027859801248496296 +3055 6 6.18159342 0.18159341812133789 0.032976169504991049 +3056 5 5.956998 0.95699787139892578 0.91584492586207489 +3057 5 6.58366 1.5836601257324219 2.5079793938348303 +3058 5 5.5251646 0.52516460418701172 0.27579786149090069 +3059 6 5.821914 0.1780858039855957 0.031714553581196014 +3060 5 5.609995 0.60999488830566406 0.37209376375903958 +3061 5 5.609995 0.60999488830566406 0.37209376375903958 +3062 8 7.084814 0.91518592834472656 0.83756528344019898 +3063 5 5.609995 0.60999488830566406 0.37209376375903958 +3064 5 5.29221535 0.29221534729003906 0.08538980919183814 +3065 6 6.29819 0.29819011688232422 0.088917345806294179 +3066 5 5.29221535 0.29221534729003906 0.08538980919183814 +3067 4 5.599751 1.5997509956359863 2.5592032480383295 +3068 6 6.56485462 0.56485462188720703 0.31906074386733962 +3069 8 6.26474047 1.7352595329284668 3.0111256466191207 +3070 8 7.084814 0.91518592834472656 0.83756528344019898 +3071 7 6.44469547 0.55530452728271484 0.30836311802067939 +3072 6 6.57061625 0.57061624526977539 0.32560289936577647 +3073 5 6.649056 1.6490559577941895 2.7193855519365115 +3074 5 6.186977 1.1869769096374512 1.4089141840124739 +3075 7 6.56810045 0.4318995475769043 0.18653721919713462 +3076 5 5.397916 0.39791584014892578 0.15833701584142545 +3077 5 5.5251646 0.52516460418701172 0.27579786149090069 +3078 5 6.315502 1.3155021667480469 1.7305459507188061 +3079 5 5.47873354 0.47873353958129883 0.22918580192003901 +3080 6 5.821914 0.1780858039855957 0.031714553581196014 +3081 5 5.609995 0.60999488830566406 0.37209376375903958 +3082 6 5.750258 0.24974203109741211 0.062371082096660757 +3083 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3084 6 6.36839533 0.36839532852172852 0.13571511807663228 +3085 6 5.86258459 0.13741540908813477 0.018882994654859431 +3086 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3087 3 5.453733 2.453732967376709 6.0208054751913096 +3088 6 6.26444435 0.26444435119628906 0.069930814879626269 +3089 7 6.818311 0.18168878555297852 0.033010814795716215 +3090 6 6.36839533 0.36839532852172852 0.13571511807663228 +3091 6 5.36129951 0.63870048522949219 0.40793830983238877 +3092 6 6.025925 0.025925159454345703 0.0006721138927332504 +3093 7 6.56711 0.43288993835449219 0.18739369872855605 +3094 6 5.42497349 0.57502651214599609 0.33065548967078939 +3095 6 5.42497349 0.57502651214599609 0.33065548967078939 +3096 7 6.43372345 0.56627655029296875 0.32066913141170517 +3097 5 5.12878942 0.12878942489624023 0.016586715965104304 +3098 7 6.50207567 0.4979243278503418 0.24792863626521466 +3099 7 6.64832 0.35167980194091797 0.12367868309320329 +3100 7 6.737263 0.26273679733276367 0.069030624672677732 +3101 6 6.020496 0.020495891571044922 0.00042008157129203028 +3102 6 5.56049442 0.43950557708740234 0.19316515229093056 +3103 7 6.56711 0.43288993835449219 0.18739369872855605 +3104 5 5.87965727 0.87965726852416992 0.77379691006740359 +3105 6 5.9182477 0.081752300262451172 0.0066834385982019739 +3106 6 6.025925 0.025925159454345703 0.0006721138927332504 +3107 6 5.901361 0.098639011383056641 0.0097296545666267775 +3108 5 5.305002 0.30500221252441406 0.093026349644787842 +3109 4 5.36367941 1.3636794090270996 1.8596215306044996 +3110 6 6.229444 0.22944402694702148 0.052644561501665521 +3111 7 6.483191 0.51680898666381836 0.26709152869648278 +3112 5 5.716676 0.71667623519897461 0.51362482609897597 +3113 6 5.562755 0.43724489212036133 0.19118309568534642 +3114 6 6.102161 0.10216093063354492 0.010436855747911977 +3115 6 6.102161 0.10216093063354492 0.010436855747911977 +3116 7 6.567311 0.43268918991088867 0.18721993506574108 +3117 7 6.483191 0.51680898666381836 0.26709152869648278 +3118 7 6.90226 0.09774017333984375 0.009553141484502703 +3119 5 4.711436 0.28856420516967773 0.083269300505207866 +3120 6 5.511379 0.48862123489379883 0.23875071118914093 +3121 5 5.716676 0.71667623519897461 0.51362482609897597 +3122 6 6.73026 0.73025989532470703 0.53327951471965207 +3123 5 5.64247 0.64246988296508789 0.41276755051717373 +3124 6 5.562755 0.43724489212036133 0.19118309568534642 +3125 5 5.879442 0.87944221496582031 0.7734186094639881 +3126 7 6.26043272 0.73956727981567383 0.54695976137395519 +3127 5 5.368305 0.36830520629882813 0.13564872498682234 +3128 6 6.38585234 0.38585233688354492 0.14888202587849264 +3129 6 6.175245 0.17524480819702148 0.030710742800010848 +3130 6 6.560212 0.56021213531494141 0.31383763655412622 +3131 5 5.25830126 0.2583012580871582 0.066719539929408711 +3132 6 6.102161 0.10216093063354492 0.010436855747911977 +3133 6 6.73824167 0.73824167251586914 0.54500076703902778 +3134 6 6.15627337 0.15627336502075195 0.02442136461490918 +3135 6 5.55375862 0.44624137878417969 0.19913136813920573 +3136 5 5.8716464 0.87164640426635742 0.75976745407047019 +3137 6 5.95852041 0.041479587554931641 0.0017205561837272398 +3138 6 6.225504 0.22550392150878906 0.050852018615842098 +3139 6 5.814783 0.18521690368652344 0.034305301411222899 +3140 6 5.55375862 0.44624137878417969 0.19913136813920573 +3141 7 5.85702229 1.1429777145385742 1.3063980559318225 +3142 6 5.999185 0.00081491470336914063 6.6408597376721445E-07 +3143 5 5.8716464 0.87164640426635742 0.75976745407047019 +3144 6 5.840115 0.15988492965698242 0.025563190731418217 +3145 6 5.840115 0.15988492965698242 0.025563190731418217 +3146 6 5.840115 0.15988492965698242 0.025563190731418217 +3147 6 5.802998 0.19700193405151367 0.038809762020036942 +3148 6 5.840115 0.15988492965698242 0.025563190731418217 +3149 6 5.802998 0.19700193405151367 0.038809762020036942 +3150 6 6.671808 0.67180776596069336 0.45132567440509774 +3151 6 5.840115 0.15988492965698242 0.025563190731418217 +3152 6 6.17364931 0.17364931106567383 0.030154083233583151 +3153 6 6.669533 0.66953277587890625 0.44827413797611371 +3154 6 6.88131046 0.88131046295166016 0.77670813210806955 +3155 7 6.8698163 0.13018369674682617 0.016947794898669599 +3156 5 5.460132 0.46013212203979492 0.21172156973284473 +3157 7 6.8698163 0.13018369674682617 0.016947794898669599 +3158 7 6.9617424 0.038257598876953125 0.001463643871829845 +3159 6 6.20943069 0.20943069458007813 0.043861215832293965 +3160 6 5.582661 0.41733884811401367 0.17417171414513177 +3161 5 5.460132 0.46013212203979492 0.21172156973284473 +3162 7 6.8698163 0.13018369674682617 0.016947794898669599 +3163 7 6.9617424 0.038257598876953125 0.001463643871829845 +3164 6 5.9588995 0.041100502014160156 0.0016892512658159831 +3165 6 5.76335 0.23664999008178711 0.056003217805709937 +3166 6 6.567506 0.56750583648681641 0.3220628744466012 +3167 7 6.727232 0.27276802062988281 0.074402393078344176 +3168 6 6.314619 0.31461906433105469 0.098985155640548328 +3169 6 6.04131937 0.041319370269775391 0.0017072903594907984 +3170 6 5.893462 0.10653781890869141 0.011350306857821124 +3171 6 6.27120447 0.27120447158813477 0.073551865409399397 +3172 8 7.01964664 0.98035335540771484 0.96109270145916526 +3173 8 7.137502 0.86249780654907227 0.74390246630196089 +3174 8 7.38588428 0.61411571502685547 0.37713811144294596 +3175 6 5.956482 0.04351806640625 0.0018938221037387848 +3176 6 6.27120447 0.27120447158813477 0.073551865409399397 +3177 5 5.549956 0.54995584487915039 0.30245143131674013 +3178 6 6.112071 0.11207103729248047 0.012559917399812548 +3179 4 5.460645 1.4606451988220215 2.1334843968418227 +3180 6 6.260092 0.26009178161621094 0.067647734864294762 +3181 6 6.149753 0.14975309371948242 0.022425989078556086 +3182 5 5.53198862 0.53198862075805664 0.28301189261605941 +3183 6 6.260092 0.26009178161621094 0.067647734864294762 +3184 7 6.457229 0.5427708625793457 0.29460020926512698 +3185 6 6.27707863 0.27707862854003906 0.076772566393628949 +3186 4 4.737908 0.73790788650512695 0.54450804896646332 +3187 7 6.44776058 0.55223941802978516 0.3049683748258758 +3188 8 6.308009 1.691990852355957 2.862833044456238 +3189 5 6.036736 1.036736011505127 1.0748215575515587 +3190 7 6.996594 0.0034060478210449219 1.160116175924486E-05 +3191 6 6.10141 0.101409912109375 0.010283970274031162 +3192 6 6.149753 0.14975309371948242 0.022425989078556086 +3193 5 5.53198862 0.53198862075805664 0.28301189261605941 +3194 5 5.19183826 0.19183826446533203 0.036801919713070674 +3195 6 6.2820797 0.28207969665527344 0.079568955265131081 +3196 7 6.61394024 0.38605976104736328 0.14904213909994724 +3197 6 6.402557 0.4025568962097168 0.1620520546860007 +3198 7 6.61394024 0.38605976104736328 0.14904213909994724 +3199 7 6.70577955 0.2942204475402832 0.08656567175080454 +3200 7 6.81074572 0.1892542839050293 0.035817183976405431 +3201 6 6.402557 0.4025568962097168 0.1620520546860007 +3202 7 6.84895468 0.15104532241821289 0.022814689424421886 +3203 7 6.61394024 0.38605976104736328 0.14904213909994724 +3204 5 5.48264647 0.48264646530151367 0.23294761046804524 +3205 7 6.76702261 0.23297739028930664 0.054278464386015912 +3206 7 6.777936 0.22206401824951172 0.049312428201119474 +3207 6 5.86778831 0.13221168518066406 0.017479929698311025 +3208 5 6.073227 1.0732269287109375 1.1518160405103117 +3209 5 5.365314 0.36531400680541992 0.13345432356823039 +3210 5 5.175463 0.17546319961547852 0.03078733441930126 +3211 6 6.193272 0.19327211380004883 0.037354109972739025 +3212 5 5.83470726 0.83470726013183594 0.69673621011679643 +3213 6 6.04824352 0.048243522644042969 0.0023274374771062867 +3214 6 6.07760859 0.077608585357666016 0.0060230925212181319 +3215 6 6.147291 0.14729118347167969 0.021694692728488008 +3216 5 5.89868069 0.89868068695068359 0.80762697709815257 +3217 5 5.175463 0.17546319961547852 0.03078733441930126 +3218 4 4.90641737 0.9064173698425293 0.82159244835224854 +3219 7 7.13684654 0.13684654235839844 0.018726976155448938 +3220 5 5.536415 0.53641510009765625 0.28774115961277857 +3221 6 6.02255154 0.022551536560058594 0.00050857180121965939 +3222 6 6.53903437 0.53903436660766602 0.29055804838412769 +3223 6 6.193272 0.19327211380004883 0.037354109972739025 +3224 6 6.168674 0.16867399215698242 0.028450915630173768 +3225 7 6.79089451 0.20910549163818359 0.043725106633246469 +3226 6 5.96571875 0.034281253814697266 0.0011752043631076958 +3227 6 5.392663 0.60733699798583984 0.36885822912245203 +3228 6 5.51099634 0.48900365829467773 0.23912457782557794 +3229 7 6.381079 0.61892080307006836 0.38306296047289834 +3230 6 5.647422 0.35257816314697266 0.12431136112809327 +3231 6 6.31671429 0.31671428680419922 0.10030793946589256 +3232 5 5.90930843 0.90930843353271484 0.82684182729371969 +3233 6 6.274285 0.27428483963012695 0.075232173250924461 +3234 6 5.78508043 0.2149195671081543 0.046190420325956438 +3235 6 6.168674 0.16867399215698242 0.028450915630173768 +3236 6 6.614271 0.61427116394042969 0.37732906284873025 +3237 7 6.357264 0.64273595809936523 0.41310951183390898 +3238 5 5.51993227 0.51993227005004883 0.2703295654393969 +3239 7 6.6237483 0.3762516975402832 0.14156533990194475 +3240 6 6.074398 0.074398040771484375 0.0055350684706354514 +3241 7 6.13906431 0.86093568801879883 0.74121025890440251 +3242 6 6.95612049 0.95612049102783203 0.91416639336330263 +3243 7 6.6237483 0.3762516975402832 0.14156533990194475 +3244 7 6.856632 0.14336776733398438 0.020554316710331477 +3245 5 5.51993227 0.51993227005004883 0.2703295654393969 +3246 6 6.32359934 0.32359933853149414 0.10471653189802055 +3247 6 6.28690243 0.28690242767333984 0.082313003004856 +3248 7 6.317185 0.6828150749206543 0.46623642653889874 +3249 7 6.357264 0.64273595809936523 0.41310951183390898 +3250 6 6.52457333 0.52457332611083984 0.27517717446698953 +3251 6 5.6693964 0.33060359954833984 0.10929874003431905 +3252 8 6.88262463 1.117375373840332 1.2485277260648218 +3253 8 6.66403246 1.3359675407409668 1.7848092699134668 +3254 5 5.88028955 0.88028955459594727 0.77490969993073122 +3255 6 6.133121 0.13312101364135742 0.017721204272902469 +3256 6 6.133121 0.13312101364135742 0.017721204272902469 +3257 6 6.133121 0.13312101364135742 0.017721204272902469 +3258 6 6.133121 0.13312101364135742 0.017721204272902469 +3259 6 6.133121 0.13312101364135742 0.017721204272902469 +3260 6 6.133121 0.13312101364135742 0.017721204272902469 +3261 5 6.556014 1.5560140609741211 2.4211797579491758 +3262 7 6.204937 0.79506301879882813 0.63212520386150572 +3263 8 6.869174 1.1308259963989258 1.2787674341316233 +3264 6 5.47448063 0.52551937103271484 0.27617060933062021 +3265 3 4.56640053 1.5664005279541016 2.4536106139748881 +3266 6 6.52271175 0.52271175384521484 0.27322757760794047 +3267 6 5.576181 0.42381906509399414 0.17962259993714724 +3268 6 6.648331 0.6483311653137207 0.42033329991704704 +3269 5 5.18465376 0.18465375900268555 0.034097010713821874 +3270 5 5.78017 0.78016996383666992 0.60866517247291085 +3271 7 6.688666 0.31133413314819336 0.096928942463136991 +3272 7 6.319661 0.68033885955810547 0.46286096382482356 +3273 7 6.793628 0.20637178421020508 0.04258931331810345 +3274 5 6.479464 1.479464054107666 2.1888138873966909 +3275 4 4.61452627 0.61452627182006836 0.37764253875707254 +3276 8 6.66012573 1.339874267578125 1.7952630529180169 +3277 7 6.210549 0.78945112228393555 0.62323307447536536 +3278 5 5.18465376 0.18465375900268555 0.034097010713821874 +3279 6 6.091817 0.091816902160644531 0.0084303435223773704 +3280 5 5.78017 0.78016996383666992 0.60866517247291085 +3281 6 6.48334169 0.48334169387817383 0.2336191930410223 +3282 7 6.691475 0.30852508544921875 0.095187728351447731 +3283 6 5.847695 0.15230512619018555 0.023196851463808343 +3284 6 6.751086 0.75108623504638672 0.56413053247615608 +3285 7 6.57282352 0.42717647552490234 0.18247974124187749 +3286 7 6.57282352 0.42717647552490234 0.18247974124187749 +3287 7 6.57282352 0.42717647552490234 0.18247974124187749 +3288 6 5.847695 0.15230512619018555 0.023196851463808343 +3289 5 5.367988 0.36798810958862305 0.13541524879860845 +3290 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3291 8 7.53098869 0.46901130676269531 0.21997160587125109 +3292 5 5.36597061 0.36597061157226563 0.13393448853457812 +3293 7 6.54328 0.45671987533569336 0.20859304452665128 +3294 6 5.946947 0.053052902221679688 0.0028146104341431055 +3295 5 5.36597061 0.36597061157226563 0.13393448853457812 +3296 5 5.367988 0.36798810958862305 0.13541524879860845 +3297 5 5.321794 0.32179403305053711 0.10355139970693017 +3298 6 6.76998663 0.76998662948608398 0.59287940958733998 +3299 7 6.75744724 0.24255275726318359 0.058831840055972862 +3300 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3301 8 7.53098869 0.46901130676269531 0.21997160587125109 +3302 6 6.59227753 0.59227752685546875 0.35079266881803051 +3303 7 7.045722 0.045722007751464844 0.0020905019928250113 +3304 7 6.83139038 0.168609619140625 0.028429203666746616 +3305 7 6.95902634 0.040973663330078125 0.0016788410866865888 +3306 7 6.83139038 0.168609619140625 0.028429203666746616 +3307 3 4.19923735 1.1992373466491699 1.4381702135981413 +3308 6 5.727543 0.27245712280273438 0.07423288376594428 +3309 7 6.90530252 0.094697475433349609 0.0089676118534498528 +3310 7 6.746764 0.25323581695556641 0.064128378989153134 +3311 7 6.39761066 0.60238933563232422 0.36287291168355296 +3312 7 6.65214872 0.34785127639770508 0.12100051049151261 +3313 7 6.506664 0.49333620071411133 0.24338060693503394 +3314 6 5.32326746 0.67673254013061523 0.45796693087163476 +3315 7 6.48382568 0.51617431640625 0.26643592491745949 +3316 6 6.051728 0.051727771759033203 0.002675762371154633 +3317 6 6.13208 0.132080078125 0.017445147037506104 +3318 7 6.81349325 0.18650674819946289 0.034784767123937854 +3319 5 5.759015 0.75901508331298828 0.57610389669662254 +3320 5 5.567959 0.56795883178710938 0.322577234604978 +3321 6 6.4950285 0.49502849578857422 0.24505321164269844 +3322 7 6.713452 0.28654813766479492 0.082109835199162262 +3323 6 6.312879 0.31287908554077148 0.0978933221688294 +3324 6 6.12515831 0.12515830993652344 0.015664602546166861 +3325 7 6.8268137 0.17318630218505859 0.029993495264534431 +3326 5 5.93371534 0.9337153434753418 0.87182434264127551 +3327 7 6.38604975 0.61395025253295898 0.37693491258528411 +3328 5 6.126393 1.1263928413391113 1.2687608330199964 +3329 6 6.249068 0.24906778335571289 0.062034760705728331 +3330 6 5.88103676 0.11896324157714844 0.014152252846542979 +3331 6 5.950097 0.049902915954589844 0.0024903010207708576 +3332 7 6.466661 0.53333902359008789 0.28445051408402833 +3333 6 6.00232363 0.0023236274719238281 5.3992446282791207E-06 +3334 6 6.16842842 0.16842842102050781 0.028368133007461438 +3335 6 5.741354 0.25864601135253906 0.066897759188577766 +3336 6 5.741354 0.25864601135253906 0.066897759188577766 +3337 6 5.741354 0.25864601135253906 0.066897759188577766 +3338 6 5.58105755 0.41894245147705078 0.17551277764960105 +3339 6 5.836304 0.1636958122253418 0.026796318940114361 +3340 6 6.23716974 0.23716974258422852 0.056249486797469217 +3341 6 5.836304 0.1636958122253418 0.026796318940114361 +3342 5 6.093224 1.093224048614502 1.1951388204690829 +3343 7 5.741354 1.2586460113525391 1.5841897818936559 +3344 6 5.741354 0.25864601135253906 0.066897759188577766 +3345 6 5.95065975 0.049340248107910156 0.0024344600833501318 +3346 6 5.890304 0.1096959114074707 0.012033192979515661 +3347 6 5.88841 0.11158990859985352 0.012452307701323662 +3348 6 5.58105755 0.41894245147705078 0.17551277764960105 +3349 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3350 6 6.129016 0.12901592254638672 0.016645108270495257 +3351 6 6.40267134 0.40267133712768555 0.16214420574419819 +3352 6 6.60754 0.60754013061523438 0.36910501030797604 +3353 6 6.53815842 0.53815841674804688 0.2896144815167645 +3354 7 6.82739 0.17260980606079102 0.029794145148343887 +3355 6 6.443502 0.44350194931030273 0.19669397904203834 +3356 6 6.09565973 0.095659732818603516 0.0091507844829266105 +3357 7 6.59177446 0.40822553634643555 0.16664808852533497 +3358 6 6.60754 0.60754013061523438 0.36910501030797604 +3359 6 6.53815842 0.53815841674804688 0.2896144815167645 +3360 7 6.087488 0.91251182556152344 0.83267783178962418 +3361 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3362 6 6.129016 0.12901592254638672 0.016645108270495257 +3363 6 6.40267134 0.40267133712768555 0.16214420574419819 +3364 6 6.03455544 0.034555435180664063 0.0011940781005250756 +3365 7 6.484774 0.51522588729858398 0.26545771494261317 +3366 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3367 6 6.4610076 0.46100759506225586 0.21252800270508487 +3368 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3369 7 6.464667 0.53533315658569336 0.28658158854000249 +3370 6 6.4610076 0.46100759506225586 0.21252800270508487 +3371 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3372 6 6.33648157 0.33648157119750977 0.11321984775554483 +3373 7 6.817031 0.18296909332275391 0.033477689111350628 +3374 5 5.506074 0.50607395172119141 0.25611084461070277 +3375 6 5.95384169 0.046158313751220703 0.0021305899283561303 +3376 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3377 6 6.000979 0.00097894668579101563 9.5833661362121347E-07 +3378 8 6.860549 1.1394510269165039 1.2983486427410753 +3379 5 5.253192 0.25319194793701172 0.064106162500138453 +3380 7 6.84210443 0.15789556503295898 0.02493100945707738 +3381 7 6.22156429 0.77843570709228516 0.60596215007626597 +3382 7 6.84210443 0.15789556503295898 0.02493100945707738 +3383 6 6.42233229 0.4223322868347168 0.1783645605030415 +3384 6 6.102439 0.10243892669677734 0.010493733702787722 +3385 6 6.48315859 0.48315858840942383 0.23344222155378702 +3386 8 6.860549 1.1394510269165039 1.2983486427410753 +3387 5 5.253192 0.25319194793701172 0.064106162500138453 +3388 6 6.038348 0.038348197937011719 0.0014705842850162298 +3389 7 6.234303 0.76569700241088867 0.58629189950102045 +3390 6 6.80156469 0.80156469345092773 0.64250595778707975 +3391 8 6.80156469 1.1984353065490723 1.4362471839833688 +3392 6 6.67221975 0.67221975326538086 0.45187939668016952 +3393 6 6.48170137 0.48170137405395508 0.23203621376546835 +3394 5 5.35709572 0.35709571838378906 0.12751735208803439 +3395 5 5.31360435 0.31360435485839844 0.098347691386152292 +3396 6 5.980254 0.019745826721191406 0.00038989767290331656 +3397 6 6.015499 0.015499114990234375 0.00024022256548050791 +3398 5 5.31912756 0.31912755966186523 0.10184239933573735 +3399 6 6.43055 0.43055009841918945 0.18537338724877372 +3400 6 5.44203234 0.5579676628112793 0.31132791274308147 +3401 5 5.95098972 0.95098972320556641 0.90438145364259981 +3402 6 5.44203234 0.5579676628112793 0.31132791274308147 +3403 5 5.68300056 0.68300056457519531 0.46648977121003554 +3404 6 5.44582033 0.55417966842651367 0.30711510489732063 +3405 6 6.039283 0.039282798767089844 0.0015431382789756753 +3406 6 6.43055 0.43055009841918945 0.18537338724877372 +3407 5 5.31912756 0.31912755966186523 0.10184239933573735 +3408 6 5.49072456 0.50927543640136719 0.25936147012180299 +3409 3 5.471312 2.4713120460510254 6.1073832289569054 +3410 7 6.274226 0.72577381134033203 0.52674762522747187 +3411 6 6.147217 0.147216796875 0.02167278528213501 +3412 6 5.83013964 0.1698603630065918 0.028852542920731139 +3413 6 5.648756 0.35124397277832031 0.12337232841309742 +3414 7 6.274226 0.72577381134033203 0.52674762522747187 +3415 7 6.80660629 0.19339370727539063 0.037401126013719477 +3416 6 5.683732 0.31626796722412109 0.10002542709207773 +3417 4 5.429571 1.4295711517333984 2.0436736778683553 +3418 6 5.683732 0.31626796722412109 0.10002542709207773 +3419 7 6.80660629 0.19339370727539063 0.037401126013719477 +3420 5 5.32444048 0.32444047927856445 0.10526162459450461 +3421 8 6.66276455 1.3372354507446289 1.7881986507281908 +3422 8 6.97727 1.0227298736572266 1.0459763944709266 +3423 5 5.98238659 0.98238658905029297 0.9650834103458692 +3424 6 6.4767437 0.47674369812011719 0.22728455369724543 +3425 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3426 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3427 6 6.39636 0.39635992050170898 0.15710118658012107 +3428 6 6.4767437 0.47674369812011719 0.22728455369724543 +3429 5 5.98238659 0.98238658905029297 0.9650834103458692 +3430 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3431 6 5.904046 0.095953941345214844 0.0092071588596809306 +3432 5 5.87699652 0.87699651718139648 0.76912289114829946 +3433 7 6.87964058 0.12035942077636719 0.014486390169622609 +3434 6 6.014669 0.014668941497802734 0.00021517784466595913 +3435 6 6.30498 0.30497980117797852 0.093012679126559306 +3436 6 6.01969671 0.019696712493896484 0.00038796048306721787 +3437 5 5.11366749 0.11366748809814453 0.012920297850541829 +3438 5 5.14675951 0.1467595100402832 0.021538353787263986 +3439 5 5.11366749 0.11366748809814453 0.012920297850541829 +3440 5 6.2240715 1.2240715026855469 1.4983510436868528 +3441 5 6.060459 1.0604591369628906 1.1245735811680788 +3442 7 6.419583 0.58041715621948242 0.33688407523391106 +3443 6 5.80606031 0.1939396858215332 0.037612601736555007 +3444 5 5.14675951 0.1467595100402832 0.021538353787263986 +3445 8 7.46482372 0.53517627716064453 0.28641364763552701 +3446 6 5.554438 0.44556188583374023 0.19852539410771897 +3447 6 5.911977 0.088023185729980469 0.0077480812260546372 +3448 7 6.88186169 0.11813831329345703 0.013956661067823006 +3449 8 7.46482372 0.53517627716064453 0.28641364763552701 +3450 7 6.343062 0.65693807601928711 0.43156763572392265 +3451 7 6.343062 0.65693807601928711 0.43156763572392265 +3452 5 5.21926546 0.21926546096801758 0.04807734237351724 +3453 6 6.287645 0.28764486312866211 0.082739567284306759 +3454 5 5.663148 0.66314792633056641 0.43976517219653033 +3455 6 6.118511 0.11851119995117188 0.014044904513866641 +3456 5 5.21130943 0.21130943298339844 0.044651676467765355 +3457 7 6.68455458 0.3154454231262207 0.099505814971280415 +3458 7 6.98832464 0.011675357818603516 0.00013631398019242624 +3459 6 5.715628 0.28437185287475586 0.080867350707421792 +3460 6 6.013219 0.013218879699707031 0.00017473878051532665 +3461 8 6.982139 1.0178608894348145 1.0360407902410316 +3462 6 6.62252235 0.62252235412597656 0.38753408138654777 +3463 7 6.795649 0.20435094833374023 0.041759310084898971 +3464 5 5.5751667 0.57516670227050781 0.33081673540073098 +3465 6 6.67814827 0.67814826965332031 0.45988507563379244 +3466 6 6.62252235 0.62252235412597656 0.38753408138654777 +3467 5 5.500977 0.5009770393371582 0.25097799394302456 +3468 8 6.840452 1.1595478057861328 1.3445511139034352 +3469 6 5.715628 0.28437185287475586 0.080867350707421792 +3470 8 6.982139 1.0178608894348145 1.0360407902410316 +3471 6 6.013219 0.013218879699707031 0.00017473878051532665 +3472 6 6.01919746 0.019197463989257813 0.00036854262361885048 +3473 8 7.03968 0.96031999588012695 0.92221449448720705 +3474 6 5.61084366 0.38915634155273438 0.15144265817070846 +3475 6 5.274944 0.72505617141723633 0.52570645171022079 +3476 8 7.433511 0.56648921966552734 0.32091003599725809 +3477 7 6.277657 0.72234296798706055 0.52177936340035558 +3478 6 5.274944 0.72505617141723633 0.52570645171022079 +3479 7 7.070361 0.070361137390136719 0.0049506896548336954 +3480 8 7.03968 0.96031999588012695 0.92221449448720705 +3481 5 5.62201643 0.62201642990112305 0.38690443906693872 +3482 8 7.16506624 0.83493375778198242 0.69711437988394209 +3483 7 6.988081 0.011919021606445313 0.0001420630760549102 +3484 8 7.433511 0.56648921966552734 0.32091003599725809 +3485 7 5.922049 1.0779509544372559 1.1619782601721909 +3486 6 5.938876 0.061123847961425781 0.0037361247896114946 +3487 6 5.61084366 0.38915634155273438 0.15144265817070846 +3488 6 5.78829956 0.211700439453125 0.044817076064646244 +3489 8 5.86692142 2.1330785751342773 4.5500242076968789 +3490 7 6.277657 0.72234296798706055 0.52177936340035558 +3491 6 5.543023 0.45697689056396484 0.2088278785095099 +3492 7 6.94785261 0.052147388458251953 0.002719350123015829 +3493 7 6.94785261 0.052147388458251953 0.002719350123015829 +3494 6 6.556063 0.55606317520141602 0.30920625481508068 +3495 7 6.27423429 0.72576570510864258 0.52673585871184514 +3496 7 6.67335939 0.32664060592651367 0.10669408544004 +3497 6 6.202401 0.20240116119384766 0.040966230052617902 +3498 6 5.972077 0.027923107147216797 0.00077969991275494976 +3499 7 7.010567 0.010567188262939453 0.00011166546778440534 +3500 7 6.94785261 0.052147388458251953 0.002719350123015829 +3501 6 6.556063 0.55606317520141602 0.30920625481508068 +3502 5 5.308975 0.3089752197265625 0.095465686405077577 +3503 7 6.563628 0.43637180328369141 0.19042035070106067 +3504 7 6.889004 0.11099576950073242 0.012320060847059722 +3505 7 6.65556574 0.34443426132202148 0.11863496037244659 +3506 6 6.23850346 0.23850345611572266 0.056883898579144443 +3507 7 6.84581852 0.15418148040771484 0.023771928900714556 +3508 5 5.308975 0.3089752197265625 0.095465686405077577 +3509 6 5.449322 0.55067777633666992 0.30324601335109946 +3510 6 6.24513245 0.2451324462890625 0.060089916223660111 +3511 7 6.18416262 0.81583738327026367 0.6655906359412711 +3512 6 6.517426 0.5174260139465332 0.26772967990859797 +3513 6 6.079972 0.079971790313720703 0.0063954872459817125 +3514 6 6.457934 0.45793390274047852 0.20970345927912604 +3515 7 6.49270153 0.50729846954345703 0.2573517372011338 +3516 7 6.91192055 0.088079452514648438 0.007757989955280209 +3517 7 6.699911 0.30008888244628906 0.090053337367862696 +3518 5 5.56025028 0.56025028228759766 0.31388037880333286 +3519 7 6.91017151 0.0898284912109375 0.0080691578332334757 +3520 5 5.1707406 0.17074060440063477 0.02915235399109406 +3521 7 6.501419 0.4985809326171875 0.24858294636942446 +3522 5 5.311646 0.3116459846496582 0.097123219748254996 +3523 5 5.1707406 0.17074060440063477 0.02915235399109406 +3524 6 6.429056 0.42905616760253906 0.18408919495777809 +3525 6 6.429056 0.42905616760253906 0.18408919495777809 +3526 6 5.7761054 0.22389459609985352 0.050128790162716541 +3527 6 5.709012 0.29098796844482422 0.084673997779646015 +3528 4 4.35001 0.35000991821289063 0.12250694284739438 +3529 7 6.84373856 0.15626144409179688 0.02441763890965376 +3530 5 5.494679 0.49467897415161133 0.24470728746769055 +3531 5 5.262818 0.2628178596496582 0.069073227350827437 +3532 6 5.934386 0.065614223480224609 0.0043052263229128584 +3533 6 5.83779144 0.16220855712890625 0.026311616005841643 +3534 5 5.494679 0.49467897415161133 0.24470728746769055 +3535 5 5.262818 0.2628178596496582 0.069073227350827437 +3536 6 6.208285 0.20828485488891602 0.043382580776096802 +3537 5 5.483639 0.48363876342773438 0.23390645348990802 +3538 7 6.782946 0.21705389022827148 0.047112391263226527 +3539 6 6.26574755 0.2657475471496582 0.07062175881605981 +3540 6 6.6306076 0.63060760498046875 0.39766595145920292 +3541 6 6.299932 0.29993200302124023 0.089959206436333261 +3542 6 5.786514 0.2134861946105957 0.045576355289313142 +3543 6 6.21291733 0.21291732788085938 0.045333788511925377 +3544 6 6.21291733 0.21291732788085938 0.045333788511925377 +3545 6 6.42701149 0.42701148986816406 0.18233881247942918 +3546 6 5.786514 0.2134861946105957 0.045576355289313142 +3547 6 6.42701149 0.42701148986816406 0.18233881247942918 +3548 6 6.46981049 0.46981048583984375 0.22072189260507002 +3549 6 6.21291733 0.21291732788085938 0.045333788511925377 +3550 6 6.20411634 0.2041163444519043 0.041663482072408442 +3551 6 5.8129344 0.18706560134887695 0.034993539208016955 +3552 6 5.8129344 0.18706560134887695 0.034993539208016955 +3553 6 5.8129344 0.18706560134887695 0.034993539208016955 +3554 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3555 6 6.012086 0.012085914611816406 0.00014606933200411731 +3556 7 6.29893255 0.70106744766235352 0.49149556617180679 +3557 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3558 6 5.8129344 0.18706560134887695 0.034993539208016955 +3559 4 4.42683029 0.42683029174804688 0.18218409795372281 +3560 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3561 5 4.954984 0.045015811920166016 0.0020264233228317607 +3562 6 6.85508347 0.85508346557617188 0.73116773310175631 +3563 5 4.954984 0.045015811920166016 0.0020264233228317607 +3564 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3565 6 5.82309675 0.17690324783325195 0.031294759093952962 +3566 6 6.042418 0.042418003082275391 0.0017992869854879245 +3567 6 6.221795 0.22179508209228516 0.049193058440323512 +3568 7 6.357106 0.64289379119873047 0.41331242676187685 +3569 6 5.82309675 0.17690324783325195 0.031294759093952962 +3570 6 6.221795 0.22179508209228516 0.049193058440323512 +3571 4 4.23669052 0.23669052124023438 0.05602240284497384 +3572 6 6.042418 0.042418003082275391 0.0017992869854879245 +3573 6 6.055631 0.055631160736083984 0.0030948260448440124 +3574 6 5.628368 0.37163209915161133 0.13811041711983307 +3575 7 6.198657 0.80134296417236328 0.6421505462285495 +3576 5 5.53625536 0.5362553596496582 0.28756981075298427 +3577 7 6.521952 0.47804784774780273 0.22852974473630638 +3578 4 4.71375465 0.71375465393066406 0.50944570600768202 +3579 7 6.520844 0.4791560173034668 0.22959048891812017 +3580 5 5.53965044 0.53965044021606445 0.29122259762539215 +3581 7 6.64749527 0.35250473022460938 0.12425958483072463 +3582 6 6.36762857 0.36762857437133789 0.13515076869430231 +3583 6 5.5800705 0.41992950439453125 0.17634078866103664 +3584 7 6.520844 0.4791560173034668 0.22959048891812017 +3585 7 6.106952 0.89304780960083008 0.79753439023284045 +3586 7 6.386778 0.61322212219238281 0.37604137114612968 +3587 6 5.889993 0.11000680923461914 0.012101498077981887 +3588 6 5.889993 0.11000680923461914 0.012101498077981887 +3589 6 5.889993 0.11000680923461914 0.012101498077981887 +3590 7 6.43335152 0.56664848327636719 0.32109050359940738 +3591 5 5.422166 0.42216587066650391 0.1782240223556073 +3592 7 6.39903641 0.60096359252929688 0.36115723954571877 +3593 7 6.386778 0.61322212219238281 0.37604137114612968 +3594 7 6.21197128 0.78802871704101563 0.62098925888130907 +3595 7 6.384263 0.61573696136474609 0.37913200559069082 +3596 7 6.355336 0.64466381072998047 0.41559142886490008 +3597 6 6.1302495 0.1302495002746582 0.016964932321798187 +3598 7 6.663735 0.33626508712768555 0.11307420882098995 +3599 6 5.54587364 0.45412635803222656 0.20623074905961403 +3600 6 6.097955 0.097955226898193359 0.0095952264766765438 +3601 7 6.593367 0.40663290023803711 0.16535031555599744 +3602 6 6.470431 0.47043085098266602 0.22130518555627532 +3603 7 6.99491072 0.0050892829895019531 2.5900801347233937E-05 +3604 6 6.13144875 0.13144874572753906 0.017278772753343219 +3605 5 5.19285 0.19285011291503906 0.037191166051343316 +3606 5 5.31416941 0.31416940689086914 0.098702416226160494 +3607 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3608 6 6.187198 0.18719816207885742 0.035043151885702173 +3609 6 6.187198 0.18719816207885742 0.035043151885702173 +3610 5 5.19285 0.19285011291503906 0.037191166051343316 +3611 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3612 6 5.98245859 0.017541408538818359 0.00030770101352572965 +3613 6 6.187198 0.18719816207885742 0.035043151885702173 +3614 5 5.31416941 0.31416940689086914 0.098702416226160494 +3615 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3616 5 5.17883968 0.17883968353271484 0.031983632406081597 +3617 5 5.800092 0.80009222030639648 0.64014756099481929 +3618 7 5.956605 1.0433950424194336 1.0886732145454516 +3619 6 5.938953 0.061047077178955078 0.0037267456320932979 +3620 7 6.640628 0.35937213897705078 0.1291483342729407 +3621 7 5.956605 1.0433950424194336 1.0886732145454516 +3622 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3623 6 5.938953 0.061047077178955078 0.0037267456320932979 +3624 7 6.782224 0.21777582168579102 0.047426308510921444 +3625 5 5.17883968 0.17883968353271484 0.031983632406081597 +3626 5 5.800092 0.80009222030639648 0.64014756099481929 +3627 5 5.25973225 0.25973224639892578 0.067460839819432294 +3628 6 5.25973225 0.74026775360107422 0.54799634702158073 +3629 6 5.29488373 0.70511627197265625 0.49718895700061694 +3630 6 5.900844 0.099155902862548828 0.0098318930724872189 +3631 6 5.900844 0.099155902862548828 0.0098318930724872189 +3632 6 5.788138 0.21186208724975586 0.044885544013823164 +3633 6 5.900844 0.099155902862548828 0.0098318930724872189 +3634 7 6.45650148 0.54349851608276367 0.29539063698416612 +3635 6 6.089077 0.089076995849609375 0.0079347111895913258 +3636 7 6.637489 0.36251115798950195 0.13141433966688965 +3637 7 6.28777552 0.71222448348999023 0.50726371488258337 +3638 7 6.76056433 0.23943567276000977 0.057329441390038482 +3639 6 6.234292 0.23429203033447266 0.054892755478249455 +3640 6 6.357985 0.35798501968383789 0.1281532743180378 +3641 6 5.833136 0.16686391830444336 0.027843567231911948 +3642 6 5.833136 0.16686391830444336 0.027843567231911948 +3643 6 6.357985 0.35798501968383789 0.1281532743180378 +3644 7 5.92905951 1.0709404945373535 1.1469135428399113 +3645 6 6.23142 0.23142004013061523 0.053555234974055566 +3646 7 5.85718 1.142819881439209 1.3060372814127277 +3647 7 6.691976 0.30802392959594727 0.094878741203729078 +3648 5 6.03854036 1.0385403633117676 1.0785660862277382 +3649 6 6.512135 0.51213502883911133 0.26228228776403739 +3650 4 4.85898256 0.85898256301879883 0.7378510435703447 +3651 6 5.253411 0.74658918380737305 0.55739540937815946 +3652 6 5.90696764 0.093032360076904297 0.0086550200214787765 +3653 6 5.253411 0.74658918380737305 0.55739540937815946 +3654 6 6.11544943 0.11544942855834961 0.01332857055444947 +3655 7 7.151361 0.15136098861694336 0.022910148875098457 +3656 7 6.62748051 0.37251949310302734 0.13877077274173644 +3657 8 6.869378 1.1306219100952148 1.2783059035873521 +3658 7 6.2651124 0.73488759994506836 0.54005978455302284 +3659 8 7.29730844 0.70269155502319336 0.49377542150091358 +3660 8 7.314732 0.68526792526245117 0.46959212939350436 +3661 6 6.14659071 0.1465907096862793 0.021488836166327019 +3662 4 4.47665358 0.4766535758972168 0.22719863141560381 +3663 6 6.59426832 0.5942683219909668 0.35315483852195939 +3664 8 7.26825142 0.73174858093261719 0.53545598569689901 +3665 8 7.29730844 0.70269155502319336 0.49377542150091358 +3666 7 6.25256157 0.74743843078613281 0.55866420781603665 +3667 8 7.314732 0.68526792526245117 0.46959212939350436 +3668 5 5.123465 0.12346506118774414 0.015243621334093405 +3669 7 7.222342 0.22234201431274414 0.04943597132864852 +3670 6 5.395938 0.60406208038330078 0.36489099695700133 +3671 7 6.971204 0.028796195983886719 0.00082922090314241359 +3672 8 7.117149 0.88285112380981445 0.77942610681225233 +3673 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3674 5 5.25115 0.25115013122558594 0.063076388414629037 +3675 6 5.755384 0.24461603164672852 0.059837002938593287 +3676 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3677 6 6.51675129 0.51675128936767578 0.26703189506315539 +3678 5 5.09006453 0.090064525604248047 0.008111618772318252 +3679 7 6.02219152 0.97780847549438477 0.95610941474865285 +3680 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3681 8 6.98234367 1.0176563262939453 1.0356243984460889 +3682 7 6.398295 0.60170507431030273 0.36204899645076694 +3683 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3684 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3685 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3686 5 5.108233 0.10823297500610352 0.011714376878671828 +3687 5 6.19706631 1.1970663070678711 1.4329677435171106 +3688 6 6.434823 0.43482303619384766 0.18907107280483615 +3689 8 6.98234367 1.0176563262939453 1.0356243984460889 +3690 7 6.53908062 0.46091938018798828 0.21244667503287928 +3691 6 6.327841 0.32784080505371094 0.1074795934582653 +3692 7 6.02219152 0.97780847549438477 0.95610941474865285 +3693 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3694 5 5.09006453 0.090064525604248047 0.008111618772318252 +3695 6 6.70085239 0.70085239410400391 0.49119407832131401 +3696 7 6.398295 0.60170507431030273 0.36204899645076694 +3697 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3698 6 6.24541 0.24540996551513672 0.060226051174140594 +3699 5 5.108233 0.10823297500610352 0.011714376878671828 +3700 5 5.486109 0.48610877990722656 0.23630174590289243 +3701 5 5.20689249 0.20689249038696289 0.042804502578519532 +3702 6 5.67937136 0.32062864303588867 0.10280272673503532 +3703 6 5.67937136 0.32062864303588867 0.10280272673503532 +3704 6 5.67937136 0.32062864303588867 0.10280272673503532 +3705 6 5.67937136 0.32062864303588867 0.10280272673503532 +3706 6 6.30640936 0.30640935897827148 0.09388669526947524 +3707 6 6.302135 0.30213499069213867 0.091285552600538722 +3708 5 5.15478468 0.1547846794128418 0.023958296980936211 +3709 5 5.181745 0.18174505233764648 0.03303126404921386 +3710 5 4.88772964 0.11227035522460938 0.012604632662259974 +3711 6 5.67937136 0.32062864303588867 0.10280272673503532 +3712 5 5.59040737 0.59040737152099609 0.34858086434633151 +3713 5 5.16065025 0.16065025329589844 0.025808503884036327 +3714 4 5.40058327 1.4005832672119141 1.9616334883939999 +3715 6 5.902174 0.097826004028320313 0.009569927064148942 +3716 5 5.655233 0.65523290634155273 0.42933016155279802 +3717 6 5.775761 0.22423887252807617 0.050283071952662795 +3718 5 5.20689249 0.20689249038696289 0.042804502578519532 +3719 5 5.38708639 0.38708639144897461 0.1498358744449888 +3720 7 6.94894171 0.051058292388916016 0.0026069492216720391 +3721 5 5.05060768 0.050607681274414063 0.0025611374039726797 +3722 5 4.98821163 0.011788368225097656 0.00013896562541049207 +3723 7 6.490961 0.50903892517089844 0.25912062733914354 +3724 6 6.30076361 0.30076360702514648 0.090458747310776744 +3725 6 6.23129034 0.23129034042358398 0.053495221573257368 +3726 7 6.634293 0.3657069206237793 0.13374155179212721 +3727 7 6.490961 0.50903892517089844 0.25912062733914354 +3728 7 6.83458853 0.16541147232055664 0.027360955175254276 +3729 5 5.10726643 0.10726642608642578 0.011506086165354645 +3730 6 5.732659 0.26734113693237305 0.071471283496293836 +3731 6 6.02678251 0.026782512664794922 0.00071730298463990039 +3732 5 5.10726643 0.10726642608642578 0.011506086165354645 +3733 6 6.601304 0.60130405426025391 0.36156656566981837 +3734 5 5.412523 0.41252279281616211 0.17017505459284621 +3735 6 6.212704 0.21270418167114258 0.045243068900390426 +3736 4 5.974627 1.9746270179748535 3.8991518601162625 +3737 5 5.66151667 0.66151666641235352 0.437604299941313 +3738 6 5.62562132 0.37437868118286133 0.14015939692421853 +3739 7 6.81513262 0.18486738204956055 0.034175948945858181 +3740 7 6.81513262 0.18486738204956055 0.034175948945858181 +3741 7 6.81513262 0.18486738204956055 0.034175948945858181 +3742 7 6.81513262 0.18486738204956055 0.034175948945858181 +3743 7 6.81513262 0.18486738204956055 0.034175948945858181 +3744 7 6.81513262 0.18486738204956055 0.034175948945858181 +3745 7 6.81513262 0.18486738204956055 0.034175948945858181 +3746 5 6.29884863 1.2988486289978027 1.6870077610494718 +3747 6 5.658112 0.3418879508972168 0.11688737096869772 +3748 5 5.37572527 0.37572526931762695 0.14116947800380331 +3749 6 6.59885168 0.59885168075561523 0.35862333554382531 +3750 7 6.81513262 0.18486738204956055 0.034175948945858181 +3751 5 5.352506 0.35250616073608398 0.12426059335689388 +3752 5 5.411717 0.41171693801879883 0.16951083705157544 +3753 5 5.31119251 0.31119251251220703 0.09684077984366013 +3754 8 7.681114 0.31888580322265625 0.10168815549695864 +3755 6 6.103313 0.10331296920776367 0.010673569606524325 +3756 5 5.352506 0.35250616073608398 0.12426059335689388 +3757 5 5.411717 0.41171693801879883 0.16951083705157544 +3758 5 5.31119251 0.31119251251220703 0.09684077984366013 +3759 6 6.103313 0.10331296920776367 0.010673569606524325 +3760 6 6.155523 0.15552282333374023 0.024187348577697776 +3761 7 6.45952559 0.54047441482543945 0.29211259308090121 +3762 5 5.419359 0.41935920715332031 0.17586214462426142 +3763 5 6.03585434 1.0358543395996094 1.0729942128673429 +3764 8 7.681114 0.31888580322265625 0.10168815549695864 +3765 5 5.24535036 0.24535036087036133 0.060196799579216531 +3766 5 5.24535036 0.24535036087036133 0.060196799579216531 +3767 5 5.24535036 0.24535036087036133 0.060196799579216531 +3768 6 6.072592 0.072591781616210938 0.0052695667582156602 +3769 5 5.24535036 0.24535036087036133 0.060196799579216531 +3770 4 5.85129166 1.8512916564941406 3.4272807974048192 +3771 6 5.96826839 0.031731605529785156 0.0010068947894978919 +3772 6 6.072592 0.072591781616210938 0.0052695667582156602 +3773 5 5.567017 0.5670170783996582 0.32150836719688414 +3774 5 5.42932558 0.42932558059692383 0.18432045415488574 +3775 6 6.555324 0.55532407760620117 0.30838483116917814 +3776 5 6.549726 1.5497260093688965 2.401650704114445 +3777 6 6.555324 0.55532407760620117 0.30838483116917814 +3778 7 6.80112171 0.19887828826904297 0.039552573544824554 +3779 7 6.94228554 0.057714462280273438 0.0033309591563011054 +3780 5 5.42932558 0.42932558059692383 0.18432045415488574 +3781 6 5.932433 0.067566871643066406 0.0045652821436306112 +3782 6 6.227729 0.22772884368896484 0.051860426247912983 +3783 5 5.270208 0.27020788192749023 0.073012299455740504 +3784 6 5.81837845 0.18162155151367188 0.032986387974233367 +3785 7 6.71812534 0.28187465667724609 0.079453322076915356 +3786 5 5.407538 0.40753793716430664 0.16608717022813835 +3787 5 5.24300337 0.24300336837768555 0.059050637042901144 +3788 5 5.36877 0.36877012252807617 0.13599140326937231 +3789 6 5.35680771 0.64319229125976563 0.41369632353598718 +3790 5 5.270208 0.27020788192749023 0.073012299455740504 +3791 5 5.30159664 0.30159664154052734 0.090960534188525344 +3792 6 6.023325 0.023324966430664063 0.00054405405899160542 +3793 6 5.47658157 0.52341842651367188 0.27396684921404812 +3794 5 5.64809132 0.64809131622314453 0.42002235416384792 +3795 6 5.81837845 0.18162155151367188 0.032986387974233367 +3796 6 6.42824173 0.42824172973632813 0.1833909790875623 +3797 5 4.83761024 0.16238975524902344 0.026370432609837735 +3798 5 5.660219 0.66021919250488281 0.43588938215179951 +3799 5 5.69797659 0.69797658920288086 0.4871713190752871 +3800 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3801 6 5.97499 0.025010108947753906 0.00062550554957852 +3802 5 5.660219 0.66021919250488281 0.43588938215179951 +3803 6 6.044695 0.044694900512695313 0.0019976341318397317 +3804 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3805 6 5.97499 0.025010108947753906 0.00062550554957852 +3806 5 4.83761024 0.16238975524902344 0.026370432609837735 +3807 5 5.63379145 0.63379144668579102 0.40169159789206788 +3808 6 5.517979 0.48202085494995117 0.23234410460668187 +3809 6 6.044695 0.044694900512695313 0.0019976341318397317 +3810 3 5.139502 2.1395020484924316 4.5774690155033113 +3811 5 5.86564541 0.86564540863037109 0.74934197348284215 +3812 5 5.660219 0.66021919250488281 0.43588938215179951 +3813 5 5.69797659 0.69797658920288086 0.4871713190752871 +3814 5 5.528592 0.52859210968017578 0.27940961841613898 +3815 7 6.71345472 0.2865452766418457 0.082108195565751885 +3816 5 5.46293068 0.46293067932128906 0.21430481385687017 +3817 6 6.24235964 0.24235963821411133 0.058738194235274932 +3818 6 6.441372 0.44137191772460938 0.19480916975589935 +3819 6 6.441372 0.44137191772460938 0.19480916975589935 +3820 5 5.83183 0.83183002471923828 0.69194119002440857 +3821 6 6.02943945 0.029439449310302734 0.00086668117569388414 +3822 6 6.34592 0.34592008590698242 0.1196607058338941 +3823 5 5.289135 0.28913497924804688 0.083599036224768497 +3824 7 6.34184074 0.65815925598144531 0.43317360623404966 +3825 6 6.542632 0.54263210296630859 0.29444959916963853 +3826 6 6.441372 0.44137191772460938 0.19480916975589935 +3827 5 5.547714 0.5477142333984375 0.29999088146723807 +3828 6 6.24235964 0.24235963821411133 0.058738194235274932 +3829 7 6.90751839 0.092481613159179688 0.0085528487725241575 +3830 7 6.662573 0.33742713928222656 0.11385707432418712 +3831 5 5.104566 0.10456609725952148 0.010934068696087706 +3832 5 5.104566 0.10456609725952148 0.010934068696087706 +3833 6 6.39407635 0.39407634735107422 0.1552961675415645 +3834 5 5.11497831 0.11497831344604492 0.013220012562896954 +3835 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3836 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3837 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3838 5 5.11497831 0.11497831344604492 0.013220012562896954 +3839 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3840 6 6.208704 0.20870399475097656 0.043557357425015653 +3841 6 6.314494 0.31449413299560547 0.09890655968865758 +3842 6 6.040485 0.040484905242919922 0.001639027552528205 +3843 7 6.94303846 0.056961536407470703 0.0032446166298996104 +3844 6 6.208704 0.20870399475097656 0.043557357425015653 +3845 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3846 6 6.27509069 0.27509069442749023 0.075674890160598807 +3847 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3848 6 5.67952156 0.32047843933105469 0.1027064300760685 +3849 5 5.12245846 0.12245845794677734 0.014996073922702635 +3850 6 6.27509069 0.27509069442749023 0.075674890160598807 +3851 7 7.210589 0.21058893203735352 0.044347698296633098 +3852 6 6.20994473 0.20994472503662109 0.044076787570702436 +3853 7 7.079849 0.079848766326904297 0.0063758254839285655 +3854 6 6.775606 0.77560615539550781 0.60156490828740061 +3855 6 6.39135551 0.39135551452636719 0.1531591387501976 +3856 6 6.20994473 0.20994472503662109 0.044076787570702436 +3857 6 6.280806 0.28080606460571289 0.078852045919347802 +3858 6 6.61661 0.61661005020141602 0.38020795400939278 +3859 5 5.38074636 0.38074636459350586 0.14496779415117089 +3860 5 5.38074636 0.38074636459350586 0.14496779415117089 +3861 6 5.924023 0.075976848602294922 0.0057724815235360438 +3862 6 5.903024 0.096975803375244141 0.0094043064402740129 +3863 6 5.903024 0.096975803375244141 0.0094043064402740129 +3864 7 6.547844 0.45215606689453125 0.20444510882953182 +3865 6 6.91423035 0.9142303466796875 0.83581712679006159 +3866 6 6.122323 0.12232303619384766 0.014962925183681364 +3867 5 5.38074636 0.38074636459350586 0.14496779415117089 +3868 6 4.826844 1.1731557846069336 1.37629449495671 +3869 6 5.924023 0.075976848602294922 0.0057724815235360438 +3870 6 5.874355 0.12564516067504883 0.015786706401058836 +3871 6 5.903024 0.096975803375244141 0.0094043064402740129 +3872 4 4.866891 0.86689090728759766 0.75149984513791424 +3873 5 5.13102341 0.13102340698242188 0.017167133177281357 +3874 5 5.2737484 0.27374839782714844 0.074938185312930727 +3875 7 5.953763 1.0462369918823242 1.0946118431829746 +3876 5 5.43160534 0.43160533905029297 0.18628316869671835 +3877 5 5.96922541 0.96922540664672852 0.93939788888951625 +3878 5 5.27135849 0.27135848999023438 0.073635430089780129 +3879 4 3.85325718 0.14674282073974609 0.021533455438657256 +3880 6 5.7290225 0.27097749710083008 0.073428803935030373 +3881 6 5.7290225 0.27097749710083008 0.073428803935030373 +3882 5 5.93204927 0.93204927444458008 0.86871584999266815 +3883 6 6.63882732 0.63882732391357422 0.40810034977857867 +3884 6 5.7290225 0.27097749710083008 0.073428803935030373 +3885 6 6.157238 0.15723800659179688 0.024723790716961958 +3886 6 6.63882732 0.63882732391357422 0.40810034977857867 +3887 6 6.157238 0.15723800659179688 0.024723790716961958 +3888 6 5.7290225 0.27097749710083008 0.073428803935030373 +3889 6 6.10551071 0.10551071166992188 0.011132510277093388 +3890 6 6.19827271 0.198272705078125 0.039312065578997135 +3891 5 5.93204927 0.93204927444458008 0.86871584999266815 +3892 5 5.79291964 0.79291963577270508 0.62872154879391928 +3893 5 4.78047943 0.21952056884765625 0.048189280147198588 +3894 6 6.143109 0.14310884475708008 0.020480141447706046 +3895 6 6.40889549 0.40889549255371094 0.16719552383074188 +3896 6 5.741901 0.25809907913208008 0.066615134648827734 +3897 6 5.997462 0.0025382041931152344 6.442480525947758E-06 +3898 7 6.17240953 0.8275904655456543 0.68490597866207281 +3899 5 5.79291964 0.79291963577270508 0.62872154879391928 +3900 5 4.78047943 0.21952056884765625 0.048189280147198588 +3901 4 4.35597134 0.35597133636474609 0.1267155923133032 +3902 6 5.915008 0.084991931915283203 0.0072236284906921355 +3903 6 6.23150444 0.23150444030761719 0.05359430588214309 +3904 7 7.02997 0.029970169067382813 0.00089821103392750956 +3905 7 6.960154 0.039845943450927734 0.0015876992094945308 +3906 7 6.960154 0.039845943450927734 0.0015876992094945308 +3907 7 6.6903367 0.30966329574584961 0.095891356732181521 +3908 7 6.296472 0.70352792739868164 0.49495154462988467 +3909 7 6.296472 0.70352792739868164 0.49495154462988467 +3910 6 6.341356 0.34135580062866211 0.11652378262283491 +3911 6 5.71503448 0.28496551513671875 0.081205344817135483 +3912 7 6.960154 0.039845943450927734 0.0015876992094945308 +3913 6 5.858565 0.14143514633178711 0.020003900617894033 +3914 7 6.296472 0.70352792739868164 0.49495154462988467 +3915 7 6.872329 0.1276707649230957 0.016299824216048364 +3916 6 6.341356 0.34135580062866211 0.11652378262283491 +3917 5 5.19301939 0.19301939010620117 0.037256484956969871 +3918 7 6.62571 0.37428998947143555 0.14009299621852733 +3919 6 6.55708551 0.55708551406860352 0.31034426998508025 +3920 6 5.821983 0.17801713943481445 0.031690101932554171 +3921 5 5.52710438 0.52710437774658203 0.27783902503961144 +3922 7 6.6903367 0.30966329574584961 0.095891356732181521 +3923 5 5.21137667 0.21137666702270508 0.044680095361627536 +3924 5 5.21137667 0.21137666702270508 0.044680095361627536 +3925 5 5.424182 0.42418193817138672 0.17993031667083415 +3926 6 5.80389357 0.1961064338684082 0.03845773340458436 +3927 5 5.96175432 0.96175432205200195 0.92497137598570589 +3928 5 5.141706 0.14170598983764648 0.020080587555867169 +3929 5 5.141706 0.14170598983764648 0.020080587555867169 +3930 6 6.28535843 0.28535842895507813 0.08142943297571037 +3931 6 6.524964 0.5249638557434082 0.2755870498369859 +3932 8 6.46785831 1.5321416854858398 2.3474581444033902 +3933 4 5.35140467 1.3514046669006348 1.8262945737208156 +3934 6 5.92051172 0.079488277435302734 0.0063183862496316578 +3935 5 5.30682325 0.3068232536315918 0.094140508969076109 +3936 6 5.78626442 0.21373558044433594 0.045682898347877199 +3937 5 5.39522934 0.39522933959960938 0.15620623088034336 +3938 6 5.758783 0.24121713638305664 0.058185706884842148 +3939 6 6.261217 0.26121711730957031 0.068234382375521818 +3940 5 5.339176 0.33917617797851563 0.11504047970811371 +3941 5 5.24542665 0.24542665481567383 0.060234242894011913 +3942 6 5.8923316 0.10766839981079102 0.011592484317816343 +3943 6 5.798487 0.20151281356811523 0.040607414032137967 +3944 6 6.21212339 0.21212339401245117 0.044996334287361606 +3945 6 6.261217 0.26121711730957031 0.068234382375521818 +3946 6 6.54871845 0.54871845245361328 0.30109194006308826 +3947 7 6.61867762 0.38132238388061523 0.14540676044839529 +3948 5 5.584513 0.58451318740844727 0.3416556662543826 +3949 5 5.339176 0.33917617797851563 0.11504047970811371 +3950 5 5.24542665 0.24542665481567383 0.060234242894011913 +3951 5 5.350792 0.35079193115234375 0.12305497896159068 +3952 6 6.112464 0.11246395111083984 0.012648140299461375 +3953 7 6.392265 0.60773515701293945 0.36934202106954217 +3954 5 5.350792 0.35079193115234375 0.12305497896159068 +3955 6 6.112464 0.11246395111083984 0.012648140299461375 +3956 5 5.47008228 0.47008228302001953 0.22097735280931374 +3957 5 5.946553 0.94655323028564453 0.89596301776418841 +3958 6 5.66506624 0.33493375778198242 0.11218062210195967 +3959 6 5.66506624 0.33493375778198242 0.11218062210195967 +3960 6 5.3763175 0.62368249893188477 0.38897985947392044 +3961 5 5.18560743 0.1856074333190918 0.034450119303301108 +3962 7 7.151062 0.15106201171875 0.022819731384515762 +3963 7 6.32142735 0.67857265472412109 0.46046084773934126 +3964 5 5.18217325 0.18217325210571289 0.033187093782771626 +3965 4 5.70695639 1.7069563865661621 2.9137001056390091 +3966 6 5.66506624 0.33493375778198242 0.11218062210195967 +3967 4 5.26928663 1.2692866325378418 1.6110885555392542 +3968 6 5.35175 0.64825010299682617 0.42022819603539574 +3969 6 6.229696 0.22969579696655273 0.052760159144099816 +3970 7 6.19331 0.80669021606445313 0.65074910469411407 +3971 6 6.229696 0.22969579696655273 0.052760159144099816 +3972 6 5.54704952 0.45295047760009766 0.20516413515815657 +3973 4 5.26928663 1.2692866325378418 1.6110885555392542 +3974 6 5.35175 0.64825010299682617 0.42022819603539574 +3975 7 6.709179 0.29082107543945313 0.084576897919760086 +3976 7 7.10497856 0.10497856140136719 0.011020498353900621 +3977 6 6.63561869 0.63561868667602539 0.40401111485175534 +3978 7 6.04282236 0.95717763900756836 0.91618903261610285 +3979 6 6.217364 0.21736383438110352 0.047247036496855799 +3980 5 6.02859735 1.028597354888916 1.0580125184844746 +3981 7 6.28068542 0.7193145751953125 0.51741345808841288 +3982 7 6.709179 0.29082107543945313 0.084576897919760086 +3983 6 5.925124 0.074875831604003906 0.0056063901583911502 +3984 7 7.10497856 0.10497856140136719 0.011020498353900621 +3985 6 6.122168 0.12216806411743164 0.014925035890200888 +3986 6 6.122168 0.12216806411743164 0.014925035890200888 +3987 6 5.71410275 0.28589725494384766 0.081737240384427423 +3988 6 5.879811 0.12018918991088867 0.014445441371435663 +3989 6 6.122168 0.12216806411743164 0.014925035890200888 +3990 6 5.71410275 0.28589725494384766 0.081737240384427423 +3991 5 5.62714958 0.62714958190917969 0.39331659808885888 +3992 7 6.14805937 0.85194063186645508 0.72580284022501473 +3993 7 6.485149 0.51485109329223633 0.26507164826421103 +3994 7 6.485149 0.51485109329223633 0.26507164826421103 +3995 5 5.104947 0.10494709014892578 0.011013891730726755 +3996 7 6.485149 0.51485109329223633 0.26507164826421103 +3997 7 6.735825 0.2641749382019043 0.069788397973979954 +3998 6 5.934058 0.065941810607910156 0.0043483223862494924 +3999 6 5.934058 0.065941810607910156 0.0043483223862494924 +4000 6 5.934058 0.065941810607910156 0.0043483223862494924 +4001 5 5.335033 0.33503293991088867 0.11224707082533314 +4002 6 5.60893059 0.39106941223144531 0.15293528518304811 +4003 6 6.45015 0.4501500129699707 0.20263503417686479 +4004 7 6.7571907 0.24280929565429688 0.058956354056135751 +4005 6 6.45015 0.4501500129699707 0.20263503417686479 +4006 6 6.23378134 0.23378133773803711 0.054653713874586174 +4007 5 5.335033 0.33503293991088867 0.11224707082533314 +4008 6 5.60893059 0.39106941223144531 0.15293528518304811 +4009 6 6.07953453 0.079534530639648438 0.0063257415640691761 +4010 6 6.55589867 0.55589866638183594 0.30902332728510373 +4011 7 6.735825 0.2641749382019043 0.069788397973979954 +4012 6 5.934058 0.065941810607910156 0.0043483223862494924 +4013 6 5.441547 0.55845308303833008 0.31186984595501599 +4014 6 6.24294 0.24293994903564453 0.059019818837441562 +4015 5 4.75735331 0.24264669418334961 0.058877418198107989 +4016 5 5.21397972 0.21397972106933594 0.04578732102891081 +4017 6 6.14959431 0.14959430694580078 0.02237845667059446 +4018 6 6.24294 0.24293994903564453 0.059019818837441562 +4019 5 4.75735331 0.24264669418334961 0.058877418198107989 +4020 4 4.47513533 0.47513532638549805 0.22575357837945376 +4021 5 5.643344 0.64334392547607422 0.41389140644696454 +4022 5 5.21397972 0.21397972106933594 0.04578732102891081 +4023 6 6.39005136 0.39005136489868164 0.1521400672593245 +4024 6 6.409837 0.40983676910400391 0.16796617730960861 +4025 6 6.7355876 0.73558759689331055 0.54108911270327553 +4026 6 6.39005136 0.39005136489868164 0.1521400672593245 +4027 5 5.18595076 0.18595075607299805 0.03457768368411962 +4028 6 6.40132236 0.40132236480712891 0.16105964049438626 +4029 6 6.29972172 0.29972171783447266 0.089833108141647244 +4030 5 5.77380943 0.77380943298339844 0.5987810385740886 +4031 5 5.164775 0.16477489471435547 0.02715076592812693 +4032 5 5.318856 0.31885576248168945 0.10166899726777956 +4033 6 6.01368 0.013679981231689453 0.00018714188649937569 +4034 5 5.318856 0.31885576248168945 0.10166899726777956 +4035 6 6.11864853 0.11864852905273438 0.014077473446377553 +4036 5 5.10300541 0.10300540924072266 0.010610114332848752 +4037 5 5.15395546 0.15395545959472656 0.023702283539023483 +4038 5 5.164775 0.16477489471435547 0.02715076592812693 +4039 4 5.06407642 1.0640764236450195 1.1322586353571751 +4040 5 5.49962044 0.49962043762207031 0.24962058168966905 +4041 5 5.2111783 0.21117830276489258 0.044596275558660636 +4042 7 6.820859 0.17914104461669922 0.03209151386636222 +4043 7 6.820859 0.17914104461669922 0.03209151386636222 +4044 7 6.820859 0.17914104461669922 0.03209151386636222 +4045 7 6.820859 0.17914104461669922 0.03209151386636222 +4046 7 6.707407 0.29259300231933594 0.085610665006242925 +4047 6 6.44117928 0.44117927551269531 0.19463915314190672 +4048 6 6.44117928 0.44117927551269531 0.19463915314190672 +4049 6 6.41707468 0.41707468032836914 0.17395128897101131 +4050 7 6.820859 0.17914104461669922 0.03209151386636222 +4051 6 6.331319 0.33131885528564453 0.10977218386778986 +4052 5 5.2111783 0.21117830276489258 0.044596275558660636 +4053 7 6.820859 0.17914104461669922 0.03209151386636222 +4054 7 6.707407 0.29259300231933594 0.085610665006242925 +4055 6 6.331319 0.33131885528564453 0.10977218386778986 +4056 5 5.77324438 0.77324438095092773 0.59790687267218345 +4057 6 6.295132 0.29513216018676758 0.087102991976507838 +4058 6 6.44117928 0.44117927551269531 0.19463915314190672 +4059 6 6.41707468 0.41707468032836914 0.17395128897101131 +4060 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4061 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4062 6 6.082549 0.082549095153808594 0.0068143531107125455 +4063 5 5.371587 0.37158679962158203 0.13807674965300976 +4064 5 6.223232 1.2232317924499512 1.4962960180603204 +4065 8 7.24055958 0.75944042205810547 0.57674975465579337 +4066 6 6.2537303 0.25373029708862305 0.064379063660680913 +4067 5 5.3426137 0.34261369705200195 0.11738414540764097 +4068 6 6.2537303 0.25373029708862305 0.064379063660680913 +4069 6 6.004174 0.0041742324829101563 1.7424216821382288E-05 +4070 5 5.571743 0.57174301147460938 0.32689007117005531 +4071 6 5.818604 0.1813960075378418 0.032904511550668758 +4072 7 6.515072 0.48492813110351563 0.23515529233554844 +4073 5 4.62328625 0.37671375274658203 0.14191325150841294 +4074 4 4.78012753 0.78012752532958984 0.60859895577686984 +4075 6 5.69815826 0.30184173583984375 0.091108433494810015 +4076 5 5.492518 0.49251794815063477 0.24257392925051136 +4077 6 5.968249 0.031751155853271484 0.001008135898018736 +4078 6 5.7745986 0.22540140151977539 0.050805791807079004 +4079 6 5.88386059 0.11613941192626953 0.013488363002579717 +4080 6 5.865267 0.13473320007324219 0.018153035201976309 +4081 6 5.678007 0.32199287414550781 0.10367941100048483 +4082 6 6.05232334 0.052323341369628906 0.0027377320520827197 +4083 5 5.29502439 0.29502439498901367 0.087039393638633555 +4084 8 6.477889 1.5221109390258789 2.3168217107022429 +4085 6 5.937694 0.062305927276611328 0.0038820285737983795 +4086 6 5.76667166 0.23332834243774414 0.054442115384745193 +4087 6 5.690505 0.30949497222900391 0.095787137835031899 +4088 6 6.06473732 0.064737319946289063 0.0041909205938281957 +4089 6 5.55112648 0.44887351989746094 0.20148743686513626 +4090 6 5.529048 0.47095203399658203 0.22179581832551776 +4091 6 5.82618856 0.17381143569946289 0.030210415179908523 +4092 6 5.28551674 0.71448326110839844 0.51048633040409186 +4093 6 5.351238 0.64876222610473633 0.42089242602037302 +4094 7 7.07337046 0.073370456695556641 0.0053832239157145523 +4095 6 5.351238 0.64876222610473633 0.42089242602037302 +4096 5 4.990592 0.0094079971313476563 8.8510410023445729E-05 +4097 6 5.82618856 0.17381143569946289 0.030210415179908523 +4098 5 6.222002 1.2220020294189453 1.4932889599040209 +4099 6 5.28551674 0.71448326110839844 0.51048633040409186 +4100 6 6.014094 0.014093875885009766 0.0001986373374620598 +4101 5 5.22823429 0.22823429107666016 0.052090891623265634 +4102 5 5.22823429 0.22823429107666016 0.052090891623265634 +4103 7 6.371319 0.62868118286132813 0.39524002968391869 +4104 7 6.347439 0.65256118774414063 0.42583610375004355 +4105 7 6.239276 0.76072406768798828 0.57870110715975898 +4106 5 5.64672947 0.64672946929931641 0.41825900646017544 +4107 6 6.32752848 0.32752847671508789 0.10727490305930587 +4108 6 6.51016045 0.51016044616699219 0.26026368083330453 +4109 6 6.0367527 0.036752700805664063 0.0013507610165106598 +4110 5 5.393194 0.39319419860839844 0.15460167781930068 +4111 6 6.05556536 0.055565357208251953 0.0030875089216806373 +4112 6 6.33822441 0.33822441101074219 0.11439575220356346 +4113 6 6.354503 0.35450315475463867 0.1256724867309913 +4114 6 6.023537 0.023537158966064453 0.00055399785219378828 +4115 6 6.138492 0.13849210739135742 0.019180063809699277 +4116 6 5.4326086 0.56739139556884766 0.32193299576556456 +4117 6 5.4326086 0.56739139556884766 0.32193299576556456 +4118 8 6.47382832 1.5261716842651367 2.3292000098526842 +4119 7 6.62782335 0.3721766471862793 0.13851545671082022 +4120 5 5.605265 0.60526514053344727 0.36634589034497367 +4121 6 5.586563 0.4134368896484375 0.17093006172217429 +4122 6 5.498919 0.50108098983764648 0.25108215837667558 +4123 6 6.05965 0.059649944305419922 0.0035581158556396986 +4124 7 6.57852364 0.42147636413574219 0.17764232552508474 +4125 5 5.755329 0.75532913208007813 0.57052209776884411 +4126 5 5.755329 0.75532913208007813 0.57052209776884411 +4127 5 5.55892754 0.55892753601074219 0.3123999905110395 +4128 5 5.2543 0.25430011749267578 0.064668549756788707 +4129 7 6.86728239 0.13271760940551758 0.017613963846315528 +4130 6 6.040545 0.040544986724853516 0.0016438959485185478 +4131 5 5.36841869 0.36841869354248047 0.13573233375154814 +4132 5 5.36841869 0.36841869354248047 0.13573233375154814 +4133 6 6.171894 0.17189407348632813 0.029547572499723174 +4134 6 6.451214 0.45121383666992188 0.20359392640239093 +4135 5 5.92140675 0.92140674591064453 0.84899039140964305 +4136 6 6.35042429 0.35042428970336914 0.12279718281411078 +4137 5 5.36841869 0.36841869354248047 0.13573233375154814 +4138 6 5.7370224 0.26297760009765625 0.069157218153122813 +4139 7 6.313542 0.68645811080932617 0.47122473789590913 +4140 6 5.932523 0.067477226257324219 0.004553176063382125 +4141 6 5.932523 0.067477226257324219 0.004553176063382125 +4142 6 6.059661 0.059660911560058594 0.0035594243681771331 +4143 6 5.80167866 0.19832134246826172 0.039331354878413549 +4144 6 5.932523 0.067477226257324219 0.004553176063382125 +4145 6 5.81908035 0.18091964721679688 0.032731918749050237 +4146 7 6.51515 0.48484992980957031 0.23507945443634526 +4147 7 6.313542 0.68645811080932617 0.47122473789590913 +4148 6 5.77318668 0.22681331634521484 0.051444280471514503 +4149 7 6.57568932 0.42431068420410156 0.1800395567297528 +4150 5 4.879766 0.12023401260375977 0.014456217786801062 +4151 6 6.349858 0.34985780715942383 0.12240048523040059 +4152 6 5.77318668 0.22681331634521484 0.051444280471514503 +4153 5 5.27344227 0.27344226837158203 0.074770674132196291 +4154 5 5.305294 0.30529403686523438 0.093204448945471086 +4155 5 5.27344227 0.27344226837158203 0.074770674132196291 +4156 5 5.31374645 0.31374645233154297 0.098436836350629164 +4157 7 7.011022 0.011022090911865234 0.00012148648806942219 +4158 7 7.011022 0.011022090911865234 0.00012148648806942219 +4159 7 7.011022 0.011022090911865234 0.00012148648806942219 +4160 7 7.011022 0.011022090911865234 0.00012148648806942219 +4161 7 7.011022 0.011022090911865234 0.00012148648806942219 +4162 7 7.011022 0.011022090911865234 0.00012148648806942219 +4163 5 5.25803375 0.25803375244140625 0.066581417398992926 +4164 5 5.40265226 0.40265226364135742 0.1621288454155092 +4165 7 6.126724 0.8732762336730957 0.76261138029826725 +4166 7 6.56084442 0.43915557861328125 0.19285762222716585 +4167 8 7.22911358 0.77088642120361328 0.59426587439611467 +4168 6 6.27897644 0.2789764404296875 0.077827854314818978 +4169 7 6.44153166 0.55846834182739258 0.3118868888234374 +4170 7 7.011022 0.011022090911865234 0.00012148648806942219 +4171 5 6.280464 1.2804641723632813 1.6395884967059828 +4172 6 6.044114 0.044114112854003906 0.0019460549528957927 +4173 5 5.45170975 0.45170974731445313 0.20404169581888709 +4174 6 5.229326 0.77067422866821289 0.59393876673334489 +4175 7 6.15340567 0.84659433364868164 0.71672196576605529 +4176 6 5.96163368 0.038366317749023438 0.0014719743376190308 +4177 6 6.29175138 0.29175138473510742 0.085118870494852672 +4178 7 6.215218 0.78478193283081055 0.61588268209766284 +4179 5 5.26952362 0.26952362060546875 0.072642982064280659 +4180 6 5.36615658 0.63384342193603516 0.40175748353158269 +4181 6 6.041504 0.04150390625 0.0017225742340087891 +4182 6 5.03049135 0.96950864791870117 0.93994701838914807 +4183 7 6.80200052 0.19799947738647461 0.03920379304531707 +4184 7 6.710221 0.2897791862487793 0.08397197678300472 +4185 5 5.26952362 0.26952362060546875 0.072642982064280659 +4186 5 5.451507 0.4515070915222168 0.20385865369485145 +4187 6 6.58606768 0.58606767654418945 0.34347532148990467 +4188 6 6.19589853 0.19589853286743164 0.038376235179612195 +4189 5 5.30196142 0.30196142196655273 0.091180700356062516 +4190 6 5.93951225 0.060487747192382813 0.0036587675604096148 +4191 5 5.727819 0.72781896591186523 0.52972044714101685 +4192 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4193 6 6.08673 0.086730003356933594 0.0075220934822937124 +4194 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4195 8 7.182058 0.81794214248657227 0.66902934845552409 +4196 6 6.189203 0.18920278549194336 0.035797694037910333 +4197 5 5.442303 0.44230318069458008 0.19563210365254236 +4198 5 5.18446827 0.18446826934814453 0.034028542396299599 +4199 6 6.08673 0.086730003356933594 0.0075220934822937124 +4200 6 6.10387468 0.10387468338012695 0.010789949847321623 +4201 6 6.356462 0.35646200180053711 0.12706515872764612 +4202 6 6.76204062 0.76204061508178711 0.58070589903422842 +4203 5 5.26486969 0.26486968994140625 0.070155952649656683 +4204 6 6.04439 0.044390201568603516 0.00197048999530125 +4205 6 6.356462 0.35646200180053711 0.12706515872764612 +4206 6 5.38576365 0.61423635482788086 0.37728629959224236 +4207 7 6.47487068 0.52512931823730469 0.27576080087237642 +4208 6 6.331671 0.33167123794555664 0.11000581008033805 +4209 6 6.61370659 0.61370658874511719 0.3766357770691684 +4210 6 5.75262737 0.24737262725830078 0.061193216716674215 +4211 6 5.57837772 0.42162227630615234 0.17776534387758147 +4212 4 4.7228303 0.72283029556274414 0.52248363618332405 +4213 4 4.765456 0.76545619964599609 0.58592319357649103 +4214 5 5.2678895 0.26788949966430664 0.071764784030392548 +4215 5 5.2678895 0.26788949966430664 0.071764784030392548 +4216 5 5.2678895 0.26788949966430664 0.071764784030392548 +4217 4 4.667052 0.66705179214477539 0.44495809340355663 +4218 6 6.367011 0.36701107025146484 0.13469712568712566 +4219 5 5.2678895 0.26788949966430664 0.071764784030392548 +4220 6 6.083678 0.083677768707275391 0.0070019689758282766 +4221 6 6.6260004 0.62600040435791016 0.39187650625626702 +4222 4 4.667052 0.66705179214477539 0.44495809340355663 +4223 4 4.13989544 0.13989543914794922 0.019570733894397563 +4224 7 6.72387 0.27613019943237305 0.076247887038562112 +4225 5 5.3994503 0.39945030212402344 0.1595605438669736 +4226 7 6.18949127 0.81050872802734375 0.65692439820850268 +4227 7 6.161215 0.83878517150878906 0.70356056394302868 +4228 6 5.363188 0.63681221008300781 0.40552979091080488 +4229 6 5.806095 0.19390487670898438 0.037599101211526431 +4230 6 5.62430429 0.37569570541381836 0.14114726306638659 +4231 6 6.18936443 0.18936443328857422 0.035858888594702876 +4232 6 6.160059 0.16005897521972656 0.025618875548389042 +4233 6 5.78126955 0.21873044967651367 0.04784300961568988 +4234 6 5.681346 0.31865406036376953 0.10154041018631688 +4235 5 5.34582424 0.34582424163818359 0.1195944061046248 +4236 5 5.34582424 0.34582424163818359 0.1195944061046248 +4237 5 5.86143255 0.86143255233764648 0.74206604222695205 +4238 5 5.34582424 0.34582424163818359 0.1195944061046248 +4239 7 7.03946257 0.039462566375732422 0.0015572941449590871 +4240 6 5.66003942 0.33996057510375977 0.11557319262487908 +4241 6 6.583823 0.58382320404052734 0.34084953357614722 +4242 7 6.668239 0.33176088333129883 0.11006528370876367 +4243 6 6.365007 0.36500692367553711 0.13323005433107937 +4244 5 5.33011436 0.33011436462402344 0.1089754937311227 +4245 5 5.42551851 0.42551851272583008 0.18106600467240241 +4246 6 6.26176071 0.26176071166992188 0.068518670173943974 +4247 6 5.43350172 0.5664982795715332 0.32092030075750699 +4248 6 6.15749 0.15748977661132813 0.024803029737086035 +4249 6 5.72360849 0.27639150619506836 0.076392264696778511 +4250 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4251 6 5.6752367 0.32476329803466797 0.10547119975035457 +4252 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4253 4 5.28086 1.2808599472045898 1.6406022043529447 +4254 5 5.8399086 0.83990859985351563 0.70544645610789303 +4255 5 5.131142 0.13114213943481445 0.017198260735540316 +4256 5 5.131142 0.13114213943481445 0.017198260735540316 +4257 5 5.808099 0.80809879302978516 0.65302365929619555 +4258 6 5.882378 0.11762189865112305 0.013834911042295062 +4259 6 6.31239748 0.31239748001098633 0.097592185517214602 +4260 6 6.113717 0.11371707916259766 0.012931574093272502 +4261 7 6.4979763 0.50202369689941406 0.25202779224855476 +4262 6 6.524527 0.52452707290649414 0.27512865021185462 +4263 6 5.814336 0.18566417694091797 0.034471186599148496 +4264 6 5.97327471 0.026725292205810547 0.00071424124348595797 +4265 6 6.113717 0.11371707916259766 0.012931574093272502 +4266 7 6.4979763 0.50202369689941406 0.25202779224855476 +4267 7 6.4979763 0.50202369689941406 0.25202779224855476 +4268 6 6.506674 0.50667381286621094 0.25671835264438414 +4269 5 5.28652143 0.28652143478393555 0.082094532590645031 +4270 6 5.9458127 0.054187297821044922 0.0029362632451466197 +4271 5 5.14096165 0.14096164703369141 0.019870185934451001 +4272 6 5.72031927 0.27968072891235352 0.078221310124945376 +4273 6 5.72031927 0.27968072891235352 0.078221310124945376 +4274 6 5.72031927 0.27968072891235352 0.078221310124945376 +4275 6 5.72031927 0.27968072891235352 0.078221310124945376 +4276 7 7.23196 0.23195981979370117 0.053805357998726322 +4277 5 5.92046642 0.92046642303466797 0.84725843593423633 +4278 4 4.848876 0.84887599945068359 0.72059046244339697 +4279 6 5.82808638 0.17191362380981445 0.029554294051422403 +4280 6 5.72031927 0.27968072891235352 0.078221310124945376 +4281 5 5.164684 0.16468381881713867 0.027120760180196157 +4282 5 5.164684 0.16468381881713867 0.027120760180196157 +4283 6 6.057775 0.057775020599365234 0.0033379530052570772 +4284 6 6.057775 0.057775020599365234 0.0033379530052570772 +4285 6 6.057775 0.057775020599365234 0.0033379530052570772 +4286 6 6.057775 0.057775020599365234 0.0033379530052570772 +4287 5 5.42380047 0.42380046844482422 0.17960683705405245 +4288 6 5.74335527 0.25664472579956055 0.065866515280731619 +4289 6 5.78677559 0.21322441101074219 0.045464649450877914 +4290 5 5.164684 0.16468381881713867 0.027120760180196157 +4291 5 5.40787935 0.40787935256958008 0.16636556625257981 +4292 6 6.09707 0.097070217132568359 0.0094226270541639678 +4293 5 5.40787935 0.40787935256958008 0.16636556625257981 +4294 5 5.84869528 0.84869527816772461 0.72028367518419145 +4295 5 5.40787935 0.40787935256958008 0.16636556625257981 +4296 6 6.09707 0.097070217132568359 0.0094226270541639678 +4297 6 6.33077431 0.33077430725097656 0.10941164233736345 +4298 6 6.20831966 0.20831966400146484 0.043397082409683208 +4299 6 5.624217 0.37578296661376953 0.14121283799704543 +4300 5 5.38560057 0.38560056686401367 0.14868779716584868 +4301 5 5.13298368 0.13298368453979492 0.017684660353779691 +4302 6 5.647275 0.35272502899169922 0.12441494607719505 +4303 6 6.427828 0.42782783508300781 0.18303665647181333 +4304 6 6.19889164 0.19889163970947266 0.03955788434632268 +4305 6 5.85083961 0.14916038513183594 0.022248820492677623 +4306 6 5.92332029 0.076679706573486328 0.0058797774001959624 +4307 7 6.613306 0.38669395446777344 0.14953221442192444 +4308 6 6.286537 0.28653717041015625 0.082103550026658922 +4309 6 6.396994 0.39699411392211914 0.15760432648880851 +4310 6 5.73678637 0.2632136344909668 0.069281417381944266 +4311 5 6.19426775 1.194267749786377 1.4262754581798163 +4312 6 6.427828 0.42782783508300781 0.18303665647181333 +4313 6 6.24178934 0.24178934097290039 0.058462085408109488 +4314 7 6.47377 0.5262298583984375 0.27691786387003958 +4315 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4316 5 4.89074039 0.10925960540771484 0.011937661373849551 +4317 7 6.58141041 0.41858959197998047 0.17521724651396653 +4318 7 6.47377 0.5262298583984375 0.27691786387003958 +4319 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4320 5 5.485202 0.48520183563232422 0.23542082130097697 +4321 6 5.74379873 0.25620126724243164 0.065639089336627876 +4322 7 6.329284 0.6707158088684082 0.44985969626600308 +4323 6 5.644962 0.35503816604614258 0.12605209934940831 +4324 6 5.88721132 0.11278867721557617 0.012721285708039431 +4325 5 5.29375 0.29374980926513672 0.086288950443304202 +4326 5 5.314613 0.31461286544799805 0.098981255105400123 +4327 5 5.29375 0.29374980926513672 0.086288950443304202 +4328 5 5.825475 0.82547521591186523 0.68140933208474053 +4329 5 5.48227 0.4822697639465332 0.23258412521704486 +4330 5 5.29375 0.29374980926513672 0.086288950443304202 +4331 5 5.314613 0.31461286544799805 0.098981255105400123 +4332 8 7.65718842 0.34281158447265625 0.11751978244865313 +4333 8 7.65718842 0.34281158447265625 0.11751978244865313 +4334 8 7.65718842 0.34281158447265625 0.11751978244865313 +4335 8 7.65718842 0.34281158447265625 0.11751978244865313 +4336 8 7.65718842 0.34281158447265625 0.11751978244865313 +4337 8 7.65718842 0.34281158447265625 0.11751978244865313 +4338 8 7.65718842 0.34281158447265625 0.11751978244865313 +4339 8 6.11387157 1.8861284255981445 3.5574804378493354 +4340 8 7.65718842 0.34281158447265625 0.11751978244865313 +4341 6 5.607523 0.39247703552246094 0.15403822341249906 +4342 6 6.406812 0.40681219100952148 0.16549615875396739 +4343 6 5.87327576 0.1267242431640625 0.016059033805504441 +4344 6 5.649031 0.35096883773803711 0.12317912506318862 +4345 6 6.168647 0.16864681243896484 0.028441747345823387 +4346 6 5.649031 0.35096883773803711 0.12317912506318862 +4347 7 6.41372442 0.58627557754516602 0.34371905282591797 +4348 6 5.38195562 0.61804437637329102 0.3819788511666502 +4349 5 5.33784 0.33784008026123047 0.11413591983091464 +4350 6 5.955332 0.044668197631835938 0.0019952478796767537 +4351 6 6.74399137 0.74399137496948242 0.553523166028981 +4352 5 5.696282 0.69628190994262695 0.48480849811335247 +4353 6 5.936355 0.063644886016845703 0.0040506715160972817 +4354 6 6.277787 0.27778720855712891 0.077165733237961831 +4355 6 6.74399137 0.74399137496948242 0.553523166028981 +4356 5 5.74487638 0.74487638473510742 0.55484082853604377 +4357 6 6.078775 0.078774929046630859 0.0062054894463017263 +4358 5 5.325482 0.32548189163208008 0.10593846178039712 +4359 6 5.146009 0.85399103164672852 0.72930068213304367 +4360 5 5.696282 0.69628190994262695 0.48480849811335247 +4361 6 6.354132 0.35413217544555664 0.12540959768580251 +4362 6 6.827937 0.82793712615966797 0.68547988487352995 +4363 5 5.352111 0.35211086273193359 0.12398205965382658 +4364 6 5.949367 0.050632953643798828 0.002563695994695081 +4365 5 5.644166 0.64416599273681641 0.41494982619860821 +4366 6 6.581495 0.58149480819702148 0.3381362119600908 +4367 5 5.352111 0.35211086273193359 0.12398205965382658 +4368 6 6.24809647 0.24809646606445313 0.061551856473670341 +4369 6 5.949367 0.050632953643798828 0.002563695994695081 +4370 5 5.27093458 0.2709345817565918 0.073405547591619325 +4371 5 5.46512651 0.46512651443481445 0.21634267443027966 +4372 6 6.02718067 0.027180671691894531 0.00073878891362255672 +4373 6 6.348733 0.34873294830322266 0.12161466923225817 +4374 5 5.14362526 0.14362525939941406 0.020628215137548978 +4375 6 5.86484051 0.13515949249267578 0.018268088410877681 +4376 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4377 6 6.304982 0.30498218536376953 0.093014133389260678 +4378 5 5.02749825 0.027498245239257813 0.00075615349123836495 +4379 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4380 6 6.19491 0.19491004943847656 0.037989927372109378 +4381 6 6.542717 0.54271697998046875 0.29454172035912052 +4382 6 6.16713762 0.16713762283325195 0.027934984966350385 +4383 6 6.304982 0.30498218536376953 0.093014133389260678 +4384 5 5.121737 0.12173700332641602 0.014819897978895824 +4385 5 5.121737 0.12173700332641602 0.014819897978895824 +4386 6 6.16324 0.16323995590209961 0.026647283202919425 +4387 6 6.20248032 0.20248031616210938 0.040998278433107771 +4388 6 5.73686457 0.26313543319702148 0.069240256203784156 +4389 4 5.578374 1.578373908996582 2.4912641966011506 +4390 5 5.47506475 0.47506475448608398 0.22568652095492325 +4391 5 5.31349 0.31348991394042969 0.098275926142378012 +4392 5 5.47506475 0.47506475448608398 0.22568652095492325 +4393 6 5.894842 0.10515785217285156 0.011058173873607302 +4394 6 5.92819 0.071809768676757813 0.0051566428774094675 +4395 5 5.36295462 0.36295461654663086 0.13173605367251184 +4396 5 5.33769274 0.3376927375793457 0.11403638501383284 +4397 5 5.33769274 0.3376927375793457 0.11403638501383284 +4398 5 5.33769274 0.3376927375793457 0.11403638501383284 +4399 5 5.36295462 0.36295461654663086 0.13173605367251184 +4400 5 5.33769274 0.3376927375793457 0.11403638501383284 +4401 6 6.450748 0.45074796676635742 0.20317372954400525 +4402 6 6.30272961 0.30272960662841797 0.091645214729396685 +4403 5 5.53840542 0.53840541839599609 0.28988039455816761 +4404 5 5.15546846 0.15546846389770508 0.024170443266712027 +4405 5 5.15546846 0.15546846389770508 0.024170443266712027 +4406 7 6.80952168 0.19047832489013672 0.036281992252952477 +4407 6 6.221997 0.22199678421020508 0.049282572199672359 +4408 5 5.15546846 0.15546846389770508 0.024170443266712027 +4409 7 6.80952168 0.19047832489013672 0.036281992252952477 +4410 5 5.41353559 0.41353559494018555 0.17101168828253321 +4411 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4412 7 6.2168684 0.78313159942626953 0.61329510201994708 +4413 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4414 7 6.2168684 0.78313159942626953 0.61329510201994708 +4415 5 5.189993 0.18999290466308594 0.036097303822316462 +4416 5 5.41353559 0.41353559494018555 0.17101168828253321 +4417 6 5.888463 0.11153697967529297 0.012440497835086717 +4418 6 5.8170557 0.18294429779052734 0.033468616094069148 +4419 6 5.8170557 0.18294429779052734 0.033468616094069148 +4420 6 5.8170557 0.18294429779052734 0.033468616094069148 +4421 6 5.8170557 0.18294429779052734 0.033468616094069148 +4422 6 5.888463 0.11153697967529297 0.012440497835086717 +4423 6 5.888463 0.11153697967529297 0.012440497835086717 +4424 6 5.8170557 0.18294429779052734 0.033468616094069148 +4425 6 5.86058664 0.13941335678100586 0.019436084048948032 +4426 6 5.796547 0.20345306396484375 0.041393149236682802 +4427 5 5.34068727 0.34068727493286133 0.11606781930117904 +4428 6 6.74285555 0.74285554885864258 0.55183436647007511 +4429 6 5.862502 0.13749790191650391 0.018905673031440529 +4430 5 5.16007662 0.16007661819458008 0.025624523692613366 +4431 6 6.27077341 0.27077341079711914 0.073318239994705436 +4432 6 6.455703 0.45570278167724609 0.20766502522837982 +4433 5 4.893008 0.10699176788330078 0.011447238394794113 +4434 6 6.0497036 0.049703598022460938 0.0024704476563783828 +4435 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4436 6 6.199245 0.19924497604370117 0.039698560478655054 +4437 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4438 5 5.572666 0.57266616821289063 0.32794654021563474 +4439 5 5.11934042 0.11934041976928711 0.014242135790709654 +4440 5 5.327377 0.3273768424987793 0.10717559700447055 +4441 6 6.27455759 0.27455759048461914 0.075381870492719827 +4442 5 5.327377 0.3273768424987793 0.10717559700447055 +4443 5 5.11934042 0.11934041976928711 0.014242135790709654 +4444 6 6.25034428 0.25034427642822266 0.062672256740370358 +4445 6 6.25034428 0.25034427642822266 0.062672256740370358 +4446 6 6.77828074 0.77828073501586914 0.60572090249684152 +4447 6 6.490504 0.49050378799438477 0.24059396603684036 +4448 5 5.858529 0.85852909088134766 0.7370721998895533 +4449 6 5.77393 0.22606992721557617 0.051107611991255908 +4450 6 6.023334 0.023334026336669922 0.00054447678508040553 +4451 5 5.18813133 0.18813133239746094 0.035393398229643935 +4452 5 5.270654 0.27065420150756836 0.073253696793699419 +4453 6 6.490504 0.49050378799438477 0.24059396603684036 +4454 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4455 5 5.1645813 0.164581298828125 0.027087003923952579 +4456 5 5.1645813 0.164581298828125 0.027087003923952579 +4457 5 5.1645813 0.164581298828125 0.027087003923952579 +4458 7 6.53274345 0.46725654602050781 0.21832867979901494 +4459 5 5.746503 0.74650287628173828 0.55726654429690825 +4460 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4461 6 6.026326 0.026326179504394531 0.00069306772729760269 +4462 6 6.782111 0.78211116790771484 0.61169787896596972 +4463 6 6.42424965 0.42424964904785156 0.17998776471722522 +4464 5 5.338199 0.33819913864135742 0.1143786573777561 +4465 5 5.338199 0.33819913864135742 0.1143786573777561 +4466 5 6.011748 1.0117478370666504 1.0236336858090453 +4467 5 5.807701 0.80770111083984375 0.65238108445191756 +4468 6 5.99583435 0.0041656494140625 1.735263504087925E-05 +4469 6 6.384077 0.38407707214355469 0.14751519734636531 +4470 6 6.19453 0.19453001022338867 0.037841924877511701 +4471 6 6.190817 0.19081687927246094 0.036411081415280933 +4472 5 5.8315444 0.83154439926147461 0.69146608794312669 +4473 5 4.95860672 0.041393280029296875 0.0017134036315837875 +4474 6 5.73346043 0.26653957366943359 0.071043344331883418 +4475 6 6.585525 0.5855250358581543 0.34283956761669288 +4476 6 6.383046 0.38304615020751953 0.14672435318880162 +4477 5 5.17250633 0.17250633239746094 0.029758434717223281 +4478 5 5.17250633 0.17250633239746094 0.029758434717223281 +4479 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4480 5 5.586254 0.58625411987304688 0.34369389306812081 +4481 5 5.17250633 0.17250633239746094 0.029758434717223281 +4482 6 6.64182758 0.64182758331298828 0.41194264670139091 +4483 4 4.56951332 0.56951332092285156 0.32434542270857492 +4484 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4485 6 6.236687 0.23668718338012695 0.056020822776417845 +4486 6 5.62462854 0.37537145614624023 0.14090373008934876 +4487 6 6.149464 0.14946413040161133 0.022339526276709876 +4488 6 6.630827 0.63082695007324219 0.39794264093870879 +4489 6 6.630827 0.63082695007324219 0.39794264093870879 +4490 6 6.326199 0.32619905471801758 0.10640582329892823 +4491 6 6.552785 0.55278491973876953 0.30557116749059787 +4492 6 6.35064173 0.35064172744750977 0.12294962102737372 +4493 6 5.660044 0.33995580673217773 0.11556995053092578 +4494 6 5.86190653 0.13809347152709961 0.019069806878405871 +4495 6 5.608976 0.39102411270141602 0.15289985671392969 +4496 6 5.86190653 0.13809347152709961 0.019069806878405871 +4497 5 5.241128 0.24112796783447266 0.05814269687198248 +4498 5 5.83831549 0.83831548690795898 0.70277285558972835 +4499 6 6.148644 0.14864397048950195 0.022095029962883928 +4500 6 5.876842 0.12315797805786133 0.015167887559300652 +4501 6 5.262086 0.73791408538818359 0.54451719741427951 +4502 6 6.126531 0.12653112411499023 0.016010125369803063 +4503 7 6.66133976 0.33866024017333984 0.11469075827426423 +4504 5 5.45453358 0.45453357696533203 0.20660077258889942 +4505 5 5.415779 0.41577911376953125 0.17287227144697681 +4506 6 6.422779 0.42277908325195313 0.17874215323536191 +4507 5 6.107822 1.1078219413757324 1.2272694537934967 +4508 4 6.141981 2.1419811248779297 4.588083139333321 +4509 5 5.24329853 0.24329853057861328 0.059194174981712422 +4510 6 6.556102 0.55610179901123047 0.30924921086352697 +4511 6 6.363239 0.36323881149291992 0.13194243417478901 +4512 6 6.363239 0.36323881149291992 0.13194243417478901 +4513 6 6.322394 0.32239389419555664 0.10393782301457577 +4514 5 5.04009628 0.040096282958984375 0.0016077119071269408 +4515 6 6.475341 0.47534084320068359 0.22594891721473687 +4516 6 6.45291376 0.45291376113891602 0.20513087502899907 +4517 6 5.81829929 0.18170070648193359 0.033015146736033785 +4518 6 5.56788 0.43211984634399414 0.18672756160435711 +4519 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4520 5 5.3585043 0.35850429534912109 0.12852532978376985 +4521 5 5.146292 0.14629220962524414 0.021401410597036374 +4522 6 5.56788 0.43211984634399414 0.18672756160435711 +4523 5 5.93566465 0.93566465377807617 0.87546834432964715 +4524 6 5.834097 0.16590309143066406 0.027523835746251279 +4525 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4526 6 6.196083 0.19608306884765625 0.038448569888714701 +4527 6 5.81829929 0.18170070648193359 0.033015146736033785 +4528 6 5.14050531 0.85949468612670898 0.73873111548004999 +4529 6 5.61537933 0.38462066650390625 0.14793305710190907 +4530 6 5.579626 0.42037391662597656 0.17671422977946349 +4531 6 5.579626 0.42037391662597656 0.17671422977946349 +4532 6 6.080338 0.080338001251220703 0.0064541944450411393 +4533 5 5.5772934 0.57729339599609375 0.33326766506070271 +4534 6 6.29704 0.29703998565673828 0.088232753078955284 +4535 6 5.61537933 0.38462066650390625 0.14793305710190907 +4536 6 5.55331945 0.44668054580688477 0.19952351000233648 +4537 5 5.09134531 0.091345310211181641 0.0083439656975770049 +4538 6 6.68299675 0.68299674987792969 0.46648456034381525 +4539 5 5.699331 0.69933080673217773 0.48906357724467853 +4540 6 6.555229 0.55522918701171875 0.30827945010969415 +4541 6 6.245467 0.24546718597412109 0.060254139390053751 +4542 5 5.73857737 0.73857736587524414 0.54549652538321425 +4543 5 5.73857737 0.73857736587524414 0.54549652538321425 +4544 6 6.555229 0.55522918701171875 0.30827945010969415 +4545 6 6.471859 0.47185897827148438 0.22265089537540916 +4546 6 6.549561 0.5495610237121582 0.30201731878355531 +4547 6 6.16732836 0.1673283576965332 0.027998779289418962 +4548 5 5.380732 0.38073205947875977 0.14495690111493786 +4549 5 5.73857737 0.73857736587524414 0.54549652538321425 +4550 6 5.989843 0.010157108306884766 0.00010316684915778751 +4551 6 6.09961939 0.099619388580322266 0.0099240225811172422 +4552 6 6.39423275 0.39423274993896484 0.15541946112443839 +4553 6 6.587703 0.58770322799682617 0.34539508419788945 +4554 6 6.245467 0.24546718597412109 0.060254139390053751 +4555 5 5.292268 0.29226779937744141 0.085420466552932339 +4556 5 6.446664 1.4466638565063477 2.0928363137218184 +4557 6 5.477523 0.52247714996337891 0.27298237223385513 +4558 6 6.34416676 0.34416675567626953 0.11845075571272901 +4559 7 6.019767 0.98023319244384766 0.96085711156865727 +4560 6 6.92705 0.92705011367797852 0.85942191327035289 +4561 6 5.979853 0.020146846771240234 0.00040589543482383306 +4562 7 6.10519552 0.89480447769165039 0.80067505329702726 +4563 7 6.56974125 0.43025875091552734 0.1851225927393898 +4564 7 6.18542957 0.81457042694091797 0.66352498044670938 +4565 5 5.39186049 0.3918604850769043 0.15355463976470674 +4566 5 6.22530937 1.2253093719482422 1.5013830569841957 +4567 5 5.39186049 0.3918604850769043 0.15355463976470674 +4568 6 6.126938 0.1269378662109375 0.016113221878185868 +4569 6 5.77645063 0.22354936599731445 0.049974319037801251 +4570 6 6.01089573 0.010895729064941406 0.00011871691185660893 +4571 7 6.57845736 0.42154264450073242 0.17769820113267087 +4572 7 6.440188 0.55981206893920898 0.31338955252999767 +4573 6 6.33240652 0.33240652084350586 0.1104940950992841 +4574 7 6.96231556 0.037684440612792969 0.0014201170642991201 +4575 7 6.81994772 0.18005228042602539 0.032418823686612086 +4576 5 5.687053 0.68705320358276367 0.4720421045533385 +4577 6 6.075848 0.075848102569580078 0.0057529346634055401 +4578 7 7.087625 0.087625026702880859 0.0076781453046805836 +4579 6 6.26486158 0.2648615837097168 0.070151658525219318 +4580 6 6.45493841 0.45493841171264648 0.20696895845162544 +4581 6 6.339595 0.33959484100341797 0.11532465603613673 +4582 6 5.93023872 0.069761276245117188 0.0048666356633475516 +4583 6 5.75422573 0.24577426910400391 0.060404991353607329 +4584 6 5.89385653 0.10614347457885742 0.011266437195672552 +4585 6 6.566305 0.56630516052246094 0.32070153483437025 +4586 6 6.36007071 0.36007070541381836 0.12965091289720476 +4587 6 6.20307446 0.20307445526123047 0.041239234379645495 +4588 5 6.22775126 1.2277512550354004 1.5073731442410008 +4589 6 6.36007071 0.36007070541381836 0.12965091289720476 +4590 6 6.091628 0.091628074645996094 0.0083957040633322322 +4591 6 5.70858669 0.29141330718994141 0.084921715607379156 +4592 6 6.59907055 0.59907054901123047 0.35888552269261709 +4593 6 6.13447571 0.1344757080078125 0.018083716044202447 +4594 6 6.775327 0.77532720565795898 0.60113227583337903 +4595 6 6.27347231 0.27347230911254883 0.074787103851349457 +4596 6 6.20077658 0.20077657699584961 0.040311233870170327 +4597 6 5.56596 0.43404006958007813 0.18839078200107906 +4598 6 6.13447571 0.1344757080078125 0.018083716044202447 +4599 7 6.42611027 0.57388973236083984 0.32934942490919639 +4600 6 5.52788544 0.47211456298828125 0.22289216058561578 +4601 6 6.18567228 0.18567228317260742 0.034474196738528917 +4602 6 6.04761934 0.047619342803955078 0.0022676018090805883 +4603 6 6.05319738 0.053197383880615234 0.0028299616517415416 +4604 6 6.329858 0.32985782623291016 0.10880618552710075 +4605 6 6.70813274 0.70813274383544922 0.50145198289192194 +4606 5 5.980174 0.98017406463623047 0.9607411969855093 +4607 6 6.19283 0.19283008575439453 0.037183441972047149 +4608 7 6.80754328 0.19245672225952148 0.037039589942878592 +4609 4 4.05158043 0.051580429077148438 0.00266054066378274 +4610 6 5.67133236 0.32866764068603516 0.10802241803412471 +4611 5 6.17913532 1.1791353225708008 1.3903601089341464 +4612 5 5.19891071 0.19891071319580078 0.039565471824062115 +4613 5 5.439533 0.43953323364257813 0.19318946347630117 +4614 5 4.95613146 0.043868541717529297 0.0019244489524226083 +4615 7 6.635701 0.36429882049560547 0.13271363061448938 +4616 5 5.638706 0.63870620727539063 0.40794561921211425 +4617 7 7.10083961 0.10083961486816406 0.010168627926759655 +4618 7 6.635701 0.36429882049560547 0.13271363061448938 +4619 5 4.67914963 0.32085037231445313 0.10294496141432319 +4620 6 6.132133 0.13213300704956055 0.017459131551959217 +4621 7 5.89214468 1.1078553199768066 1.2273434100009126 +4622 7 7.09829 0.098289966583251953 0.0096609175309367856 +4623 6 6.41415739 0.41415739059448242 0.17152634418403068 +4624 6 6.581927 0.58192682266235352 0.33863882693390224 +4625 5 5.071765 0.071764945983886719 0.0051502074720701785 +4626 6 5.950599 0.049400806427001953 0.0024404396756381175 +4627 6 6.050242 0.050241947174072266 0.0025242532558422681 +4628 6 6.050242 0.050241947174072266 0.0025242532558422681 +4629 7 6.102637 0.89736318588256836 0.80526068737731293 +4630 7 6.395737 0.6042628288269043 0.36513356630189264 +4631 7 6.45820141 0.54179859161376953 0.29354571387466422 +4632 6 5.950599 0.049400806427001953 0.0024404396756381175 +4633 6 5.82988358 0.17011642456054688 0.028939597905264236 +4634 6 6.556143 0.55614280700683594 0.30929482178544276 +4635 6 5.80749941 0.19250059127807617 0.037056477642408936 +4636 5 5.358758 0.35875797271728516 0.12870728298821632 +4637 6 6.21625137 0.21625137329101563 0.046764656450250186 +4638 5 5.358758 0.35875797271728516 0.12870728298821632 +4639 6 5.71351528 0.28648471832275391 0.082073493832467648 +4640 6 6.21625137 0.21625137329101563 0.046764656450250186 +4641 6 6.377533 0.377532958984375 0.14253113511949778 +4642 7 6.56437159 0.43562841415405273 0.18977211521837489 +4643 6 5.68015242 0.31984758377075195 0.10230247684398819 +4644 6 6.467866 0.46786594390869141 0.21889854146957077 +4645 7 7.116684 0.1166839599609375 0.013615146512165666 +4646 7 6.183157 0.81684303283691406 0.66723254029420787 +4647 7 6.245689 0.75431108474731445 0.56898521257267021 +4648 5 4.80332327 0.19667673110961914 0.038681736559965429 +4649 5 4.89571047 0.10428953170776367 0.010876306423824644 +4650 5 4.89571047 0.10428953170776367 0.010876306423824644 +4651 7 7.10383368 0.10383367538452148 0.010781432143858183 +4652 5 5.10172224 0.10172224044799805 0.01034741420176033 +4653 7 6.79083633 0.20916366577148438 0.043749439078965224 +4654 7 6.693703 0.30629682540893555 0.093817745255591944 +4655 7 6.693703 0.30629682540893555 0.093817745255591944 +4656 7 6.693703 0.30629682540893555 0.093817745255591944 +4657 7 6.65744543 0.34255456924438477 0.117343632910206 +4658 6 6.77934265 0.7793426513671875 0.60737496824003756 +4659 6 5.98162174 0.018378257751464844 0.00033776035797927761 +4660 6 6.34407759 0.34407758712768555 0.11838938596361004 +4661 5 5.58429432 0.58429431915283203 0.34139985139427154 +4662 6 6.614982 0.61498212814331055 0.37820301793567523 +4663 7 6.454456 0.54554414749145508 0.29761841686217849 +4664 7 6.54663849 0.45336151123046875 0.20553665986517444 +4665 6 6.614982 0.61498212814331055 0.37820301793567523 +4666 5 5.25093174 0.25093173980712891 0.062966738042632642 +4667 7 6.54663849 0.45336151123046875 0.20553665986517444 +4668 7 6.454456 0.54554414749145508 0.29761841686217849 +4669 5 5.71813965 0.7181396484375 0.5157245546579361 +4670 6 5.54932833 0.45067167282104492 0.20310495668331896 +4671 5 5.31061268 0.31061267852783203 0.096480236062234326 +4672 5 5.31061268 0.31061267852783203 0.096480236062234326 +4673 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4674 7 6.654536 0.34546422958374023 0.11934553392188718 +4675 6 6.129326 0.12932586669921875 0.016725179797504097 +4676 6 5.83601332 0.1639866828918457 0.02689163216587076 +4677 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4678 6 5.54932833 0.45067167282104492 0.20310495668331896 +4679 5 5.23454332 0.2345433235168457 0.055010570606327747 +4680 4 4.39819431 0.39819431304931641 0.15855871094481699 +4681 6 6.39631176 0.39631175994873047 0.15706301107366016 +4682 6 5.88950825 0.11049175262451172 0.012208427398036292 +4683 6 6.26491642 0.26491641998291016 0.07018070957656164 +4684 6 6.181033 0.18103313446044922 0.032772995772575086 +4685 5 5.48171139 0.48171138763427734 0.23204586097654101 +4686 4 4.39819431 0.39819431304931641 0.15855871094481699 +4687 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4688 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4689 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4690 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4691 7 6.166903 0.83309698104858398 0.6940505798322647 +4692 5 5.380849 0.38084888458251953 0.14504587288774928 +4693 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4694 7 6.166903 0.83309698104858398 0.6940505798322647 +4695 7 6.8444066 0.1555933952331543 0.024209304640180562 +4696 6 6.423567 0.42356681823730469 0.17940884951167391 +4697 7 6.8444066 0.1555933952331543 0.024209304640180562 +4698 6 5.525318 0.47468185424804688 0.22532286275236402 +4699 5 5.677266 0.67726612091064453 0.45868939853335178 +4700 5 5.677266 0.67726612091064453 0.45868939853335178 +4701 6 5.37392664 0.62607336044311523 0.39196785265653489 +4702 6 5.37392664 0.62607336044311523 0.39196785265653489 +4703 7 6.718226 0.28177404403686523 0.079396611892889268 +4704 6 5.235369 0.76463079452514648 0.58466025193615678 +4705 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4706 7 6.586311 0.41368913650512695 0.17113870166235756 +4707 6 5.868769 0.13123083114624023 0.017221531043333016 +4708 6 6.131867 0.1318669319152832 0.017388887732749936 +4709 6 6.52721071 0.52721071243286133 0.2779511353039652 +4710 7 6.806604 0.19339609146118164 0.037402048192461734 +4711 6 5.868769 0.13123083114624023 0.017221531043333016 +4712 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4713 6 6.289812 0.28981208801269531 0.083991046358278254 +4714 7 6.586311 0.41368913650512695 0.17113870166235756 +4715 6 5.7559824 0.24401760101318359 0.059544589604229259 +4716 6 5.51584244 0.48415756225585938 0.23440854508953635 +4717 6 5.624865 0.37513494491577148 0.14072622689695891 +4718 6 5.660127 0.33987283706665039 0.11551354537573388 +4719 6 5.7559824 0.24401760101318359 0.059544589604229259 +4720 5 5.97237635 0.97237634658813477 0.94551575940408839 +4721 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4722 6 5.706852 0.29314804077148438 0.085935773808159865 +4723 6 5.241431 0.75856876373291016 0.57542656931127567 +4724 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4725 6 5.98745346 0.012546539306640625 0.00015741564857307822 +4726 6 6.88603258 0.8860325813293457 0.78505373517714361 +4727 6 5.706852 0.29314804077148438 0.085935773808159865 +4728 6 6.177205 0.17720508575439453 0.03140164241722232 +4729 5 4.73050737 0.26949262619018555 0.072626275570883081 +4730 5 5.814275 0.81427478790283203 0.66304343021420209 +4731 6 6.402927 0.40292692184448242 0.16235010434706965 +4732 6 6.402927 0.40292692184448242 0.16235010434706965 +4733 6 5.71249247 0.28750753402709961 0.08266058212234384 +4734 6 6.274084 0.27408409118652344 0.075122089041542495 +4735 6 6.13222742 0.13222742080688477 0.017484090813240982 +4736 6 6.10331869 0.10331869125366211 0.010674751962369555 +4737 7 6.892216 0.10778379440307617 0.011617346335924594 +4738 6 6.553041 0.55304098129272461 0.30585432698921977 +4739 6 6.274084 0.27408409118652344 0.075122089041542495 +4740 5 5.089445 0.089445114135742188 0.0080004284427559469 +4741 6 6.25626755 0.25626754760742188 0.065673055956722237 +4742 6 6.11390924 0.11390924453735352 0.012975315991070602 +4743 5 5.83421659 0.83421659469604492 0.69591732686626528 +4744 5 5.35093 0.35093021392822266 0.12315201504770812 +4745 3 3.82722521 0.8272252082824707 0.68430154521797704 +4746 6 5.70762 0.29237985610961914 0.085485980258681593 +4747 6 6.29134369 0.29134368896484375 0.084881145099643618 +4748 5 5.34712839 0.34712839126586914 0.12049812002283034 +4749 6 5.35289049 0.6471095085144043 0.41875071600975389 +4750 5 5.83421659 0.83421659469604492 0.69591732686626528 +4751 6 5.51917839 0.48082160949707031 0.23118942015935318 +4752 7 6.60790968 0.3920903205871582 0.1537348194981405 +4753 6 6.60107851 0.60107851028442383 0.3612953755257422 +4754 6 6.02144527 0.021445274353027344 0.00045989979207661236 +4755 6 6.168067 0.16806697845458984 0.028246509246855567 +4756 7 6.81629038 0.18370962142944336 0.033749225005749395 +4757 7 6.81629038 0.18370962142944336 0.033749225005749395 +4758 6 6.5071764 0.50717639923095703 0.25722789993687911 +4759 6 5.8558073 0.14419269561767578 0.020791533469491696 +4760 6 5.8558073 0.14419269561767578 0.020791533469491696 +4761 6 6.42398167 0.42398166656494141 0.17976045358318515 +4762 7 6.319236 0.68076419830322266 0.46343989369142946 +4763 7 6.73848772 0.26151227951049805 0.068388672334776857 +4764 6 6.180128 0.18012809753417969 0.03244613152128295 +4765 8 7.674349 0.32565116882324219 0.10604868375594378 +4766 8 6.59993362 1.4000663757324219 1.9601858564565191 +4767 7 5.88190556 1.1180944442749023 1.2501351863184027 +4768 6 5.5695467 0.43045330047607422 0.18529004389074544 +4769 6 5.5695467 0.43045330047607422 0.18529004389074544 +4770 6 5.5695467 0.43045330047607422 0.18529004389074544 +4771 6 5.5695467 0.43045330047607422 0.18529004389074544 +4772 5 5.31793 0.31793022155761719 0.10107962577967555 +4773 7 6.28737259 0.71262741088867188 0.50783782674989197 +4774 4 4.94949675 0.94949674606323242 0.90154407078466647 +4775 6 5.788814 0.21118593215942383 0.044599497942044763 +4776 6 5.586607 0.41339302062988281 0.17089378950549872 +4777 6 6.67964554 0.67964553833007813 0.46191805777198169 +4778 6 5.625838 0.37416219711303711 0.13999734974845524 +4779 4 4.226809 0.22680902481079102 0.051442333735622015 +4780 5 5.251493 0.25149297714233398 0.063248717551914524 +4781 5 5.251493 0.25149297714233398 0.063248717551914524 +4782 6 5.6815567 0.31844329833984375 0.10140613425755873 +4783 6 5.6815567 0.31844329833984375 0.10140613425755873 +4784 5 5.534597 0.53459692001342773 0.28579386688784325 +4785 7 6.31295729 0.6870427131652832 0.47202768971351361 +4786 8 7.52037668 0.47962331771850586 0.23003852689930682 +4787 8 7.461737 0.53826284408569336 0.28972688932321944 +4788 5 5.534597 0.53459692001342773 0.28579386688784325 +4789 6 6.130587 0.13058710098266602 0.017052990943057011 +4790 6 6.33779 0.33779001235961914 0.11410209244991165 +4791 6 5.6815567 0.31844329833984375 0.10140613425755873 +4792 6 6.60871 0.60870981216430664 0.37052763542510547 +4793 6 5.391595 0.60840511322021484 0.37015678179250244 +4794 5 5.349109 0.34910917282104492 0.12187721454779421 +4795 7 6.60348368 0.39651632308959961 0.15722519447649574 +4796 7 6.60348368 0.39651632308959961 0.15722519447649574 +4797 6 6.444803 0.44480323791503906 0.19784992045970284 +4798 5 5.5460577 0.54605770111083984 0.2981790129424553 +4799 6 5.86040545 0.13959455490112305 0.019486639758042656 +4800 7 6.06000948 0.93999052047729492 0.8835821785871758 +4801 7 6.60348368 0.39651632308959961 0.15722519447649574 +4802 8 7.498994 0.50100612640380859 0.25100713869414903 +4803 7 6.657819 0.34218120574951172 0.11708797756818967 +4804 4 4.9147253 0.91472530364990234 0.83672238113740605 +4805 6 5.73073435 0.26926565170288086 0.072503991186977146 +4806 6 5.533971 0.46602916717529297 0.21718318465809716 +4807 6 6.277921 0.27792119979858398 0.077240193297484439 +4808 5 5.31803656 0.31803655624389648 0.10114725110747713 +4809 6 5.920948 0.079051971435546875 0.0062492141878465191 +4810 5 5.394947 0.39494705200195313 0.15598317388503347 +4811 6 6.31708336 0.31708335876464844 0.10054185640547075 +4812 7 6.53195238 0.4680476188659668 0.21906857352610132 +4813 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4814 6 6.193335 0.19333505630493164 0.037378443996431088 +4815 7 6.322362 0.67763805389404297 0.45919333208530588 +4816 6 5.68325233 0.31674766540527344 0.10032908353969106 +4817 6 6.478207 0.47820711135864258 0.22868204135397718 +4818 6 6.483267 0.48326683044433594 0.23354682940771454 +4819 6 6.193335 0.19333505630493164 0.037378443996431088 +4820 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4821 6 5.80547857 0.19452142715454102 0.037838585622239407 +4822 6 6.046786 0.046785831451416016 0.002188914024600308 +4823 7 6.37059 0.6294097900390625 0.39615668379701674 +4824 5 5.61957836 0.61957836151123047 0.38387734605294099 +4825 6 6.193167 0.19316720962524414 0.037313570874403013 +4826 6 6.193167 0.19316720962524414 0.037313570874403013 +4827 6 6.30881929 0.30881929397583008 0.09536935633173016 +4828 5 5.61957836 0.61957836151123047 0.38387734605294099 +4829 7 6.587614 0.41238594055175781 0.17006216396475793 +4830 6 5.902513 0.097486972808837891 0.0095037098674310982 +4831 6 5.267164 0.73283576965332031 0.53704826528337435 +4832 5 5.476546 0.47654581069946289 0.22709590969520832 +4833 6 6.285742 0.28574180603027344 0.081648379713442409 +4834 7 6.76315069 0.23684930801391602 0.056097594706670861 +4835 6 6.45354271 0.45354270935058594 0.20570098920507007 +4836 5 5.27756 0.27756023406982422 0.077039683536895609 +4837 6 6.6851635 0.68516349792480469 0.46944901888855384 +4838 6 6.40559673 0.40559673309326172 0.16450870989592659 +4839 4 4.615171 0.61517095565795898 0.37843530468512654 +4840 7 6.953846 0.046154022216796875 0.0021301937667885795 +4841 6 6.42197466 0.42197465896606445 0.1780626128095264 +4842 6 5.909714 0.090285778045654297 0.0081515217173091514 +4843 5 5.849253 0.84925317764282227 0.72123095973643103 +4844 6 5.93484 0.065159797668457031 0.0042457992321942584 +4845 5 5.007286 0.00728607177734375 5.3086841944605112E-05 +4846 6 6.584194 0.58419418334960938 0.34128284385951702 +4847 7 6.47132969 0.52867031097412109 0.2794922977054739 +4848 6 6.12405062 0.12405061721801758 0.015388555632171119 +4849 5 5.252341 0.25234079360961914 0.063675876119532404 +4850 6 6.12405062 0.12405061721801758 0.015388555632171119 +4851 5 5.252341 0.25234079360961914 0.063675876119532404 +4852 5 5.93845654 0.93845653533935547 0.88070066872114694 +4853 5 5.962768 0.9627680778503418 0.9269223717276418 +4854 6 6.64682436 0.64682435989379883 0.41838175255202259 +4855 6 5.811765 0.18823480606079102 0.035432342212743606 +4856 6 5.811765 0.18823480606079102 0.035432342212743606 +4857 6 5.96738768 0.032612323760986328 0.0010635636610913934 +4858 5 5.23224735 0.23224735260009766 0.053938832789754088 +4859 6 6.204521 0.20452117919921875 0.041828912741038948 +4860 6 5.651828 0.34817218780517578 0.1212238723610426 +4861 6 6.31806231 0.31806230545043945 0.10116363014844865 +4862 6 6.010396 0.010396003723144531 0.00010807689341163496 +4863 7 6.99840736 0.0015926361083984375 2.5364897737745196E-06 +4864 5 5.177444 0.1774439811706543 0.031486366453691517 +4865 6 6.59354162 0.59354162216186523 0.35229165723853839 +4866 6 6.05234241 0.052342414855957031 0.0027397283929531113 +4867 6 5.65121841 0.34878158569335938 0.12164859451877419 +4868 6 6.40162659 0.4016265869140625 0.161303915316239 +4869 6 5.28494453 0.71505546569824219 0.51130431902493001 +4870 7 6.390793 0.6092071533203125 0.37113335565663874 +4871 6 6.365685 0.36568498611450195 0.13372550906956349 +4872 5 5.51866674 0.51866674423217773 0.26901519157240728 +4873 6 6.25817537 0.25817537307739258 0.066654523263650844 +4874 6 5.92614746 0.0738525390625 0.0054541975259780884 +4875 6 5.56610727 0.43389272689819336 0.18826289845515021 +4876 7 6.79692745 0.20307254791259766 0.041238459715714271 +4877 5 4.49993134 0.50006866455078125 0.25006866926560178 +4878 4 4.44558573 0.44558572769165039 0.19854664072249761 +4879 6 5.391604 0.60839605331420898 0.37014575768830582 +4880 6 5.391604 0.60839605331420898 0.37014575768830582 +4881 6 6.151292 0.15129184722900391 0.022889223037964257 +4882 5 5.638549 0.63854885101318359 0.40774463513025694 +4883 6 5.91789675 0.082103252410888672 0.0067409440564460965 +4884 5 5.34791565 0.3479156494140625 0.12104529910720885 +4885 6 5.391604 0.60839605331420898 0.37014575768830582 +4886 7 7.167016 0.16701602935791016 0.027894354062482307 +4887 7 6.50685453 0.49314546585083008 0.24319245048923221 +4888 5 5.990843 0.99084281921386719 0.98176949238768429 +4889 6 6.151292 0.15129184722900391 0.022889223037964257 +4890 6 6.509506 0.5095062255859375 0.25959659391082823 +4891 6 5.611698 0.38830184936523438 0.15077832622046117 +4892 5 5.985514 0.98551416397094727 0.97123816738735513 +4893 6 6.2242403 0.22424030303955078 0.050283713507269567 +4894 5 5.458216 0.45821619033813477 0.20996207708799375 +4895 6 5.30194473 0.69805526733398438 0.48728115625272039 +4896 7 6.68631124 0.31368875503540039 0.098400635035659434 +4897 6 6.04107332 0.041073322296142578 0.001687017804442803 diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-out.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-out.txt new file mode 100644 index 0000000000..6483a88e76 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.529227 +L2(avg): 0.479877 +RMS(avg): 0.692731 +Loss-fn(avg): 0.479877 +R Squared: 0.383532 +L1(avg): 0.519622 +L2(avg): 0.463327 +RMS(avg): 0.680681 +Loss-fn(avg): 0.463327 +R Squared: 0.413465 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.524425 (0.0048) +L2(avg): 0.471602 (0.0083) +RMS(avg): 0.686706 (0.0060) +Loss-fn(avg): 0.471602 (0.0083) +R Squared: 0.398499 (0.0150) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-rmse: 0.444161678699535 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] (%Time%) Iteration: 50 Training-rmse: 0.447777922357938 +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-rp.txt new file mode 100644 index 0000000000..56cb0fac01 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.524425 0.471602 0.686706 0.471602 0.398499 50 0.2 20 10 + 1 Rmse LightGBMR %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Rmse + diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE.txt new file mode 100644 index 0000000000..23cd505851 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-CV-wine.RMSE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +5 6 5.80925941 0.19074058532714844 0.036381970890943194 +6 6 5.25261068 0.74738931655883789 0.55859079050628679 +8 6 5.54791927 0.45208072662353516 0.20437698338446353 +9 6 5.8812604 0.11873960494995117 0.014099093783670469 +10 5 5.785368 0.78536796569824219 0.61680284154499532 +11 5 5.39364529 0.39364528656005859 0.15495661163095065 +18 6 6.00869131 0.0086913108825683594 7.5538884857451194E-05 +20 8 7.3507967 0.64920330047607422 0.42146492534902791 +21 7 5.944835 1.0551648139953613 1.1133727846938655 +25 6 5.694817 0.30518293380737305 0.093136623087275439 +28 6 5.61064863 0.38935136795043945 0.15159448772487849 +31 6 5.437836 0.5621638298034668 0.31602817153930118 +32 6 5.90667772 0.093322277069091797 0.0087090473973603366 +35 5 6.36959553 1.3695955276489258 1.8757919093559394 +37 6 5.738825 0.26117515563964844 0.068212461923394585 +40 6 5.940867 0.059133052825927734 0.00349671793651396 +41 6 5.764175 0.2358250617980957 0.055613459772075657 +44 6 5.675231 0.32476902008056641 0.10547491640409135 +45 7 5.761184 1.2388157844543457 1.5346645478132359 +46 4 5.20731735 1.2073173522949219 1.4576151891524205 +48 6 5.509978 0.49002218246459961 0.24012173930736935 +50 6 6.087853 0.087852954864501953 0.0077181416784242174 +51 7 6.269763 0.73023700714111328 0.53324608659841033 +52 7 5.902807 1.0971927642822266 1.2038319619932736 +54 6 5.920922 0.079078197479248047 0.0062533613165669522 +56 6 6.12345076 0.12345075607299805 0.015240089174994864 +60 6 5.55601835 0.44398164749145508 0.19711970330922668 +63 6 5.4165206 0.58347940444946289 0.3404482154166999 +64 6 5.797542 0.20245790481567383 0.040989203222352444 +66 7 6.7072444 0.2927556037902832 0.085705843550613281 +68 8 6.16529369 1.8347063064575195 3.3661472309549936 +69 5 5.56024361 0.56024360656738281 0.31387289869962842 +70 6 5.368725 0.63127517700195313 0.39850834909884725 +71 5 5.117893 0.11789321899414063 0.0138988110848004 +72 5 4.764992 0.23500776290893555 0.055228648627462462 +73 6 4.900103 1.0998969078063965 1.2097732078020726 +74 8 6.16529369 1.8347063064575195 3.3661472309549936 +76 7 6.41728163 0.5827183723449707 0.33956070146837192 +77 7 6.43876266 0.56123733520507813 0.31498734642809723 +79 5 5.14644241 0.14644241333007813 0.021445380421937443 +82 5 5.25564528 0.2556452751159668 0.065354506689118352 +88 5 5.28622627 0.28622627258300781 0.08192547911676229 +90 6 5.28622627 0.71377372741699219 0.50947293395074666 +91 5 5.319233 0.31923294067382813 0.10190967041125987 +92 7 6.542394 0.45760583877563477 0.20940310368155224 +93 7 6.542394 0.45760583877563477 0.20940310368155224 +95 6 5.60025549 0.39974451065063477 0.15979567379531545 +96 6 5.275809 0.72419118881225586 0.52445287795330842 +97 7 5.49176 1.5082402229309082 2.2747885700666757 +98 4 4.39247751 0.39247751235961914 0.154038597707995 +99 6 5.275809 0.72419118881225586 0.52445287795330842 +100 5 5.7011075 0.70110750198364258 0.49155172933774338 +102 5 5.43836355 0.43836355209350586 0.19216260380403583 +104 5 5.7011075 0.70110750198364258 0.49155172933774338 +105 6 6.030436 0.030436038970947266 0.00092635246824102069 +106 5 5.72359943 0.72359943389892578 0.52359614073884586 +108 6 5.951213 0.048787117004394531 0.002380182785600482 +109 5 5.5798564 0.57985639572143555 0.33623343965905406 +111 5 5.28739548 0.28739547729492188 0.082596160369575955 +112 5 5.051069 0.051068782806396484 0.0026080205773268972 +113 5 5.307395 0.30739498138427734 0.094491674580240215 +115 4 4.551975 0.55197477340698242 0.30467615047768959 +117 6 6.53130627 0.53130626678466797 0.28228634912466077 +120 5 5.270566 0.27056598663330078 0.073205953122851497 +121 5 5.90539455 0.90539455413818359 0.81973929866308026 +122 5 5.915443 0.91544294357299805 0.83803578293759529 +123 6 5.816056 0.1839442253112793 0.033835478025366683 +125 6 6.380141 0.38014078140258789 0.14450701368537011 +128 7 5.995385 1.0046148300170898 1.0092509566902663 +129 6 5.84000444 0.15999555587768555 0.025598577900609598 +131 7 6.206945 0.79305505752563477 0.62893632426698787 +132 5 5.42901468 0.42901468276977539 0.18405359803205101 +133 5 5.59301567 0.59301567077636719 0.35166758578634472 +137 5 5.48119164 0.48119163513183594 0.23154538972084993 +138 7 6.38292551 0.61707448959350586 0.38078092570708577 +141 5 5.48119164 0.48119163513183594 0.23154538972084993 +144 6 5.967776 0.032224178314208984 0.0010383976680259366 +145 6 5.676757 0.32324314117431641 0.10448612831623905 +147 4 5.13458252 1.13458251953125 1.2872774936258793 +150 7 6.13511133 0.86488866806030273 0.74803240813912453 +151 6 6.027541 0.027541160583496094 0.0007585155262859189 +152 6 5.62424946 0.37575054168701172 0.14118846957808273 +154 6 5.33823538 0.66176462173461914 0.43793241457956356 +156 6 5.97231054 0.027689456939697266 0.00076670602561534906 +161 5 5.71372271 0.71372270584106445 0.50940010083309062 +164 5 5.853947 0.85394716262817383 0.72922575656070876 +167 7 6.47956038 0.52043962478637695 0.27085740304778483 +169 5 4.20788145 0.79211854934692383 0.627451796219475 +171 6 6.20117569 0.20117568969726563 0.040471658125170507 +173 7 6.575046 0.42495393753051758 0.18058584902269104 +174 5 5.22949076 0.22949075698852539 0.052666007543166415 +176 4 6.469169 2.4691691398620605 6.0967962412471479 +177 5 5.554319 0.55431890487670898 0.30726944830371394 +179 6 5.21643 0.7835698127746582 0.61398165149171291 +180 6 5.23204136 0.76795864105224609 0.58976047436681256 +181 5 5.114332 0.11433219909667969 0.013071851750282804 +183 6 5.728629 0.27137088775634766 0.073642158721668238 +187 5 6.144768 1.144768238067627 1.310494318888459 +188 8 6.912892 1.0871081352233887 1.1818040976688735 +189 4 5.552815 1.5528149604797363 2.4112343014896851 +191 5 5.36272526 0.36272525787353516 0.13156961269942258 +192 6 6.28948736 0.28948736190795898 0.083802932704429622 +196 5 5.54256725 0.54256725311279297 0.29437922415036155 +198 5 5.42950869 0.42950868606567383 0.18447771140586156 +199 5 5.22549 0.22549009323120117 0.050845782145415797 +201 5 5.42950869 0.42950868606567383 0.18447771140586156 +202 5 4.930763 0.069237232208251953 0.0047937943238594016 +204 4 5.89362049 1.893620491027832 3.5857985640404877 +205 5 5.62215757 0.62215757369995117 0.38708004651221017 +206 5 6.09528875 1.0952887535095215 1.1996574535644413 +207 4 4.813859 0.81385898590087891 0.66236644893160701 +209 6 5.444507 0.55549287796020508 0.30857233746451129 +210 5 5.19806051 0.19806051254272461 0.039227966628686772 +211 7 6.47038841 0.52961158752441406 0.2804884336401301 +212 5 6.09528875 1.0952887535095215 1.1996574535644413 +216 5 5.82277775 0.82277774810791016 0.67696322278152365 +218 5 5.279291 0.27929115295410156 0.078003548118431354 +219 5 6.20777273 1.2077727317810059 1.4587149716337535 +223 6 5.773505 0.22649478912353516 0.051299889500114659 +226 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +228 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +233 6 5.95629835 0.043701648712158203 0.0019098341001608787 +237 6 5.319764 0.68023586273193359 0.462720828946658 +239 6 5.79168749 0.2083125114440918 0.043394102424144876 +240 5 5.103008 0.10300779342651367 0.010610605506599313 +241 5 5.67736959 0.67736959457397461 0.45882956765331073 +242 7 6.24281359 0.7571864128112793 0.57333126374601306 +244 5 5.46525669 0.46525669097900391 0.21646378850073233 +246 7 6.98627472 0.01372528076171875 0.00018838333198800683 +247 7 5.997908 1.0020918846130371 1.0041881452073085 +248 7 6.137768 0.86223220825195313 0.74344438094703946 +249 5 5.48982763 0.48982763290405273 0.23993110995638744 +250 4 5.08111 1.0811100006103516 1.1687988334197144 +252 5 5.46525669 0.46525669097900391 0.21646378850073233 +254 6 5.661961 0.33803892135620117 0.11427031235166396 +257 7 5.922548 1.0774521827697754 1.1609032061553535 +258 6 6.399062 0.39906215667724609 0.15925060489189491 +259 4 4.36215544 0.36215543746948242 0.13115656088871219 +260 6 6.13484335 0.13484334945678711 0.018182728892725208 +262 5 5.512335 0.51233482360839844 0.26248697148184874 +267 5 5.598096 0.59809589385986328 0.35771869825202884 +268 6 5.598096 0.40190410614013672 0.16152691053230228 +269 6 5.598096 0.40190410614013672 0.16152691053230228 +271 5 5.62772274 0.62772274017333984 0.39403583853072632 +272 5 5.44098473 0.44098472595214844 0.19446752852309146 +275 6 5.79458046 0.20541954040527344 0.042197187580313766 +276 6 5.819891 0.18010902404785156 0.032439260543469572 +277 5 4.75812 0.24187994003295898 0.058505905390347834 +278 4 5.19088364 1.1908836364746094 1.4182038356229896 +279 7 6.35347462 0.64652538299560547 0.41799507085761434 +280 8 6.60628176 1.3937182426452637 1.9424505398822021 +283 5 5.44280434 0.44280433654785156 0.19607568046558299 +284 5 5.440112 0.44011211395263672 0.19369867284785869 +285 5 5.241145 0.24114513397216797 0.058150975638454838 +288 7 6.387907 0.61209297180175781 0.37465780612910748 +290 7 6.387907 0.61209297180175781 0.37465780612910748 +291 6 6.120554 0.12055397033691406 0.014533259763993556 +293 7 6.009457 0.99054288864135742 0.98117521423796461 +296 5 4.96861649 0.031383514404296875 0.00098492497636470944 +297 7 6.430575 0.56942510604858398 0.32424495139844112 +299 6 6.040891 0.040891170501708984 0.001672087824999835 +300 6 5.68149137 0.31850862503051758 0.10144774421883085 +301 6 5.41270971 0.58729028701782227 0.34490988122547606 +303 6 5.678506 0.32149410247802734 0.10335845792815235 +304 6 5.49561548 0.50438451766967773 0.25440374166487345 +308 7 5.756687 1.2433128356933594 1.5458268073998624 +309 6 5.778518 0.2214818000793457 0.049054187766387258 +311 8 5.75409937 2.2459006309509277 5.0440696441057753 +312 6 6.003036 0.0030360221862792969 9.2174307155801216E-06 +314 5 5.69624 0.69623994827270508 0.48475006557077904 +316 6 6.010912 0.010911941528320313 0.00011907046791748144 +317 5 6.118836 1.1188359260559082 1.2517938294333817 +319 6 5.91781473 0.082185268402099609 0.0067544183423251525 +321 5 6.118836 1.1188359260559082 1.2517938294333817 +323 6 5.817978 0.1820220947265625 0.033132042968645692 +327 6 5.612565 0.38743495941162109 0.15010584777428448 +328 6 5.507632 0.49236822128295898 0.24242646532934486 +329 5 5.871286 0.87128591537475586 0.75913914633042623 +331 5 6.08688164 1.0868816375732422 1.1813116940938926 +332 6 6.02704 0.027040004730224609 0.00073116185581056925 +333 5 5.85901356 0.85901355743408203 0.73790429185555695 +336 6 6.04825258 0.048252582550048828 0.0023283117227492767 +338 5 5.77029 0.77028989791870117 0.59334652683560307 +343 5 6.06355762 1.0635576248168945 1.1311548213061542 +344 6 6.182091 0.18209123611450195 0.0331572182697073 +346 7 5.75412464 1.245875358581543 1.5522054091206883 +347 6 6.342347 0.34234714508056641 0.11720156774481438 +348 6 5.79792 0.20207977294921875 0.040836234635207802 +349 5 6.08598661 1.0859866142272949 1.1793669262808635 +350 7 6.854967 0.14503288269042969 0.021034537061495939 +352 6 5.489034 0.51096582412719727 0.26108607342598589 +353 7 6.611001 0.38899898529052734 0.15132021055705991 +354 6 5.52786064 0.47213935852050781 0.22291557386415661 +355 6 6.276119 0.27611923217773438 0.076241830378421582 +358 6 5.28521156 0.71478843688964844 0.51092250951114693 +360 6 5.749971 0.25002908706665039 0.062514544379382642 +361 5 5.09363651 0.093636512756347656 0.0087677965211696574 +366 6 5.87889862 0.12110137939453125 0.014665544091258198 +368 6 5.62576056 0.37423944473266602 0.14005516199381418 +370 6 5.31511259 0.68488740921020508 0.4690707632946669 +371 6 5.62576056 0.37423944473266602 0.14005516199381418 +373 6 5.85963631 0.14036369323730469 0.019701966379216174 +376 7 5.57551432 1.4244856834411621 2.0291594623288347 +377 7 5.73623 1.2637701034545898 1.5971148743856247 +378 6 5.619952 0.38004779815673828 0.14443632888378488 +379 7 5.57551432 1.4244856834411621 2.0291594623288347 +381 6 5.39476871 0.60523128509521484 0.36630490845800523 +383 6 5.85963631 0.14036369323730469 0.019701966379216174 +384 7 6.641092 0.35890817642211914 0.128815079102651 +387 5 5.16575956 0.16575956344604492 0.027476232873823392 +388 6 5.79469872 0.20530128479003906 0.042148617536440725 +389 7 5.889894 1.1101059913635254 1.2323353120611955 +391 5 5.161842 0.16184186935424805 0.026192790676077493 +392 6 4.993642 1.0063581466674805 1.0127567193640061 +395 5 5.118578 0.11857795715332031 0.014060731922654668 +396 5 6.19858265 1.198582649230957 1.4366003670374994 +398 5 5.2838583 0.28385829925537109 0.08057553405615181 +399 6 6.63788939 0.63788938522338867 0.40690286778067275 +404 6 6.922693 0.92269277572631836 0.85136195837753803 +406 7 7.06596661 0.065966606140136719 0.0043515931256479234 +409 5 6.19858265 1.198582649230957 1.4366003670374994 +413 5 6.020768 1.0207681655883789 1.0419676478786641 +414 6 5.695077 0.30492305755615234 0.092978071029392595 +415 6 6.16900349 0.16900348663330078 0.028562178494212276 +416 6 5.963897 0.036102771759033203 0.0013034101286848454 +418 6 5.963897 0.036102771759033203 0.0013034101286848454 +419 6 5.949179 0.050820827484130859 0.0025827565061717905 +422 6 6.07098675 0.070986747741699219 0.0050391183549436391 +423 6 6.07098675 0.070986747741699219 0.0050391183549436391 +428 5 5.7041 0.70410013198852539 0.49575699586625888 +429 5 5.346765 0.34676504135131836 0.12024599390338153 +430 5 5.213252 0.21325206756591797 0.045476444321138842 +434 8 6.47353649 1.526463508605957 2.3300908431056087 +436 5 5.53445244 0.53445243835449219 0.28563940886306227 +439 5 5.28787327 0.28787326812744141 0.082871018502373772 +440 7 6.07598972 0.92401027679443359 0.85379499162172579 +441 6 5.75848246 0.24151754379272461 0.058330723959670649 +442 8 7.165652 0.83434820175170898 0.69613692176631048 +449 7 6.35148335 0.64851665496826172 0.42057385177122342 +450 5 5.120258 0.12025785446166992 0.014461951559724184 +451 5 5.365356 0.3653559684753418 0.13348498370055495 +452 7 5.664081 1.3359189033508301 1.7846793163300845 +453 7 6.27505159 0.72494840621948242 0.5255501916801677 +454 7 6.35148335 0.64851665496826172 0.42057385177122342 +455 6 6.007873 0.0078730583190917969 6.198504729582055E-05 +456 7 6.707905 0.29209518432617188 0.085319596706540324 +457 5 5.548654 0.54865407943725586 0.30102129888314266 +464 5 4.955248 0.044752120971679688 0.0020027523314638529 +465 5 5.86635351 0.86635351181030273 0.75056840742604436 +466 6 6.02778864 0.027788639068603516 0.00077220846128511766 +467 6 5.234385 0.76561498641967773 0.58616630743040332 +474 6 5.60722351 0.3927764892578125 0.1542733705136925 +480 5 5.260892 0.26089191436767578 0.068064590982430673 +482 5 5.68141937 0.68141937255859375 0.46433236129814759 +483 5 5.260892 0.26089191436767578 0.068064590982430673 +484 5 5.635592 0.63559198379516602 0.40397716986467458 +487 6 5.75940228 0.24059772491455078 0.05788726523405785 +489 6 5.510854 0.48914623260498047 0.23926403687164566 +492 6 5.79296 0.20703983306884766 0.042865492477176304 +493 6 6.572476 0.57247591018676758 0.32772866774416798 +495 6 6.27768564 0.27768564224243164 0.077109315907591736 +497 6 6.73239136 0.732391357421875 0.53639710042625666 +501 6 6.09444 0.094439983367919922 0.0089189104585329915 +502 6 4.93793154 1.0620684623718262 1.1279894187648551 +504 6 6.10658 0.10657978057861328 0.011359249628185353 +507 7 6.01234531 0.98765468597412109 0.97546177872663975 +510 6 5.070314 0.92968606948852539 0.86431618780102326 +513 6 5.1853447 0.81465530395507813 0.66366326426214073 +514 7 5.73061 1.2693901062011719 1.6113512417214224 +517 6 6.6399765 0.63997650146484375 0.40956992242718115 +519 5 5.082864 0.082863807678222656 0.006866410622933472 +520 5 5.31589842 0.31589841842651367 0.099791810764372713 +521 5 5.31589842 0.31589841842651367 0.099791810764372713 +522 6 6.029837 0.029837131500244141 0.00089025441616286116 +523 6 6.27957726 0.27957725524902344 0.078163441652577603 +527 6 6.60642529 0.60642528533935547 0.3677516266989187 +528 6 6.449012 0.44901180267333984 0.20161159893996228 +529 6 6.22961235 0.22961235046386719 0.05272183148554177 +531 5 5.883754 0.88375377655029297 0.78102073756690515 +532 6 5.89077663 0.10922336578369141 0.011929743633118051 +533 6 5.89077663 0.10922336578369141 0.011929743633118051 +534 6 5.89077663 0.10922336578369141 0.011929743633118051 +535 5 5.346645 0.34664487838745117 0.12016267171225081 +538 5 5.79111242 0.79111242294311523 0.62585886573492644 +539 6 4.73198748 1.268012523651123 1.6078557601360899 +540 4 5.58705235 1.5870523452758789 2.5187351466456676 +541 5 4.98033667 0.019663333892822266 0.00038664669978061283 +544 6 5.297719 0.70228099822998047 0.49319860047489783 +546 6 5.97325468 0.026745319366455078 0.00071531210801367706 +547 6 5.00359249 0.99640750885009766 0.99282792369285744 +548 7 6.20132637 0.79867362976074219 0.63787956687519909 +549 5 4.98033667 0.019663333892822266 0.00038664669978061283 +557 6 5.614946 0.38505411148071289 0.14826666876820127 +558 5 5.63443756 0.63443756103515625 0.40251101885223761 +559 6 7.161683 1.1616830825805664 1.3495075843538871 +560 7 5.784691 1.2153091430664063 1.4769763132208027 +561 5 5.333059 0.33305883407592773 0.11092818695601636 +563 7 5.43116951 1.5688304901123047 2.4612291067060141 +565 6 5.93264961 0.067350387573242188 0.0045360747062659357 +566 6 4.46060658 1.539393424987793 2.3697321168956478 +569 6 5.11153841 0.88846158981323242 0.78936399657345646 +577 7 6.873437 0.12656307220458984 0.016018211245864222 +578 7 6.35843754 0.64156246185302734 0.41160239245891717 +581 5 5.36346531 0.36346530914306641 0.13210703095046483 +582 6 5.353838 0.64616203308105469 0.41752537299544201 +584 7 6.347109 0.65289115905761719 0.42626686557559879 +586 6 5.49523 0.50476980209350586 0.25479255310551707 +590 5 5.23018074 0.23018074035644531 0.052983173231041292 +593 5 5.085209 0.085208892822265625 0.0072605554159963503 +594 5 4.95861244 0.041387557983398438 0.0017129299558291677 +600 6 5.57480049 0.42519950866699219 0.18079462217065156 +602 5 5.085209 0.085208892822265625 0.0072605554159963503 +604 6 5.64044237 0.3595576286315918 0.12928168830717368 +606 5 5.693975 0.69397497177124023 0.48160126144489368 +607 5 5.693975 0.69397497177124023 0.48160126144489368 +609 6 5.524192 0.47580814361572266 0.22639338953104016 +612 5 5.31914854 0.31914854049682617 0.1018557909012543 +613 5 5.47212744 0.47212743759155273 0.22290431732676552 +614 5 5.47212744 0.47212743759155273 0.22290431732676552 +617 6 5.64316273 0.35683727264404297 0.12733283914803906 +618 6 5.71493149 0.28506851196289063 0.081264056512736715 +619 6 5.982226 0.017774105072021484 0.00031591881111125986 +621 5 5.498616 0.49861621856689453 0.24861813341794914 +622 6 5.97288942 0.027110576629638672 0.00073498336519151053 +624 5 5.18843842 0.18843841552734375 0.035509036446455866 +627 6 5.47441864 0.52558135986328125 0.27623576583573595 +629 6 5.612334 0.38766622543334961 0.15028510234174064 +633 5 5.130599 0.13059902191162109 0.017056104524272087 +634 6 6.27952433 0.27952432632446289 0.078133849007144818 +638 5 5.46523762 0.46523761749267578 0.2164460407302613 +639 5 5.31655645 0.31655645370483398 0.1002079883821807 +641 4 5.31725073 1.3172507286071777 1.7351494820161406 +642 6 5.8524847 0.14751529693603516 0.021760762830126623 +644 5 5.4044795 0.4044795036315918 0.16360366885805888 +645 5 5.498191 0.49819087982177734 0.2481941527375966 +649 7 6.201396 0.79860401153564453 0.63776836724082386 +652 7 6.201396 0.79860401153564453 0.63776836724082386 +653 6 5.41541433 0.58458566665649414 0.34174040166021769 +654 7 7.25669 0.25669002532958984 0.065889769103705476 +656 6 6.05820942 0.058209419250488281 0.0033883364894791157 +657 5 5.41170025 0.41170024871826172 0.16949709479467856 +660 5 5.218737 0.21873712539672852 0.047845930026824135 +661 7 7.051301 0.051301002502441406 0.0026317928577554994 +665 5 5.25191 0.25191020965576172 0.063458753728809825 +668 6 5.54373264 0.45626735687255859 0.20817990094747074 +670 6 5.238275 0.76172494888305664 0.58022489775089525 +678 7 6.917017 0.082983016967773438 0.0068861811050737742 +679 7 6.917017 0.082983016967773438 0.0068861811050737742 +680 5 5.33085632 0.3308563232421875 0.10946590662933886 +681 5 4.892623 0.10737705230712891 0.011529831362167897 +682 6 5.313394 0.68660593032836914 0.4714277035620853 +683 5 5.51385975 0.51385974884033203 0.26405184147824912 +685 5 5.8867135 0.88671350479125977 0.78626083957919946 +688 6 5.619183 0.38081693649291992 0.1450215391198526 +689 7 6.298906 0.70109415054321289 0.49153300792590926 +691 6 5.242263 0.75773715972900391 0.57416560323417798 +692 5 5.242263 0.24226284027099609 0.058691283776170167 +693 5 5.38634968 0.38634967803955078 0.14926607372126455 +694 6 5.18373251 0.81626749038696289 0.66629261586263056 +696 6 6.368618 0.36861801147460938 0.13587923838349525 +697 5 5.601098 0.60109806060791016 0.36131887846659083 +698 5 5.601098 0.60109806060791016 0.36131887846659083 +700 5 4.656213 0.34378719329833984 0.11818963427595008 +702 4 5.09696865 1.0969686508178711 1.2033402208771804 +704 6 6.340482 0.34048223495483398 0.11592815231983877 +705 5 4.518304 0.48169612884521484 0.23203116054446582 +706 5 5.316164 0.31616401672363281 0.099959685470821569 +707 6 6.184279 0.18427896499633789 0.033958736940121526 +711 6 6.457628 0.45762777328491211 0.20942317888170692 +712 6 6.457628 0.45762777328491211 0.20942317888170692 +714 6 6.295977 0.29597711563110352 0.087602452977307621 +718 7 6.52073431 0.47926568984985352 0.22969560146725598 +719 7 6.42389059 0.57610940933227539 0.33190205152118324 +720 5 5.19151926 0.19151926040649414 0.036679627106650514 +721 5 5.675269 0.67526912689208984 0.45598839373360534 +722 6 6.34894657 0.34894657135009766 0.12176370965698879 +723 8 6.46900225 1.5309977531433105 2.3439541201298653 +724 7 5.61504459 1.3849554061889648 1.9181014771320406 +725 5 5.293491 0.29349088668823242 0.086136900569044883 +726 7 6.81589365 0.18410634994506836 0.033895148090095972 +727 5 5.53785133 0.53785133361816406 0.28928405707483762 +728 5 6.199583 1.1995830535888672 1.438999502457591 +729 5 5.00468874 0.0046887397766113281 2.1984280692777247E-05 +732 7 4.63813353 2.3618664741516113 5.5784132417213641 +735 6 5.423086 0.57691383361816406 0.33282957142000669 +738 7 6.386245 0.61375522613525391 0.37669547760833666 +749 6 6.437719 0.43771886825561523 0.19159780762697665 +752 6 5.85753632 0.14246368408203125 0.020295901282224804 +757 6 5.437741 0.56225919723510742 0.31613540487546743 +758 7 6.76649237 0.23350763320922852 0.0545258147669756 +760 6 5.98200846 0.017991542816162109 0.00032369561290579441 +761 6 5.923116 0.076883792877197266 0.005911117607183769 +764 6 5.51022 0.48977994918823242 0.23988439862682753 +765 6 5.8884306 0.11156940460205078 0.01244773204325611 +770 7 6.357949 0.64205121994018555 0.41222976902668051 +773 5 5.643422 0.64342212677001953 0.41399203321725508 +774 9 5.385422 3.6145777702331543 13.065172457063682 +778 7 5.48641634 1.5135836601257324 2.2909354961996087 +779 8 6.92966747 1.0703325271606445 1.1456117186980919 +780 4 4.419568 0.41956806182861328 0.17603735850661906 +781 6 5.43529367 0.56470632553100586 0.31889323409473036 +782 7 5.48641634 1.5135836601257324 2.2909354961996087 +783 8 6.92966747 1.0703325271606445 1.1456117186980919 +784 5 5.181534 0.1815338134765625 0.032954525435343385 +785 6 5.83593655 0.16406345367431641 0.026916816831544566 +786 6 5.83314848 0.16685152053833008 0.027839429905952784 +788 7 5.66685 1.3331499099731445 1.7772886824614034 +792 5 5.650315 0.6503148078918457 0.42290934936340818 +794 5 5.241264 0.24126386642456055 0.058208253242128194 +795 5 5.309075 0.30907487869262695 0.095527280638862067 +799 8 6.387804 1.6121959686279297 2.5991758412601484 +802 5 5.40781832 0.40781831741333008 0.16631578001783964 +806 5 5.720001 0.720001220703125 0.51840175781399012 +810 5 5.14145136 0.14145135879516602 0.02000848690499879 +816 5 4.93575239 0.064247608184814453 0.0041277551574694371 +817 5 4.872991 0.12700891494750977 0.01613126447614377 +819 5 4.872991 0.12700891494750977 0.01613126447614377 +821 6 5.016827 0.98317289352416992 0.96662893856068877 +826 6 5.95949173 0.040508270263671875 0.0016409199597546831 +827 9 6.604491 2.3955087661743164 5.7384622488179957 +829 7 5.97121668 1.0287833213806152 1.0583951223509303 +836 8 6.864734 1.1352658271789551 1.2888284983603171 +838 8 6.864734 1.1352658271789551 1.2888284983603171 +840 7 6.47057533 0.52942466735839844 0.28029047840755084 +841 7 6.015294 0.98470592498779297 0.96964575870606495 +845 8 6.51863337 1.4813666343688965 2.1944471054214318 +848 7 6.015294 0.98470592498779297 0.96964575870606495 +850 7 6.28177261 0.71822738647460938 0.5158505786821479 +851 5 5.376349 0.37634897232055664 0.14163854896673911 +854 7 6.6217103 0.37828969955444336 0.14310309678899102 +855 7 6.141239 0.85876083374023438 0.73747016956622247 +856 5 5.376349 0.37634897232055664 0.14163854896673911 +858 7 5.7223134 1.277686595916748 1.6324830373853274 +859 5 5.4418416 0.44184160232543945 0.19522400154551178 +860 8 5.917643 2.0823569297790527 4.3362103829988428 +861 7 5.812392 1.1876077651977539 1.4104122039580034 +862 6 5.99450731 0.0054926872253417969 3.0169612955432967E-05 +863 6 6.19006824 0.19006824493408203 0.0361259377323222 +864 5 5.983109 0.9831089973449707 0.96650330066063361 +870 5 5.25949574 0.25949573516845703 0.067338036570617987 +871 5 5.097201 0.097200870513916016 0.0094480092286630679 +872 6 5.8650465 0.13495349884033203 0.018212446849247499 +874 5 5.70609665 0.70609664916992188 0.49857247796899173 +876 9 6.585497 2.4145030975341797 5.8298252080021484 +881 6 4.8947916 1.1052083969116211 1.2214856006039554 +885 7 6.47537041 0.52462959289550781 0.27523620974170626 +887 7 6.98054171 0.019458293914794922 0.00037862520207454509 +888 6 5.94279051 0.057209491729736328 0.0032729259439747693 +890 6 5.56031656 0.43968343734741211 0.19332152507763567 +895 6 5.81204939 0.18795061111450195 0.035325432218314745 +896 6 5.99438763 0.0056123733520507813 3.1498734642809723E-05 +898 6 5.335319 0.66468095779418945 0.44180077565420106 +900 7 6.235049 0.76495122909545898 0.58515038289465338 +902 5 5.44993544 0.4499354362487793 0.20244189679237934 +904 8 5.86388254 2.1361174583435059 4.5629977958399195 +906 4 4.79390144 0.79390144348144531 0.63027950196192251 +908 4 5.38352728 1.3835272789001465 1.9141477314608437 +910 5 5.037945 0.037944793701171875 0.0014398073690244928 +912 5 5.076084 0.076084136962890625 0.0057887958973878995 +914 4 5.011776 1.0117759704589844 1.0236906143982196 +918 6 6.556393 0.55639314651489258 0.30957333348874272 +919 7 5.32240725 1.6775927543640137 2.8143174494946379 +920 7 5.549413 1.4505867958068848 2.1042020521692848 +921 6 5.48633146 0.51366853713989258 0.2638553660474372 +924 8 6.586571 1.413428783416748 1.9977809257909485 +925 5 5.22027159 0.22027158737182617 0.048519572203304051 +926 5 4.644633 0.35536718368530273 0.12628583524042369 +927 7 5.53496361 1.4650363922119141 2.1463316305053013 +930 7 6.20272636 0.79727363586425781 0.63564525044421316 +934 5 5.356482 0.35648202896118164 0.12707943697228075 +935 5 5.21572351 0.21572351455688477 0.046536634732774473 +936 5 5.39356565 0.39356565475463867 0.15489392460244744 +937 5 5.48697138 0.48697137832641602 0.2371411233091294 +938 6 5.733418 0.26658201217651367 0.071065969216078884 +940 5 5.48649 0.48648977279663086 0.23667229903571751 +944 7 5.61722565 1.3827743530273438 1.9120649113901891 +950 5 5.26733351 0.2673335075378418 0.071467204252485317 +953 5 5.79355431 0.79355430603027344 0.62972843661918887 +955 5 5.26733351 0.2673335075378418 0.071467204252485317 +956 5 4.970438 0.029561996459960938 0.000873911634698743 +958 7 5.838447 1.161552906036377 1.3492051535215523 +959 6 5.76039362 0.23960638046264648 0.057411217558410499 +960 6 5.76039362 0.23960638046264648 0.057411217558410499 +964 6 5.433831 0.56616878509521484 0.32054709321619157 +965 5 5.850355 0.85035514831542969 0.72310387826655642 +968 7 6.966538 0.033462047576904297 0.0011197086280390067 +969 7 5.98017645 1.0198235511779785 1.040040075537263 +970 7 6.274452 0.72554779052734375 0.52641959633911029 +971 7 6.336352 0.66364812850952148 0.44042883847419034 +972 6 5.526252 0.47374820709228516 0.2244373637231547 +974 6 7.051524 1.0515241622924805 1.1057030638849028 +976 6 6.41369772 0.41369771957397461 0.17114580318070693 +980 6 5.652429 0.34757089614868164 0.12080552784959764 +982 6 6.40746641 0.40746641159057617 0.16602887657450083 +983 6 6.51755238 0.51755237579345703 0.26786046168945177 +985 6 6.25447845 0.25447845458984375 0.064759283850435168 +986 6 5.613062 0.38693809509277344 0.14972108943402418 +989 7 5.79079962 1.209200382232666 1.4621655643916256 +992 5 5.663801 0.66380119323730469 0.44063202414326952 +994 6 5.55731869 0.44268131256103516 0.1959667444907609 +995 6 5.59174728 0.40825271606445313 0.16667028017400298 +997 6 5.473357 0.52664279937744141 0.277352638136108 +998 6 5.78107262 0.21892738342285156 0.047929199212376261 +999 7 5.74751568 1.2524843215942383 1.5687169758393793 +1002 6 5.24164534 0.75835466384887695 0.57510179618134316 +1004 6 6.97149324 0.97149324417114258 0.94379912347017125 +1006 6 6.97149324 0.97149324417114258 0.94379912347017125 +1007 5 4.93337536 0.066624641418457031 0.0044388428441379801 +1015 5 5.16026 0.16026020050048828 0.025683331864456704 +1016 5 5.38627958 0.38627958297729492 0.14921191622511287 +1017 6 5.939317 0.060682773590087891 0.0036823990105858684 +1018 6 5.7577734 0.24222660064697266 0.058673726060987974 +1021 7 6.02436972 0.97563028335571289 0.95185444980074863 +1025 6 6.155214 0.15521383285522461 0.024091333909609602 +1026 6 6.420076 0.42007589340209961 0.17646375621757215 +1027 4 4.320953 0.3209528923034668 0.10301075907796076 +1030 6 6.197439 0.19743919372558594 0.038982235219009453 +1032 6 5.37426758 0.625732421875 0.39154106378555298 +1033 6 5.37426758 0.625732421875 0.39154106378555298 +1034 3 4.92883873 1.9288387298583984 3.7204188458017597 +1037 5 4.7021246 0.29787540435791016 0.088729756521388481 +1039 5 5.92955065 0.9295506477355957 0.86406440670566553 +1040 4 5.261669 1.2616691589355469 1.5918090666091302 +1044 7 5.83602762 1.1639723777770996 1.3548316962280751 +1045 5 6.239166 1.2391657829284668 1.5355318375807201 +1047 5 3.99405575 1.0059442520141602 1.0119238381603282 +1049 6 7.25993538 1.2599353790283203 1.5874371593272372 +1051 6 5.60375547 0.39624452590942383 0.15700972431318405 +1052 5 5.979352 0.97935199737548828 0.95913033476335841 +1053 4 5.19417763 1.1941776275634766 1.4260602061731333 +1054 5 3.99405575 1.0059442520141602 1.0119238381603282 +1058 6 5.740259 0.25974082946777344 0.067465298492606962 +1059 4 5.367808 1.3678078651428223 1.8708983559465651 +1060 7 6.01093769 0.98906230926513672 0.97824425160888495 +1061 5 5.697409 0.69740915298461914 0.4863795266667239 +1064 6 5.840905 0.15909481048583984 0.025311158723525295 +1065 5 5.58919859 0.58919858932495117 0.34715497766251247 +1068 7 4.898771 2.101229190826416 4.415164112381035 +1069 6 6.51569176 0.51569175720214844 0.26593798844623961 +1071 5 5.58919859 0.58919858932495117 0.34715497766251247 +1072 7 5.658098 1.3419017791748047 1.8007003849525063 +1074 6 4.78750324 1.2124967575073242 1.470148386965775 +1075 7 6.55795527 0.44204473495483398 0.19540354770128943 +1076 6 5.85578537 0.14421463012695313 0.020797859542653896 +1077 5 5.646455 0.64645481109619141 0.41790382278941252 +1079 6 5.67320061 0.32679939270019531 0.10679784306921647 +1080 7 5.97999525 1.0200047492980957 1.0404096885906711 +1082 6 5.49658728 0.50341272354125977 0.25342437022322883 +1083 6 6.262478 0.26247787475585938 0.0688946347363526 +1084 7 5.99038124 1.0096187591552734 1.019330038838234 +1085 5 4.72637224 0.27362775802612305 0.074872149962402545 +1086 8 6.815828 1.1841721534729004 1.4022636890606464 +1088 6 6.262478 0.26247787475585938 0.0688946347363526 +1090 6 5.95233536 0.047664642333984375 0.0022719181288266554 +1091 6 6.284743 0.28474283218383789 0.081078480480073267 +1092 6 6.023808 0.023808002471923828 0.00056682098170313111 +1094 5 5.72295761 0.72295761108398438 0.52266770742426161 +1095 8 6.37091827 1.6290817260742188 2.6539072702289559 +1098 6 5.96830368 0.031696319580078125 0.0010046566749224439 +1099 7 6.86467171 0.13532829284667969 0.018313746844796697 +1100 6 5.49658728 0.50341272354125977 0.25342437022322883 +1101 6 6.43475533 0.43475532531738281 0.18901219289182336 +1103 5 4.511087 0.48891305923461914 0.2390359794901542 +1112 6 5.26224566 0.73775434494018555 0.54428147347812228 +1119 5 4.98052025 0.019479751586914063 0.00037946072188788094 +1122 7 6.588348 0.4116520881652832 0.1694574416908381 +1125 6 4.712504 1.2874960899353027 1.6576461815986931 +1126 7 7.344084 0.34408378601074219 0.11839365179548622 +1129 7 6.40953732 0.59046268463134766 0.34864618194205832 +1130 6 5.62957954 0.37042045593261719 0.13721131417332799 +1133 5 5.253349 0.25334882736206055 0.064185628325731159 +1134 5 5.680931 0.68093109130859375 0.46366715111071244 +1135 6 5.65637636 0.34362363815307617 0.11807720469755623 +1136 8 6.62064457 1.3793554306030273 1.902621403934063 +1137 8 6.2427845 1.7572154998779297 3.0878063130112423 +1138 5 5.055894 0.055893898010253906 0.0031241278347806656 +1140 6 5.753335 0.24666500091552734 0.060843622676657105 +1141 5 4.90070629 0.099293708801269531 0.0098592406075113104 +1143 5 5.72487831 0.72487831115722656 0.52544856598615297 +1144 5 5.61719847 0.61719846725463867 0.38093394798147528 +1146 5 5.02811861 0.028118610382080078 0.00079065624981922156 +1147 5 5.056607 0.056606769561767578 0.0032043263602190564 +1148 6 6.078053 0.078052997589111328 0.0060922704326458188 +1151 5 5.05896759 0.05896759033203125 0.0034771767095662653 +1153 6 5.77633762 0.22366237640380859 0.050024858618598955 +1155 4 6.221552 2.2215518951416016 4.9352928228072415 +1158 6 5.825183 0.17481708526611328 0.030561013300939521 +1159 6 5.808246 0.19175386428833008 0.036769544469507309 +1164 6 5.17904854 0.82095146179199219 0.67396130261840881 +1165 5 6.273182 1.2731819152832031 1.6209921894042054 +1166 5 4.81632471 0.18367528915405273 0.033736611845824882 +1168 5 5.876407 0.87640714645385742 0.76808948635539309 +1169 6 6.071286 0.071286201477050781 0.005081722521026677 +1170 6 5.34411 0.65588998794555664 0.43019167628722244 +1174 6 5.6522193 0.34778070449829102 0.12095141842132762 +1175 5 5.39869833 0.39869832992553711 0.15896035828541244 +1177 6 5.67815351 0.32184648513793945 0.10358515999564588 +1181 6 5.36447144 0.635528564453125 0.40389655623584986 +1182 5 6.27437162 1.2743716239929199 1.6240230360383521 +1184 7 6.60242748 0.39757251739501953 0.15806390658781311 +1186 5 5.32623339 0.3262333869934082 0.10642822278919084 +1187 8 6.35104036 1.6489596366882324 2.7190678834269875 +1191 7 6.0864296 0.91357040405273438 0.83461088316107634 +1195 6 5.57003355 0.42996644973754883 0.1848711478999121 +1198 6 5.755423 0.24457693099975586 0.059817875177259339 +1199 7 5.731105 1.268895149230957 1.6100948997418527 +1200 6 6.085916 0.085916042327880859 0.0073815663292862155 +1201 7 5.94414234 1.0558576583862305 1.1148353947728538 +1202 5 5.404809 0.40480899810791016 0.16387032494913001 +1204 6 5.518382 0.48161792755126953 0.23195582813877991 +1206 6 5.445193 0.55480718612670898 0.30781101377783671 +1207 5 5.404809 0.40480899810791016 0.16387032494913001 +1208 6 6.66462374 0.66462373733520508 0.44172471222941567 +1210 6 4.54080772 1.4591922760009766 2.1292420983409102 +1212 6 6.115354 0.11535406112670898 0.013306559418424513 +1213 6 5.518382 0.48161792755126953 0.23195582813877991 +1214 6 4.642589 1.3574109077453613 1.8425643724660858 +1216 8 6.710257 1.2897429466247559 1.6634368683683078 +1218 8 6.31677532 1.6832246780395508 2.8332453167613494 +1220 6 5.611329 0.38867092132568359 0.15106508508415573 +1221 7 7.4408474 0.44084739685058594 0.19434642730993801 +1229 3 6.484815 3.4848151206970215 12.143936425438596 +1231 7 6.67793751 0.32206249237060547 0.10372424899196631 +1232 7 6.457521 0.54247903823852539 0.29428350692819549 +1233 6 6.70588541 0.70588541030883789 0.49827421248687642 +1234 6 6.234978 0.23497819900512695 0.055214754007693045 +1238 7 6.59822941 0.40177059173583984 0.1614196083837669 +1240 6 5.63298655 0.36701345443725586 0.13469887573796768 +1243 7 6.59822941 0.40177059173583984 0.1614196083837669 +1246 7 5.8469286 1.153071403503418 1.3295736615773421 +1248 7 5.684961 1.3150391578674316 1.7293279867246838 +1249 5 4.7347455 0.26525449752807617 0.070359948458872168 +1251 5 5.594396 0.59439611434936523 0.35330674075362367 +1253 7 6.62163353 0.37836647033691406 0.14316118587521487 +1254 5 5.51827049 0.51827049255371094 0.26860430345186614 +1255 6 5.69098949 0.30901050567626953 0.095487492618303804 +1257 6 5.76259565 0.23740434646606445 0.05636082372097917 +1259 6 5.48381853 0.51618146896362305 0.26644330890144374 +1260 6 5.49859047 0.50140953063964844 0.25141151741627255 +1261 6 5.657525 0.34247493743896484 0.11728908277382288 +1263 6 4.709868 1.2901320457458496 1.664440695460371 +1265 7 6.08131742 0.91868257522583008 0.84397767402356294 +1266 8 6.710818 1.289182186126709 1.6619907090264405 +1268 5 5.2311573 0.23115730285644531 0.05343369866386638 +1269 6 5.478538 0.52146196365356445 0.27192257953743137 +1274 6 5.478538 0.52146196365356445 0.27192257953743137 +1277 5 5.2311573 0.23115730285644531 0.05343369866386638 +1280 6 6.807374 0.80737400054931641 0.65185277676300757 +1281 7 6.404438 0.59556198120117188 0.354694073452265 +1282 5 4.99746656 0.0025334358215332031 6.4182970618276158E-06 +1285 6 6.807374 0.80737400054931641 0.65185277676300757 +1290 6 5.89834833 0.10165166854858398 0.010333061718711178 +1291 6 5.971956 0.028044223785400391 0.00078647848772561701 +1293 4 5.190955 1.1909551620483398 1.4183741980095874 +1296 6 6.45353 0.45352983474731445 0.20568931100592636 +1297 7 6.804424 0.19557619094848633 0.038250046465918786 +1300 6 5.398065 0.60193490982055664 0.36232563566068166 +1301 5 6.25851965 1.2585196495056152 1.5838717081917366 +1302 6 5.77307749 0.22692251205444336 0.051493826477098992 +1306 8 6.853728 1.1462721824645996 1.3139399162921563 +1308 6 5.370329 0.62967109680175781 0.39648569014752866 +1313 5 4.95963049 0.040369510650634766 0.0016296973901717138 +1314 6 5.40624571 0.59375429153442383 0.35254415871554556 +1320 6 5.42479229 0.57520771026611328 0.33086390994958492 +1323 5 6.09546757 1.0954675674438477 1.2000491913213409 +1324 6 5.879797 0.12020301818847656 0.014448765581619227 +1325 7 6.58349276 0.41650724411010742 0.17347828439619661 +1327 6 5.74115562 0.25884437561035156 0.067000410785112763 +1328 6 6.5878973 0.58789730072021484 0.34562323619411472 +1330 5 5.31433058 0.3143305778503418 0.098803712171729785 +1331 6 5.859345 0.1406550407409668 0.019783840485843029 +1334 6 5.78381538 0.21618461608886719 0.046735788233490894 +1336 8 5.991396 2.0086040496826172 4.0344902284014097 +1337 5 5.665654 0.66565418243408203 0.44309549059198616 +1338 5 5.665654 0.66565418243408203 0.44309549059198616 +1340 6 5.678114 0.32188606262207031 0.10361063731033937 +1341 5 4.881372 0.11862802505493164 0.014072608328433489 +1344 8 6.458304 1.5416960716247559 2.3768267772632043 +1345 8 7.06284952 0.93715047836303711 0.87825101909606929 +1346 7 6.51082373 0.48917627334594727 0.23929342640462892 +1348 8 5.991396 2.0086040496826172 4.0344902284014097 +1350 7 6.269445 0.73055505752563477 0.53371069207628352 +1354 5 6.408069 1.4080691337585449 1.9826586854435391 +1355 5 5.80267048 0.80267047882080078 0.6442798975704136 +1356 6 5.897979 0.10202121734619141 0.010408328788798826 +1361 7 6.297319 0.70268106460571289 0.49376067855541805 +1363 4 5.39580774 1.3958077430725098 1.9482792556211734 +1365 7 6.33742571 0.66257429122924805 0.43900469139794041 +1366 6 5.644856 0.35514402389526367 0.12612727770851961 +1367 5 5.3965373 0.39653730392456055 0.1572418334037593 +1370 6 5.53704166 0.46295833587646484 0.21433042075750564 +1372 6 4.98262644 1.0173735618591309 1.0350489643699348 +1373 6 4.98262644 1.0173735618591309 1.0350489643699348 +1375 7 6.539049 0.46095085144042969 0.21247568744365708 +1379 6 4.545688 1.4543118476867676 2.1150229503220999 +1380 7 6.878299 0.12170076370239258 0.014811075885745595 +1381 7 6.69022655 0.30977344512939453 0.095959587307334004 +1382 6 4.617643 1.382357120513916 1.9109112086355253 +1383 6 5.60604048 0.39395952224731445 0.15520410516933225 +1384 6 4.96960258 1.0303974151611328 1.0617188331707439 +1386 7 6.814375 0.18562507629394531 0.034456668949133018 +1388 7 6.14732 0.85268020629882813 0.72706353421381209 +1389 6 5.456267 0.54373311996459961 0.29564570574643767 +1393 6 5.9041357 0.095864295959472656 0.0091899632398053654 +1394 7 6.814375 0.18562507629394531 0.034456668949133018 +1395 7 6.31325054 0.68674945831298828 0.47162481849318283 +1398 7 6.0729084 0.92709159851074219 0.85949883202920319 +1400 7 6.0729084 0.92709159851074219 0.85949883202920319 +1403 8 6.553515 1.4464850425720215 2.0923189783845828 +1404 5 4.51477766 0.48522233963012695 0.23544071887613427 +1406 8 5.84692955 2.1530704498291016 4.6357123619272897 +1407 6 6.19066143 0.19066143035888672 0.03635178102649661 +1408 7 6.0729084 0.92709159851074219 0.85949883202920319 +1409 6 5.880574 0.11942577362060547 0.014262515404880105 +1411 6 6.30539227 0.30539226531982422 0.09326443571717391 +1413 6 5.36225033 0.63774967193603516 0.40672464405452047 +1416 6 5.817216 0.18278408050537109 0.033410020086193981 +1419 7 5.729145 1.2708549499511719 1.6150723038153956 +1420 4 5.15809631 1.1580963134765625 1.3411870712880045 +1421 6 6.552526 0.55252599716186523 0.30528497753971351 +1424 6 5.36225033 0.63774967193603516 0.40672464405452047 +1425 6 5.522351 0.47764921188354492 0.22814876961297159 +1426 6 6.43497562 0.43497562408447266 0.18920379354767647 +1427 5 6.09880924 1.0988092422485352 1.2073817508508 +1431 5 5.47524738 0.47524738311767578 0.2258600751601989 +1434 5 6.09880924 1.0988092422485352 1.2073817508508 +1436 5 4.29367065 0.706329345703125 0.49890114460140467 +1437 7 6.381414 0.61858606338500977 0.38264871781416332 +1438 5 5.76378441 0.76378440856933594 0.58336662277361029 +1439 5 5.28301859 0.28301858901977539 0.080099521730744527 +1440 5 5.32609844 0.32609844207763672 0.10634019392546179 +1442 5 5.15215874 0.15215873718261719 0.02315228130100877 +1443 6 6.60022068 0.60022068023681641 0.36026486498394661 +1447 6 5.92240143 0.07759857177734375 0.00602153834188357 +1456 6 6.18065453 0.18065452575683594 0.032636057676427299 +1457 6 6.200436 0.20043611526489258 0.040174636302481304 +1458 6 6.735425 0.73542499542236328 0.54084992389198305 +1459 6 6.14485168 0.1448516845703125 0.020982010522857308 +1460 6 6.245408 0.24540805816650391 0.060225115013054165 +1461 6 6.01023769 0.010237693786621094 0.00010481037406862015 +1462 6 5.92240143 0.07759857177734375 0.00602153834188357 +1463 6 5.547709 0.45229101181030273 0.20456715936438741 +1464 8 6.88174152 1.1182584762573242 1.2505020197213526 +1465 5 5.582034 0.58203411102294922 0.33876370639427478 +1470 7 6.841235 0.15876483917236328 0.025206274157426378 +1471 6 6.24523163 0.24523162841796875 0.060138551576528698 +1474 4 4.629509 0.62950897216796875 0.39628154603997245 +1478 6 5.93162775 0.068372249603271484 0.0046747645158120577 +1480 6 6.046388 0.046388149261474609 0.0021518603919048473 +1482 6 5.490122 0.50987815856933594 0.25997573658605688 +1484 3 4.92298555 1.9229855537414551 3.6978734398983306 +1485 6 5.54977131 0.45022869110107422 0.20270587429058651 +1486 6 5.915575 0.084424972534179688 0.0071275759873969946 +1488 6 5.247855 0.75214481353759766 0.56572182053150755 +1489 5 5.878215 0.87821483612060547 0.77126129838234192 +1492 5 5.32583046 0.32583045959472656 0.10616548839971074 +1494 8 6.80715847 1.1928415298461914 1.4228709153258023 +1495 7 6.69690275 0.30309724807739258 0.091867941792088459 +1498 6 5.70931149 0.29068851470947266 0.084499812583999301 +1502 5 5.34187937 0.34187936782836914 0.11688150214672532 +1503 7 6.465032 0.53496789932250977 0.28619065330553894 +1505 7 5.42042446 1.5795755386352539 2.4950588822548525 +1506 6 6.12831974 0.12831974029541016 0.016465955749481509 +1508 6 5.17407465 0.82592535018920898 0.68215268408516749 +1509 5 5.704465 0.70446491241455078 0.4962708128232407 +1510 5 5.57555246 0.57555246353149414 0.33126063827717189 +1511 6 5.37051249 0.62948751449584961 0.39625453090616247 +1514 7 6.654268 0.34573221206665039 0.11953076246049932 +1518 6 6.37047958 0.37047958374023438 0.13725512196833733 +1519 5 5.5685 0.56850004196166992 0.32319229771042046 +1521 5 5.34187937 0.34187936782836914 0.11688150214672532 +1522 5 6.161465 1.1614651679992676 1.3490013364755669 +1523 6 5.701397 0.29860305786132813 0.089163786164135672 +1524 6 5.57626057 0.42373943328857422 0.17955510732372204 +1525 5 5.21797943 0.21797943115234375 0.047515032405499369 +1528 6 6.10163975 0.10163974761962891 0.01033063829618186 +1529 6 5.57626057 0.42373943328857422 0.17955510732372204 +1531 7 5.82842255 1.1715774536132813 1.3725937298149802 +1534 6 5.86905527 0.13094472885131836 0.017146522013945287 +1535 6 6.004974 0.0049738883972167969 2.4739565787967877E-05 +1536 5 5.1332283 0.13322830200195313 0.017749780454323627 +1537 6 5.380709 0.61929082870483398 0.38352113051792003 +1539 6 6.15297651 0.15297651290893555 0.023401813501777724 +1541 4 4.89264536 0.89264535903930664 0.79681573701441266 +1544 5 5.1332283 0.13322830200195313 0.017749780454323627 +1545 6 6.029986 0.029985904693603516 0.00089915448029387335 +1546 6 5.563477 0.4365229606628418 0.19055229518585293 +1547 6 5.563477 0.4365229606628418 0.19055229518585293 +1548 6 7.126276 1.1262760162353516 1.2684976647469739 +1550 6 5.78761339 0.2123866081237793 0.045108071310323794 +1553 7 6.29732943 0.70267057418823242 0.49374593583002024 +1555 7 6.534805 0.4651951789855957 0.21640655455144042 +1556 6 5.79464149 0.20535850524902344 0.042172115678113187 +1557 6 5.78761339 0.2123866081237793 0.045108071310323794 +1558 4 5.60473728 1.6047372817993164 2.5751817435966586 +1563 6 6.508431 0.50843095779418945 0.25850203884351686 +1565 6 5.905046 0.094954013824462891 0.0090162647413762897 +1566 5 5.85104227 0.85104227066040039 0.7242729464508102 +1568 6 5.8718257 0.1281743049621582 0.016428652452532333 +1570 5 5.52583742 0.52583742141723633 0.27650499376272819 +1574 4 6.22960234 2.2296023368835449 4.9711265806365645 +1575 6 5.44509125 0.55490875244140625 0.30792372353607789 +1577 4 5.4131093 1.413109302520752 1.9968779008706861 +1579 4 5.4505353 1.4505352973937988 2.1040526489853164 +1582 7 6.07192755 0.92807245254516602 0.86131847717319943 +1583 5 5.42974424 0.42974424362182617 0.18468011492609548 +1584 6 5.56638336 0.43361663818359375 0.18802338890964165 +1586 5 5.02551937 0.025519371032714844 0.00065123829790536547 +1590 6 6.50889826 0.50889825820922852 0.25897743720838662 +1591 6 6.791677 0.79167699813842773 0.62675246938147211 +1593 6 5.138271 0.86172914505004883 0.74257711942868809 +1594 6 5.59737825 0.40262174606323242 0.16210427040300601 +1595 6 5.506587 0.49341297149658203 0.24345636044108687 +1601 6 5.445505 0.55449485778808594 0.30746454731342965 +1602 5 6.579205 1.5792050361633301 2.4938885462436247 +1604 5 5.067999 0.067998886108398438 0.004623848511982942 +1605 9 6.921087 2.0789132118225098 4.3218801422901834 +1606 6 6.41273069 0.41273069381713867 0.17034662561877667 +1608 5 5.352296 0.35229587554931641 0.12411238392905943 +1611 6 5.439003 0.56099700927734375 0.31471764441812411 +1612 7 5.95403051 1.0459694862365723 1.0940521661379989 +1614 5 5.99248362 0.99248361587524414 0.98502372778079916 +1615 6 6.17295 0.17294979095458984 0.029911630191236327 +1618 6 5.036212 0.96378803253173828 0.92888737165139901 +1620 7 5.95403051 1.0459694862365723 1.0940521661379989 +1622 6 5.21739149 0.7826085090637207 0.61247607845893981 +1624 7 5.79714 1.2028598785400391 1.4468718874013575 +1625 6 6.154775 0.15477514266967773 0.023955344788419097 +1627 5 4.874259 0.12574100494384766 0.015810800324288721 +1630 5 5.171584 0.17158412933349609 0.029441113439133915 +1631 6 5.820287 0.17971277236938477 0.032296680552690304 +1635 6 5.85868073 0.14131927490234375 0.019971137458924204 +1637 6 6.16494942 0.16494941711425781 0.027208310206333408 +1638 5 5.0219636 0.021963596343994141 0.00048239956436191278 +1640 5 5.314522 0.31452178955078125 0.098923956102225929 +1643 7 6.005394 0.99460601806640625 0.98924113117391244 +1645 7 6.072939 0.92706108093261719 0.8594422477799526 +1648 5 6.300005 1.3000049591064453 1.6900128937013505 +1649 4 5.1877737 1.1877737045288086 1.4108063731700895 +1650 7 6.635081 0.36491918563842773 0.13316601204701328 +1652 4 5.59403658 1.5940365791320801 2.5409526156111042 +1661 6 5.57137442 0.42862558364868164 0.18371989095817298 +1662 7 5.93672 1.0632801055908203 1.130564582945226 +1666 5 5.0802207 0.080220699310302734 0.0064353605978340056 +1670 6 5.47703 0.52297019958496094 0.27349782965393388 +1671 7 6.782234 0.21776580810546875 0.047421947179827839 +1672 5 5.58361244 0.58361244201660156 0.34060348247658112 +1675 5 5.515949 0.51594877243041992 0.26620313577245724 +1676 7 6.782234 0.21776580810546875 0.047421947179827839 +1678 6 5.84444141 0.15555858612060547 0.024198473715841828 +1682 7 6.28926134 0.7107386589050293 0.50514944126211958 +1683 7 6.28926134 0.7107386589050293 0.50514944126211958 +1686 5 6.27901173 1.2790117263793945 1.6358709962159992 +1687 7 6.0611124 0.93888759613037109 0.88150991816746682 +1689 6 6.20967627 0.20967626571655273 0.043964136404838428 +1691 7 6.28926134 0.7107386589050293 0.50514944126211958 +1692 6 6.29506445 0.29506444931030273 0.087063029246792212 +1693 5 5.413152 0.41315221786499023 0.17069475512676036 +1694 6 5.864325 0.13567495346069336 0.018407692996561309 +1695 6 6.37711525 0.37711524963378906 0.14221591150635504 +1696 6 5.542532 0.45746803283691406 0.20927700106767588 +1698 6 6.29506445 0.29506444931030273 0.087063029246792212 +1700 6 6.019749 0.019749164581298828 0.00039002950165922812 +1703 5 5.314096 0.31409597396850586 0.09865628086322431 +1705 6 6.80662727 0.80662727355957031 0.65064755845014588 +1708 4 5.587132 1.5871319770812988 2.5189879126739925 +1710 5 5.041333 0.041333198547363281 0.0017084333021557541 +1712 6 5.72083235 0.27916765213012695 0.077934577995847576 +1717 6 5.54116535 0.45883464813232422 0.21052923432671378 +1718 4 5.17026567 1.1702656745910645 1.3695217491260792 +1722 6 6.35374975 0.35374975204467773 0.12513888707167098 +1726 6 6.738525 0.7385249137878418 0.54541904828533916 +1727 6 5.399927 0.60007286071777344 0.36008743817001232 +1729 6 6.474758 0.47475814819335938 0.22539529927598778 +1730 6 5.602798 0.3972020149230957 0.15776944065896714 +1732 5 5.432952 0.43295192718505859 0.18744737125325628 +1733 6 5.758369 0.24163103103637695 0.058385555159702562 +1737 6 5.744494 0.25550603866577148 0.065283335794674713 +1738 5 5.71241426 0.71241426467895508 0.50753408451805626 +1741 6 6.7084403 0.70844030380249023 0.50188766405176466 +1742 6 5.48805237 0.5119476318359375 0.26209037774242461 +1745 5 5.133648 0.13364791870117188 0.017861766173155047 +1750 6 6.308025 0.30802488327026367 0.094879328713659561 +1751 7 6.39781 0.60219001770019531 0.36263281741776154 +1752 6 5.633576 0.3664240837097168 0.13426660912250554 +1757 5 5.08499527 0.084995269775390625 0.0072241958841914311 +1759 5 4.57264137 0.42735862731933594 0.18263539634426706 +1760 6 5.35816765 0.64183235168457031 0.41194876766894595 +1761 6 5.830978 0.1690220832824707 0.028568464637146462 +1762 7 6.204322 0.79567813873291016 0.63310370045746822 +1763 6 6.088181 0.088181018829345703 0.0077758920817814214 +1764 5 5.18299437 0.18299436569213867 0.033486937875068179 +1766 5 5.059079 0.059079170227050781 0.0034903483547168435 +1769 7 6.512047 0.48795318603515625 0.2380983117618598 +1770 6 5.67229652 0.32770347595214844 0.10738956815112033 +1771 6 5.850691 0.14930915832519531 0.022293224759778241 +1777 6 5.850691 0.14930915832519531 0.022293224759778241 +1778 8 7.38504457 0.61495542526245117 0.37817017505972217 +1780 5 5.904208 0.90420818328857422 0.81759243872602383 +1781 4 5.6435194 1.643519401550293 2.7011560232722331 +1782 6 6.042781 0.042780876159667969 0.0018302033649888472 +1786 7 6.63890934 0.36109066009521484 0.13038646480799798 +1787 7 6.88856936 0.11143064498901367 0.012416788642667598 +1790 5 5.07970238 0.079702377319335938 0.0063524689503537957 +1791 5 5.499499 0.49949884414672852 0.24949909530391778 +1792 6 5.63644028 0.36355972290039063 0.13217567211540882 +1793 5 5.090697 0.090696811676025391 0.0082259116481964156 +1796 5 6.436928 1.4369277954101563 2.0647614892222919 +1797 8 6.802576 1.1974239349365234 1.4338240799588675 +1798 6 5.83613729 0.16386270523071289 0.026850986165527502 +1799 6 5.91608953 0.083910465240478516 0.0070409661768735532 +1804 6 5.375231 0.62476921081542969 0.39033656678293482 +1806 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1807 6 5.644393 0.35560703277587891 0.12645636175966501 +1808 5 5.25200033 0.25200033187866211 0.063504167266955847 +1809 6 5.644393 0.35560703277587891 0.12645636175966501 +1811 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1813 6 6.00334644 0.0033464431762695313 1.1198681932000909E-05 +1815 6 5.752005 0.24799489974975586 0.061501470301891459 +1819 6 6.7389946 0.73899459838867188 0.54611301644763444 +1820 6 5.752005 0.24799489974975586 0.061501470301891459 +1822 7 6.971259 0.028740882873535156 0.00082603834835026646 +1833 7 6.58283949 0.4171605110168457 0.17402289195183585 +1834 6 5.627404 0.37259578704833984 0.13882762052617181 +1837 7 6.70057869 0.29942131042480469 0.089653121136507252 +1838 6 5.41108942 0.58891057968139648 0.34681567086067844 +1839 6 5.501237 0.49876308441162109 0.24876461437179387 +1840 5 6.12066841 1.1206684112548828 1.2558976879845432 +1842 6 6.20005941 0.20005941390991211 0.040023769093977535 +1846 5 5.35677 0.35677003860473633 0.12728486044602505 +1848 5 4.703982 0.29601812362670898 0.087626729515477564 +1849 6 5.983951 0.016048908233642578 0.00025756745549188054 +1850 7 5.676928 1.3230719566345215 1.7505194024327011 +1851 6 6.48563433 0.48563432693481445 0.23584069949743025 +1852 7 6.038734 0.96126604080200195 0.92403240119915608 +1853 5 5.17571163 0.17571163177490234 0.030874577540998871 +1855 6 6.008804 0.0088038444519042969 7.7507677133326069E-05 +1856 4 4.440154 0.44015407562255859 0.19373561028714903 +1857 5 5.032861 0.032861232757568359 0.0010798606183470838 +1860 6 5.77942848 0.22057151794433594 0.04865179452826851 +1864 6 6.325848 0.32584810256958008 0.10617698594819558 +1865 6 5.458929 0.54107093811035156 0.29275776006761589 +1869 7 6.116072 0.88392782211303711 0.78132839470549698 +1870 6 5.875573 0.12442684173583984 0.015482038944355736 +1872 5 4.96669054 0.033309459686279297 0.0011095201045918657 +1875 5 5.0912385 0.091238498687744141 0.0083244636427934893 +1880 5 5.175462 0.17546176910400391 0.03078683241710678 +1881 6 5.950545 0.049455165863037109 0.002445813430540511 +1882 5 5.175462 0.17546176910400391 0.03078683241710678 +1886 5 4.60353565 0.39646434783935547 0.15718397910768545 +1891 5 5.446395 0.44639492034912109 0.19926842491349817 +1893 5 5.2195406 0.21954059600830078 0.048198073295679933 +1895 6 5.80891371 0.1910862922668457 0.036513971092290376 +1896 6 5.608869 0.39113092422485352 0.1529833998849881 +1897 6 5.608869 0.39113092422485352 0.1529833998849881 +1898 6 5.20592976 0.79407024383544922 0.63054755214488978 +1904 6 5.80891371 0.1910862922668457 0.036513971092290376 +1907 7 6.76484728 0.2351527214050293 0.055296802384191324 +1908 7 6.8543663 0.14563369750976563 0.021209173850365914 +1909 5 5.87015438 0.87015438079833984 0.75716864642254222 +1910 5 5.54551744 0.5455174446105957 0.29758928237447435 +1911 6 5.793866 0.20613384246826172 0.042491161010730139 +1912 6 5.967311 0.032689094543457031 0.0010685769020710723 +1913 6 5.73380566 0.26619434356689453 0.070859428547009884 +1914 6 6.51671028 0.51671028137207031 0.26698951487560407 +1915 7 6.8543663 0.14563369750976563 0.021209173850365914 +1916 5 5.54551744 0.5455174446105957 0.29758928237447435 +1918 6 5.754359 0.24564123153686523 0.060339614630947835 +1920 7 5.34622431 1.653775691986084 2.7349740394040509 +1922 5 5.769138 0.76913785934448242 0.59157304667701283 +1923 5 4.63728237 0.36271762847900391 0.13156407800943271 +1925 6 5.87001657 0.12998342514038086 0.016895690811224995 +1926 6 5.80602169 0.19397830963134766 0.037627584607434983 +1927 5 5.79432964 0.79432964324951172 0.63095958214489656 +1929 5 5.39010525 0.39010524749755859 0.15218210412513145 +1930 6 5.574939 0.42506122589111328 0.18067704575605603 +1931 3 5.49573374 2.4957337379455566 6.2286868907197004 +1933 5 4.799954 0.20004606246948242 0.040018427109544064 +1938 5 5.91960573 0.91960573196411133 0.84567470226124897 +1940 5 4.84486437 0.1551356315612793 0.024067064179916997 +1941 5 5.34108162 0.34108161926269531 0.11633667099886225 +1943 5 5.51694345 0.51694345474243164 0.26723053540104047 +1944 5 5.21851873 0.21851873397827148 0.047750437099466581 +1946 6 4.722785 1.2772150039672852 1.6312781663591522 +1948 7 6.280798 0.71920204162597656 0.51725157667897292 +1949 5 5.261702 0.26170206069946289 0.068487968574345359 +1950 5 5.22447157 0.2244715690612793 0.050387485316832681 +1951 4 4.855174 0.85517406463623047 0.73132268082645169 +1952 7 6.520986 0.47901391983032227 0.22945433539121041 +1953 6 6.01531935 0.015319347381591797 0.00023468240419788344 +1955 5 5.68653727 0.68653726577758789 0.47133341730136635 +1959 5 5.41501045 0.41501045227050781 0.17223367549377144 +1960 5 5.41501045 0.41501045227050781 0.17223367549377144 +1966 6 5.78424644 0.21575355529785156 0.046549596623663092 +1969 7 6.70432138 0.29567861557006836 0.087425843705432271 +1970 6 5.3136754 0.6863245964050293 0.47104145163052635 +1972 5 5.7198534 0.71985340118408203 0.51818891919629095 +1974 5 5.129496 0.12949609756469727 0.016769239284485593 +1975 6 5.346977 0.65302276611328125 0.42643873306224123 +1977 6 5.750509 0.24949121475219727 0.062245866238527015 +1978 6 5.46808672 0.53191328048706055 0.28293173795850635 +1979 6 5.278212 0.72178792953491211 0.52097781522229525 +1980 8 7.46080828 0.53919172286987305 0.29072771401138198 +1982 8 7.46080828 0.53919172286987305 0.29072771401138198 +1984 8 7.46080828 0.53919172286987305 0.29072771401138198 +1985 6 6.078637 0.078637123107910156 0.0061837971306886175 +1986 6 5.89531374 0.10468626022338867 0.010959213079559049 +1989 7 6.54342365 0.45657634735107422 0.20846196096044878 +1990 4 5.04370642 1.0437064170837402 1.0893230850617783 +1992 5 5.810789 0.81078910827636719 0.65737897809958667 +1993 6 5.87721062 0.12278938293457031 0.015077232561452547 +1996 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +1997 6 6.140746 0.14074611663818359 0.019809469348729181 +1998 6 6.140746 0.14074611663818359 0.019809469348729181 +2001 5 4.93630362 0.063696384429931641 0.0040572293894456379 +2002 6 6.542301 0.54230117797851563 0.29409056763688568 +2003 6 5.87721062 0.12278938293457031 0.015077232561452547 +2004 6 5.55052233 0.4494776725769043 0.20203017814515078 +2005 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +2007 6 5.74052048 0.25947952270507813 0.067329622703255154 +2008 5 6.02844238 1.0284423828125 1.0576937347650528 +2011 5 6.02844238 1.0284423828125 1.0576937347650528 +2019 6 5.84197569 0.15802431106567383 0.024971682887780844 +2022 6 5.573394 0.42660617828369141 0.1819928313498167 +2024 5 4.792466 0.20753383636474609 0.043070293236269208 +2025 5 5.124267 0.1242671012878418 0.015442312462482732 +2027 5 5.156991 0.15699100494384766 0.024646175633279199 +2028 6 5.789144 0.21085596084594727 0.044460236224267646 +2029 6 5.573394 0.42660617828369141 0.1819928313498167 +2031 5 5.7133007 0.71330070495605469 0.50879789569080458 +2032 6 5.85084 0.14915990829467773 0.022248678242476672 +2034 5 5.98954344 0.98954343795776367 0.97919621560527048 +2035 5 5.27746 0.27746009826660156 0.076984106130112195 +2037 5 5.7133007 0.71330070495605469 0.50879789569080458 +2038 5 5.343353 0.3433527946472168 0.11789114159205383 +2039 5 5.00838852 0.008388519287109375 7.0367255830205977E-05 +2043 6 6.453859 0.45385885238647461 0.20598785788956775 +2048 5 5.30091667 0.30091667175292969 0.090550843338860432 +2050 3 5.17047644 2.1704764366149902 4.7109679619009057 +2051 5 5.27376 0.27375984191894531 0.074944451047485927 +2052 5 5.27376 0.27375984191894531 0.074944451047485927 +2057 7 6.840732 0.15926790237426758 0.025366264726699228 +2058 5 5.52679253 0.52679252624511719 0.27751036570771248 +2060 5 5.52702427 0.52702426910400391 0.27775458022460953 +2061 6 6.108241 0.10824108123779297 0.011716131667526497 +2062 5 6.280643 1.2806429862976074 1.6400464583532539 +2063 5 5.4906826 0.49068260192871094 0.2407694158355298 +2064 6 5.73145771 0.26854228973388672 0.07211496137551876 +2065 5 5.608661 0.60866117477416992 0.37046842567747262 +2066 5 5.57306 0.57306003570556641 0.32839780452286504 +2067 5 5.59425449 0.59425449371337891 0.35313840329854429 +2069 7 6.59054 0.40946006774902344 0.16765754708103486 +2070 6 5.66930771 0.33069229125976563 0.10935739149863366 +2071 6 5.56511641 0.43488359451293945 0.18912374077649474 +2073 5 5.19534159 0.19534158706665039 0.038158335637717755 +2074 6 5.73145771 0.26854228973388672 0.07211496137551876 +2076 5 5.3422966 0.34229660034179688 0.11716696260555182 +2078 6 6.25093269 0.25093269348144531 0.062967216657852987 +2079 4 5.891479 1.8914790153503418 3.5776928655106985 +2080 5 5.3422966 0.34229660034179688 0.11716696260555182 +2082 6 5.71104145 0.28895854949951172 0.083497043328861764 +2084 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2085 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2086 5 5.576943 0.57694292068481445 0.3328631337283241 +2087 6 6.12987661 0.12987661361694336 0.016867934764604797 +2089 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2090 5 5.118404 0.11840391159057617 0.014019486279948978 +2091 5 5.15253925 0.15253925323486328 0.023268223777449748 +2094 5 5.23734331 0.23734331130981445 0.056331847423507497 +2096 5 5.091876 0.091876029968261719 0.0084412048827289254 +2097 5 5.54533148 0.54533147811889648 0.29738642102734048 +2099 5 5.692176 0.69217586517333984 0.47910742832846154 +2102 5 5.36260748 0.36260747909545898 0.13148418389596372 +2103 5 5.19033051 0.19033050537109375 0.036225701274815947 +2104 5 5.692176 0.69217586517333984 0.47910742832846154 +2106 5 5.2858057 0.28580570220947266 0.081684899415449763 +2110 5 5.56804276 0.56804275512695313 0.32267257165221963 +2111 5 5.56804276 0.56804275512695313 0.32267257165221963 +2112 5 5.56804276 0.56804275512695313 0.32267257165221963 +2113 5 5.44544268 0.44544267654418945 0.19841917808685139 +2114 6 5.8123064 0.18769359588623047 0.035228885936703591 +2115 5 5.56804276 0.56804275512695313 0.32267257165221963 +2116 4 6.282538 2.2825379371643066 5.2099794345942883 +2118 6 6.26503849 0.26503849029541016 0.070245401338070224 +2120 5 5.75094 0.75093984603881836 0.56391065236880422 +2121 7 6.83608341 0.16391658782958984 0.026868647765695641 +2122 5 5.36746025 0.36746025085449219 0.13502703595804633 +2123 5 5.75094 0.75093984603881836 0.56391065236880422 +2124 7 6.83608341 0.16391658782958984 0.026868647765695641 +2125 5 5.64372635 0.64372634887695313 0.41438361223845277 +2128 6 4.90525 1.094749927520752 1.1984774038066917 +2129 5 5.9750185 0.97501850128173828 0.95066107784168707 +2131 6 5.445048 0.55495214462280273 0.30797188282144816 +2132 6 5.445048 0.55495214462280273 0.30797188282144816 +2134 6 6.177456 0.17745590209960938 0.031490597189986147 +2136 6 5.946258 0.053741931915283203 0.0028881952459869353 +2137 5 5.778809 0.7788090705871582 0.60654356842883317 +2139 5 5.538669 0.53866910934448242 0.29016440936197796 +2142 5 5.330624 0.33062410354614258 0.10931229784569041 +2143 7 6.23745155 0.76254844665527344 0.5814801334963704 +2146 6 5.73914528 0.26085472106933594 0.068045185504161054 +2147 5 5.35492229 0.35492229461669922 0.12596983521598304 +2148 5 5.538669 0.53866910934448242 0.29016440936197796 +2150 6 6.503435 0.50343513488769531 0.25344693503939197 +2152 6 5.99008369 0.0099163055419921875 9.8333115602144971E-05 +2157 6 6.22612 0.2261199951171875 0.051130252191796899 +2158 6 5.796968 0.20303201675415039 0.041221999827257605 +2161 7 6.53926039 0.4607396125793457 0.21228099059976557 +2162 6 4.85092163 1.149078369140625 1.3203810984268785 +2166 5 5.25865555 0.25865554809570313 0.066902692560688592 +2167 7 6.79769468 0.20230531692504883 0.040927441256144448 +2168 7 6.79769468 0.20230531692504883 0.040927441256144448 +2171 7 6.79769468 0.20230531692504883 0.040927441256144448 +2172 5 4.813034 0.1869659423828125 0.034956263611093163 +2173 5 5.442636 0.44263601303100586 0.19592664003198479 +2174 7 6.79769468 0.20230531692504883 0.040927441256144448 +2176 5 4.813034 0.1869659423828125 0.034956263611093163 +2179 6 5.76867342 0.23132658004760742 0.053511986636522124 +2182 5 5.577924 0.57792377471923828 0.33399588938573288 +2184 6 5.91915846 0.080841541290283203 0.006535354798188564 +2186 5 4.922956 0.077044010162353516 0.0059357795018968318 +2189 6 6.28398132 0.2839813232421875 0.080645391950383782 +2192 6 5.59625 0.40374994277954102 0.16301401629448264 +2197 6 6.48611832 0.48611831665039063 0.23631101778300945 +2198 5 4.96211147 0.037888526916503906 0.001435540471902641 +2201 6 5.58790541 0.4120945930480957 0.16982195361947561 +2202 5 4.96211147 0.037888526916503906 0.001435540471902641 +2203 5 5.48719835 0.4871983528137207 0.23736223498440268 +2204 5 5.430422 0.43042182922363281 0.18526295107221813 +2205 5 5.39430428 0.39430427551269531 0.15547586168759153 +2206 6 5.69371843 0.30628156661987305 0.093808398051123731 +2209 6 6.150735 0.15073490142822266 0.022721010508576001 +2210 7 5.605151 1.3948488235473633 1.9456032405514634 +2211 6 5.680932 0.31906795501708984 0.10180435991878767 +2215 6 5.54389143 0.45610857009887695 0.20803502771764215 +2216 5 5.73479843 0.73479843139648438 0.53992873478273395 +2219 7 6.477956 0.52204418182373047 0.27253012777600816 +2222 7 6.15957642 0.840423583984375 0.70631180051714182 +2224 7 6.15957642 0.840423583984375 0.70631180051714182 +2226 5 5.15487766 0.15487766265869141 0.023987090390619414 +2227 5 5.184053 0.18405294418334961 0.033875486262559207 +2232 6 5.49912739 0.50087261199951172 0.25087337345121341 +2233 5 5.451901 0.45190095901489258 0.20421447675857962 +2235 6 5.78070831 0.21929168701171875 0.048088843992445618 +2238 6 5.69238758 0.30761241912841797 0.094625400402037485 +2239 6 5.78070831 0.21929168701171875 0.048088843992445618 +2240 5 5.031944 0.031943798065185547 0.0010204062348293519 +2241 5 5.031944 0.031943798065185547 0.0010204062348293519 +2245 7 5.60611153 1.3938884735107422 1.942925076586107 +2247 6 5.69238758 0.30761241912841797 0.094625400402037485 +2252 5 5.115737 0.11573696136474609 0.01339504422594473 +2253 5 5.045958 0.045958042144775391 0.002112141637780951 +2254 6 5.71639729 0.28360271453857422 0.080430499693648017 +2255 6 5.658473 0.34152698516845703 0.11664068159825547 +2258 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2259 6 5.492666 0.50733423233032227 0.25738802329419741 +2260 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2266 5 5.407028 0.4070281982421875 0.16567195416428149 +2267 6 6.3755393 0.37553930282592773 0.14102976796698385 +2270 7 6.147446 0.8525538444519043 0.72684805768972183 +2271 6 5.66193 0.33806991577148438 0.11429126794973854 +2272 6 6.210824 0.21082401275634766 0.044446764354688639 +2273 5 5.395995 0.39599514007568359 0.15681215096356027 +2274 7 6.147446 0.8525538444519043 0.72684805768972183 +2275 4 5.2996974 1.2996973991394043 1.689213329329732 +2276 6 4.88525772 1.1147422790527344 1.2426503487076843 +2278 6 4.88525772 1.1147422790527344 1.2426503487076843 +2280 6 5.89824867 0.10175132751464844 0.010353332650993252 +2282 5 5.15755272 0.15755271911621094 0.024822859300911659 +2283 5 5.15755272 0.15755271911621094 0.024822859300911659 +2284 5 5.15755272 0.15755271911621094 0.024822859300911659 +2285 5 5.15755272 0.15755271911621094 0.024822859300911659 +2287 5 5.05347538 0.053475379943847656 0.0028596162601388642 +2289 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2290 7 5.835172 1.164827823638916 1.3568238587233736 +2291 6 5.959846 0.040153980255126953 0.0016123421303291252 +2292 6 5.248393 0.75160694122314453 0.56491299409481144 +2293 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2295 6 5.12605143 0.87394857406616211 0.76378611011227804 +2296 7 6.03202057 0.96797943115234375 0.93698417913401499 +2297 6 5.631292 0.36870813369750977 0.13594568785470074 +2298 8 6.72130346 1.2786965370178223 1.6350648337813709 +2299 7 7.42436934 0.42436933517456055 0.18008933263649851 +2300 7 6.75962543 0.24037456512451172 0.057779931558798125 +2304 6 4.80764866 1.1923513412475586 1.4217017209748519 +2306 5 5.49572039 0.49572038650512695 0.24573870159679245 +2310 5 5.3208 0.32079982757568359 0.10291252937258832 +2311 7 6.820328 0.1796717643737793 0.032281942913186867 +2314 6 6.682396 0.68239593505859375 0.4656642121844925 +2315 6 6.07943535 0.079435348510742188 0.0063099745930230711 +2317 5 5.659352 0.65935182571411133 0.43474483007253184 +2318 4 5.559793 1.5597929954528809 2.4329541886638708 +2319 7 6.76099253 0.23900747299194336 0.057124572145994534 +2321 5 5.34529972 0.34529972076416016 0.11923189715980698 +2324 5 5.15271664 0.15271663665771484 0.023322371112044493 +2327 6 5.214839 0.78516101837158203 0.61647782477029978 +2328 5 5.454279 0.45427894592285156 0.20636936070877709 +2329 5 5.28656 0.28656005859375 0.082116667181253433 +2331 5 5.65846634 0.65846633911132813 0.43357791974267457 +2332 6 5.549059 0.45094108581542969 0.20334786287639872 +2333 8 7.05028725 0.94971275329589844 0.90195431377287605 +2334 5 5.55771875 0.55771875381469727 0.3110502083566189 +2335 5 5.80538654 0.80538654327392578 0.64864748408672313 +2336 5 4.931768 0.068232059478759766 0.0046556139407130104 +2337 4 5.43987751 1.4398775100708008 2.073247244007689 +2338 5 5.62999249 0.62999248504638672 0.39689053121492179 +2339 6 5.726933 0.27306699752807617 0.074565585138998358 +2340 6 5.72369 0.27630996704101563 0.076347197886207141 +2342 8 6.948141 1.0518589019775391 1.1064071496693941 +2344 6 5.726933 0.27306699752807617 0.074565585138998358 +2345 6 5.7398963 0.26010370254516602 0.067653936077704202 +2347 6 6.165467 0.1654667854309082 0.027379257080838215 +2349 5 5.23369 0.23368978500366211 0.05461091561505782 +2350 5 5.568386 0.56838607788085938 0.32306273352878634 +2351 6 5.85764074 0.14235925674438477 0.020266157980813659 +2355 7 6.288256 0.71174383163452148 0.50657928186979007 +2358 5 5.388339 0.38833904266357422 0.15080721205686132 +2359 5 5.16930962 0.16930961608886719 0.028665746100159595 +2365 5 5.35451746 0.35451745986938477 0.12568262935224084 +2366 5 5.35875034 0.35875034332275391 0.1287018088341938 +2367 6 5.4548583 0.54514169692993164 0.29717946973164544 +2370 7 6.466535 0.53346490859985352 0.28458480870745007 +2374 6 6.31197357 0.31197357177734375 0.097327509487513453 +2375 6 6.86937952 0.86937952041625977 0.75582075051920583 +2376 6 6.31197357 0.31197357177734375 0.097327509487513453 +2379 4 5.02809525 1.0280952453613281 1.0569798335345695 +2380 4 4.7932725 0.79327249526977539 0.62928125175153582 +2381 6 6.17565966 0.1756596565246582 0.030856314930360895 +2383 6 6.298069 0.29806900024414063 0.088845128906541504 +2386 4 5.639759 1.6397590637207031 2.6888097870541969 +2387 4 5.656129 1.6561288833618164 2.7427628783052569 +2389 8 6.87059641 1.1294035911560059 1.2755524717160824 +2391 6 5.81390524 0.18609476089477539 0.034631260032483624 +2392 7 5.867315 1.1326851844787598 1.282975727137682 +2393 6 5.867315 0.13268518447875977 0.017605358180162511 +2396 5 4.986103 0.013896942138671875 0.00019312500080559403 +2401 4 5.2634654 1.263465404510498 1.5963448283948765 +2403 6 5.8889246 0.11107540130615234 0.01233774477532279 +2406 6 6.67324924 0.67324924468994141 0.4532645454755766 +2415 5 5.575652 0.57565212249755859 0.3313753661359442 +2419 5 5.29736567 0.29736566543579102 0.088426338980070796 +2420 7 6.390013 0.60998678207397461 0.37208387430496259 +2422 5 4.129732 0.87026786804199219 0.75736616214635433 +2423 6 5.695272 0.30472803115844727 0.092859172973703608 +2424 5 4.129732 0.87026786804199219 0.75736616214635433 +2426 6 6.139751 0.13975095748901367 0.019530330119096107 +2427 6 5.70700836 0.29299163818359375 0.085844100045505911 +2428 6 6.139751 0.13975095748901367 0.019530330119096107 +2429 6 5.70700836 0.29299163818359375 0.085844100045505911 +2430 5 5.071437 0.071436882019042969 0.0051032281126026646 +2431 5 5.05151 0.051509857177734375 0.0026532653864705935 +2433 6 5.243469 0.75653076171875 0.57233879342675209 +2435 4 5.316507 1.3165068626403809 1.7331903193792186 +2436 5 5.155265 0.15526485443115234 0.024107175021526928 +2437 6 5.73321342 0.26678657531738281 0.071175076769577572 +2439 6 6.48072529 0.48072528839111328 0.23109680289871903 +2440 5 5.442191 0.44219112396240234 0.19553299011113268 +2441 6 6.501268 0.50126791000366211 0.2512695175994395 +2443 5 5.342942 0.34294223785400391 0.11760937850431219 +2444 5 5.51007938 0.51007938385009766 0.26018097782889527 +2450 5 4.93648863 0.063511371612548828 0.0040336943241072731 +2452 7 6.282725 0.71727514266967773 0.51448363029180655 +2453 6 6.289039 0.28903913497924805 0.083543621549551972 +2455 6 5.800432 0.19956779479980469 0.039827304721256951 +2456 6 5.58649731 0.41350269317626953 0.1709844772640281 +2459 5 5.312827 0.31282711029052734 0.097860800932721759 +2461 5 4.82629 0.17370986938476563 0.030175118721672334 +2464 5 5.128059 0.12805891036987305 0.016399084525119179 +2465 5 5.15147066 0.15147066116333008 0.022943361193256351 +2466 5 5.25195169 0.25195169448852539 0.063479656355639236 +2467 6 5.73090935 0.26909065246582031 0.072409779244480887 +2470 5 5.555554 0.55555391311645508 0.30864015037900572 +2472 6 5.55089235 0.44910764694213867 0.20169767854190468 +2475 5 4.549733 0.45026683807373047 0.20274022546891501 +2477 7 6.442016 0.5579838752746582 0.31134600506652532 +2478 6 5.4986105 0.50138950347900391 0.25139143419892207 +2483 6 5.4986105 0.50138950347900391 0.25139143419892207 +2486 5 5.90252447 0.90252447128295898 0.81455042126458466 +2488 6 6.14779329 0.14779329299926758 0.021842857455567355 +2495 5 5.80160046 0.80160045623779297 0.64256329144063784 +2496 5 5.507049 0.5070490837097168 0.25709877329086339 +2499 6 6.47504044 0.47504043579101563 0.22566341563651804 +2502 4 5.087182 1.0871820449829102 1.1819647989332225 +2503 4 5.087182 1.0871820449829102 1.1819647989332225 +2504 6 5.14028358 0.85971641540527344 0.73911231491729268 +2505 6 4.786265 1.2137351036071777 1.4731529017283265 +2511 6 5.52970362 0.47029638290405273 0.22117868777263539 +2512 6 5.368275 0.63172483444213867 0.39907626645094751 +2513 5 5.0458374 0.04583740234375 0.002101067453622818 +2514 7 7.08240938 0.082409381866455078 0.0067913062196112151 +2517 6 5.202719 0.79728078842163086 0.63565665558621731 +2518 7 6.73800659 0.261993408203125 0.068640545941889286 +2519 5 5.57040739 0.57040739059448242 0.32536459124480643 +2522 8 5.97161341 2.0283865928649902 4.1143521701144437 +2523 5 6.07080841 1.0708084106445313 1.1466306523070671 +2525 8 5.97161341 2.0283865928649902 4.1143521701144437 +2526 7 6.761754 0.23824596405029297 0.05676113938625349 +2531 4 4.59851 0.59850978851318359 0.35821396694609575 +2532 4 4.59851 0.59850978851318359 0.35821396694609575 +2534 7 5.81611061 1.1838893890380859 1.4015940854769724 +2536 6 5.57678366 0.42321634292602539 0.17911207291967912 +2537 6 5.19452047 0.80547952651977539 0.64879726764252155 +2538 6 5.19452047 0.80547952651977539 0.64879726764252155 +2541 6 5.609927 0.39007282257080078 0.15215680690835143 +2545 6 5.838851 0.16114902496337891 0.025969008246647718 +2546 5 5.32331467 0.32331466674804688 0.10453237373440061 +2547 5 4.96645546 0.033544540405273438 0.0011252361910010222 +2548 6 5.4387145 0.56128549575805664 0.31504140774836742 +2551 6 5.4387145 0.56128549575805664 0.31504140774836742 +2552 5 5.353321 0.35332107543945313 0.12483578234969173 +2554 7 6.789461 0.21053886413574219 0.044326613311568508 +2555 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2556 5 5.757903 0.75790309906005859 0.57441710756484099 +2557 7 6.789461 0.21053886413574219 0.044326613311568508 +2558 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2560 6 5.797521 0.20247888565063477 0.040997699134322829 +2562 6 5.797521 0.20247888565063477 0.040997699134322829 +2563 5 5.38012266 0.38012266159057617 0.14449323785470369 +2564 6 5.353371 0.64662885665893555 0.41812887826404221 +2566 7 6.133521 0.86647891998291016 0.75078571877475042 +2567 5 6.320251 1.3202509880065918 1.7430626713323818 +2568 6 5.507352 0.49264812469482422 0.24270217476532707 +2569 6 6.26709557 0.26709556579589844 0.071340041267831111 +2571 6 6.63272762 0.63272762298583984 0.40034424488931108 +2574 5 5.683056 0.68305587768554688 0.46656533204077277 +2575 6 5.839933 0.16006708145141602 0.025621470564374249 +2579 6 5.78327656 0.21672344207763672 0.046969050345978758 +2581 7 6.762539 0.23746109008789063 0.056387769305729307 +2583 7 6.762539 0.23746109008789063 0.056387769305729307 +2584 7 6.762539 0.23746109008789063 0.056387769305729307 +2586 7 6.762539 0.23746109008789063 0.056387769305729307 +2592 5 5.72321844 0.72321844100952148 0.52304491341624271 +2593 5 5.95471859 0.95471858978271484 0.91148758567669574 +2595 5 4.99312162 0.0068783760070800781 4.7312056494774879E-05 +2596 5 5.190575 0.19057512283325195 0.03631887744290907 +2599 6 5.51631451 0.48368549346923828 0.23395165659258055 +2600 7 7.0145216 0.014521598815917969 0.00021087683217047015 +2602 6 6.44506168 0.44506168365478516 0.19807990225763206 +2607 6 5.741097 0.25890302658081055 0.067030777172703893 +2609 6 5.34973574 0.65026426315307617 0.4228436119340131 +2610 5 5.306729 0.30672883987426758 0.09408258121061408 +2611 5 5.490591 0.49059104919433594 0.24067957754959934 +2612 7 6.794416 0.20558404922485352 0.042264801295686993 +2617 7 6.7212 0.27880001068115234 0.077729445955810661 +2618 7 6.34141541 0.6585845947265625 0.43373366841115057 +2619 6 5.4213624 0.57863759994506836 0.33482147207018897 +2621 5 5.406546 0.40654611587524414 0.16527974433324744 +2623 7 6.7212 0.27880001068115234 0.077729445955810661 +2626 7 6.210718 0.78928184509277344 0.6229658309930528 +2628 6 6.039976 0.039976119995117188 0.0015980901698640082 +2633 5 5.61942339 0.61942338943481445 0.38368533537891381 +2635 6 6.508563 0.50856304168701172 0.25863636736994522 +2638 6 6.643812 0.64381217956542969 0.41449412255678908 +2639 6 5.83244467 0.16755533218383789 0.028074789343236262 +2641 5 5.974963 0.97496318817138672 0.95055321828931483 +2644 6 5.97672844 0.023271560668945313 0.0005415655359684024 +2648 6 5.681986 0.31801414489746094 0.10113299635486328 +2650 5 5.43078232 0.43078231811523438 0.18557340560073499 +2652 7 6.80547237 0.19452762603759766 0.037840997291823442 +2653 5 5.53509569 0.5350956916809082 0.28632739925546957 +2654 5 4.69185925 0.30814075469970703 0.094950724706905021 +2658 7 6.433773 0.56622695922851563 0.3206129693571711 +2660 6 5.36555243 0.63444757461547852 0.40252372493546318 +2661 6 5.99006748 0.0099325180053710938 9.8654913927020971E-05 +2664 7 6.39382029 0.60617971420288086 0.36745384591108632 +2665 5 5.5541 0.55410003662109375 0.30702685058349743 +2666 7 7.24123526 0.24123525619506836 0.058194448831500267 +2668 6 6.05001354 0.050013542175292969 0.0025013544009198085 +2669 5 5.359341 0.35934114456176758 0.12912605817496114 +2670 7 7.24123526 0.24123525619506836 0.058194448831500267 +2674 7 5.814148 1.18585205078125 1.4062450863420963 +2679 6 5.801769 0.19823122024536133 0.039295616679964951 +2680 6 6.4041853 0.40418529510498047 0.16336575277910015 +2681 6 6.436047 0.43604707717895508 0.19013705351630961 +2683 5 5.13188839 0.13188838958740234 0.017394547307958419 +2694 6 6.096805 0.096805095672607422 0.0093712265481826762 +2697 5 5.839328 0.83932781219482422 0.70447117632375011 +2698 6 5.567016 0.4329838752746582 0.18747503624786077 +2699 6 5.349456 0.65054416656494141 0.42320771265167423 +2700 7 6.18181944 0.81818056106567383 0.66941943050574082 +2703 5 5.502043 0.50204277038574219 0.25204694329659105 +2706 6 5.34128857 0.65871143341064453 0.43390075250590598 +2707 5 5.502043 0.50204277038574219 0.25204694329659105 +2709 5 6.00174236 1.0017423629760742 1.0034877617808888 +2710 5 6.00174236 1.0017423629760742 1.0034877617808888 +2711 5 5.634198 0.63419818878173828 0.40220734265403735 +2712 5 5.598766 0.59876585006713867 0.35852054320662319 +2716 5 6.00174236 1.0017423629760742 1.0034877617808888 +2717 6 6.102189 0.10218906402587891 0.010442604806485178 +2718 6 5.481989 0.51801109313964844 0.26833549261573353 +2721 5 5.2267313 0.22673130035400391 0.051407082560217532 +2722 7 6.82906866 0.17093133926391602 0.029217522742555957 +2723 6 6.35023165 0.35023164749145508 0.12266220690457885 +2724 6 6.0606904 0.060690402984619141 0.0036833250144354679 +2727 6 6.046403 0.046402931213378906 0.0021532320251935744 +2728 6 5.72376347 0.27623653411865234 0.07630662278188538 +2729 7 6.391809 0.60819101333618164 0.36989630870289147 +2730 5 4.92892742 0.071072578430175781 0.0050513114047134877 +2731 5 4.87044954 0.12955045700073242 0.01678332090909862 +2732 5 5.122189 0.12218904495239258 0.014930162706377814 +2733 7 6.391809 0.60819101333618164 0.36989630870289147 +2739 7 6.561662 0.43833780288696289 0.19214002943976993 +2740 6 5.54297924 0.45702075958251953 0.20886797468938312 +2743 6 5.184127 0.81587314605712891 0.6656489904571572 +2744 6 5.184127 0.81587314605712891 0.6656489904571572 +2745 7 6.623061 0.37693881988525391 0.14208287393648789 +2749 6 5.746345 0.25365495681762695 0.064340837118152194 +2752 6 6.251609 0.25160884857177734 0.063307012679615582 +2753 8 6.050957 1.949042797088623 3.7987678248830434 +2754 5 4.81832361 0.18167638778686523 0.033006309879283435 +2755 5 4.869156 0.1308441162109375 0.017120182747021317 +2756 6 4.98410654 1.0158934593200684 1.0320395206892954 +2757 5 6.02096272 1.0209627151489258 1.0423648657242666 +2758 6 5.85482025 0.14517974853515625 0.021077159384731203 +2759 6 5.76916265 0.23083734512329102 0.053285879903569366 +2760 6 5.790269 0.20973110198974609 0.043987135141833278 +2761 5 5.21827745 0.2182774543762207 0.047645047088963111 +2762 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2764 6 6.01250744 0.012507438659667969 0.00015643602182535687 +2768 6 5.40108156 0.59891843795776367 0.35870329532576761 +2769 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2770 7 5.56935453 1.4306454658508301 2.0467464489595386 +2771 6 5.949611 0.050388813018798828 0.0025390324774434703 +2773 7 6.69609451 0.30390548706054688 0.092358545065508224 +2776 8 6.39705944 1.602940559387207 2.5694184369285722 +2778 7 6.69609451 0.30390548706054688 0.092358545065508224 +2779 5 6.23984575 1.2398457527160645 1.5372174905280644 +2780 5 4.92480946 0.075190544128417969 0.0056536179263275699 +2781 6 4.922699 1.077301025390625 1.1605774993076921 +2782 6 5.967141 0.032858848571777344 0.001079703929462994 +2784 6 5.967141 0.032858848571777344 0.001079703929462994 +2787 5 5.24805164 0.24805164337158203 0.061529617779342516 +2789 5 5.13498068 0.13498067855834961 0.018219783584072502 +2792 5 5.36231041 0.36231040954589844 0.13126883286531665 +2793 7 7.17724466 0.17724466323852539 0.031415670646538274 +2795 8 6.13639641 1.8636035919189453 3.4730183478131949 +2797 5 5.25386858 0.25386857986450195 0.064449255842419007 +2800 5 5.43601561 0.43601560592651367 0.19010960861146486 +2804 8 6.13639641 1.8636035919189453 3.4730183478131949 +2808 6 5.34821272 0.65178728103637695 0.42482665972079303 +2809 7 6.775078 0.22492218017578125 0.050589987135026604 +2810 7 6.34518576 0.65481424331665039 0.42878169325035742 +2811 5 5.64365244 0.64365243911743164 0.41428846238181904 +2813 7 6.775078 0.22492218017578125 0.050589987135026604 +2814 7 6.75550842 0.2444915771484375 0.059776131296530366 +2818 4 6.14127731 2.1412773132324219 4.5850685321638593 +2823 6 6.314358 0.31435823440551758 0.098821099538554336 +2830 5 5.750116 0.75011587142944336 0.5626738205703532 +2831 5 5.03467941 0.034679412841796875 0.001202661675051786 +2833 7 6.039263 0.96073722839355469 0.92301602202132926 +2836 6 5.626615 0.37338495254516602 0.13941632278715588 +2837 6 5.79493475 0.20506525039672852 0.042051756920272965 +2839 7 5.811762 1.1882381439208984 1.4119098866685817 +2840 6 6.206232 0.20623207092285156 0.042531667077128077 +2842 6 5.49120951 0.50879049301147461 0.25886776577885939 +2844 5 5.98960352 0.98960351943969727 0.97931512568743528 +2846 7 7.02146339 0.021463394165039063 0.00046067728908383287 +2847 5 6.279372 1.2793722152709961 1.636793265207416 +2848 5 4.989665 0.010334968566894531 0.000106811575278698 +2850 5 5.96404171 0.96404170989990234 0.92937641842672747 +2852 5 6.11551476 1.1155147552490234 1.2443731691782887 +2854 6 6.2158227 0.21582269668579102 0.046579436404726948 +2856 7 6.999945 5.4836273193359375E-05 3.007016857736744E-09 +2860 6 5.620766 0.37923383712768555 0.14381830322258793 +2861 6 6.2158227 0.21582269668579102 0.046579436404726948 +2863 6 6.51361275 0.51361274719238281 0.26379805407850654 +2865 6 6.3260293 0.32602930068969727 0.10629510490821303 +2868 5 5.85081 0.85081005096435547 0.72387774282196915 +2869 6 6.71658325 0.716583251953125 0.51349155697971582 +2870 7 6.785292 0.21470785140991211 0.046099461457060897 +2871 6 6.188884 0.18888378143310547 0.035677082888469158 +2872 7 7.21496725 0.21496725082397461 0.046210918926817612 +2873 8 6.90970373 1.0902962684631348 1.188745953024636 +2879 6 6.59125471 0.59125471115112305 0.34958213345839795 +2881 7 6.59642029 0.4035797119140625 0.16287658386863768 +2890 8 6.60879755 1.391202449798584 1.9354442563255816 +2891 6 5.983416 0.016583919525146484 0.0002750263868165348 +2893 7 8.001547 1.0015468597412109 1.0030961122574809 +2895 5 5.61847734 0.61847734451293945 0.3825142256757772 +2896 5 5.420413 0.42041301727294922 0.1767471050925451 +2898 5 5.98123741 0.98123741149902344 0.96282685772530385 +2902 5 5.24436 0.24435997009277344 0.059711794983741129 +2903 6 6.211409 0.21140909194946289 0.044693804158896455 +2904 7 5.93855953 1.0614404678344727 1.1266558667566642 +2905 5 5.624597 0.62459707260131836 0.39012150310213656 +2906 5 5.20248127 0.20248126983642578 0.040998664634571469 +2910 5 5.051263 0.051262855529785156 0.0026278803570676246 +2911 5 5.24436 0.24435997009277344 0.059711794983741129 +2913 5 5.6902194 0.69021940231323242 0.47640282332963579 +2919 5 6.3524003 1.3524003028869629 1.828986579248749 +2920 4 5.501398 1.5013980865478516 2.25419621428955 +2923 6 6.342757 0.34275722503662109 0.11748251531480491 +2924 6 6.131525 0.13152503967285156 0.017298836060945177 +2927 7 6.7712183 0.22878170013427734 0.052341066316330398 +2929 6 6.131525 0.13152503967285156 0.017298836060945177 +2933 6 6.342757 0.34275722503662109 0.11748251531480491 +2934 5 5.17446136 0.17446136474609375 0.030436767789069563 +2937 5 5.629732 0.62973213195800781 0.39656255802037776 +2940 6 5.882038 0.11796188354492188 0.01391500596946571 +2941 5 5.606404 0.60640382766723633 0.36772560220947526 +2943 8 7.503963 0.49603700637817383 0.24605271169662046 +2944 6 5.882038 0.11796188354492188 0.01391500596946571 +2947 6 6.19522524 0.19522523880004883 0.03811289386453609 +2948 6 5.376883 0.62311697006225586 0.38827475837956626 +2949 6 5.449442 0.55055809020996094 0.30311421069563949 +2950 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2953 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2955 5 6.26787 1.2678699493408203 1.6074942084414943 +2956 6 6.107019 0.10701894760131836 0.011453055145693725 +2959 7 6.84598875 0.15401124954223633 0.02371946498556099 +2961 6 6.47835541 0.47835540771484375 0.2288238960900344 +2962 5 5.656493 0.65649318695068359 0.4309833045126652 +2964 5 6.28570461 1.2857046127319336 1.6530363512001713 +2965 8 7.26401472 0.73598527908325195 0.54167433102725226 +2967 6 6.001534 0.0015339851379394531 2.353110403419123E-06 +2968 5 6.08952665 1.0895266532897949 1.187068328228861 +2970 5 6.08952665 1.0895266532897949 1.187068328228861 +2971 5 5.307669 0.30766916275024414 0.094660313707436217 +2975 6 5.86485529 0.13514471054077148 0.018264092787148911 +2981 7 6.371684 0.62831592559814453 0.39478090236025309 +2984 6 4.61855555 1.3814444541931152 1.9083887800209141 +2985 7 6.5449214 0.4550786018371582 0.20709653385006277 +2987 7 6.43420458 0.5657954216003418 0.32012445910390852 +2989 6 6.208233 0.20823287963867188 0.043360932162613608 +2991 7 6.8057766 0.19422340393066406 0.037722730634413892 +2994 7 6.43420458 0.5657954216003418 0.32012445910390852 +2996 8 5.816692 2.1833081245422363 4.7668343666921373 +2997 6 6.396095 0.39609479904174805 0.15689108982792277 +2999 7 6.43420458 0.5657954216003418 0.32012445910390852 +3000 7 6.5449214 0.4550786018371582 0.20709653385006277 +3001 7 6.53180838 0.46819162368774414 0.21920339649136622 +3002 7 6.8057766 0.19422340393066406 0.037722730634413892 +3004 6 6.315313 0.31531286239624023 0.099422201192510329 +3005 6 6.09739447 0.097394466400146484 0.0094856820853692625 +3006 6 6.208233 0.20823287963867188 0.043360932162613608 +3013 6 6.648943 0.64894294738769531 0.42112694896422909 +3014 6 5.18606234 0.81393766403198242 0.66249452092984029 +3016 6 6.648943 0.64894294738769531 0.42112694896422909 +3020 6 3.73379683 2.2662031650543213 5.1356767853022234 +3022 5 5.03272629 0.032726287841796875 0.001071009915904142 +3023 6 5.18606234 0.81393766403198242 0.66249452092984029 +3026 6 5.998491 0.0015091896057128906 2.2776532659918303E-06 +3027 5 5.75025034 0.75025033950805664 0.56287557193195425 +3028 6 5.90629435 0.093705654144287109 0.0087807496186087519 +3029 8 7.02977467 0.97022533416748047 0.94133719906039914 +3031 6 6.082838 0.082838058471679688 0.0068621439313574228 +3033 6 5.665061 0.33493900299072266 0.11218413572441932 +3034 6 5.48654842 0.51345157623291016 0.26363252113605995 +3037 6 5.750472 0.24952793121337891 0.062264188455628755 +3038 6 6.538831 0.53883123397827148 0.29033909871054675 +3039 6 5.39716959 0.60283041000366211 0.36340450322518336 +3040 5 6.07817554 1.0781755447387695 1.1624625052727424 +3043 6 5.391435 0.60856485366821289 0.37035118112021337 +3044 6 5.65663147 0.3433685302734375 0.11790194758214056 +3045 6 6.14122248 0.14122247695922852 0.019943787998499829 +3046 6 6.496725 0.49672508239746094 0.24673580748276436 +3049 5 5.29757261 0.29757261276245117 0.088549459866271718 +3050 4 4.71068048 0.71068048477172852 0.50506675143537905 +3053 5 5.75403357 0.75403356552124023 0.56856661793267449 +3055 6 6.435923 0.43592309951782227 0.19002894869322517 +3056 5 5.76071835 0.76071834564208984 0.57869240139643807 +3058 5 5.476526 0.47652578353881836 0.22707682237728477 +3059 6 5.52979374 0.47020626068115234 0.22109392758375179 +3062 8 6.831621 1.1683788299560547 1.3651090902894794 +3064 5 5.3336153 0.33361530303955078 0.1112991704221713 +3065 6 6.481476 0.481475830078125 0.2318189749494195 +3066 5 5.3336153 0.33361530303955078 0.1112991704221713 +3069 8 4.845862 3.1541380882263184 9.9485870795999745 +3070 8 6.831621 1.1683788299560547 1.3651090902894794 +3072 6 6.86424732 0.86424732208251953 0.74692343372680625 +3073 5 6.54508257 1.5450825691223145 2.3872801454056116 +3074 5 6.22429562 1.2242956161499023 1.498899755723869 +3075 7 6.37249041 0.62750959396362305 0.39376829051639106 +3076 5 5.2231307 0.22313070297241211 0.049787310608962798 +3077 5 5.476526 0.47652578353881836 0.22707682237728477 +3078 5 6.578264 1.5782642364501953 2.490918000057718 +3079 5 5.94544172 0.94544172286987305 0.89386005134315383 +3080 6 5.52979374 0.47020626068115234 0.22109392758375179 +3084 6 6.806603 0.80660295486450195 0.65060832679614578 +3086 7 6.88708639 0.11291360855102539 0.012749482996014194 +3088 6 6.47210026 0.47210025787353516 0.22287865348425839 +3090 6 6.806603 0.80660295486450195 0.65060832679614578 +3091 6 5.508926 0.4910740852355957 0.24115375718997711 +3094 6 3.811624 2.1883759498596191 4.7889892979239903 +3095 6 3.811624 2.1883759498596191 4.7889892979239903 +3097 5 6.40035963 1.4003596305847168 1.9610070949713645 +3099 7 6.603572 0.39642810821533203 0.157155244983187 +3101 6 5.885584 0.11441612243652344 0.013091049073409522 +3102 6 5.330082 0.66991806030273438 0.44879020751977805 +3104 5 5.992548 0.99254798889160156 0.98515151025276282 +3105 6 5.881699 0.1183009147644043 0.013995106434094851 +3106 6 6.09651566 0.096515655517578125 0.0093152717599878088 +3108 5 5.790182 0.79018211364746094 0.62438777272836887 +3111 7 6.55089045 0.44910955429077148 0.20169939175525542 +3112 5 5.66179132 0.66179132461547852 0.43796775733630966 +3113 6 5.53946257 0.46053743362426758 0.21209472776922667 +3114 6 6.314805 0.31480503082275391 0.099102207431315037 +3115 6 6.314805 0.31480503082275391 0.099102207431315037 +3116 7 6.43430138 0.56569862365722656 0.32001493280768045 +3117 7 6.55089045 0.44910955429077148 0.20169939175525542 +3119 5 4.536246 0.46375417709350586 0.21506793677167479 +3120 6 5.40785 0.59215021133422852 0.35064187278317149 +3122 6 7.08013153 1.0801315307617188 1.1666841237456538 +3124 6 5.53946257 0.46053743362426758 0.21209472776922667 +3125 5 5.7089 0.70889997482299805 0.50253917430404726 +3126 7 6.19258261 0.80741739273071289 0.65192284608406226 +3128 6 6.53799 0.53799009323120117 0.28943334041491653 +3131 5 5.507035 0.5070347785949707 0.25708426670485096 +3133 6 6.68867445 0.6886744499206543 0.47427249797351578 +3135 6 5.426291 0.57370901107788086 0.32914202939196002 +3138 6 6.12315273 0.12315273284912109 0.01516659560820699 +3140 6 5.426291 0.57370901107788086 0.32914202939196002 +3141 7 5.541848 1.4581518173217773 2.1262067223588019 +3143 5 5.435146 0.43514585494995117 0.18935191508012394 +3144 6 5.710051 0.28994894027709961 0.084070387967813076 +3145 6 5.710051 0.28994894027709961 0.084070387967813076 +3146 6 5.710051 0.28994894027709961 0.084070387967813076 +3147 6 5.56390429 0.4360957145690918 0.19017947226552678 +3151 6 5.710051 0.28994894027709961 0.084070387967813076 +3154 6 6.867949 0.86794900894165039 0.75333548212279311 +3157 7 6.779997 0.22000312805175781 0.048401376352558145 +3158 7 6.926802 0.073197841644287109 0.0053579240213821322 +3159 6 6.36980534 0.36980533599853516 0.13675598653298948 +3162 7 6.779997 0.22000312805175781 0.048401376352558145 +3164 6 6.23988962 0.23988962173461914 0.057547030615978656 +3166 6 6.897838 0.89783811569213867 0.80611328198961019 +3167 7 6.39587927 0.60412073135375977 0.36496185805140158 +3168 6 6.723877 0.723876953125 0.52399784326553345 +3172 8 6.64314556 1.3568544387817383 1.841053968041706 +3173 8 6.6659255 1.3340744972229004 1.7797547641405345 +3174 8 6.88348532 1.1165146827697754 1.2466050368404922 +3175 6 5.76850462 0.23149538040161133 0.053590111147286734 +3176 6 6.294718 0.29471778869628906 0.086858574974030489 +3177 5 5.992035 0.992034912109375 0.98413326684385538 +3178 6 6.112884 0.1128840446472168 0.012742807535914835 +3179 4 5.79313755 1.7931375503540039 3.2153422744895579 +3181 6 6.601753 0.60175323486328125 0.36210695566842332 +3182 5 6.2163825 1.2163825035095215 1.479586394844091 +3183 6 6.049875 0.049874782562255859 0.0024874939356323011 +3189 5 6.140699 1.1406989097595215 1.3011940027265609 +3190 7 7.06220675 0.062206745147705078 0.0038696791418715293 +3192 6 6.601753 0.60175323486328125 0.36210695566842332 +3193 5 6.2163825 1.2163825035095215 1.479586394844091 +3195 6 6.242802 0.24280214309692383 0.058952880692459075 +3197 6 6.737725 0.73772478103637695 0.54423785255517032 +3199 7 6.66018629 0.3398137092590332 0.11547335700038275 +3200 7 6.8083353 0.19166469573974609 0.036735355593009444 +3201 6 6.737725 0.73772478103637695 0.54423785255517032 +3204 5 5.61776447 0.61776447296142578 0.38163294405330817 +3206 7 6.68098974 0.31901025772094727 0.10176754453118519 +3208 5 6.008159 1.0081591606140137 1.0163848931299526 +3209 5 5.57621145 0.57621145248413086 0.3320196379738718 +3211 6 6.456321 0.45632076263427734 0.20822863841112849 +3212 5 6.188125 1.1881251335144043 1.411641332888621 +3215 6 6.065724 0.065723896026611328 0.0043196305089168163 +3216 5 6.28508568 1.2850856781005859 1.6514452000592428 +3217 5 5.11301851 0.11301851272583008 0.012773184218758615 +3218 4 5.18631649 1.1863164901733398 1.4073468148571919 +3220 5 6.04402351 1.0440235137939453 1.0899850973546563 +3224 6 6.42197561 0.42197561264038086 0.17806341766322475 +3225 7 6.61993027 0.38006973266601563 0.14445300168881658 +3228 6 5.33879328 0.66120672225952148 0.43719432956117998 +3229 7 6.44850826 0.55149173736572266 0.30414313638266322 +3230 6 5.59285069 0.40714931488037109 0.16577056460755557 +3231 6 6.36423445 0.36423444747924805 0.1326667327305131 +3233 6 6.892843 0.89284276962280273 0.7971682112677172 +3234 6 5.69793034 0.30206966400146484 0.091246081909957866 +3235 6 6.42197561 0.42197561264038086 0.17806341766322475 +3237 7 6.369823 0.63017702102661133 0.39712307782997414 +3238 5 5.682729 0.68272876739501953 0.46611856982872268 +3243 7 6.61330032 0.38669967651367188 0.14953663981577847 +3245 5 5.682729 0.68272876739501953 0.46611856982872268 +3249 7 6.369823 0.63017702102661133 0.39712307782997414 +3250 6 6.864999 0.86499881744384766 0.74822295417925488 +3254 5 6.04639673 1.0463967323303223 1.0949461214315761 +3257 6 6.379424 0.37942409515380859 0.1439626439832864 +3259 6 6.379424 0.37942409515380859 0.1439626439832864 +3260 6 6.379424 0.37942409515380859 0.1439626439832864 +3261 5 6.71544456 1.7154445648193359 2.9427500549682009 +3262 7 5.91904974 1.0809502601623535 1.1684534649450597 +3265 3 5.408037 2.4080371856689453 5.7986430875644146 +3268 6 6.56899548 0.56899547576904297 0.32375585144563956 +3270 5 5.907564 0.90756416320800781 0.82367271033945144 +3276 8 6.294619 1.705380916595459 2.9083240706879678 +3279 6 6.2112565 0.21125650405883789 0.04462931050716179 +3280 5 5.907564 0.90756416320800781 0.82367271033945144 +3285 7 6.21512938 0.78487062454223633 0.61602189726932011 +3286 7 6.21512938 0.78487062454223633 0.61602189726932011 +3289 5 5.373417 0.37341690063476563 0.13944018167967442 +3291 8 7.06327868 0.9367213249206543 0.877446840561106 +3292 5 5.3677 0.36770009994506836 0.13520336349961326 +3294 6 5.762234 0.23776578903198242 0.056532570434001173 +3301 8 7.06327868 0.9367213249206543 0.877446840561106 +3304 7 7.03957 0.039569854736328125 0.0015657734038541093 +3307 3 5.551138 2.5511379241943359 6.5083047082625853 +3312 7 6.90318632 0.096813678741455078 0.0093728883914536709 +3315 7 6.349025 0.65097522735595703 0.42376874663113995 +3320 5 5.555195 0.55519485473632813 0.30824132672569249 +3322 7 6.713857 0.28614282608032227 0.081877716917233556 +3324 6 6.09259033 0.09259033203125 0.0085729695856571198 +3325 7 6.805244 0.19475603103637695 0.037929911625042223 +3327 7 6.30779028 0.69220972061157227 0.47915429730915093 +3329 6 6.29850864 0.29850864410400391 0.089107410604810866 +3331 6 5.92293072 0.077069282531738281 0.0059396743099568994 +3334 6 6.29176331 0.2917633056640625 0.085125826532021165 +3338 6 4.452654 1.5473461151123047 2.3942799999531417 +3339 6 5.92551756 0.074482440948486328 0.005547634009644753 +3340 6 6.308332 0.30833196640014648 0.095068601504181061 +3341 6 5.92551756 0.074482440948486328 0.005547634009644753 +3345 6 5.78186 0.2181401252746582 0.047585114254843575 +3348 6 4.452654 1.5473461151123047 2.3942799999531417 +3349 6 5.860938 0.13906192779541016 0.019338219762175868 +3350 6 6.46421 0.46421003341674805 0.21549095512477834 +3352 6 6.52834654 0.52834653854370117 0.27915006479111071 +3353 6 6.487485 0.48748493194580078 0.23764155887420202 +3354 7 6.862117 0.13788318634033203 0.019011773075362726 +3358 6 6.52834654 0.52834653854370117 0.27915006479111071 +3360 7 5.929071 1.0709290504455566 1.1468890310882216 +3362 6 6.46421 0.46421003341674805 0.21549095512477834 +3364 6 6.19586229 0.1958622932434082 0.038362037914566827 +3367 6 6.58196354 0.58196353912353516 0.33868156086919043 +3368 6 5.94375134 0.056248664855957031 0.0031639122980777756 +3373 7 6.703072 0.29692792892456055 0.08816619497542888 +3374 5 5.55829239 0.55829238891601563 0.31169039152155165 +3375 6 5.945457 0.054543018341064453 0.0029749408497536933 +3377 6 6.07918072 0.079180717468261719 0.0062695860187886865 +3378 8 6.5126605 1.4873394966125488 2.2121787781836701 +3379 5 5.142003 0.14200305938720703 0.020164868875326647 +3380 7 6.76761866 0.23238134384155273 0.054001088965605959 +3381 7 6.304437 0.69556283950805664 0.48380766370451056 +3385 6 6.483192 0.48319196701049805 0.23347447698347423 +3386 8 6.5126605 1.4873394966125488 2.2121787781836701 +3388 6 6.310103 0.31010293960571289 0.096163833152104417 +3391 8 6.59127235 1.4087276458740234 1.984513580249768 +3392 6 6.58681345 0.58681344985961914 0.34435002493614775 +3393 6 6.242813 0.2428131103515625 0.058958206558600068 +3394 5 5.517561 0.51756095886230469 0.26786934613846825 +3395 5 5.42729425 0.42729425430297852 0.18258037976033847 +3396 6 6.080851 0.080851078033447266 0.006536896819170579 +3398 5 5.633409 0.63340902328491211 0.40120699077874633 +3402 6 5.25966454 0.74033546447753906 0.5480965999631735 +3403 5 6.20717239 1.2071723937988281 1.457265188349993 +3404 6 5.354333 0.64566707611083984 0.41688597317352105 +3407 5 5.633409 0.63340902328491211 0.40120699077874633 +3410 7 6.016722 0.98327779769897461 0.96683522744774564 +3412 6 5.838692 0.16130781173706055 0.026020210127398968 +3413 6 5.566281 0.43371915817260742 0.18811230816595526 +3415 7 6.75017834 0.24982166290283203 0.062410863255536242 +3417 4 6.68368769 2.683687686920166 7.202179600926911 +3418 6 5.59492636 0.40507364273071289 0.16408465603512923 +3419 7 6.75017834 0.24982166290283203 0.062410863255536242 +3420 5 5.18478537 0.18478536605834961 0.034145631509318264 +3421 8 6.518584 1.4814162254333496 2.1945940329771929 +3424 6 6.5416193 0.54161930084228516 0.29335146704488579 +3426 6 6.227545 0.22754478454589844 0.05177662897403934 +3427 6 6.292055 0.29205513000488281 0.085296198962169001 +3428 6 6.5416193 0.54161930084228516 0.29335146704488579 +3429 5 5.917385 0.91738510131835938 0.8415954241208965 +3430 6 6.227545 0.22754478454589844 0.05177662897403934 +3432 5 5.899042 0.89904212951660156 0.80827675064574578 +3433 7 7.028948 0.028947830200195313 0.00083797687329933979 +3434 6 5.98812 0.011879920959472656 0.00014113252200331772 +3436 6 6.27996063 0.27996063232421875 0.078377955651376396 +3438 5 5.35919762 0.35919761657714844 0.12902292775470414 +3440 5 6.570556 1.5705561637878418 2.4666466636119821 +3441 5 6.18622065 1.186220645904541 1.4071194207701865 +3443 6 6.24534845 0.24534845352172852 0.060195863645503778 +3444 5 5.35919762 0.35919761657714844 0.12902292775470414 +3445 8 7.20836258 0.79163742065429688 0.62668980578018818 +3446 6 5.34057474 0.65942525863647461 0.43484167172778143 +3447 6 6.26559734 0.26559734344482422 0.07054194884494791 +3448 7 6.77392 0.22607994079589844 0.051112139630276943 +3449 8 7.20836258 0.79163742065429688 0.62668980578018818 +3453 6 5.924129 0.075870990753173828 0.0057564072378681885 +3460 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3462 6 6.51762867 0.51762866973876953 0.26793943973552814 +3464 5 5.63632774 0.63632774353027344 0.40491299718632945 +3466 6 6.51762867 0.51762866973876953 0.26793943973552814 +3468 8 6.82865238 1.1713476181030273 1.3720552424356356 +3469 6 5.73325253 0.26674747467041016 0.071154215243041108 +3471 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3474 6 5.795674 0.20432615280151367 0.041749176718667513 +3476 8 7.431058 0.56894207000732422 0.32369507902421901 +3479 7 7.04171276 0.041712760925292969 0.0017399544240106479 +3485 7 5.834083 1.165916919708252 1.3593622636619784 +3486 6 6.16977739 0.16977739334106445 0.028824363289686517 +3489 8 4.801781 3.198218822479248 10.228603636460548 +3492 7 6.888686 0.11131381988525391 0.012390766497446748 +3495 7 6.191298 0.80870199203491211 0.65399891192123505 +3496 7 6.308696 0.69130420684814453 0.4779015064059422 +3498 6 5.77528572 0.22471427917480469 0.05049650726505206 +3499 7 7.09658337 0.096583366394042969 0.0093283466640059487 +3501 6 6.357981 0.35798120498657227 0.12815054312363827 +3505 7 6.31529951 0.68470048904418945 0.4688147596973522 +3508 5 5.14080048 0.14080047607421875 0.019824774062726647 +3509 6 5.64398 0.35601997375488281 0.12675022171242745 +3510 6 6.093127 0.093126773834228516 0.0086725960047715489 +3512 6 6.499861 0.49986076354980469 0.24986078293659375 +3514 6 6.82486 0.8248600959777832 0.68039417793647772 +3515 7 6.633162 0.36683797836303711 0.13457010236948008 +3521 7 6.103966 0.89603376388549805 0.80287650602281246 +3524 6 7.059881 1.0598812103271484 1.1233481800045411 +3525 6 7.059881 1.0598812103271484 1.1233481800045411 +3530 5 5.521842 0.52184200286865234 0.27231907595796656 +3534 5 5.521842 0.52184200286865234 0.27231907595796656 +3535 5 5.33379745 0.33379745483398438 0.11142074085364584 +3538 7 6.42016 0.57984018325805664 0.33621463812073671 +3539 6 6.67678165 0.67678165435791016 0.45803340767542977 +3540 6 6.71353674 0.71353673934936523 0.50913467840132398 +3545 6 6.0961237 0.096123695373535156 0.009239764812264184 +3548 6 6.183013 0.18301296234130859 0.033493744384941238 +3549 6 6.090422 0.090422153472900391 0.0081761658386767522 +3550 6 6.07437038 0.074370384216308594 0.0055309540484813624 +3552 6 5.76073647 0.23926353454589844 0.057247038963396335 +3553 6 5.76073647 0.23926353454589844 0.057247038963396335 +3554 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3556 7 6.27572966 0.72427034378051758 0.52456753087994912 +3557 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3558 6 5.76073647 0.23926353454589844 0.057247038963396335 +3559 4 4.07595253 0.075952529907226563 0.0057687867993081454 +3561 5 4.905119 0.094881057739257813 0.0090024151177203748 +3562 6 6.55745363 0.55745363235473633 0.31075455222548953 +3563 5 4.905119 0.094881057739257813 0.0090024151177203748 +3565 6 6.04586554 0.045865535736083984 0.002103647368357997 +3569 6 6.04586554 0.045865535736083984 0.002103647368357997 +3570 6 6.00234652 0.0023465156555175781 5.5061357215890894E-06 +3571 4 4.425938 0.42593812942504883 0.18142329009810965 +3575 7 6.21730042 0.7826995849609375 0.61261864029802382 +3583 6 5.68802 0.31197977066040039 0.097331377301316024 +3584 7 6.31275463 0.68724536895751953 0.47230619715355715 +3586 7 6.36759567 0.63240432739257813 0.39993523330485914 +3587 6 5.788671 0.21132898330688477 0.04465993918552158 +3592 7 6.515574 0.48442602157592773 0.2346685703798812 +3598 7 6.75961447 0.24038553237915039 0.057785204177207561 +3599 6 5.357542 0.64245796203613281 0.41275223298362107 +3600 6 6.2097683 0.20976829528808594 0.044002737708069617 +3605 5 5.239256 0.23925590515136719 0.057243388149800012 +3607 6 6.00548553 0.00548553466796875 3.0091090593487024E-05 +3613 6 6.04967546 0.049675464630126953 0.0024676517862189939 +3614 5 5.464339 0.46433877944946289 0.21561050210061694 +3615 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3616 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3620 7 6.543914 0.45608615875244141 0.20801458420555718 +3622 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3625 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3627 5 5.06645775 0.066457748413085938 0.0044166323241370264 +3628 6 4.948763 1.0512371063232422 1.1050994537108636 +3629 6 5.165518 0.83448219299316406 0.69636053042268031 +3631 6 5.855898 0.14410209655761719 0.020765414232300827 +3635 6 5.803308 0.19669198989868164 0.038687738890303081 +3637 7 5.53476954 1.4652304649353027 2.1469003153745234 +3638 7 6.54559469 0.45440530776977539 0.20648418372934429 +3639 6 6.441782 0.44178199768066406 0.19517133347471827 +3640 6 6.44922447 0.44922447204589844 0.20180262628491619 +3643 6 6.44922447 0.44922447204589844 0.20180262628491619 +3645 6 6.42862368 0.42862367630004883 0.18371825588496904 +3646 7 5.662194 1.337806224822998 1.789725495175162 +3647 7 6.61878443 0.38121557235717773 0.14532531260761061 +3650 4 4.981792 0.98179197311401367 0.96391547847110814 +3652 6 6.1309557 0.13095569610595703 0.01714939434259577 +3653 6 5.460203 0.53979682922363281 0.29138061683988781 +3655 7 6.627825 0.37217521667480469 0.13851439190693782 +3656 7 6.350513 0.64948701858520508 0.42183338731069853 +3658 7 6.351104 0.64889621734619141 0.42106630088619568 +3660 8 7.266342 0.7336578369140625 0.53825382166542113 +3661 6 5.73333931 0.26666069030761719 0.071107923755334923 +3668 5 4.298321 0.70167922973632813 0.49235374144336674 +3677 6 6.48859262 0.48859262466430664 0.23872275287635603 +3679 7 6.182809 0.81719112396240234 0.66780133308293443 +3680 6 6.29749 0.29749011993408203 0.088500371458394511 +3681 8 6.875233 1.1247668266296387 1.2651004142865077 +3684 7 6.99874163 0.0012583732604980469 1.5835032627364853E-06 +3687 5 6.75047874 1.7504787445068359 3.0641758349702286 +3688 6 6.5764 0.57639980316162109 0.33223673308475554 +3697 6 6.29749 0.29749011993408203 0.088500371458394511 +3698 6 6.28198338 0.28198337554931641 0.079514624086186814 +3699 5 5.228925 0.22892522811889648 0.052406760069288794 +3702 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3703 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3704 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3706 6 6.62652731 0.62652730941772461 0.39253646944621323 +3714 4 6.085308 2.0853080749511719 4.3485097674565623 +3716 5 6.05689526 1.0568952560424805 1.1170275822451003 +3718 5 5.2608223 0.26082229614257813 0.068028270165086724 +3720 7 7.306124 0.30612421035766602 0.093712032167104553 +3721 5 5.29979467 0.29979467391967773 0.089876846510605901 +3723 7 6.609133 0.39086723327636719 0.15277719404912204 +3724 6 6.398474 0.39847421646118164 0.15878170118435264 +3728 7 6.39105129 0.60894870758056641 0.37081852846404217 +3730 6 5.40976429 0.59023571014404297 0.34837819352924271 +3731 6 6.323588 0.32358789443969727 0.10470912542791666 +3733 6 6.918565 0.91856479644775391 0.84376128527310357 +3734 5 5.592469 0.59246921539306641 0.35101977118847572 +3735 6 6.6319313 0.63193130493164063 0.39933717415260617 +3738 6 5.686131 0.31386899948120117 0.098513748835330261 +3739 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3741 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3744 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3745 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3748 5 5.54170942 0.54170942306518555 0.29344909903761618 +3749 6 6.36270332 0.36270332336425781 0.13155370077947737 +3750 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3753 5 5.294697 0.29469680786132813 0.086846208563656546 +3757 5 5.228405 0.22840499877929688 0.052168843467370607 +3759 6 6.1390934 0.13909339904785156 0.019346973658684874 +3762 5 5.38635254 0.3863525390625 0.14926828444004059 +3764 8 7.7105546 0.28944540023803711 0.083778639718957493 +3766 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3767 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3769 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3771 6 5.881416 0.11858415603637695 0.014062202062859797 +3772 6 6.194134 0.19413423538208008 0.037688101347384872 +3776 5 6.84388638 1.8438863754272461 3.3999169654862271 +3778 7 6.78043842 0.21956157684326172 0.048207286025899521 +3779 7 7.006796 0.0067958831787109375 4.6184028178686276E-05 +3782 6 6.213825 0.21382522583007813 0.045721227201283909 +3785 7 6.614752 0.38524818420410156 0.14841616343255737 +3786 5 5.138664 0.13866376876831055 0.019227640769031495 +3790 5 5.36643553 0.36643552780151367 0.1342749960351739 +3794 5 5.73072529 0.73072528839111328 0.53395944709427567 +3795 6 5.587233 0.41276693344116211 0.17037654134242075 +3796 6 6.35663176 0.35663175582885742 0.12718620926557378 +3797 5 5.010817 0.010817050933837891 0.00011700859090524318 +3799 5 6.00536442 1.0053644180297852 1.0107576130403686 +3802 5 5.56199741 0.56199741363525391 0.31584109293271467 +3803 6 6.127415 0.12741518020629883 0.016234628147003605 +3804 5 5.23174334 0.23174333572387695 0.053704973652429544 +3806 5 5.010817 0.010817050933837891 0.00011700859090524318 +3807 5 5.76871 0.76871013641357422 0.59091527382497588 +3810 3 5.63473034 2.634730339050293 6.9418039595120717 +3811 5 5.71404 0.71403980255126953 0.50985283962745598 +3812 5 5.56199741 0.56199741363525391 0.31584109293271467 +3813 5 6.00536442 1.0053644180297852 1.0107576130403686 +3814 5 5.584843 0.58484315872192383 0.34204152030383739 +3816 5 5.614201 0.61420106887817383 0.37724295301109123 +3817 6 6.45202875 0.45202875137329102 0.20432999206809654 +3818 6 6.95391655 0.95391654968261719 0.90995678375838907 +3819 6 6.95391655 0.95391654968261719 0.90995678375838907 +3822 6 6.508243 0.50824308395385742 0.25831103238692776 +3825 6 6.22035742 0.22035741806030273 0.048557391694203034 +3826 6 6.95391655 0.95391654968261719 0.90995678375838907 +3827 5 5.79172754 0.79172754287719727 0.62683250215036423 +3828 6 6.45202875 0.45202875137329102 0.20432999206809654 +3829 7 6.896923 0.10307693481445313 0.010624854490743019 +3831 5 5.33792543 0.33792543411254883 0.11419359902015458 +3832 5 5.33792543 0.33792543411254883 0.11419359902015458 +3835 5 4.95905542 0.040944576263427734 0.0016764583253916499 +3836 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3837 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3840 6 6.563122 0.56312179565429688 0.31710615674091969 +3842 6 6.269664 0.26966381072998047 0.072718570817414729 +3844 6 6.563122 0.56312179565429688 0.31710615674091969 +3845 5 5.040678 0.040678024291992188 0.0016547016602999065 +3846 6 6.333541 0.33354091644287109 0.11124954294155032 +3847 5 5.040678 0.040678024291992188 0.0016547016602999065 +3849 5 5.18588829 0.18588829040527344 0.034554456509795273 +3851 7 7.063238 0.063238143920898438 0.003999062846560264 +3852 6 6.40936041 0.40936040878295898 0.16757594427895128 +3856 6 6.40936041 0.40936040878295898 0.16757594427895128 +3857 6 6.131547 0.13154697418212891 0.017304606416473689 +3858 6 6.55600739 0.55600738525390625 0.30914421245688573 +3859 5 5.479981 0.4799809455871582 0.23038170812674252 +3861 6 5.770308 0.22969198226928711 0.052758406718794504 +3864 7 6.434293 0.56570720672607422 0.32002464374181727 +3865 6 7.211348 1.2113480567932129 1.4673641146966929 +3867 5 5.479981 0.4799809455871582 0.23038170812674252 +3868 6 5.64784956 0.35215044021606445 0.12400993254436798 +3871 6 5.47240543 0.52759456634521484 0.27835602643699531 +3873 5 5.128382 0.12838220596313477 0.016481990807960756 +3874 5 5.36483431 0.36483430862426758 0.13310407274934732 +3877 5 5.846487 0.84648704528808594 0.71654031784055405 +3878 5 5.39803934 0.39803934097290039 0.15843531696214086 +3879 4 5.068995 1.0689949989318848 1.1427503077413803 +3880 6 5.62090158 0.37909841537475586 0.14371560853965093 +3881 6 5.62090158 0.37909841537475586 0.14371560853965093 +3882 5 5.83923769 0.83923768997192383 0.70431990026941094 +3883 6 6.642903 0.64290285110473633 0.41332407595859877 +3884 6 5.62090158 0.37909841537475586 0.14371560853965093 +3885 6 6.30556154 0.30556154251098633 0.093367856261693305 +3887 6 6.30556154 0.30556154251098633 0.093367856261693305 +3890 6 6.616883 0.6168828010559082 0.38054439023858322 +3892 5 6.207933 1.2079329490661621 1.4591020094396754 +3895 6 5.99532557 0.0046744346618652344 2.1850339408047148E-05 +3896 6 5.653739 0.34626102447509766 0.11989669707054418 +3898 7 6.063343 0.93665695190429688 0.87732624555064831 +3899 5 6.207933 1.2079329490661621 1.4591020094396754 +3901 4 4.564142 0.56414222717285156 0.31825645247954526 +3902 6 5.68136072 0.31863927841186523 0.10153098974683417 +3905 7 7.138951 0.13895082473754883 0.019307331695245011 +3906 7 7.138951 0.13895082473754883 0.019307331695245011 +3908 7 6.148028 0.85197210311889648 0.72585646449283558 +3909 7 6.148028 0.85197210311889648 0.72585646449283558 +3910 6 6.63435841 0.63435840606689453 0.40241058734773105 +3911 6 5.38463831 0.61536169052124023 0.37867001016115864 +3913 6 5.75083733 0.24916267395019531 0.062082038090011338 +3914 7 6.148028 0.85197210311889648 0.72585646449283558 +3915 7 7.09318256 0.093182563781738281 0.0086829901929377229 +3917 5 5.26391649 0.2639164924621582 0.069651914993528408 +3920 6 5.7849946 0.21500539779663086 0.046227321081687478 +3922 7 6.80864763 0.19135236740112305 0.036615728510014378 +3923 5 5.02166033 0.021660327911376953 0.00046916980522837548 +3925 5 5.87787962 0.87787961959838867 0.7706726265062116 +3926 6 5.86510658 0.13489341735839844 0.018196234046627069 +3927 5 6.15729952 1.1572995185852051 1.3393421757175474 +3928 5 5.181213 0.1812129020690918 0.032838115876302254 +3930 6 6.24382734 0.24382734298706055 0.059451773188129664 +3931 6 6.76949167 0.76949167251586914 0.5921174340712696 +3932 8 6.814661 1.1853389739990234 1.4050284832810576 +3933 4 5.36573 1.365729808807373 1.8652179106650237 +3936 6 5.942126 0.057874202728271484 0.0033494233414330665 +3937 5 5.47661352 0.47661352157592773 0.22716044894900733 +3940 5 5.20407343 0.20407342910766602 0.041645964467761587 +3941 5 5.28040171 0.28040170669555664 0.078625117117780974 +3942 6 5.689291 0.31070899963378906 0.096540082453429932 +3943 6 5.534346 0.46565389633178711 0.21683355116897474 +3944 6 6.19307756 0.19307756423950195 0.037278945812659003 +3945 6 6.19931555 0.19931554794311523 0.039726687651864268 +3946 6 6.649443 0.64944314956665039 0.42177640451905063 +3947 7 6.5232563 0.47674369812011719 0.22728455369724543 +3949 5 5.20407343 0.20407342910766602 0.041645964467761587 +3950 5 5.28040171 0.28040170669555664 0.078625117117780974 +3951 5 5.33914328 0.33914327621459961 0.11501816180157221 +3952 6 6.17257738 0.1725773811340332 0.029782952479081359 +3953 7 6.01015 0.98985004425048828 0.97980311010269361 +3954 5 5.33914328 0.33914327621459961 0.11501816180157221 +3956 5 5.874935 0.87493515014648438 0.76551151696185116 +3959 6 5.762868 0.23713207244873047 0.056231619783829956 +3960 6 5.484553 0.51544713973999023 0.26568575386613702 +3962 7 6.894317 0.1056828498840332 0.011168864759611097 +3963 7 6.40009546 0.59990453720092773 0.35988545375425929 +3965 4 5.771997 1.7719969749450684 3.1399732792144732 +3967 4 5.61956 1.6195597648620605 2.6229738319600528 +3970 7 6.26989174 0.73010826110839844 0.53305807293872931 +3973 4 5.61956 1.6195597648620605 2.6229738319600528 +3978 7 5.6615057 1.3384943008422852 1.7915669933872778 +3982 7 7.10843658 0.10843658447265625 0.011758492852095515 +3985 6 6.1268425 0.12684249877929688 0.016089019496575929 +3990 6 5.793903 0.20609712600708008 0.042476025348378244 +3993 7 6.273067 0.72693300247192383 0.52843159008284601 +3994 7 6.273067 0.72693300247192383 0.52843159008284601 +3995 5 4.49924231 0.50075769424438477 0.25075826834495274 +3996 7 6.273067 0.72693300247192383 0.52843159008284601 +3997 7 6.61189747 0.38810253143310547 0.15062357490478462 +4002 6 5.52411652 0.47588348388671875 0.2264650902361609 +4003 6 6.44395447 0.4439544677734375 0.19709556945599616 +4004 7 6.93372965 0.066270351409912109 0.0043917594759932399 +4006 6 6.54262829 0.54262828826904297 0.2944454592297916 +4009 6 6.030793 0.030793190002441406 0.00094822055052645737 +4010 6 6.702753 0.70275306701660156 0.49386187320124009 +4011 7 6.61189747 0.38810253143310547 0.15062357490478462 +4014 6 6.416903 0.41690301895141602 0.17380812721080474 +4015 5 4.63322 0.36677980422973633 0.13452742479080371 +4017 6 6.302566 0.3025660514831543 0.091546215510106776 +4018 6 6.416903 0.41690301895141602 0.17380812721080474 +4019 5 4.63322 0.36677980422973633 0.13452742479080371 +4021 5 5.672981 0.67298078536987305 0.45290313747705113 +4022 5 5.24404049 0.24404048919677734 0.059555760367402399 +4024 6 6.498086 0.49808597564697266 0.24808963913619664 +4025 6 7.268845 1.2688450813293457 1.6099678404136739 +4027 5 5.43563271 0.43563270568847656 0.18977585426546284 +4029 6 6.150405 0.15040493011474609 0.022621643002821656 +4031 5 5.149139 0.1491389274597168 0.022242419683834669 +4032 5 5.507375 0.50737476348876953 0.25742915062528482 +4033 6 5.997153 0.0028471946716308594 8.1065174981631571E-06 +4034 5 5.507375 0.50737476348876953 0.25742915062528482 +4035 6 6.290976 0.29097604751586914 0.084667060227957336 +4037 5 5.21681929 0.21681928634643555 0.047010602931777612 +4039 4 5.56902456 1.5690245628356934 2.4618380787817387 +4043 7 6.615785 0.38421487808227539 0.14762107253977774 +4044 7 6.615785 0.38421487808227539 0.14762107253977774 +4047 6 6.399214 0.39921379089355469 0.15937165083960281 +4049 6 6.340012 0.3400120735168457 0.11560821013722489 +4050 7 6.615785 0.38421487808227539 0.14762107253977774 +4051 6 6.762627 0.76262712478637695 0.58160013145993616 +4052 5 5.392097 0.39209699630737305 0.15374005451326411 +4053 7 6.615785 0.38421487808227539 0.14762107253977774 +4054 7 6.69855261 0.30144739151000977 0.090870529848189108 +4055 6 6.762627 0.76262712478637695 0.58160013145993616 +4056 5 5.68365574 0.68365573883056641 0.46738516923596762 +4059 6 6.340012 0.3400120735168457 0.11560821013722489 +4064 5 6.0256834 1.0256834030151367 1.0520264432207114 +4066 6 6.278558 0.27855777740478516 0.077594435352693836 +4070 5 5.71400928 0.71400928497314453 0.50980925902786112 +4071 6 6.35261631 0.35261631011962891 0.12433826216238231 +4075 6 5.782519 0.21748113632202148 0.047298044655917693 +4078 6 5.879521 0.12047910690307617 0.014515215200162856 +4082 6 5.96297741 0.037022590637207031 0.0013706722174902097 +4085 6 5.42402267 0.57597732543945313 0.3317498794203857 +4086 6 5.6922617 0.30773830413818359 0.094702863833845186 +4087 6 5.65787649 0.34212350845336914 0.11704849503644255 +4088 6 5.93835 0.061649799346923828 0.0038006977595159697 +4091 6 5.59978676 0.40021324157714844 0.16017063873368897 +4094 7 7.09430265 0.094302654266357422 0.0088929906016801397 +4096 5 5.004691 0.0046911239624023438 2.2006644030625466E-05 +4097 6 5.59978676 0.40021324157714844 0.16017063873368897 +4099 6 5.251464 0.74853610992431641 0.56030630786062829 +4100 6 6.169235 0.1692352294921875 0.02864056290127337 +4101 5 5.35461 0.35460996627807617 0.12574822818373832 +4102 5 5.35461 0.35460996627807617 0.12574822818373832 +4103 7 6.459716 0.54028415679931641 0.29190697008834832 +4105 7 6.1171217 0.88287830352783203 0.77947409884018271 +4107 6 6.4520607 0.45206069946289063 0.20435887599887792 +4108 6 6.504417 0.50441694259643555 0.25443645197833575 +4109 6 6.58853436 0.58853435516357422 0.34637268720780412 +4111 6 5.88097429 0.11902570724487305 0.014167118985142224 +4112 6 6.374791 0.37479114532470703 0.14046840261380567 +4119 7 6.504891 0.49510908126831055 0.24513300235435054 +4120 5 5.821947 0.82194709777832031 0.67559703154620365 +4122 6 5.31796741 0.68203258514404297 0.46516844719826622 +4125 5 5.840767 0.84076690673828125 0.70688899146625772 +4126 5 5.781769 0.781768798828125 0.61116245482116938 +4128 5 5.52519 0.52518987655639648 0.27582440643732298 +4131 5 5.383935 0.38393497467041016 0.14740606477516849 +4132 5 5.383935 0.38393497467041016 0.14740606477516849 +4133 6 6.15966272 0.15966272354125977 0.025492185288612745 +4134 6 6.03338528 0.033385276794433594 0.0011145767066409462 +4136 6 6.40281725 0.4028172492980957 0.16226173633208418 +4137 5 5.383935 0.38393497467041016 0.14740606477516849 +4138 6 5.73121643 0.2687835693359375 0.072244607144966722 +4139 7 6.34555149 0.65444850921630859 0.42830285121544875 +4140 6 5.88961172 0.11038827896118164 0.012185572132011657 +4141 6 5.88961172 0.11038827896118164 0.012185572132011657 +4143 6 5.593262 0.4067378044128418 0.16543564153857915 +4147 7 6.34555149 0.65444850921630859 0.42830285121544875 +4149 7 6.661175 0.33882522583007813 0.11480253365880344 +4150 5 5.02091932 0.020919322967529297 0.00043761807341979875 +4151 6 6.47969961 0.47969961166381836 0.23011171743041814 +4152 6 5.66785336 0.33214664459228516 0.11032139351391379 +4154 5 5.15050268 0.15050268173217773 0.022651057208577186 +4155 5 5.12121248 0.12121248245239258 0.014692465902271579 +4159 7 7.171123 0.17112302780151367 0.029283090643957621 +4160 7 7.171123 0.17112302780151367 0.029283090643957621 +4162 7 7.171123 0.17112302780151367 0.029283090643957621 +4163 5 5.196028 0.19602823257446289 0.038427067966267714 +4165 7 6.1403017 0.85969829559326172 0.7390811594459592 +4166 7 6.264687 0.73531293869018555 0.54068511780519657 +4168 6 6.413434 0.41343402862548828 0.17092769602550106 +4169 7 6.41145468 0.58854532241821289 0.34638559654035816 +4170 7 7.171123 0.17112302780151367 0.029283090643957621 +4171 5 6.396712 1.3967118263244629 1.9508039257946166 +4174 6 5.622606 0.37739419937133789 0.14242638171913313 +4177 6 6.333195 0.33319520950317383 0.1110190476358639 +4178 7 6.451308 0.54869222640991211 0.30106315932266625 +4179 5 5.080747 0.080747127532958984 0.0065200986048239429 +4180 6 5.17860174 0.82139825820922852 0.67469509858915444 +4181 6 5.97988 0.020120143890380859 0.00040482019016963022 +4184 7 6.664118 0.33588218688964844 0.11281684346977272 +4186 5 5.63166 0.63165998458862305 0.39899433613049951 +4187 6 6.629633 0.62963294982910156 0.39643765151049593 +4188 6 6.45284367 0.45284366607666016 0.20506738590574969 +4189 5 5.431086 0.43108606338500977 0.18583519404478466 +4195 8 6.864855 1.1351451873779297 1.2885545964272751 +4196 6 6.342234 0.34223413467407227 0.11712420293611103 +4199 6 6.092705 0.09270477294921875 0.0085941749275662005 +4203 5 5.11989164 0.11989164352416992 0.014374006186926636 +4205 6 6.4625473 0.46254730224609375 0.2139500068151392 +4206 6 5.41587734 0.58412265777587891 0.34119927932715655 +4207 7 6.66556644 0.33443355560302734 0.11184580311328318 +4208 6 6.23236465 0.23236465454101563 0.053993332679965533 +4210 6 5.624344 0.3756561279296875 0.14111752645112574 +4211 6 5.50366735 0.49633264541625977 0.24634609490590265 +4212 4 5.101606 1.1016058921813965 1.2135355416887705 +4213 4 4.66811943 0.66811943054199219 0.44638357346775592 +4215 5 5.144476 0.14447593688964844 0.020873296340141678 +4218 6 6.2664175 0.26641750335693359 0.070978286094941723 +4221 6 6.68571949 0.68571949005126953 0.47021121903617313 +4222 4 4.72174644 0.72174644470214844 0.52091793044019141 +4223 4 4.507802 0.50780200958251953 0.25786288093604526 +4225 5 5.66852236 0.66852235794067383 0.44692214306655842 +4227 7 5.712353 1.2876467704772949 1.6580342055206074 +4228 6 5.54079962 0.45920038223266602 0.21086499104262657 +4229 6 5.635159 0.36484098434448242 0.13310894385745087 +4230 6 5.206867 0.79313278198242188 0.62905960985517595 +4231 6 6.206823 0.20682287216186523 0.042775700449283249 +4233 6 5.66782 0.33218002319335938 0.11034356780874077 +4235 5 5.115067 0.1150670051574707 0.013240415675909389 +4236 5 5.115067 0.1150670051574707 0.013240415675909389 +4237 5 6.068968 1.0689678192138672 1.142692198514851 +4240 6 5.92421675 0.075783252716064453 0.0057431013922268903 +4241 6 6.78847551 0.78847551345825195 0.62169363532325406 +4244 5 5.40309143 0.4030914306640625 0.16248270147480071 +4249 6 5.87049532 0.12950468063354492 0.016771462305996465 +4251 6 5.72442341 0.27557659149169922 0.07594245777818287 +4253 4 5.871702 1.8717021942138672 3.503269103825005 +4254 5 5.62651348 0.62651348114013672 0.39251914205033245 +4256 5 5.298669 0.29866886138916016 0.089203088763497362 +4257 5 6.2595787 1.2595787048339844 1.5865385136712575 +4260 6 6.039149 0.039148807525634766 0.0015326291306791973 +4261 7 6.67396927 0.32603073120117188 0.10629603768757079 +4262 6 6.53447533 0.53447532653808594 0.28566387467799359 +4263 6 5.570907 0.4290928840637207 0.18412070315412166 +4266 7 6.67396927 0.32603073120117188 0.10629603768757079 +4268 6 6.223932 0.22393178939819336 0.050145446303076824 +4271 5 4.947084 0.052916049957275391 0.0028001083430808649 +4272 6 5.83227158 0.16772842407226563 0.028132824241765775 +4274 6 5.83227158 0.16772842407226563 0.028132824241765775 +4275 6 5.83227158 0.16772842407226563 0.028132824241765775 +4278 4 4.781235 0.7812352180480957 0.61032846591865564 +4279 6 6.009532 0.0095319747924804688 9.0858543444483075E-05 +4281 5 5.3883934 0.38839340209960938 0.15084943479450885 +4288 6 6.39963055 0.39963054656982422 0.15970457375169644 +4291 5 5.64141655 0.64141654968261719 0.41141519020675332 +4292 6 6.14931154 0.14931154251098633 0.022293936727010077 +4295 5 5.64141655 0.64141654968261719 0.41141519020675332 +4297 6 6.430081 0.43008089065551758 0.18496957250704327 +4300 5 5.76332045 0.7633204460144043 0.5826581033036291 +4301 5 5.09951735 0.099517345428466797 0.0099037020411287813 +4304 6 6.01407433 0.014074325561523438 0.00019808664001175202 +4306 6 6.01468229 0.014682292938232422 0.00021556972592406964 +4307 7 6.38643 0.61357021331787109 0.37646840667093784 +4308 6 6.37244368 0.37244367599487305 0.13871429178857397 +4310 6 5.634999 0.36500120162963867 0.13322587719108014 +4311 5 6.35202742 1.352027416229248 1.8279781342355363 +4314 7 6.330645 0.66935491561889648 0.44803600306318003 +4315 7 6.70243 0.29757022857666016 0.088548040935165773 +4318 7 6.330645 0.66935491561889648 0.44803600306318003 +4319 7 6.70243 0.29757022857666016 0.088548040935165773 +4322 7 6.258191 0.74180889129638672 0.55028043120637449 +4323 6 6.030255 0.030254840850830078 0.00091535539490905649 +4324 6 6.287142 0.28714179992675781 0.082450413265178213 +4325 5 5.33152676 0.33152675628662109 0.10990999013392866 +4327 5 5.33152676 0.33152675628662109 0.10990999013392866 +4331 5 5.30460739 0.30460739135742188 0.092785662869573571 +4336 8 7.803421 0.1965789794921875 0.038643295178189874 +4338 8 7.803421 0.1965789794921875 0.038643295178189874 +4339 8 5.894702 2.1052980422973633 4.4322798469011104 +4342 6 6.53088236 0.53088235855102539 0.28183607862069948 +4344 6 5.308004 0.69199609756469727 0.47885859904477002 +4345 6 6.16504431 0.16504430770874023 0.027239623507057331 +4346 6 5.308004 0.69199609756469727 0.47885859904477002 +4347 7 6.508878 0.49112176895141602 0.24120059193796806 +4348 6 5.203784 0.79621601104736328 0.63395993624817493 +4350 6 6.67189741 0.67189741134643555 0.45144613137404122 +4356 5 5.61585426 0.61585426330566406 0.3792764736317622 +4357 6 6.30698061 0.30698060989379883 0.094237094850768699 +4359 6 5.048261 0.95173883438110352 0.90580680886910159 +4360 5 5.47202253 0.47202253341674805 0.22280527205316503 +4364 6 6.12464428 0.12464427947998047 0.01553619640708348 +4367 5 5.313826 0.31382608413696289 0.098486811084740111 +4368 6 6.25579929 0.25579929351806641 0.06543327856434189 +4371 5 5.73987532 0.73987531661987305 0.54741548414335739 +4373 6 6.28148031 0.28148031234741211 0.079231166239196682 +4374 5 5.319378 0.31937789916992188 0.10200224247819278 +4377 6 7.22142553 1.2214255332946777 1.4918803333841879 +4379 5 5.134177 0.13417720794677734 0.018003523132392729 +4381 6 6.37373829 0.37373828887939453 0.13968030857449776 +4383 6 7.22142553 1.2214255332946777 1.4918803333841879 +4384 5 5.17954 0.17954015731811523 0.032234668089813567 +4385 5 5.17954 0.17954015731811523 0.032234668089813567 +4387 6 6.33638859 0.33638858795166016 0.1131572821041118 +4389 4 5.846869 1.8468689918518066 3.4109250730637086 +4390 5 5.244622 0.24462223052978516 0.059840035669367353 +4391 5 5.60372734 0.60372734069824219 0.3644867019065714 +4392 5 5.244622 0.24462223052978516 0.059840035669367353 +4394 6 5.95294666 0.047053337097167969 0.0022140165319797234 +4395 5 5.325285 0.32528495788574219 0.10581030382672907 +4396 5 5.33716774 0.33716773986816406 0.11368208480780595 +4401 6 7.114057 1.1140570640563965 1.2411231419739579 +4402 6 6.401035 0.40103483200073242 0.16082893647785568 +4404 5 5.16598129 0.16598129272460938 0.027549789534532465 +4405 5 5.16598129 0.16598129272460938 0.027549789534532465 +4407 6 6.38966656 0.38966655731201172 0.15184002588739531 +4409 7 6.784521 0.21547889709472656 0.046431155093159759 +4412 7 6.24230337 0.75769662857055664 0.57410418094718807 +4416 5 5.28144741 0.28144741058349609 0.079212644924155029 +4420 6 5.910447 0.089552879333496094 0.0080197181969197118 +4423 6 5.82727575 0.17272424697875977 0.029833665494379602 +4424 6 5.910447 0.089552879333496094 0.0080197181969197118 +4425 6 5.76691437 0.23308563232421875 0.054328911995980889 +4427 5 5.505483 0.50548315048217773 0.25551321542138794 +4429 6 5.82788134 0.1721186637878418 0.029624834424112123 +4430 5 5.208692 0.20869207382202148 0.043552381676136065 +4432 6 6.75506926 0.75506925582885742 0.57012958109794454 +4433 5 4.73662949 0.26337051391601563 0.06936402760038618 +4434 6 5.983093 0.016907215118408203 0.00028585392306013091 +4435 6 5.998494 0.0015058517456054688 2.2675894797430374E-06 +4438 5 5.61417246 0.61417245864868164 0.37720780896256656 +4441 6 6.13689232 0.13689231872558594 0.018739506926067406 +4444 6 6.323481 0.32348108291625977 0.10464001100467613 +4450 6 5.931922 0.068078041076660156 0.0046346196768354275 +4451 5 5.0867095 0.086709499359130859 0.0075185372791111149 +4452 5 5.28290367 0.28290367126464844 0.08003448721501627 +4454 6 5.866116 0.13388395309448242 0.017924912896205569 +4458 7 6.727507 0.27249288558959961 0.074252372696946622 +4463 6 6.66014862 0.66014862060546875 0.43579620128730312 +4464 5 5.33912659 0.3391265869140625 0.11500684195198119 +4467 5 5.814492 0.81449222564697266 0.66339758563935902 +4468 6 6.148203 0.14820289611816406 0.021964098417811329 +4469 6 6.15595961 0.1559596061706543 0.02432339875690559 +4471 6 6.1687336 0.16873359680175781 0.028471026689658174 +4474 6 5.58603525 0.41396474838256836 0.17136681290344313 +4476 6 6.43061924 0.43061923980712891 0.18543292969206959 +4477 5 5.274904 0.27490377426147461 0.07557208510320379 +4479 5 4.76414776 0.23585224151611328 0.055626279828175029 +4480 5 6.48533058 1.4853305816650391 2.2062069368294033 +4483 4 5.231788 1.231788158416748 1.5173020672157236 +4484 5 4.76414776 0.23585224151611328 0.055626279828175029 +4485 6 6.311954 0.31195402145385742 0.097315311501233737 +4487 6 6.056974 0.056973934173583984 0.003246029175215881 +4488 6 6.68880939 0.68880939483642578 0.47445838241492311 +4490 6 6.510393 0.51039314270019531 0.26050116011538194 +4492 6 5.89441824 0.10558176040649414 0.011147508130534334 +4495 6 5.144858 0.85514211654663086 0.7312680394918516 +4500 6 5.839706 0.1602940559387207 0.025694184369285722 +4501 6 4.62486744 1.3751325607299805 1.8909895595797934 +4502 6 6.01956224 0.019562244415283203 0.00038268140656327887 +4505 5 5.376757 0.37675714492797852 0.14194594625428181 +4506 6 6.49714661 0.4971466064453125 0.24715474830009043 +4508 4 6.290004 2.290003776550293 5.2441172966146041 +4510 6 7.13127375 1.1312737464904785 1.2797802894986035 +4513 6 6.11181831 0.11181831359863281 0.012503335256042192 +4515 6 6.48865747 0.48865747451782227 0.23878612740213612 +4518 6 5.303486 0.69651412963867188 0.48513193278631661 +4519 6 6.31545067 0.31545066833496094 0.099509124152973527 +4523 5 5.89000559 0.89000558853149414 0.79210994761729125 +4524 6 5.74650574 0.2534942626953125 0.064259341219440103 +4525 6 6.31545067 0.31545066833496094 0.099509124152973527 +4529 6 5.78503227 0.21496772766113281 0.046211123935790965 +4537 5 5.41821861 0.41821861267089844 0.17490680798437097 +4538 6 7.013766 1.013765811920166 1.0277211214181534 +4539 5 6.30204439 1.3020443916320801 1.6953195977805535 +4540 6 6.81689167 0.81689167022705078 0.66731200088634068 +4541 6 6.21650553 0.21650552749633789 0.046874643436467522 +4545 6 6.73921871 0.73921871185302734 0.54644430395364907 +4546 6 6.66135359 0.66135358810424805 0.43738856849836338 +4547 6 6.231135 0.23113489151000977 0.053423338073343984 +4548 5 5.619266 0.61926603317260742 0.38349041984133692 +4550 6 6.00123453 0.0012345314025878906 1.5240677839756245E-06 +4553 6 6.81689167 0.81689167022705078 0.66731200088634068 +4555 5 5.438729 0.43872880935668945 0.19248296815953836 +4559 7 5.820478 1.1795220375061035 1.3912722369625499 +4560 6 7.43508 1.4350800514221191 2.0594547539897121 +4562 7 6.60676956 0.39323043823242188 0.15463017755246256 +4563 7 6.51218367 0.48781633377075195 0.23796477549353767 +4569 6 5.791381 0.20861911773681641 0.043521936285287666 +4571 7 6.183002 0.81699800491333008 0.66748574003236172 +4574 7 7.28964 0.28963994979858398 0.083891300519326251 +4575 7 6.81097269 0.18902730941772461 0.035731323705704199 +4576 5 6.063239 1.0632390975952148 1.1304773786550868 +4578 7 6.65358162 0.34641838073730469 0.12000569451265619 +4581 6 6.3172965 0.31729650497436523 0.10067707206894738 +4582 6 5.9126215 0.087378501892089844 0.0076350025929059484 +4588 5 6.453704 1.4537038803100586 2.1132549716285212 +4589 6 6.48201656 0.48201656341552734 0.23233996740691509 +4591 6 5.233967 0.76603317260742188 0.5868068215349922 +4592 6 6.46258 0.46258020401000977 0.21398044514194225 +4594 6 7.097535 1.0975351333618164 1.2045833689635401 +4595 6 6.03428125 0.034281253814697266 0.0011752043631076958 +4601 6 6.55298138 0.55298137664794922 0.30578840291946108 +4603 6 6.15366173 0.15366172790527344 0.023611926622834289 +4604 6 6.37432575 0.37432575225830078 0.14011976880374277 +4610 6 5.418315 0.58168506622314453 0.33835751626702404 +4611 5 5.78711462 0.78711462020874023 0.61954942534634938 +4612 5 5.5359993 0.53599929809570313 0.28729524755908642 +4614 5 4.7773695 0.22263050079345703 0.049564339883545472 +4616 5 5.515364 0.51536417007446289 0.26560022779653991 +4618 7 6.754185 0.24581480026245117 0.060424916028068765 +4620 6 5.92583847 0.074161529541015625 0.0054999324638629332 +4622 7 7.02194071 0.021940708160400391 0.00048139467457986029 +4626 6 6.392011 0.39201116561889648 0.15367275396988589 +4627 6 5.879169 0.12083101272583008 0.01460013363634971 +4628 6 5.879169 0.12083101272583008 0.01460013363634971 +4629 7 6.207745 0.79225492477416992 0.62766786582892564 +4631 7 6.29134655 0.70865345001220703 0.50218971221420361 +4633 6 5.58980465 0.41019535064697266 0.16826022569239285 +4634 6 6.5506444 0.5506443977355957 0.30320925275759691 +4637 6 6.52179 0.5217900276184082 0.2722648329220192 +4638 5 5.39053345 0.390533447265625 0.1525163734331727 +4640 6 6.52179 0.5217900276184082 0.2722648329220192 +4643 6 5.714403 0.28559684753417969 0.081565559321461478 +4646 7 6.041397 0.9586029052734375 0.91891952999867499 +4649 5 4.65491056 0.34508943557739258 0.11908671854712338 +4651 7 7.295845 0.29584503173828125 0.08752428280422464 +4652 5 5.108062 0.10806179046630859 0.011677350558784383 +4656 7 6.557833 0.44216680526733398 0.19551148368032045 +4657 7 6.557833 0.44216680526733398 0.19551148368032045 +4661 5 6.112563 1.1125631332397461 1.237796725444241 +4664 7 6.18966246 0.81033754348754883 0.65664693438543509 +4667 7 6.18966246 0.81033754348754883 0.65664693438543509 +4668 7 6.281588 0.71841192245483398 0.5161156903252504 +4669 5 6.191474 1.1914739608764648 1.4196101994466517 +4673 7 6.867097 0.13290309906005859 0.017663233739767747 +4674 7 7.240729 0.24072885513305664 0.057950381693672171 +4678 6 5.62289524 0.37710475921630859 0.14220799942359008 +4679 5 5.20689535 0.20689535140991211 0.042805686435031021 +4682 6 5.69725657 0.30274343490600586 0.091653587378687007 +4684 6 6.23112869 0.23112869262695313 0.053420472555444576 +4685 5 5.61776447 0.61776447296142578 0.38163294405330817 +4686 4 4.58701658 0.58701658248901367 0.34458846811708099 +4688 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4692 5 5.97440958 0.97440958023071289 0.9494740300453941 +4693 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4694 7 6.101005 0.89899492263793945 0.80819187092879474 +4695 7 7.00340128 0.0034012794494628906 1.1568701893338584E-05 +4698 6 5.45968676 0.5403132438659668 0.29193840149696371 +4699 5 5.73117447 0.73117446899414063 0.53461610410886351 +4700 5 5.73117447 0.73117446899414063 0.53461610410886351 +4702 6 5.335329 0.66467094421386719 0.44178746408215375 +4703 7 6.74484062 0.25515937805175781 0.065106308207759866 +4704 6 5.266865 0.73313522338867188 0.53748725577315781 +4705 6 5.828863 0.17113685607910156 0.029287823508639121 +4709 6 6.635482 0.63548183441162109 0.40383716186715901 +4710 7 6.614615 0.38538503646850586 0.14852162633383159 +4711 6 6.165267 0.16526699066162109 0.027313178202348354 +4714 7 6.478859 0.52114105224609375 0.27158799633616582 +4717 6 5.71084 0.28915977478027344 0.083613375350978458 +4720 5 6.142657 1.1426568031311035 1.3056645697417935 +4721 6 6.462371 0.46237087249755859 0.21378682373415359 +4724 6 6.462371 0.46237087249755859 0.21378682373415359 +4726 6 7.20805073 1.2080507278442383 1.4593865610449939 +4728 6 6.28587675 0.28587675094604492 0.081725516731466996 +4731 6 7.07015753 1.070157527923584 1.1452371345715164 +4732 6 7.07015753 1.070157527923584 1.1452371345715164 +4736 6 5.969431 0.030569076538085938 0.00093446844039135613 +4739 6 6.319568 0.31956815719604492 0.10212380709367608 +4740 5 5.16463041 0.16463041305541992 0.027103172902798178 +4741 6 6.012568 0.012567996978759766 0.0001579545480581146 +4742 6 6.012427 0.012426853179931641 0.00015442667995557713 +4744 5 5.40579844 0.40579843521118164 0.16467237001984358 +4745 3 5.750404 2.750403881072998 7.5647215090214104 +4747 6 6.406887 0.40688705444335938 0.1655570750735933 +4749 6 4.94821072 1.0517892837524414 1.1062606974164737 +4750 5 5.616849 0.61684894561767578 0.38050262170963833 +4751 6 5.60638952 0.39361047744750977 0.15492920795645659 +4753 6 6.76105976 0.76105976104736328 0.5792119598854697 +4755 6 6.18791866 0.18791866302490234 0.035313423913066799 +4760 6 5.879002 0.12099790573120117 0.014640493191336645 +4761 6 6.61741972 0.61741971969604492 0.38120711026954268 +4763 7 7.51052475 0.51052474975585938 0.26063552011328284 +4765 8 6.80642462 1.193575382232666 1.4246221930718548 +4767 7 5.490513 1.5094871520996094 2.2785514623537892 +4768 6 5.81628227 0.18371772766113281 0.033752203456970165 +4769 6 5.81628227 0.18371772766113281 0.033752203456970165 +4777 6 6.61448669 0.6144866943359375 0.37759389751590788 +4778 6 5.598406 0.40159416198730469 0.16127787094228552 +4779 4 4.22890425 0.22890424728393555 0.052397154424625114 +4780 5 5.38402939 0.38402938842773438 0.14747857117617968 +4781 5 5.58836842 0.58836841583251953 0.34617739274926862 +4782 6 5.827879 0.17212104797363281 0.029625655155541608 +4786 8 7.105712 0.89428806304931641 0.79975113971249812 +4787 8 6.78330564 1.2166943550109863 1.4803451535156 +4788 5 5.76242447 0.76242446899414063 0.5812910709209973 +4790 6 6.38086653 0.38086652755737305 0.1450593118136112 +4792 6 6.63710833 0.63710832595825195 0.40590701900532622 +4795 7 6.71729469 0.28270530700683594 0.079922290609829361 +4798 5 5.69227552 0.6922755241394043 0.47924540132248694 +4799 6 5.45217276 0.54782724380493164 0.30011468905490801 +4805 6 5.90260267 0.097397327423095703 0.0094862393891617103 +4806 6 5.250485 0.74951505661010742 0.56177282008525253 +4809 6 6.050518 0.050518035888671875 0.0025520719500491396 +4810 5 5.885007 0.88500690460205078 0.78323722119330341 +4814 6 6.350416 0.35041618347167969 0.12279150163885788 +4818 6 6.8706255 0.87062549591064453 0.75798875412965572 +4819 6 6.350416 0.35041618347167969 0.12279150163885788 +4820 5 5.317319 0.31731891632080078 0.10069129465500737 +4821 6 5.720231 0.27976894378662109 0.078270661907481553 +4823 7 6.112958 0.88704204559326172 0.7868435906502782 +4824 5 5.68046 0.68045997619628906 0.46302577920505428 +4825 6 5.996681 0.00331878662109375 1.101434463635087E-05 +4827 6 6.57971 0.57971000671386719 0.33606369188419194 +4831 6 5.615018 0.38498210906982422 0.14821122430385003 +4833 6 6.23332357 0.23332357406616211 0.054439890215007836 +4838 6 6.469409 0.46940898895263672 0.22034479890953662 +4840 7 6.805491 0.19450902938842773 0.037833762513628244 +4842 6 6.237228 0.2372279167175293 0.056277084470139016 +4843 5 6.383863 1.3838629722595215 1.9150767259909571 +4847 7 6.12764263 0.87235736846923828 0.76100737832257437 +4848 6 6.16121864 0.16121864318847656 0.02599145091153332 +4855 6 5.96981859 0.030181407928466797 0.00091091738454451843 +4857 6 5.92357826 0.076421737670898438 0.0058402819886396173 +4858 5 5.098244 0.098244190216064453 0.0096519209112102544 +4861 6 6.082398 0.082397937774658203 0.0067894201495164452 +4863 7 7.10627174 0.10627174377441406 0.011293683524854714 +4864 5 5.585732 0.58573198318481445 0.34308195612561576 +4865 6 6.84959269 0.84959268569946289 0.72180773159402634 +4868 6 6.06707 0.06707000732421875 0.0044983858824707568 +4870 7 6.40111876 0.59888124465942383 0.35865874520482066 +4873 6 6.464158 0.46415805816650391 0.21544270296089962 +4874 6 5.7968936 0.20310640335083008 0.04125221108211008 +4875 6 5.778002 0.22199821472167969 0.049283207339613 +4877 5 4.3623414 0.63765859603881836 0.40660848510219694 +4884 5 5.72053432 0.72053432464599609 0.51916971299306169 +4885 6 5.674971 0.32502889633178711 0.10564378345065961 +4890 6 6.390395 0.39039516448974609 0.15240838445697591 +4891 6 5.462591 0.53740882873535156 0.28880824920270243 +4892 5 6.01234436 1.0123443603515625 1.0248411039356142 +4893 6 6.095607 0.095606803894042969 0.0091406609508339898 +4895 6 5.20881939 0.79118061065673828 0.62596675867916929 +4897 6 5.75556135 0.24443864822387695 0.059750252745516264 +0 6 5.58289576 0.41710424423217773 0.17397595055649617 +1 6 5.33015347 0.66984653472900391 0.44869438008845464 +2 6 5.70412 0.29587984085083008 0.087544880221912535 +3 6 5.96136 0.038640022277832031 0.0014930513216313557 +4 6 5.96136 0.038640022277832031 0.0014930513216313557 +7 6 5.58289576 0.41710424423217773 0.17397595055649617 +12 5 6.31212759 1.3121275901794434 1.7216788129101133 +13 7 6.37878036 0.62121963500976563 0.38591383492166642 +14 5 5.109386 0.10938596725463867 0.011965289832232884 +15 7 6.31677771 0.68322229385375977 0.46679270281879326 +16 6 5.103471 0.89652919769287109 0.80376460231582314 +17 8 6.87536 1.1246399879455566 1.2648151024861818 +19 5 5.5723834 0.57238340377807617 0.32762276092057618 +22 8 6.29127455 1.7087254524230957 2.9197426717585131 +23 5 5.02370834 0.023708343505859375 0.0005620855517918244 +24 6 5.29549646 0.70450353622436523 0.4963252325526355 +26 6 6.15262365 0.15262365341186523 0.023293979580785162 +27 6 5.88923931 0.11076068878173828 0.012267930179405084 +29 7 6.59755468 0.40244531631469727 0.16196223262363674 +30 6 5.72036743 0.279632568359375 0.078194373287260532 +33 6 6.059624 0.059624195098876953 0.0035550446411889425 +34 5 5.379803 0.37980318069458008 0.14425045606571985 +36 5 5.22603941 0.22603940963745117 0.051093814709247454 +38 5 5.35056067 0.35056066513061523 0.12289277993681935 +39 5 5.35056067 0.35056066513061523 0.12289277993681935 +42 6 5.401128 0.59887218475341797 0.35864789367133199 +43 6 5.739065 0.26093482971191406 0.06808698535678559 +47 5 4.90973663 0.09026336669921875 0.0081474753678776324 +49 5 6.105748 1.105748176574707 1.2226790299982895 +53 6 6.438474 0.43847417831420898 0.19225960504832074 +55 6 5.841298 0.15870189666748047 0.025186292005855648 +57 6 5.543428 0.45657205581665039 0.20845804215264252 +58 6 5.454844 0.54515600204467773 0.29719506656533667 +59 6 6.401974 0.40197420120239258 0.16158325843230159 +61 6 5.543428 0.45657205581665039 0.20845804215264252 +62 5 5.132821 0.13282108306884766 0.01764144010758173 +65 5 5.030684 0.030683994293212891 0.00094150750578592124 +67 5 5.35860634 0.35860633850097656 0.12859850601307699 +75 5 5.270853 0.27085304260253906 0.07336137068705284 +78 5 5.718807 0.71880722045898438 0.51668382018397097 +80 6 6.57747 0.57746982574462891 0.33347139964553207 +81 6 6.31010628 0.31010627746582031 0.096165903323708335 +83 6 5.57204151 0.42795848846435547 0.18314846784869587 +84 5 5.23093128 0.23093128204345703 0.0533292570262347 +85 6 5.24266 0.7573399543762207 0.57356380649457606 +86 6 5.35685825 0.64314174652099609 0.41363130611807719 +87 6 5.65553427 0.34446573257446289 0.11865664091806138 +89 6 5.24266 0.7573399543762207 0.57356380649457606 +94 7 5.96693134 1.0330686569213867 1.0672308499133578 +101 5 5.630641 0.63064098358154297 0.39770805017269595 +103 5 5.20167637 0.20167636871337891 0.040673357697414758 +107 6 6.142988 0.14298820495605469 0.020445626756554702 +110 6 5.58482647 0.41517353057861328 0.17236906049311074 +114 5 5.187309 0.18730878829956055 0.03508458217424959 +116 6 6.17693758 0.17693758010864258 0.03130690725470231 +118 5 5.14454842 0.14454841613769531 0.020894244607916335 +119 5 5.04438543 0.044385433197021484 0.0019700666800872568 +124 6 5.616926 0.38307380676269531 0.14674554142766283 +126 5 5.909863 0.90986299514770508 0.82785066993915279 +127 7 6.253766 0.74623394012451172 0.55686509339375334 +130 5 4.510829 0.48917102813720703 0.23928829476881219 +134 5 5.024521 0.0245208740234375 0.00060127326287329197 +135 5 5.717012 0.71701192855834961 0.51410610569496384 +136 6 5.90298939 0.097010612487792969 0.0094110589352567331 +139 6 5.826573 0.17342710494995117 0.030076960731321378 +140 5 5.57194567 0.5719456672668457 0.32712184630531738 +142 6 6.106359 0.10635900497436523 0.011312237939137049 +143 6 5.740864 0.25913619995117188 0.06715157012513373 +146 6 5.35438347 0.64561653137207031 0.41682070558090345 +148 7 6.588247 0.41175317764282227 0.16954067929896155 +149 6 5.54737234 0.45262765884399414 0.20487179755059515 +153 5 6.004873 1.0048727989196777 1.0097693420086671 +155 6 6.044978 0.044978141784667969 0.0020230332384016947 +157 7 6.268512 0.73148822784423828 0.53507502747470426 +158 8 6.197546 1.8024539947509766 3.2488404031937534 +159 8 6.197546 1.8024539947509766 3.2488404031937534 +160 7 6.268512 0.73148822784423828 0.53507502747470426 +162 5 5.403021 0.40302085876464844 0.1624258125993947 +163 6 6.044978 0.044978141784667969 0.0020230332384016947 +165 5 5.61569548 0.61569547653198242 0.37908091982194492 +166 6 5.592527 0.40747308731079102 0.16603431688258752 +168 5 5.02263451 0.022634506225585938 0.00051232087207608856 +170 6 6.00712061 0.0071206092834472656 5.0703076567515382E-05 +172 4 4.794153 0.79415321350097656 0.63067932651392766 +175 6 6.07389736 0.073897361755371094 0.0054608200744041824 +178 4 4.40795135 0.40795135498046875 0.16642430803040043 +182 5 5.4483614 0.44836139678955078 0.201027942131077 +184 5 5.538105 0.53810501098632813 0.28955700284859631 +185 5 5.6508255 0.65082550048828125 0.42357383208582178 +186 6 5.94136524 0.058634757995605469 0.0034380348452032194 +190 6 5.13912439 0.86087560653686523 0.7411068099302156 +193 5 6.05295324 1.0529532432556152 1.1087105324825188 +194 5 5.24736834 0.24736833572387695 0.061191093518800699 +195 6 5.170604 0.82939577102661133 0.68789734499682709 +197 5 5.028246 0.028245925903320313 0.00079783233013586141 +200 5 5.404038 0.4040379524230957 0.16324666699824775 +203 6 6.53488255 0.53488254547119141 0.28609933744974114 +208 5 5.381865 0.38186502456665039 0.14582089698728851 +213 6 5.96111059 0.038889408111572266 0.0015123860632684227 +214 7 6.242515 0.75748491287231445 0.57378339322917782 +215 5 5.28750134 0.28750133514404297 0.082657017709607317 +217 5 5.28750134 0.28750133514404297 0.082657017709607317 +220 5 5.716736 0.71673583984375 0.51371026411652565 +221 6 5.08587837 0.91412162780761719 0.8356183504256478 +222 7 6.242515 0.75748491287231445 0.57378339322917782 +224 6 5.92879 0.071209907531738281 0.0050708509306787164 +225 5 5.738681 0.73868083953857422 0.54564938270141283 +227 6 5.37215567 0.62784433364868164 0.39418850729475707 +229 5 5.738681 0.73868083953857422 0.54564938270141283 +230 4 4.821786 0.82178592681884766 0.67533210951751244 +231 6 5.877407 0.12259292602539063 0.015029025511466898 +232 6 5.765742 0.23425817489624023 0.054876892505717478 +234 6 6.02762 0.027619838714599609 0.0007628554906204954 +235 6 6.02762 0.027619838714599609 0.0007628554906204954 +236 6 6.02762 0.027619838714599609 0.0007628554906204954 +238 7 6.67725468 0.32274532318115234 0.10416454363530647 +243 6 5.970998 0.029002189636230469 0.00084112700369587401 +245 6 5.6585145 0.34148550033569336 0.11661234693951883 +251 3 5.30328751 2.3032875061035156 5.3051333357725525 +253 3 5.191571 2.1915712356567383 4.8029844809580027 +255 8 5.873038 2.1269621849060059 4.5239681360201303 +256 7 6.39684772 0.60315227508544922 0.36379266694075341 +261 5 5.67542458 0.67542457580566406 0.45619835760226124 +263 6 5.66006374 0.33993625640869141 0.11555665842115559 +264 6 5.546553 0.45344686508178711 0.20561405945250044 +265 5 5.67542458 0.67542457580566406 0.45619835760226124 +266 6 5.002925 0.99707508087158203 0.99415871689507185 +270 6 5.002925 0.99707508087158203 0.99415871689507185 +273 5 5.215361 0.21536111831665039 0.046380411282598288 +274 5 5.734063 0.73406314849853516 0.53884870598358248 +281 8 6.663667 1.3363327980041504 1.7857853470216014 +282 4 5.0554595 1.0554594993591309 1.1139947547874272 +286 6 5.21452475 0.78547525405883789 0.61697137473879593 +287 7 6.53254032 0.46745967864990234 0.21851855116346997 +289 7 6.53254032 0.46745967864990234 0.21851855116346997 +292 5 5.402362 0.40236186981201172 0.16189507427861827 +294 3 4.562488 1.5624880790710449 2.4413689972391239 +295 6 5.045992 0.95400810241699219 0.91013145947727025 +298 6 5.77189255 0.22810745239257813 0.052033009837032296 +302 6 6.09933758 0.099337577819824219 0.0098679543671096326 +305 6 5.46788454 0.53211545944213867 0.28314686217731833 +306 5 5.295121 0.29512119293212891 0.087096518517682853 +307 6 5.46788454 0.53211545944213867 0.28314686217731833 +310 7 6.4347477 0.56525230407714844 0.31951016726452508 +313 6 5.421862 0.57813787460327148 0.33424340205078806 +315 6 5.478924 0.52107620239257813 0.27152040869987104 +318 7 6.748587 0.25141286849975586 0.063208430447275532 +320 7 5.75241947 1.2475805282592773 1.5564571744916975 +322 6 6.058367 0.058366775512695313 0.0034066804837493692 +324 5 4.546028 0.45397186279296875 0.20609045220771804 +325 5 4.917919 0.082080841064453125 0.0067372644698480144 +326 6 5.749149 0.25085115432739258 0.062926301627385328 +330 8 6.98020029 1.0197997093200684 1.0399914471292959 +334 5 6.214921 1.2149209976196289 1.4760330304570743 +335 6 6.24653053 0.24653053283691406 0.060777303620852763 +337 6 5.20219231 0.79780769348144531 0.6364971157781838 +339 7 6.743009 0.25699090957641602 0.066044327604913633 +340 7 5.70599937 1.2940006256103516 1.6744376190799812 +341 6 5.213163 0.78683710098266602 0.61911262348280616 +342 6 5.38700151 0.61299848556518555 0.37576714330521099 +345 6 5.97763968 0.022360324859619141 0.00049998412782770174 +351 7 6.794541 0.2054591178894043 0.042213449123892133 +356 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +357 6 5.097309 0.90269088745117188 0.81485083828738425 +359 6 5.955685 0.044314861297607422 0.0019638069318261842 +362 6 6.04658127 0.046581268310546875 0.0021698145574191585 +363 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +364 7 6.6094327 0.39056730270385742 0.15254281794136659 +365 7 6.87111664 0.12888336181640625 0.016610920953098685 +367 6 5.37173843 0.62826156616210938 0.39471259551646654 +369 5 5.892208 0.89220809936523438 0.79603529257292394 +372 5 4.765526 0.23447418212890625 0.054978142085019499 +374 7 6.53566933 0.46433067321777344 0.2156029740908707 +375 7 6.53566933 0.46433067321777344 0.2156029740908707 +380 7 5.85971642 1.1402835845947266 1.3002466532961989 +382 6 5.252193 0.74780702590942383 0.55921534799949768 +385 7 6.53566933 0.46433067321777344 0.2156029740908707 +386 7 6.42074728 0.57925271987915039 0.33553371348739347 +390 7 5.82244158 1.177558422088623 1.3866438374318477 +393 6 6.1026063 0.10260629653930664 0.01052805208951213 +394 5 5.14353275 0.14353275299072266 0.020601651181095804 +397 6 6.52884865 0.52884864807128906 0.27968089256683015 +400 6 6.52884865 0.52884864807128906 0.27968089256683015 +401 5 5.14353275 0.14353275299072266 0.020601651181095804 +402 5 4.94096375 0.0590362548828125 0.0034852793905884027 +403 5 5.666886 0.6668858528137207 0.44473674068308355 +405 5 5.10803747 0.10803747177124023 0.011672095306721531 +407 5 5.069229 0.0692291259765625 0.0047926718834787607 +408 6 6.01091671 0.010916709899902344 0.00011917455503862584 +410 6 5.872228 0.12777185440063477 0.01632564677697701 +411 6 5.823905 0.17609500885009766 0.031009452141915972 +412 5 5.69728041 0.6972804069519043 0.48619996591901327 +417 5 5.06454945 0.064549446105957031 0.0041666309925858513 +420 7 6.685552 0.31444787979125977 0.098877469105218552 +421 6 5.986877 0.013123035430908203 0.00017221405892087205 +424 7 5.922215 1.0777850151062012 1.1616205387874743 +425 6 5.986877 0.013123035430908203 0.00017221405892087205 +426 6 5.986877 0.013123035430908203 0.00017221405892087205 +427 5 5.250166 0.25016593933105469 0.062582997201388935 +431 5 4.95284557 0.047154426574707031 0.0022235399455894367 +432 7 6.270196 0.72980403900146484 0.53261393534285162 +433 4 5.13603973 1.1360397338867188 1.2905862769694068 +435 7 6.93598032 0.064019680023193359 0.0040985194302720629 +437 8 6.529011 1.4709892272949219 2.1638093068177113 +438 7 6.270196 0.72980403900146484 0.53261393534285162 +443 6 5.58504343 0.41495656967163086 0.17218895471364704 +444 6 5.70104074 0.29895925521850586 0.089376636280803723 +445 3 5.536319 2.5363187789916992 6.432912948665944 +446 5 6.67247 1.6724700927734375 2.7971562112215906 +447 6 5.70106936 0.29893064498901367 0.089359530513547725 +448 6 5.70106936 0.29893064498901367 0.089359530513547725 +458 6 5.050184 0.94981622695922852 0.90215086499506469 +459 5 4.837731 0.16226911544799805 0.026331265828275718 +460 5 5.73105049 0.73105049133300781 0.53443482087823213 +461 5 5.95119953 0.95119953155517578 0.90478054883078585 +462 5 5.154207 0.15420722961425781 0.023779869665304432 +463 6 5.12796068 0.8720393180847168 0.76045257228565788 +468 5 5.164256 0.16425609588623047 0.026980065035786538 +469 5 5.38181925 0.38181924819946289 0.14578593829560305 +470 6 5.00187445 0.99812555313110352 0.99625461981327135 +471 5 5.26753426 0.26753425598144531 0.071574578123545507 +472 6 6.08648539 0.086485385894775391 0.0074797219733682141 +473 7 6.078559 0.92144107818603516 0.84905366056864295 +475 5 6.01866531 1.0186653137207031 1.0376790213776985 +476 7 6.40013742 0.59986257553100586 0.35983510952269171 +477 6 6.20083 0.20082998275756836 0.040332681974405205 +478 6 5.15129375 0.84870624542236328 0.72030229101892473 +479 6 6.16166544 0.16166543960571289 0.026135714362908402 +481 6 6.04767036 0.047670364379882813 0.0022724636401108 +485 6 6.47117424 0.47117424011230469 0.22200516454540775 +486 6 5.911162 0.088838100433349609 0.0078922080886059121 +488 6 5.887391 0.11260890960693359 0.012680766522862541 +490 6 6.33496237 0.33496236801147461 0.11219978798385455 +491 7 6.21005774 0.78994226455688477 0.62400878133325932 +494 6 6.653475 0.65347480773925781 0.42702932434985996 +496 4 5.23894358 1.2389435768127441 1.534981186525556 +498 5 5.103715 0.10371494293212891 0.010756789387414756 +499 4 5.23894358 1.2389435768127441 1.534981186525556 +500 6 5.311577 0.68842315673828125 0.47392644273350015 +503 5 5.137176 0.1371760368347168 0.018817265081679579 +505 6 6.13015556 0.13015556335449219 0.01694047067212523 +506 5 4.47576427 0.52423572540283203 0.27482309578863351 +508 6 6.28651571 0.28651571273803711 0.0820912536457854 +509 7 5.931798 1.068202018737793 1.1410555528354962 +511 6 5.925795 0.074204921722412109 0.0055063704078293085 +512 6 6.149516 0.14951610565185547 0.022355065849296807 +515 6 5.6218214 0.37817859649658203 0.14301905084812461 +516 5 6.00719738 1.007197380065918 1.0144465624116492 +518 6 6.805467 0.80546712875366211 0.64877729550266849 +524 5 4.9252224 0.074777603149414063 0.0055916899327712599 +525 6 5.24856 0.75144004821777344 0.56466214606552967 +526 4 6.14279747 2.1427974700927734 4.5915809978359903 +530 6 6.371907 0.37190723419189453 0.13831499084426468 +536 5 5.10018253 0.10018253326416016 0.010036539971224556 +537 6 5.88101053 0.11898946762084961 0.014158493404693218 +542 6 4.932093 1.0679068565368652 1.1404250542384489 +543 6 6.03408527 0.034085273742675781 0.0011618058861131431 +545 6 6.42284536 0.42284536361694336 0.17879820153234505 +550 7 5.2345643 1.7654356956481934 3.1167631954688204 +551 7 5.86865425 1.1313457489013672 1.2799432035571954 +552 7 6.50745964 0.49254035949707031 0.24259600573350326 +553 7 5.2345643 1.7654356956481934 3.1167631954688204 +554 7 6.50745964 0.49254035949707031 0.24259600573350326 +555 7 5.86865425 1.1313457489013672 1.2799432035571954 +556 5 4.872683 0.12731695175170898 0.016209606203346993 +562 6 5.048077 0.95192289352416992 0.90615719521542815 +564 5 5.479501 0.47950077056884766 0.22992098897611868 +567 5 5.58539 0.58539009094238281 0.34268155857353122 +568 6 5.553329 0.4466710090637207 0.19951499033800246 +570 5 5.11044836 0.11044836044311523 0.012198840324572302 +571 7 6.777907 0.22209310531616211 0.049325347428975874 +572 5 5.358643 0.3586430549621582 0.12862484087258963 +573 7 6.902201 0.097798824310302734 0.0095646100364774611 +574 7 6.177025 0.82297515869140625 0.6772881118231453 +575 6 5.791957 0.20804309844970703 0.043281930812554492 +576 6 5.791957 0.20804309844970703 0.043281930812554492 +579 7 6.542046 0.45795392990112305 0.20972180191188272 +580 5 5.11044836 0.11044836044311523 0.012198840324572302 +583 6 5.35542774 0.64457225799560547 0.41547339577755338 +585 6 5.35542774 0.64457225799560547 0.41547339577755338 +587 7 6.5687685 0.43123149871826172 0.18596060548679816 +588 7 7.028516 0.028515815734863281 0.0008131517470246763 +589 6 5.828428 0.17157220840454102 0.029437022696811255 +591 6 6.46318531 0.46318531036376953 0.21454063173678151 +592 5 5.396524 0.39652395248413086 0.15723124489363727 +595 7 5.208214 1.7917861938476563 3.2104977644630708 +596 5 5.396524 0.39652395248413086 0.15723124489363727 +597 6 6.225943 0.22594308853149414 0.051050279255150599 +598 8 6.305187 1.6948127746582031 2.8723903411446372 +599 7 5.93457365 1.0654263496398926 1.1351333065069866 +601 6 6.00369453 0.0036945343017578125 1.3649583706865087E-05 +603 5 4.94606066 0.053939342498779297 0.0029094526692006184 +605 6 5.596465 0.40353488922119141 0.16284040681875922 +608 5 5.19934368 0.19934368133544922 0.039737903288369125 +610 8 7.12691069 0.87308931350708008 0.76228494936026436 +611 6 5.7924037 0.2075963020324707 0.0430962246175568 +615 5 5.39173031 0.39173030853271484 0.15345263462313596 +616 7 6.271933 0.72806692123413086 0.53008144179534611 +620 5 5.06031942 0.060319423675537109 0.0036384328725489468 +623 5 5.17006063 0.17006063461303711 0.028920619444988915 +625 8 6.47763872 1.5223612785339355 2.3175838623794789 +626 4 4.67777538 0.67777538299560547 0.45937946979483968 +628 6 5.57972527 0.42027473449707031 0.17663085245658294 +630 5 6.085581 1.0855808258056641 1.1784857293569075 +631 5 6.085581 1.0855808258056641 1.1784857293569075 +632 6 6.34318829 0.34318828582763672 0.11777819952931168 +635 6 5.886408 0.11359214782714844 0.012903176047984743 +636 7 6.597964 0.40203619003295898 0.16163309809621751 +637 5 5.137594 0.13759422302246094 0.018932170209154719 +640 7 6.2694006 0.73059940338134766 0.53377548822118115 +643 5 5.46275139 0.46275138854980469 0.21413884760477231 +646 4 4.810526 0.81052589416503906 0.6569522251120361 +647 6 5.254026 0.74597406387329102 0.55647730397163286 +648 5 5.21467161 0.21467161178588867 0.046083900906751296 +650 7 6.55360842 0.44639158248901367 0.1992654449170459 +651 7 6.55360842 0.44639158248901367 0.1992654449170459 +655 6 6.979067 0.97906684875488281 0.95857189433081658 +658 5 5.783849 0.78384876251220703 0.61441888249191834 +659 4 4.837211 0.83721113204956055 0.70092247962770671 +662 4 4.75797558 0.75797557830810547 0.57452697731150693 +663 5 5.03337 0.033370018005371094 0.001113558101678791 +664 6 5.933576 0.066423892974853516 0.0044121335579347942 +666 6 6.59370661 0.59370660781860352 0.35248753616747308 +667 6 5.933576 0.066423892974853516 0.0044121335579347942 +669 5 5.512285 0.51228523254394531 0.26243615948260413 +671 6 6.38181257 0.38181257247924805 0.14578084050322104 +672 8 6.718115 1.2818851470947266 1.6432295303420688 +673 6 6.24267769 0.24267768859863281 0.058892460543574998 +674 5 5.43839359 0.43839359283447266 0.1921889422383174 +675 6 4.94588137 1.0541186332702637 1.1111660930075686 +676 6 4.91327667 1.0867233276367188 1.1809675908298232 +677 7 6.845388 0.15461206436157227 0.023904890446146965 +684 5 5.50572443 0.50572443008422852 0.25575719918401774 +686 7 6.338226 0.6617741584777832 0.43794503682897812 +687 4 4.83409 0.83409023284912109 0.69570651653430104 +690 4 6.03202963 2.0320296287536621 4.1291444121327459 +695 5 5.266163 0.26616287231445313 0.070842674598679878 +699 5 5.75083971 0.7508397102355957 0.56376027046667332 +701 7 7.302115 0.30211496353149414 0.091273451189636035 +703 6 5.64697838 0.35302162170410156 0.12462426539059379 +708 6 6.142319 0.1423192024230957 0.02025475537834609 +709 5 5.07981443 0.079814434051513672 0.0063703438829634251 +710 5 5.186609 0.18660879135131836 0.03482284100959987 +713 5 5.75211859 0.75211858749389648 0.56568236965381402 +715 7 6.74210548 0.25789451599121094 0.066509581378340954 +716 6 5.201803 0.79819679260253906 0.63711811972098076 +717 5 5.72647953 0.72647953033447266 0.52777250799499598 +730 6 6.32876348 0.32876348495483398 0.10808542903964735 +731 6 5.886897 0.11310291290283203 0.012792268907105608 +733 6 5.84083 0.15917015075683594 0.02533513689195388 +734 5 5.29676867 0.2967686653137207 0.088071640712087174 +736 6 5.84083 0.15917015075683594 0.02533513689195388 +737 5 5.29676867 0.2967686653137207 0.088071640712087174 +739 6 5.71197033 0.28802967071533203 0.082961091212382598 +740 3 5.478546 2.478546142578125 6.1431909808889031 +741 6 6.318698 0.31869792938232422 0.10156837019258091 +742 6 6.342546 0.34254598617553711 0.11733775264497126 +743 5 5.46122837 0.46122837066650391 0.21273160990767792 +744 5 5.2266674 0.22666740417480469 0.051378112115344265 +745 6 7.068423 1.068422794342041 1.1415272674696553 +746 6 5.776893 0.22310686111450195 0.049776671476365664 +747 6 6.22603226 0.22603225708007813 0.051090581240714528 +748 6 6.02232647 0.022326469421386719 0.0004984712368241162 +750 6 6.22603226 0.22603225708007813 0.051090581240714528 +751 6 5.94263268 0.057367324829101563 0.0032910099580476526 +753 6 5.776893 0.22310686111450195 0.049776671476365664 +754 5 4.951338 0.048662185668945313 0.0023680083140789066 +755 7 6.66953325 0.33046674728393555 0.10920827106042452 +756 5 5.26670647 0.26670646667480469 0.071132339366158703 +759 7 6.447287 0.55271291732788086 0.30549156898109686 +762 5 5.25446272 0.25446271896362305 0.064751275342359804 +763 6 5.75677967 0.24322032928466797 0.059156128577342315 +766 5 5.064814 0.064814090728759766 0.0042008663569959026 +767 6 5.377497 0.62250280380249023 0.38750974074196165 +768 7 5.636545 1.3634548187255859 1.8590090427060204 +769 7 5.636545 1.3634548187255859 1.8590090427060204 +771 7 5.73526955 1.2647304534912109 1.5995431199880841 +772 7 5.55488348 1.4451165199279785 2.0883617561687515 +775 6 6.36388731 0.36388731002807617 0.13241397439946923 +776 6 5.966575 0.033424854278564453 0.0011172208835432684 +777 5 5.746976 0.74697589874267578 0.55797299330242822 +787 6 5.64129162 0.35870838165283203 0.1286717030679938 +789 6 5.627616 0.37238407135009766 0.13866989659527462 +790 6 5.64129162 0.35870838165283203 0.1286717030679938 +791 7 6.673766 0.32623386383056641 0.10642853390982054 +793 7 6.673766 0.32623386383056641 0.10642853390982054 +796 6 5.34205 0.65794992446899414 0.43289810310875509 +797 6 5.96610975 0.033890247344970703 0.0011485488651032938 +798 6 5.429145 0.57085514068603516 0.32587559164767299 +800 6 5.14655 0.85344982147216797 0.72837659777087538 +801 5 5.268791 0.26879119873046875 0.072248708514962345 +803 7 5.87979031 1.1202096939086914 1.2548697583270041 +804 6 5.493222 0.50677776336669922 0.25682370144295419 +805 6 5.14655 0.85344982147216797 0.72837659777087538 +807 6 5.285724 0.71427583694458008 0.51018997124288035 +808 6 5.1317997 0.86820030212402344 0.75377176460824558 +809 6 5.285931 0.71406888961791992 0.50989437912016911 +811 6 5.13246775 0.86753225326538086 0.75261221045570892 +812 7 4.98973751 2.0102624893188477 4.0411552759624101 +813 6 5.52920055 0.47079944610595703 0.22165211845367594 +814 6 4.9766 1.023399829864502 1.0473472117666915 +815 5 5.0497756 0.049775600433349609 0.0024776103985004738 +818 5 5.0497756 0.049775600433349609 0.0024776103985004738 +820 9 6.84990168 2.1500983238220215 4.6229228021022664 +822 5 6.04735231 1.0473523139953613 1.0969468696314379 +823 6 6.01296329 0.012963294982910156 0.00016804701681394363 +824 5 5.36770439 0.36770439147949219 0.13520651951330365 +825 6 5.936046 0.063953876495361328 0.0040900983187839302 +828 7 6.322937 0.67706298828125 0.45841429010033607 +830 6 5.498639 0.50136089324951172 0.25136274527994829 +831 4 6.24087048 2.240870475769043 5.021500489173377 +832 8 7.105262 0.89473819732666016 0.80055644175536145 +833 6 6.312468 0.31246805191040039 0.097636283464680673 +834 6 5.498639 0.50136089324951172 0.25136274527994829 +835 8 6.844221 1.1557788848876953 1.3358248307522445 +837 8 7.18123341 0.81876659393310547 0.67037873534081882 +839 7 6.57121944 0.42878055572509766 0.18385276496792358 +842 7 6.47577953 0.52422046661376953 0.27480709761675826 +843 7 6.238966 0.76103401184082031 0.57917276717853383 +844 8 6.69551563 1.3044843673706055 1.7016794647142888 +846 5 5.71414852 0.71414852142333984 0.51000811065114249 +847 5 5.787212 0.78721189498901367 0.61970256761219389 +849 6 6.185082 0.18508195877075195 0.034255331462418326 +852 7 6.56788826 0.43211174011230469 0.18672055594288395 +853 5 5.15344524 0.15344524383544922 0.023545442855720466 +857 5 5.152636 0.15263605117797852 0.023297764119206477 +865 6 6.67667437 0.67667436599731445 0.45788819759786747 +866 7 6.56788826 0.43211174011230469 0.18672055594288395 +867 8 6.099201 1.9007987976074219 3.6130360689858207 +868 7 5.922011 1.0779891014099121 1.1620605027585498 +869 6 6.14752531 0.14752531051635742 0.021763717242947678 +873 3 5.358975 2.3589749336242676 5.5647627374676176 +875 7 5.889844 1.1101560592651367 1.2324464759230978 +877 6 5.43060732 0.56939268112182617 0.32420802531510162 +878 6 5.736863 0.26313686370849609 0.069241009042343649 +879 8 6.83100033 1.1689996719360352 1.3665602329865578 +880 7 5.889844 1.1101560592651367 1.2324464759230978 +882 6 6.42099428 0.42099428176879883 0.17723618528202678 +883 6 6.42099428 0.42099428176879883 0.17723618528202678 +884 6 6.170308 0.17030811309814453 0.029004853387050389 +886 6 5.88422441 0.11577558517456055 0.013403986122511924 +889 7 7.024262 0.024261951446533203 0.00058864228799393459 +891 7 6.097072 0.90292787551879883 0.81527874838889147 +892 5 6.012046 1.0120458602905273 1.0242368233311936 +893 7 6.14825344 0.85174655914306641 0.72547220101205312 +894 7 6.097072 0.90292787551879883 0.81527874838889147 +897 6 5.666549 0.3334507942199707 0.11118943216592925 +899 6 6.04876375 0.048763751983642578 0.0023779035075222055 +901 6 5.33798742 0.66201257705688477 0.43826065218149779 +903 6 5.26283264 0.7371673583984375 0.5434157142881304 +905 4 5.24363136 1.2436313629150391 1.5466189668259176 +907 8 6.86781025 1.1321897506713867 1.2818536315253368 +909 5 6.248672 1.2486720085144043 1.5591817848473966 +911 5 5.25836658 0.25836658477783203 0.066753292129760666 +913 5 4.977968 0.022031784057617188 0.00048539950876147486 +915 5 4.99300337 0.0069966316223144531 4.8952854058370576E-05 +916 7 6.15890551 0.8410944938659668 0.70743994761164686 +917 6 5.846199 0.15380096435546875 0.023654736636672169 +922 6 5.560354 0.43964576721191406 0.19328840062735253 +923 6 5.761621 0.23837900161743164 0.056824548412123477 +928 5 5.72981834 0.72981834411621094 0.53263481540852808 +929 5 5.295482 0.29548215866088867 0.087309706086898586 +931 5 5.389781 0.38978099822998047 0.15192922658116004 +932 6 5.69497633 0.3050236701965332 0.093039439380163458 +933 5 5.538747 0.53874683380126953 0.29024815093089273 +939 7 5.803188 1.1968121528625488 1.4323593292394889 +941 6 5.732951 0.26704883575439453 0.071315080677777587 +942 7 5.749693 1.2503070831298828 1.5632678021247557 +943 7 6.44949245 0.55050754547119141 0.30305855762071587 +945 7 6.4388504 0.56114959716796875 0.3148888704017736 +946 5 5.1143384 0.11433839797973633 0.013073269252572572 +947 5 5.71162844 0.71162843704223633 0.50641503240717611 +948 4 4.53004 0.53003978729248047 0.28094217611305794 +949 5 5.905949 0.90594911575317383 0.82074380033395755 +951 6 5.823733 0.17626714706420898 0.031070107134155478 +952 6 6.14641857 0.14641857147216797 0.02143839807195036 +954 6 5.823733 0.17626714706420898 0.031070107134155478 +957 7 6.496833 0.50316715240478516 0.25317718325914029 +961 7 7.02436543 0.024365425109863281 0.00059367394078435609 +962 6 5.981644 0.018355846405029297 0.00033693709724502696 +963 6 6.624413 0.62441301345825195 0.38989161137601513 +966 6 5.28590059 0.71409940719604492 0.50993796335774277 +967 6 5.76070356 0.23929643630981445 0.057262784430577085 +973 7 6.95576334 0.044236660003662109 0.001956882088279599 +975 5 5.028304 0.028304100036621094 0.0008011220788830542 +977 5 6.259195 1.2591948509216309 1.5855716725875482 +978 7 6.75888824 0.24111175537109375 0.058134878578130156 +979 5 5.79845238 0.79845237731933594 0.63752619884689921 +981 7 6.75888824 0.24111175537109375 0.058134878578130156 +984 5 6.57471 1.5747098922729492 2.4797112448222833 +987 6 5.45699358 0.54300642013549805 0.29485597230836902 +988 5 6.57471 1.5747098922729492 2.4797112448222833 +990 6 5.941643 0.058356761932373047 0.003405511663231664 +991 4 4.65947 0.6594700813293457 0.43490078816853384 +993 4 5.050729 1.0507287979125977 1.1040310067628525 +996 5 4.98931551 0.010684490203857422 0.00011415833091632521 +1000 7 5.531526 1.4684739112854004 2.156415628125842 +1001 5 5.625949 0.62594890594482422 0.3918120328535224 +1003 7 5.821002 1.1789979934692383 1.39003626860449 +1005 6 6.94355631 0.94355630874633789 0.89029850777501451 +1008 7 5.755313 1.2446870803833008 1.5492459280731055 +1009 6 5.539026 0.46097421646118164 0.21249722824200035 +1010 6 5.8711915 0.12880849838256836 0.016591629255572116 +1011 7 6.22115 0.77885007858276367 0.60660744490837715 +1012 6 5.37709761 0.62290239334106445 0.38800739163002618 +1013 5 5.706299 0.706298828125 0.49885803461074829 +1014 5 6.018917 1.0189170837402344 1.0381920235377038 +1019 6 5.86288 0.13711977005004883 0.018801831338578268 +1020 7 6.04661751 0.95338249206542969 0.9089381761768891 +1022 8 6.47417259 1.5258274078369141 2.3281492785063165 +1023 6 5.778368 0.22163200378417969 0.049120745101390639 +1024 6 6.23468876 0.23468875885009766 0.055078813530599291 +1028 7 6.22779942 0.77220058441162109 0.59629374256564915 +1029 4 5.16414261 1.1641426086425781 1.3552280132571468 +1031 6 5.641769 0.3582310676574707 0.12832949783501135 +1035 6 6.0397377 0.039737701416015625 0.0015790849138284102 +1036 5 6.4997263 1.4997262954711914 2.2491789613277433 +1038 7 6.298605 0.70139503479003906 0.49195499482812011 +1041 5 5.75377655 0.75377655029296875 0.56817908777156845 +1042 4 5.44314528 1.4431452751159668 2.0826682850895395 +1043 5 5.344182 0.34418201446533203 0.11846125908141403 +1046 5 5.74131536 0.74131536483764648 0.54954847014437291 +1048 5 4.73738956 0.26261043548583984 0.068964240826062451 +1050 5 5.55853367 0.55853366851806641 0.31195985886824928 +1055 5 5.41344547 0.41344547271728516 0.17093715891041938 +1056 6 6.15539265 0.15539264678955078 0.024146874676262087 +1057 5 5.06872654 0.068726539611816406 0.0047233372470145696 +1062 5 5.54800034 0.54800033569335938 0.30030436792003457 +1063 5 5.465916 0.46591615676879883 0.21707786513820793 +1066 6 5.303662 0.69633817672729492 0.48488685636789342 +1067 7 6.23767567 0.76232433319091797 0.58113838897497772 +1070 7 5.98001146 1.0199885368347168 1.0403766152742264 +1073 5 5.61771059 0.61771059036254883 0.3815663734460486 +1078 5 5.622996 0.62299585342407227 0.38812383338358813 +1081 6 5.522897 0.47710323333740234 0.22762749526100379 +1087 8 6.06489849 1.9351015090942383 3.7446178504987984 +1089 7 5.919071 1.0809288024902344 1.1684070760529721 +1093 7 5.85336637 1.1466336250305176 1.3147686700506256 +1096 6 6.022913 0.022912979125976563 0.00052500461242743768 +1097 7 6.048806 0.95119380950927734 0.90476966324877139 +1102 5 6.4617486 1.4617486000061035 2.1367089696198036 +1104 5 5.21519136 0.21519136428833008 0.046307323264272782 +1105 7 6.68964672 0.31035327911376953 0.096319157856669335 +1106 8 7.11303139 0.88696861267089844 0.78671331986333826 +1107 7 6.73190355 0.2680964469909668 0.07187570488918027 +1108 7 6.457533 0.54246711730957031 0.29427057336215512 +1109 4 5.380625 1.3806247711181641 1.9061247586250829 +1110 7 6.73190355 0.2680964469909668 0.07187570488918027 +1111 6 6.65884066 0.65884065628051758 0.43407101036814311 +1113 5 6.05984068 1.0598406791687012 1.1232622652207738 +1114 4 4.139369 0.13936901092529297 0.019423721206294431 +1115 8 5.95124435 2.0487556457519531 4.1973996960005024 +1116 5 4.5486455 0.4513545036315918 0.20372088794852061 +1117 5 5.65911961 0.65911960601806641 0.43443865503741108 +1118 5 4.5486455 0.4513545036315918 0.20372088794852061 +1120 6 6.233022 0.23302221298217773 0.054299351743111401 +1121 6 5.3402257 0.6597743034362793 0.43530213147482755 +1123 5 5.054469 0.054469108581542969 0.0029668837896679179 +1124 5 5.44738436 0.44738435745239258 0.20015276329309017 +1127 7 6.207802 0.79219818115234375 0.62757795822108164 +1128 5 5.9157033 0.91570329666137695 0.83851252751651373 +1131 6 5.68809128 0.31190872192382813 0.09728705081215594 +1132 5 5.68820238 0.6882023811340332 0.4736225173985531 +1139 5 6.475313 1.4753131866455078 2.176548998690123 +1142 5 5.302902 0.3029022216796875 0.091749755898490548 +1145 5 5.27104568 0.27104568481445313 0.073465763256535865 +1149 5 5.626558 0.62655782699584961 0.39257471056976101 +1150 5 5.44962835 0.44962835311889648 0.20216565592841107 +1152 4 4.617794 0.61779403686523438 0.38166947198624257 +1154 4 5.561507 1.5615072250366211 2.4383048138415688 +1156 6 5.28412676 0.71587324142456055 0.51247449778770715 +1157 6 5.28412676 0.71587324142456055 0.51247449778770715 +1160 6 6.12439537 0.12439537048339844 0.015474208197701955 +1161 6 5.28412676 0.71587324142456055 0.51247449778770715 +1162 7 5.895931 1.1040692329406738 1.2189688711262079 +1163 6 5.38675928 0.61324071884155273 0.37606417924530433 +1167 6 5.6267643 0.37323570251464844 0.13930488963160315 +1171 5 4.62260342 0.37739658355712891 0.14242818128059298 +1172 6 6.08686447 0.086864471435546875 0.007545436397776939 +1173 5 6.14243841 1.1424384117126465 1.3051655245565144 +1176 7 5.70132732 1.2986726760864258 1.6865507196134786 +1178 5 4.72919655 0.27080345153808594 0.073334509364940459 +1179 5 5.89185 0.89184999465942383 0.79539641297401431 +1180 5 4.62260342 0.37739658355712891 0.14242818128059298 +1183 6 6.31216526 0.31216526031494141 0.097447149747495132 +1185 5 5.091198 0.091197967529296875 0.0083170692814746872 +1188 6 5.85175133 0.14824867248535156 0.021977668893669033 +1189 5 4.64966965 0.35033035278320313 0.12273135608120356 +1190 6 6.08686447 0.086864471435546875 0.007545436397776939 +1192 6 5.676918 0.32308197021484375 0.10438195947790518 +1193 7 5.63304329 1.3669567108154297 1.8685706492433383 +1194 6 5.49325037 0.50674962997436523 0.25679518747915608 +1196 7 6.384342 0.61565780639648438 0.37903453457693104 +1197 7 5.63304329 1.3669567108154297 1.8685706492433383 +1203 6 5.79636669 0.20363330841064453 0.041466524294264673 +1205 5 4.809882 0.19011783599853516 0.03614479156476591 +1209 6 6.37570572 0.37570571899414063 0.14115478728490416 +1211 5 5.21409225 0.21409225463867188 0.045835493496269919 +1215 5 5.92623568 0.92623567581176758 0.85791252714648181 +1217 5 4.785647 0.21435308456420898 0.045947244862190928 +1219 8 6.444028 1.5559720993041992 2.4210491738131168 +1222 6 5.445072 0.55492782592773438 0.30794489198888186 +1223 5 5.92623568 0.92623567581176758 0.85791252714648181 +1224 7 6.926713 0.073287010192871094 0.0053709858630099916 +1225 6 6.43942976 0.43942975997924805 0.19309851395541955 +1226 7 6.926713 0.073287010192871094 0.0053709858630099916 +1227 5 5.9939723 0.9939723014831543 0.98798093611571858 +1228 6 5.81761837 0.18238162994384766 0.033263058940974588 +1230 6 5.57155275 0.42844724655151367 0.18356704307757354 +1235 5 5.28322 0.28321981430053711 0.080213463212430725 +1236 6 6.43942976 0.43942975997924805 0.19309851395541955 +1237 5 6.46537447 1.4653744697570801 2.1473223366158436 +1239 5 4.89298248 0.10701751708984375 0.011452748964074999 +1241 7 6.052218 0.94778203964233398 0.89829079466858275 +1242 7 6.815272 0.18472814559936523 0.034124487776580281 +1244 5 5.30364943 0.3036494255065918 0.092202973610483241 +1245 4 4.78280544 0.78280544281005859 0.61278436129305192 +1247 6 6.118482 0.11848211288452148 0.014038011073580492 +1250 7 5.700158 1.2998418807983398 1.6895889150773655 +1252 6 5.364317 0.63568305969238281 0.40409295237986953 +1256 6 5.792476 0.20752382278442383 0.043066137023060946 +1258 6 5.448007 0.55199289321899414 0.30469615416427587 +1262 6 5.792476 0.20752382278442383 0.043066137023060946 +1264 5 5.94851971 0.94851970672607422 0.89968963404771785 +1267 7 5.84828329 1.1517167091369629 1.3264513781052756 +1270 7 5.84828329 1.1517167091369629 1.3264513781052756 +1271 5 5.750962 0.7509617805480957 0.56394359584396625 +1272 5 5.325394 0.3253941535949707 0.10588135519378739 +1273 5 5.750962 0.7509617805480957 0.56394359584396625 +1275 6 5.57314968 0.42685031890869141 0.18220119475245156 +1276 7 5.84828329 1.1517167091369629 1.3264513781052756 +1278 6 5.582913 0.41708707809448242 0.17396163071339288 +1279 6 5.870985 0.12901496887207031 0.016644862193061272 +1283 8 7.097483 0.90251684188842773 0.81453664989226127 +1284 7 6.70399857 0.29600143432617188 0.087616849123151042 +1286 7 5.92860174 1.0713982582092285 1.1478942276937687 +1287 7 6.18289757 0.81710243225097656 0.66765638479046174 +1288 7 6.390159 0.60984086990356445 0.37190588660473622 +1289 6 6.822798 0.82279777526855469 0.67699617898688302 +1292 6 6.85950375 0.85950374603271484 0.73874668944426958 +1294 4 5.04547739 1.0454773902893066 1.0930229736061392 +1295 6 5.91815662 0.081843376159667969 0.0066983382212129072 +1298 6 6.40000439 0.40000438690185547 0.16000350954072928 +1299 5 5.940148 0.94014787673950195 0.88387803013779376 +1303 6 5.843109 0.156890869140625 0.024614744819700718 +1304 5 5.16638374 0.16638374328613281 0.027683550029905746 +1305 7 5.97077465 1.0292253494262695 1.0593048199016266 +1307 5 5.20232058 0.20232057571411133 0.040933615357289455 +1309 6 5.4209795 0.57902050018310547 0.33526473963229364 +1310 6 5.561529 0.43847084045410156 0.19225667792852619 +1311 6 5.60187 0.39812994003295898 0.15850744915064752 +1312 5 5.23645258 0.23645257949829102 0.055909822351395633 +1315 6 5.977113 0.022887229919433594 0.00052382529338501627 +1316 6 5.794509 0.20549106597900391 0.042226578197187337 +1317 5 6.033325 1.0333251953125 1.0677609592676163 +1318 6 6.41278648 0.41278648376464844 0.17039268117878237 +1319 5 5.517551 0.51755094528198242 0.26785898096227356 +1321 6 6.57573557 0.57573556900024414 0.33147144541203488 +1322 6 6.117485 0.11748504638671875 0.013802736124489456 +1326 6 5.27129364 0.72870635986328125 0.53101295890519395 +1329 5 5.212231 0.21223115921020508 0.045042064939707416 +1332 7 5.65819645 1.3418035507202148 1.8004367687253762 +1333 8 7.320398 0.67960214614868164 0.46185907704989404 +1335 6 5.220176 0.77982378005981445 0.60812512794677787 +1339 6 5.988458 0.011541843414306641 0.00013321414940037357 +1342 6 5.988458 0.011541843414306641 0.00013321414940037357 +1343 6 6.080612 0.0806121826171875 0.0064983239863067865 +1347 7 6.320307 0.67969322204589844 0.461982876095135 +1349 4 5.433452 1.4334521293640137 2.054785007178225 +1351 7 6.73481274 0.26518726348876953 0.070324284716662078 +1352 6 5.220176 0.77982378005981445 0.60812512794677787 +1353 5 5.60115767 0.60115766525268555 0.36139053849205993 +1357 6 5.43090153 0.56909847259521484 0.3238730715102065 +1358 8 6.70303535 1.2969646453857422 1.682117291380564 +1359 7 6.42182732 0.57817268371582031 0.33428365219515399 +1360 6 5.811853 0.18814706802368164 0.035399319205907886 +1362 7 6.01781368 0.98218631744384766 0.96468996217390668 +1364 5 5.5021925 0.50219249725341797 0.25219730429762421 +1368 6 6.07387352 0.073873519897460938 0.005457296942040557 +1369 5 5.11232948 0.11232948303222656 0.012617912758287275 +1371 7 6.37426662 0.62573337554931641 0.39154225727634184 +1374 7 6.685261 0.31473922729492188 0.099060781198204495 +1376 6 5.576482 0.42351818084716797 0.17936764950809447 +1377 6 5.5179 0.48210000991821289 0.23242041956314097 +1378 7 6.305254 0.69474601745605469 0.48267202877104864 +1385 5 5.41952467 0.4195246696472168 0.17600094844260639 +1387 6 6.671762 0.67176198959350586 0.45126417066262547 +1390 6 6.13112974 0.13112974166870117 0.017195009150100304 +1391 6 6.25453854 0.25453853607177734 0.064789866345563496 +1392 6 6.671762 0.67176198959350586 0.45126417066262547 +1396 7 6.07236338 0.92763662338256836 0.86050970504061297 +1397 7 6.44414234 0.55585765838623047 0.30897773638662329 +1399 6 6.28654957 0.28654956817626953 0.08211065502200654 +1401 6 4.96816349 1.0318365097045898 1.0646865827593501 +1402 8 6.401021 1.5989789962768555 2.5567338305345402 +1405 4 4.93992 0.93991994857788086 0.8834495097346462 +1410 6 6.77783632 0.77783632278442383 0.60502934504279438 +1412 8 6.74131536 1.2586846351623535 1.584287010793787 +1414 6 6.098223 0.098223209381103516 0.0096477988611241017 +1415 5 4.419557 0.58044290542602539 0.33691396645940586 +1417 3 5.175881 2.1758809089660645 4.7344577300029869 +1418 5 5.22850561 0.22850561141967773 0.052214814450280755 +1422 5 5.371983 0.37198305130004883 0.13837139045449476 +1423 4 5.391678 1.3916778564453125 1.9367672561202198 +1428 7 6.444281 0.55571889877319336 0.30882349445369073 +1429 5 5.612692 0.61269187927246094 0.37539133892641985 +1430 4 4.96963263 0.96963262557983398 0.94018742858884252 +1432 7 6.47275925 0.52724075317382813 0.27798281180730555 +1433 6 6.397414 0.39741420745849609 0.15793805228986457 +1435 5 6.0038023 1.0038022994995117 1.0076190564805074 +1441 5 5.365135 0.36513519287109375 0.13332370907301083 +1444 6 6.2645 0.26450014114379883 0.069960324665089502 +1445 6 5.902387 0.097612857818603516 0.0095282700115149055 +1446 6 6.31714964 0.31714963912963867 0.10058389360006004 +1448 6 5.80783939 0.19216060638427734 0.036925698645973171 +1449 6 6.078127 0.078126907348632813 0.0061038136518618558 +1450 6 6.2645 0.26450014114379883 0.069960324665089502 +1451 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1452 6 6.2645 0.26450014114379883 0.069960324665089502 +1453 7 6.87757158 0.12242841720581055 0.014988717339520008 +1454 5 5.756866 0.7568659782409668 0.57284610901865562 +1455 5 5.01117373 0.011173725128173828 0.00012485213323998323 +1466 6 6.078127 0.078126907348632813 0.0061038136518618558 +1467 7 6.7072196 0.29278039932250977 0.085720362227448277 +1468 5 5.14014864 0.14014863967895508 0.019641641203861582 +1469 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1472 5 5.114336 0.11433601379394531 0.013072724050289253 +1473 6 6.27588654 0.27588653564453125 0.076113380549941212 +1475 6 5.69343758 0.30656242370605469 0.093980519628530601 +1476 5 5.377952 0.37795209884643555 0.14284778902242579 +1477 6 5.12870932 0.87129068374633789 0.75914745558316099 +1479 6 5.97060442 0.029395580291748047 0.00086410014068860619 +1481 6 5.87255526 0.12744474411010742 0.01624216280129076 +1483 4 5.11274862 1.1127486228942871 1.2382094977531324 +1487 6 5.67100143 0.32899856567382813 0.1082400562154362 +1490 6 6.281177 0.28117704391479492 0.079060530024662512 +1491 5 5.67186 0.6718602180480957 0.4513961525956347 +1493 8 7.152326 0.84767389297485352 0.71855102883114341 +1496 5 3.60124254 1.3987574577331543 1.9565224255641169 +1497 7 6.07676363 0.92323637008666992 0.85236539505081055 +1499 6 6.293631 0.29363107681274414 0.08621920927021165 +1500 7 6.680092 0.31990814208984375 0.10234121937537566 +1501 5 5.673793 0.67379283905029297 0.45399678995545401 +1504 8 6.313339 1.6866607666015625 2.8448245415929705 +1507 6 5.803581 0.19641876220703125 0.038580330146942288 +1512 7 6.51168633 0.48831367492675781 0.2384502451204753 +1513 6 6.43545341 0.43545341491699219 0.18961967656287015 +1515 6 6.255807 0.25580692291259766 0.06543718181001168 +1516 6 5.870338 0.12966203689575195 0.016812243811955341 +1517 6 5.82861662 0.17138338088989258 0.029372263245249997 +1520 6 5.817548 0.18245220184326172 0.033288805957454315 +1526 6 5.99440527 0.0055947303771972656 3.1301007993533858E-05 +1527 6 6.2122364 0.21223640441894531 0.045044291360682109 +1530 5 5.113673 0.11367321014404297 0.012921598704451753 +1532 7 5.49979448 1.5002055168151855 2.250616592682718 +1533 6 6.35571957 0.35571956634521484 0.1265364098808277 +1538 6 5.86379766 0.13620233535766602 0.018551076156882118 +1540 6 6.057325 0.057324886322021484 0.0032861425918326859 +1542 6 6.2134366 0.21343660354614258 0.045555183733313243 +1543 6 6.21323347 0.21323347091674805 0.045468513119203635 +1549 6 5.80053139 0.19946861267089844 0.039787727440852905 +1551 6 5.668514 0.33148622512817383 0.10988311744972634 +1552 7 6.59583855 0.40416145324707031 0.1633464802907838 +1554 7 6.49526739 0.50473260879516602 0.2547550063811741 +1559 4 5.70196152 1.7019615173339844 2.8966730064857984 +1560 6 6.42826653 0.42826652526855469 0.18341221666560159 +1561 5 4.75953627 0.2404637336730957 0.0578228072120055 +1562 7 6.818427 0.18157291412353516 0.032968723143312673 +1564 5 4.75953627 0.2404637336730957 0.0578228072120055 +1567 5 5.400646 0.40064620971679688 0.16051738536043558 +1569 5 5.62976 0.62975978851318359 0.39659739122816973 +1571 6 5.641856 0.35814380645751953 0.12826698610388121 +1572 6 5.927081 0.072918891906738281 0.0053171647969065816 +1573 5 5.42326546 0.42326545715332031 0.17915364721920923 +1576 6 5.35206366 0.64793634414672852 0.41982150606622781 +1578 5 5.85142469 0.8514246940612793 0.72492400965734305 +1580 5 4.616376 0.38362407684326172 0.14716743233384477 +1581 6 6.01939154 0.019391536712646484 0.00037603169607791642 +1585 5 5.148195 0.14819478988647461 0.021961695749496357 +1587 6 5.495188 0.50481176376342773 0.25483491683394277 +1588 5 5.148195 0.14819478988647461 0.021961695749496357 +1589 6 6.458008 0.4580078125 0.20977115631103516 +1592 6 6.190008 0.19000816345214844 0.036103102178458357 +1596 5 6.11365128 1.1136512756347656 1.2402191637229407 +1597 6 5.53800058 0.46199941635131836 0.21344346070895881 +1598 6 5.62568235 0.37431764602661133 0.1401137001269035 +1599 6 5.89610243 0.1038975715637207 0.010794705376838465 +1600 6 5.408455 0.59154510498046875 0.34992561122635379 +1603 7 5.886322 1.113677978515625 1.2402786398306489 +1607 7 5.848945 1.151054859161377 1.3249272887990173 +1609 7 6.117519 0.88248109817504883 0.77877288863624017 +1610 6 6.04807568 0.048075675964355469 0.0023112706194297061 +1613 7 6.5623827 0.43761730194091797 0.19150890295804857 +1616 6 5.323467 0.67653322219848633 0.45769720073826647 +1617 6 5.734267 0.26573276519775391 0.07061390249964461 +1619 8 6.94580841 1.0541915893554688 1.1113199070678093 +1621 5 4.691925 0.308074951171875 0.094910175539553165 +1623 6 5.742188 0.2578120231628418 0.066467039287317675 +1626 6 5.93749475 0.062505245208740234 0.003906905678604744 +1628 6 5.542873 0.45712709426879883 0.20896518031463529 +1629 6 5.527357 0.47264289855957031 0.22339130955879227 +1632 8 7.01878834 0.98121166229248047 0.96277632621877274 +1633 7 6.146297 0.85370302200317383 0.7288088497773515 +1634 6 5.76403952 0.23596048355102539 0.055677349797633724 +1636 5 5.08614254 0.086142539978027344 0.0074205371938660392 +1639 5 5.69386959 0.69386959075927734 0.48145500898044702 +1641 6 5.7167654 0.28323459625244141 0.080221836514283495 +1642 7 5.635858 1.3641419410705566 1.860883235387746 +1644 7 5.635858 1.3641419410705566 1.860883235387746 +1646 6 5.7167654 0.28323459625244141 0.080221836514283495 +1647 7 6.595718 0.4042820930480957 0.16344401075934911 +1651 6 5.04891062 0.95108938217163086 0.9045710128796145 +1653 6 5.019502 0.98049783706665039 0.9613760084923797 +1654 5 4.9331913 0.066808700561523438 0.0044634024707193021 +1655 5 5.45447063 0.45447063446044922 0.20654355758688325 +1656 5 5.669732 0.66973209381103516 0.4485410774805132 +1657 6 6.788385 0.78838491439819336 0.62155077325064667 +1658 5 5.26004457 0.26004457473754883 0.067623180850432618 +1659 5 5.377065 0.37706518173217773 0.14217815127472022 +1660 6 5.44472837 0.55527162551879883 0.30832657810628916 +1663 6 5.019502 0.98049783706665039 0.9613760084923797 +1664 4 5.48985672 1.4898567199707031 2.2196730460418621 +1665 8 6.362209 1.6377911567687988 2.6823598731900802 +1667 6 5.853944 0.14605617523193359 0.021332406323381292 +1668 7 5.82933331 1.1706666946411133 1.3704605099419496 +1669 6 5.130034 0.86996603012084961 0.75684089356423101 +1673 5 5.570712 0.57071208953857422 0.32571228914548556 +1674 6 5.60828924 0.39171075820922852 0.15343731809684868 +1677 6 6.09377146 0.093771457672119141 0.0087930862739540316 +1679 5 5.491922 0.49192190170288086 0.24198715737497878 +1680 5 5.252373 0.25237321853637695 0.06369224143440988 +1681 6 6.32914257 0.32914257049560547 0.10833483171245462 +1684 7 6.160416 0.8395838737487793 0.70490108105900617 +1685 7 6.60589075 0.39410924911499023 0.15532210023798143 +1688 3 5.280151 2.2801508903503418 5.1990880827654564 +1690 4 4.54363966 0.5436396598815918 0.29554407979617281 +1697 6 6.475748 0.47574806213378906 0.22633621862405562 +1699 6 6.27966833 0.27966833114624023 0.078214375446123086 +1701 5 5.80198145 0.80198144912719727 0.6431742447441593 +1702 4 4.358819 0.35881900787353516 0.12875108041134808 +1704 5 5.21234035 0.21234035491943359 0.045088426327311026 +1706 6 5.9945097 0.0054903030395507813 3.0143427466100547E-05 +1707 5 5.331367 0.33136701583862305 0.10980409918579426 +1709 5 5.9493103 0.949310302734375 0.90119005087763071 +1711 5 6.35904932 1.3590493202209473 1.8470150547930189 +1713 6 5.38475227 0.61524772644042969 0.3785297648901178 +1714 5 5.44625664 0.44625663757324219 0.19914498657817603 +1715 8 6.32466841 1.6753315925598145 2.8067359450290041 +1716 6 6.47190332 0.47190332412719727 0.2226927473222986 +1719 6 5.64309549 0.35690450668334961 0.12738082689088515 +1720 7 6.133768 0.86623191833496094 0.75035773634226643 +1721 7 5.710882 1.2891178131103516 1.6618247360784153 +1723 8 6.32466841 1.6753315925598145 2.8067359450290041 +1724 6 6.21978569 0.21978569030761719 0.048305749663995812 +1725 6 5.76422739 0.23577260971069336 0.055588723489790937 +1728 5 5.44625664 0.44625663757324219 0.19914498657817603 +1731 6 5.48901033 0.51098966598510742 0.26111043874357165 +1734 6 5.853075 0.14692497253417969 0.021586947554169456 +1735 6 6.83932734 0.83932733535766602 0.70447037587859995 +1736 5 5.51393652 0.51393651962280273 0.2641307462019995 +1739 4 4.88872051 0.88872051239013672 0.78982414914298715 +1740 6 5.182924 0.81707620620727539 0.66761352675007402 +1743 6 5.31297255 0.6870274543762207 0.47200672306667002 +1744 5 5.49808359 0.49808359146118164 0.2480872640828693 +1746 5 5.721136 0.72113609313964844 0.52003726482871571 +1747 6 5.31297255 0.6870274543762207 0.47200672306667002 +1748 5 5.6907835 0.69078350067138672 0.47718184479981574 +1749 6 6.03195 0.031949996948242188 0.0010208023049926851 +1753 7 6.0383625 0.96163749694824219 0.9247466755368805 +1754 6 6.89634943 0.89634943008422852 0.80344230081232126 +1755 6 5.46218824 0.5378117561340332 0.2892414850359728 +1756 5 4.970864 0.029136180877685547 0.00084891703613720892 +1758 5 5.600766 0.60076618194580078 0.36092000536973501 +1765 5 5.022516 0.022515773773193359 0.00050696006860562193 +1767 5 5.19753265 0.19753265380859375 0.039019149320665747 +1768 5 5.18421936 0.1842193603515625 0.033936772728338838 +1772 6 5.92966461 0.07033538818359375 0.0049470668309368193 +1773 6 6.00829 0.0082898139953613281 6.8721016077688546E-05 +1774 6 6.18911743 0.189117431640625 0.03576540295034647 +1775 6 6.62580347 0.62580347061157227 0.39162998382948899 +1776 5 6.09891748 1.0989174842834473 1.2076196372638606 +1779 8 6.89703655 1.1029634475708008 1.2165283666772666 +1783 6 4.682983 1.3170170783996582 1.7345339847963714 +1784 7 6.949775 0.050224781036376953 0.00252252863015201 +1785 6 6.21301842 0.21301841735839844 0.045376846133876825 +1788 5 6.638938 1.6389379501342773 2.686117604390347 +1789 7 6.133875 0.86612510681152344 0.75017270064927288 +1794 5 5.16400242 0.16400241851806641 0.026896793279775011 +1795 6 5.117132 0.88286781311035156 0.77945557542625465 +1800 6 5.411709 0.58829116821289063 0.34608649859728757 +1801 5 5.03533125 0.035331249237060547 0.0012482971726512915 +1802 6 6.0186944 0.018694400787353516 0.00034948062079820374 +1803 6 5.90830851 0.091691493988037109 0.0084073300697582454 +1805 5 5.02972 0.029719829559326172 0.00088326826903539768 +1810 6 5.339474 0.66052579879760742 0.43629433087721736 +1812 6 6.510603 0.51060295104980469 0.26071537362076924 +1814 7 6.66430044 0.33569955825805664 0.11269419341465436 +1816 7 6.76522 0.23477983474731445 0.055121570803976283 +1817 4 4.97468042 0.97468042373657227 0.95000192841530406 +1818 6 6.40402842 0.40402841567993164 0.16323896067683563 +1821 5 5.90967035 0.90967035293579102 0.82750015101032659 +1823 6 5.56408072 0.43591928482055664 0.19002562287846558 +1824 5 5.042905 0.042904853820800781 0.0018408264813842834 +1825 5 5.518146 0.51814603805541992 0.26847531675252867 +1826 5 5.042905 0.042904853820800781 0.0018408264813842834 +1827 6 5.56408072 0.43591928482055664 0.19002562287846558 +1828 6 5.545804 0.45419597625732422 0.20629398484834383 +1829 7 6.212104 0.78789615631103516 0.62078035312970314 +1830 7 6.212104 0.78789615631103516 0.62078035312970314 +1831 7 6.59027052 0.4097294807434082 0.16787824739026291 +1832 7 6.212104 0.78789615631103516 0.62078035312970314 +1835 5 5.389878 0.3898777961730957 0.15200469594878996 +1836 6 6.027217 0.027216911315917969 0.00074076026157854358 +1841 7 6.989911 0.010088920593261719 0.00010178631873714039 +1843 6 6.90099573 0.90099573135375977 0.81179330791769644 +1844 6 6.373012 0.37301206588745117 0.13913800129762421 +1845 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1847 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1854 7 5.83561754 1.1643824577331543 1.3557865078767009 +1858 5 4.889405 0.1105952262878418 0.012231304077658933 +1859 6 5.98256636 0.017433643341064453 0.00030393192014344095 +1861 6 5.883474 0.11652612686157227 0.013578338241359234 +1862 7 6.15355825 0.84644174575805664 0.7164636289619466 +1863 5 5.2479043 0.24790430068969727 0.061456542300447836 +1866 6 5.2747364 0.72526359558105469 0.52600728307515965 +1867 6 6.31448936 0.31448936462402344 0.098903560461621964 +1868 7 6.509657 0.49034309387207031 0.24043634970803396 +1871 6 6.063482 0.063481807708740234 0.004029939909969471 +1873 5 5.26915 0.2691497802734375 0.072441604221239686 +1874 5 6.16405 1.1640501022338867 1.3550126405107221 +1876 6 6.09814024 0.098140239715576172 0.0096315066514307546 +1877 6 5.8294735 0.17052650451660156 0.029079288742650533 +1878 6 5.96899843 0.031001567840576172 0.00096109720857384673 +1879 6 5.671555 0.3284449577331543 0.10787609026033351 +1883 5 5.34378052 0.343780517578125 0.11818504426628351 +1884 5 6.07482862 1.0748286247253418 1.1552565725289696 +1885 6 5.671555 0.3284449577331543 0.10787609026033351 +1887 5 6.237499 1.2374992370605469 1.5314043617254356 +1888 5 6.03254032 1.0325403213500977 1.0661395152137629 +1889 5 5.779849 0.77984905242919922 0.60816454457471991 +1890 5 5.34378052 0.343780517578125 0.11818504426628351 +1892 5 5.42887926 0.4288792610168457 0.18393742053035567 +1894 5 5.260407 0.2604069709777832 0.067811790533824023 +1899 7 6.92687559 0.073124408721923828 0.0053471791509309696 +1900 6 5.50394869 0.49605131149291992 0.24606690363384587 +1901 5 5.78969 0.78969001770019531 0.62361032405533479 +1902 6 5.770987 0.22901296615600586 0.052446938667571885 +1903 5 5.426101 0.4261012077331543 0.18156223923165271 +1905 6 5.591873 0.4081268310546875 0.16656751022674143 +1906 5 5.753492 0.75349187850952148 0.56775001097980748 +1917 6 5.890733 0.10926723480224609 0.01193932860132918 +1919 6 5.31168365 0.68831634521484375 0.47377939108991995 +1921 5 5.53998232 0.53998231887817383 0.2915809047010498 +1924 4 5.33742476 1.3374247550964355 1.7887049755447606 +1928 6 5.972093 0.027906894683837891 0.00077879477089481952 +1932 6 4.882628 1.1173720359802246 1.2485202667905924 +1934 6 5.90029144 0.09970855712890625 0.0099417963647283614 +1935 5 5.31565857 0.3156585693359375 0.099640332395210862 +1936 6 5.893681 0.10631895065307617 0.011303719267971246 +1937 7 5.95812225 1.0418777465820313 1.0855092388228513 +1939 5 5.204067 0.20406723022460938 0.041643434451543726 +1942 5 4.610965 0.38903522491455078 0.15134840622431511 +1945 6 5.78697824 0.21302175521850586 0.045378268196373028 +1947 5 5.06945372 0.069453716278076172 0.004823818704835503 +1954 5 5.205833 0.20583295822143555 0.042367206690187231 +1956 5 5.56439972 0.56439971923828125 0.3185470430762507 +1957 6 5.642328 0.35767221450805664 0.12792941303109728 +1958 6 5.27635431 0.72364568710327148 0.5236630804631659 +1961 5 5.182421 0.18242120742797852 0.033277496919481564 +1962 5 5.22548151 0.22548151016235352 0.050841911425095532 +1963 6 5.27635431 0.72364568710327148 0.5236630804631659 +1964 5 5.29695 0.29694986343383789 0.088179221393374974 +1965 6 5.109696 0.8903040885925293 0.79264137016457425 +1967 7 5.887322 1.112678050994873 1.2380524451657493 +1968 6 6.275273 0.27527284622192383 0.075775139867118924 +1971 7 6.79392147 0.20607852935791016 0.042468360262319038 +1973 5 5.14016438 0.14016437530517578 0.01964605210469017 +1976 5 5.727278 0.72727823257446289 0.52893362757663454 +1981 8 7.917678 0.082322120666503906 0.0067769315510304295 +1983 8 7.917678 0.082322120666503906 0.0067769315510304295 +1987 5 6.051807 1.0518069267272949 1.1062978111115171 +1988 6 5.8307457 0.16925430297851563 0.028647019076743163 +1991 8 7.917678 0.082322120666503906 0.0067769315510304295 +1994 6 5.769981 0.23001909255981445 0.052908782942040489 +1995 6 5.94961 0.050389766693115234 0.0025391285873865854 +1999 6 6.65559149 0.65559148788452148 0.42980019898664068 +2000 5 5.357441 0.35744094848632813 0.12776403165480588 +2006 6 5.94961 0.050389766693115234 0.0025391285873865854 +2009 7 6.79772854 0.20227146148681641 0.040913744132012653 +2010 6 6.05053043 0.050530433654785156 0.0025533247253406444 +2012 5 6.21455526 1.2145552635192871 1.475144488142405 +2013 6 5.76146269 0.23853731155395508 0.056900049003388631 +2014 5 6.133267 1.1332669258117676 1.2842939251388543 +2015 6 6.11094332 0.11094331741333008 0.012308419678674909 +2016 7 6.91747046 0.082529544830322266 0.0068111257699001726 +2017 5 6.133267 1.1332669258117676 1.2842939251388543 +2018 7 5.97948074 1.0205192565917969 1.0414595530746737 +2020 6 6.263805 0.26380491256713867 0.069593031894555679 +2021 6 5.830813 0.16918706893920898 0.028624264296240653 +2023 6 5.830813 0.16918706893920898 0.028624264296240653 +2026 5 4.90337944 0.096620559692382813 0.0093355325552693103 +2030 6 5.54503059 0.45496940612792969 0.20699716051240102 +2033 5 6.1886487 1.1886487007141113 1.412885733709345 +2036 6 5.323167 0.67683315277099609 0.45810311668992654 +2040 6 5.88102674 0.1189732551574707 0.014154635442764629 +2041 5 5.21115 0.21115016937255859 0.044584394026060181 +2042 6 5.5706563 0.42934370040893555 0.1843360130808378 +2044 6 5.277161 0.7228388786315918 0.5224960444613771 +2045 5 5.605945 0.60594511032104492 0.3671694767219833 +2046 5 5.02834129 0.028341293334960938 0.00080322890789830126 +2047 5 5.283352 0.28335189819335938 0.080288298209779896 +2049 7 5.77500868 1.2249913215637207 1.500603737906431 +2053 5 6.44825459 1.4482545852661133 2.0974413437443218 +2054 5 6.44825459 1.4482545852661133 2.0974413437443218 +2055 6 5.996897 0.0031027793884277344 9.6272399332519853E-06 +2056 5 5.142752 0.14275217056274414 0.020378182200374795 +2059 5 5.23273373 0.23273372650146484 0.054164987451258639 +2068 6 6.51137161 0.51137161254882813 0.26150092612078879 +2072 5 5.86525726 0.86525726318359375 0.74867013149196282 +2075 5 5.43223667 0.43223667144775391 0.18682854014423356 +2077 6 5.75369072 0.24630928039550781 0.060668261608952889 +2081 5 5.72838259 0.72838258743286133 0.53054119367538988 +2083 5 4.76489258 0.235107421875 0.055275499820709229 +2088 6 5.42661333 0.57338666915893555 0.32877227236917861 +2092 5 4.94481134 0.055188655853271484 0.0030457877348908369 +2093 5 5.41896248 0.41896247863769531 0.1755295585062413 +2095 5 5.394303 0.3943028450012207 0.15547473357605668 +2098 6 5.387457 0.61254310607910156 0.37520905680503347 +2100 5 5.62809563 0.62809562683105469 0.39450411644429551 +2101 6 6.321963 0.32196283340454102 0.10366006609388023 +2105 5 4.7825017 0.2174983024597168 0.04730551157285845 +2107 6 6.202732 0.20273208618164063 0.041100298767560162 +2108 6 5.387457 0.61254310607910156 0.37520905680503347 +2109 6 5.90480042 0.0951995849609375 0.0090629609767347574 +2117 5 5.76381731 0.76381731033325195 0.58341688356472332 +2119 4 5.78921556 1.7892155647277832 3.2012923370641602 +2126 5 4.936701 0.063299179077148438 0.0040067860718409065 +2127 5 4.90092373 0.099076271057128906 0.009816107486585679 +2130 5 6.140603 1.1406030654907227 1.3009753530068338 +2133 6 6.445718 0.44571781158447266 0.19866436756365147 +2135 5 5.743049 0.74304914474487305 0.5521220315060873 +2138 5 5.635716 0.63571596145629883 0.40413478365030642 +2140 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2141 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2144 6 6.080732 0.080731868743896484 0.0065176346308817301 +2145 6 5.74060965 0.25939035415649414 0.067283355829431457 +2149 6 6.53114653 0.53114652633666992 0.28211663243951079 +2151 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2153 6 5.755437 0.24456310272216797 0.059811111213093682 +2154 4 4.18521452 0.18521451950073242 0.034304418233887191 +2155 5 6.15803671 1.1580367088317871 1.3410490190019573 +2156 4 6.28683329 2.2868332862854004 5.229606479262884 +2159 4 5.38970137 1.3897013664245605 1.9312698878422907 +2160 6 6.376475 0.37647485733032227 0.1417333182018865 +2163 6 6.237965 0.23796510696411133 0.056627392132440946 +2164 5 5.71715 0.71715021133422852 0.51430442561672862 +2165 5 5.130902 0.13090181350708008 0.017135284779442372 +2169 7 6.87379265 0.12620735168457031 0.015928295619232813 +2170 7 6.87379265 0.12620735168457031 0.015928295619232813 +2175 7 6.838287 0.1617131233215332 0.026151134254405406 +2177 7 4.953657 2.0463428497314453 4.1875190586470126 +2178 5 5.037093 0.037093162536621094 0.0013759027069681906 +2180 6 5.44559526 0.55440473556518555 0.30736461081710331 +2181 6 5.98071527 0.019284725189208984 0.0003719006256233115 +2183 5 5.60916948 0.60916948318481445 0.37108745924365394 +2185 7 5.64677954 1.3532204627990723 1.8312056209381353 +2187 5 5.58004 0.58003997802734375 0.33644637610996142 +2188 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2190 6 6.555541 0.55554103851318359 0.30862584547230654 +2191 5 5.58781052 0.58781051635742188 0.34552120314037893 +2193 6 5.92142963 0.078570365905761719 0.0061733023985652835 +2194 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2195 5 5.58004 0.58003997802734375 0.33644637610996142 +2196 6 5.494919 0.5050811767578125 0.25510699511505663 +2199 6 5.91814041 0.081859588623046875 0.0067009922495344654 +2200 5 5.42772627 0.42772626876831055 0.18294976099446103 +2207 7 6.20115471 0.79884529113769531 0.63815379917286918 +2208 5 6.01227665 1.0122766494750977 1.0247040150725297 +2212 6 6.209624 0.20962381362915039 0.043942143240428777 +2213 6 6.27866745 0.27866744995117188 0.077655547662288882 +2214 5 6.01227665 1.0122766494750977 1.0247040150725297 +2217 6 5.81703329 0.18296670913696289 0.03347681665240998 +2218 6 5.859478 0.14052200317382813 0.019746433375985362 +2220 6 5.89436436 0.10563564300537109 0.011158889073158207 +2221 6 5.753357 0.24664306640625 0.060832802206277847 +2223 6 5.88092756 0.11907243728637695 0.014178245321318173 +2225 4 5.87550926 1.8755092620849609 3.5175349921664747 +2228 7 6.017545 0.98245477676391602 0.96521738838623605 +2229 6 6.303792 0.30379199981689453 0.092289579152748047 +2230 7 6.017545 0.98245477676391602 0.96521738838623605 +2231 6 6.303792 0.30379199981689453 0.092289579152748047 +2234 5 5.575778 0.57577800750732422 0.3315203139291043 +2236 5 5.2704854 0.27048540115356445 0.073162352237204686 +2237 4 5.158827 1.1588268280029297 1.3428796172993316 +2242 5 5.53293753 0.53293752670288086 0.28402240736818385 +2243 5 6.28247452 1.2824745178222656 1.6447408888634527 +2244 5 5.33255053 0.3325505256652832 0.11058985212025618 +2246 4 5.158827 1.1588268280029297 1.3428796172993316 +2248 6 5.680154 0.31984615325927734 0.10230156175475713 +2249 5 5.066627 0.066627025604248047 0.0044391605408691248 +2250 6 4.959182 1.0408182144165039 1.0833025554611595 +2251 7 6.41361332 0.58638668060302734 0.3438493391886368 +2256 5 5.84614134 0.84614133834838867 0.71595516446200236 +2257 6 5.53059244 0.46940755844116211 0.22034345592169302 +2261 6 5.198945 0.80105495452880859 0.6416890401751516 +2262 6 5.498481 0.50151920318603516 0.25152151116435562 +2263 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2264 6 6.58286762 0.58286762237548828 0.33973466521365481 +2265 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2268 6 5.49432945 0.50567054748535156 0.25570270259413519 +2269 6 5.713871 0.28612899780273438 0.081869803383597173 +2277 6 6.468116 0.46811580657958984 0.21913240836965997 +2279 5 5.187639 0.18763923645019531 0.035208483055612305 +2281 6 5.578538 0.42146205902099609 0.17763026719421759 +2286 5 5.24503756 0.24503755569458008 0.060043403700774434 +2288 5 5.06648064 0.066480636596679688 0.0044196750422997866 +2294 7 7.13601 0.13601016998291016 0.018498766338780115 +2301 5 5.900166 0.90016603469848633 0.81029889002479649 +2302 5 5.0114007 0.011400699615478516 0.00012997595172237197 +2303 5 5.16666365 0.16666364669799805 0.027776771130675115 +2305 7 6.700686 0.29931402206420898 0.089588883804253783 +2307 5 5.45757151 0.45757150650024414 0.20937168356090297 +2308 5 5.029569 0.029569149017333984 0.00087433457360930333 +2309 6 5.427362 0.57263803482055664 0.32791431892314904 +2312 5 5.029569 0.029569149017333984 0.00087433457360930333 +2313 7 6.80353832 0.19646167755126953 0.038597190746259002 +2316 7 6.64999628 0.35000371932983398 0.1225026035447172 +2320 6 6.219693 0.21969318389892578 0.048265095051647222 +2322 6 5.3386817 0.66131830215454102 0.43734189676456481 +2323 6 6.07975531 0.079755306243896484 0.0063609088740577135 +2325 6 5.010644 0.98935604095458984 0.97882537577334006 +2326 5 5.27927828 0.27927827835083008 0.077996356758603724 +2330 6 5.41974068 0.58025932312011719 0.33670088206781656 +2341 5 5.20041227 0.20041227340698242 0.040165079332155074 +2343 5 6.428549 1.4285488128662109 2.0407517107414606 +2346 4 5.21786 1.217860221862793 1.4831835199956913 +2348 6 5.806993 0.19300699234008789 0.037251699092166746 +2352 6 5.25599861 0.74400138854980469 0.55353806616403745 +2353 7 6.67731333 0.32268667221069336 0.10412668842241146 +2354 6 6.64218235 0.64218235015869141 0.41239817085534014 +2356 6 5.86749458 0.13250541687011719 0.017557685499923537 +2357 5 5.94600058 0.94600057601928711 0.89491708982882301 +2360 6 6.17621469 0.17621469497680664 0.031051618725769004 +2361 5 5.13946867 0.13946866989135742 0.019451509881264428 +2362 6 6.729167 0.72916698455810547 0.53168449136956042 +2363 5 5.514287 0.51428699493408203 0.26449111315832852 +2364 5 5.378189 0.3781890869140625 0.14302698546089232 +2368 6 5.58730936 0.41269063949584961 0.17031356392749331 +2369 6 6.56191969 0.5619196891784668 0.31575373708642474 +2371 5 4.946381 0.053618907928466797 0.0028749872874413995 +2372 4 5.022731 1.022730827331543 1.0459783451742624 +2373 3 4.65867138 1.6586713790893555 2.7511907438101844 +2377 6 5.68505859 0.31494140625 0.099188089370727539 +2378 5 5.365645 0.36564493179321289 0.13369621614606331 +2382 8 5.980098 2.019902229309082 4.0800050159677994 +2384 8 5.980098 2.019902229309082 4.0800050159677994 +2385 5 6.06373739 1.0637373924255371 1.1315372400442811 +2388 4 5.438252 1.4382519721984863 2.0685687355328355 +2390 8 6.577091 1.4229087829589844 2.0246694046218181 +2394 5 4.748077 0.2519230842590332 0.063465240382583943 +2395 5 5.46794844 0.46794843673706055 0.21897573944465876 +2397 6 6.152169 0.15216922760009766 0.023155473828410322 +2398 6 6.355004 0.35500383377075195 0.12602772199193168 +2399 6 5.84902763 0.15097236633300781 0.022792655396187911 +2400 4 5.51223755 1.512237548828125 2.2868624040856957 +2402 6 5.63959646 0.36040353775024414 0.12989071002289165 +2404 5 5.11211967 0.11211967468261719 0.01257082145093591 +2405 5 5.799807 0.79980707168579102 0.63969135191860005 +2407 6 6.790098 0.79009819030761719 0.62425515032737167 +2408 5 4.92498446 0.075015544891357422 0.0056273319753472606 +2409 4 6.467688 2.4676880836486816 6.0894844781817028 +2410 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2411 6 5.02752256 0.97247743606567383 0.94571236365686673 +2412 4 4.89793873 0.89793872833251953 0.80629395983942231 +2413 4 6.467688 2.4676880836486816 6.0894844781817028 +2414 4 4.812013 0.81201314926147461 0.65936535457353784 +2416 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2417 5 4.905179 0.094820976257324219 0.0089910175383920432 +2418 5 5.212003 0.21200323104858398 0.044945369975039284 +2421 5 5.728902 0.72890186309814453 0.53129792602794623 +2425 6 5.87789345 0.12210655212402344 0.014910010071616853 +2432 5 5.243106 0.24310588836669922 0.059100472958562023 +2434 6 5.20914364 0.79085636138916016 0.62545378434970189 +2438 5 4.97508335 0.024916648864746094 0.0006208393906490528 +2442 5 5.124124 0.12412405014038086 0.015406779823251782 +2445 5 5.283511 0.28351116180419922 0.08037857886756683 +2446 5 5.283511 0.28351116180419922 0.08037857886756683 +2447 6 5.54187 0.4581298828125 0.20988298952579498 +2448 6 6.25477743 0.25477743148803711 0.064911539595641443 +2449 6 6.04059029 0.040590286254882813 0.0016475713382533286 +2451 5 5.102657 0.10265684127807617 0.010538427061192124 +2454 5 5.52015066 0.52015066146850586 0.27055671062612419 +2457 6 6.17909145 0.17909145355224609 0.03207374873545632 +2458 6 5.62500525 0.37499475479125977 0.14062106612095704 +2460 5 5.3468256 0.34682559967041016 0.12028799658673961 +2462 5 5.26428 0.26427984237670898 0.069843835086658146 +2463 7 5.87194967 1.1280503273010254 1.2724975409239505 +2468 6 5.542082 0.45791816711425781 0.20968904777328135 +2469 5 5.144967 0.14496707916259766 0.021015454040934856 +2471 7 7.0686183 0.068618297576904297 0.0047084707623525901 +2473 6 5.332778 0.66722202301025391 0.44518522798989579 +2474 7 6.526948 0.47305202484130859 0.22377821820646204 +2476 6 5.40006 0.59993982315063477 0.35992779140201492 +2479 6 5.451382 0.54861783981323242 0.30098153416133755 +2480 5 5.305516 0.30551576614379883 0.093339883362432374 +2481 6 5.63753748 0.36246252059936523 0.13137907883924527 +2482 6 5.44933271 0.55066728591918945 0.30323445978160635 +2484 5 5.035196 0.035195827484130859 0.0012387462722927012 +2485 6 5.351825 0.64817476272583008 0.42013052303468612 +2487 6 6.216436 0.21643590927124023 0.046844502822068534 +2489 6 5.25572443 0.74427556991577148 0.55394612397344645 +2490 6 5.24163437 0.75836563110351563 0.57511843043903355 +2491 5 5.23166561 0.23166561126708984 0.053668955443754385 +2492 6 5.25572443 0.74427556991577148 0.55394612397344645 +2493 4 5.047504 1.0475039482116699 1.0972645215190369 +2494 4 5.047504 1.0475039482116699 1.0972645215190369 +2497 5 5.789101 0.78910112380981445 0.62268058359791212 +2498 5 5.789101 0.78910112380981445 0.62268058359791212 +2500 5 5.789101 0.78910112380981445 0.62268058359791212 +2501 5 5.42734766 0.42734766006469727 0.18262602256277205 +2506 6 5.75300074 0.24699926376342773 0.061008636299675345 +2507 7 6.718815 0.28118515014648438 0.079065088662900962 +2508 6 5.369476 0.6305241584777832 0.39756071442411667 +2509 5 5.12915134 0.12915134429931641 0.016680069734320568 +2510 6 5.33514929 0.66485071182250977 0.44202646901089793 +2515 7 6.553418 0.44658184051513672 0.19943534027788701 +2516 6 5.71722269 0.28277730941772461 0.079963006721527563 +2520 5 5.229541 0.22954082489013672 0.052688990291244409 +2521 7 6.4475956 0.55240440368652344 0.30515062521226355 +2524 5 5.229541 0.22954082489013672 0.052688990291244409 +2527 6 6.322875 0.32287502288818359 0.10424828040504508 +2528 6 6.20776 0.20775985717773438 0.043164158254512586 +2529 5 5.05015 0.050149917602539063 0.0025150142355414573 +2530 6 5.70940733 0.29059267044067383 0.084444100113842069 +2533 5 6.127435 1.1274352073669434 1.2711101468105426 +2535 6 5.85946 0.14054012298583984 0.019751526168874989 +2539 5 5.761463 0.76146316528320313 0.57982615208311472 +2540 5 6.34781027 1.3478102684020996 1.8165925196101398 +2542 5 6.003742 1.0037422180175781 1.0074984402308473 +2543 6 5.67026138 0.32973861694335938 0.10872755550371949 +2544 6 5.91505241 0.084947586059570313 0.0072160923773481045 +2549 5 5.905257 0.90525722503662109 0.81949064348100364 +2550 5 5.18551636 0.185516357421875 0.034416318871080875 +2553 7 6.659942 0.3400578498840332 0.11563934126775166 +2559 5 5.171946 0.17194604873657227 0.029565443676119685 +2561 5 5.419591 0.41959095001220703 0.17605656533214642 +2565 5 5.66264248 0.66264247894287109 0.43909505489955336 +2570 5 6.09423256 1.0942325592041016 1.1973448936223576 +2572 5 5.85262251 0.85262250900268555 0.7269651428580346 +2573 5 5.33394337 0.33394336700439453 0.11151817236623174 +2576 5 5.82261133 0.82261133193969727 0.6766894034356028 +2577 5 5.780506 0.78050613403320313 0.60918982526345644 +2578 7 6.720284 0.27971601486206055 0.078241048970312477 +2580 5 5.43206549 0.43206548690795898 0.18668058497701168 +2582 7 6.81294441 0.18705558776855469 0.034989792915439466 +2585 7 6.81294441 0.18705558776855469 0.034989792915439466 +2587 6 5.354246 0.64575386047363281 0.41699804831660003 +2588 7 6.81294441 0.18705558776855469 0.034989792915439466 +2589 4 4.78625631 0.78625631332397461 0.61819899024180813 +2590 6 6.1274457 0.12744569778442383 0.016242405883758693 +2591 7 6.415467 0.5845332145690918 0.34167907893447591 +2594 7 6.423638 0.57636213302612305 0.33219330838642236 +2597 6 6.22214746 0.22214746475219727 0.049349496095828727 +2598 5 5.194394 0.19439411163330078 0.037789070637700206 +2601 5 5.68621063 0.68621063232421875 0.47088503191480413 +2603 7 6.966857 0.033143043518066406 0.0010984613336404436 +2604 7 6.966857 0.033143043518066406 0.0010984613336404436 +2605 6 5.794412 0.20558786392211914 0.042266369792059777 +2606 6 6.468554 0.46855401992797852 0.21954286959066849 +2608 6 6.152119 0.15211915969848633 0.023140238747373587 +2613 5 5.2531476 0.25314760208129883 0.064083708439511611 +2614 5 6.55887175 1.5588717460632324 2.430081120674231 +2615 7 6.630824 0.36917591094970703 0.13629085322554602 +2616 7 6.630824 0.36917591094970703 0.13629085322554602 +2620 5 5.45543861 0.45543861389160156 0.20742433102350333 +2622 7 6.30767059 0.69232940673828125 0.47932000743458048 +2624 5 6.55887175 1.5588717460632324 2.430081120674231 +2625 5 4.713512 0.28648805618286133 0.082075406335434309 +2627 7 6.145278 0.85472202301025391 0.73054973661874101 +2629 5 4.998917 0.0010828971862792969 1.1726663160516182E-06 +2630 6 5.7854867 0.21451330184936523 0.046015956670316882 +2631 7 7.168283 0.16828298568725586 0.02831916327181716 +2632 5 5.06333447 0.063334465026855469 0.0040112544602379785 +2634 5 5.30502844 0.30502843856811523 0.093042348335302449 +2636 5 5.49951124 0.4995112419128418 0.24951148079730956 +2637 5 5.30502844 0.30502843856811523 0.093042348335302449 +2640 6 6.370355 0.37035512924194336 0.13716292175581657 +2642 5 5.604046 0.60404586791992188 0.3648714105511317 +2643 5 5.61569834 0.61569833755493164 0.37908444286790655 +2645 7 6.34942675 0.6505732536315918 0.42324555834079547 +2646 7 6.021215 0.97878503799438477 0.95802015060166923 +2647 5 5.82385874 0.82385873794555664 0.67874322008924537 +2649 6 5.82408476 0.17591524124145508 0.030946172101039338 +2651 5 4.96879244 0.031207561492919922 0.0009739118943343783 +2655 5 5.67757463 0.67757463455200195 0.459107385388279 +2656 4 5.873171 1.8731708526611328 3.5087690432592353 +2657 7 6.70312071 0.29687929153442383 0.088137313741981416 +2659 6 6.201171 0.20117092132568359 0.040469739587024378 +2662 6 6.45812464 0.45812463760375977 0.20987818357957622 +2663 8 5.65337 2.3466300964355469 5.506672809497104 +2667 7 6.00120831 0.99879169464111328 0.99758484928406688 +2671 7 6.983855 0.016145229339599609 0.00026066843042826804 +2672 7 5.72459126 1.2754087448120117 1.6266674663429512 +2673 6 5.512653 0.48734712600708008 0.23750722122736079 +2675 7 5.69395638 1.3060436248779297 1.7057499500842823 +2676 6 6.307566 0.30756616592407227 0.094596946421233952 +2677 6 6.443829 0.44382905960083008 0.19698423414615718 +2678 5 5.273363 0.27336311340332031 0.074727391769556561 +2682 6 6.5731144 0.57311439514160156 0.32846010991852381 +2684 6 6.47421932 0.47421932220458984 0.2248839655521806 +2685 7 6.35321856 0.64678144454956055 0.41832623701361626 +2686 6 6.623215 0.6232151985168457 0.3883971836623914 +2687 5 5.35341358 0.35341358184814453 0.12490115983473515 +2688 6 5.92039251 0.079607486724853516 0.0063373519426477287 +2689 6 5.86066055 0.13933944702148438 0.019415481496253051 +2690 6 5.578879 0.42112112045288086 0.17734299809148979 +2691 6 6.09161 0.091609954833984375 0.0083923838246846572 +2692 6 5.729569 0.2704310417175293 0.073132948324428071 +2693 6 6.20171928 0.20171928405761719 0.040690669560717652 +2695 6 6.645086 0.64508581161499023 0.41613570434697067 +2696 6 5.84798431 0.15201568603515625 0.023108768800739199 +2701 5 5.37176561 0.3717656135559082 0.13820967142260088 +2702 5 5.37176561 0.3717656135559082 0.13820967142260088 +2704 6 5.31003237 0.68996763229370117 0.47605533361297603 +2705 6 5.31003237 0.68996763229370117 0.47605533361297603 +2708 6 5.497318 0.50268220901489258 0.25268940326009215 +2713 6 5.497318 0.50268220901489258 0.25268940326009215 +2714 6 5.59170675 0.40829324722290039 0.16670337572782046 +2715 6 6.01414633 0.014146327972412109 0.0002001185951030493 +2719 6 6.004554 0.0045537948608398438 2.0737047634611372E-05 +2720 7 6.80529833 0.1947016716003418 0.037908740923967343 +2725 5 5.448 0.44799995422363281 0.2007039589843771 +2726 6 5.924554 0.075446128845214844 0.0056921183577287593 +2734 6 5.794034 0.20596599578857422 0.042421991421178973 +2735 6 5.434296 0.5657038688659668 0.32002086724992296 +2736 6 6.01298857 0.012988567352294922 0.00016870288186510152 +2737 7 6.007834 0.99216604232788086 0.98439345554857027 +2738 5 4.610934 0.38906621932983398 0.15137252302361048 +2741 5 4.610934 0.38906621932983398 0.15137252302361048 +2742 6 6.00884151 0.0088415145874023438 7.8172380199248437E-05 +2746 6 5.95755863 0.042441368103027344 0.0018012697264566668 +2747 6 5.59035969 0.40964031219482422 0.16780518537507305 +2748 8 6.45529556 1.5447044372558594 2.3861117984779412 +2750 8 6.45529556 1.5447044372558594 2.3861117984779412 +2751 6 6.10585451 0.10585451126098633 0.011205177554302281 +2763 6 5.63824034 0.36175966262817383 0.13087005350485015 +2765 6 6.276466 0.27646589279174805 0.076433389877138325 +2766 6 6.528149 0.52814912796020508 0.27894150136512508 +2767 6 5.705548 0.29445219039916992 0.086702092430869016 +2772 7 6.990375 0.0096249580383300781 9.2639817239614786E-05 +2774 8 6.647418 1.3525819778442383 1.8294780067890315 +2775 8 6.647418 1.3525819778442383 1.8294780067890315 +2777 6 6.116481 0.11648082733154297 0.013567783135840727 +2783 6 6.070306 0.070305824279785156 0.004942908927660028 +2785 5 5.43653631 0.43653631210327148 0.19056395178472485 +2786 6 6.944194 0.94419384002685547 0.89150200754465914 +2788 5 5.14618063 0.14618062973022461 0.021368776508325027 +2790 6 5.996413 0.0035867691040039063 1.2864912605436984E-05 +2791 5 5.06431532 0.064315319061279297 0.0041364602659541561 +2794 5 5.196513 0.19651317596435547 0.038617428327597736 +2796 7 6.7877326 0.21226739883422852 0.045057448607849437 +2798 7 5.97907734 1.0209226608276367 1.0422830793913818 +2799 7 6.517823 0.48217678070068359 0.23249444784687512 +2801 5 5.36617851 0.36617851257324219 0.13408670307035209 +2802 6 5.80672932 0.19327068328857422 0.037353557018832362 +2803 8 6.202484 1.797515869140625 3.2310632998123765 +2805 6 6.34842634 0.34842634201049805 0.12140091580681656 +2806 5 5.6479187 0.647918701171875 0.41979864332824945 +2807 5 5.6928525 0.69285249710083008 0.48004458273885575 +2812 6 6.332061 0.33206081390380859 0.1102643841304598 +2815 5 5.5959425 0.59594249725341797 0.35514746003264008 +2816 5 5.84147549 0.84147548675537109 0.70808099481018871 +2817 7 7.080033 0.080032825469970703 0.0064052531527067913 +2819 6 6.2077837 0.20778369903564453 0.043174065584935306 +2820 5 5.42021656 0.42021656036376953 0.17658195760395756 +2821 5 5.69374561 0.69374561309814453 0.48128297569292044 +2822 5 5.76683855 0.76683855056762695 0.58804136263665896 +2824 6 5.575345 0.42465496063232422 0.18033183558964083 +2825 6 5.79173851 0.20826148986816406 0.043372848162107402 +2826 6 5.548999 0.45100116729736328 0.20340205290358426 +2827 7 6.41423273 0.58576726913452148 0.34312329358931493 +2828 7 6.41423273 0.58576726913452148 0.34312329358931493 +2829 5 5.660426 0.66042613983154297 0.43616268617279275 +2832 6 6.22251129 0.22251129150390625 0.049511274846736342 +2834 6 6.2342124 0.23421239852905273 0.054855447624731823 +2835 6 5.79173851 0.20826148986816406 0.043372848162107402 +2838 7 6.53514433 0.46485567092895508 0.21609079479480897 +2841 6 5.84660959 0.15339040756225586 0.02352861713211496 +2843 6 5.64633465 0.35366535186767578 0.12507918111168692 +2845 7 6.833482 0.16651821136474609 0.027728314716114255 +2849 5 5.037817 0.037817001342773438 0.001430125590559328 +2851 5 5.75162268 0.75162267684936523 0.56493664835420532 +2853 6 6.388475 0.38847494125366211 0.15091277998203623 +2855 7 6.26280069 0.73719930648803711 0.54346281748644287 +2857 8 6.98407269 1.0159273147583008 1.0321083088720115 +2858 7 6.26280069 0.73719930648803711 0.54346281748644287 +2859 6 6.298114 0.29811382293701172 0.088871851426119974 +2862 6 6.979329 0.97932910919189453 0.95908550411058968 +2864 6 6.388475 0.38847494125366211 0.15091277998203623 +2866 7 6.742437 0.25756311416625977 0.066338757779021762 +2867 7 6.51812935 0.48187065124511719 0.23219932453139336 +2874 7 6.914118 0.085882186889648438 0.007375750024948502 +2875 6 6.06492567 0.064925670623779297 0.004215342705947478 +2876 5 6.01396847 1.0139684677124023 1.0281320535150371 +2877 5 5.71460772 0.71460771560668945 0.51066418720461115 +2878 6 7.44846964 1.4484696388244629 2.09806429459627 +2880 5 5.61933041 0.61933040618896484 0.38357015203018818 +2882 5 5.98323154 0.98323154449462891 0.96674427008929342 +2883 7 6.836774 0.16322612762451172 0.026642768739293388 +2884 7 6.89757824 0.10242176055908203 0.010490217036021932 +2885 6 6.65348339 0.65348339080810547 0.4270405420620591 +2886 5 5.506567 0.50656700134277344 0.25661012684940943 +2887 5 6.570382 1.5703821182250977 2.4660999972411446 +2888 4 5.380556 1.3805561065673828 1.9059351633804908 +2889 6 6.397633 0.39763307571411133 0.15811206290186419 +2892 5 5.364448 0.36444807052612305 0.13282239611021396 +2894 7 6.20067549 0.79932451248168945 0.63891967625409052 +2897 5 5.364448 0.36444807052612305 0.13282239611021396 +2899 5 5.146842 0.14684200286865234 0.021562573806477303 +2900 6 6.481261 0.48126077651977539 0.23161193501641719 +2901 7 6.732033 0.26796722412109375 0.071806433203164488 +2907 6 5.935697 0.064302921295166016 0.0041348656870923151 +2908 6 6.063202 0.063201904296875 0.0039944807067513466 +2909 6 6.188701 0.18870115280151367 0.035608125068620211 +2912 7 6.732033 0.26796722412109375 0.071806433203164488 +2914 6 6.351888 0.35188817977905273 0.12382529106821494 +2915 6 6.351888 0.35188817977905273 0.12382529106821494 +2916 6 7.193787 1.1937870979309082 1.4251276351862998 +2917 7 6.77892828 0.22107172012329102 0.048872705438270714 +2918 6 6.00741529 0.0074152946472167969 5.498659470504208E-05 +2921 6 5.207289 0.79271078109741211 0.62839038246806922 +2922 8 6.728791 1.2712087631225586 1.6159717194395853 +2925 5 5.5744133 0.57441329956054688 0.32995063871203456 +2926 8 6.433487 1.5665130615234375 2.4539631719235331 +2928 7 6.725618 0.27438211441040039 0.07528554470832205 +2930 8 6.32433462 1.6756653785705566 2.8078544609400069 +2931 8 6.433487 1.5665130615234375 2.4539631719235331 +2932 6 6.040474 0.04047393798828125 0.0016381396562792361 +2935 4 5.525333 1.5253329277038574 2.3266405403376211 +2936 5 5.521468 0.52146816253662109 0.27192904453931988 +2938 8 6.206464 1.7935361862182617 3.2167720512743472 +2939 8 6.206464 1.7935361862182617 3.2167720512743472 +2942 5 5.47682953 0.47682952880859375 0.22736639954382554 +2945 8 6.9402957 1.0597043037414551 1.1229732113681621 +2946 6 6.150122 0.15012216567993164 0.022536664628432845 +2951 5 5.433133 0.43313312530517578 0.1876043042366291 +2952 5 5.218945 0.21894502639770508 0.047936924584291773 +2954 7 6.82631826 0.17368173599243164 0.030165345417344724 +2957 6 6.40513372 0.40513372421264648 0.1641333344944087 +2958 5 5.433133 0.43313312530517578 0.1876043042366291 +2960 7 6.320663 0.6793370246887207 0.46149879311292352 +2963 7 6.758505 0.24149513244628906 0.058319898995250696 +2966 6 6.074806 0.07480621337890625 0.0055959695600904524 +2969 6 6.37035227 0.37035226821899414 0.13716080257495378 +2972 6 5.967377 0.032622814178466797 0.0010642480049227743 +2973 6 6.074806 0.07480621337890625 0.0055959695600904524 +2974 6 6.11917543 0.11917543411254883 0.014202784095914467 +2976 6 6.85677767 0.85677766799926758 0.73406797238226318 +2977 6 5.64738846 0.35261154174804688 0.1243348993739346 +2978 6 5.64738846 0.35261154174804688 0.1243348993739346 +2979 7 7.00416327 0.0041632652282714844 1.7332777360934415E-05 +2980 7 6.459112 0.54088783264160156 0.29255964749972918 +2982 6 6.08631945 0.086319446563720703 0.0074510468550670339 +2983 6 6.486003 0.48600292205810547 0.23619884024901694 +2986 7 6.642583 0.35741710662841797 0.1277469881106299 +2988 7 6.099473 0.90052700042724609 0.81094887849849329 +2990 7 7.303502 0.30350208282470703 0.092113514278935327 +2992 7 6.31785631 0.6821436882019043 0.46532001135369683 +2993 7 6.642583 0.35741710662841797 0.1277469881106299 +2995 6 6.261716 0.26171588897705078 0.068495206543047971 +2998 7 6.02018 0.97981977462768555 0.9600467907514485 +3003 7 6.099473 0.90052700042724609 0.81094887849849329 +3007 7 7.303502 0.30350208282470703 0.092113514278935327 +3008 7 7.05388927 0.053889274597167969 0.0029040539166089729 +3009 6 5.962095 0.037905216217041016 0.0014368054164606292 +3010 5 5.75205231 0.75205230712890625 0.56558267265791073 +3011 6 6.4816947 0.48169469833374023 0.23202978240283301 +3012 6 6.84173775 0.84173774719238281 0.70852243504850776 +3015 6 6.66586542 0.66586542129516602 0.44337675927658893 +3017 6 7.075902 1.075901985168457 1.1575650816894267 +3018 8 7.011235 0.98876476287841797 0.97765575631001411 +3019 6 6.66586542 0.66586542129516602 0.44337675927658893 +3021 4 5.329598 1.3295979499816895 1.7678307085955112 +3024 6 6.08960772 0.089607715606689453 0.0080295426962493366 +3025 7 5.93795824 1.0620417594909668 1.1279326989026686 +3030 8 7.151422 0.84857797622680664 0.72008458173718282 +3032 5 6.76317167 1.7631716728210449 3.1087743478385619 +3035 7 6.09332848 0.90667152404785156 0.82205325251925387 +3036 5 5.510598 0.51059818267822266 0.26071050415430364 +3041 6 5.37881136 0.62118864059448242 0.38587532720362105 +3042 6 5.661942 0.3380579948425293 0.11428320787695156 +3047 5 5.774637 0.77463722229003906 0.60006282615722739 +3048 6 6.35629272 0.356292724609375 0.12694450560957193 +3051 5 4.92406559 0.075934410095214844 0.005766034636508266 +3052 7 5.75310135 1.2468986511230469 1.5547562461724738 +3054 6 6.408374 0.40837383270263672 0.16676918723624112 +3057 5 6.842451 1.8424510955810547 3.3946260396078287 +3060 5 5.91603136 0.9160313606262207 0.83911345365072521 +3061 5 5.91603136 0.9160313606262207 0.83911345365072521 +3063 5 5.91603136 0.9160313606262207 0.83911345365072521 +3067 4 5.671678 1.6716780662536621 2.7945075571935831 +3068 6 6.87566 0.87565994262695313 0.76678033512143884 +3071 7 6.60551071 0.39448928833007813 0.15562179860717151 +3081 5 5.91603136 0.9160313606262207 0.83911345365072521 +3082 6 5.680128 0.31987190246582031 0.10231803398710326 +3083 7 6.60002565 0.39997434616088867 0.1599794775868304 +3085 6 6.02571249 0.025712490081787109 0.00066113214620600047 +3087 3 5.521938 2.5219378471374512 6.360170504824282 +3089 7 6.60497332 0.39502668380737305 0.15604608091985028 +3092 6 5.875346 0.12465381622314453 0.015538573898993491 +3093 7 6.42221928 0.57778072357177734 0.33383056453112658 +3096 7 6.04160261 0.95839738845825195 0.91852555420359749 +3098 7 6.134868 0.86513185501098633 0.74845312655475027 +3100 7 6.25054932 0.74945068359375 0.56167632713913918 +3103 7 6.42221928 0.57778072357177734 0.33383056453112658 +3107 6 5.812541 0.18745899200439453 0.035140873683303653 +3109 4 5.29554653 1.2955465316772461 1.6784408157409416 +3110 6 6.20626926 0.20626926422119141 0.042547009362351673 +3118 7 6.6532855 0.34671449661254883 0.12021094216129313 +3121 5 5.4326396 0.43263959884643555 0.18717702249000467 +3123 5 6.173872 1.1738719940185547 1.3779754583410977 +3127 5 5.83897829 0.83897829055786133 0.70388457202739119 +3129 6 6.11212063 0.11212062835693359 0.012571035303153621 +3130 6 6.62801 0.62800979614257813 0.39439630405104253 +3132 6 6.119272 0.11927223205566406 0.014225865339540178 +3134 6 6.2366147 0.23661470413208008 0.055986518211511793 +3136 5 5.514752 0.51475191116333008 0.26496953004630086 +3137 6 5.9501214 0.049878597259521484 0.0024878744645775441 +3139 6 5.58149433 0.41850566864013672 0.17514699468392791 +3142 6 5.798257 0.20174312591552734 0.040700288854168321 +3148 6 5.95302 0.046979904174804688 0.0022071113962738309 +3149 6 6.175666 0.17566585540771484 0.030858492756124178 +3150 6 6.9550066 0.95500659942626953 0.91203760494772723 +3152 6 6.06551075 0.065510749816894531 0.0042916583415717469 +3153 6 6.341843 0.3418431282043457 0.11685672430053273 +3155 7 7.05393267 0.053932666778564453 0.0029087325458476698 +3156 5 5.629764 0.62976408004760742 0.39660279651820929 +3160 6 5.82131863 0.17868137359619141 0.031927033270221727 +3161 5 5.629764 0.62976408004760742 0.39660279651820929 +3163 7 7.06213474 0.062134742736816406 0.0038607262549703592 +3165 6 5.43980265 0.56019735336303711 0.31382107471495146 +3169 6 6.016192 0.016191959381103516 0.00026217954859930614 +3170 6 6.274177 0.27417707443237305 0.07517306814429503 +3171 6 6.243532 0.24353218078613281 0.059307923078449676 +3180 6 6.34757662 0.34757661819458008 0.1208095055155809 +3184 7 6.41739655 0.58260345458984375 0.33942678530002013 +3185 6 6.49914455 0.49914455413818359 0.24914528592580609 +3186 4 5.41402626 1.4140262603759766 1.9994702650328691 +3187 7 6.36057663 0.63942337036132813 0.40886224656424019 +3188 8 6.252697 1.7473030090332031 3.0530678053764859 +3191 6 6.047302 0.047301769256591797 0.0022374573748038529 +3194 5 5.340684 0.34068393707275391 0.11606554497939214 +3196 7 6.3920126 0.60798740386962891 0.36964868326413125 +3198 7 6.3920126 0.60798740386962891 0.36964868326413125 +3202 7 6.708888 0.29111194610595703 0.084746165165597631 +3203 7 6.3920126 0.60798740386962891 0.36964868326413125 +3205 7 6.96342325 0.036576747894287109 0.0013378584865222365 +3207 6 6.063226 0.063226222991943359 0.0039975552738269471 +3210 5 5.12971735 0.12971735000610352 0.016826590892605964 +3213 6 5.94969034 0.050309658050537109 0.0025310616931619734 +3214 6 6.1900773 0.19007730484008789 0.036129381815271699 +3219 7 6.91940975 0.080590248107910156 0.0064947880900945165 +3221 6 6.66447926 0.66447925567626953 0.44153268122408917 +3222 6 6.301735 0.30173492431640625 0.091043964552227408 +3223 6 6.180912 0.18091201782226563 0.032729158192523755 +3226 6 6.033703 0.033702850341796875 0.0011358821211615577 +3227 6 5.27611446 0.72388553619384766 0.52401026951065433 +3232 5 6.434669 1.434669017791748 2.0582751906115391 +3236 6 6.92699432 0.92699432373046875 0.8593184762285091 +3239 7 6.684847 0.31515312194824219 0.099321490273723612 +3240 6 6.14441633 0.14441633224487305 0.020856077019061559 +3241 7 6.31036854 0.68963146209716797 0.47559155351427762 +3242 6 6.469078 0.46907806396484375 0.22003423009300604 +3244 7 6.741383 0.25861692428588867 0.066882713527093074 +3246 6 6.53103065 0.53103065490722656 0.28199355645119795 +3247 6 6.181634 0.18163394927978516 0.032990891530971567 +3248 7 6.287761 0.71223878860473633 0.50728409199314228 +3251 6 5.55754375 0.44245624542236328 0.19576752911325457 +3252 8 6.597662 1.4023380279541016 1.9665519446461985 +3253 8 6.34131336 1.658686637878418 2.7512413626764101 +3255 6 6.1782856 0.17828559875488281 0.031785754723387072 +3256 6 6.1782856 0.17828559875488281 0.031785754723387072 +3258 6 6.1782856 0.17828559875488281 0.031785754723387072 +3263 8 6.55796432 1.4420356750488281 2.0794668881135294 +3264 6 4.65063143 1.3493685722351074 1.8207955437358123 +3266 6 6.52961636 0.52961635589599609 0.2804934844325544 +3267 6 5.60741472 0.39258527755737305 0.15412320015479963 +3269 5 5.20599842 0.20599842071533203 0.042435349337210937 +3271 7 6.82550669 0.17449331283569336 0.030447916224375149 +3272 7 5.845716 1.1542840003967285 1.3323715535718748 +3273 7 6.585916 0.41408395767211914 0.17146552400140536 +3274 5 6.55339956 1.5533995628356934 2.4130502018181232 +3275 4 5.209161 1.2091608047485352 1.4620698517401252 +3277 7 5.775679 1.2243208885192871 1.4989616380646567 +3278 5 5.20599842 0.20599842071533203 0.042435349337210937 +3281 6 6.54781961 0.54781961441040039 0.30010632993275976 +3282 7 6.30941963 0.69058036804199219 0.47690124472501338 +3283 6 6.47506571 0.47506570816040039 0.22568742706994271 +3284 6 6.076994 0.076993942260742188 0.0059280671448505018 +3287 7 6.56880236 0.4311976432800293 0.18593140757025139 +3288 6 6.47506571 0.47506570816040039 0.22568742706994271 +3290 5 5.51041555 0.51041555404663086 0.26052403781272915 +3293 7 6.16678238 0.83321762084960938 0.6942516036942834 +3295 5 5.39381552 0.39381551742553711 0.15509066176514352 +3296 5 5.47942972 0.47942972183227539 0.22985285817617296 +3297 5 5.28573465 0.28573465347290039 0.081644292195278467 +3298 6 6.50759029 0.50759029388427734 0.25764790644552704 +3299 7 6.7499404 0.25005960464477539 0.062529805875101374 +3300 5 5.51041555 0.51041555404663086 0.26052403781272915 +3302 6 6.70693874 0.70693874359130859 0.49976238719045796 +3303 7 6.506652 0.49334812164306641 0.24339236912874185 +3305 7 6.431296 0.56870412826538086 0.32342438550608676 +3306 7 6.60756159 0.39243841171264648 0.15400790698754463 +3308 6 5.94220924 0.057790756225585938 0.0033397715051250998 +3309 7 7.01701355 0.0170135498046875 0.00028946087695658207 +3310 7 6.482798 0.51720190048217773 0.26749780586237648 +3311 7 6.162655 0.83734512329101563 0.70114685549924616 +3313 7 5.716633 1.2833671569824219 1.6470312596211443 +3314 6 4.96552658 1.0344734191894531 1.070135255009518 +3316 6 6.66608953 0.66608953475952148 0.44367526831615578 +3317 6 6.324064 0.32406377792358398 0.10501733216210596 +3318 7 6.45378256 0.54621744155883789 0.29835349346308249 +3319 5 6.07571745 1.0757174491882324 1.1571680304880374 +3321 6 7.0864 1.086400032043457 1.1802650296240245 +3323 6 6.006462 0.00646209716796875 4.1758699808269739E-05 +3326 5 5.880373 0.88037300109863281 0.77505662106341333 +3328 5 6.10443 1.1044301986694336 1.2197660637330046 +3330 6 5.89951468 0.10048532485961914 0.010097300512143192 +3332 7 6.57549572 0.42450428009033203 0.18020388381501107 +3333 6 5.77693367 0.22306632995605469 0.049758587560063461 +3335 6 5.480915 0.51908493041992188 0.26944916498905513 +3336 6 5.480915 0.51908493041992188 0.26944916498905513 +3337 6 5.480915 0.51908493041992188 0.26944916498905513 +3342 5 6.37601328 1.3760132789611816 1.8934125438775027 +3343 7 5.399277 1.6007227897644043 2.5623134496711373 +3344 6 5.480915 0.51908493041992188 0.26944916498905513 +3346 6 6.18561268 0.18561267852783203 0.034452066430276318 +3347 6 5.61463 0.38536977767944336 0.1485098655487036 +3351 6 6.587807 0.58780717849731445 0.34551727909297369 +3355 6 6.764193 0.76419305801391602 0.58399102991666041 +3356 6 5.75061131 0.24938869476318359 0.062194721075684356 +3357 7 6.187659 0.81234121322631836 0.65989824670600683 +3359 6 6.55126047 0.55126047134399414 0.30388810726640259 +3361 6 6.112465 0.11246490478515625 0.012648354808334261 +3363 6 6.587807 0.58780717849731445 0.34551727909297369 +3365 7 6.378836 0.62116384506225586 0.3858445224125262 +3366 6 6.07021 0.070209980010986328 0.0049294412931430998 +3369 7 6.64197254 0.35802745819091797 0.12818366081864951 +3370 6 6.12879467 0.12879467010498047 0.01658806704745075 +3371 6 6.07021 0.070209980010986328 0.0049294412931430998 +3372 6 5.995269 0.0047311782836914063 2.2384047952073161E-05 +3376 6 5.968429 0.031570911407470703 0.00099672244709836377 +3382 7 6.80490828 0.19509172439575195 0.038060780927708038 +3383 6 6.54890728 0.54890727996826172 0.30129920200215565 +3384 6 5.939944 0.060056209564208984 0.0036067483072201867 +3387 5 5.34240532 0.34240531921386719 0.11724140262595029 +3389 7 6.63416529 0.36583471298217773 0.13383503722275236 +3390 6 6.90913439 0.9091343879699707 0.82652533538953321 +3397 6 5.771987 0.22801303863525391 0.051989945787681791 +3399 6 6.254692 0.25469207763671875 0.064868054410908371 +3400 6 5.488096 0.51190376281738281 0.26204546238659532 +3401 5 6.17827 1.1782698631286621 1.3883198703572361 +3405 6 5.978143 0.021856784820556641 0.00047771904269211518 +3406 6 6.254692 0.25469207763671875 0.064868054410908371 +3408 6 5.355218 0.64478206634521484 0.41574391308040504 +3409 3 6.249504 3.2495040893554688 10.559276826737914 +3411 6 6.2559967 0.2559967041015625 0.065534312510862947 +3414 7 6.424868 0.57513189315795898 0.33077669452745795 +3416 6 5.658931 0.34106922149658203 0.11632821385228453 +3422 8 6.920657 1.0793428421020508 1.1649809707969325 +3423 5 5.87612247 0.87612247467041016 0.76759059062260349 +3425 6 5.945171 0.054829120635986328 0.0030062324697155418 +3431 6 5.9485817 0.051418304443359375 0.0026438420318299904 +3435 6 6.27855062 0.27855062484741211 0.07759045060288372 +3437 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3439 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3442 7 6.433718 0.56628179550170898 0.32067507191663935 +3450 7 6.13693428 0.86306571960449219 0.74488243635641993 +3451 7 6.13693428 0.86306571960449219 0.74488243635641993 +3452 5 5.50814629 0.50814628601074219 0.258212647986511 +3454 5 5.78949451 0.78949451446533203 0.62330158837085037 +3455 6 6.10091829 0.10091829299926758 0.010184501861886019 +3456 5 5.165694 0.16569423675537109 0.027454580093944969 +3457 7 6.41468048 0.58531951904296875 0.34259893937269226 +3458 7 7.00273228 0.0027322769165039063 7.4653371484600939E-06 +3459 6 5.586149 0.41385078430175781 0.17127247166718007 +3461 8 5.846415 2.1535849571228027 4.6379281675456241 +3463 7 6.44663429 0.55336570739746094 0.30621360612349235 +3465 6 6.514682 0.51468181610107422 0.26489737182509998 +3467 5 5.617366 0.61736583709716797 0.38114057681468694 +3470 8 5.846415 2.1535849571228027 4.6379281675456241 +3472 6 6.150368 0.15036821365356445 0.022610599677364007 +3473 8 7.01380634 0.98619365692138672 0.97257792895197781 +3475 6 5.450064 0.54993581771850586 0.3024294036097217 +3477 7 5.99216938 1.0078306198120117 1.0157225582306637 +3478 6 5.450064 0.54993581771850586 0.3024294036097217 +3480 8 7.01380634 0.98619365692138672 0.97257792895197781 +3481 5 5.58673239 0.58673238754272461 0.34425489459158598 +3482 8 7.08236551 0.91763448715209961 0.84205305201089686 +3483 7 6.701889 0.2981109619140625 0.088870145613327622 +3484 8 7.058996 0.94100379943847656 0.88548815055764862 +3487 6 5.8508 0.1491999626159668 0.02226062884460589 +3488 6 5.71093845 0.28906154632568359 0.083556577564195322 +3490 7 5.99216938 1.0078306198120117 1.0157225582306637 +3491 6 5.7541585 0.24584150314331055 0.060438044667762369 +3493 7 6.74980736 0.25019264221191406 0.062596358216978842 +3494 6 6.46438169 0.46438169479370117 0.21565035845947023 +3497 6 6.36502266 0.36502265930175781 0.13324154180372716 +3500 7 6.74980736 0.25019264221191406 0.062596358216978842 +3502 5 5.36248827 0.3624882698059082 0.1313977457468809 +3503 7 6.881829 0.11817121505737305 0.01396443606813591 +3504 7 6.456562 0.54343795776367188 0.29532481393835042 +3506 6 6.33520365 0.33520364761352539 0.11236148537341251 +3507 7 7.048058 0.048058032989501953 0.002309574534820058 +3511 7 6.360972 0.63902807235717773 0.40835687726053038 +3513 6 6.1044445 0.10444450378417969 0.010908654370723525 +3516 7 7.216322 0.21632194519042969 0.046795183970971266 +3517 7 6.28893232 0.71106767654418945 0.50561724062595204 +3518 5 5.6771 0.67710018157958984 0.45846465589511354 +3519 7 6.63483524 0.36516475677490234 0.13334529959047359 +3520 5 4.63872862 0.36127138137817383 0.13051701100289392 +3522 5 5.43848848 0.43848848342895508 0.19227215009982501 +3523 5 4.63872862 0.36127138137817383 0.13051701100289392 +3526 6 5.771936 0.22806406021118164 0.052013215560009485 +3527 6 5.60652447 0.39347553253173828 0.15482299470113503 +3528 4 4.22449064 0.22449064254760742 0.050396048591437648 +3529 7 6.925511 0.074489116668701172 0.0055486285020833748 +3531 5 5.419897 0.41989707946777344 0.17631355734556564 +3532 6 6.31524754 0.31524753570556641 0.099381008768432366 +3533 6 5.39744234 0.60255765914916992 0.36307573259932724 +3536 6 6.21340227 0.21340227127075195 0.045540529383515604 +3537 5 5.512594 0.51259422302246094 0.26275283747600042 +3541 6 6.600255 0.60025501251220703 0.36030608004602982 +3542 6 5.77705956 0.22294044494628906 0.049702441992849344 +3543 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3544 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3546 6 5.77705956 0.22294044494628906 0.049702441992849344 +3547 6 6.06106949 0.061069488525390625 0.0037294824287528172 +3551 6 5.96327829 0.036721706390380859 0.0013484837202213384 +3555 6 5.940423 0.059576988220214844 0.0035494175253916183 +3560 6 5.945829 0.054171085357666016 0.0029345064888275374 +3564 6 5.945829 0.054171085357666016 0.0029345064888275374 +3566 6 5.766171 0.23382902145385742 0.054676011274068514 +3567 6 6.155753 0.15575313568115234 0.024259039274511451 +3568 7 6.18249464 0.8175053596496582 0.66831501305591701 +3572 6 5.766171 0.23382902145385742 0.054676011274068514 +3573 6 6.43890572 0.43890571594238281 0.19263822748689563 +3574 6 5.84190035 0.15809965133666992 0.024995499752776595 +3576 5 5.53407145 0.53407144546508789 0.28523230886116835 +3577 7 6.537883 0.46211719512939453 0.2135523020342589 +3578 4 5.00972128 1.0097212791442871 1.0195370615567754 +3579 7 6.75660372 0.24339628219604492 0.059241750186856734 +3580 5 5.873912 0.87391185760498047 0.76372193486258766 +3581 7 6.92469168 0.075308322906494141 0.0056713434989887901 +3582 6 6.65167 0.65166997909545898 0.42467376165427595 +3585 7 5.9642787 1.0357213020324707 1.0727186154838364 +3588 6 5.67989063 0.32010936737060547 0.10247000707840925 +3589 6 5.67989063 0.32010936737060547 0.10247000707840925 +3590 7 6.14944029 0.85055971145629883 0.72345182275262232 +3591 5 5.725536 0.72553586959838867 0.52640229807389005 +3593 7 6.46629429 0.53370571136474609 0.28484178634334967 +3594 7 6.41927671 0.58072328567504883 0.33723953452522437 +3595 7 6.160583 0.8394169807434082 0.70462086756037934 +3596 7 6.45985126 0.54014873504638672 0.29176065597221168 +3597 6 5.80583334 0.19416666030883789 0.037700691975487644 +3601 7 6.27083 0.72916984558105469 0.53168866370469914 +3602 6 6.525956 0.52595615386962891 0.27662987579333276 +3603 7 7.042205 0.042204856872558594 0.0017812499436331564 +3604 6 6.36735773 0.36735773086547852 0.13495170242663335 +3606 5 5.287236 0.28723621368408203 0.082504642451567634 +3608 6 6.211688 0.21168804168701172 0.044811826993282011 +3609 6 6.211688 0.21168804168701172 0.044811826993282011 +3610 5 5.13587236 0.13587236404418945 0.018461299310956747 +3611 6 6.12487125 0.12487125396728516 0.015592830067362229 +3612 6 6.04896259 0.048962593078613281 0.0023973355209818692 +3617 5 5.854528 0.85452795028686523 0.73021801782147122 +3618 7 5.47124434 1.5287556648254395 2.3370938827358714 +3619 6 5.60418129 0.39581871032714844 0.15667245144504705 +3621 7 5.47124434 1.5287556648254395 2.3370938827358714 +3623 6 5.60418129 0.39581871032714844 0.15667245144504705 +3624 7 6.501575 0.49842500686645508 0.24842748746982579 +3626 5 5.854528 0.85452795028686523 0.73021801782147122 +3630 6 5.904811 0.095189094543457031 0.0090609637200032012 +3632 6 5.92054844 0.079451560974121094 0.006312550541224482 +3633 6 5.904811 0.095189094543457031 0.0090609637200032012 +3634 7 6.57682848 0.4231715202331543 0.17907413553643892 +3636 7 5.96985435 1.0301456451416016 1.0612000502042065 +3641 6 5.971013 0.028986930847167969 0.00084024215993849793 +3642 6 5.971013 0.028986930847167969 0.00084024215993849793 +3644 7 5.678783 1.3212170600891113 1.7456145198705144 +3648 5 5.74037838 0.74037837982177734 0.54816014530752 +3649 6 6.519111 0.51911115646362305 0.26947639276500013 +3651 6 5.12625 0.87375020980834961 0.76343942914013496 +3654 6 6.135282 0.13528203964233398 0.018301230249790024 +3657 8 5.38427353 2.6157264709472656 6.8420249708142364 +3659 8 6.844641 1.1553587913513184 1.3348539367527792 +3662 4 4.4436326 0.44363260269165039 0.19680988617096773 +3663 6 6.863979 0.86397886276245117 0.74645947530029844 +3664 8 6.80742931 1.192570686340332 1.4222248419182506 +3665 8 6.844641 1.1553587913513184 1.3348539367527792 +3666 7 5.95530224 1.0446977615356445 1.0913934129575864 +3667 8 7.26183653 0.73816347122192383 0.54488531024639997 +3669 7 6.904336 0.095664024353027344 0.0091516055554166087 +3670 6 5.6326046 0.36739540100097656 0.13497938067666837 +3671 7 6.716537 0.2834630012512207 0.08035127307834955 +3672 8 6.25013828 1.7498617172241211 3.0620160294065499 +3673 7 6.419122 0.58087778091430664 0.33741899635992922 +3674 5 5.183054 0.18305397033691406 0.033508756056107813 +3675 6 5.74832344 0.25167655944824219 0.063341090575704584 +3676 7 6.419122 0.58087778091430664 0.33741899635992922 +3678 5 5.605777 0.60577678680419922 0.36696551543082023 +3682 7 6.35266447 0.64733552932739258 0.41904328752957554 +3683 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3685 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3686 5 4.976153 0.023847103118896484 0.00056868432716328243 +3689 8 7.283064 0.71693611145019531 0.51399738790132687 +3690 7 6.09959555 0.90040445327758789 0.81072817948211195 +3691 6 6.28709745 0.28709745407104492 0.082424948134075748 +3692 7 6.131696 0.86830377578735352 0.75395144704657469 +3693 7 7.00987864 0.0098786354064941406 9.7587437494439655E-05 +3694 5 5.605777 0.60577678680419922 0.36696551543082023 +3695 6 6.348696 0.34869623184204102 0.12158906210083842 +3696 7 6.35266447 0.64733552932739258 0.41904328752957554 +3700 5 5.18188858 0.18188858032226563 0.033083455651649274 +3701 5 5.09758472 0.097584724426269531 0.0095227784413509653 +3705 6 5.87677574 0.12322425842285156 0.015184217863861704 +3707 6 6.29291725 0.29291725158691406 0.085800516277231509 +3708 5 4.619965 0.3800349235534668 0.14442654312028935 +3709 5 5.35854626 0.35854625701904297 0.12855541842236562 +3710 5 4.773655 0.22634506225585938 0.051232087207608856 +3711 6 5.87677574 0.12322425842285156 0.015184217863861704 +3712 5 5.613295 0.61329507827758789 0.37613085303951266 +3713 5 4.951788 0.048212051391601563 0.0023244018993864302 +3715 6 5.41483 0.58516979217529297 0.34242368567447556 +3717 6 5.635741 0.36425876617431641 0.13268444873483531 +3719 5 5.69777346 0.69777345657348633 0.48688779669851101 +3722 5 5.10440445 0.10440444946289063 0.010900289067649283 +3725 6 6.60588837 0.60588836669921875 0.36710071290144697 +3726 7 6.394304 0.60569620132446289 0.36686788829888428 +3727 7 6.48175955 0.51824045181274414 0.26857316589507718 +3729 5 5.45680952 0.45680952072143555 0.20867493822174765 +3732 5 5.45680952 0.45680952072143555 0.20867493822174765 +3736 4 6.64277124 2.6427712440490723 6.9842398483726811 +3737 5 5.82993937 0.82993936538696289 0.6887993502189147 +3740 7 6.85790253 0.14209747314453125 0.02019169187406078 +3742 7 6.85790253 0.14209747314453125 0.02019169187406078 +3743 7 6.85790253 0.14209747314453125 0.02019169187406078 +3746 5 6.410911 1.4109110832214355 1.9906700847570846 +3747 6 5.903495 0.096505165100097656 0.0093132468909971067 +3751 5 5.30141163 0.30141162872314453 0.090848969929538725 +3752 5 5.49193048 0.49193048477172852 0.24199560184774782 +3754 8 7.51627445 0.48372554779052734 0.23399040558524575 +3755 6 6.62061739 0.62061738967895508 0.38516594437191998 +3756 5 5.30141163 0.30141162872314453 0.090848969929538725 +3758 5 5.33939171 0.33939170837402344 0.11518673171303817 +3760 6 6.52007627 0.52007627487182617 0.27047933168455529 +3761 7 6.4862113 0.51378870010375977 0.26397882835431119 +3763 5 6.282187 1.2821869850158691 1.6440034645440846 +3765 5 5.128152 0.12815189361572266 0.016422907837295497 +3768 6 5.7956624 0.20433759689331055 0.041753853504133076 +3770 4 6.34593534 2.3459353446960449 5.5034126414941511 +3773 5 5.937312 0.93731212615966797 0.87855402184595732 +3774 5 5.42767525 0.42767524719238281 0.18290611706106574 +3775 6 6.66805124 0.66805124282836914 0.44629246304452863 +3777 6 6.66805124 0.66805124282836914 0.44629246304452863 +3780 5 5.42767525 0.42767524719238281 0.18290611706106574 +3781 6 6.38605833 0.38605833053588867 0.14904103457615747 +3783 5 5.32522774 0.32522773742675781 0.10577308119172812 +3784 6 5.75775862 0.24224138259887695 0.058680887443415486 +3787 5 5.47676039 0.4767603874206543 0.22730046701349238 +3788 5 5.52795649 0.52795648574829102 0.27873805084368541 +3789 6 5.364557 0.63544321060180664 0.40378807389993199 +3791 5 5.39469528 0.39469528198242188 0.15578436561918352 +3792 6 5.909566 0.090434074401855469 0.0081783218129203306 +3793 6 5.29336739 0.70663261413574219 0.49932965136031271 +3798 5 5.59243059 0.59243059158325195 0.35097400584368188 +3800 5 5.20580673 0.20580673217773438 0.042356411009677686 +3801 6 5.628341 0.3716588020324707 0.13813026512821125 +3805 6 5.628341 0.3716588020324707 0.13813026512821125 +3808 6 5.647771 0.35222911834716797 0.12406535181162326 +3809 6 5.84592 0.15407991409301758 0.023740619926911677 +3815 7 6.376214 0.62378597259521484 0.38910893960655812 +3820 5 5.81555 0.81554985046386719 0.66512155859163613 +3821 6 6.02812147 0.028121471405029297 0.00079081715398388042 +3823 5 5.43096447 0.43096446990966797 0.18573037432452111 +3824 7 6.106088 0.89391183853149414 0.79907837506675605 +3830 7 5.819285 1.1807150840759277 1.3940881097644251 +3833 6 5.623856 0.3761439323425293 0.14148425783810126 +3834 5 5.299482 0.29948186874389648 0.089689389706336442 +3838 5 5.299482 0.29948186874389648 0.089689389706336442 +3839 5 5.062541 0.062541007995605469 0.0039113776811063872 +3841 6 6.151886 0.151885986328125 0.023069352842867374 +3843 7 6.883123 0.11687707901000977 0.013660251597912065 +3848 6 5.52939653 0.47060346603393555 0.22146762224315353 +3850 6 6.316198 0.31619787216186523 0.099981094359691269 +3853 7 7.27425861 0.27425861358642578 0.075217787126348412 +3854 6 7.09188 1.0918798446655273 1.1922015951868161 +3855 6 6.427566 0.4275660514831543 0.18281272838089535 +3860 5 5.274571 0.27457094192504883 0.075389202149608536 +3862 6 5.437691 0.56230878829956055 0.31619117339892 +3863 6 5.437691 0.56230878829956055 0.31619117339892 +3866 6 5.87392473 0.12607526779174805 0.015894973148760982 +3869 6 5.405648 0.59435176849365234 0.35325402471153211 +3870 6 5.75473547 0.24526453018188477 0.060154689765340663 +3872 4 5.027593 1.0275931358337402 1.0559476528126197 +3875 7 6.12440825 0.87559175491333008 0.76666092127220509 +3876 5 5.308399 0.30839920043945313 0.095110066831693985 +3886 6 6.642862 0.64286184310913086 0.41327134932566878 +3888 6 5.67370367 0.32629632949829102 0.1064692946440573 +3889 6 5.64668274 0.3533172607421875 0.12483308673836291 +3891 5 5.865996 0.86599588394165039 0.74994887100388041 +3893 5 4.624341 0.37565898895263672 0.14111967598091724 +3894 6 6.324618 0.32461786270141602 0.10537675678483538 +3897 6 6.015486 0.015485763549804688 0.00023980887272045948 +3900 5 4.624341 0.37565898895263672 0.14111967598091724 +3903 6 6.194684 0.19468402862548828 0.037901871001849941 +3904 7 6.61869669 0.38130331039428711 0.14539221451764206 +3907 7 6.946438 0.053562164306640625 0.002868905445211567 +3912 7 7.01307535 0.013075351715087891 0.00017096482247325184 +3916 6 6.58867741 0.58867740631103516 0.34654108870108757 +3918 7 6.268551 0.73144912719726563 0.53501782567764167 +3919 6 6.237363 0.23736286163330078 0.056341128082749492 +3921 5 5.30553961 0.30553960800170898 0.093354452057837989 +3924 5 4.881786 0.11821413040161133 0.013974580626609168 +3929 5 5.26826143 0.26826143264770508 0.071964196246199208 +3934 6 6.38188839 0.38188838958740234 0.14583874210165959 +3935 5 5.359629 0.35962915420532227 0.12933312855443546 +3938 6 6.10134935 0.1013493537902832 0.010271691513707992 +3939 6 6.249502 0.24950218200683594 0.062251338826172287 +3948 5 5.736434 0.73643398284912109 0.54233501109501958 +3955 6 5.976232 0.023767948150634766 0.00056491535929126258 +3957 5 6.780936 1.7809357643127441 3.1717321966082181 +3958 6 5.82819653 0.17180347442626953 0.029516433824937849 +3961 5 4.857042 0.14295816421508789 0.020437036715748036 +3964 5 5.03904772 0.039047718048095703 0.0015247242847635789 +3966 6 5.764548 0.23545217514038086 0.055437726778336582 +3968 6 5.10690451 0.89309549331665039 0.79761956018251112 +3969 6 6.148906 0.14890623092651367 0.022173065608740217 +3971 6 6.148906 0.14890623092651367 0.022173065608740217 +3972 6 5.454913 0.54508686065673828 0.29711968566061842 +3974 6 5.10690451 0.89309549331665039 0.79761956018251112 +3975 7 6.77839375 0.22160625457763672 0.049109332067928335 +3976 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3977 6 6.793038 0.79303789138793945 0.62890909717702925 +3979 6 6.155224 0.15522384643554688 0.024094442502246238 +3980 5 5.886582 0.8865818977355957 0.78602746139245028 +3981 7 6.80097628 0.19902372360229492 0.039610442556522685 +3983 6 5.608051 0.39194917678833008 0.15362415718504963 +3984 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3986 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3987 6 5.70724154 0.29275846481323242 0.085707518719800646 +3988 6 5.9042244 0.095775604248046875 0.0091729663690784946 +3989 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3991 5 5.926727 0.9267268180847168 0.85882259535742378 +3992 7 6.098081 0.90191888809204102 0.8134576806971836 +3998 6 5.93369 0.066309928894042969 0.0043970066699330346 +3999 6 5.93369 0.066309928894042969 0.0043970066699330346 +4000 6 5.93369 0.066309928894042969 0.0043970066699330346 +4001 5 5.49348354 0.49348354339599609 0.24352600760266796 +4005 6 6.2540493 0.25404930114746094 0.064541047413513297 +4007 5 5.49348354 0.49348354339599609 0.24352600760266796 +4008 6 5.61225367 0.38774633407592773 0.15034721958932096 +4012 6 5.93369 0.066309928894042969 0.0043970066699330346 +4013 6 5.200166 0.79983377456665039 0.63973406693753532 +4016 5 5.1244154 0.12441539764404297 0.015479191170925333 +4020 4 4.586666 0.58666610717773438 0.34417712131107692 +4023 6 6.271843 0.27184295654296875 0.073898593022022396 +4026 6 6.271843 0.27184295654296875 0.073898593022022396 +4028 6 6.18963432 0.18963432312011719 0.035961176505225012 +4030 5 6.190148 1.190147876739502 1.4164519685075447 +4036 5 5.464335 0.46433496475219727 0.21560695949142428 +4038 5 5.17922926 0.1792292594909668 0.032123127457680312 +4040 5 5.52691 0.52690982818603516 0.27763396703903709 +4041 5 5.26324558 0.26324558258056641 0.069298236748181807 +4042 7 6.8913846 0.10861539840698242 0.01179730477110752 +4045 7 6.8913846 0.10861539840698242 0.01179730477110752 +4046 7 6.91408825 0.085911750793457031 0.0073808289243970648 +4048 6 6.34028769 0.34028768539428711 0.11579570883100132 +4057 6 6.27755642 0.27755641937255859 0.077037565934915619 +4058 6 6.34028769 0.34028768539428711 0.11579570883100132 +4060 5 5.11373043 0.11373043060302734 0.012934610845150019 +4061 5 5.11373043 0.11373043060302734 0.012934610845150019 +4062 6 6.122509 0.12250900268554688 0.015008455739007331 +4063 5 5.579146 0.57914590835571289 0.33540998316516379 +4065 8 7.120815 0.87918519973754883 0.77296661543755363 +4067 5 5.2989316 0.29893159866333008 0.089360100679414245 +4068 6 6.5147295 0.51472949981689453 0.26494645798175043 +4069 6 5.64842272 0.3515772819519043 0.12360658518468881 +4072 7 6.107794 0.89220619201660156 0.7960318890727649 +4073 5 4.71371031 0.28628969192504883 0.081961787702539368 +4074 4 5.083258 1.0832581520080566 1.1734482238919099 +4076 5 5.92422056 0.92422056198120117 0.85418364718884732 +4077 6 6.005199 0.0051989555358886719 2.7029138664147467E-05 +4079 6 5.716552 0.28344821929931641 0.080342893023953366 +4080 6 5.704811 0.29518890380859375 0.087136488931719214 +4081 6 5.569051 0.43094921112060547 0.18571722256547218 +4083 5 4.93252039 0.067479610443115234 0.0045534978255545866 +4084 8 5.853612 2.146388053894043 4.6069816778990571 +4089 6 5.53380537 0.46619462966918945 0.2173374327323927 +4090 6 5.56470728 0.43529272079467773 0.18947975277683327 +4092 6 5.215562 0.78443813323974609 0.61534318488065765 +4093 6 5.03059769 0.96940231323242188 0.93974084490037058 +4095 6 5.03059769 0.96940231323242188 0.93974084490037058 +4098 5 6.015106 1.015106201171875 1.0304405996575952 +4104 7 6.56624937 0.43375062942504883 0.18813960852662603 +4106 5 6.116082 1.1160821914672852 1.2456394581104178 +4110 5 5.31600857 0.31600856781005859 0.0998614149293644 +4113 6 6.51928663 0.5192866325378418 0.26965860673249153 +4114 6 5.713825 0.28617477416992188 0.081896001371205784 +4115 6 5.93225 0.067749977111816406 0.0045900593986516469 +4116 6 5.14707851 0.85292148590087891 0.72747506111136317 +4117 6 5.14707851 0.85292148590087891 0.72747506111136317 +4118 8 6.23626661 1.7637333869934082 3.1107554603952394 +4121 6 5.7118 0.28819990158081055 0.083059183271188886 +4123 6 6.95849562 0.9584956169128418 0.91871384764112918 +4124 7 6.216066 0.78393411636352539 0.61455269879866137 +4127 5 5.599305 0.59930515289306641 0.3591666662841817 +4129 7 5.934724 1.0652761459350586 1.1348132670982523 +4130 6 5.946668 0.053331851959228516 0.0028442864334010665 +4135 5 6.103442 1.1034421920776367 1.2175846712571001 +4142 6 6.252783 0.25278282165527344 0.063899154924001778 +4144 6 5.86206245 0.13793754577636719 0.019026766534807393 +4145 6 5.94314146 0.056858539581298828 0.0032328935233181255 +4146 7 5.79053 1.2094697952270508 1.4628171855665641 +4148 6 5.52015257 0.47984743118286133 0.23025355721279084 +4153 5 5.20253658 0.20253658294677734 0.041021067431756819 +4156 5 5.38787365 0.38787364959716797 0.15044596805182664 +4157 7 6.977525 0.022474765777587891 0.00050511509675743582 +4158 7 6.977525 0.022474765777587891 0.00050511509675743582 +4161 7 6.977525 0.022474765777587891 0.00050511509675743582 +4164 5 5.730478 0.73047780990600586 0.53359783076507483 +4167 8 6.453016 1.5469841957092285 2.3931601017741286 +4172 6 6.139005 0.13900518417358398 0.019322441227132003 +4173 5 5.60594034 0.60594034194946289 0.36716369800183202 +4175 7 6.018053 0.98194694519042969 0.96421980316881672 +4176 6 6.32258368 0.32258367538452148 0.10406022762458633 +4182 6 5.23854876 0.76145124435424805 0.57980799752863277 +4183 7 6.72853756 0.27146244049072266 0.073691856597179139 +4185 5 5.278079 0.27807903289794922 0.077327948537458724 +4190 6 5.69684839 0.30315160751342773 0.091900897137975335 +4191 5 5.73005342 0.73005342483520508 0.53297800311361243 +4192 6 5.830771 0.16922903060913086 0.028638464800906149 +4193 6 6.13968849 0.13968849182128906 0.019512874747306341 +4194 6 5.830771 0.16922903060913086 0.028638464800906149 +4197 5 5.29363 0.29363012313842773 0.086218649214288234 +4198 5 5.067099 0.067099094390869141 0.0045022884680747666 +4200 6 6.08601665 0.086016654968261719 0.0073988649319289834 +4201 6 6.131825 0.13182497024536133 0.017377822780190399 +4202 6 6.68126154 0.68126153945922852 0.46411728514635797 +4204 6 5.799505 0.20049476623535156 0.040198151287768269 +4209 6 6.531081 0.53108119964599609 0.28204724061743036 +4214 5 5.212247 0.21224689483642578 0.045048744367704785 +4216 5 5.212247 0.21224689483642578 0.045048744367704785 +4217 4 5.07387161 1.0738716125488281 1.1532002402382204 +4219 5 5.212247 0.21224689483642578 0.045048744367704785 +4220 6 6.067357 0.067357063293457031 0.0045369739755187766 +4224 7 6.365413 0.63458681106567383 0.40270042077850121 +4226 7 5.527336 1.4726638793945313 2.1687389016733505 +4232 6 6.64348555 0.64348554611206055 0.4140736480551368 +4234 6 5.63266134 0.36733865737915039 0.13493768920511684 +4238 5 5.22960567 0.22960567474365234 0.052718765874487872 +4239 7 6.749726 0.2502741813659668 0.062637165858404842 +4242 7 6.697168 0.30283212661743164 0.091707296911636149 +4243 6 6.37470675 0.37470674514770508 0.1404051448591872 +4245 5 5.29424858 0.29424858093261719 0.086582227380858967 +4246 6 6.760518 0.76051807403564453 0.5783877409348861 +4247 6 5.40436745 0.59563255310058594 0.35477813831312233 +4248 6 5.580484 0.41951608657836914 0.17599374689802971 +4250 6 5.488685 0.51131486892700195 0.26144289518583719 +4252 6 5.488685 0.51131486892700195 0.26144289518583719 +4255 5 5.07407 0.074069976806640625 0.0054863614641362801 +4258 6 5.98729753 0.012702465057373047 0.00016135261853378324 +4259 6 6.60455 0.60454988479614258 0.36548056320702926 +4264 6 6.177701 0.17770099639892578 0.031577644121171033 +4265 6 5.908764 0.091236114501953125 0.0083240285894135013 +4267 7 6.820651 0.17934894561767578 0.032166044294172025 +4269 5 5.326494 0.32649421691894531 0.10659847368151532 +4270 6 5.813092 0.18690776824951172 0.034934513832013181 +4273 6 5.918317 0.081683158874511719 0.0066721384437187226 +4276 7 7.633585 0.63358497619628906 0.40142992206165218 +4277 5 5.82106733 0.82106733322143555 0.67415156568335988 +4280 6 5.918317 0.081683158874511719 0.0066721384437187226 +4282 5 5.33614159 0.33614158630371094 0.11299116604277515 +4283 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4284 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4285 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4286 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4287 5 5.39428425 0.39428424835205078 0.15546006849854166 +4289 6 5.64777946 0.35222053527832031 0.12405930547174648 +4290 5 5.33614159 0.33614158630371094 0.11299116604277515 +4293 5 5.299876 0.29987621307373047 0.089925743167441397 +4294 5 6.0532794 1.0532793998718262 1.1093974941943543 +4296 6 6.14942265 0.14942264556884766 0.022327127008793468 +4298 6 6.638621 0.63862085342407227 0.40783659442809039 +4299 6 5.2250433 0.77495670318603516 0.60055789181296859 +4302 6 5.51465559 0.48534440994262695 0.23555919626255672 +4303 6 6.4400897 0.44008970260620117 0.19367894634001459 +4305 6 5.619583 0.3804168701171875 0.1447169950697571 +4309 6 6.74624825 0.74624824523925781 0.55688644352267147 +4312 6 6.4400897 0.44008970260620117 0.19367894634001459 +4313 6 6.62467575 0.62467575073242188 0.39021979355311487 +4316 5 4.71171951 0.28828048706054688 0.083105639219866134 +4317 7 7.19724035 0.19724035263061523 0.038903756705849446 +4320 5 5.338316 0.33831596374511719 0.11445769132478745 +4321 6 5.84775972 0.15224027633666992 0.02317710173906562 +4326 5 5.14266634 0.14266633987426758 0.020353684533120031 +4328 5 5.84332 0.84331989288330078 0.7111884417327019 +4329 5 5.784898 0.78489780426025391 0.61606456313256786 +4330 5 5.43720341 0.43720340728759766 0.191146819343885 +4332 8 7.57545471 0.4245452880859375 0.18023870163597167 +4333 8 7.57545471 0.4245452880859375 0.18023870163597167 +4334 8 7.57545471 0.4245452880859375 0.18023870163597167 +4335 8 7.57545471 0.4245452880859375 0.18023870163597167 +4337 8 7.57545471 0.4245452880859375 0.18023870163597167 +4340 8 7.57545471 0.4245452880859375 0.18023870163597167 +4341 6 5.22670174 0.77329826354980469 0.59799020440914319 +4343 6 6.110325 0.11032485961914063 0.012171574649983086 +4349 5 4.938276 0.061724185943603516 0.0038098751304005418 +4351 6 6.868826 0.86882591247558594 0.75485846618903452 +4352 5 5.5040555 0.50405550003051758 0.25407194711101511 +4353 6 5.86647367 0.13352632522583008 0.017829279528314146 +4354 6 6.25179052 0.25179052352905273 0.063398467739034459 +4355 6 6.868826 0.86882591247558594 0.75485846618903452 +4358 5 5.730952 0.73095178604125977 0.53429051351690759 +4361 6 6.518792 0.51879215240478516 0.26914529739678983 +4362 6 6.90053844 0.90053844451904297 0.81096949005677743 +4363 5 5.40533924 0.40533924102783203 0.16429990031701891 +4365 5 5.36372948 0.36372947692871094 0.13229913238683366 +4366 6 6.705825 0.70582485198974609 0.49818872168634698 +4369 6 6.32576561 0.32576560974121094 0.10612323249006295 +4370 5 5.68760538 0.68760538101196289 0.47280115999660666 +4372 6 6.074046 0.074046134948730469 0.0054828301008456037 +4375 6 5.893817 0.10618305206298828 0.01127484054541128 +4376 5 5.17443466 0.17443466186523438 0.030427451260038652 +4378 5 5.038073 0.038073062896728516 0.0014495581183382455 +4380 6 6.3993845 0.39938449859619141 0.15950797771893122 +4382 6 5.917463 0.082537174224853516 0.0068123851290238235 +4386 6 6.25856447 0.25856447219848633 0.066855586283281809 +4388 6 5.614622 0.38537788391113281 0.14851611340782256 +4393 6 5.164492 0.83550786972045898 0.69807340036481946 +4397 5 5.397777 0.39777708053588867 0.15822660579965486 +4398 5 5.397777 0.39777708053588867 0.15822660579965486 +4399 5 5.684684 0.68468379974365234 0.46879190563140583 +4400 5 5.397777 0.39777708053588867 0.15822660579965486 +4403 5 5.706885 0.70688486099243164 0.4996862067002894 +4406 7 6.86297035 0.13702964782714844 0.018777124383632326 +4408 5 5.08429337 0.084293365478515625 0.0071053714636946097 +4410 5 5.277465 0.27746486663818359 0.076986752218545007 +4411 7 6.745393 0.25460720062255859 0.064824826608855801 +4413 7 6.745393 0.25460720062255859 0.064824826608855801 +4414 7 6.442507 0.55749320983886719 0.3107986790164432 +4415 5 4.99544764 0.0045523643493652344 2.0724021169371554E-05 +4417 6 5.8144083 0.18559169769287109 0.034444278252522054 +4418 6 5.931572 0.06842803955078125 0.004682396596763283 +4419 6 5.931572 0.06842803955078125 0.004682396596763283 +4421 6 5.931572 0.06842803955078125 0.004682396596763283 +4422 6 5.8144083 0.18559169769287109 0.034444278252522054 +4426 6 5.705164 0.29483604431152344 0.086928293025266612 +4428 6 6.468404 0.46840381622314453 0.21940213505240536 +4431 6 6.39723539 0.39723539352416992 0.15779595786830214 +4436 6 6.40647268 0.40647268295288086 0.1652200419869132 +4437 6 5.883115 0.11688518524169922 0.013662146528986341 +4439 5 5.15067148 0.15067148208618164 0.022701895514046555 +4440 5 5.1135397 0.11353969573974609 0.012891262508674117 +4442 5 5.1135397 0.11353969573974609 0.012891262508674117 +4443 5 5.15067148 0.15067148208618164 0.022701895514046555 +4445 6 6.049947 0.049946784973144531 0.0024946813291535364 +4446 6 7.41717434 1.4171743392944336 2.0083831079546144 +4447 6 6.83694124 0.83694124221801758 0.70047064292543837 +4448 5 5.7396884 0.73968839645385742 0.54713892384847895 +4449 6 5.59850836 0.40149164199829102 0.16119553859448388 +4453 6 6.83694124 0.83694124221801758 0.70047064292543837 +4455 5 5.36782932 0.36782932281494141 0.13529841072249837 +4456 5 5.36782932 0.36782932281494141 0.13529841072249837 +4457 5 5.36782932 0.36782932281494141 0.13529841072249837 +4459 5 5.74466658 0.74466657638549805 0.5545283099856988 +4460 6 6.03332043 0.033320426940917969 0.001110250851525052 +4461 6 6.06109 0.061089992523193359 0.0037319871864838206 +4462 6 6.87517548 0.87517547607421875 0.76593211392173544 +4465 5 5.08348751 0.083487510681152344 0.0069701644397355267 +4466 5 6.087393 1.0873928070068359 1.1824231167302059 +4470 6 6.019186 0.019186019897460938 0.000368103359505767 +4472 5 6.441713 1.4417128562927246 2.0785359599997264 +4473 5 5.164528 0.16452789306640625 0.02706942759687081 +4475 6 6.676889 0.67688894271850586 0.45817864077457671 +4478 5 5.13800049 0.13800048828125 0.019044134765863419 +4481 5 5.13800049 0.13800048828125 0.019044134765863419 +4482 6 6.622241 0.62224102020263672 0.38718388722281816 +4486 6 5.631071 0.36892890930175781 0.13610854011858464 +4489 6 6.71970654 0.71970653533935547 0.51797749701017892 +4491 6 6.941034 0.94103384017944336 0.88554468836287015 +4493 6 5.62146044 0.3785395622253418 0.14329220016975341 +4494 6 5.2161746 0.78382539749145508 0.61438225375263755 +4496 6 5.2161746 0.78382539749145508 0.61438225375263755 +4497 5 5.11741972 0.11741971969604492 0.01378739057349776 +4498 5 5.85148859 0.85148859024047852 0.72503281930971752 +4499 6 6.16708231 0.16708230972290039 0.027916498222339214 +4503 7 5.85099649 1.1490035057067871 1.3202090561264868 +4504 5 5.362151 0.36215114593505859 0.13115345250207611 +4507 5 6.42801046 1.4280104637145996 2.0392138844783858 +4509 5 5.371576 0.37157583236694336 0.13806859919918679 +4511 6 6.220184 0.2201838493347168 0.048480927507853266 +4512 6 6.220184 0.2201838493347168 0.048480927507853266 +4514 5 4.845057 0.15494298934936523 0.024007329948517508 +4516 6 6.39635229 0.39635229110717773 0.15709513866590896 +4517 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4520 5 5.155404 0.15540409088134766 0.024150431462658162 +4521 5 5.37260532 0.37260532379150391 0.13883472731777147 +4522 6 5.769117 0.23088312149047852 0.053307015789187062 +4526 6 5.97513342 0.024866580963134766 0.00061834684879613633 +4527 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4528 6 4.818622 1.1813778877258301 1.395653713607544 +4530 6 5.28060865 0.7193913459777832 0.51752390866772657 +4531 6 5.28060865 0.7193913459777832 0.51752390866772657 +4532 6 6.008641 0.0086407661437988281 7.466283955182007E-05 +4533 5 5.92288446 0.92288446426391602 0.85171573437969528 +4534 6 6.12120628 0.12120628356933594 0.014690963176690275 +4535 6 5.525482 0.474517822265625 0.22516716364771128 +4536 6 5.28060865 0.7193913459777832 0.51752390866772657 +4542 5 6.20716143 1.2071614265441895 1.4572387097362025 +4543 5 6.20716143 1.2071614265441895 1.4572387097362025 +4544 6 6.543812 0.54381179809570313 0.29573127174808178 +4549 5 6.20716143 1.2071614265441895 1.4572387097362025 +4551 6 5.996477 0.0035228729248046875 1.2410633644321933E-05 +4552 6 6.598306 0.59830617904663086 0.3579702838853791 +4554 6 6.31430149 0.31430149078369141 0.098785427108850854 +4556 5 6.612007 1.6120071411132813 2.5985670230002142 +4557 6 5.471904 0.52809619903564453 0.27888559543589508 +4558 6 6.156162 0.15616178512573242 0.024386503133655424 +4561 6 6.82648325 0.82648324966430664 0.68307456197567262 +4564 7 6.24290752 0.75709247589111328 0.57318901705093595 +4565 5 6.27208471 1.2720847129821777 1.6181995170029495 +4566 5 6.538882 1.538881778717041 2.368157128867324 +4567 5 6.27208471 1.2720847129821777 1.6181995170029495 +4568 6 6.33394957 0.33394956588745117 0.11152231255641709 +4570 6 6.37727451 0.37727451324462891 0.14233605834397167 +4572 7 6.25381851 0.74618148803710938 0.5567868130892748 +4573 6 6.933242 0.93324184417724609 0.87094033972334728 +4577 6 5.9036355 0.096364498138427734 0.0092861165014710423 +4579 6 6.24599648 0.24599647521972656 0.060514265820529545 +4580 6 6.653771 0.65377092361450195 0.42741642056375895 +4583 6 5.49828339 0.50171661376953125 0.25171956053236499 +4584 6 5.967186 0.03281402587890625 0.0010767602943815291 +4585 6 6.15143728 0.15143728256225586 0.022933250549840523 +4586 6 6.189822 0.18982219696044922 0.036032466458891577 +4587 6 6.33160353 0.3316035270690918 0.1099608991646619 +4590 6 6.05400848 0.05400848388671875 0.0029169163317419589 +4593 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4596 6 6.55546 0.55545997619628906 0.30853578515598201 +4597 6 4.86262274 1.1373772621154785 1.2936270363773019 +4598 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4599 7 6.113054 0.88694620132446289 0.78667356404389466 +4600 6 5.383654 0.61634588241577148 0.37988224677087601 +4602 6 5.796041 0.20395898818969727 0.041599268863365069 +4605 6 6.691703 0.69170284271240234 0.47845282261641842 +4606 5 5.867839 0.86783885955810547 0.75314428615911311 +4607 6 6.22378063 0.22378063201904297 0.050077771266842319 +4608 7 6.26591825 0.73408174514770508 0.53887600855910023 +4609 4 3.5493567 0.45064330101013184 0.20307938474530829 +4613 5 5.46949959 0.46949958801269531 0.22042986314409063 +4615 7 6.76983929 0.23016071319580078 0.052973953898799664 +4617 7 6.599219 0.40078115463256836 0.16062553390861467 +4619 5 4.840745 0.15925502777099609 0.025362163870340737 +4621 7 5.61909 1.3809099197387695 1.9069122064329349 +4623 6 6.6815424 0.68154239654541016 0.46450003828886111 +4624 6 6.745368 0.74536800384521484 0.55557346115620021 +4625 5 5.35424328 0.35424327850341797 0.12548830036485015 +4630 7 6.001225 0.99877500534057617 0.99755151129306796 +4632 6 6.16925764 0.16925764083862305 0.028648148982256316 +4635 6 5.69187737 0.30812263488769531 0.094939558130135993 +4636 5 5.49239874 0.49239873886108398 0.24245651803198598 +4639 6 5.240025 0.75997495651245117 0.57756193452610205 +4641 6 6.17320633 0.17320632934570313 0.03000043252541218 +4642 7 6.39035463 0.60964536666870117 0.3716674731006151 +4644 6 6.755946 0.75594615936279297 0.57145459585535718 +4645 7 6.61975336 0.38024663925170898 0.14458750666221931 +4647 7 6.0159874 0.98401260375976563 0.96828080435807351 +4648 5 4.8469286 0.15307140350341797 0.023430854570506199 +4650 5 4.755362 0.24463796615600586 0.059847734484947068 +4653 7 6.709774 0.29022598266601563 0.084231121014454402 +4654 7 6.45592451 0.54407548904418945 0.29601813777867392 +4655 7 6.45592451 0.54407548904418945 0.29601813777867392 +4658 6 6.760667 0.76066684722900391 0.57861405247331277 +4659 6 5.703014 0.29698610305786133 0.08820074540949463 +4660 6 6.24925375 0.24925374984741211 0.062127431812996292 +4662 6 6.67323542 0.67323541641235352 0.45324592591191504 +4663 7 6.38869667 0.61130332946777344 0.37369176061838516 +4665 6 6.67323542 0.67323541641235352 0.45324592591191504 +4666 5 5.14793062 0.14793062210083008 0.021883468955138596 +4670 6 5.702476 0.29752397537231445 0.088520515921345577 +4671 5 5.34669828 0.34669828414916992 0.12019970023197857 +4672 5 5.34669828 0.34669828414916992 0.12019970023197857 +4675 6 5.8778615 0.12213850021362305 0.014917813234433197 +4676 6 5.78406429 0.21593570709228516 0.04662822959744517 +4677 7 6.76541662 0.23458337783813477 0.055029361157949097 +4680 4 4.34068155 0.34068155288696289 0.11606392047747249 +4681 6 6.104238 0.10423803329467773 0.010865567585142344 +4683 6 5.93819046 0.061809539794921875 0.0038204192096600309 +4687 6 5.817554 0.18244600296020508 0.03328654399615516 +4689 6 5.817554 0.18244600296020508 0.03328654399615516 +4690 6 5.817554 0.18244600296020508 0.03328654399615516 +4691 7 6.33023167 0.66976833343505859 0.44858962047237583 +4696 6 6.19866753 0.19866752624511719 0.039468785984354327 +4697 7 6.837097 0.16290283203125 0.026537332683801651 +4701 6 5.201102 0.79889822006225586 0.63823836601864059 +4706 7 6.528003 0.47199678421020508 0.2227809643047749 +4707 6 5.96410131 0.035898685455322266 0.0012887156174201664 +4708 6 6.331786 0.33178615570068359 0.11008205311463826 +4712 6 6.04505348 0.045053482055664063 0.0020298162453400437 +4713 6 6.10136843 0.10136842727661133 0.01027555804853364 +4715 6 5.3946147 0.60538530349731445 0.36649136569053553 +4716 6 5.74300957 0.25699043273925781 0.066044082519510994 +4718 6 5.63362646 0.36637353897094727 0.13422957005809621 +4719 6 5.3946147 0.60538530349731445 0.36649136569053553 +4722 6 5.84657 0.15342998504638672 0.023540760311334452 +4723 6 5.28928041 0.71071958541870117 0.50512232909773047 +4725 6 6.00947142 0.0094714164733886719 8.9707730012378306E-05 +4727 6 5.84657 0.15342998504638672 0.023540760311334452 +4729 5 5.473 0.47300004959106445 0.22372904691314943 +4730 5 5.29477644 0.29477643966674805 0.086893149382603951 +4733 6 5.96345949 0.036540508270263672 0.0013352087446492078 +4734 6 6.066205 0.066205024719238281 0.0043831052980749519 +4735 6 5.78232241 0.21767759323120117 0.047383534594928278 +4737 7 6.585888 0.41411209106445313 0.17148882396577392 +4738 6 6.43513536 0.4351353645324707 0.18934278546680616 +4743 5 5.96722364 0.9672236442565918 0.93552157800900204 +4746 6 5.36194372 0.63805627822875977 0.40711581418713649 +4748 5 5.523394 0.52339410781860352 0.27394139209923196 +4752 7 6.93892431 0.061075687408447266 0.0037302395924143639 +4754 6 5.938266 0.061734199523925781 0.0038111113908598782 +4756 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4757 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4758 6 6.21085 0.21084976196289063 0.044457622119807638 +4759 6 5.674312 0.32568788528442383 0.10607259862104002 +4762 7 6.27820635 0.72179365158081055 0.52098607546236053 +4764 6 6.137934 0.13793420791625977 0.019025845713485978 +4766 8 6.511512 1.4884881973266602 2.2155971135807704 +4770 6 5.603624 0.39637613296508789 0.15711403878435704 +4771 6 5.603624 0.39637613296508789 0.15711403878435704 +4772 5 5.26272154 0.26272153854370117 0.06902260681476946 +4773 7 5.97403574 1.0259642601013184 1.0526026630052456 +4774 4 5.354617 1.3546171188354492 1.8349875386420536 +4775 6 5.57587957 0.42412042617797852 0.17987813590139012 +4776 6 5.650073 0.34992694854736328 0.12244886931966903 +4783 6 5.35315752 0.64684247970581055 0.41840519355196193 +4784 5 5.531172 0.53117179870605469 0.28214347974062548 +4785 7 6.33343124 0.66656875610351563 0.4443139066133881 +4789 6 5.343524 0.65647602081298828 0.43096076590245502 +4791 6 5.35315752 0.64684247970581055 0.41840519355196193 +4793 6 5.07362556 0.92637443542480469 0.85816959460862563 +4794 5 5.07362556 0.073625564575195313 0.0054207237590162549 +4796 7 6.493846 0.50615406036376953 0.25619193282273045 +4797 6 6.459453 0.45945310592651367 0.21109715654552019 +4800 7 6.00343752 0.99656248092651367 0.99313677839040793 +4801 7 6.493846 0.50615406036376953 0.25619193282273045 +4802 8 6.794405 1.2055950164794922 1.453459343760187 +4803 7 6.66979647 0.33020353317260742 0.10903437331967325 +4804 4 5.978493 1.9784932136535645 3.914435396473209 +4807 6 6.04026556 0.040265560150146484 0.0016213153342050646 +4808 5 5.662127 0.66212701797485352 0.43841218793227199 +4811 6 6.34599733 0.34599733352661133 0.11971415480752512 +4812 7 6.139992 0.86000776290893555 0.7396133522636319 +4813 5 5.13426828 0.13426828384399414 0.018027972046411378 +4815 7 5.8541317 1.1458683013916016 1.3130141641340742 +4816 6 5.439974 0.56002616882324219 0.31362930976683856 +4817 6 6.275693 0.27569293975830078 0.076006597032574064 +4822 6 6.09246 0.092460155487060547 0.0085488803526914126 +4826 6 6.226658 0.22665786743164063 0.051373788868659176 +4828 5 5.32722235 0.32722234725952148 0.10707446454603087 +4829 7 6.61797571 0.38202428817749023 0.1459425567575181 +4830 6 5.84604 0.15396022796630859 0.023703751795437711 +4832 5 5.717937 0.71793699264526367 0.51543352540852538 +4834 7 6.58480167 0.41519832611083984 0.17238965000524331 +4835 6 6.32257843 0.32257843017578125 0.10405684361467138 +4836 5 5.107541 0.10754108428955078 0.011565084810172266 +4837 6 6.83404541 0.83404541015625 0.69563174620270729 +4839 4 4.61754942 0.61754941940307617 0.38136728540507647 +4841 6 5.934297 0.065702915191650391 0.0043168730646812037 +4844 6 5.908849 0.091151237487792969 0.0083085480955560342 +4845 5 5.235182 0.23518180847167969 0.055310483036009828 +4846 6 6.62231541 0.62231540679931641 0.38727646553979866 +4849 5 5.278072 0.27807188034057617 0.077323970636143713 +4850 6 6.022924 0.022923946380615234 0.0005255073176613223 +4851 5 5.278072 0.27807188034057617 0.077323970636143713 +4852 5 6.418775 1.4187750816345215 2.0129227322670431 +4853 5 5.904184 0.90418386459350586 0.81754846099124734 +4854 6 7.04106474 1.0410647392272949 1.0838157912623956 +4856 6 5.81926346 0.18073654174804688 0.032665697523043491 +4859 6 6.03407764 0.034077644348144531 0.0011612858443186269 +4860 6 6.10150051 0.10150051116943359 0.010302353767656314 +4862 6 6.09098768 0.090987682342529297 0.0082787583380650176 +4866 6 5.99347734 0.0065226554870605469 4.254503460288106E-05 +4867 6 4.705145 1.2948551177978516 1.676649776087288 +4869 6 5.51711273 0.48288726806640625 0.23318011366063729 +4871 6 6.68095255 0.68095254898071289 0.46369637396333019 +4872 5 5.705171 0.70517110824584961 0.49726629190467975 +4876 7 6.81956148 0.18043851852416992 0.032558058967197212 +4878 4 4.51450825 0.51450824737548828 0.26471873661739664 +4879 6 5.44779968 0.5522003173828125 0.30492519051767886 +4880 6 5.44779968 0.5522003173828125 0.30492519051767886 +4881 6 5.75216627 0.2478337287902832 0.061421557126095649 +4882 5 5.97157431 0.97157430648803711 0.94395663302771027 +4883 6 6.152341 0.15234088897705078 0.023207746454318112 +4886 7 6.863344 0.13665580749511719 0.018674809722142527 +4887 7 4.93395472 2.0660452842712402 4.2685431166594299 +4888 5 6.00417376 1.004173755645752 1.0083649315276944 +4889 6 5.75216627 0.2478337287902832 0.061421557126095649 +4894 5 5.44779968 0.4477996826171875 0.20052455575205386 +4896 7 6.65991926 0.34008073806762695 0.11565490840462189 diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-out.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-out.txt new file mode 100644 index 0000000000..d01de377a4 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-out.txt @@ -0,0 +1,32 @@ +maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.407028 +L2(avg): 0.274963 +RMS(avg): 0.524369 +Loss-fn(avg): 0.274963 +R Squared: 0.649369 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.407028 (0.0000) +L2(avg): 0.274963 (0.0000) +RMS(avg): 0.524369 (0.0000) +Loss-fn(avg): 0.274963 (0.0000) +R Squared: 0.649369 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-rmse: 0.524369259872456 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-rp.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-rp.txt new file mode 100644 index 0000000000..2c813d3277 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.407028 0.274963 0.524369 0.274963 0.649369 50 0.2 20 10 + 1 Rmse LightGBMR %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Rmse + diff --git a/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE.txt b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE.txt new file mode 100644 index 0000000000..c0618c3738 --- /dev/null +++ b/test/BaselineOutput/SingleDebug/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +0 6 5.680711 0.31928920745849609 0.10194559799947456 +1 6 5.534508 0.46549177169799805 0.21668258951854114 +2 6 5.711945 0.2880549430847168 0.082975650235539433 +3 6 5.78378773 0.21621227264404297 0.046747746841901971 +4 6 5.78378773 0.21621227264404297 0.046747746841901971 +5 6 5.711945 0.2880549430847168 0.082975650235539433 +6 6 5.29387236 0.70612764358520508 0.49861624903519441 +7 6 5.680711 0.31928920745849609 0.10194559799947456 +8 6 5.534508 0.46549177169799805 0.21668258951854114 +9 6 5.93140268 0.068597316741943359 0.0047055918641945027 +10 5 5.76748276 0.76748275756835938 0.58902978316473309 +11 5 5.426882 0.42688179016113281 0.18222806277117343 +12 5 5.87265 0.872650146484375 0.76151827815920115 +13 7 6.908373 0.091627120971679688 0.0083955292975588236 +14 5 5.333195 0.33319520950317383 0.1110190476358639 +15 7 6.38952065 0.61047935485839844 0.37268504270832636 +16 6 4.975053 1.0249471664428711 1.0505166939992705 +17 8 7.327068 0.67293214797973633 0.45283767578462175 +18 6 5.770521 0.22947883605957031 0.052660536199255148 +19 5 5.274254 0.27425384521484375 0.075215171615127474 +20 8 7.327068 0.67293214797973633 0.45283767578462175 +21 7 6.28790045 0.71209955215454102 0.50708577217869788 +22 8 6.739554 1.2604460716247559 1.5887242994742792 +23 5 4.72103071 0.27896928787231445 0.077823863575986252 +24 6 5.4655714 0.53442859649658203 0.28561392475330649 +25 6 5.91425276 0.085747241973876953 0.0073525895061266056 +26 6 5.993135 0.0068650245666503906 4.7128562300713384E-05 +27 6 6.12550831 0.12550830841064453 0.015752335480101465 +28 6 5.638529 0.36147117614746094 0.13066141118542873 +29 7 6.716088 0.28391218185424805 0.080606127005239614 +30 6 5.67022943 0.32977056503295898 0.10874862556215703 +31 6 5.82089472 0.17910528182983398 0.03207870197934426 +32 6 5.84701443 0.15298557281494141 0.023404585489515739 +33 6 6.165793 0.16579294204711914 0.027487299632639406 +34 5 5.41362047 0.4136204719543457 0.17108189481973568 +35 5 5.8876605 0.88766050338745117 0.78794116927406321 +36 5 5.140776 0.14077615737915039 0.019817926486439319 +37 6 5.909733 0.090267181396484375 0.0081481640372658148 +38 5 5.090864 0.090864181518554688 0.0082562994830368552 +39 5 5.090864 0.090864181518554688 0.0082562994830368552 +40 6 6.039511 0.039511203765869141 0.0015611352230280318 +41 6 5.72844 0.2715601921081543 0.073744937937817667 +42 6 5.414184 0.5858159065246582 0.34318027633730708 +43 6 5.830394 0.16960620880126953 0.028766266063939838 +44 6 5.829722 0.17027807235717773 0.028994621925676256 +45 7 5.971135 1.028864860534668 1.0585629012430218 +46 4 4.886475 0.8864750862121582 0.78583807847485332 +47 5 4.886475 0.1135249137878418 0.012887906050536913 +48 6 5.414184 0.5858159065246582 0.34318027633730708 +49 5 6.006579 1.0065789222717285 1.0132011267617145 +50 6 5.98721075 0.012789249420166016 0.00016356490073121677 +51 7 6.01847124 0.98152875900268555 0.96339870474935196 +52 7 6.326056 0.67394399642944336 0.45420051032328956 +53 6 6.149549 0.14954900741577148 0.022364905619042474 +54 6 5.874616 0.12538385391235352 0.015721110821914408 +55 6 6.26666641 0.26666641235351563 0.071110975477495231 +56 6 5.986947 0.013052940368652344 0.00017037925226759398 +57 6 5.81298637 0.18701362609863281 0.034974096346559236 +58 6 5.459394 0.54060602188110352 0.29225487089411217 +59 6 5.94256067 0.057439327239990234 0.0032992763137826842 +60 6 5.57885647 0.42114353179931641 0.17736187437640183 +61 6 5.81298637 0.18701362609863281 0.034974096346559236 +62 5 5.00168037 0.0016803741455078125 2.823657268891111E-06 +63 6 5.459394 0.54060602188110352 0.29225487089411217 +64 6 5.89929 0.10070991516113281 0.010142487011762569 +65 5 5.041315 0.041315078735351563 0.0017069357309082989 +66 7 6.70074558 0.29925441741943359 0.0895532063450446 +67 5 4.98183537 0.018164634704589844 0.00032995395395118976 +68 8 6.812332 1.1876678466796875 1.4105549140367657 +69 5 5.2840085 0.28400850296020508 0.080660829753696817 +70 6 5.4217205 0.57827949523925781 0.3344071746141708 +71 5 5.10868025 0.10868024826049805 0.011811396361963489 +72 5 4.84936762 0.15063238143920898 0.022690114338047351 +73 6 5.2388835 0.76111650466918945 0.57929833367984429 +74 8 6.812332 1.1876678466796875 1.4105549140367657 +75 5 5.2840085 0.28400850296020508 0.080660829753696817 +76 7 6.727201 0.27279901504516602 0.074419302609612714 +77 7 6.238829 0.76117086410522461 0.57938108436269431 +78 5 5.73537064 0.73537063598632813 0.54076997227093671 +79 5 5.206772 0.2067718505859375 0.042754598194733262 +80 6 6.218928 0.21892786026000977 0.047929407998026363 +81 6 5.88246059 0.11753940582275391 0.013815511921166035 +82 5 5.21755552 0.21755552291870117 0.047330405552429511 +83 6 5.64936066 0.35063934326171875 0.12294794904300943 +84 5 5.252364 0.25236415863037109 0.063687668561215105 +85 6 5.436144 0.56385612487792969 0.31793372956235544 +86 6 5.301076 0.69892406463623047 0.48849484812762967 +87 6 5.4996624 0.50033760070800781 0.25033771468224586 +88 5 5.252364 0.25236415863037109 0.063687668561215105 +89 6 5.436144 0.56385612487792969 0.31793372956235544 +90 6 5.301076 0.69892406463623047 0.48849484812762967 +91 5 5.332184 0.332183837890625 0.11034610215574503 +92 7 6.585561 0.41443920135498047 0.17175985161975404 +93 7 6.735927 0.26407289505004883 0.069734493900114103 +94 7 5.97698069 1.0230193138122559 1.0465685164328988 +95 6 5.79194736 0.20805263519287109 0.043285899010697904 +96 6 5.435262 0.56473779678344727 0.31892877911582218 +97 7 5.901606 1.0983939170837402 1.2064691970865624 +98 4 4.174137 0.17413711547851563 0.030323734987177886 +99 6 5.435262 0.56473779678344727 0.31892877911582218 +100 5 5.56997252 0.56997251510620117 0.32486866797648872 +101 5 5.66165352 0.66165351867675781 0.4377853787773347 +102 5 5.32760572 0.3276057243347168 0.10732551061687445 +103 5 5.209554 0.20955419540405273 0.043912960811439916 +104 5 5.56997252 0.56997251510620117 0.32486866797648872 +105 6 5.946871 0.053129196166992188 0.0028227114853507373 +106 5 5.66165352 0.66165351867675781 0.4377853787773347 +107 6 5.82830763 0.1716923713684082 0.029478270386107397 +108 6 5.82830763 0.1716923713684082 0.029478270386107397 +109 5 5.289993 0.2899928092956543 0.084095829443185721 +110 6 5.77061224 0.22938776016235352 0.052618744512301419 +111 5 5.123654 0.12365388870239258 0.015290284191223691 +112 5 5.275713 0.27571296691894531 0.076017640127247432 +113 5 5.38431644 0.38431644439697266 0.14769912943393138 +114 5 5.38431644 0.38431644439697266 0.14769912943393138 +115 4 4.31654739 0.31654739379882813 0.10020225252083037 +116 6 6.187931 0.18793106079101563 0.03531808361003641 +117 6 6.22085571 0.220855712890625 0.048777245916426182 +118 5 5.275713 0.27571296691894531 0.076017640127247432 +119 5 5.423021 0.42302083969116211 0.17894663081301587 +120 5 5.28126144 0.28126144409179688 0.079107999932602979 +121 5 5.637559 0.63755893707275391 0.40648139824133978 +122 5 5.77775145 0.77775144577026367 0.60489731139773539 +123 6 5.84558964 0.15441036224365234 0.023842559968215937 +124 6 5.741732 0.25826787948608398 0.066702297574238401 +125 6 6.478015 0.47801494598388672 0.22849828858397814 +126 5 5.651976 0.65197610855102539 0.42507284612133844 +127 7 6.109841 0.89015913009643555 0.79238327689404287 +128 7 6.330519 0.66948080062866211 0.44820454241039442 +129 6 6.17036 0.17036008834838867 0.029022559702070794 +130 5 5.10576 0.10576009750366211 0.011185198223984116 +131 7 6.109841 0.89015913009643555 0.79238327689404287 +132 5 5.40527 0.40527009963989258 0.16424385366212846 +133 5 5.542647 0.54264688491821289 0.29446564171144018 +134 5 5.281421 0.28142118453979492 0.079197883107781308 +135 5 5.44356537 0.44356536865234375 0.19675023626768962 +136 6 6.00983572 0.0098357200622558594 9.6741389143062406E-05 +137 5 5.241497 0.24149703979492188 0.05832082022971008 +138 7 6.315238 0.68476200103759766 0.46889899806501489 +139 6 5.888501 0.11149883270263672 0.012431989694050571 +140 5 5.400142 0.40014219284057617 0.16011377449126485 +141 5 5.241497 0.24149703979492188 0.05832082022971008 +142 6 5.877977 0.12202310562133789 0.014889638305476183 +143 6 5.74312925 0.25687074661254883 0.065982580465288265 +144 6 5.827976 0.17202377319335938 0.029592178543680348 +145 6 5.97833 0.021669864654541016 0.00046958303414612601 +146 6 5.659865 0.34013509750366211 0.11569188455382573 +147 4 4.66095638 0.66095638275146484 0.43686333989990089 +148 7 6.526716 0.47328376770019531 0.22399752476849244 +149 6 5.537257 0.46274280548095703 0.21413090402438684 +150 7 6.371533 0.62846708297729492 0.3949708743859901 +151 6 5.87430143 0.12569856643676758 0.015800129604258473 +152 6 5.537257 0.46274280548095703 0.21413090402438684 +153 5 5.83971643 0.83971643447875977 0.70512369033372124 +154 6 5.504298 0.49570178985595703 0.24572026446639939 +155 6 5.923597 0.076403141021728516 0.0058374399579861347 +156 6 5.923597 0.076403141021728516 0.0058374399579861347 +157 7 6.4670825 0.53291749954223633 0.28400106131834946 +158 8 7.183791 0.81620883941650391 0.66619686954163626 +159 8 7.183791 0.81620883941650391 0.66619686954163626 +160 7 6.4670825 0.53291749954223633 0.28400106131834946 +161 5 5.491083 0.49108314514160156 0.24116265544216731 +162 5 5.358941 0.35894107818603516 0.1288386976093534 +163 6 5.923597 0.076403141021728516 0.0058374399579861347 +164 5 5.557883 0.55788278579711914 0.31123320268875432 +165 5 5.80627 0.80627012252807617 0.65007151048143896 +166 6 5.4762373 0.52376270294189453 0.27432736899299925 +167 7 6.891704 0.10829591751098633 0.011728005749546355 +168 5 5.28792524 0.28792524337768555 0.082900945774099455 +169 5 4.44647264 0.5535273551940918 0.30639253294816626 +170 6 6.20261526 0.20261526107788086 0.041052944021657822 +171 6 5.813782 0.1862177848815918 0.034677063406206798 +172 4 4.291095 0.29109477996826172 0.084736170924770704 +173 7 6.75989151 0.24010848999023438 0.057652086965390481 +174 5 5.5592947 0.55929470062255859 0.31281056214447744 +175 6 6.190523 0.19052314758300781 0.036299069764936576 +176 4 5.546434 1.5464339256286621 2.3914578863352745 +177 5 5.45982838 0.45982837677001953 0.21144213608295104 +178 4 4.225169 0.22516918182373047 0.050701160443168192 +179 6 5.508888 0.49111223220825195 0.24119122462457199 +180 6 5.42470741 0.57529258728027344 0.33096156097963103 +181 5 5.16715574 0.16715574264526367 0.02794104229928962 +182 5 5.24366856 0.24366855621337891 0.059374365287112596 +183 6 5.64808273 0.35191726684570313 0.12384576270414982 +184 5 5.23220968 0.23220968246459961 0.053921336630310179 +185 5 5.196457 0.1964569091796875 0.038595317164435983 +186 6 5.80372334 0.19627666473388672 0.03852452911905857 +187 5 5.99319839 0.99319839477539063 0.98644305138441268 +188 8 7.04508162 0.95491838455200195 0.91186912115540508 +189 4 5.48485327 1.4848532676696777 2.2047892265093196 +190 6 5.43693161 0.56306838989257813 0.31704601169622038 +191 5 5.24366856 0.24366855621337891 0.059374365287112596 +192 6 6.261883 0.26188278198242188 0.068582591498852707 +193 5 6.014933 1.0149331092834473 1.0300892163197659 +194 5 5.24624968 0.24624967575073242 0.060638902807340855 +195 6 5.24624968 0.75375032424926758 0.56813955130587601 +196 5 5.24624968 0.24624967575073242 0.060638902807340855 +197 5 5.250086 0.25008583068847656 0.062542922711145366 +198 5 5.28796864 0.28796863555908203 0.082925935065759404 +199 5 5.250086 0.25008583068847656 0.062542922711145366 +200 5 5.24837 0.24837017059326172 0.061687741640525928 +201 5 5.28796864 0.28796863555908203 0.082925935065759404 +202 5 5.249635 0.24963521957397461 0.062317742851746516 +203 6 6.88108873 0.8810887336730957 0.77631735660565937 +204 4 5.611186 1.6111860275268555 2.5959204152977691 +205 5 5.433936 0.43393611907958984 0.18830055544185598 +206 5 5.67375565 0.67375564575195313 0.45394667018263135 +207 4 4.45758867 0.45758867263793945 0.20938739332655132 +208 5 5.070417 0.070416927337646484 0.0049585436556753848 +209 6 5.637781 0.36221885681152344 0.13120250022984692 +210 5 5.36824369 0.36824369430541992 0.13560341839570356 +211 7 6.63713264 0.36286735534667969 0.13167271757629351 +212 5 5.67375565 0.67375564575195313 0.45394667018263135 +213 6 6.07086134 0.070861339569091797 0.0050213294455261348 +214 7 6.495806 0.50419378280639648 0.25421137062062371 +215 5 5.224705 0.22470521926879883 0.05049243556663896 +216 5 5.80051565 0.80051565170288086 0.64082530862128806 +217 5 5.224705 0.22470521926879883 0.05049243556663896 +218 5 5.27940559 0.27940559387207031 0.078067485887004295 +219 5 5.922441 0.92244100570678711 0.85089740900934885 +220 5 5.80051565 0.80051565170288086 0.64082530862128806 +221 6 5.132604 0.86739587783813477 0.75237560889058841 +222 7 6.495806 0.50419378280639648 0.25421137062062371 +223 6 5.823209 0.17679119110107422 0.031255125250936544 +224 6 5.77888727 0.22111272811889648 0.048890838536181036 +225 5 5.44676161 0.4467616081237793 0.19959593449334534 +226 6 5.878103 0.12189722061157227 0.014858932392826318 +227 6 5.50031567 0.49968433380126953 0.24968443344641855 +228 6 5.878103 0.12189722061157227 0.014858932392826318 +229 5 5.44676161 0.4467616081237793 0.19959593449334534 +230 4 4.546661 0.5466609001159668 0.29883813971559903 +231 6 5.757604 0.24239587783813477 0.058755761592919953 +232 6 5.72927952 0.27072048187255859 0.073289579305310326 +233 6 6.163166 0.16316604614257813 0.026623158613801934 +234 6 6.163166 0.16316604614257813 0.026623158613801934 +235 6 6.163166 0.16316604614257813 0.026623158613801934 +236 6 6.163166 0.16316604614257813 0.026623158613801934 +237 6 5.487222 0.51277780532836914 0.26294107763737884 +238 7 6.68565941 0.31434059143066406 0.098810007420979673 +239 6 5.802817 0.19718313217163086 0.038881187613014845 +240 5 5.11719465 0.11719465255737305 0.013734586588043385 +241 5 5.726284 0.72628402709960938 0.52748848802002613 +242 7 6.105395 0.89460515975952148 0.80031839186835896 +243 6 5.960915 0.039084911346435547 0.0015276302949587262 +244 5 5.216609 0.21660900115966797 0.046919459383389039 +245 6 6.00468969 0.0046896934509277344 2.1993224663674482E-05 +246 7 6.8084445 0.19155550003051758 0.03669350959194162 +247 7 6.10422945 0.89577054977416992 0.80240487784271863 +248 7 6.269913 0.7300868034362793 0.53302674055180432 +249 5 5.307523 0.30752277374267578 0.094570256370388961 +250 4 5.00461149 1.0046114921569824 1.0092442501738788 +251 3 4.74934769 1.7493476867675781 3.0602173291990766 +252 5 5.216609 0.21660900115966797 0.046919459383389039 +253 3 4.21514 1.2151398658752441 1.4765648936393063 +254 6 5.52048063 0.47951936721801758 0.22993882353716799 +255 8 6.49816942 1.5018305778503418 2.2554950845662916 +256 7 5.884387 1.1156129837036133 1.2445923294080785 +257 7 5.884387 1.1156129837036133 1.2445923294080785 +258 6 6.539793 0.53979301452636719 0.29137649853146286 +259 4 4.220551 0.2205510139465332 0.048642749752843883 +260 6 6.21442842 0.21442842483520508 0.045979549377307194 +261 5 5.38486671 0.38486671447753906 0.14812238791273558 +262 5 5.504349 0.5043492317199707 0.2543681475365247 +263 6 5.68215 0.31785011291503906 0.10102869428010308 +264 6 5.6343627 0.36563730239868164 0.13369063690538496 +265 5 5.38486671 0.38486671447753906 0.14812238791273558 +266 6 5.274923 0.72507715225219727 0.52573687671815605 +267 5 5.280154 0.28015422821044922 0.078486391584192461 +268 6 5.36846256 0.63153743743896484 0.39883953488697443 +269 6 5.36846256 0.63153743743896484 0.39883953488697443 +270 6 5.274923 0.72507715225219727 0.52573687671815605 +271 5 5.087133 0.087132930755615234 0.0075921476220628392 +272 5 5.316086 0.3160858154296875 0.099910242715850472 +273 5 4.99754 0.0024600028991699219 6.0516142639244208E-06 +274 5 5.4562726 0.45627260208129883 0.20818468741003926 +275 6 5.997397 0.0026030540466308594 6.7758903696812922E-06 +276 6 5.95126629 0.048733711242675781 0.0023749746114845038 +277 5 5.10343027 0.10343027114868164 0.010697820989889806 +278 4 4.91050863 0.91050863265991211 0.82902597014822277 +279 7 6.508873 0.49112701416015625 0.24120574403787032 +280 8 6.665929 1.334071159362793 1.7797458582435866 +281 8 7.08416 0.91584014892578125 0.83876317838439718 +282 4 4.9356513 0.93565130233764648 0.87544335956613395 +283 5 5.27014065 0.27014064788818359 0.072975969641447591 +284 5 5.23520041 0.23520040512084961 0.055319230569011779 +285 5 5.231636 0.23163604736328125 0.053655258438084275 +286 6 5.39945173 0.60054826736450195 0.36065822143450532 +287 7 6.163166 0.83683395385742188 0.70029106632864568 +288 7 6.163166 0.83683395385742188 0.70029106632864568 +289 7 6.163166 0.83683395385742188 0.70029106632864568 +290 7 6.163166 0.83683395385742188 0.70029106632864568 +291 6 5.971399 0.028601169586181641 0.00081802690169752168 +292 5 5.279406 0.27940607070922852 0.078067752349170405 +293 7 5.74141073 1.2585892677307129 1.5840469448469321 +294 3 3.64403057 0.64403057098388672 0.41477537636183115 +295 6 5.698216 0.30178403854370117 0.091073605919746115 +296 5 5.033449 0.033449172973632813 0.0011188471726200078 +297 7 6.434052 0.5659480094909668 0.32029714944678744 +298 6 5.95223331 0.047766685485839844 0.0022816562423031428 +299 6 5.994336 0.0056638717651367188 3.207944337191293E-05 +300 6 5.8504715 0.14952850341796875 0.022358773334417492 +301 6 5.46959 0.53040981292724609 0.2813345696495162 +302 6 5.8504715 0.14952850341796875 0.022358773334417492 +303 6 5.84660339 0.1533966064453125 0.023530518868938088 +304 6 5.49118376 0.50881624221801758 0.25889396834486433 +305 6 5.49118376 0.50881624221801758 0.25889396834486433 +306 5 5.209182 0.20918178558349609 0.043757019419899734 +307 6 5.46011972 0.53988027572631836 0.29147071211832554 +308 7 6.02967453 0.97032546997070313 0.94153151767386589 +309 6 5.84821558 0.15178442001342773 0.023038510158812642 +310 7 6.60169029 0.39830970764160156 0.15865062320153811 +311 8 7.12271929 0.87728071212768555 0.76962144787125908 +312 6 6.070884 0.070884227752685547 0.0050245737440945959 +313 6 5.46675158 0.5332484245300293 0.28435388226375835 +314 5 5.307043 0.30704307556152344 0.094275450250279391 +315 6 5.632986 0.36701393127441406 0.13469922574950033 +316 6 6.04914 0.049139976501464844 0.002414737290564517 +317 5 6.03052044 1.0305204391479492 1.0619723755016821 +318 7 6.39483166 0.60516834259033203 0.36622872287352948 +319 6 6.043684 0.043684005737304688 0.0019082923572568689 +320 7 6.36964655 0.63035345077514648 0.39734547290413502 +321 5 6.03052044 1.0305204391479492 1.0619723755016821 +322 6 6.04914 0.049139976501464844 0.002414737290564517 +323 6 5.951385 0.048614978790283203 0.0023634161627796857 +324 5 5.121614 0.12161397933959961 0.014789959970812561 +325 5 4.52251625 0.47748374938964844 0.22799073093119659 +326 6 5.72818375 0.27181625366210938 0.073884075754904188 +327 6 5.414321 0.58567905426025391 0.34301995459918544 +328 6 5.475126 0.52487421035766602 0.27549293669858343 +329 5 5.86220741 0.86220741271972656 0.7434016225488449 +330 8 7.05833244 0.94166755676269531 0.886737787459424 +331 5 6.04914 1.0491399765014648 1.1006946902934942 +332 6 6.296459 0.29645919799804688 0.08788805607764516 +333 5 5.67379332 0.67379331588745117 0.45399743253460656 +334 5 5.57425976 0.57425975799560547 0.32977426965317136 +335 6 6.296459 0.29645919799804688 0.08788805607764516 +336 6 6.168834 0.16883420944213867 0.028504990277951947 +337 6 5.571726 0.42827415466308594 0.18341875155238085 +338 5 5.1820116 0.18201160430908203 0.033128224103165849 +339 7 6.845515 0.15448522567749023 0.023865684952625088 +340 7 5.794984 1.2050161361694336 1.4520638884287109 +341 6 5.49368334 0.5063166618347168 0.25635656205145096 +342 6 5.494451 0.50554895401000977 0.25557974490061497 +343 5 5.40403748 0.4040374755859375 0.16324628167785704 +344 6 5.93613958 0.063860416412353516 0.0040781527843591903 +345 6 5.949069 0.050930976867675781 0.0025939644046957255 +346 7 6.168058 0.83194208145141602 0.69212762688971452 +347 6 6.40999 0.40998983383178711 0.16809166384541641 +348 6 5.99639034 0.0036096572875976563 1.3029625733906869E-05 +349 5 5.87430143 0.87430143356323242 0.76440299673072332 +350 7 6.90420866 0.095791339874267578 0.0091759807949074457 +351 7 6.78889275 0.21110725402832031 0.044566272703377763 +352 6 5.511934 0.48806619644165039 0.23820861210901967 +353 7 6.78889275 0.21110725402832031 0.044566272703377763 +354 6 5.65645266 0.34354734420776367 0.11802477771220765 +355 6 6.17624664 0.17624664306640625 0.031062879192177206 +356 6 6.17624664 0.17624664306640625 0.031062879192177206 +357 6 5.61167145 0.38832855224609375 0.15079906448954716 +358 6 5.29756641 0.70243358612060547 0.49341294291025406 +359 6 5.91268969 0.087310314178466797 0.0076230909619425802 +360 6 5.86551237 0.13448762893676758 0.018086922337033684 +361 5 5.08086443 0.080864429473876953 0.0065390559541356197 +362 6 6.06830931 0.068309307098388672 0.004666161436261973 +363 6 6.17624664 0.17624664306640625 0.031062879192177206 +364 7 6.6356883 0.36431169509887695 0.13272301118581709 +365 7 6.97618628 0.023813724517822266 0.0005670934754107293 +366 6 5.7951417 0.20485830307006836 0.041966924336747979 +367 6 5.22309 0.77690982818603516 0.60358888113205467 +368 6 5.72964668 0.27035331726074219 0.07309091615388752 +369 5 5.901571 0.90157079696655273 0.81282990194290505 +370 6 5.22309 0.77690982818603516 0.60358888113205467 +371 6 5.72964668 0.27035331726074219 0.07309091615388752 +372 5 4.81994867 0.18005132675170898 0.032418480265050675 +373 6 5.73458433 0.26541566848754883 0.07044547707869242 +374 7 6.622659 0.37734079360961914 0.14238607452193719 +375 7 6.622659 0.37734079360961914 0.14238607452193719 +376 7 5.72573566 1.2742643356323242 1.6237495970644886 +377 7 5.80524874 1.1947512626647949 1.4274305796391218 +378 6 5.56888628 0.43111371994018555 0.18585903952066474 +379 7 5.72573566 1.2742643356323242 1.6237495970644886 +380 7 5.80524874 1.1947512626647949 1.4274305796391218 +381 6 5.465357 0.53464317321777344 0.28584332266837009 +382 6 5.3793335 0.62066650390625 0.38522690907120705 +383 6 5.73458433 0.26541566848754883 0.07044547707869242 +384 7 6.5848403 0.41515970230102539 0.17235757841467603 +385 7 6.622659 0.37734079360961914 0.14238607452193719 +386 7 6.736278 0.26372194290161133 0.069549263167800746 +387 5 5.15757132 0.15757131576538086 0.024828719552033363 +388 6 5.866982 0.13301801681518555 0.017693792797444985 +389 7 5.79346561 1.2065343856811523 1.4557252238309957 +390 7 5.79346561 1.2065343856811523 1.4557252238309957 +391 5 4.9216423 0.078357696533203125 0.006139928605989553 +392 6 5.582333 0.41766691207885742 0.17444564944548802 +393 6 6.033824 0.033823966979980469 0.0011440607422628091 +394 5 5.2088747 0.20887470245361328 0.043628641325085482 +395 5 5.09981632 0.099816322326660156 0.0099632982028197148 +396 5 6.02121162 1.0212116241455078 1.0428731812899059 +397 6 6.29722261 0.29722261428833008 0.088341282444389435 +398 5 5.280024 0.28002405166625977 0.078413469511588119 +399 6 6.517963 0.51796293258666992 0.26828559953378317 +400 6 6.29722261 0.29722261428833008 0.088341282444389435 +401 5 5.2088747 0.20887470245361328 0.043628641325085482 +402 5 5.03644276 0.036442756652832031 0.0013280745124575333 +403 5 5.31974745 0.3197474479675293 0.10223843048174786 +404 6 6.64804 0.64803981781005859 0.41995560546729394 +405 5 5.09981632 0.099816322326660156 0.0099632982028197148 +406 7 7.076631 0.076631069183349609 0.0058723207641833142 +407 5 5.05094671 0.050946712493896484 0.0025955675139357481 +408 6 5.99687767 0.0031223297119140625 9.7489428299013525E-06 +409 5 6.02121162 1.0212116241455078 1.0428731812899059 +410 6 5.5693655 0.43063449859619141 0.18544607138119318 +411 6 5.84123039 0.15876960754394531 0.025207788279658416 +412 5 5.79458427 0.79458427429199219 0.63136416895213188 +413 5 5.79458427 0.79458427429199219 0.63136416895213188 +414 6 5.5693655 0.43063449859619141 0.18544607138119318 +415 6 5.84123039 0.15876960754394531 0.025207788279658416 +416 6 5.82386971 0.17613029479980469 0.031021880746266106 +417 5 5.18994951 0.18994951248168945 0.036080817292031497 +418 6 5.82386971 0.17613029479980469 0.031021880746266106 +419 6 5.795103 0.20489692687988281 0.041982750644820044 +420 7 6.7393136 0.26068639755249023 0.067957397868894986 +421 6 6.021837 0.021837234497070313 0.0004768648104800377 +422 6 6.021837 0.021837234497070313 0.0004768648104800377 +423 6 6.021837 0.021837234497070313 0.0004768648104800377 +424 7 5.91769934 1.0823006629943848 1.1713747251180848 +425 6 6.021837 0.021837234497070313 0.0004768648104800377 +426 6 6.021837 0.021837234497070313 0.0004768648104800377 +427 5 5.31993246 0.31993246078491211 0.10235677946388932 +428 5 5.541713 0.54171323776245117 0.29345323196707795 +429 5 5.29234028 0.29234027862548828 0.08546283850682812 +430 5 5.31993246 0.31993246078491211 0.10235677946388932 +431 5 4.993221 0.0067791938781738281 4.5957469637869508E-05 +432 7 6.71159029 0.28840970993041992 0.08318016078214896 +433 4 4.595131 0.59513092041015625 0.35418081242823973 +434 8 6.86301756 1.1369824409484863 1.2927290710251782 +435 7 6.96430874 0.035691261291503906 0.0012738661325784051 +436 5 5.21484661 0.21484661102294922 0.046159066268046445 +437 8 7.18364525 0.81635475158691406 0.66643508043853217 +438 7 6.71159029 0.28840970993041992 0.08318016078214896 +439 5 4.960922 0.039078235626220703 0.001527108499658425 +440 7 6.418142 0.58185815811157227 0.33855891616099143 +441 6 5.929764 0.0702362060546875 0.004933124640956521 +442 8 7.54107952 0.45892047882080078 0.21060800588111306 +443 6 5.76989126 0.23010873794555664 0.052950031278896859 +444 6 5.795 0.20499992370605469 0.042024968719488243 +445 3 5.248956 2.2489562034606934 5.0578040050843356 +446 5 6.340478 1.3404779434204102 1.7968811167966123 +447 6 5.84383631 0.15616369247436523 0.024387098847228117 +448 6 5.84383631 0.15616369247436523 0.024387098847228117 +449 7 6.47833157 0.52166843414306641 0.27213795518127881 +450 5 4.94290733 0.057092666625976563 0.003259572582464898 +451 5 5.55804157 0.55804157257080078 0.31141039671729231 +452 7 6.32008076 0.67991924285888672 0.46229017680980178 +453 7 6.45778561 0.54221439361572266 0.29399644864406582 +454 7 6.47833157 0.52166843414306641 0.27213795518127881 +455 6 5.84383631 0.15616369247436523 0.024387098847228117 +456 7 6.69056559 0.30943441390991211 0.095749656511770809 +457 5 5.666873 0.66687297821044922 0.44471956906727428 +458 6 5.436703 0.56329679489135742 0.31730327913487599 +459 5 4.90243149 0.097568511962890625 0.009519614526652731 +460 5 5.666873 0.66687297821044922 0.44471956906727428 +461 5 5.6149745 0.6149744987487793 0.37819363411131235 +462 5 5.289179 0.28917884826660156 0.08362440628479817 +463 6 5.08662176 0.91337823867797852 0.83425980689048629 +464 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +465 5 5.33792353 0.33792352676391602 0.11419230994056306 +466 6 6.279598 0.27959823608398438 0.078175173621275462 +467 6 5.08662176 0.91337823867797852 0.83425980689048629 +468 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +469 5 5.35536432 0.35536432266235352 0.1262838018212733 +470 6 5.00434446 0.99565553665161133 0.99132994766500815 +471 5 5.415714 0.41571378707885742 0.1728179527674456 +472 6 6.255002 0.25500202178955078 0.065026031116758531 +473 7 6.1227684 0.87723159790039063 0.76953527635487262 +474 6 5.61289 0.38711023330688477 0.14985433273091076 +475 5 5.6727953 0.67279529571533203 0.45265350993668108 +476 7 6.37792349 0.62207651138305664 0.3869791860145142 +477 6 6.137163 0.13716316223144531 0.018813733073329786 +478 6 5.165093 0.83490705490112305 0.69706979032366689 +479 6 6.256819 0.25681877136230469 0.06595588132404373 +480 5 5.14719439 0.14719438552856445 0.021666187131131665 +481 6 6.024329 0.024329185485839844 0.00059190926640440011 +482 5 5.55854845 0.5585484504699707 0.31197637152240532 +483 5 5.14719439 0.14719438552856445 0.021666187131131665 +484 5 4.807844 0.19215583801269531 0.036923866082361201 +485 6 6.0983386 0.098338603973388672 0.0096704810314349743 +486 6 5.87475061 0.12524938583374023 0.015687408651729129 +487 6 6.023153 0.023152828216552734 0.00053605345442520047 +488 6 6.29130173 0.29130172729492188 0.084856696325005032 +489 6 5.48021841 0.51978158950805664 0.2701729007915219 +490 6 5.77609539 0.22390460968017578 0.050133274236031866 +491 7 6.43585968 0.56414031982421875 0.31825430045137182 +492 6 5.79112244 0.2088775634765625 0.043629836523905396 +493 6 6.26251125 0.26251125335693359 0.068912158139028179 +494 6 6.30851841 0.30851840972900391 0.095183609141713532 +495 6 6.354451 0.35445117950439453 0.12563563865205651 +496 4 4.753712 0.75371217727661133 0.56808204617504998 +497 6 6.817308 0.81730794906616211 0.66799228360673624 +498 5 5.29211855 0.29211854934692383 0.085333246872551172 +499 4 4.753712 0.75371217727661133 0.56808204617504998 +500 6 5.484865 0.51513481140136719 0.26536387391752214 +501 6 6.044801 0.044801235198974609 0.0020071506753538415 +502 6 5.19564533 0.80435466766357422 0.64698643139217893 +503 5 5.20786428 0.20786428451538086 0.043207560777091203 +504 6 6.26455355 0.26455354690551758 0.069988579180289889 +505 6 6.26455355 0.26455354690551758 0.069988579180289889 +506 5 4.85467 0.14532995223999023 0.021120795018077843 +507 7 6.225348 0.77465200424194336 0.60008572767605983 +508 6 5.982076 0.017923831939697266 0.00032126375140251184 +509 7 6.225348 0.77465200424194336 0.60008572767605983 +510 6 5.31798172 0.68201828002929688 0.46514893429412041 +511 6 5.64203167 0.35796833038330078 0.12814132555740798 +512 6 6.37156963 0.37156963348388672 0.13806399252734991 +513 6 5.88133144 0.11866855621337891 0.014082226233767869 +514 7 6.026742 0.97325801849365234 0.94723117056219053 +515 6 5.47360754 0.52639245986938477 0.27708902180734185 +516 5 6.01606941 1.0160694122314453 1.0323970504723547 +517 6 5.994919 0.0050811767578125 2.5818357244133949E-05 +518 6 6.21694946 0.216949462890625 0.047067069448530674 +519 5 5.25397635 0.25397634506225586 0.064503983851182056 +520 5 5.16614771 0.16614770889282227 0.027605061170334011 +521 5 5.16614771 0.16614770889282227 0.027605061170334011 +522 6 6.029863 0.029862880706787109 0.00089179164410779777 +523 6 6.17634344 0.17634344100952148 0.031097009187078584 +524 5 4.46065855 0.53934144973754883 0.29088919940500091 +525 6 5.49068642 0.50931358337402344 0.25940032620928832 +526 4 4.83760929 0.83760929107666016 0.7015893244979452 +527 6 6.53003359 0.53003358840942383 0.28093560484217051 +528 6 6.38529253 0.38529253005981445 0.14845033371989302 +529 6 6.527589 0.52758884429931641 0.27834998862908833 +530 6 6.089735 0.089735031127929688 0.00805237581153051 +531 5 5.81951237 0.81951236724853516 0.67160052007329796 +532 6 5.66872072 0.33127927780151367 0.10974595990069247 +533 6 5.66872072 0.33127927780151367 0.10974595990069247 +534 6 5.66872072 0.33127927780151367 0.10974595990069247 +535 5 5.35391045 0.35391044616699219 0.12525260390611948 +536 5 5.35391045 0.35391044616699219 0.12525260390611948 +537 6 5.66872072 0.33127927780151367 0.10974595990069247 +538 5 5.69457865 0.69457864761352539 0.48243949772063388 +539 6 5.44028759 0.55971240997314453 0.31327798187794542 +540 4 5.25917149 1.2591714859008789 1.5855128309058273 +541 5 5.079481 0.079481124877929688 0.0063172492118610535 +542 6 5.75632048 0.24367952346801758 0.05937971015760013 +543 6 5.91034174 0.089658260345458984 0.008038603648174103 +544 6 5.429198 0.57080221176147461 0.3258151649517913 +545 6 6.05427027 0.054270267486572266 0.0029452619330641028 +546 6 5.790551 0.20944881439208984 0.043868805850252102 +547 6 5.43407631 0.56592369079589844 0.32026962380405166 +548 7 6.30033445 0.69966554641723633 0.48953187684332988 +549 5 5.079481 0.079481124877929688 0.0063172492118610535 +550 7 5.43548965 1.5645103454589844 2.4476926210481906 +551 7 6.03222 0.96778011322021484 0.93659834754453186 +552 7 6.296845 0.7031550407409668 0.49442701131943068 +553 7 5.43548965 1.5645103454589844 2.4476926210481906 +554 7 6.296845 0.7031550407409668 0.49442701131943068 +555 7 6.03222 0.96778011322021484 0.93659834754453186 +556 5 5.032953 0.032952785491943359 0.0010858860716780327 +557 6 5.60137033 0.39862966537475586 0.15890561011678983 +558 5 5.41377 0.41377019882202148 0.17120577743321519 +559 6 6.48004532 0.48004531860351563 0.23044350791315082 +560 7 6.00349665 0.99650335311889648 0.9930189327772041 +561 5 5.24001074 0.24001073837280273 0.057605154534257963 +562 6 5.28676558 0.71323442459106445 0.50870334442174681 +563 7 5.429729 1.5702710151672363 2.4657510610743429 +564 5 5.3263216 0.32632160186767578 0.1064857878454859 +565 6 5.754887 0.24511289596557617 0.060080331768631368 +566 6 5.328569 0.67143106460571289 0.450819674517561 +567 5 5.592988 0.59298801422119141 0.3516347850099919 +568 6 5.67043066 0.32956933975219727 0.10861594970469923 +569 6 5.49481869 0.50518131256103516 0.2552081585608903 +570 5 5.04753637 0.047536373138427734 0.0022597067711558338 +571 7 6.6258 0.37419986724853516 0.14002554064882133 +572 5 5.35135746 0.35135746002197266 0.12345206471309211 +573 7 6.7393136 0.26068639755249023 0.067957397868894986 +574 7 6.16289759 0.83710241317749023 0.70074045014757758 +575 6 5.978729 0.021271228790283203 0.00045246517424857302 +576 6 5.980228 0.019772052764892578 0.00039093407053769624 +577 7 6.7393136 0.26068639755249023 0.067957397868894986 +578 7 6.6258 0.37419986724853516 0.14002554064882133 +579 7 6.59008455 0.40991544723510742 0.16803067388195814 +580 5 5.04753637 0.047536373138427734 0.0022597067711558338 +581 5 5.48165464 0.48165464401245117 0.23199119609876107 +582 6 5.431743 0.56825685501098633 0.32291585326697714 +583 6 5.640394 0.35960578918457031 0.12931632361505763 +584 7 6.35053444 0.64946556091308594 0.42180551481214934 +585 6 5.640394 0.35960578918457031 0.12931632361505763 +586 6 5.52043533 0.47956466674804688 0.22998226959316526 +587 7 6.54887772 0.45112228393554688 0.20351131506322417 +588 7 6.77563524 0.2243647575378418 0.050339544425014537 +589 6 5.89532852 0.10467147827148438 0.010956118363537826 +590 5 4.98952246 0.010477542877197266 0.00010977890474350716 +591 6 6.436891 0.43689107894897461 0.19087381486519917 +592 5 5.309803 0.30980300903320313 0.095977904406026937 +593 5 5.04597664 0.045976638793945313 0.0021138513147889171 +594 5 4.88176441 0.11823558807373047 0.013979654287140875 +595 7 5.559344 1.4406561851501465 2.0754902438113731 +596 5 5.309803 0.30980300903320313 0.095977904406026937 +597 6 6.028057 0.028057098388671875 0.00078720076999161392 +598 8 6.58157253 1.4184274673461914 2.0119364801221309 +599 7 6.23756 0.76244020462036133 0.58131506562153845 +600 6 5.6493926 0.35060739517211914 0.12292554554937851 +601 6 5.82520628 0.17479372024536133 0.030552844637213639 +602 5 5.04597664 0.045976638793945313 0.0021138513147889171 +603 5 4.88176441 0.11823558807373047 0.013979654287140875 +604 6 5.64465666 0.35534334182739258 0.12626889058105917 +605 6 5.64465666 0.35534334182739258 0.12626889058105917 +606 5 5.487342 0.48734188079833984 0.23750210878006328 +607 5 5.487342 0.48734188079833984 0.23750210878006328 +608 5 5.295503 0.29550313949584961 0.087322105451903553 +609 6 5.45708036 0.54291963577270508 0.29476173090756674 +610 8 7.10623741 0.89376258850097656 0.79881156460396596 +611 6 5.615421 0.38457918167114258 0.14790114697484569 +612 5 5.25086737 0.25086736679077148 0.062934435720535475 +613 5 5.33452845 0.33452844619750977 0.11190928131532019 +614 5 5.33452845 0.33452844619750977 0.11190928131532019 +615 5 5.25086737 0.25086736679077148 0.062934435720535475 +616 7 6.00642872 0.99357128143310547 0.98718389128862327 +617 6 5.77096748 0.22903251647949219 0.05245589360492886 +618 6 5.84212971 0.15787029266357422 0.024923029305682576 +619 6 5.984556 0.015443801879882813 0.00023851101650507189 +620 5 5.22900248 0.22900247573852539 0.05244213389437391 +621 5 5.36206055 0.362060546875 0.13108783960342407 +622 6 5.93520927 0.064790725708007813 0.0041978381377703045 +623 5 4.71454334 0.28545665740966797 0.081485503259500547 +624 5 5.071442 0.071442127227783203 0.0051039775428307621 +625 8 6.65726042 1.3427395820617676 1.8029495852354103 +626 4 4.52697849 0.52697849273681641 0.27770633180716686 +627 6 5.39603329 0.60396671295166016 0.36477579035363306 +628 6 5.39603329 0.60396671295166016 0.36477579035363306 +629 6 5.55218744 0.44781255722045898 0.20053608640432685 +630 5 5.42956257 0.42956256866455078 0.1845240003976869 +631 5 5.42956257 0.42956256866455078 0.1845240003976869 +632 6 5.772721 0.2272791862487793 0.051655828501907308 +633 5 5.31113052 0.31113052368164063 0.096802202766411938 +634 6 6.38461 0.38461017608642578 0.14792498754923145 +635 6 6.17356 0.17356014251708984 0.030123123070552538 +636 7 6.31279945 0.68720054626464844 0.47224459078643122 +637 5 5.275313 0.27531290054321289 0.075797193205517033 +638 5 5.26560354 0.26560354232788086 0.070545241697118399 +639 5 5.257151 0.25715112686157227 0.066126702046176433 +640 7 6.23770428 0.76229572296142578 0.58109476924528281 +641 4 5.22752 1.2275199890136719 1.5068053234281251 +642 6 5.822799 0.1772007942199707 0.031400121472188403 +643 5 5.47019768 0.47019767761230469 0.22108585603200481 +644 5 5.47785473 0.47785472869873047 0.2283451417397373 +645 5 5.157337 0.15733718872070313 0.024754990954534151 +646 4 4.80251074 0.80251073837280273 0.64402348520366104 +647 6 6.12228966 0.12228965759277344 0.01495476035415777 +648 5 5.202234 0.20223379135131836 0.040898506364328568 +649 7 6.353786 0.64621400833129883 0.41759254456360395 +650 7 6.353786 0.64621400833129883 0.41759254456360395 +651 7 6.353786 0.64621400833129883 0.41759254456360395 +652 7 6.353786 0.64621400833129883 0.41759254456360395 +653 6 5.529214 0.47078609466552734 0.22163954693041887 +654 7 6.675183 0.32481718063354492 0.10550620083472495 +655 6 6.66171551 0.66171550750732422 0.43786741287567565 +656 6 6.07065535 0.070655345916748047 0.0049921779066153249 +657 5 4.939713 0.060286998748779297 0.0036345222181353165 +658 5 5.754849 0.75484895706176758 0.56979694797723823 +659 4 4.11328363 0.11328363418579102 0.012833181774340119 +660 5 5.09369659 0.09369659423828125 0.0087790517718531191 +661 7 7.069395 0.069395065307617188 0.0048156750890484545 +662 4 4.37782669 0.37782669067382813 0.1427530081855366 +663 5 5.09369659 0.09369659423828125 0.0087790517718531191 +664 6 5.83840847 0.16159152984619141 0.026111822518032568 +665 5 5.153395 0.15339517593383789 0.023530079999773079 +666 6 6.53245831 0.53245830535888672 0.28351184694565745 +667 6 5.83840847 0.16159152984619141 0.026111822518032568 +668 6 5.71215439 0.28784561157226563 0.082855096101411618 +669 5 5.498241 0.49824094772338867 0.24824404198830052 +670 6 5.217243 0.78275680541992188 0.61270821643120144 +671 6 6.30048275 0.30048274993896484 0.090289883010882477 +672 8 7.20319748 0.79680252075195313 0.63489425707666669 +673 6 6.011775 0.011775016784667969 0.00013865102027921239 +674 5 5.35568476 0.35568475723266602 0.12651164652766056 +675 6 5.22133827 0.77866172790527344 0.60631408650442609 +676 6 5.413211 0.58678913116455078 0.34432148445284838 +677 7 6.71524572 0.28475427627563477 0.081084997857260532 +678 7 6.71524572 0.28475427627563477 0.081084997857260532 +679 7 6.71524572 0.28475427627563477 0.081084997857260532 +680 5 5.32334 0.32333993911743164 0.1045487162284644 +681 5 4.97009945 0.029900550842285156 0.00089404294067207957 +682 6 5.39260864 0.607391357421875 0.36892426107078791 +683 5 5.29420948 0.29420948028564453 0.086559218289949058 +684 5 5.5085063 0.50850629806518555 0.25857865517195933 +685 5 5.22983646 0.22983646392822266 0.052824800151029194 +686 7 5.97222853 1.0277714729309082 1.0563142005705686 +687 4 4.579601 0.57960081100463867 0.33593710011723488 +688 6 5.6276 0.37239980697631836 0.13868161623599917 +689 7 6.439974 0.56002616882324219 0.31362930976683856 +690 4 5.59999561 1.5999956130981445 2.5599859619333074 +691 6 5.26191568 0.73808431625366211 0.54476845789963591 +692 5 5.24829674 0.24829673767089844 0.061651269938010955 +693 5 5.16820669 0.16820669174194336 0.028293491146769156 +694 6 5.43879366 0.56120634078979492 0.31495255694267144 +695 5 5.37247038 0.37247037887573242 0.13873418313983166 +696 6 6.118032 0.11803197860717773 0.013931547973925262 +697 5 5.424995 0.42499494552612305 0.1806207037227523 +698 5 5.424995 0.42499494552612305 0.1806207037227523 +699 5 5.522417 0.52241706848144531 0.27291959344074712 +700 5 5.177611 0.17761087417602539 0.031545622625571923 +701 7 7.084567 0.084567070007324219 0.0071515893296236754 +702 4 4.96964169 0.96964168548583984 0.94020499823182035 +703 6 5.691428 0.30857181549072266 0.095216565315240587 +704 6 6.480943 0.48094320297241211 0.23130636448536279 +705 5 5.20250845 0.20250844955444336 0.041009672140944531 +706 5 5.320039 0.32003879547119141 0.10242483060665108 +707 6 6.23916864 0.23916864395141602 0.057201640249559205 +708 6 6.148995 0.14899492263793945 0.022199486971885563 +709 5 4.75704765 0.24295234680175781 0.0590258428164816 +710 5 5.37451839 0.37451839447021484 0.14026402779654745 +711 6 6.10724831 0.10724830627441406 0.011502199198730523 +712 6 6.10724831 0.10724830627441406 0.011502199198730523 +713 5 5.6087265 0.60872650146484375 0.37054795358562842 +714 6 6.025354 0.025353908538818359 0.00064282067819476651 +715 7 6.566482 0.4335179328918457 0.18793779813881883 +716 6 5.37237167 0.62762832641601563 0.39391731611976866 +717 5 5.390794 0.39079380035400391 0.15271979439512506 +718 7 6.566482 0.4335179328918457 0.18793779813881883 +719 7 6.615624 0.38437604904174805 0.1477449470769443 +720 5 5.196617 0.19661712646484375 0.038658294419292361 +721 5 5.14307642 0.14307641983032227 0.020470861911462634 +722 6 6.191565 0.19156503677368164 0.036697163314101999 +723 8 6.70217752 1.2978224754333496 1.6843431777399474 +724 7 5.99594545 1.0040545463562012 1.0081255320585569 +725 5 5.34394455 0.34394454956054688 0.11829785317240749 +726 7 6.90710545 0.092894554138183594 0.0086293981885319226 +727 5 5.340127 0.34012699127197266 0.11568637019172456 +728 5 6.005658 1.0056581497192383 1.0113483140967219 +729 5 5.0085516 0.0085515975952148438 7.3129821430484299E-05 +730 6 6.216481 0.21648120880126953 0.046864113764058857 +731 6 5.50056076 0.49943923950195313 0.24943955395428929 +732 7 6.1538806 0.84611940383911133 0.71591804555305316 +733 6 5.917358 0.082642078399658203 0.006829713122215253 +734 5 5.30464649 0.30464649200439453 0.092809485090583621 +735 6 5.54713726 0.45286273956298828 0.20508466088449495 +736 6 5.917358 0.082642078399658203 0.006829713122215253 +737 5 5.30464649 0.30464649200439453 0.092809485090583621 +738 7 6.35726547 0.64273452758789063 0.41310767295362893 +739 6 5.54713726 0.45286273956298828 0.20508466088449495 +740 3 3.93911076 0.93911075592041016 0.88192901188540418 +741 6 6.073226 0.073225975036621094 0.0053620434200638556 +742 6 6.25418758 0.25418758392333984 0.064611327820784936 +743 5 5.543552 0.54355192184448242 0.29544869174083033 +744 5 5.537819 0.53781890869140625 0.28924917854601517 +745 6 6.385117 0.3851170539855957 0.14831514527054424 +746 6 5.829892 0.17010784149169922 0.028936677736965066 +747 6 6.05567837 0.055678367614746094 0.0031000806202428066 +748 6 5.95539427 0.044605731964111328 0.001989671324054143 +749 6 6.11404753 0.11404752731323242 0.013006838486262495 +750 6 6.05567837 0.055678367614746094 0.0031000806202428066 +751 6 6.03684855 0.036848545074462891 0.0013578152741047234 +752 6 6.08775139 0.087751388549804688 0.0077003061924187932 +753 6 5.829892 0.17010784149169922 0.028936677736965066 +754 5 5.335464 0.3354640007019043 0.11253609576692725 +755 7 6.634498 0.36550188064575195 0.13359162475558151 +756 5 5.459274 0.4592738151550293 0.21093243728705602 +757 6 5.965418 0.034582138061523438 0.001195924272906268 +758 7 6.82623148 0.17376852035522461 0.030195498666444109 +759 7 6.87592745 0.12407255172729492 0.015393998092122274 +760 6 5.95539427 0.044605731964111328 0.001989671324054143 +761 6 5.779576 0.22042417526245117 0.048586817040131791 +762 5 5.325914 0.32591390609741211 0.10621987418767276 +763 6 5.965965 0.034035205841064453 0.0011583952366436279 +764 6 5.52306747 0.47693252563476563 0.22746463400835637 +765 6 5.928421 0.0715789794921875 0.0051235503051429987 +766 5 5.19307232 0.19307231903076172 0.037276920375916234 +767 6 5.473008 0.52699184417724609 0.27772040382933483 +768 7 6.3073473 0.69265270233154297 0.47976776604718907 +769 7 6.3073473 0.69265270233154297 0.47976776604718907 +770 7 6.366083 0.63391685485839844 0.40185057887356379 +771 7 6.00737333 0.99262666702270508 0.98530770008460422 +772 7 5.81501532 1.1849846839904785 1.4041887012920142 +773 5 5.39121532 0.39121532440185547 0.15304943004684901 +774 9 6.090269 2.9097309112548828 8.4665339759121707 +775 6 6.3398385 0.33983850479125977 0.11549020933875909 +776 6 6.049326 0.049325942993164063 0.0024330486521648709 +777 5 5.56175232 0.5617523193359375 0.3155656682793051 +778 7 6.200076 0.79992389678955078 0.63987824065497989 +779 8 7.166649 0.83335113525390625 0.69447411462897435 +780 4 4.306471 0.30647087097167969 0.093924394754139939 +781 6 5.39670324 0.60329675674438477 0.36396697669829337 +782 7 6.200076 0.79992389678955078 0.63987824065497989 +783 8 7.166649 0.83335113525390625 0.69447411462897435 +784 5 5.56175232 0.5617523193359375 0.3155656682793051 +785 6 5.8870883 0.11291170120239258 0.012749052268418382 +786 6 5.62655067 0.37344932556152344 0.13946439876235672 +787 6 5.62655067 0.37344932556152344 0.13946439876235672 +788 7 5.87119961 1.1288003921508789 1.274190325319978 +789 6 5.8870883 0.11291170120239258 0.012749052268418382 +790 6 5.62655067 0.37344932556152344 0.13946439876235672 +791 7 6.791107 0.208892822265625 0.043636211194097996 +792 5 5.34000731 0.34000730514526367 0.11560496755214444 +793 7 6.791107 0.208892822265625 0.043636211194097996 +794 5 5.328908 0.32890796661376953 0.10818045050200453 +795 5 5.189716 0.18971586227416992 0.03599210839843181 +796 6 5.31731224 0.68268775939941406 0.46606257683379226 +797 6 5.86112165 0.13887834548950195 0.019287194845901467 +798 6 5.7783494 0.22165060043334961 0.049128988672464402 +799 8 6.69024658 1.30975341796875 1.7154540158808231 +800 6 5.462918 0.53708219528198242 0.2884572844889135 +801 5 5.281977 0.28197717666625977 0.079511128160675071 +802 5 5.42389345 0.42389345169067383 0.17968565838623363 +803 7 5.8122654 1.1877346038818359 1.4107134892583417 +804 6 5.451923 0.54807710647583008 0.30038851464291838 +805 6 5.462918 0.53708219528198242 0.2884572844889135 +806 5 5.32510662 0.32510662078857422 0.1056943148805658 +807 6 5.34558773 0.65441226959228516 0.42825541859292571 +808 6 5.27500248 0.72499752044677734 0.52562140465397533 +809 6 5.34558773 0.65441226959228516 0.42825541859292571 +810 5 5.281977 0.28197717666625977 0.079511128160675071 +811 6 5.31018972 0.68981027603149414 0.47583821691864614 +812 7 5.168549 1.8314509391784668 3.3542125426176881 +813 6 5.58469772 0.41530227661132813 0.1724759809585521 +814 6 5.335502 0.66449785232543945 0.44155739574512154 +815 5 5.2698555 0.26985549926757813 0.072821990484953858 +816 5 5.22790766 0.22790765762329102 0.051941900403335239 +817 5 5.063816 0.063816070556640625 0.0040724908612901345 +818 5 5.2698555 0.26985549926757813 0.072821990484953858 +819 5 5.063816 0.063816070556640625 0.0040724908612901345 +820 9 7.47892332 1.5210766792297363 2.3136742640965622 +821 6 5.18003941 0.81996059417724609 0.67233537600350246 +822 5 5.799497 0.79949712753295898 0.63919565693345248 +823 6 5.812003 0.18799686431884766 0.035342820993719215 +824 5 5.22790766 0.22790765762329102 0.051941900403335239 +825 6 5.97561169 0.024388313293457031 0.00059478982529981295 +826 6 5.901674 0.098326206207275391 0.0096680428271156416 +827 9 6.82888842 2.1711115837097168 4.7137255089185146 +828 7 6.37836266 0.62163734436035156 0.38643298790339031 +829 7 6.119482 0.88051795959472656 0.77531187716886052 +830 6 5.980976 0.019023895263671875 0.0003619085910031572 +831 4 5.924944 1.9249439239501953 3.7054091103527753 +832 8 7.287973 0.71202707290649414 0.50698255255178992 +833 6 6.375841 0.37584114074707031 0.14125656307805912 +834 6 5.980976 0.019023895263671875 0.0003619085910031572 +835 8 6.824942 1.1750578880310059 1.3807610402238879 +836 8 6.996419 1.0035810470581055 1.0071749180142433 +837 8 6.996419 1.0035810470581055 1.0071749180142433 +838 8 6.996419 1.0035810470581055 1.0071749180142433 +839 7 6.26726866 0.73273134231567383 0.53689522001172918 +840 7 6.27416039 0.72583961486816406 0.52684314651196473 +841 7 6.315333 0.68466711044311523 0.46876905212252495 +842 7 6.315333 0.68466711044311523 0.46876905212252495 +843 7 6.216423 0.78357696533203125 0.6139928605989553 +844 8 6.64945936 1.3505406379699707 1.8239600148083355 +845 8 6.64945936 1.3505406379699707 1.8239600148083355 +846 5 5.850869 0.85086917877197266 0.72397835938409116 +847 5 5.22373867 0.22373867034912109 0.050058992609592678 +848 7 6.315333 0.68466711044311523 0.46876905212252495 +849 6 6.091377 0.091376781463623047 0.0083497161906507245 +850 7 6.216423 0.78357696533203125 0.6139928605989553 +851 5 5.26563931 0.26563930511474609 0.07056424042184517 +852 7 6.802008 0.19799184799194336 0.039200771871264806 +853 5 5.06763172 0.067631721496582031 0.004574049752591236 +854 7 6.802008 0.19799184799194336 0.039200771871264806 +855 7 6.67673635 0.32326364517211914 0.10449938428996575 +856 5 5.26563931 0.26563930511474609 0.07056424042184517 +857 5 5.278694 0.27869415283203125 0.077670430822763592 +858 7 6.01344061 0.98655939102172852 0.97329943201316382 +859 5 5.39770174 0.39770174026489258 0.15816667420972408 +860 8 6.41191339 1.5880866050720215 2.5220190652091787 +861 7 6.09758043 0.9024195671081543 0.8143610750996686 +862 6 5.68773556 0.31226444244384766 0.097509082014767046 +863 6 6.32151937 0.32151937484741211 0.1033747084022707 +864 5 5.586795 0.58679485321044922 0.34432819975427265 +865 6 6.401601 0.40160083770751953 0.16128323284738144 +866 7 6.802008 0.19799184799194336 0.039200771871264806 +867 8 6.85899353 1.1410064697265625 1.301895763957873 +868 7 6.32456255 0.67543745040893555 0.45621574941492327 +869 6 6.04672527 0.046725273132324219 0.0021832511492902995 +870 5 5.081021 0.081020832061767578 0.0065643752279811451 +871 5 5.06763172 0.067631721496582031 0.004574049752591236 +872 6 5.7612443 0.23875570297241211 0.057004285701850677 +873 3 4.103586 1.1035861968994141 1.2179024939869123 +874 5 5.22211456 0.22211456298828125 0.049334879091475159 +875 7 6.17575169 0.82424831390380859 0.67938528297327139 +876 9 7.38359642 1.6164035797119141 2.6127605325054901 +877 6 5.57609 0.42391014099121094 0.17969980763518834 +878 6 5.83978128 0.16021871566772461 0.025670036850215183 +879 8 7.260392 0.73960781097412109 0.54701971405393124 +880 7 6.17575169 0.82424831390380859 0.67938528297327139 +881 6 5.044123 0.95587682723999023 0.91370050885439014 +882 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +883 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +884 6 5.8775425 0.12245750427246094 0.014995840352639789 +885 7 6.52155638 0.47844362258911133 0.228908299996192 +886 6 5.89761448 0.10238552093505859 0.010482794897143322 +887 7 6.7517786 0.24822139739990234 0.061613862127160246 +888 6 5.89761448 0.10238552093505859 0.010482794897143322 +889 7 6.7517786 0.24822139739990234 0.061613862127160246 +890 6 5.35475159 0.6452484130859375 0.41634551458992064 +891 7 6.24612236 0.75387763977050781 0.56833149574595154 +892 5 5.746893 0.74689292907714844 0.55784904750544229 +893 7 6.4414587 0.55854129791259766 0.31196838147388917 +894 7 6.24612236 0.75387763977050781 0.56833149574595154 +895 6 6.04552126 0.045521259307861328 0.0020721850489735516 +896 6 6.043535 0.043535232543945313 0.001895316472655395 +897 6 5.37033558 0.62966442108154297 0.39647728317595465 +898 6 5.89646244 0.10353755950927734 0.010720026229137147 +899 6 6.043535 0.043535232543945313 0.001895316472655395 +900 7 6.437248 0.56275177001953125 0.31668955466011539 +901 6 5.793899 0.2061009407043457 0.042477597759216223 +902 5 5.28579044 0.28579044342041016 0.081676177550434659 +903 6 5.409873 0.59012699127197266 0.34824986582771089 +904 8 5.79865074 2.2013492584228516 4.8459385575588385 +905 4 4.89676857 0.89676856994628906 0.80419386804351234 +906 4 4.57636929 0.57636928558349609 0.33220155336402968 +907 8 6.83107567 1.1689243316650391 1.3663840931585582 +908 4 5.50111961 1.5011196136474609 2.2533600944771024 +909 5 5.838393 0.83839321136474609 0.70290317686249182 +910 5 5.26750469 0.26750469207763672 0.071558760283551237 +911 5 5.197639 0.19763898849487305 0.039061169773276561 +912 5 5.24751234 0.2475123405456543 0.061262358722387944 +913 5 4.95306063 0.046939373016357422 0.0022033047391687433 +914 4 4.5945096 0.59450960159301758 0.35344166638628849 +915 5 4.95306063 0.046939373016357422 0.0022033047391687433 +916 7 6.440396 0.55960416793823242 0.31315682477384144 +917 6 5.95007324 0.0499267578125 0.0024926811456680298 +918 6 6.325206 0.32520580291748047 0.10575881425120315 +919 7 5.990829 1.0091710090637207 1.0184261255346883 +920 7 6.069497 0.93050289154052734 0.86583563116528239 +921 6 5.535707 0.46429300308227539 0.21556799271115779 +922 6 5.535707 0.46429300308227539 0.21556799271115779 +923 6 5.70260572 0.2973942756652832 0.088443355198478457 +924 8 6.935463 1.0645370483398438 1.1332391272881068 +925 5 5.005663 0.0056629180908203125 3.2068641303339973E-05 +926 5 5.006425 0.0064249038696289063 4.1279389733972494E-05 +927 7 5.692542 1.3074579238891602 1.7094462227405529 +928 5 5.34776735 0.34776735305786133 0.12094213185287117 +929 5 5.56059361 0.56059360504150391 0.31426519001342967 +930 7 6.387425 0.61257505416870117 0.37524819698978717 +931 5 5.51956034 0.51956033706665039 0.26994294385281137 +932 6 5.69498348 0.30501651763916016 0.093035076032720099 +933 5 5.52175 0.52174997329711914 0.27222303463554454 +934 5 5.398334 0.39833402633666992 0.15866999653758285 +935 5 5.399966 0.39996576309204102 0.15997261164579868 +936 5 5.148321 0.14832115173339844 0.021999164051521802 +937 5 5.56059361 0.56059360504150391 0.31426519001342967 +938 6 5.893504 0.10649585723876953 0.011341367609020381 +939 7 5.759181 1.240818977355957 1.539631734566683 +940 5 5.41476154 0.41476154327392578 0.17202713777896861 +941 6 5.678872 0.32112789154052734 0.10312312272526469 +942 7 5.951344 1.0486559867858887 1.0996793786218859 +943 7 6.59410334 0.40589666366577148 0.16475210157500442 +944 7 5.97247076 1.027529239654541 1.0558163383450392 +945 7 6.28033543 0.71966457366943359 0.51791709859480761 +946 5 4.995405 0.0045948028564453125 2.1112213289598003E-05 +947 5 5.556999 0.55699920654296875 0.31024811608949676 +948 4 4.46932173 0.46932172775268555 0.22026288414076589 +949 5 5.3680234 0.36802339553833008 0.13544121966356215 +950 5 5.094201 0.094201087951660156 0.0088738449712764123 +951 6 5.8765893 0.12341070175170898 0.015230201306849267 +952 6 5.794643 0.20535707473754883 0.042171528144763215 +953 5 5.681073 0.68107318878173828 0.46386068847732531 +954 6 5.8765893 0.12341070175170898 0.015230201306849267 +955 5 5.094201 0.094201087951660156 0.0088738449712764123 +956 5 4.910827 0.089172840118408203 0.0079517954147831915 +957 7 6.410335 0.58966493606567383 0.3477047368253352 +958 7 6.40000057 0.59999942779541016 0.35999931335481961 +959 6 5.77616739 0.22383260726928711 0.050101036076966921 +960 6 5.77616739 0.22383260726928711 0.050101036076966921 +961 7 6.829785 0.17021512985229492 0.028973190430633622 +962 6 5.77616739 0.22383260726928711 0.050101036076966921 +963 6 6.27916765 0.27916765213012695 0.077934577995847576 +964 6 5.445577 0.55442285537719727 0.30738470256460459 +965 5 5.65728569 0.65728569030761719 0.43202447868316085 +966 6 5.425735 0.5742650032043457 0.32978029390528718 +967 6 5.847084 0.15291595458984375 0.023383289168123156 +968 7 6.935579 0.064421176910400391 0.0041500880345211044 +969 7 6.58235359 0.41764640808105469 0.17442852218300686 +970 7 6.57454634 0.42545366287231445 0.181010819251469 +971 7 6.667626 0.33237409591674805 0.11047253963647563 +972 6 5.847084 0.15291595458984375 0.023383289168123156 +973 7 6.935579 0.064421176910400391 0.0041500880345211044 +974 6 6.34301424 0.34301424026489258 0.11765876902450145 +975 5 5.274759 0.27475881576538086 0.075492406840794501 +976 6 6.03319836 0.033198356628417969 0.0011021308828276233 +977 5 5.74932528 0.74932527542114258 0.56148836838497118 +978 7 6.81341648 0.18658351898193359 0.034813409555681574 +979 5 5.48856926 0.48856925964355469 0.23869992146865116 +980 6 5.61005259 0.38994741439819336 0.15205898599583634 +981 7 6.81341648 0.18658351898193359 0.034813409555681574 +982 6 6.38202953 0.38202953338623047 0.14594656437930098 +983 6 6.28082752 0.28082752227783203 0.078864097268706246 +984 5 6.16001749 1.1600174903869629 1.3456405780036675 +985 6 5.89866829 0.10133171081542969 0.01026811561678187 +986 6 5.61840868 0.3815913200378418 0.1456119355282226 +987 6 5.59948635 0.40051364898681641 0.16041118302473478 +988 5 6.16001749 1.1600174903869629 1.3456405780036675 +989 7 6.30157232 0.69842767715454102 0.48780122021548777 +990 6 5.96048832 0.039511680603027344 0.0015611729040756472 +991 4 4.604853 0.60485315322875977 0.36584733697077354 +992 5 5.62472773 0.62472772598266602 0.39028473161147303 +993 4 4.80034733 0.80034732818603516 0.64055584573452506 +994 6 5.684209 0.31579113006591797 0.09972403782830952 +995 6 5.80417538 0.19582462310791016 0.03834728301535506 +996 5 4.886474 0.1135258674621582 0.012888122583035511 +997 6 5.55949831 0.44050168991088867 0.19404173881434872 +998 6 5.67601442 0.32398557662963867 0.10496665386403947 +999 7 6.07843542 0.92156457901000977 0.84928127328589653 +1000 7 5.663046 1.3369541168212891 1.787446310485393 +1001 5 5.360303 0.36030292510986328 0.12981819784272375 +1002 6 5.364488 0.63551187515258789 0.40387534345995846 +1003 7 5.83212233 1.1678776741027832 1.3639382616677267 +1004 6 6.53543663 0.53543663024902344 0.28669238501242944 +1005 6 6.39813471 0.39813470840454102 0.1585112460363689 +1006 6 6.53543663 0.53543663024902344 0.28669238501242944 +1007 5 5.15309 0.15309000015258789 0.02343654814671936 +1008 7 6.193991 0.80600881576538086 0.64965021109151166 +1009 6 5.99658966 0.00341033935546875 1.1630414519459009E-05 +1010 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1011 7 6.34206772 0.65793228149414063 0.4328748870320851 +1012 6 5.97693157 0.023068428039550781 0.0005321523722159327 +1013 5 5.46526432 0.46526432037353516 0.21647088781264756 +1014 5 5.52939034 0.52939033508300781 0.28025412687929929 +1015 5 5.2178936 0.21789360046386719 0.047477621123107383 +1016 5 5.223675 0.22367477416992188 0.05003040459996555 +1017 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1018 6 6.049116 0.049116134643554688 0.0024123946823237929 +1019 6 5.821385 0.17861509323120117 0.031903351529990687 +1020 7 6.07170248 0.92829751968383789 0.8617362850511654 +1021 7 6.07170248 0.92829751968383789 0.8617362850511654 +1022 8 7.050686 0.94931411743164063 0.90119729355501477 +1023 6 5.75873566 0.24126434326171875 0.058208483329508454 +1024 6 5.8799963 0.12000370025634766 0.014400888075215335 +1025 6 5.94306231 0.056937694549560547 0.0032419010606190568 +1026 6 6.319114 0.31911420822143555 0.10183387788879372 +1027 4 4.486199 0.48619890213012695 0.23638937243254077 +1028 7 6.42486572 0.57513427734375 0.33077943697571754 +1029 4 4.84544 0.84543991088867188 0.71476864292344544 +1030 6 5.735335 0.26466512680053711 0.070047629344344386 +1031 6 5.634032 0.36596822738647461 0.13393274345639838 +1032 6 5.66100645 0.33899354934692383 0.11491662649882528 +1033 6 5.66100645 0.33899354934692383 0.11491662649882528 +1034 3 4.125488 1.1254878044128418 1.2667227978820392 +1035 6 6.138177 0.13817691802978516 0.019092860676209966 +1036 5 5.83896446 0.83896446228027344 0.70386136896922835 +1037 5 4.90821743 0.091782569885253906 0.0084240401347415172 +1038 7 6.129409 0.87059116363525391 0.75792897419978544 +1039 5 5.80689764 0.80689764022827148 0.65108380180595304 +1040 4 4.708788 0.70878791809082031 0.5023803128315194 +1041 5 5.35757828 0.35757827758789063 0.12786222460272256 +1042 4 5.14486027 1.1448602676391602 1.3107050324188094 +1043 5 5.193105 0.19310522079467773 0.037289626298161238 +1044 7 5.90646 1.0935401916503906 1.1958301507547731 +1045 5 5.8116107 0.81161069869995117 0.65871192624422292 +1046 5 5.47202826 0.47202825546264648 0.22281067395510945 +1047 5 4.55644464 0.44355535507202148 0.19674135301306706 +1048 5 5.14154768 0.14154767990112305 0.020035745685390793 +1049 6 6.93397 0.93396997451782227 0.87229991330082157 +1050 5 5.74641466 0.7464146614074707 0.55713484676402913 +1051 6 5.719286 0.28071403503417969 0.078800369465170661 +1052 5 5.93918657 0.93918657302856445 0.88207141895713903 +1053 4 4.582541 0.58254098892211914 0.33935400377436054 +1054 5 4.55644464 0.44355535507202148 0.19674135301306706 +1055 5 5.63114262 0.63114261627197266 0.39834100207463052 +1056 6 5.77064943 0.22935056686401367 0.052601682520844406 +1057 5 5.126986 0.12698602676391602 0.016125450993285995 +1058 6 5.77064943 0.22935056686401367 0.052601682520844406 +1059 4 4.764793 0.76479291915893555 0.58490820919564612 +1060 7 6.389546 0.61045408248901367 0.37265418682750351 +1061 5 5.530722 0.53072214126586914 0.28166599122982916 +1062 5 4.86435127 0.13564872741699219 0.018400577249849448 +1063 5 5.185606 0.18560600280761719 0.034449588278221199 +1064 6 5.9687047 0.031295299530029297 0.00097939577267425193 +1065 5 5.57840729 0.57840728759765625 0.33455499034607783 +1066 6 5.432509 0.56749105453491211 0.32204609697714659 +1067 7 6.191147 0.8088531494140625 0.65424341731704772 +1068 7 6.02748346 0.97251653671264648 0.94578841417956028 +1069 6 6.485815 0.48581504821777344 0.23601626107483753 +1070 7 5.874095 1.1259050369262695 1.2676621521759444 +1071 5 5.57840729 0.57840728759765625 0.33455499034607783 +1072 7 6.143502 0.85649776458740234 0.73358842074321728 +1073 5 5.889502 0.88950204849243164 0.79121389427223221 +1074 6 5.229453 0.77054691314697266 0.59374254536032822 +1075 7 6.860558 0.13944196701049805 0.019444062163756826 +1076 6 5.789614 0.21038579940795898 0.044262184592525955 +1077 5 5.7062 0.70620012283325195 0.49871861348970015 +1078 5 5.34196043 0.34196043014526367 0.11693693578513376 +1079 6 5.595201 0.40479898452758789 0.16386221787456634 +1080 7 6.304265 0.69573497772216797 0.48404715922606556 +1081 6 5.60046434 0.3995356559753418 0.15962874039564667 +1082 6 5.60046434 0.3995356559753418 0.15962874039564667 +1083 6 6.12530851 0.12530851364135742 0.015702223591006259 +1084 7 6.0881176 0.91188240051269531 0.83152951236479566 +1085 5 4.941861 0.058138847351074219 0.0033801255713115097 +1086 8 7.36834431 0.63165569305419922 0.39898891456778074 +1087 8 6.271207 1.7287931442260742 2.9887257355230759 +1088 6 6.12530851 0.12530851364135742 0.015702223591006259 +1089 7 6.3522625 0.64773750305175781 0.41956387285972596 +1090 6 5.683116 0.31688404083251953 0.10041549533434591 +1091 6 6.12395525 0.12395524978637695 0.015364903949603104 +1092 6 5.620014 0.37998580932617188 0.14438921528926585 +1093 7 6.19363451 0.8063654899597168 0.65022530339797413 +1094 5 5.29982042 0.2998204231262207 0.089892286123586018 +1095 8 6.90607738 1.0939226150512695 1.196666687720608 +1096 6 5.973055 0.026945114135742188 0.00072603917578817345 +1097 7 6.0881176 0.91188240051269531 0.83152951236479566 +1098 6 6.02920532 0.029205322265625 0.00085295084863901138 +1099 7 7.05420256 0.054202556610107422 0.0029379171430718998 +1100 6 5.60046434 0.3995356559753418 0.15962874039564667 +1101 6 6.717598 0.71759796142578125 0.51494683424243703 +1102 5 6.292189 1.2921891212463379 1.6697527250673829 +1103 5 5.21190643 0.21190643310546875 0.044904336391482502 +1104 5 4.941861 0.058138847351074219 0.0033801255713115097 +1105 7 6.66590166 0.33409833908081055 0.11162170017655626 +1106 8 7.36834431 0.63165569305419922 0.39898891456778074 +1107 7 6.877219 0.12278079986572266 0.015075124815666641 +1108 7 6.55390263 0.44609737396240234 0.19900286705615144 +1109 4 4.86790562 0.86790561676025391 0.75326015960399673 +1110 7 6.877219 0.12278079986572266 0.015075124815666641 +1111 6 6.00191641 0.0019164085388183594 3.6726216876559192E-06 +1112 6 5.69383526 0.30616474151611328 0.093736848947628459 +1113 5 5.76925039 0.76925039291381836 0.59174616699806393 +1114 4 4.30118465 0.30118465423583984 0.0907121959471624 +1115 8 6.56404 1.4359598159790039 2.0619805931064548 +1116 5 4.86854839 0.13145160675048828 0.017279524917285016 +1117 5 5.349912 0.34991216659545898 0.12243852433152824 +1118 5 4.86854839 0.13145160675048828 0.017279524917285016 +1119 5 5.1008563 0.10085630416870117 0.010171994090569569 +1120 6 6.10804558 0.10804557800292969 0.011673846925987164 +1121 6 5.57668161 0.42331838607788086 0.1791984559915818 +1122 7 6.76281452 0.23718547821044922 0.056256951073919481 +1123 5 5.12697363 0.12697362899780273 0.016122302460871651 +1124 5 5.59565544 0.59565544128417969 0.35480540473145084 +1125 6 5.312439 0.68756103515625 0.47274017706513405 +1126 7 7.215483 0.21548318862915039 0.046433004581786008 +1127 7 6.62216425 0.37783575057983398 0.14275985441622652 +1128 5 5.652318 0.65231800079345703 0.42551877415917261 +1129 7 6.32973528 0.67026472091674805 0.44925479610560615 +1130 6 6.008838 0.0088381767272949219 7.8113367862897576E-05 +1131 6 5.69190931 0.3080906867980957 0.094919871291722302 +1132 5 5.54256248 0.54256248474121094 0.29437404984855675 +1133 5 5.666878 0.66687822341918945 0.44472656487073436 +1134 5 5.67285061 0.67285060882568359 0.45272794179709308 +1135 6 5.64160347 0.35839653015136719 0.12844807282453985 +1136 8 7.27833652 0.72166347503662109 0.52079817120193184 +1137 8 6.927531 1.0724692344665527 1.1501902588772737 +1138 5 5.07826948 0.078269481658935547 0.006126111759158448 +1139 5 5.83621359 0.83621358871459961 0.69925316595094955 +1140 6 5.928343 0.071657180786132813 0.0051347515582165215 +1141 5 4.850951 0.14904880523681641 0.02221554634252243 +1142 5 5.07826948 0.078269481658935547 0.006126111759158448 +1143 5 5.90772963 0.9077296257019043 0.82397307337691927 +1144 5 5.90772963 0.9077296257019043 0.82397307337691927 +1145 5 5.13637543 0.13637542724609375 0.01859825715655461 +1146 5 5.33813667 0.33813667297363281 0.1143364096096775 +1147 5 4.88847 0.11152982711791992 0.012438902336953106 +1148 6 6.21973848 0.21973848342895508 0.048285001099657165 +1149 5 5.244409 0.24440908432006836 0.059735800498174285 +1150 5 5.07894039 0.078940391540527344 0.006231585416571761 +1151 5 5.13637543 0.13637542724609375 0.01859825715655461 +1152 4 4.63385725 0.63385725021362305 0.40177501364837553 +1153 6 5.98369 0.016310214996337891 0.00026602311322676542 +1154 4 5.617376 1.6173758506774902 2.6159046423547352 +1155 4 5.803424 1.8034238815307617 3.2523376964754789 +1156 6 5.578991 0.42100906372070313 0.17724863173498306 +1157 6 5.578991 0.42100906372070313 0.17724863173498306 +1158 6 5.70412 0.29587984085083008 0.087544880221912535 +1159 6 5.578991 0.42100906372070313 0.17724863173498306 +1160 6 6.017941 0.017940998077392578 0.00032187941201300418 +1161 6 5.578991 0.42100906372070313 0.17724863173498306 +1162 7 6.018001 0.98199892044067383 0.96432187974664885 +1163 6 5.70412 0.29587984085083008 0.087544880221912535 +1164 6 5.45376539 0.5462346076965332 0.29837224664538553 +1165 5 6.16789961 1.1678996086120605 1.3639894957962042 +1166 5 4.949173 0.0508270263671875 0.0025833866093307734 +1167 6 5.63779 0.36220979690551758 0.13119593697433629 +1168 5 5.710626 0.71062612533569336 0.50498949000962057 +1169 6 6.017941 0.017940998077392578 0.00032187941201300418 +1170 6 5.43487358 0.56512641906738281 0.31936786952792318 +1171 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1172 6 5.81844044 0.18155956268310547 0.032963874801680504 +1173 5 6.03744555 1.0374455451965332 1.076293259248132 +1174 6 6.07708836 0.077088356018066406 0.0059426146335681551 +1175 5 5.48079157 0.48079156875610352 0.23116053258695501 +1176 7 5.870003 1.1299967765808105 1.2768927150830223 +1177 6 5.4681325 0.53186750411987305 0.28288304193870317 +1178 5 4.922261 0.077738761901855469 0.0060433151020333753 +1179 5 5.81053 0.81053018569946289 0.6569591819300058 +1180 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1181 6 5.45621252 0.54378747940063477 0.29570482275289578 +1182 5 6.03744555 1.0374455451965332 1.076293259248132 +1183 6 6.10228348 0.10228347778320313 0.010461909827427007 +1184 7 6.92237663 0.077623367309570313 0.0060253871524764691 +1185 5 5.2008605 0.20086050033569336 0.040344940595105072 +1186 5 5.0423584 0.0423583984375 0.0017942339181900024 +1187 8 6.55680561 1.4431943893432617 2.0828100454318701 +1188 6 5.83443451 0.16556549072265625 0.027411931718233973 +1189 5 4.74727535 0.25272464752197266 0.06386974746510532 +1190 6 5.81844044 0.18155956268310547 0.032963874801680504 +1191 7 6.47237968 0.52762031555175781 0.27838319738293649 +1192 6 5.84241 0.15758991241455078 0.024834580494825786 +1193 7 6.388489 0.61151123046875 0.37394598498940468 +1194 6 5.450869 0.54913091659545898 0.30154476356096893 +1195 6 5.95843744 0.041562557220458984 0.0017274461627039273 +1196 7 6.47237968 0.52762031555175781 0.27838319738293649 +1197 7 6.388489 0.61151123046875 0.37394598498940468 +1198 6 5.84241 0.15758991241455078 0.024834580494825786 +1199 7 6.247097 0.75290298461914063 0.5668629042484099 +1200 6 6.368082 0.36808204650878906 0.13548439296209835 +1201 7 6.383849 0.61615085601806641 0.379641877371796 +1202 5 5.37665272 0.37665271759033203 0.14186726966818242 +1203 6 5.49147367 0.50852632522583008 0.2585990234476867 +1204 6 5.49147367 0.50852632522583008 0.2585990234476867 +1205 5 4.820721 0.17927885055541992 0.03214090625647259 +1206 6 5.5144763 0.48552370071411133 0.23573326395512595 +1207 5 5.37665272 0.37665271759033203 0.14186726966818242 +1208 6 6.214216 0.21421623229980469 0.045888594180723885 +1209 6 6.27291727 0.27291727066040039 0.074483836624722244 +1210 6 5.206366 0.79363393783569336 0.62985482728458919 +1211 5 5.30671549 0.30671548843383789 0.094074390845207745 +1212 6 5.91659546 0.083404541015625 0.0069563174620270729 +1213 6 5.49147367 0.50852632522583008 0.2585990234476867 +1214 6 5.434932 0.56506776809692383 0.31930158254203889 +1215 5 5.5278945 0.52789449691772461 0.27867259987601756 +1216 8 6.689088 1.3109121322631836 1.7184906185148066 +1217 5 4.755091 0.24490880966186523 0.059980325049991734 +1218 8 6.63341141 1.3665885925292969 1.8675643812312046 +1219 8 6.689088 1.3109121322631836 1.7184906185148066 +1220 6 5.60927534 0.39072465896606445 0.15266575912414737 +1221 7 6.98346758 0.016532421112060547 0.00027332094782650529 +1222 6 5.45542 0.54457998275756836 0.29656735762023345 +1223 5 5.5278945 0.52789449691772461 0.27867259987601756 +1224 7 6.87969351 0.12030649185180664 0.014473651981688818 +1225 6 6.18620157 0.18620157241821289 0.03467102557101498 +1226 7 6.87969351 0.12030649185180664 0.014473651981688818 +1227 5 6.072542 1.0725421905517578 1.1503467505135632 +1228 6 5.84670973 0.1532902717590332 0.023497907415958252 +1229 3 5.12617159 2.1261715888977051 4.5206056254357918 +1230 6 5.860294 0.13970613479614258 0.01951780409967796 +1231 7 6.78599644 0.21400356292724609 0.045797524945555779 +1232 7 6.88765144 0.11234855651855469 0.012622198151802877 +1233 6 6.57666636 0.57666635513305664 0.3325440851424446 +1234 6 6.01195574 0.011955738067626953 0.00014293967274170427 +1235 5 5.51621962 0.5162196159362793 0.2664826918773997 +1236 6 6.18620157 0.18620157241821289 0.03467102557101498 +1237 5 6.120411 1.1204109191894531 1.2553206278389553 +1238 7 6.923103 0.076897144317626953 0.0059131708042059472 +1239 5 5.1333437 0.13334369659423828 0.017780541421416274 +1240 6 5.67478561 0.32521438598632813 0.10576439685246442 +1241 7 6.386693 0.61330699920654297 0.3761454752757345 +1242 7 6.761541 0.23845911026000977 0.056862747265995495 +1243 7 6.923103 0.076897144317626953 0.0059131708042059472 +1244 5 5.49561262 0.49561262130737305 0.24563187039916556 +1245 4 4.910776 0.91077613830566406 0.82951317410697811 +1246 7 5.8812623 1.1187376976013184 1.2515740360342988 +1247 6 5.924655 0.075345039367675781 0.0056768749573166133 +1248 7 6.13088036 0.86911964416503906 0.75536895587356412 +1249 5 5.003289 0.0032892227172851563 1.0818986083904747E-05 +1250 7 6.48895645 0.51104354858398438 0.2611655085493112 +1251 5 5.63452435 0.63452434539794922 0.40262114490269596 +1252 6 5.67069244 0.32930755615234375 0.10844346653902903 +1253 7 6.81721258 0.18278741836547852 0.033411240312716473 +1254 5 5.828939 0.82893896102905273 0.68713980111192541 +1255 6 5.722976 0.2770237922668457 0.076742181481904481 +1256 6 5.81828737 0.18171262741088867 0.033019478960568449 +1257 6 5.969221 0.030778884887695313 0.00094733975492999889 +1258 6 5.33740044 0.66259956359863281 0.43903818168109865 +1259 6 5.84787655 0.15212345123291016 0.023141544415011595 +1260 6 5.859397 0.14060306549072266 0.019769222025388444 +1261 6 5.74161673 0.25838327407836914 0.066761916323457626 +1262 6 5.81828737 0.18171262741088867 0.033019478960568449 +1263 6 5.32097244 0.67902755737304688 0.46107842367200647 +1264 5 5.465101 0.46510076522827148 0.21631872181592371 +1265 7 6.204722 0.79527807235717773 0.63246721237214842 +1266 8 6.60801363 1.3919863700866699 1.9376260545070636 +1267 7 6.50023127 0.49976873397827148 0.24976878746224429 +1268 5 5.397177 0.39717721939086914 0.1577497436030626 +1269 6 5.59714651 0.40285348892211914 0.16229093353672397 +1270 7 6.50023127 0.49976873397827148 0.24976878746224429 +1271 5 5.15302753 0.15302753448486328 0.023417426310516021 +1272 5 5.176312 0.17631196975708008 0.03108591067962152 +1273 5 5.15302753 0.15302753448486328 0.023417426310516021 +1274 6 5.59714651 0.40285348892211914 0.16229093353672397 +1275 6 5.59203053 0.40796947479248047 0.16643909236245236 +1276 7 6.50023127 0.49976873397827148 0.24976878746224429 +1277 5 5.397177 0.39717721939086914 0.1577497436030626 +1278 6 5.566156 0.43384408950805664 0.18822069400107466 +1279 6 5.934077 0.065923213958740234 0.0043458701386498433 +1280 6 6.38662767 0.3866276741027832 0.14948095838212794 +1281 7 6.501193 0.49880695343017578 0.24880837679029355 +1282 5 4.947265 0.052734851837158203 0.0027809645982870279 +1283 8 7.58158 0.41841983795166016 0.17507516079149354 +1284 7 6.501193 0.49880695343017578 0.24880837679029355 +1285 6 6.38662767 0.3866276741027832 0.14948095838212794 +1286 7 6.139841 0.86015892028808594 0.73987336815116578 +1287 7 6.50392437 0.49607563018798828 0.24609103086640971 +1288 7 6.72525024 0.274749755859375 0.075487428344786167 +1289 6 6.28108 0.28107976913452148 0.079005836616715897 +1290 6 5.80168343 0.19831657409667969 0.039329463561443845 +1291 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1292 6 6.130666 0.13066577911376953 0.01707354583140841 +1293 4 4.788151 0.78815078735351563 0.62118166360596661 +1294 4 4.788151 0.78815078735351563 0.62118166360596661 +1295 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1296 6 6.36224365 0.36224365234375 0.13122046366333961 +1297 7 6.582107 0.4178929328918457 0.17463450336094866 +1298 6 6.55059576 0.55059576034545898 0.3031556913103941 +1299 5 5.97331524 0.97331523895263672 0.94734255437742831 +1300 6 5.93681765 0.063182353973388672 0.0039920098536185833 +1301 5 5.99956369 0.99956369400024414 0.9991275783634137 +1302 6 5.753585 0.24641513824462891 0.060720420356119575 +1303 6 6.10364437 0.10364437103271484 0.01074215564676706 +1304 5 4.612831 0.38716888427734375 0.1498997449525632 +1305 7 5.955537 1.0444631576538086 1.0909032876961646 +1306 8 6.829604 1.1703958511352539 1.3698264483546154 +1307 5 4.941627 0.058372974395751953 0.0034074041398071131 +1308 6 5.64012241 0.35987758636474609 0.12951187716771528 +1309 6 5.221883 0.77811717987060547 0.60546634560978418 +1310 6 5.45807457 0.54192543029785156 0.29368317200351157 +1311 6 5.909332 0.090668201446533203 0.0082207227535491256 +1312 5 5.35318565 0.35318565368652344 0.12474010596997687 +1313 5 4.43518734 0.56481266021728516 0.31901334114172641 +1314 6 5.36058331 0.63941669464111328 0.40885370938576671 +1315 6 5.82610559 0.17389440536499023 0.030239264217243544 +1316 6 5.933774 0.066226005554199219 0.0043858838116648258 +1317 5 5.721077 0.72107696533203125 0.5199519899324514 +1318 6 6.0769105 0.076910495758056641 0.0059152243577500485 +1319 5 5.427906 0.42790603637695313 0.18310357596783433 +1320 6 5.612823 0.3871769905090332 0.14990602197963199 +1321 6 6.429845 0.42984485626220703 0.18476660045507742 +1322 6 5.86295748 0.13704252243041992 0.018780652954092147 +1323 5 5.48062134 0.480621337890625 0.23099687043577433 +1324 6 5.85815763 0.14184236526489258 0.020119256583939205 +1325 7 6.76510859 0.23489141464233398 0.055173976672676872 +1326 6 5.478635 0.52136516571044922 0.27182163601628417 +1327 6 5.77933025 0.22066974639892578 0.048695136975766218 +1328 6 6.24729967 0.2472996711730957 0.061157127362321262 +1329 5 5.54726648 0.54726648330688477 0.29950060375108478 +1330 5 5.39347935 0.39347934722900391 0.15482599669576302 +1331 6 6.08679676 0.086796760559082031 0.0075336776435506181 +1332 7 6.21610069 0.78389930725097656 0.61449812390856096 +1333 8 7.01025534 0.98974466323852539 0.97959449840914203 +1334 6 5.852407 0.14759302139282227 0.021783699963862091 +1335 6 5.72382832 0.27617168426513672 0.076270799189842364 +1336 8 6.596054 1.4039459228515625 1.9710641542915255 +1337 5 5.49725866 0.49725866317749023 0.24726617810506468 +1338 5 5.49725866 0.49725866317749023 0.24726617810506468 +1339 6 5.488146 0.51185417175292969 0.26199469314087764 +1340 6 5.59975767 0.40024232864379883 0.16019392163821067 +1341 5 5.11727953 0.1172795295715332 0.013754488056520131 +1342 6 5.488146 0.51185417175292969 0.26199469314087764 +1343 6 5.54852057 0.45147943496704102 0.20383368019815862 +1344 8 6.80502939 1.1949706077575684 1.4279547534044923 +1345 8 7.36150551 0.63849449157714844 0.40767521577436128 +1346 7 6.67498064 0.32501935958862305 0.10563758410739865 +1347 7 6.64853954 0.35146045684814453 0.12352445272790646 +1348 8 6.596054 1.4039459228515625 1.9710641542915255 +1349 4 4.20987129 0.20987129211425781 0.044045959253708133 +1350 7 6.88175058 0.11824941635131836 0.013982924467427438 +1351 7 6.931576 0.068424224853515625 0.0046818745468044654 +1352 6 5.72382832 0.27617168426513672 0.076270799189842364 +1353 5 5.49725866 0.49725866317749023 0.24726617810506468 +1354 5 5.646412 0.64641189575195313 0.41784833896963391 +1355 5 5.556504 0.5565037727355957 0.30969644906895155 +1356 6 5.781893 0.21810722351074219 0.04757076094756485 +1357 6 5.502844 0.49715614318847656 0.24716423071004101 +1358 8 6.61071873 1.3892812728881836 1.9301024551978117 +1359 7 6.328941 0.67105913162231445 0.45032035813369475 +1360 6 6.152078 0.15207815170288086 0.023127764225364444 +1361 7 6.2568655 0.74313449859619141 0.55224888300381281 +1362 7 6.257044 0.74295616149902344 0.551983857909363 +1363 4 5.13123131 1.1312313079833984 1.2796842721618304 +1364 5 5.556504 0.5565037727355957 0.30969644906895155 +1365 7 6.42597771 0.57402229309082031 0.32950159296524362 +1366 6 6.17942142 0.17942142486572266 0.03219204770084616 +1367 5 5.251204 0.25120401382446289 0.063103456561520943 +1368 6 5.781893 0.21810722351074219 0.04757076094756485 +1369 5 4.914902 0.085097789764404297 0.0072416338227867527 +1370 6 5.61482573 0.38517427444458008 0.14835922169390869 +1371 7 6.18855333 0.8114466667175293 0.65844569292698907 +1372 6 5.690512 0.30948781967163086 0.095782710525099901 +1373 6 5.690512 0.30948781967163086 0.095782710525099901 +1374 7 6.57598352 0.42401647567749023 0.17978997164595967 +1375 7 6.474106 0.5258941650390625 0.27656467282213271 +1376 6 5.44045067 0.55954933166503906 0.31309545456679189 +1377 6 5.42730761 0.5726923942565918 0.32797657843934758 +1378 7 6.15234852 0.84765148162841797 0.71851303430685221 +1379 6 4.94880867 1.0511913299560547 1.105003212174779 +1380 7 6.84760427 0.15239572525024414 0.0232244570745479 +1381 7 7.003771 0.0037708282470703125 1.4219145668903366E-05 +1382 6 5.2290206 0.77097940444946289 0.59440924208524848 +1383 6 5.473995 0.52600479125976563 0.27668104042822961 +1384 6 5.33457041 0.66542959213256836 0.44279654208571628 +1385 5 5.29342842 0.29342842102050781 0.086100238262588391 +1386 7 6.966072 0.03392791748046875 0.001151103584561497 +1387 6 6.410287 0.41028690338134766 0.16833534308625531 +1388 7 6.245387 0.75461292266845703 0.56944066305823071 +1389 6 5.70716763 0.29283237457275391 0.085750799597917648 +1390 6 5.880706 0.11929416656494141 0.014231098176423984 +1391 6 6.2913146 0.29131460189819336 0.084864197279102882 +1392 6 6.410287 0.41028690338134766 0.16833534308625531 +1393 6 5.585095 0.41490507125854492 0.17214621815605824 +1394 7 6.966072 0.03392791748046875 0.001151103584561497 +1395 7 6.48753452 0.51246547698974609 0.26262086510632798 +1396 7 6.245387 0.75461292266845703 0.56944066305823071 +1397 7 6.31858444 0.68141555786132813 0.46432716249546502 +1398 7 6.31858444 0.68141555786132813 0.46432716249546502 +1399 6 6.270913 0.27091312408447266 0.073393920801208878 +1400 7 6.31858444 0.68141555786132813 0.46432716249546502 +1401 6 5.119604 0.88039588928222656 0.77509692186504253 +1402 8 6.57125139 1.428748607635498 2.0413225838203743 +1403 8 6.820425 1.1795749664306641 1.3913971014299022 +1404 5 5.219756 0.21975612640380859 0.048292755092006701 +1405 4 4.77159548 0.77159547805786133 0.59535958175933956 +1406 8 6.147219 1.852780818939209 3.4327967630290459 +1407 6 6.19692135 0.19692134857177734 0.038778017523327435 +1408 7 6.31858444 0.68141555786132813 0.46432716249546502 +1409 6 6.006806 0.0068058967590332031 4.6320230694618658E-05 +1410 6 6.78585 0.78585004806518555 0.61756029804405443 +1411 6 6.270913 0.27091312408447266 0.073393920801208878 +1412 8 6.838521 1.1614789962768555 1.3490334587922916 +1413 6 5.712056 0.28794384002685547 0.082911655009411334 +1414 6 6.27111959 0.27111959457397461 0.073505834561956362 +1415 5 4.7982645 0.20173549652099609 0.040697210556572827 +1416 6 5.83465528 0.1653447151184082 0.027338874817587566 +1417 3 3.94480681 0.94480681419372559 0.8926599161468971 +1418 5 5.14915037 0.14915037155151367 0.022245833333954579 +1419 7 5.99877644 1.0012235641479492 1.0024486254051226 +1420 4 4.949227 0.94922685623168945 0.90103162459149644 +1421 6 6.25533533 0.25533533096313477 0.065196131238053567 +1422 5 5.661264 0.66126394271850586 0.4372700019396234 +1423 4 4.768664 0.76866388320922852 0.5908441653502905 +1424 6 5.712056 0.28794384002685547 0.082911655009411334 +1425 6 5.82935858 0.17064142227172852 0.029118494994918365 +1426 6 6.34480238 0.3448023796081543 0.11888868098344574 +1427 5 5.729822 0.72982215881347656 0.53264038349516341 +1428 7 6.32088757 0.67911243438720703 0.46119369853931858 +1429 5 5.381057 0.38105678558349609 0.14520427383922652 +1430 4 4.68381166 0.68381166458129883 0.46759839261744673 +1431 5 5.381057 0.38105678558349609 0.14520427383922652 +1432 7 6.46803951 0.53196048736572266 0.28298196011837717 +1433 6 6.136118 0.13611793518066406 0.018528092277847463 +1434 5 5.729822 0.72982215881347656 0.53264038349516341 +1435 5 5.611653 0.61165285110473633 0.37411921026455275 +1436 5 4.68876076 0.31123924255371094 0.096869866105407709 +1437 7 6.32088757 0.67911243438720703 0.46119369853931858 +1438 5 5.26315546 0.26315546035766602 0.06925079631605513 +1439 5 5.47552 0.47552013397216797 0.22611939781290857 +1440 5 5.3382206 0.33822059631347656 0.11439317177064368 +1441 5 5.190989 0.19098901748657227 0.036476804800486207 +1442 5 5.26568127 0.26568126678466797 0.070586535520305915 +1443 6 6.41662264 0.41662263870239258 0.17357442307934434 +1444 6 6.25118971 0.2511897087097168 0.063096269761672374 +1445 6 6.20891047 0.20891046524047852 0.043643582486993182 +1446 6 6.29368258 0.29368257522583008 0.086249454991275343 +1447 6 5.892337 0.10766315460205078 0.011591354858865088 +1448 6 5.892337 0.10766315460205078 0.011591354858865088 +1449 6 6.1661396 0.16613960266113281 0.027602367572399089 +1450 6 6.25118971 0.2511897087097168 0.063096269761672374 +1451 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1452 6 6.25118971 0.2511897087097168 0.063096269761672374 +1453 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1454 5 5.479026 0.47902584075927734 0.22946575611513254 +1455 5 5.074789 0.074789047241210938 0.0055934015872480813 +1456 6 6.29368258 0.29368257522583008 0.086249454991275343 +1457 6 6.20891047 0.20891046524047852 0.043643582486993182 +1458 6 6.450489 0.45048904418945313 0.20294037893472705 +1459 6 6.16096926 0.16096925735473633 0.025911101813335335 +1460 6 6.26689243 0.26689243316650391 0.071231570881536754 +1461 6 6.07949543 0.079495429992675781 0.0063195233897204162 +1462 6 5.892337 0.10766315460205078 0.011591354858865088 +1463 6 5.363495 0.636505126953125 0.40513877663761377 +1464 8 7.07665825 0.92334175109863281 0.85255998932188959 +1465 5 5.519054 0.51905393600463867 0.26941698848190754 +1466 6 6.1661396 0.16613960266113281 0.027602367572399089 +1467 7 6.628117 0.37188291549682617 0.13829690283841956 +1468 5 5.396044 0.39604377746582031 0.1568506736693962 +1469 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1470 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1471 6 6.25118971 0.2511897087097168 0.063096269761672374 +1472 5 4.971684 0.028316020965576172 0.00080179704332294932 +1473 6 6.13895845 0.13895845413208008 0.019309451974777403 +1474 4 4.94047976 0.94047975540161133 0.88450217032027467 +1475 6 5.83468962 0.16531038284301758 0.02732752267570504 +1476 5 5.194277 0.19427680969238281 0.037743478784250328 +1477 6 4.945969 1.0540308952331543 1.1109811281060047 +1478 6 5.97336531 0.026634693145751953 0.00070940687896836607 +1479 6 5.95833 0.041669845581054688 0.0017363760307489429 +1480 6 5.83468962 0.16531038284301758 0.02732752267570504 +1481 6 5.83350468 0.16649532318115234 0.027720692641196365 +1482 6 5.766513 0.23348712921142578 0.054516239507393038 +1483 4 4.94047976 0.94047975540161133 0.88450217032027467 +1484 3 4.470957 1.4709568023681641 2.1637139144331741 +1485 6 5.71909666 0.28090333938598633 0.078906686078198618 +1486 6 5.822368 0.17763185501098633 0.031553075914644069 +1487 6 5.281767 0.71823310852050781 0.51585879817503155 +1488 6 5.49806166 0.5019383430480957 0.2519421002218678 +1489 5 5.55353355 0.55353355407714844 0.30639939548927941 +1490 6 6.164951 0.16495084762573242 0.027208782132447595 +1491 5 5.153073 0.15307283401489258 0.023431292513350854 +1492 5 5.51080036 0.51080036163330078 0.26091700944471086 +1493 8 7.14790726 0.85209274291992188 0.72606204253679607 +1494 8 6.94167757 1.0583224296569824 1.1200463651150585 +1495 7 6.684428 0.31557178497314453 0.099585551471136569 +1496 5 4.59208965 0.40791034698486328 0.16639085117731156 +1497 7 6.43388653 0.56611347198486328 0.32048446316275658 +1498 6 6.206013 0.20601320266723633 0.042441439673211789 +1499 6 6.377341 0.37734079360961914 0.14238607452193719 +1500 7 6.473521 0.52647876739501953 0.27717989251777908 +1501 5 5.64289665 0.64289665222167969 0.41331610543784336 +1502 5 5.318365 0.31836509704589844 0.10135633501704433 +1503 7 6.770466 0.22953414916992188 0.052685925635159947 +1504 8 6.64272928 1.3572707176208496 1.8421838009110161 +1505 7 6.01323271 0.98676729202270508 0.97370968860582252 +1506 6 5.81762934 0.18237066268920898 0.033259058609701242 +1507 6 5.59561062 0.40438938140869141 0.16353077179610409 +1508 6 5.72143364 0.27856636047363281 0.077599217187525937 +1509 5 5.64345741 0.64345741271972656 0.41403744198396453 +1510 5 5.424362 0.4243621826171875 0.18008326203562319 +1511 6 5.81927538 0.1807246208190918 0.032661388570204508 +1512 7 6.42719269 0.57280731201171875 0.32810821669409052 +1513 6 6.5397687 0.53976869583129883 0.29135024499942119 +1514 7 6.473521 0.52647876739501953 0.27717989251777908 +1515 6 6.226191 0.22619104385375977 0.051162388319653473 +1516 6 6.13849163 0.13849163055419922 0.019179931733560807 +1517 6 5.995002 0.0049982070922851563 2.4982074137369636E-05 +1518 6 6.13184547 0.13184547424316406 0.017383229078404838 +1519 5 5.64289665 0.64289665222167969 0.41331610543784336 +1520 6 5.77483654 0.22516345977783203 0.050698583619123383 +1521 5 5.318365 0.31836509704589844 0.10135633501704433 +1522 5 5.813046 0.81304597854614258 0.66104376323005454 +1523 6 5.70439 0.29560995101928711 0.087385243141625324 +1524 6 5.45256138 0.54743862152099609 0.29968904433280841 +1525 5 5.168963 0.16896295547485352 0.028548480322797332 +1526 6 6.030308 0.030307769775390625 0.0009185609087580815 +1527 6 6.06596 0.065959930419921875 0.0043507124210009351 +1528 6 5.98619127 0.013808727264404297 0.00019068094866270258 +1529 6 5.45256138 0.54743862152099609 0.29968904433280841 +1530 5 5.168963 0.16896295547485352 0.028548480322797332 +1531 7 6.09255266 0.90744733810424805 0.82346067143248547 +1532 7 6.17497635 0.82502365112304688 0.68066402491240297 +1533 6 6.188314 0.18831396102905273 0.035462147918451592 +1534 6 5.93772459 0.062275409698486328 0.003878226653114325 +1535 6 5.900267 0.099732875823974609 0.0099466465201203391 +1536 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1537 6 5.703288 0.29671192169189453 0.088037964474096952 +1538 6 5.74273157 0.25726842880249023 0.066187044458501987 +1539 6 6.188314 0.18831396102905273 0.035462147918451592 +1540 6 5.93772459 0.062275409698486328 0.003878226653114325 +1541 4 4.76091242 0.76091241836547852 0.57898770842280101 +1542 6 6.11882639 0.11882638931274414 0.014119710797103835 +1543 6 6.29636 0.29636001586914063 0.087829259005957283 +1544 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1545 6 6.044429 0.044428825378417969 0.0019739205245059566 +1546 6 5.64528561 0.35471439361572266 0.12582230103816983 +1547 6 5.64528561 0.35471439361572266 0.12582230103816983 +1548 6 6.87292671 0.87292671203613281 0.76200104458621354 +1549 6 5.900267 0.099732875823974609 0.0099466465201203391 +1550 6 6.021991 0.021990776062011719 0.00048359423180954764 +1551 6 6.07919264 0.079192638397216797 0.0062714739763123362 +1552 7 7.06551027 0.065510272979736328 0.0042915958658795716 +1553 7 6.482196 0.51780414581298828 0.26812113342111843 +1554 7 6.27147055 0.72852945327758789 0.53075516429294112 +1555 7 6.7877593 0.21224069595336914 0.045046113018770484 +1556 6 5.75313663 0.24686336517333984 0.060941521064705739 +1557 6 6.021991 0.021990776062011719 0.00048359423180954764 +1558 4 4.91349363 0.91349363327026367 0.83447061802530698 +1559 4 4.4660306 0.46603059768676758 0.21718451798028582 +1560 6 6.359429 0.35942888259887695 0.12918912164627727 +1561 5 4.71328 0.28671979904174805 0.082208243162540384 +1562 7 6.898671 0.10132884979248047 0.010267535800267069 +1563 6 6.359429 0.35942888259887695 0.12918912164627727 +1564 5 4.71328 0.28671979904174805 0.082208243162540384 +1565 6 5.96442747 0.035572528839111328 0.0012654048080094071 +1566 5 5.83771753 0.83771753311157227 0.70177066528253818 +1567 5 5.50233173 0.50233173370361328 0.25233717068567785 +1568 6 5.516011 0.48398876190185547 0.23424512164729094 +1569 5 5.306023 0.30602312088012695 0.093650150513212793 +1570 5 5.480161 0.48016119003295898 0.23055476841386735 +1571 6 5.516011 0.48398876190185547 0.23424512164729094 +1572 6 5.753487 0.24651288986206055 0.060768604868144394 +1573 5 5.619523 0.61952304840087891 0.38380880749991775 +1574 4 5.28259468 1.2825946807861328 1.6450491151808819 +1575 6 5.87912941 0.12087059020996094 0.014609699577704305 +1576 6 5.57926 0.42074012756347656 0.17702225494213053 +1577 4 4.433939 0.43393898010253906 0.18830303845243179 +1578 5 5.368031 0.36803102493286133 0.1354468353131324 +1579 4 5.156767 1.1567668914794922 1.3381096412231273 +1580 5 4.508023 0.49197721481323242 0.24204157989538544 +1581 6 5.6025157 0.39748430252075195 0.15799377075040866 +1582 7 6.667178 0.33282184600830078 0.11077038118037308 +1583 5 5.368031 0.36803102493286133 0.1354468353131324 +1584 6 5.357087 0.64291286468505859 0.41333695157754846 +1585 5 5.135726 0.13572597503662109 0.018421540299641492 +1586 5 4.884364 0.11563587188720703 0.013371654867114557 +1587 6 5.357087 0.64291286468505859 0.41333695157754846 +1588 5 5.135726 0.13572597503662109 0.018421540299641492 +1589 6 6.05095768 0.050957679748535156 0.00259668512535427 +1590 6 6.273106 0.27310609817504883 0.074586940860399409 +1591 6 6.14363956 0.14363956451416016 0.020632324493817578 +1592 6 5.825356 0.17464399337768555 0.030500524422905073 +1593 6 5.8224 0.17759990692138672 0.031541726938485226 +1594 6 5.46713 0.53286981582641602 0.28395024061887852 +1595 6 5.4586587 0.54134130477905273 0.29305040825988726 +1596 5 5.47208929 0.47208929061889648 0.2228682983170529 +1597 6 5.4586587 0.54134130477905273 0.29305040825988726 +1598 6 5.762172 0.23782777786254883 0.05656205192303787 +1599 6 5.875584 0.12441587448120117 0.015479309822922005 +1600 6 5.46713 0.53286981582641602 0.28395024061887852 +1601 6 5.634498 0.36550188064575195 0.13359162475558151 +1602 5 6.442401 1.4424009323120117 2.0805204495345606 +1603 7 6.492261 0.50773906707763672 0.25779896023686888 +1604 5 5.0516305 0.051630496978759766 0.0026657082182737213 +1605 9 7.458617 1.5413827896118164 2.3758609041115051 +1606 6 6.246019 0.24601888656616211 0.060525292547254139 +1607 7 6.15459061 0.84540939331054688 0.71471704229770694 +1608 5 5.464145 0.46414518356323242 0.21543075142494672 +1609 7 6.011046 0.98895406723022461 0.97803014709120362 +1610 6 6.246019 0.24601888656616211 0.060525292547254139 +1611 6 5.587227 0.41277313232421875 0.170381658768747 +1612 7 6.48129845 0.51870155334472656 0.26905130144223222 +1613 7 6.61206961 0.38793039321899414 0.15048998998304342 +1614 5 5.850582 0.85058212280273438 0.7234899476316059 +1615 6 6.102702 0.10270214080810547 0.010547729726567923 +1616 6 5.51687765 0.48312234878540039 0.23340720389592207 +1617 6 5.571805 0.42819499969482422 0.18335095776365051 +1618 6 5.28217125 0.71782875061035156 0.5152781152028183 +1619 8 7.13240433 0.86759567260742188 0.75272225112712476 +1620 7 6.48129845 0.51870155334472656 0.26905130144223222 +1621 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1622 6 5.239296 0.76070404052734375 0.57867063727462664 +1623 6 5.86622047 0.13377952575683594 0.01789696151172393 +1624 7 6.18613243 0.81386756896972656 0.66238041982069262 +1625 6 5.87100458 0.12899541854858398 0.016639818006524365 +1626 6 5.90693 0.093070030212402344 0.0086620305237374851 +1627 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1628 6 5.890122 0.1098780632019043 0.012073188773001675 +1629 6 5.977284 0.022716045379638672 0.00051601871768980345 +1630 5 5.31199455 0.31199455261230469 0.097340600859752158 +1631 6 5.890122 0.1098780632019043 0.012073188773001675 +1632 8 7.1502 0.84980010986328125 0.72216022672364488 +1633 7 6.04704762 0.95295238494873047 0.90811824797947338 +1634 6 5.547635 0.45236492156982422 0.20463402226687322 +1635 6 5.52456141 0.47543859481811523 0.22604185744262395 +1636 5 5.148717 0.14871692657470703 0.022116724249826802 +1637 6 6.15984631 0.15984630584716797 0.025550841492986365 +1638 5 5.09744549 0.097445487976074219 0.0094956231268952251 +1639 5 5.942503 0.94250297546386719 0.88831185875824303 +1640 5 5.148717 0.14871692657470703 0.022116724249826802 +1641 6 5.82682943 0.17317056655883789 0.029988045122308904 +1642 7 6.504058 0.49594211578369141 0.24595858220800437 +1643 7 5.77661276 1.2233872413635254 1.4966763423310567 +1644 7 6.504058 0.49594211578369141 0.24595858220800437 +1645 7 6.223316 0.77668380737304688 0.60323773663549218 +1646 6 5.82682943 0.17317056655883789 0.029988045122308904 +1647 7 6.27178574 0.72821426391601563 0.53029601417074446 +1648 5 5.7562747 0.75627470016479492 0.57195142210935046 +1649 4 4.85746956 0.85746955871582031 0.73525404412430362 +1650 7 6.80729961 0.19270038604736328 0.037133438782802841 +1651 6 5.34201 0.6579899787902832 0.43295081218843734 +1652 4 5.75338364 1.7533836364746094 3.0743541766569251 +1653 6 5.71115732 0.28884267807006836 0.083430092674689149 +1654 5 5.11912 0.11912012100219727 0.014189603227578118 +1655 5 5.338051 0.33805084228515625 0.11427837196970358 +1656 5 5.51299047 0.51299047470092773 0.26315922713388318 +1657 6 6.112662 0.11266183853149414 0.012692689861296458 +1658 5 5.144843 0.14484310150146484 0.020979524052563647 +1659 5 5.225776 0.22577619552612305 0.050974890466250145 +1660 6 5.27949429 0.72050571441650391 0.51912848450683668 +1661 6 5.528939 0.47106122970581055 0.22189868213195041 +1662 7 6.071942 0.92805814743041992 0.86129192501198304 +1663 6 5.71115732 0.28884267807006836 0.083430092674689149 +1664 4 5.10081768 1.1008176803588867 1.2117995653907201 +1665 8 7.05892038 0.94107961654663086 0.88563084467955377 +1666 5 4.735589 0.26441097259521484 0.069913162428747455 +1667 6 5.98559475 0.014405250549316406 0.00020751124338858062 +1668 7 6.120982 0.87901782989501953 0.77267234527334949 +1669 6 5.108951 0.89104890823364258 0.79396815686436639 +1670 6 5.488634 0.51136589050292969 0.26149507396985427 +1671 7 6.510288 0.48971223831176758 0.23981807635232144 +1672 5 5.421067 0.42106723785400391 0.1772976187940003 +1673 5 5.347374 0.34737396240234375 0.12066866975510493 +1674 6 5.980884 0.019115924835205078 0.00036541858230521029 +1675 5 5.338103 0.33810281753540039 0.11431351522537625 +1676 7 6.510288 0.48971223831176758 0.23981807635232144 +1677 6 5.90175 0.098249912261962891 0.009653045259483406 +1678 6 5.911432 0.088568210601806641 0.0078443279292059742 +1679 5 5.21312141 0.21312141418457031 0.045420737184031168 +1680 5 5.163654 0.16365385055541992 0.026782582801615717 +1681 6 5.914402 0.085597991943359375 0.0073270162247354165 +1682 7 6.543379 0.45662117004394531 0.20850289293230162 +1683 7 6.543379 0.45662117004394531 0.20850289293230162 +1684 7 6.06433344 0.93566656112670898 0.87547191361068144 +1685 7 6.543379 0.45662117004394531 0.20850289293230162 +1686 5 5.931283 0.93128299713134766 0.86728802074594569 +1687 7 6.06433344 0.93566656112670898 0.87547191361068144 +1688 3 3.90431213 0.9043121337890625 0.81778043531812727 +1689 6 6.370762 0.37076187133789063 0.13746436523797456 +1690 4 4.496808 0.49680805206298828 0.24681824059462087 +1691 7 6.543379 0.45662117004394531 0.20850289293230162 +1692 6 6.363645 0.36364507675170898 0.13223774184575632 +1693 5 5.39188766 0.39188766479492188 0.15357594181841705 +1694 6 5.71193361 0.28806638717651367 0.08298224342092908 +1695 6 6.55674648 0.55674648284912109 0.30996664616486669 +1696 6 5.720357 0.27964305877685547 0.078200240322075842 +1697 6 6.25116253 0.25116252899169922 0.063082615969506151 +1698 6 6.363645 0.36364507675170898 0.13223774184575632 +1699 6 6.13921261 0.13921260833740234 0.019380150320102985 +1700 6 5.93687057 0.063129425048828125 0.0039853243069956079 +1701 5 5.58175659 0.581756591796875 0.33844073209911585 +1702 4 4.31816 0.31816005706787109 0.10122582191343099 +1703 5 5.335852 0.33585214614868164 0.11279666407267541 +1704 5 5.335852 0.33585214614868164 0.11279666407267541 +1705 6 6.527788 0.52778816223144531 0.27856034419164644 +1706 6 5.994899 0.0051012039184570313 2.602228141768137E-05 +1707 5 5.3597784 0.35977840423583984 0.12944050015448738 +1708 4 4.58082151 0.58082151412963867 0.33735363127584606 +1709 5 5.794777 0.79477691650390625 0.63167034700745717 +1710 5 5.04373169 0.043731689453125 0.0019124606624245644 +1711 5 6.12955952 1.1295595169067383 1.275904702234584 +1712 6 5.66090155 0.33909845352172852 0.11498776118082787 +1713 6 5.46919 0.53080987930297852 0.28175912796564262 +1714 5 5.35511971 0.35511970520019531 0.12611000502147363 +1715 8 7.17331171 0.82668828964233398 0.68341352823176749 +1716 6 6.184057 0.18405723571777344 0.033877066020068014 +1717 6 5.552837 0.44716310501098633 0.19995484248306639 +1718 4 5.24975443 1.2497544288635254 1.5618861324639965 +1719 6 5.822894 0.17710590362548828 0.031366501099000743 +1720 7 6.265804 0.73419618606567383 0.53904403963338154 +1721 7 6.404914 0.59508609771728516 0.35412746369638626 +1722 6 6.21475172 0.2147517204284668 0.046118301426986363 +1723 8 7.17331171 0.82668828964233398 0.68341352823176749 +1724 6 6.31798267 0.31798267364501953 0.101112980738435 +1725 6 5.670131 0.32986879348754883 0.10881342091693114 +1726 6 6.60087347 0.60087347030639648 0.36104892731805194 +1727 6 6.0132947 0.013294696807861328 0.00017674896321295819 +1728 5 5.35511971 0.35511970520019531 0.12611000502147363 +1729 6 6.34329748 0.34329748153686523 0.11785316082955433 +1730 6 5.882648 0.11735200881958008 0.0137714939739908 +1731 6 5.65552044 0.34447956085205078 0.11866616784482176 +1732 5 5.520096 0.5200958251953125 0.27049966738559306 +1733 6 5.768575 0.23142480850219727 0.053557441990278676 +1734 6 5.80637026 0.19362974166870117 0.037492476858687951 +1735 6 6.50981569 0.50981569290161133 0.25991204072875007 +1736 5 5.328799 0.32879877090454102 0.10810863174833685 +1737 6 5.80637026 0.19362974166870117 0.037492476858687951 +1738 5 5.449398 0.44939804077148438 0.20195859904924873 +1739 4 4.25049448 0.25049448013305664 0.062747484577130308 +1740 6 5.324389 0.67561101913452148 0.45645024917598676 +1741 6 6.68758 0.68758010864257813 0.47276640580093954 +1742 6 5.503512 0.49648809432983398 0.24650042781127013 +1743 6 5.656073 0.34392690658569336 0.11828571707360425 +1744 5 5.665838 0.66583776473999023 0.44333992895394658 +1745 5 5.11254168 0.11254167556762695 0.012665628739569001 +1746 5 5.823897 0.82389688491821289 0.67880607697793494 +1747 6 5.656073 0.34392690658569336 0.11828571707360425 +1748 5 5.62416 0.62415981292724609 0.38957547207337484 +1749 6 5.776405 0.22359514236450195 0.049994787689001896 +1750 6 6.177006 0.17700576782226563 0.031331041842349805 +1751 7 6.46401453 0.53598546981811523 0.28728042385614572 +1752 6 5.49817276 0.50182723999023438 0.25183057879621629 +1753 7 6.345841 0.6541590690612793 0.42792408763511958 +1754 6 6.470667 0.47066688537597656 0.22152731698952266 +1755 6 5.503512 0.49648809432983398 0.24650042781127013 +1756 5 5.198939 0.19893884658813477 0.039576664681817419 +1757 5 5.099308 0.099308013916015625 0.009862081627943553 +1758 5 5.145771 0.14577102661132813 0.021249192199320532 +1759 5 4.837293 0.16270685195922852 0.026473519674482304 +1760 6 5.61023664 0.38976335525512695 0.1519154730997343 +1761 6 5.76614141 0.23385858535766602 0.054689837945488762 +1762 7 6.44400644 0.55599355697631836 0.30912883539917857 +1763 6 5.63683 0.36317014694213867 0.13189255562997459 +1764 5 5.198939 0.19893884658813477 0.039576664681817419 +1765 5 5.099308 0.099308013916015625 0.009862081627943553 +1766 5 5.14904 0.14904022216796875 0.022212987823877484 +1767 5 5.0502 0.050199985504150391 0.0025200385446169093 +1768 5 5.199506 0.19950580596923828 0.039802566615435353 +1769 7 6.637015 0.36298513412475586 0.131758207595567 +1770 6 5.911365 0.088634967803955078 0.0078561575176081533 +1771 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1772 6 5.90241241 0.09758758544921875 0.0095233368338085711 +1773 6 5.911365 0.088634967803955078 0.0078561575176081533 +1774 6 6.102439 0.10243892669677734 0.010493733702787722 +1775 6 6.09364557 0.093645572662353516 0.0087694932792601321 +1776 5 5.3519 0.35190010070800781 0.12383368087830604 +1777 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1778 8 7.2947197 0.70528030395507813 0.49742030714696739 +1779 8 7.2947197 0.70528030395507813 0.49742030714696739 +1780 5 5.846626 0.84662580490112305 0.71677525352447446 +1781 4 4.88433266 0.88433265686035156 0.7820442479896883 +1782 6 6.15452433 0.15452432632446289 0.023877767426029095 +1783 6 5.11111975 0.88888025283813477 0.79010810388558639 +1784 7 6.66374445 0.33625555038452148 0.11306779516439747 +1785 6 6.15452433 0.15452432632446289 0.023877767426029095 +1786 7 6.39855957 0.6014404296875 0.36173059046268463 +1787 7 6.86035776 0.13964223861694336 0.019499954805951347 +1788 5 6.093183 1.0931830406188965 1.1950491602967759 +1789 7 6.359563 0.64043712615966797 0.41015971256365447 +1790 5 5.47426462 0.47426462173461914 0.22492693142908138 +1791 5 5.364561 0.36456108093261719 0.13290478173075826 +1792 6 5.68573856 0.31426143646240234 0.098760250447412545 +1793 5 5.028987 0.028986930847167969 0.00084024215993849793 +1794 5 5.18260241 0.1826024055480957 0.033343638511951212 +1795 6 5.328547 0.67145299911499023 0.45084913002051508 +1796 5 6.180702 1.1807022094726563 1.3940577074536122 +1797 8 6.97266769 1.0273323059082031 1.0554116667626658 +1798 6 5.629581 0.37041902542114258 0.13721025439394907 +1799 6 5.702408 0.2975921630859375 0.088561095530167222 +1800 6 5.259844 0.74015617370605469 0.5478311614751874 +1801 5 5.11915636 0.1191563606262207 0.014198238277685959 +1802 6 5.629581 0.37041902542114258 0.13721025439394907 +1803 6 5.702408 0.2975921630859375 0.088561095530167222 +1804 6 5.259844 0.74015617370605469 0.5478311614751874 +1805 5 5.27370834 0.27370834350585938 0.074916257304721512 +1806 5 4.864911 0.13508892059326172 0.01824901646705257 +1807 6 6.16377926 0.16377925872802734 0.026823645589502121 +1808 5 5.27370834 0.27370834350585938 0.074916257304721512 +1809 6 6.16377926 0.16377925872802734 0.026823645589502121 +1810 6 5.287707 0.71229314804077148 0.5073615287458324 +1811 5 4.864911 0.13508892059326172 0.01824901646705257 +1812 6 6.20445538 0.20445537567138672 0.041802000640927872 +1813 6 5.9327035 0.067296504974365234 0.0045288195817647647 +1814 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1815 6 5.82937336 0.17062664031982422 0.029113450386830664 +1816 7 6.872754 0.12724590301513672 0.01619151983413758 +1817 4 4.45179462 0.45179462432861328 0.2041183825722328 +1818 6 6.37151432 0.37151432037353516 0.13802289024260972 +1819 6 6.391697 0.39169692993164063 0.15342648491787259 +1820 6 5.82937336 0.17062664031982422 0.029113450386830664 +1821 5 5.9026103 0.90261030197143555 0.81470535722496606 +1822 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1823 6 5.900709 0.099290847778320313 0.0098586724525375757 +1824 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1825 5 5.258325 0.25832509994506836 0.066731857261629557 +1826 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1827 6 5.900709 0.099290847778320313 0.0098586724525375757 +1828 6 5.753486 0.24651384353637695 0.060769075055077337 +1829 7 6.53176165 0.46823835372924805 0.21924715590307642 +1830 7 6.53176165 0.46823835372924805 0.21924715590307642 +1831 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1832 7 6.53176165 0.46823835372924805 0.21924715590307642 +1833 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1834 6 5.84620237 0.15379762649536133 0.023653709915606669 +1835 5 4.988597 0.011403083801269531 0.00013003032017877558 +1836 6 5.77450943 0.22549057006835938 0.050845997189753689 +1837 7 6.83298 0.16701984405517578 0.027895628308215237 +1838 6 5.66736031 0.33263969421386719 0.11064916616669507 +1839 6 5.77450943 0.22549057006835938 0.050845997189753689 +1840 5 6.134337 1.1343369483947754 1.2867203124935713 +1841 7 6.83298 0.16701984405517578 0.027895628308215237 +1842 6 5.98937035 0.010629653930664063 0.00011298954268568195 +1843 6 6.24796629 0.24796628952026367 0.061487280738447225 +1844 6 6.495384 0.49538421630859375 0.2454055217676796 +1845 5 5.18946362 0.18946361541748047 0.035896461567062943 +1846 5 5.40275526 0.4027552604675293 0.16221179983426737 +1847 5 5.18946362 0.18946361541748047 0.035896461567062943 +1848 5 5.044584 0.044583797454833984 0.0019877149954936613 +1849 6 5.91228 0.087719917297363281 0.0076947838906562538 +1850 7 5.84083033 1.1591696739196777 1.343674332935052 +1851 6 6.495384 0.49538421630859375 0.2454055217676796 +1852 7 6.6136837 0.38631629943847656 0.14924028321183869 +1853 5 5.151337 0.1513371467590332 0.022902931989165154 +1854 7 6.0943203 0.90567970275878906 0.82025572398924851 +1855 6 6.14251947 0.14251947402954102 0.020311800477657016 +1856 4 4.103467 0.10346698760986328 0.010705417525059602 +1857 5 4.735547 0.26445293426513672 0.069935354441440722 +1858 5 5.031725 0.031724929809570313 0.001006471171422163 +1859 6 6.14251947 0.14251947402954102 0.020311800477657016 +1860 6 6.02827644 0.028276443481445313 0.0007995572559593711 +1861 6 6.257553 0.2575531005859375 0.066333599621430039 +1862 7 6.827227 0.17277288436889648 0.029850469573148075 +1863 5 5.36154 0.36153984069824219 0.13071105641211034 +1864 6 6.25475264 0.25475263595581055 0.064898905526433737 +1865 6 5.23789167 0.76210832595825195 0.58080910049488921 +1866 6 5.73634434 0.26365566253662109 0.069514308387624624 +1867 6 6.45096254 0.45096254348754883 0.20336721562875937 +1868 7 6.6029706 0.39702939987182617 0.15763234436258244 +1869 7 5.99931145 1.0006885528564453 1.0013775798179267 +1870 6 6.02254629 0.022546291351318359 0.00050833525369853305 +1871 6 5.893417 0.1065831184387207 0.011359961136122365 +1872 5 5.104985 0.10498523712158203 0.011021900013474806 +1873 5 5.104985 0.10498523712158203 0.011021900013474806 +1874 5 5.75805473 0.75805473327636719 0.5746469786427042 +1875 5 5.14179373 0.14179372787475586 0.020105461264620317 +1876 6 5.905395 0.094604969024658203 0.0089501001641565381 +1877 6 5.79698658 0.20301342010498047 0.041214448742721288 +1878 6 5.723346 0.27665376663208008 0.076537306591717424 +1879 6 5.858292 0.1417078971862793 0.020081128124957104 +1880 5 5.428381 0.42838096618652344 0.18351025219089934 +1881 6 5.858292 0.1417078971862793 0.020081128124957104 +1882 5 5.428381 0.42838096618652344 0.18351025219089934 +1883 5 5.428381 0.42838096618652344 0.18351025219089934 +1884 5 6.015564 1.01556396484375 1.0313701666891575 +1885 6 5.858292 0.1417078971862793 0.020081128124957104 +1886 5 4.56712961 0.43287038803100586 0.18737677283411358 +1887 5 5.531196 0.53119611740112305 0.2821693151420277 +1888 5 5.54939 0.54938983917236328 0.30182919538583519 +1889 5 5.69010973 0.6901097297668457 0.4762514391188688 +1890 5 5.428381 0.42838096618652344 0.18351025219089934 +1891 5 5.475229 0.47522878646850586 0.22584239948832874 +1892 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1893 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1894 5 5.24567556 0.24567556381225586 0.060356482654469801 +1895 6 5.76433468 0.23566532135009766 0.055538143687044794 +1896 6 5.19419336 0.80580663681030273 0.64932433592753114 +1897 6 5.19419336 0.80580663681030273 0.64932433592753114 +1898 6 5.39263535 0.60736465454101563 0.36889182358572725 +1899 7 6.988717 0.011282920837402344 0.00012730430262308801 +1900 6 5.82769728 0.1723027229309082 0.02968822832940532 +1901 5 5.609328 0.60932779312133789 0.37128035947011995 +1902 6 5.70890331 0.29109668731689453 0.084737281366869865 +1903 5 5.44353 0.44353008270263672 0.19671893426220777 +1904 6 5.76433468 0.23566532135009766 0.055538143687044794 +1905 6 5.19419336 0.80580663681030273 0.64932433592753114 +1906 5 5.531166 0.53116607666015625 0.28213740099454299 +1907 7 6.67684364 0.32315635681152344 0.10443003094769665 +1908 7 6.82135153 0.17864847183227539 0.031915276488007294 +1909 5 5.497734 0.49773406982421875 0.24773920426378027 +1910 5 5.55095959 0.55095958709716797 0.30355646661428182 +1911 6 5.8620677 0.13793230056762695 0.019025319539878183 +1912 6 5.89195061 0.10804939270019531 0.01167467126288102 +1913 6 5.496035 0.50396490097045898 0.25398062141016453 +1914 6 6.51767254 0.51767253875732422 0.26798485738345335 +1915 7 6.82135153 0.17864847183227539 0.031915276488007294 +1916 5 5.55095959 0.55095958709716797 0.30355646661428182 +1917 6 5.8620677 0.13793230056762695 0.019025319539878183 +1918 6 5.76833 0.23166990280151367 0.053670943864062792 +1919 6 5.7990675 0.20093250274658203 0.040373870660005196 +1920 7 5.64435625 1.3556437492370605 1.8377699748455143 +1921 5 5.497734 0.49773406982421875 0.24773920426378027 +1922 5 5.60842752 0.60842752456665039 0.37018405265030196 +1923 5 4.886931 0.11306905746459961 0.012784611755932929 +1924 4 4.732981 0.73298120498657227 0.53726144686356747 +1925 6 5.821547 0.17845296859741211 0.031845462001228952 +1926 6 5.763718 0.2362818717956543 0.055829122939258014 +1927 5 5.778531 0.77853107452392578 0.60611063399937848 +1928 6 5.96423244 0.035767555236816406 0.0012793180076187127 +1929 5 5.5253 0.52530002593994141 0.27594011725250311 +1930 6 5.64313173 0.35686826705932617 0.12735496003392655 +1931 3 3.42147088 0.42147088050842285 0.17763770311654525 +1932 6 5.02350473 0.97649526596069336 0.95354300444364526 +1933 5 5.01699162 0.016991615295410156 0.00028871499034721637 +1934 6 5.91134 0.088659763336181641 0.0078605536348277383 +1935 5 5.5253 0.52530002593994141 0.27594011725250311 +1936 6 5.64313173 0.35686826705932617 0.12735496003392655 +1937 7 6.497361 0.50263881683349609 0.25264578018777684 +1938 5 5.77335072 0.77335071563720703 0.59807132937658025 +1939 5 5.323697 0.32369709014892578 0.10477980617088178 +1940 5 4.944163 0.055837154388427734 0.0031177878101971146 +1941 5 5.323697 0.32369709014892578 0.10477980617088178 +1942 5 4.944163 0.055837154388427734 0.0031177878101971146 +1943 5 5.497555 0.49755477905273438 0.24756075815821532 +1944 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1945 6 5.75811338 0.24188661575317383 0.058509134880523561 +1946 6 5.32988358 0.67011642456054688 0.44905602246581111 +1947 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1948 7 6.17266 0.82734012603759766 0.68449168415190798 +1949 5 5.2683053 0.26830530166625977 0.071987734902222655 +1950 5 5.237333 0.23733282089233398 0.056326867872712683 +1951 4 4.32389355 0.32389354705810547 0.10490702982588118 +1952 7 6.74338341 0.25661659240722656 0.065852075498696649 +1953 6 6.021135 0.021134853363037109 0.00044668202667708101 +1954 5 5.237333 0.23733282089233398 0.056326867872712683 +1955 5 5.424599 0.42459917068481445 0.1802844557462322 +1956 5 5.31968 0.31968021392822266 0.1021954391771942 +1957 6 5.79171038 0.20828962326049805 0.043384567158000209 +1958 6 5.584745 0.41525506973266602 0.17243677293868132 +1959 5 5.1785655 0.17856550216674805 0.031885638564062901 +1960 5 5.1785655 0.17856550216674805 0.031885638564062901 +1961 5 4.79571152 0.20428848266601563 0.041733784149982966 +1962 5 5.284309 0.28430891036987305 0.080831556515704506 +1963 6 5.584745 0.41525506973266602 0.17243677293868132 +1964 5 5.307627 0.30762720108032227 0.094634494844513029 +1965 6 5.294085 0.70591497421264648 0.49831595081764135 +1966 6 5.606551 0.39344882965087891 0.15480198155364633 +1967 7 5.817037 1.1829628944396973 1.3994012096211463 +1968 6 6.12541676 0.12541675567626953 0.015729362604361086 +1969 7 6.792339 0.20766115188598633 0.043123154002614683 +1970 6 5.87826252 0.12173748016357422 0.014820014076576626 +1971 7 6.792339 0.20766115188598633 0.043123154002614683 +1972 5 5.54269075 0.54269075393676758 0.29451325440845721 +1973 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1974 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1975 6 5.394777 0.60522317886352539 0.36629509623367085 +1976 5 5.1809783 0.18097829818725586 0.032753144414755297 +1977 6 5.852116 0.14788389205932617 0.021869645530614434 +1978 6 5.504246 0.49575376510620117 0.24577179561697449 +1979 6 5.38840532 0.61159467697143555 0.37404804889979459 +1980 8 7.70184755 0.29815244674682617 0.088894881501119016 +1981 8 7.70184755 0.29815244674682617 0.088894881501119016 +1982 8 7.70184755 0.29815244674682617 0.088894881501119016 +1983 8 7.70184755 0.29815244674682617 0.088894881501119016 +1984 8 7.70184755 0.29815244674682617 0.088894881501119016 +1985 6 5.962447 0.037552833557128906 0.0014102153081694269 +1986 6 5.814902 0.18509817123413086 0.034261332994219629 +1987 5 5.80614376 0.80614376068115234 0.64986776288515102 +1988 6 5.95589161 0.044108390808105469 0.001945550139680563 +1989 7 6.713367 0.28663301467895508 0.082158485103946077 +1990 4 4.43185854 0.43185853958129883 0.18650179820929225 +1991 8 7.70184755 0.29815244674682617 0.088894881501119016 +1992 5 5.683112 0.68311214447021484 0.46664220192269568 +1993 6 5.74645329 0.25354671478271484 0.06428593657710735 +1994 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1995 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1996 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1997 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1998 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1999 6 6.65917635 0.65917634963989258 0.43451345992457391 +2000 5 5.15526772 0.15526771545410156 0.024108063462335849 +2001 5 5.116252 0.11625194549560547 0.013514514831513225 +2002 6 6.24034739 0.24034738540649414 0.057766865671737833 +2003 6 5.74645329 0.25354671478271484 0.06428593657710735 +2004 6 5.97547865 0.024521350860595703 0.00060129664802843763 +2005 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +2006 6 6.05903625 0.0590362548828125 0.0034852793905884027 +2007 6 6.035142 0.035141944885253906 0.0012349562903182232 +2008 5 5.388008 0.38800811767578125 0.15055029938230291 +2009 7 6.72901726 0.27098274230957031 0.073431646629614988 +2010 6 6.07737875 0.077378749847412109 0.0059874709279483795 +2011 5 5.388008 0.38800811767578125 0.15055029938230291 +2012 5 5.91862154 0.91862154006958008 0.84386553387980712 +2013 6 5.776343 0.22365713119506836 0.05002251233440802 +2014 5 5.092607 0.092607021331787109 0.0085760603999460727 +2015 6 6.126408 0.12640810012817383 0.01597900777801442 +2016 7 6.912972 0.087028026580810547 0.0075738774105502671 +2017 5 5.092607 0.092607021331787109 0.0085760603999460727 +2018 7 6.232492 0.76750802993774414 0.58906857601891716 +2019 6 5.776343 0.22365713119506836 0.05002251233440802 +2020 6 6.10125542 0.10125541687011719 0.010252659445541212 +2021 6 5.754315 0.24568510055541992 0.060361168634926798 +2022 6 5.4808135 0.51918649673461914 0.26955461839156669 +2023 6 5.754315 0.24568510055541992 0.060361168634926798 +2024 5 4.96590948 0.034090518951416016 0.0011621634823768545 +2025 5 5.17452765 0.17452764511108398 0.030459898908020477 +2026 5 5.023958 0.023958206176757813 0.0005739956432080362 +2027 5 5.157997 0.15799713134765625 0.024963093514088541 +2028 6 5.89450932 0.10549068450927734 0.011128284518235887 +2029 6 5.4808135 0.51918649673461914 0.26955461839156669 +2030 6 5.95882463 0.041175365447998047 0.0016954107197761914 +2031 5 5.872901 0.87290096282958984 0.76195609090882499 +2032 6 5.861079 0.13892078399658203 0.019298984226225002 +2033 5 5.812295 0.81229496002197266 0.65982310207709816 +2034 5 5.461388 0.46138811111450195 0.212878989077808 +2035 5 5.35088253 0.35088253021240234 0.12311855000825744 +2036 6 5.8191 0.18090009689331055 0.032724845056009144 +2037 5 5.872901 0.87290096282958984 0.76195609090882499 +2038 5 5.41155052 0.41155052185058594 0.16937383203548961 +2039 5 4.945262 0.054738044738769531 0.0029962535418235348 +2040 6 5.609648 0.39035177230834961 0.15237450614426962 +2041 5 5.41155052 0.41155052185058594 0.16937383203548961 +2042 6 5.48308659 0.51691341400146484 0.26719947757464979 +2043 6 6.14729 0.14729022979736328 0.021694411793760082 +2044 6 5.79861736 0.20138263702392578 0.040554966494710243 +2045 5 4.945262 0.054738044738769531 0.0029962535418235348 +2046 5 5.277068 0.27706813812255859 0.076766753162701207 +2047 5 5.24007225 0.24007225036621094 0.057634685395896668 +2048 5 5.30321026 0.30321025848388672 0.091936460849865398 +2049 7 5.9215703 1.0784296989440918 1.1630106155646445 +2050 3 4.432997 1.4329972267150879 2.053481051773133 +2051 5 5.28876 0.28876018524169922 0.083382444580820447 +2052 5 5.28876 0.28876018524169922 0.083382444580820447 +2053 5 5.65129566 0.65129566192626953 0.42418603924397758 +2054 5 5.65129566 0.65129566192626953 0.42418603924397758 +2055 6 5.98419333 0.015806674957275391 0.00024985097320495697 +2056 5 5.28876 0.28876018524169922 0.083382444580820447 +2057 7 6.820425 0.17957496643066406 0.032247168568574125 +2058 5 5.500557 0.50055694580078125 0.25055725598940626 +2059 5 5.399121 0.39912080764770508 0.1592974190973564 +2060 5 5.51282835 0.51282835006713867 0.26299291663258373 +2061 6 5.91880846 0.081191539764404297 0.0065920661293148441 +2062 5 6.137123 1.1371231079101563 1.2930489625432529 +2063 5 5.53835773 0.53835773468017578 0.28982905048997054 +2064 6 5.8279 0.17210006713867188 0.029618433109135367 +2065 5 5.457421 0.45742082595825195 0.20923381202032942 +2066 5 5.50936365 0.50936365127563477 0.25945132924084646 +2067 5 5.50936365 0.50936365127563477 0.25945132924084646 +2068 6 6.24757767 0.24757766723632813 0.061294701314182021 +2069 7 6.39426327 0.60573673248291016 0.36691698907907266 +2070 6 5.37203646 0.62796354293823242 0.39433821125953727 +2071 6 6.07056141 0.070561408996582031 0.0049789124395829276 +2072 5 5.673299 0.67329883575439453 0.45333132222822314 +2073 5 5.340492 0.34049177169799805 0.11593464659404162 +2074 6 5.8279 0.17210006713867188 0.029618433109135367 +2075 5 5.53835773 0.53835773468017578 0.28982905048997054 +2076 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2077 6 5.62602234 0.3739776611328125 0.13985929102636874 +2078 6 6.08607531 0.086075305938720703 0.0074089582924443675 +2079 4 5.137181 1.1371808052062988 1.2931801837296462 +2080 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2081 5 5.31921959 0.31921958923339844 0.10190114615033963 +2082 6 5.793145 0.20685482025146484 0.04278891666126583 +2083 5 5.237396 0.2373957633972168 0.056356748478947338 +2084 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2085 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2086 5 5.515484 0.51548385620117188 0.26572360600403044 +2087 6 5.955682 0.044318199157714844 0.0019641027765828767 +2088 6 5.975536 0.024464130401611328 0.00059849367630704364 +2089 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2090 5 5.20975637 0.20975637435913086 0.04399773658428785 +2091 5 5.30951 0.30951023101806641 0.095796583104856836 +2092 5 5.085698 0.085698127746582031 0.007344169099269493 +2093 5 5.254017 0.25401687622070313 0.064524573404924013 +2094 5 5.254017 0.25401687622070313 0.064524573404924013 +2095 5 5.39610338 0.3961033821105957 0.15689788931945259 +2096 5 4.758813 0.24118709564208984 0.058171215104266594 +2097 5 5.65508652 0.65508651733398438 0.42913834519276861 +2098 6 6.13854647 0.13854646682739258 0.019195123470353792 +2099 5 5.38220358 0.38220357894897461 0.14607957576140507 +2100 5 5.65508652 0.65508651733398438 0.42913834519276861 +2101 6 6.26671 0.26670980453491211 0.071134119835051024 +2102 5 5.41741562 0.41741561889648438 0.17423579889873508 +2103 5 5.247345 0.247344970703125 0.061179534532129765 +2104 5 5.38220358 0.38220357894897461 0.14607957576140507 +2105 5 4.758813 0.24118709564208984 0.058171215104266594 +2106 5 5.057006 0.057005882263183594 0.0032496706126039498 +2107 6 5.77749348 0.22250652313232422 0.049509152836435533 +2108 6 6.13854647 0.13854646682739258 0.019195123470353792 +2109 6 5.957272 0.042727947235107422 0.001825677474926124 +2110 5 5.11222172 0.11222171783447266 0.012593713953719998 +2111 5 5.11222172 0.11222171783447266 0.012593713953719998 +2112 5 5.11222172 0.11222171783447266 0.012593713953719998 +2113 5 5.136051 0.13605117797851563 0.018509923029341735 +2114 6 5.957272 0.042727947235107422 0.001825677474926124 +2115 5 5.11222172 0.11222171783447266 0.012593713953719998 +2116 4 5.84926033 1.8492603302001953 3.4197637688521354 +2117 5 5.63614273 0.63614273071289063 0.40467757383885328 +2118 6 6.353011 0.35301113128662109 0.12461685881226003 +2119 4 5.739438 1.7394380569458008 3.0256447539513829 +2120 5 5.592541 0.59254121780395508 0.35110509479659413 +2121 7 6.842314 0.15768623352050781 0.024864948241884122 +2122 5 5.53295135 0.53295135498046875 0.28403714677551761 +2123 5 5.592541 0.59254121780395508 0.35110509479659413 +2124 7 6.842314 0.15768623352050781 0.024864948241884122 +2125 5 5.52707672 0.52707672119140625 0.2778098700218834 +2126 5 5.25731373 0.25731372833251953 0.066210354788381665 +2127 5 4.86935139 0.13064861297607422 0.017069060072572029 +2128 6 5.41065741 0.58934259414672852 0.34732469327559556 +2129 5 6.337489 1.337489128112793 1.7888771678199191 +2130 5 5.82943773 0.8294377326965332 0.68796695242076567 +2131 6 5.59359074 0.40640926361083984 0.16516848954870511 +2132 6 5.59359074 0.40640926361083984 0.16516848954870511 +2133 6 5.91878843 0.081211566925048828 0.0065953186024216848 +2134 6 6.26523066 0.26523065567016602 0.070347300707226168 +2135 5 5.80142641 0.80142641067504883 0.64228429172749202 +2136 6 6.29388428 0.29388427734375 0.08636796846985817 +2137 5 5.80142641 0.80142641067504883 0.64228429172749202 +2138 5 5.58149242 0.58149242401123047 0.33813343918245664 +2139 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2140 5 5.238538 0.23853778839111328 0.056900276490523538 +2141 5 5.238538 0.23853778839111328 0.056900276490523538 +2142 5 5.346484 0.34648418426513672 0.12005128994587722 +2143 7 6.779074 0.22092580795288086 0.048808212619633196 +2144 6 5.85388136 0.1461186408996582 0.021350657218363267 +2145 6 5.790298 0.2097020149230957 0.043974935062806253 +2146 6 5.929391 0.070609092712402344 0.0049856439736686298 +2147 5 5.50856447 0.50856447219848633 0.25863782238252497 +2148 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2149 6 6.505095 0.50509500503540039 0.25512096411171115 +2150 6 6.639851 0.63985109329223633 0.40940942158727012 +2151 5 5.238538 0.23853778839111328 0.056900276490523538 +2152 6 5.64773 0.35227012634277344 0.12409424191355356 +2153 6 5.92296648 0.077033519744873047 0.0059341631642837456 +2154 4 4.198002 0.19800186157226563 0.039204737186082639 +2155 5 5.715006 0.71500587463378906 0.51123340076082968 +2156 4 5.04174948 1.0417494773864746 1.085241973634993 +2157 6 6.246933 0.2469329833984375 0.06097589829005301 +2158 6 6.27462959 0.27462959289550781 0.075421413293952355 +2159 4 5.01505 1.015049934387207 1.0303263692994733 +2160 6 6.67232943 0.67232942581176758 0.45202685681238108 +2161 7 6.62193441 0.37806558609008789 0.14293358738564166 +2162 6 5.09313726 0.90686273574829102 0.8224000214888747 +2163 6 6.246933 0.2469329833984375 0.06097589829005301 +2164 5 5.51115274 0.51115274429321289 0.26127712799848268 +2165 5 5.17895126 0.17895126342773438 0.032023554682382382 +2166 5 5.17895126 0.17895126342773438 0.032023554682382382 +2167 7 6.7765646 0.22343540191650391 0.049923378829589637 +2168 7 6.7765646 0.22343540191650391 0.049923378829589637 +2169 7 6.7765646 0.22343540191650391 0.049923378829589637 +2170 7 6.7765646 0.22343540191650391 0.049923378829589637 +2171 7 6.7765646 0.22343540191650391 0.049923378829589637 +2172 5 4.84022141 0.15977859497070313 0.025529199410811998 +2173 5 5.25834274 0.25834274291992188 0.066740972819388844 +2174 7 6.7765646 0.22343540191650391 0.049923378829589637 +2175 7 6.770401 0.2295989990234375 0.052715700352564454 +2176 5 4.84022141 0.15977859497070313 0.025529199410811998 +2177 7 5.39672947 1.6032705307006836 2.5704763946132516 +2178 5 5.25834274 0.25834274291992188 0.066740972819388844 +2179 6 5.89384937 0.10615062713623047 0.011267955641415028 +2180 6 5.356053 0.64394712448120117 0.4146678991276076 +2181 6 6.08375168 0.083751678466796875 0.0070143436460057274 +2182 5 5.390071 0.39007091522216797 0.15215531890225975 +2183 5 5.441367 0.44136714935302734 0.19480496052801755 +2184 6 5.66160774 0.33839225769042969 0.11450932006482617 +2185 7 6.191624 0.80837583541870117 0.65347149128888304 +2186 5 5.19513273 0.19513273239135742 0.03807678325051711 +2187 5 5.130219 0.1302189826965332 0.016956983454520014 +2188 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2189 6 6.26448154 0.26448154449462891 0.06995048737826437 +2190 6 6.82654762 0.82654762268066406 0.68318097255905741 +2191 5 5.425485 0.42548513412475586 0.18103759936116148 +2192 6 5.45986128 0.54013872146606445 0.29174983842699476 +2193 6 6.26448154 0.26448154449462891 0.06995048737826437 +2194 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2195 5 5.130219 0.1302189826965332 0.016956983454520014 +2196 6 5.875051 0.12494897842407227 0.015612247209219277 +2197 6 6.14725447 0.14725446701049805 0.021683878054545858 +2198 5 5.17893553 0.17893552780151367 0.032017923109606272 +2199 6 5.539782 0.46021795272827148 0.21180056401340153 +2200 5 5.37913132 0.37913131713867188 0.14374055563530419 +2201 6 5.54702854 0.45297145843505859 0.20518314215678402 +2202 5 5.17893553 0.17893552780151367 0.032017923109606272 +2203 5 5.33585262 0.33585262298583984 0.11279698436646868 +2204 5 4.981754 0.018246173858642578 0.00033292286047981179 +2205 5 5.47519064 0.47519063949584961 0.22580614386447451 +2206 6 5.697418 0.302581787109375 0.091555737890303135 +2207 7 6.363133 0.63686704635620117 0.40559963473447169 +2208 5 5.92743444 0.92743444442749023 0.86013464871052747 +2209 6 6.38974 0.389739990234375 0.15189725998789072 +2210 7 5.881483 1.1185169219970703 1.2510801047938003 +2211 6 6.051986 0.051986217498779297 0.0027025668098303868 +2212 6 6.38974 0.389739990234375 0.15189725998789072 +2213 6 6.225851 0.22585105895996094 0.051008700833335752 +2214 5 5.92743444 0.92743444442749023 0.86013464871052747 +2215 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2216 5 5.22257233 0.22257232666015625 0.049538440594915301 +2217 6 5.75656176 0.2434382438659668 0.059262178576545921 +2218 6 6.004971 0.0049710273742675781 2.4711113155717612E-05 +2219 7 6.9423914 0.057608604431152344 0.0033187513045049855 +2220 6 5.98822832 0.011771678924560547 0.00013857242470294295 +2221 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2222 7 6.238345 0.76165485382080078 0.58011811634878541 +2223 6 5.76465273 0.23534727096557617 0.055388337950944333 +2224 7 6.238345 0.76165485382080078 0.58011811634878541 +2225 4 5.334978 1.3349781036376953 1.7821665371920972 +2226 5 5.42304373 0.42304372787475586 0.17896599569417049 +2227 5 5.3450017 0.3450016975402832 0.11902617130567705 +2228 7 6.38641167 0.61358833312988281 0.37649064255310805 +2229 6 6.327121 0.32712078094482422 0.10700800532595167 +2230 7 6.38641167 0.61358833312988281 0.37649064255310805 +2231 6 6.327121 0.32712078094482422 0.10700800532595167 +2232 6 5.600168 0.39983177185058594 0.15986544578117901 +2233 5 5.111535 0.11153507232666016 0.012440072358913312 +2234 5 5.26435328 0.26435327529907227 0.069882654161347091 +2235 6 5.37941647 0.62058353424072266 0.38512392297070619 +2236 5 5.251844 0.25184392929077148 0.063425364720615107 +2237 4 5.0567894 1.0567893981933594 1.1168038321338827 +2238 6 6.033932 0.033932209014892578 0.0011513948086303571 +2239 6 5.37941647 0.62058353424072266 0.38512392297070619 +2240 5 5.248432 0.24843215942382813 0.061718537835986353 +2241 5 5.251844 0.25184392929077148 0.063425364720615107 +2242 5 5.399409 0.39940881729125977 0.15952740333000293 +2243 5 5.80063057 0.80063056945800781 0.64100930875065387 +2244 5 5.151465 0.15146493911743164 0.022941627781847274 +2245 7 5.89144135 1.1085586547851563 1.2289022910990752 +2246 4 5.0567894 1.0567893981933594 1.1168038321338827 +2247 6 6.033932 0.033932209014892578 0.0011513948086303571 +2248 6 5.807818 0.19218206405639648 0.036933945744976882 +2249 5 5.127346 0.12734603881835938 0.016217013602727093 +2250 6 5.35683775 0.64316225051879883 0.41365768049240614 +2251 7 6.476783 0.52321720123291016 0.2737562396659996 +2252 5 5.24472237 0.24472236633300781 0.059889036583626876 +2253 5 5.127346 0.12734603881835938 0.016217013602727093 +2254 6 5.68012667 0.31987333297729492 0.10231894915000339 +2255 6 5.649487 0.35051298141479492 0.12285935014028837 +2256 5 5.77087641 0.77087640762329102 0.59425043583019033 +2257 6 5.534438 0.46556186676025391 0.21674785178129241 +2258 5 5.237371 0.23737096786499023 0.056344976385162227 +2259 6 5.534438 0.46556186676025391 0.21674785178129241 +2260 5 5.237371 0.23737096786499023 0.056344976385162227 +2261 6 5.32792854 0.67207145690917969 0.45168004319202737 +2262 6 5.51419926 0.48580074310302734 0.23600236199945357 +2263 5 5.17338371 0.17338371276855469 0.030061911853408674 +2264 6 6.11459446 0.11459445953369141 0.013131890155818837 +2265 5 5.17338371 0.17338371276855469 0.030061911853408674 +2266 5 5.259477 0.25947713851928711 0.06732838541415731 +2267 6 6.11459446 0.11459445953369141 0.013131890155818837 +2268 6 5.62352276 0.37647724151611328 0.14173511337958189 +2269 6 5.99339151 0.0066084861755371094 4.367208953226509E-05 +2270 7 6.46453953 0.53546047210693359 0.28671791718898021 +2271 6 5.59352732 0.40647268295288086 0.1652200419869132 +2272 6 6.096581 0.096580982208251953 0.0093278861243106803 +2273 5 4.882008 0.11799192428588867 0.013922094196686885 +2274 7 6.46453953 0.53546047210693359 0.28671791718898021 +2275 4 5.08899927 1.0889992713928223 1.1859194130940978 +2276 6 5.319647 0.68035316467285156 0.46288042868036428 +2277 6 6.20249128 0.20249128341674805 0.041002719859761783 +2278 6 5.319647 0.68035316467285156 0.46288042868036428 +2279 5 5.251488 0.25148820877075195 0.06324631915072132 +2280 6 6.21316671 0.21316671371459961 0.045440047835882069 +2281 6 6.06043863 0.060438632965087891 0.0036528283546886087 +2282 5 5.13450336 0.13450336456298828 0.018091155078764132 +2283 5 5.13450336 0.13450336456298828 0.018091155078764132 +2284 5 5.13450336 0.13450336456298828 0.018091155078764132 +2285 5 5.13450336 0.13450336456298828 0.018091155078764132 +2286 5 5.239092 0.23909187316894531 0.057164923815435031 +2287 5 5.03401 0.034009933471679688 0.0011566755747480784 +2288 5 5.13450336 0.13450336456298828 0.018091155078764132 +2289 7 7.010147 0.0101470947265625 0.0001029635313898325 +2290 7 6.22187948 0.77812051773071289 0.60547154011351267 +2291 6 6.003072 0.0030717849731445313 9.4358629212365486E-06 +2292 6 5.163496 0.83650398254394531 0.69973891281188116 +2293 7 7.010147 0.0101470947265625 0.0001029635313898325 +2294 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2295 6 5.405581 0.59441900253295898 0.3533339505722779 +2296 7 6.178634 0.8213658332824707 0.67464183208380746 +2297 6 5.51448441 0.48551559448242188 0.23572539248561952 +2298 8 7.070608 0.92939186096191406 0.8637692312222498 +2299 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2300 7 6.941374 0.058626174926757813 0.0034370283865428064 +2301 5 5.82642746 0.82642745971679688 0.68298234617395792 +2302 5 5.069897 0.069897174835205078 0.004885615049943226 +2303 5 5.160475 0.16047477722167969 0.025752154124347726 +2304 6 5.08372641 0.91627359390258789 0.83955729888316455 +2305 7 6.6948843 0.30511569976806641 0.093095590244956838 +2306 5 5.255328 0.25532817840576172 0.065192478688004485 +2307 5 5.56966 0.56966018676757813 0.32451272838807199 +2308 5 4.917936 0.082064151763916016 0.0067345250047310401 +2309 6 5.15906954 0.84093046188354492 0.7071640417236722 +2310 5 5.56966 0.56966018676757813 0.32451272838807199 +2311 7 6.76234055 0.23765945434570313 0.056482016239897348 +2312 5 4.917936 0.082064151763916016 0.0067345250047310401 +2313 7 6.685575 0.31442499160766602 0.098863075347480844 +2314 6 6.73747158 0.73747158050537109 0.54386433205309004 +2315 6 6.32627153 0.32627153396606445 0.10645311387656875 +2316 7 6.55684757 0.44315242767333984 0.1963840741527747 +2317 5 5.376687 0.37668704986572266 0.14189313353654143 +2318 4 5.363103 1.363102912902832 1.8580495511641857 +2319 7 7.1930356 0.19303560256958008 0.037262743859400871 +2320 6 6.450675 0.45067501068115234 0.20310796525245678 +2321 5 4.742714 0.25728607177734375 0.06619612273061648 +2322 6 5.43903542 0.56096458435058594 0.31468126489562565 +2323 6 6.52697325 0.52697324752807617 0.27770080361028704 +2324 5 5.214914 0.21491384506225586 0.046187960799443317 +2325 6 4.96547174 1.0345282554626465 1.0702487113505867 +2326 5 5.26503468 0.26503467559814453 0.070243379269413708 +2327 6 4.96547174 1.0345282554626465 1.0702487113505867 +2328 5 5.26503468 0.26503467559814453 0.070243379269413708 +2329 5 5.334872 0.33487176895141602 0.11213910164065055 +2330 6 5.69431925 0.30568075180053711 0.093440722021341571 +2331 5 5.632817 0.63281679153442383 0.40045709164792243 +2332 6 5.70019341 0.29980659484863281 0.089883994314732263 +2333 8 7.38234949 0.61765050888061523 0.38149215112048296 +2334 5 4.905586 0.094414234161376953 0.0089140476122793189 +2335 5 5.82466841 0.82466840744018555 0.68007798222993188 +2336 5 4.577453 0.4225468635559082 0.1785458519009353 +2337 4 5.1711154 1.1711153984069824 1.3715112763859452 +2338 5 5.36899 0.36898994445800781 0.13615357911112369 +2339 6 5.740299 0.25970077514648438 0.067444492611684836 +2340 6 5.75540924 0.24459075927734375 0.059824639523867518 +2341 5 5.36899 0.36898994445800781 0.13615357911112369 +2342 8 6.87260151 1.1273984909057617 1.2710273572965889 +2343 5 6.3333354 1.3333353996276855 1.7777832879003199 +2344 6 5.740299 0.25970077514648438 0.067444492611684836 +2345 6 5.8191905 0.18080949783325195 0.032692074506712743 +2346 4 5.19108963 1.1910896301269531 1.418694506995962 +2347 6 6.069222 0.069221973419189453 0.0047916816040469712 +2348 6 5.79119158 0.20880842208862305 0.043600957135140561 +2349 5 5.02437 0.024370193481445313 0.0005939063303230796 +2350 5 5.51743269 0.51743268966674805 0.26773658833576519 +2351 6 5.81947565 0.18052434921264648 0.032589040658649537 +2352 6 5.35855627 0.64144372940063477 0.41145005798739476 +2353 7 6.329165 0.67083501815795898 0.45001962158698916 +2354 6 6.09388351 0.093883514404296875 0.0088141142769018188 +2355 7 6.501256 0.49874401092529297 0.24874558843384875 +2356 6 5.91373 0.086269855499267578 0.0074424879678645084 +2357 5 5.588777 0.58877706527709961 0.34665843259631401 +2358 5 5.56147957 0.56147956848144531 0.31525930582211004 +2359 5 5.16718626 0.16718626022338867 0.027951245607482633 +2360 6 5.79588366 0.2041163444519043 0.041663482072408442 +2361 5 5.330882 0.33088207244873047 0.10948294586796692 +2362 6 6.38512039 0.38512039184570313 0.14831771621538792 +2363 5 5.396926 0.39692592620849609 0.15755019089647249 +2364 5 5.1075263 0.10752630233764648 0.01156190569440696 +2365 5 5.29107666 0.29107666015625 0.084725622087717056 +2366 5 5.311592 0.31159210205078125 0.097089638060424477 +2367 6 5.39217 0.60783004760742188 0.36945736677444074 +2368 6 5.97187042 0.02812957763671875 0.00079127313802018762 +2369 6 6.071237 0.071237087249755859 0.0050747225998293288 +2370 7 6.65556 0.34443998336791992 0.11863890214249295 +2371 5 5.03869963 0.038699626922607422 0.0014976611239490012 +2372 4 4.18628931 0.18628931045532227 0.034703707189919442 +2373 3 3.84731722 0.84731721878051758 0.71794646924195149 +2374 6 6.297287 0.2972869873046875 0.088379552820697427 +2375 6 6.81347132 0.81347131729125977 0.66173558405557742 +2376 6 6.297287 0.2972869873046875 0.088379552820697427 +2377 6 5.87790442 0.12209558486938477 0.014907331844597138 +2378 5 5.080402 0.080401897430419922 0.0064644651104117656 +2379 4 4.55011559 0.55011558532714844 0.30262715721983113 +2380 4 4.447009 0.44700908660888672 0.19981712351091119 +2381 6 6.23594141 0.23594141006469727 0.055668348983317628 +2382 8 7.02860928 0.97139072418212891 0.94359993902708084 +2383 6 6.467941 0.4679408073425293 0.21896859917637812 +2384 8 7.02860928 0.97139072418212891 0.94359993902708084 +2385 5 5.768393 0.76839303970336914 0.59042786346458342 +2386 4 4.982087 0.98208713531494141 0.96449514135110803 +2387 4 4.92572927 0.92572927474975586 0.85697469012870897 +2388 4 4.838168 0.83816814422607422 0.70252583799538115 +2389 8 7.15358829 0.84641170501708984 0.71641277438993711 +2390 8 6.68599939 1.3140006065368652 1.7265975939792497 +2391 6 5.951952 0.048048019409179688 0.002308612169144908 +2392 7 6.037923 0.96207714080810547 0.9255924248654992 +2393 6 6.037923 0.037922859191894531 0.0014381432492882595 +2394 5 5.070125 0.070125102996826172 0.004917530070315479 +2395 5 5.324506 0.32450580596923828 0.10530401810774492 +2396 5 4.995414 0.0045862197875976563 2.1033411940152291E-05 +2397 6 6.378008 0.37800788879394531 0.14288996399045573 +2398 6 6.13482952 0.13482952117919922 0.018178999781412131 +2399 6 6.16249466 0.16249465942382813 0.026404514341265894 +2400 4 4.94752169 0.94752168655395508 0.8977973464900515 +2401 4 5.241969 1.241969108581543 1.5424872666708325 +2402 6 5.76762533 0.23237466812133789 0.053997986384501928 +2403 6 5.933714 0.066286087036132813 0.0043938453345617745 +2404 5 5.02169943 0.021699428558349609 0.00047086519975891861 +2405 5 5.430184 0.43018388748168945 0.18505817704885885 +2406 6 6.83018541 0.8301854133605957 0.68920782055670315 +2407 6 6.28223658 0.28223657608032227 0.079657484877543538 +2408 5 5.383545 0.383544921875 0.14710670709609985 +2409 4 5.90790749 1.9079074859619141 3.6401109749895113 +2410 6 5.853688 0.14631223678588867 0.021407270633289954 +2411 6 5.365198 0.63480186462402344 0.40297340733013698 +2412 4 4.653695 0.65369510650634766 0.42731729227034521 +2413 4 5.90790749 1.9079074859619141 3.6401109749895113 +2414 4 4.4736166 0.47361660003662109 0.22431268383024872 +2415 5 5.58259344 0.58259344100952148 0.33941511750731479 +2416 6 5.853688 0.14631223678588867 0.021407270633289954 +2417 5 5.08736038 0.087360382080078125 0.0076318363571772352 +2418 5 5.1927886 0.19278860092163086 0.037167444645319847 +2419 5 5.01314974 0.013149738311767578 0.00017291561766796804 +2420 7 6.78615475 0.21384525299072266 0.045729792226666177 +2421 5 5.62462759 0.62462759017944336 0.39015962641337865 +2422 5 4.834279 0.16572093963623047 0.027463429833915143 +2423 6 5.79968929 0.20031070709228516 0.040124379375811259 +2424 5 4.834279 0.16572093963623047 0.027463429833915143 +2425 6 5.79968929 0.20031070709228516 0.040124379375811259 +2426 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2427 6 5.67294264 0.3270573616027832 0.10696651777857369 +2428 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2429 6 5.67294264 0.3270573616027832 0.10696651777857369 +2430 5 5.191099 0.19109916687011719 0.036518891578452894 +2431 5 5.090718 0.090717792510986328 0.0082297178780663671 +2432 5 5.212568 0.21256780624389648 0.045185072251342717 +2433 6 5.457381 0.54261922836303711 0.29443562698929782 +2434 6 5.55754471 0.44245529174804688 0.19576668519584928 +2435 4 5.018812 1.0188121795654297 1.0379782572308613 +2436 5 5.1477704 0.14777040481567383 0.021836092539388119 +2437 6 5.767265 0.23273515701293945 0.05416565330983758 +2438 5 5.1477704 0.14777040481567383 0.021836092539388119 +2439 6 5.80857754 0.19142246246337891 0.036642559135543706 +2440 5 5.177423 0.17742300033569336 0.031478921048119446 +2441 6 6.0388093 0.038809299468994141 0.0015061617252740689 +2442 5 5.33315 0.33314990997314453 0.11098886251511431 +2443 5 5.356635 0.35663509368896484 0.12718859005053673 +2444 5 5.33315 0.33314990997314453 0.11098886251511431 +2445 5 5.36508751 0.36508750915527344 0.13328888934120187 +2446 5 5.356635 0.35663509368896484 0.12718859005053673 +2447 6 5.930377 0.069622993469238281 0.0048473612196175964 +2448 6 6.02893972 0.028939723968505859 0.00083750762337331253 +2449 6 6.112941 0.11294078826904297 0.012755621654832794 +2450 5 5.138178 0.13817787170410156 0.019093124228675151 +2451 5 5.138178 0.13817787170410156 0.019093124228675151 +2452 7 6.46374655 0.53625345230102539 0.28756776510476811 +2453 6 6.33004045 0.33004045486450195 0.10892670184716735 +2454 5 5.5165844 0.51658439636230469 0.26685943856500671 +2455 6 5.63751173 0.3624882698059082 0.1313977457468809 +2456 6 5.84722948 0.1527705192565918 0.023338831553928685 +2457 6 5.84722948 0.1527705192565918 0.023338831553928685 +2458 6 5.63751173 0.3624882698059082 0.1313977457468809 +2459 5 5.22885036 0.22885036468505859 0.052372489416484314 +2460 5 5.22885036 0.22885036468505859 0.052372489416484314 +2461 5 4.82563972 0.17436027526855469 0.030401505591726163 +2462 5 4.90771 0.092289924621582031 0.0085174301866572932 +2463 7 6.190032 0.80996799468994141 0.65604815242204495 +2464 5 5.229953 0.22995281219482422 0.052878295836308098 +2465 5 5.131188 0.13118791580200195 0.017210269252473154 +2466 5 5.164425 0.16442489624023438 0.02703554650361184 +2467 6 5.66543436 0.33456563949584961 0.1119341671312668 +2468 6 5.811642 0.18835783004760742 0.035478672140243361 +2469 5 5.10665464 0.10665464401245117 0.011375213089422687 +2470 5 5.55674934 0.55674934387207031 0.3099698319019808 +2471 7 6.85693 0.14307022094726563 0.020469088121899404 +2472 6 5.627016 0.37298393249511719 0.13911701389952214 +2473 6 5.3198247 0.6801753044128418 0.46263844473310201 +2474 7 6.27704525 0.72295475006103516 0.52266357063581381 +2475 5 4.89538431 0.10461568832397461 0.010944442243498997 +2476 6 5.59821844 0.40178155899047852 0.16142842114481937 +2477 7 6.27704525 0.72295475006103516 0.52266357063581381 +2478 6 5.4796133 0.52038669586181641 0.27080231322997861 +2479 6 5.65785551 0.34214448928833008 0.11706285155037222 +2480 5 5.200323 0.20032310485839844 0.040129346340108896 +2481 6 5.394372 0.60562801361083984 0.36678529087021161 +2482 6 5.52501059 0.47498941421508789 0.22561494361639234 +2483 6 5.4796133 0.52038669586181641 0.27080231322997861 +2484 5 5.12939167 0.12939167022705078 0.01674220432414586 +2485 6 5.59504271 0.40495729446411133 0.16399041033969297 +2486 5 5.50079441 0.50079441070556641 0.25079504179393552 +2487 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2488 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2489 6 5.56793261 0.4320673942565918 0.18668223317968113 +2490 6 5.73469973 0.26530027389526367 0.070384235328901923 +2491 5 5.48845625 0.48845624923706055 0.23858950741873741 +2492 6 5.56793261 0.4320673942565918 0.18668223317968113 +2493 4 5.123062 1.1230621337890625 1.2612685563508421 +2494 4 5.123062 1.1230621337890625 1.2612685563508421 +2495 5 5.651345 0.65134477615356445 0.42425001742253698 +2496 5 5.6806283 0.68062829971313477 0.46325488237039281 +2497 5 5.313193 0.31319284439086914 0.098089757777643172 +2498 5 5.313193 0.31319284439086914 0.098089757777643172 +2499 6 6.38280439 0.38280439376831055 0.14653920388832375 +2500 5 5.313193 0.31319284439086914 0.098089757777643172 +2501 5 5.424 0.42399978637695313 0.17977581884770188 +2502 4 4.899974 0.89997386932373047 0.80995296546552709 +2503 4 4.899974 0.89997386932373047 0.80995296546552709 +2504 6 5.45203543 0.54796457290649414 0.30026517316059653 +2505 6 5.481323 0.5186772346496582 0.2690260737438166 +2506 6 5.456469 0.54353094100952148 0.29542588383469592 +2507 7 6.86489058 0.13510942459106445 0.018254556613328532 +2508 6 5.3075223 0.69247770309448242 0.47952536928301015 +2509 5 5.15516758 0.15516757965087891 0.02407697777471185 +2510 6 5.557624 0.44237613677978516 0.19569664639220719 +2511 6 5.422771 0.57722902297973633 0.33319334497014097 +2512 6 5.622964 0.37703609466552734 0.1421562166806325 +2513 5 5.087558 0.087557792663574219 0.0076663670561174513 +2514 7 6.945491 0.054509162902832031 0.0029712488403674797 +2515 7 6.896848 0.10315179824829102 0.010640293481856133 +2516 6 5.80096245 0.19903755187988281 0.039615947058337042 +2517 6 5.541327 0.45867300033569336 0.21038092123694696 +2518 7 6.896848 0.10315179824829102 0.010640293481856133 +2519 5 5.26988125 0.26988124847412109 0.072835888277950289 +2520 5 5.06689453 0.06689453125 0.0044748783111572266 +2521 7 6.889004 0.11099576950073242 0.012320060847059722 +2522 8 6.341771 1.658228874206543 2.7497229992522989 +2523 5 5.927134 0.92713403701782227 0.85957752259696463 +2524 5 5.06689453 0.06689453125 0.0044748783111572266 +2525 8 6.341771 1.658228874206543 2.7497229992522989 +2526 7 6.889004 0.11099576950073242 0.012320060847059722 +2527 6 6.22118 0.22117996215820313 0.048920575660304166 +2528 6 6.05786 0.057859897613525391 0.0033477677518476412 +2529 5 5.17878962 0.17878961563110352 0.031965726657517735 +2530 6 6.09709454 0.097094535827636719 0.0094273488875842304 +2531 4 4.63009644 0.630096435546875 0.3970215180888772 +2532 4 4.63009644 0.630096435546875 0.3970215180888772 +2533 5 5.742318 0.74231815338134766 0.55103624083949398 +2534 7 5.86696339 1.1330366134643555 1.2837719674507753 +2535 6 5.663614 0.33638620376586914 0.11315567808401283 +2536 6 5.621967 0.37803316116333008 0.14290907093914029 +2537 6 5.53835869 0.46164131164550781 0.21311270061778487 +2538 6 5.53835869 0.46164131164550781 0.21311270061778487 +2539 5 5.52992725 0.52992725372314453 0.280822894238554 +2540 5 5.604961 0.60496091842651367 0.36597771282345093 +2541 6 5.663614 0.33638620376586914 0.11315567808401283 +2542 5 5.57032871 0.57032871246337891 0.32527484026013553 +2543 6 5.621967 0.37803316116333008 0.14290907093914029 +2544 6 6.133279 0.13327884674072266 0.017763250988537038 +2545 6 5.878759 0.12124109268188477 0.014699402554697372 +2546 5 5.218156 0.21815586090087891 0.047591979645403626 +2547 5 5.08556461 0.085564613342285156 0.007321303056414763 +2548 6 5.635065 0.36493492126464844 0.13317749675843515 +2549 5 5.86682272 0.86682271957397461 0.75138162716962142 +2550 5 5.08556461 0.085564613342285156 0.007321303056414763 +2551 6 5.635065 0.36493492126464844 0.13317749675843515 +2552 5 4.91085434 0.089145660400390625 0.0079469487682217732 +2553 7 6.82945776 0.17054224014282227 0.029084655672932058 +2554 7 6.783399 0.21660089492797852 0.046915947683601189 +2555 7 6.82945776 0.17054224014282227 0.029084655672932058 +2556 5 5.36953926 0.36953926086425781 0.13655926532010199 +2557 7 6.783399 0.21660089492797852 0.046915947683601189 +2558 7 6.82945776 0.17054224014282227 0.029084655672932058 +2559 5 5.189397 0.18939685821533203 0.035871169901838584 +2560 6 5.70537949 0.29462051391601563 0.086801247220137157 +2561 5 5.28348732 0.28348731994628906 0.080365060570329661 +2562 6 5.70537949 0.29462051391601563 0.086801247220137157 +2563 5 5.189397 0.18939685821533203 0.035871169901838584 +2564 6 5.399755 0.60024499893188477 0.36029405874273834 +2565 5 5.337183 0.33718299865722656 0.11369237458347925 +2566 7 6.48339272 0.51660728454589844 0.26688308644588687 +2567 5 6.3172555 1.3172554969787598 1.7351620443207594 +2568 6 5.472037 0.52796316146850586 0.27874509986781959 +2569 6 6.171783 0.1717829704284668 0.029509388929227498 +2570 5 6.3172555 1.3172554969787598 1.7351620443207594 +2571 6 6.25385761 0.25385761260986328 0.064443687479979417 +2572 5 5.263467 0.26346683502197266 0.069414773156495357 +2573 5 5.41449165 0.41449165344238281 0.17180333077340038 +2574 5 5.74912739 0.74912738800048828 0.56119184345243411 +2575 6 6.094214 0.094213962554931641 0.0088762707403020613 +2576 5 5.55226135 0.5522613525390625 0.30499260150827467 +2577 5 5.6303606 0.63036060333251953 0.39735449023373803 +2578 7 6.90196466 0.098035335540771484 0.0096109270145916526 +2579 6 5.492593 0.50740718841552734 0.25746205485575047 +2580 5 5.378673 0.37867307662963867 0.1433932989641562 +2581 7 6.623414 0.37658596038818359 0.14181698556149058 +2582 7 6.623414 0.37658596038818359 0.14181698556149058 +2583 7 6.623414 0.37658596038818359 0.14181698556149058 +2584 7 6.623414 0.37658596038818359 0.14181698556149058 +2585 7 6.623414 0.37658596038818359 0.14181698556149058 +2586 7 6.623414 0.37658596038818359 0.14181698556149058 +2587 6 5.450896 0.54910421371459961 0.30151543751912868 +2588 7 6.623414 0.37658596038818359 0.14181698556149058 +2589 4 4.47188 0.47187995910644531 0.2226706958063005 +2590 6 6.29141 0.29140996932983398 0.084919770224814783 +2591 7 6.413187 0.58681297302246094 0.34434946530745947 +2592 5 5.89621 0.8962101936340332 0.80319271117355129 +2593 5 5.977096 0.9770960807800293 0.95471675107569354 +2594 7 6.802061 0.19793891906738281 0.039179815681563923 +2595 5 4.78572226 0.21427774429321289 0.04591495169938753 +2596 5 5.26803637 0.2680363655090332 0.071843493235292044 +2597 6 6.40936327 0.4093632698059082 0.16757828666618479 +2598 5 5.26803637 0.2680363655090332 0.071843493235292044 +2599 6 5.64444828 0.35555171966552734 0.12641702535711374 +2600 7 6.711269 0.28873109817504883 0.083365647053369685 +2601 5 5.516984 0.51698398590087891 0.26727244167796016 +2602 6 6.40936327 0.4093632698059082 0.16757828666618479 +2603 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2604 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2605 6 5.749763 0.25023698806762695 0.062618550197157674 +2606 6 6.066723 0.066722869873046875 0.0044519413640955463 +2607 6 6.004938 0.0049381256103515625 2.4385084543609992E-05 +2608 6 6.19136524 0.19136524200439453 0.036620655847400485 +2609 6 5.749763 0.25023698806762695 0.062618550197157674 +2610 5 5.21728945 0.21728944778442383 0.047214704118459849 +2611 5 5.43802834 0.43802833557128906 0.19186882276335382 +2612 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2613 5 5.316313 0.31631278991699219 0.10005378106507123 +2614 5 6.02755356 1.0275535583496094 1.0558663152769441 +2615 7 6.71482038 0.28517961502075195 0.081327412823384293 +2616 7 6.71482038 0.28517961502075195 0.081327412823384293 +2617 7 6.71482038 0.28517961502075195 0.081327412823384293 +2618 7 6.17836475 0.82163524627685547 0.67508447792442894 +2619 6 5.447172 0.55282783508300781 0.30561861524256528 +2620 5 5.23616838 0.23616838455200195 0.055775505861902275 +2621 5 5.316313 0.31631278991699219 0.10005378106507123 +2622 7 6.17836475 0.82163524627685547 0.67508447792442894 +2623 7 6.71482038 0.28517961502075195 0.081327412823384293 +2624 5 6.02755356 1.0275535583496094 1.0558663152769441 +2625 5 4.932907 0.0670928955078125 0.0045014566276222467 +2626 7 6.67024565 0.32975435256958008 0.10873793303858292 +2627 7 6.191726 0.8082737922668457 0.65330652326542804 +2628 6 6.10126448 0.10126447677612305 0.010254494256741964 +2629 5 4.569814 0.43018579483032227 0.18505981807379612 +2630 6 5.93529558 0.064704418182373047 0.0041866617323194077 +2631 7 6.506482 0.49351787567138672 0.24355989360719832 +2632 5 4.742157 0.257843017578125 0.066483021713793278 +2633 5 5.672364 0.67236423492431641 0.45207366440536134 +2634 5 5.179316 0.17931604385375977 0.032154243583363495 +2635 6 6.10950756 0.10950756072998047 0.01199190585703036 +2636 5 5.672364 0.67236423492431641 0.45207366440536134 +2637 5 5.179316 0.17931604385375977 0.032154243583363495 +2638 6 6.36789942 0.36789941787719727 0.13534998167438062 +2639 6 5.970108 0.0298919677734375 0.00089352973736822605 +2640 6 6.01226473 0.012264728546142578 0.00015042356631056464 +2641 5 5.388603 0.38860321044921875 0.1510124551714398 +2642 5 5.089852 0.089851856231689453 0.0080733560682801908 +2643 5 5.421518 0.42151784896850586 0.17767729699903612 +2644 6 5.965845 0.034154891967773438 0.0011665566453302745 +2645 7 6.45913172 0.54086828231811523 0.2925384988177484 +2646 7 5.962606 1.0373940467834473 1.0761864083017372 +2647 5 5.531743 0.53174304962158203 0.28275067082086025 +2648 6 6.055601 0.055601119995117188 0.0030914845447114203 +2649 6 5.965845 0.034154891967773438 0.0011665566453302745 +2650 5 5.375029 0.37502908706665039 0.14064681614604524 +2651 5 5.00735 0.0073499679565429688 5.4022028962208424E-05 +2652 7 6.862701 0.1372990608215332 0.018851032102475074 +2653 5 5.389191 0.3891911506652832 0.15146975175616717 +2654 5 4.99643946 0.0035605430603027344 1.2677466884269961E-05 +2655 5 5.479881 0.47988080978393555 0.23028559159888573 +2656 4 5.36642933 1.366429328918457 1.8671291109285448 +2657 7 6.66357 0.33643007278442383 0.11318519387373271 +2658 7 6.43240547 0.56759452819824219 0.32216354844058515 +2659 6 6.25220728 0.25220727920532227 0.063608511684151381 +2660 6 5.396139 0.60386085510253906 0.36464793232516968 +2661 6 5.94709873 0.052901268005371094 0.0027985441565760993 +2662 6 6.15312243 0.1531224250793457 0.023446477062179838 +2663 8 6.468452 1.531548023223877 2.3456393474409651 +2664 7 6.755112 0.2448878288269043 0.059970048707555179 +2665 5 5.26342249 0.26342248916625977 0.069391407798548244 +2666 7 6.840258 0.15974187850952148 0.025517467749750722 +2667 7 6.64892 0.35107994079589844 0.12325712482925155 +2668 6 5.510326 0.48967409133911133 0.23978071572878434 +2669 5 5.402378 0.40237808227539063 0.16190812109562103 +2670 7 6.840258 0.15974187850952148 0.025517467749750722 +2671 7 6.964588 0.035411834716796875 0.0012539980380097404 +2672 7 6.438929 0.56107091903686523 0.31480057618887258 +2673 6 5.11319351 0.88680648803710938 0.78642574722471181 +2674 7 5.93575 1.0642499923706055 1.1326280462608338 +2675 7 5.96326256 1.0367374420166016 1.0748245236791263 +2676 6 6.27718973 0.27718973159790039 0.076834147303316058 +2677 6 6.43075943 0.43075942993164063 0.18555368647503201 +2678 5 5.22192669 0.22192668914794922 0.049251455356170482 +2679 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2680 6 6.6857276 0.68572759628295898 0.47022233630400478 +2681 6 6.17682171 0.17682170867919922 0.031265916660231596 +2682 6 6.14539433 0.14539432525634766 0.021139509816748614 +2683 5 5.22192669 0.22192668914794922 0.049251455356170482 +2684 6 6.398973 0.39897298812866211 0.15917944525631356 +2685 7 6.462977 0.53702306747436523 0.28839377499957664 +2686 6 6.6857276 0.68572759628295898 0.47022233630400478 +2687 5 5.45965528 0.4596552848815918 0.21128298091957731 +2688 6 6.17682171 0.17682170867919922 0.031265916660231596 +2689 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2690 6 5.39443636 0.60556364059448242 0.36670732281004348 +2691 6 6.075588 0.075588226318359375 0.0057135799579555169 +2692 6 5.428855 0.57114505767822266 0.32620667691026028 +2693 6 6.246358 0.24635791778564453 0.06069222365567839 +2694 6 6.075588 0.075588226318359375 0.0057135799579555169 +2695 6 6.371832 0.37183189392089844 0.13825895733680227 +2696 6 5.633613 0.36638689041137695 0.13423935346531835 +2697 5 5.98760462 0.98760461807250977 0.97536288163814788 +2698 6 5.428855 0.57114505767822266 0.32620667691026028 +2699 6 5.39443636 0.60556364059448242 0.36670732281004348 +2700 7 6.802134 0.19786596298217773 0.039150939306864529 +2701 5 5.51507568 0.51507568359375 0.26530295982956886 +2702 5 5.51507568 0.51507568359375 0.26530295982956886 +2703 5 5.51507568 0.51507568359375 0.26530295982956886 +2704 6 5.557806 0.44219398498535156 0.19553552035722532 +2705 6 5.60688972 0.39311027526855469 0.15453568852171884 +2706 6 5.79417 0.20583009719848633 0.042366028912738329 +2707 5 5.51507568 0.51507568359375 0.26530295982956886 +2708 6 5.668365 0.3316349983215332 0.10998177211172333 +2709 5 5.385527 0.38552713394165039 0.14863117100526324 +2710 5 5.385527 0.38552713394165039 0.14863117100526324 +2711 5 5.449205 0.44920492172241211 0.20178506169963839 +2712 5 5.503833 0.50383281707763672 0.25384750756438734 +2713 6 5.668365 0.3316349983215332 0.10998177211172333 +2714 6 5.45965528 0.5403447151184082 0.29197241115639372 +2715 6 5.87323952 0.12676048278808594 0.016068219996668631 +2716 5 5.385527 0.38552713394165039 0.14863117100526324 +2717 6 6.10622644 0.10622644424438477 0.011284057456805385 +2718 6 5.66719341 0.33280658721923828 0.11076022449651646 +2719 6 6.14106846 0.14106845855712891 0.019900309999684396 +2720 7 6.80913448 0.19086551666259766 0.036429645450880344 +2721 5 5.197515 0.19751501083374023 0.039012179504652522 +2722 7 6.88614845 0.11385154724121094 0.012962174809217686 +2723 6 6.593465 0.59346485137939453 0.35220052982276684 +2724 6 6.14106846 0.14106845855712891 0.019900309999684396 +2725 5 5.453957 0.45395708084106445 0.20607703124574073 +2726 6 5.930292 0.069707870483398438 0.0048591872073302511 +2727 6 5.986483 0.013516902923583984 0.00018270666464559326 +2728 6 5.44713926 0.55286073684692383 0.30565499434692356 +2729 7 6.42816162 0.57183837890625 0.32699913159012794 +2730 5 5.11883736 0.11883735656738281 0.014122317315923283 +2731 5 5.159798 0.15979814529418945 0.025535447239462883 +2732 5 5.14337635 0.14337635040283203 0.020556777854835673 +2733 7 6.42816162 0.57183837890625 0.32699913159012794 +2734 6 5.868908 0.13109207153320313 0.017185131218866445 +2735 6 5.44713926 0.55286073684692383 0.30565499434692356 +2736 6 5.986483 0.013516902923583984 0.00018270666464559326 +2737 7 6.00914955 0.99085044860839844 0.98178461150746443 +2738 5 4.7449894 0.25501060485839844 0.065030408590246225 +2739 7 6.73053 0.26947021484375 0.072614196687936783 +2740 6 5.63796473 0.36203527450561523 0.13106953998635618 +2741 5 4.7449894 0.25501060485839844 0.065030408590246225 +2742 6 5.878949 0.12105083465576172 0.014653304570856562 +2743 6 5.44707775 0.55292224884033203 0.30572301326265006 +2744 6 5.44707775 0.55292224884033203 0.30572301326265006 +2745 7 6.68483162 0.31516838073730469 0.099331108216574648 +2746 6 5.846201 0.15379905700683594 0.02365414993619197 +2747 6 5.86011 0.13989019393920898 0.019569266360349502 +2748 8 7.558382 0.44161796569824219 0.19502642762745381 +2749 6 5.86011 0.13989019393920898 0.019569266360349502 +2750 8 7.558382 0.44161796569824219 0.19502642762745381 +2751 6 6.354132 0.35413217544555664 0.12540959768580251 +2752 6 6.444844 0.44484376907348633 0.19788597888350523 +2753 8 6.60379028 1.396209716796875 1.9494015732780099 +2754 5 5.163789 0.16378879547119141 0.026826769521903771 +2755 5 4.94988251 0.05011749267578125 0.0025117630721069872 +2756 6 5.5096693 0.49033069610595703 0.24042419154375239 +2757 5 5.64830256 0.64830255508422852 0.42029620292873915 +2758 6 5.50835371 0.49164628982543945 0.24171607429912001 +2759 6 5.96230745 0.037692546844482422 0.0014207280876235018 +2760 6 6.071012 0.071012020111083984 0.0050427070002569963 +2761 5 5.126366 0.12636613845825195 0.015968400948850103 +2762 5 4.961535 0.038465023040771484 0.0014795579975270812 +2763 6 5.63605547 0.36394453048706055 0.13245562127144694 +2764 6 5.87988043 0.12011957168579102 0.014428711501977887 +2765 6 6.52317953 0.52317953109741211 0.273716821759308 +2766 6 6.2780447 0.27804470062255859 0.077308855544288235 +2767 6 5.87988043 0.12011957168579102 0.014428711501977887 +2768 6 5.63605547 0.36394453048706055 0.13245562127144694 +2769 5 4.961535 0.038465023040771484 0.0014795579975270812 +2770 7 6.230737 0.76926279067993164 0.59176524112467632 +2771 6 5.9890213 0.01097869873046875 0.00012053182581439614 +2772 7 7.19588566 0.19588565826416016 0.038371191113583336 +2773 7 6.701176 0.29882383346557617 0.089295683447062402 +2774 8 7.11208963 0.88791036605834961 0.7883848181538724 +2775 8 7.11208963 0.88791036605834961 0.7883848181538724 +2776 8 7.11208963 0.88791036605834961 0.7883848181538724 +2777 6 5.92017651 0.079823493957519531 0.0063717901875861571 +2778 7 6.701176 0.29882383346557617 0.089295683447062402 +2779 5 6.13225031 1.1322503089904785 1.2819907622090341 +2780 5 4.9076457 0.092354297637939453 0.0085293162921971089 +2781 6 5.63751364 0.36248636245727539 0.13139636296750723 +2782 6 5.910954 0.089046001434326172 0.0079291903714420187 +2783 6 5.910954 0.089046001434326172 0.0079291903714420187 +2784 6 5.910954 0.089046001434326172 0.0079291903714420187 +2785 5 5.312507 0.31250715255737305 0.097660720399517231 +2786 6 6.226491 0.22649097442626953 0.051298161496561079 +2787 5 5.312507 0.31250715255737305 0.097660720399517231 +2788 5 5.288817 0.28881692886352539 0.083415218398158686 +2789 5 5.239505 0.23950481414794922 0.057362556000043696 +2790 6 5.910954 0.089046001434326172 0.0079291903714420187 +2791 5 5.335238 0.33523797988891602 0.11238450316000126 +2792 5 5.333069 0.33306884765625 0.11093485727906227 +2793 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2794 5 5.25789976 0.25789976119995117 0.06651228682699184 +2795 8 6.859369 1.1406311988830566 1.3010395318653991 +2796 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2797 5 5.25789976 0.25789976119995117 0.06651228682699184 +2798 7 6.24827337 0.75172662734985352 0.56509292226678554 +2799 7 6.445542 0.5544581413269043 0.30742383048368538 +2800 5 5.335238 0.33523797988891602 0.11238450316000126 +2801 5 5.333069 0.33306884765625 0.11093485727906227 +2802 6 5.92864656 0.071353435516357422 0.0050913127599869767 +2803 8 7.02032 0.97968006134033203 0.95977302258779673 +2804 8 6.859369 1.1406311988830566 1.3010395318653991 +2805 6 6.18910837 0.18910837173461914 0.0357619762601189 +2806 5 5.57462358 0.57462358474731445 0.33019226414785408 +2807 5 5.46513 0.46512985229492188 0.21634577949589584 +2808 6 5.404429 0.59557104110717773 0.35470486500548759 +2809 7 6.74964428 0.25035572052001953 0.062677986797098129 +2810 7 6.45263243 0.54736757278442383 0.29961125973591152 +2811 5 5.919209 0.91920900344848633 0.84494519202075935 +2812 6 6.11701441 0.11701440811157227 0.013692371705701589 +2813 7 6.74964428 0.25035572052001953 0.062677986797098129 +2814 7 6.791037 0.20896291732788086 0.043665500818178771 +2815 5 5.735541 0.73554086685180664 0.54102036680910714 +2816 5 5.957191 0.95719099044799805 0.91621459219481949 +2817 7 6.791037 0.20896291732788086 0.043665500818178771 +2818 4 4.92936659 0.9293665885925293 0.86372225599211561 +2819 6 6.16221571 0.1622157096862793 0.026313936469023247 +2820 5 5.37689543 0.37689542770385742 0.14205016342407362 +2821 5 5.44312143 0.44312143325805664 0.19635660461267435 +2822 5 5.83623457 0.83623456954956055 0.69928825530973882 +2823 6 5.95306063 0.046939373016357422 0.0022033047391687433 +2824 6 5.68058062 0.31941938400268555 0.10202874287665509 +2825 6 5.857073 0.14292716979980469 0.020428175866982201 +2826 6 5.466382 0.53361797332763672 0.28474814145829441 +2827 7 6.83924961 0.16075038909912109 0.02584068759551883 +2828 7 6.83924961 0.16075038909912109 0.02584068759551883 +2829 5 5.557639 0.55763912200927734 0.3109613903952777 +2830 5 5.962908 0.96290779113769531 0.92719141423367546 +2831 5 5.24277925 0.24277925491333008 0.058941766616271707 +2832 6 6.0280633 0.028063297271728516 0.00078754865376140515 +2833 7 6.12555552 0.87444448471069336 0.76465315684095003 +2834 6 6.29048538 0.29048538208007813 0.084381757202208973 +2835 6 5.857073 0.14292716979980469 0.020428175866982201 +2836 6 5.466382 0.53361797332763672 0.28474814145829441 +2837 6 5.772782 0.2272181510925293 0.051628088185907473 +2838 7 6.708939 0.2910609245300293 0.08471646178827541 +2839 7 6.07187033 0.92812967300415039 0.86142468991079113 +2840 6 6.175222 0.17522192001342773 0.030702721253192067 +2841 6 5.65299845 0.34700155258178711 0.12041007749417076 +2842 6 5.60486126 0.39513874053955078 0.15613462427518243 +2843 6 5.718894 0.28110599517822266 0.079020580525138939 +2844 5 6.00124359 1.0012435913085938 1.0024887291365303 +2845 7 6.4817934 0.51820659637451172 0.2685380765260561 +2846 7 6.708939 0.2910609245300293 0.08471646178827541 +2847 5 5.987009 0.98700904846191406 0.97418686174569302 +2848 5 5.18150425 0.18150424957275391 0.032943792612968537 +2849 5 5.016559 0.016559123992919922 0.00027420458741289622 +2850 5 5.75738764 0.75738763809204102 0.5736360343346405 +2851 5 5.504389 0.50438880920410156 0.25440807085033157 +2852 5 5.83271551 0.83271551132202148 0.69341512279629569 +2853 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2854 6 6.241845 0.24184513092041016 0.058489067349910329 +2855 7 6.551627 0.44837284088134766 0.2010382044400103 +2856 7 6.816518 0.18348217010498047 0.033665706746432988 +2857 8 7.0720315 0.92796850204467773 0.86112554078704306 +2858 7 6.551627 0.44837284088134766 0.2010382044400103 +2859 6 5.95013046 0.049869537353515625 0.0024869707558536902 +2860 6 6.036433 0.036433219909667969 0.0013273795129862265 +2861 6 6.241845 0.24184513092041016 0.058489067349910329 +2862 6 6.55694532 0.5569453239440918 0.31018809386318935 +2863 6 6.42587757 0.42587757110595703 0.18137170557110949 +2864 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2865 6 5.90828276 0.091717243194580078 0.0084120526992137457 +2866 7 6.816518 0.18348217010498047 0.033665706746432988 +2867 7 6.6592536 0.34074640274047852 0.11610811098057638 +2868 5 5.46810532 0.46810531616210938 0.21912258701922838 +2869 6 6.41052437 0.41052436828613281 0.16853025695672841 +2870 7 6.6592536 0.34074640274047852 0.11610811098057638 +2871 6 6.21243954 0.21243953704833984 0.045130556901312957 +2872 7 7.25975037 0.2597503662109375 0.067470252746716142 +2873 8 7.001045 0.99895477294921875 0.99791063839802518 +2874 7 7.061138 0.061138153076171875 0.0037378737615654245 +2875 6 6.21243954 0.21243953704833984 0.045130556901312957 +2876 5 5.88438272 0.88438272476196289 0.78213280385739381 +2877 5 5.50844669 0.50844669342041016 0.25851804005014856 +2878 6 6.67545128 0.67545127868652344 0.45623442987925955 +2879 6 6.11065865 0.11065864562988281 0.012245335852639982 +2880 5 5.591242 0.59124183654785156 0.34956690928447642 +2881 7 6.55750942 0.44249057769775391 0.19579791135129199 +2882 5 5.81471968 0.81471967697143555 0.66376815204444028 +2883 7 6.662797 0.33720302581787109 0.11370588062072784 +2884 7 7.0597086 0.059708595275878906 0.0035651163498187088 +2885 6 6.686732 0.68673181533813477 0.47160058619761003 +2886 5 5.475714 0.47571420669555664 0.22630400645198279 +2887 5 6.349974 1.3499741554260254 1.8224302203182106 +2888 4 4.76470327 0.76470327377319336 0.58477109691943951 +2889 6 6.016396 0.016396045684814453 0.00026883031409852265 +2890 8 7.01523542 0.98476457595825195 0.96976127006223578 +2891 6 6.067511 0.067511081695556641 0.0045577461517041229 +2892 5 5.22424173 0.22424173355102539 0.050284355065969066 +2893 7 7.046794 0.046793937683105469 0.002189672603890358 +2894 7 6.419709 0.58029079437255859 0.33673740603353508 +2895 5 4.983767 0.016232967376708984 0.00026350922985329817 +2896 5 5.330299 0.33029890060424805 0.10909736374037493 +2897 5 5.22424173 0.22424173355102539 0.050284355065969066 +2898 5 5.48931837 0.4893183708190918 0.23943246802105023 +2899 5 5.496111 0.49611091613769531 0.24612604111098335 +2900 6 6.3282485 0.32824850082397461 0.10774707829318686 +2901 7 6.920011 0.079988956451416016 0.0063982331541865278 +2902 5 5.336474 0.33647394180297852 0.11321471351243417 +2903 6 6.15183258 0.15183258056640625 0.023053132521454245 +2904 7 6.646972 0.3530278205871582 0.12462864210851876 +2905 5 5.2062397 0.20623970031738281 0.042534813987003872 +2906 5 5.24921036 0.24921035766601563 0.062105802368023433 +2907 6 6.15183258 0.15183258056640625 0.023053132521454245 +2908 6 5.733736 0.26626396179199219 0.070896497349167475 +2909 6 6.14865255 0.14865255355834961 0.022097581679417999 +2910 5 5.23128128 0.23128128051757813 0.053491030717850663 +2911 5 5.336474 0.33647394180297852 0.11321471351243417 +2912 7 6.920011 0.079988956451416016 0.0063982331541865278 +2913 5 5.80159569 0.80159568786621094 0.64255564680570387 +2914 6 6.119406 0.11940622329711914 0.014257846162081478 +2915 6 6.119406 0.11940622329711914 0.014257846162081478 +2916 6 6.460953 0.4609532356262207 0.21247788543428214 +2917 7 6.76917076 0.23082923889160156 0.053282137527276063 +2918 6 6.048738 0.048738002777099609 0.0023753929147005692 +2919 5 6.120949 1.1209487915039063 1.2565261931740679 +2920 4 5.38337946 1.3833794593811035 1.9137387286375542 +2921 6 5.487146 0.51285409927368164 0.2630193271418193 +2922 8 7.27026224 0.72973775863647461 0.53251719637978567 +2923 6 6.23462057 0.23462057113647461 0.055046812400405543 +2924 6 6.256033 0.25603294372558594 0.065552868272789055 +2925 5 5.70803 0.70803022384643555 0.50130679788003363 +2926 8 7.411671 0.58832883834838867 0.34613082203236445 +2927 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2928 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2929 6 6.256033 0.25603294372558594 0.065552868272789055 +2930 8 7.243917 0.75608301162719727 0.57166152047125252 +2931 8 7.411671 0.58832883834838867 0.34613082203236445 +2932 6 5.79003048 0.20996952056884766 0.044087199567911739 +2933 6 6.23462057 0.23462057113647461 0.055046812400405543 +2934 5 5.283217 0.28321695327758789 0.080211842623839402 +2935 4 4.40132046 0.40132045745849609 0.16105810957469657 +2936 5 5.679378 0.67937803268432617 0.46155451129402536 +2937 5 5.70803 0.70803022384643555 0.50130679788003363 +2938 8 7.24698639 0.75301361083984375 0.56702949811005965 +2939 8 7.24698639 0.75301361083984375 0.56702949811005965 +2940 6 6.015029 0.015028953552246094 0.00022586944487557048 +2941 5 5.612932 0.61293220520019531 0.37568588817157433 +2942 5 5.347385 0.34738492965698242 0.12067628935278663 +2943 8 7.24698639 0.75301361083984375 0.56702949811005965 +2944 6 6.015029 0.015028953552246094 0.00022586944487557048 +2945 8 7.686467 0.31353282928466797 0.098302835039248748 +2946 6 6.27776 0.27776002883911133 0.077150633620703957 +2947 6 6.27776 0.27776002883911133 0.077150633620703957 +2948 6 5.29857063 0.70142936706542969 0.4920031569818093 +2949 6 5.494495 0.50550508499145508 0.25553539095221822 +2950 5 4.77643776 0.22356224060058594 0.049980075422354275 +2951 5 5.552394 0.55239391326904297 0.30513903541668697 +2952 5 4.928295 0.071704864501953125 0.0051415875932434574 +2953 5 4.77643776 0.22356224060058594 0.049980075422354275 +2954 7 6.866023 0.13397693634033203 0.017949819471141382 +2955 5 6.01920748 1.0192074775695801 1.0387838823337461 +2956 6 5.89857435 0.1014256477355957 0.01028716201858515 +2957 6 6.41994429 0.41994428634643555 0.17635320363501705 +2958 5 5.552394 0.55239391326904297 0.30513903541668697 +2959 7 6.62191057 0.37808942794799805 0.14295161552604441 +2960 7 6.618574 0.38142585754394531 0.14548568480313406 +2961 6 6.2394104 0.239410400390625 0.057317339815199375 +2962 5 5.42872238 0.42872238159179688 0.18380288047774229 +2963 7 6.95440626 0.045593738555908203 0.0020787889955045102 +2964 5 5.79420662 0.79420661926269531 0.63076415408067987 +2965 8 7.7110405 0.28895950317382813 0.083497594474465586 +2966 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2967 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2968 5 5.54127026 0.54127025604248047 0.29297349007629236 +2969 6 6.31686449 0.3168644905090332 0.10040310534554919 +2970 5 5.54127026 0.54127025604248047 0.29297349007629236 +2971 5 5.045367 0.045366764068603516 0.002058143282056335 +2972 6 5.917624 0.082376003265380859 0.006785805913978038 +2973 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2974 6 5.935218 0.064782142639160156 0.0041967260049204924 +2975 6 5.877206 0.12279415130615234 0.015078403594998235 +2976 6 6.488263 0.48826313018798828 0.23840088430097239 +2977 6 5.50998831 0.49001169204711914 0.24011145834288072 +2978 6 5.50998831 0.49001169204711914 0.24011145834288072 +2979 7 6.82792854 0.17207145690917969 0.029608586282847682 +2980 7 6.935555 0.064445018768310547 0.0041531604440478986 +2981 7 6.40632153 0.59367847442626953 0.35245413099710277 +2982 6 5.90127659 0.098723411560058594 0.0097463119900567108 +2983 6 6.29355 0.29355001449584961 0.086171611010513516 +2984 6 5.86181259 0.13818740844726563 0.019095759853371419 +2985 7 6.436311 0.56368923187255859 0.31774555012907513 +2986 7 6.436311 0.56368923187255859 0.31774555012907513 +2987 7 6.436311 0.56368923187255859 0.31774555012907513 +2988 7 6.269313 0.73068714141845703 0.53390369863427622 +2989 6 6.10555744 0.10555744171142578 0.011142373500661051 +2990 7 7.20846272 0.20846271514892578 0.04345670360726217 +2991 7 6.710715 0.28928518295288086 0.083685917076081751 +2992 7 6.5014677 0.49853229522705078 0.24853444938435132 +2993 7 6.436311 0.56368923187255859 0.31774555012907513 +2994 7 6.436311 0.56368923187255859 0.31774555012907513 +2995 6 6.129989 0.1299891471862793 0.016897178386216183 +2996 8 6.42057562 1.5794243812561035 2.4945813761062254 +2997 6 6.217876 0.21787595748901367 0.047469932851754493 +2998 7 6.66316128 0.33683872222900391 0.11346032479286805 +2999 7 6.436311 0.56368923187255859 0.31774555012907513 +3000 7 6.436311 0.56368923187255859 0.31774555012907513 +3001 7 6.5014677 0.49853229522705078 0.24853444938435132 +3002 7 6.710715 0.28928518295288086 0.083685917076081751 +3003 7 6.269313 0.73068714141845703 0.53390369863427622 +3004 6 6.32833624 0.32833623886108398 0.1078046857494428 +3005 6 6.53760242 0.53760242462158203 0.28901636695900379 +3006 6 6.10555744 0.10555744171142578 0.011142373500661051 +3007 7 7.20846272 0.20846271514892578 0.04345670360726217 +3008 7 7.2333436 0.23334360122680664 0.054449236233494958 +3009 6 5.714875 0.28512477874755859 0.081296139455844241 +3010 5 5.49859047 0.49859046936035156 0.24859245613697567 +3011 6 6.578227 0.57822704315185547 0.33434651343213773 +3012 6 6.490192 0.49019193649291992 0.24028813460267884 +3013 6 6.142816 0.14281606674194336 0.02039642891963922 +3014 6 5.70586872 0.29413127899169922 0.086513209281292802 +3015 6 6.18539858 0.18539857864379883 0.034372632963140859 +3016 6 6.142816 0.14281606674194336 0.02039642891963922 +3017 6 6.595993 0.5959930419921875 0.35520770610310137 +3018 8 6.70484924 1.2951507568359375 1.6774154829327017 +3019 6 6.18539858 0.18539857864379883 0.034372632963140859 +3020 6 5.724778 0.27522182464599609 0.075747052761471423 +3021 4 4.71791 0.71790981292724609 0.51539449949723348 +3022 5 4.8001194 0.19988059997558594 0.039952254246600205 +3023 6 5.70586872 0.29413127899169922 0.086513209281292802 +3024 6 6.142816 0.14281606674194336 0.02039642891963922 +3025 7 6.297473 0.70252704620361328 0.49354425064757379 +3026 6 5.74832726 0.25167274475097656 0.063339170450490201 +3027 5 5.63797855 0.63797855377197266 0.40701663507297781 +3028 6 6.04139233 0.041392326354980469 0.0017133246810772107 +3029 8 7.32478333 0.6752166748046875 0.45591755793429911 +3030 8 7.32478333 0.6752166748046875 0.45591755793429911 +3031 6 5.770422 0.22957801818847656 0.052706066435348475 +3032 5 6.11206055 1.112060546875 1.2366786599159241 +3033 6 5.547751 0.45224905014038086 0.20452920335287672 +3034 6 5.473764 0.52623605728149414 0.27692438798317198 +3035 7 6.44003153 0.55996847152709961 0.31356468910439617 +3036 5 5.454294 0.45429420471191406 0.20638322443483048 +3037 6 5.60835171 0.39164829254150391 0.15338838505067542 +3038 6 6.35107 0.35106992721557617 0.12325009379514995 +3039 6 5.549563 0.45043706893920898 0.20289355307454571 +3040 5 5.781478 0.78147792816162109 0.61070775220377982 +3041 6 5.62197447 0.37802553176879883 0.14290330266908313 +3042 6 5.60835171 0.39164829254150391 0.15338838505067542 +3043 6 5.745906 0.25409412384033203 0.064563823770185991 +3044 6 5.62443 0.37556982040405273 0.14105268999833243 +3045 6 6.139705 0.13970518112182617 0.019517537632282256 +3046 6 6.6571207 0.65712070465087891 0.43180762048086763 +3047 5 6.00035667 1.0003566741943359 1.0007134756051528 +3048 6 5.87789154 0.12210845947265625 0.014910475874785334 +3049 5 5.17909861 0.17909860610961914 0.032076310710408507 +3050 4 4.05022049 0.050220489501953125 0.002522097565815784 +3051 5 5.17909861 0.17909860610961914 0.032076310710408507 +3052 7 6.18944025 0.81055974960327148 0.65700710767691817 +3053 5 5.895031 0.89503097534179688 0.80108044682128821 +3054 6 6.16691256 0.16691255569458008 0.027859801248496296 +3055 6 6.18159342 0.18159341812133789 0.032976169504991049 +3056 5 5.956998 0.95699787139892578 0.91584492586207489 +3057 5 6.58366 1.5836601257324219 2.5079793938348303 +3058 5 5.5251646 0.52516460418701172 0.27579786149090069 +3059 6 5.821914 0.1780858039855957 0.031714553581196014 +3060 5 5.609995 0.60999488830566406 0.37209376375903958 +3061 5 5.609995 0.60999488830566406 0.37209376375903958 +3062 8 7.084814 0.91518592834472656 0.83756528344019898 +3063 5 5.609995 0.60999488830566406 0.37209376375903958 +3064 5 5.29221535 0.29221534729003906 0.08538980919183814 +3065 6 6.29819 0.29819011688232422 0.088917345806294179 +3066 5 5.29221535 0.29221534729003906 0.08538980919183814 +3067 4 5.599751 1.5997509956359863 2.5592032480383295 +3068 6 6.56485462 0.56485462188720703 0.31906074386733962 +3069 8 6.26474047 1.7352595329284668 3.0111256466191207 +3070 8 7.084814 0.91518592834472656 0.83756528344019898 +3071 7 6.44469547 0.55530452728271484 0.30836311802067939 +3072 6 6.57061625 0.57061624526977539 0.32560289936577647 +3073 5 6.649056 1.6490559577941895 2.7193855519365115 +3074 5 6.186977 1.1869769096374512 1.4089141840124739 +3075 7 6.56810045 0.4318995475769043 0.18653721919713462 +3076 5 5.397916 0.39791584014892578 0.15833701584142545 +3077 5 5.5251646 0.52516460418701172 0.27579786149090069 +3078 5 6.315502 1.3155021667480469 1.7305459507188061 +3079 5 5.47873354 0.47873353958129883 0.22918580192003901 +3080 6 5.821914 0.1780858039855957 0.031714553581196014 +3081 5 5.609995 0.60999488830566406 0.37209376375903958 +3082 6 5.750258 0.24974203109741211 0.062371082096660757 +3083 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3084 6 6.36839533 0.36839532852172852 0.13571511807663228 +3085 6 5.86258459 0.13741540908813477 0.018882994654859431 +3086 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3087 3 5.453733 2.453732967376709 6.0208054751913096 +3088 6 6.26444435 0.26444435119628906 0.069930814879626269 +3089 7 6.818311 0.18168878555297852 0.033010814795716215 +3090 6 6.36839533 0.36839532852172852 0.13571511807663228 +3091 6 5.36129951 0.63870048522949219 0.40793830983238877 +3092 6 6.025925 0.025925159454345703 0.0006721138927332504 +3093 7 6.56711 0.43288993835449219 0.18739369872855605 +3094 6 5.42497349 0.57502651214599609 0.33065548967078939 +3095 6 5.42497349 0.57502651214599609 0.33065548967078939 +3096 7 6.43372345 0.56627655029296875 0.32066913141170517 +3097 5 5.12878942 0.12878942489624023 0.016586715965104304 +3098 7 6.50207567 0.4979243278503418 0.24792863626521466 +3099 7 6.64832 0.35167980194091797 0.12367868309320329 +3100 7 6.737263 0.26273679733276367 0.069030624672677732 +3101 6 6.020496 0.020495891571044922 0.00042008157129203028 +3102 6 5.56049442 0.43950557708740234 0.19316515229093056 +3103 7 6.56711 0.43288993835449219 0.18739369872855605 +3104 5 5.87965727 0.87965726852416992 0.77379691006740359 +3105 6 5.9182477 0.081752300262451172 0.0066834385982019739 +3106 6 6.025925 0.025925159454345703 0.0006721138927332504 +3107 6 5.901361 0.098639011383056641 0.0097296545666267775 +3108 5 5.305002 0.30500221252441406 0.093026349644787842 +3109 4 5.36367941 1.3636794090270996 1.8596215306044996 +3110 6 6.229444 0.22944402694702148 0.052644561501665521 +3111 7 6.483191 0.51680898666381836 0.26709152869648278 +3112 5 5.716676 0.71667623519897461 0.51362482609897597 +3113 6 5.562755 0.43724489212036133 0.19118309568534642 +3114 6 6.102161 0.10216093063354492 0.010436855747911977 +3115 6 6.102161 0.10216093063354492 0.010436855747911977 +3116 7 6.567311 0.43268918991088867 0.18721993506574108 +3117 7 6.483191 0.51680898666381836 0.26709152869648278 +3118 7 6.90226 0.09774017333984375 0.009553141484502703 +3119 5 4.711436 0.28856420516967773 0.083269300505207866 +3120 6 5.511379 0.48862123489379883 0.23875071118914093 +3121 5 5.716676 0.71667623519897461 0.51362482609897597 +3122 6 6.73026 0.73025989532470703 0.53327951471965207 +3123 5 5.64247 0.64246988296508789 0.41276755051717373 +3124 6 5.562755 0.43724489212036133 0.19118309568534642 +3125 5 5.879442 0.87944221496582031 0.7734186094639881 +3126 7 6.26043272 0.73956727981567383 0.54695976137395519 +3127 5 5.368305 0.36830520629882813 0.13564872498682234 +3128 6 6.38585234 0.38585233688354492 0.14888202587849264 +3129 6 6.175245 0.17524480819702148 0.030710742800010848 +3130 6 6.560212 0.56021213531494141 0.31383763655412622 +3131 5 5.25830126 0.2583012580871582 0.066719539929408711 +3132 6 6.102161 0.10216093063354492 0.010436855747911977 +3133 6 6.73824167 0.73824167251586914 0.54500076703902778 +3134 6 6.15627337 0.15627336502075195 0.02442136461490918 +3135 6 5.55375862 0.44624137878417969 0.19913136813920573 +3136 5 5.8716464 0.87164640426635742 0.75976745407047019 +3137 6 5.95852041 0.041479587554931641 0.0017205561837272398 +3138 6 6.225504 0.22550392150878906 0.050852018615842098 +3139 6 5.814783 0.18521690368652344 0.034305301411222899 +3140 6 5.55375862 0.44624137878417969 0.19913136813920573 +3141 7 5.85702229 1.1429777145385742 1.3063980559318225 +3142 6 5.999185 0.00081491470336914063 6.6408597376721445E-07 +3143 5 5.8716464 0.87164640426635742 0.75976745407047019 +3144 6 5.840115 0.15988492965698242 0.025563190731418217 +3145 6 5.840115 0.15988492965698242 0.025563190731418217 +3146 6 5.840115 0.15988492965698242 0.025563190731418217 +3147 6 5.802998 0.19700193405151367 0.038809762020036942 +3148 6 5.840115 0.15988492965698242 0.025563190731418217 +3149 6 5.802998 0.19700193405151367 0.038809762020036942 +3150 6 6.671808 0.67180776596069336 0.45132567440509774 +3151 6 5.840115 0.15988492965698242 0.025563190731418217 +3152 6 6.17364931 0.17364931106567383 0.030154083233583151 +3153 6 6.669533 0.66953277587890625 0.44827413797611371 +3154 6 6.88131046 0.88131046295166016 0.77670813210806955 +3155 7 6.8698163 0.13018369674682617 0.016947794898669599 +3156 5 5.460132 0.46013212203979492 0.21172156973284473 +3157 7 6.8698163 0.13018369674682617 0.016947794898669599 +3158 7 6.9617424 0.038257598876953125 0.001463643871829845 +3159 6 6.20943069 0.20943069458007813 0.043861215832293965 +3160 6 5.582661 0.41733884811401367 0.17417171414513177 +3161 5 5.460132 0.46013212203979492 0.21172156973284473 +3162 7 6.8698163 0.13018369674682617 0.016947794898669599 +3163 7 6.9617424 0.038257598876953125 0.001463643871829845 +3164 6 5.9588995 0.041100502014160156 0.0016892512658159831 +3165 6 5.76335 0.23664999008178711 0.056003217805709937 +3166 6 6.567506 0.56750583648681641 0.3220628744466012 +3167 7 6.727232 0.27276802062988281 0.074402393078344176 +3168 6 6.314619 0.31461906433105469 0.098985155640548328 +3169 6 6.04131937 0.041319370269775391 0.0017072903594907984 +3170 6 5.893462 0.10653781890869141 0.011350306857821124 +3171 6 6.27120447 0.27120447158813477 0.073551865409399397 +3172 8 7.01964664 0.98035335540771484 0.96109270145916526 +3173 8 7.137502 0.86249780654907227 0.74390246630196089 +3174 8 7.38588428 0.61411571502685547 0.37713811144294596 +3175 6 5.956482 0.04351806640625 0.0018938221037387848 +3176 6 6.27120447 0.27120447158813477 0.073551865409399397 +3177 5 5.549956 0.54995584487915039 0.30245143131674013 +3178 6 6.112071 0.11207103729248047 0.012559917399812548 +3179 4 5.460645 1.4606451988220215 2.1334843968418227 +3180 6 6.260092 0.26009178161621094 0.067647734864294762 +3181 6 6.149753 0.14975309371948242 0.022425989078556086 +3182 5 5.53198862 0.53198862075805664 0.28301189261605941 +3183 6 6.260092 0.26009178161621094 0.067647734864294762 +3184 7 6.457229 0.5427708625793457 0.29460020926512698 +3185 6 6.27707863 0.27707862854003906 0.076772566393628949 +3186 4 4.737908 0.73790788650512695 0.54450804896646332 +3187 7 6.44776058 0.55223941802978516 0.3049683748258758 +3188 8 6.308009 1.691990852355957 2.862833044456238 +3189 5 6.036736 1.036736011505127 1.0748215575515587 +3190 7 6.996594 0.0034060478210449219 1.160116175924486E-05 +3191 6 6.10141 0.101409912109375 0.010283970274031162 +3192 6 6.149753 0.14975309371948242 0.022425989078556086 +3193 5 5.53198862 0.53198862075805664 0.28301189261605941 +3194 5 5.19183826 0.19183826446533203 0.036801919713070674 +3195 6 6.2820797 0.28207969665527344 0.079568955265131081 +3196 7 6.61394024 0.38605976104736328 0.14904213909994724 +3197 6 6.402557 0.4025568962097168 0.1620520546860007 +3198 7 6.61394024 0.38605976104736328 0.14904213909994724 +3199 7 6.70577955 0.2942204475402832 0.08656567175080454 +3200 7 6.81074572 0.1892542839050293 0.035817183976405431 +3201 6 6.402557 0.4025568962097168 0.1620520546860007 +3202 7 6.84895468 0.15104532241821289 0.022814689424421886 +3203 7 6.61394024 0.38605976104736328 0.14904213909994724 +3204 5 5.48264647 0.48264646530151367 0.23294761046804524 +3205 7 6.76702261 0.23297739028930664 0.054278464386015912 +3206 7 6.777936 0.22206401824951172 0.049312428201119474 +3207 6 5.86778831 0.13221168518066406 0.017479929698311025 +3208 5 6.073227 1.0732269287109375 1.1518160405103117 +3209 5 5.365314 0.36531400680541992 0.13345432356823039 +3210 5 5.175463 0.17546319961547852 0.03078733441930126 +3211 6 6.193272 0.19327211380004883 0.037354109972739025 +3212 5 5.83470726 0.83470726013183594 0.69673621011679643 +3213 6 6.04824352 0.048243522644042969 0.0023274374771062867 +3214 6 6.07760859 0.077608585357666016 0.0060230925212181319 +3215 6 6.147291 0.14729118347167969 0.021694692728488008 +3216 5 5.89868069 0.89868068695068359 0.80762697709815257 +3217 5 5.175463 0.17546319961547852 0.03078733441930126 +3218 4 4.90641737 0.9064173698425293 0.82159244835224854 +3219 7 7.13684654 0.13684654235839844 0.018726976155448938 +3220 5 5.536415 0.53641510009765625 0.28774115961277857 +3221 6 6.02255154 0.022551536560058594 0.00050857180121965939 +3222 6 6.53903437 0.53903436660766602 0.29055804838412769 +3223 6 6.193272 0.19327211380004883 0.037354109972739025 +3224 6 6.168674 0.16867399215698242 0.028450915630173768 +3225 7 6.79089451 0.20910549163818359 0.043725106633246469 +3226 6 5.96571875 0.034281253814697266 0.0011752043631076958 +3227 6 5.392663 0.60733699798583984 0.36885822912245203 +3228 6 5.51099634 0.48900365829467773 0.23912457782557794 +3229 7 6.381079 0.61892080307006836 0.38306296047289834 +3230 6 5.647422 0.35257816314697266 0.12431136112809327 +3231 6 6.31671429 0.31671428680419922 0.10030793946589256 +3232 5 5.90930843 0.90930843353271484 0.82684182729371969 +3233 6 6.274285 0.27428483963012695 0.075232173250924461 +3234 6 5.78508043 0.2149195671081543 0.046190420325956438 +3235 6 6.168674 0.16867399215698242 0.028450915630173768 +3236 6 6.614271 0.61427116394042969 0.37732906284873025 +3237 7 6.357264 0.64273595809936523 0.41310951183390898 +3238 5 5.51993227 0.51993227005004883 0.2703295654393969 +3239 7 6.6237483 0.3762516975402832 0.14156533990194475 +3240 6 6.074398 0.074398040771484375 0.0055350684706354514 +3241 7 6.13906431 0.86093568801879883 0.74121025890440251 +3242 6 6.95612049 0.95612049102783203 0.91416639336330263 +3243 7 6.6237483 0.3762516975402832 0.14156533990194475 +3244 7 6.856632 0.14336776733398438 0.020554316710331477 +3245 5 5.51993227 0.51993227005004883 0.2703295654393969 +3246 6 6.32359934 0.32359933853149414 0.10471653189802055 +3247 6 6.28690243 0.28690242767333984 0.082313003004856 +3248 7 6.317185 0.6828150749206543 0.46623642653889874 +3249 7 6.357264 0.64273595809936523 0.41310951183390898 +3250 6 6.52457333 0.52457332611083984 0.27517717446698953 +3251 6 5.6693964 0.33060359954833984 0.10929874003431905 +3252 8 6.88262463 1.117375373840332 1.2485277260648218 +3253 8 6.66403246 1.3359675407409668 1.7848092699134668 +3254 5 5.88028955 0.88028955459594727 0.77490969993073122 +3255 6 6.133121 0.13312101364135742 0.017721204272902469 +3256 6 6.133121 0.13312101364135742 0.017721204272902469 +3257 6 6.133121 0.13312101364135742 0.017721204272902469 +3258 6 6.133121 0.13312101364135742 0.017721204272902469 +3259 6 6.133121 0.13312101364135742 0.017721204272902469 +3260 6 6.133121 0.13312101364135742 0.017721204272902469 +3261 5 6.556014 1.5560140609741211 2.4211797579491758 +3262 7 6.204937 0.79506301879882813 0.63212520386150572 +3263 8 6.869174 1.1308259963989258 1.2787674341316233 +3264 6 5.47448063 0.52551937103271484 0.27617060933062021 +3265 3 4.56640053 1.5664005279541016 2.4536106139748881 +3266 6 6.52271175 0.52271175384521484 0.27322757760794047 +3267 6 5.576181 0.42381906509399414 0.17962259993714724 +3268 6 6.648331 0.6483311653137207 0.42033329991704704 +3269 5 5.18465376 0.18465375900268555 0.034097010713821874 +3270 5 5.78017 0.78016996383666992 0.60866517247291085 +3271 7 6.688666 0.31133413314819336 0.096928942463136991 +3272 7 6.319661 0.68033885955810547 0.46286096382482356 +3273 7 6.793628 0.20637178421020508 0.04258931331810345 +3274 5 6.479464 1.479464054107666 2.1888138873966909 +3275 4 4.61452627 0.61452627182006836 0.37764253875707254 +3276 8 6.66012573 1.339874267578125 1.7952630529180169 +3277 7 6.210549 0.78945112228393555 0.62323307447536536 +3278 5 5.18465376 0.18465375900268555 0.034097010713821874 +3279 6 6.091817 0.091816902160644531 0.0084303435223773704 +3280 5 5.78017 0.78016996383666992 0.60866517247291085 +3281 6 6.48334169 0.48334169387817383 0.2336191930410223 +3282 7 6.691475 0.30852508544921875 0.095187728351447731 +3283 6 5.847695 0.15230512619018555 0.023196851463808343 +3284 6 6.751086 0.75108623504638672 0.56413053247615608 +3285 7 6.57282352 0.42717647552490234 0.18247974124187749 +3286 7 6.57282352 0.42717647552490234 0.18247974124187749 +3287 7 6.57282352 0.42717647552490234 0.18247974124187749 +3288 6 5.847695 0.15230512619018555 0.023196851463808343 +3289 5 5.367988 0.36798810958862305 0.13541524879860845 +3290 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3291 8 7.53098869 0.46901130676269531 0.21997160587125109 +3292 5 5.36597061 0.36597061157226563 0.13393448853457812 +3293 7 6.54328 0.45671987533569336 0.20859304452665128 +3294 6 5.946947 0.053052902221679688 0.0028146104341431055 +3295 5 5.36597061 0.36597061157226563 0.13393448853457812 +3296 5 5.367988 0.36798810958862305 0.13541524879860845 +3297 5 5.321794 0.32179403305053711 0.10355139970693017 +3298 6 6.76998663 0.76998662948608398 0.59287940958733998 +3299 7 6.75744724 0.24255275726318359 0.058831840055972862 +3300 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3301 8 7.53098869 0.46901130676269531 0.21997160587125109 +3302 6 6.59227753 0.59227752685546875 0.35079266881803051 +3303 7 7.045722 0.045722007751464844 0.0020905019928250113 +3304 7 6.83139038 0.168609619140625 0.028429203666746616 +3305 7 6.95902634 0.040973663330078125 0.0016788410866865888 +3306 7 6.83139038 0.168609619140625 0.028429203666746616 +3307 3 4.19923735 1.1992373466491699 1.4381702135981413 +3308 6 5.727543 0.27245712280273438 0.07423288376594428 +3309 7 6.90530252 0.094697475433349609 0.0089676118534498528 +3310 7 6.746764 0.25323581695556641 0.064128378989153134 +3311 7 6.39761066 0.60238933563232422 0.36287291168355296 +3312 7 6.65214872 0.34785127639770508 0.12100051049151261 +3313 7 6.506664 0.49333620071411133 0.24338060693503394 +3314 6 5.32326746 0.67673254013061523 0.45796693087163476 +3315 7 6.48382568 0.51617431640625 0.26643592491745949 +3316 6 6.051728 0.051727771759033203 0.002675762371154633 +3317 6 6.13208 0.132080078125 0.017445147037506104 +3318 7 6.81349325 0.18650674819946289 0.034784767123937854 +3319 5 5.759015 0.75901508331298828 0.57610389669662254 +3320 5 5.567959 0.56795883178710938 0.322577234604978 +3321 6 6.4950285 0.49502849578857422 0.24505321164269844 +3322 7 6.713452 0.28654813766479492 0.082109835199162262 +3323 6 6.312879 0.31287908554077148 0.0978933221688294 +3324 6 6.12515831 0.12515830993652344 0.015664602546166861 +3325 7 6.8268137 0.17318630218505859 0.029993495264534431 +3326 5 5.93371534 0.9337153434753418 0.87182434264127551 +3327 7 6.38604975 0.61395025253295898 0.37693491258528411 +3328 5 6.126393 1.1263928413391113 1.2687608330199964 +3329 6 6.249068 0.24906778335571289 0.062034760705728331 +3330 6 5.88103676 0.11896324157714844 0.014152252846542979 +3331 6 5.950097 0.049902915954589844 0.0024903010207708576 +3332 7 6.466661 0.53333902359008789 0.28445051408402833 +3333 6 6.00232363 0.0023236274719238281 5.3992446282791207E-06 +3334 6 6.16842842 0.16842842102050781 0.028368133007461438 +3335 6 5.741354 0.25864601135253906 0.066897759188577766 +3336 6 5.741354 0.25864601135253906 0.066897759188577766 +3337 6 5.741354 0.25864601135253906 0.066897759188577766 +3338 6 5.58105755 0.41894245147705078 0.17551277764960105 +3339 6 5.836304 0.1636958122253418 0.026796318940114361 +3340 6 6.23716974 0.23716974258422852 0.056249486797469217 +3341 6 5.836304 0.1636958122253418 0.026796318940114361 +3342 5 6.093224 1.093224048614502 1.1951388204690829 +3343 7 5.741354 1.2586460113525391 1.5841897818936559 +3344 6 5.741354 0.25864601135253906 0.066897759188577766 +3345 6 5.95065975 0.049340248107910156 0.0024344600833501318 +3346 6 5.890304 0.1096959114074707 0.012033192979515661 +3347 6 5.88841 0.11158990859985352 0.012452307701323662 +3348 6 5.58105755 0.41894245147705078 0.17551277764960105 +3349 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3350 6 6.129016 0.12901592254638672 0.016645108270495257 +3351 6 6.40267134 0.40267133712768555 0.16214420574419819 +3352 6 6.60754 0.60754013061523438 0.36910501030797604 +3353 6 6.53815842 0.53815841674804688 0.2896144815167645 +3354 7 6.82739 0.17260980606079102 0.029794145148343887 +3355 6 6.443502 0.44350194931030273 0.19669397904203834 +3356 6 6.09565973 0.095659732818603516 0.0091507844829266105 +3357 7 6.59177446 0.40822553634643555 0.16664808852533497 +3358 6 6.60754 0.60754013061523438 0.36910501030797604 +3359 6 6.53815842 0.53815841674804688 0.2896144815167645 +3360 7 6.087488 0.91251182556152344 0.83267783178962418 +3361 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3362 6 6.129016 0.12901592254638672 0.016645108270495257 +3363 6 6.40267134 0.40267133712768555 0.16214420574419819 +3364 6 6.03455544 0.034555435180664063 0.0011940781005250756 +3365 7 6.484774 0.51522588729858398 0.26545771494261317 +3366 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3367 6 6.4610076 0.46100759506225586 0.21252800270508487 +3368 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3369 7 6.464667 0.53533315658569336 0.28658158854000249 +3370 6 6.4610076 0.46100759506225586 0.21252800270508487 +3371 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3372 6 6.33648157 0.33648157119750977 0.11321984775554483 +3373 7 6.817031 0.18296909332275391 0.033477689111350628 +3374 5 5.506074 0.50607395172119141 0.25611084461070277 +3375 6 5.95384169 0.046158313751220703 0.0021305899283561303 +3376 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3377 6 6.000979 0.00097894668579101563 9.5833661362121347E-07 +3378 8 6.860549 1.1394510269165039 1.2983486427410753 +3379 5 5.253192 0.25319194793701172 0.064106162500138453 +3380 7 6.84210443 0.15789556503295898 0.02493100945707738 +3381 7 6.22156429 0.77843570709228516 0.60596215007626597 +3382 7 6.84210443 0.15789556503295898 0.02493100945707738 +3383 6 6.42233229 0.4223322868347168 0.1783645605030415 +3384 6 6.102439 0.10243892669677734 0.010493733702787722 +3385 6 6.48315859 0.48315858840942383 0.23344222155378702 +3386 8 6.860549 1.1394510269165039 1.2983486427410753 +3387 5 5.253192 0.25319194793701172 0.064106162500138453 +3388 6 6.038348 0.038348197937011719 0.0014705842850162298 +3389 7 6.234303 0.76569700241088867 0.58629189950102045 +3390 6 6.80156469 0.80156469345092773 0.64250595778707975 +3391 8 6.80156469 1.1984353065490723 1.4362471839833688 +3392 6 6.67221975 0.67221975326538086 0.45187939668016952 +3393 6 6.48170137 0.48170137405395508 0.23203621376546835 +3394 5 5.35709572 0.35709571838378906 0.12751735208803439 +3395 5 5.31360435 0.31360435485839844 0.098347691386152292 +3396 6 5.980254 0.019745826721191406 0.00038989767290331656 +3397 6 6.015499 0.015499114990234375 0.00024022256548050791 +3398 5 5.31912756 0.31912755966186523 0.10184239933573735 +3399 6 6.43055 0.43055009841918945 0.18537338724877372 +3400 6 5.44203234 0.5579676628112793 0.31132791274308147 +3401 5 5.95098972 0.95098972320556641 0.90438145364259981 +3402 6 5.44203234 0.5579676628112793 0.31132791274308147 +3403 5 5.68300056 0.68300056457519531 0.46648977121003554 +3404 6 5.44582033 0.55417966842651367 0.30711510489732063 +3405 6 6.039283 0.039282798767089844 0.0015431382789756753 +3406 6 6.43055 0.43055009841918945 0.18537338724877372 +3407 5 5.31912756 0.31912755966186523 0.10184239933573735 +3408 6 5.49072456 0.50927543640136719 0.25936147012180299 +3409 3 5.471312 2.4713120460510254 6.1073832289569054 +3410 7 6.274226 0.72577381134033203 0.52674762522747187 +3411 6 6.147217 0.147216796875 0.02167278528213501 +3412 6 5.83013964 0.1698603630065918 0.028852542920731139 +3413 6 5.648756 0.35124397277832031 0.12337232841309742 +3414 7 6.274226 0.72577381134033203 0.52674762522747187 +3415 7 6.80660629 0.19339370727539063 0.037401126013719477 +3416 6 5.683732 0.31626796722412109 0.10002542709207773 +3417 4 5.429571 1.4295711517333984 2.0436736778683553 +3418 6 5.683732 0.31626796722412109 0.10002542709207773 +3419 7 6.80660629 0.19339370727539063 0.037401126013719477 +3420 5 5.32444048 0.32444047927856445 0.10526162459450461 +3421 8 6.66276455 1.3372354507446289 1.7881986507281908 +3422 8 6.97727 1.0227298736572266 1.0459763944709266 +3423 5 5.98238659 0.98238658905029297 0.9650834103458692 +3424 6 6.4767437 0.47674369812011719 0.22728455369724543 +3425 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3426 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3427 6 6.39636 0.39635992050170898 0.15710118658012107 +3428 6 6.4767437 0.47674369812011719 0.22728455369724543 +3429 5 5.98238659 0.98238658905029297 0.9650834103458692 +3430 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3431 6 5.904046 0.095953941345214844 0.0092071588596809306 +3432 5 5.87699652 0.87699651718139648 0.76912289114829946 +3433 7 6.87964058 0.12035942077636719 0.014486390169622609 +3434 6 6.014669 0.014668941497802734 0.00021517784466595913 +3435 6 6.30498 0.30497980117797852 0.093012679126559306 +3436 6 6.01969671 0.019696712493896484 0.00038796048306721787 +3437 5 5.11366749 0.11366748809814453 0.012920297850541829 +3438 5 5.14675951 0.1467595100402832 0.021538353787263986 +3439 5 5.11366749 0.11366748809814453 0.012920297850541829 +3440 5 6.2240715 1.2240715026855469 1.4983510436868528 +3441 5 6.060459 1.0604591369628906 1.1245735811680788 +3442 7 6.419583 0.58041715621948242 0.33688407523391106 +3443 6 5.80606031 0.1939396858215332 0.037612601736555007 +3444 5 5.14675951 0.1467595100402832 0.021538353787263986 +3445 8 7.46482372 0.53517627716064453 0.28641364763552701 +3446 6 5.554438 0.44556188583374023 0.19852539410771897 +3447 6 5.911977 0.088023185729980469 0.0077480812260546372 +3448 7 6.88186169 0.11813831329345703 0.013956661067823006 +3449 8 7.46482372 0.53517627716064453 0.28641364763552701 +3450 7 6.343062 0.65693807601928711 0.43156763572392265 +3451 7 6.343062 0.65693807601928711 0.43156763572392265 +3452 5 5.21926546 0.21926546096801758 0.04807734237351724 +3453 6 6.287645 0.28764486312866211 0.082739567284306759 +3454 5 5.663148 0.66314792633056641 0.43976517219653033 +3455 6 6.118511 0.11851119995117188 0.014044904513866641 +3456 5 5.21130943 0.21130943298339844 0.044651676467765355 +3457 7 6.68455458 0.3154454231262207 0.099505814971280415 +3458 7 6.98832464 0.011675357818603516 0.00013631398019242624 +3459 6 5.715628 0.28437185287475586 0.080867350707421792 +3460 6 6.013219 0.013218879699707031 0.00017473878051532665 +3461 8 6.982139 1.0178608894348145 1.0360407902410316 +3462 6 6.62252235 0.62252235412597656 0.38753408138654777 +3463 7 6.795649 0.20435094833374023 0.041759310084898971 +3464 5 5.5751667 0.57516670227050781 0.33081673540073098 +3465 6 6.67814827 0.67814826965332031 0.45988507563379244 +3466 6 6.62252235 0.62252235412597656 0.38753408138654777 +3467 5 5.500977 0.5009770393371582 0.25097799394302456 +3468 8 6.840452 1.1595478057861328 1.3445511139034352 +3469 6 5.715628 0.28437185287475586 0.080867350707421792 +3470 8 6.982139 1.0178608894348145 1.0360407902410316 +3471 6 6.013219 0.013218879699707031 0.00017473878051532665 +3472 6 6.01919746 0.019197463989257813 0.00036854262361885048 +3473 8 7.03968 0.96031999588012695 0.92221449448720705 +3474 6 5.61084366 0.38915634155273438 0.15144265817070846 +3475 6 5.274944 0.72505617141723633 0.52570645171022079 +3476 8 7.433511 0.56648921966552734 0.32091003599725809 +3477 7 6.277657 0.72234296798706055 0.52177936340035558 +3478 6 5.274944 0.72505617141723633 0.52570645171022079 +3479 7 7.070361 0.070361137390136719 0.0049506896548336954 +3480 8 7.03968 0.96031999588012695 0.92221449448720705 +3481 5 5.62201643 0.62201642990112305 0.38690443906693872 +3482 8 7.16506624 0.83493375778198242 0.69711437988394209 +3483 7 6.988081 0.011919021606445313 0.0001420630760549102 +3484 8 7.433511 0.56648921966552734 0.32091003599725809 +3485 7 5.922049 1.0779509544372559 1.1619782601721909 +3486 6 5.938876 0.061123847961425781 0.0037361247896114946 +3487 6 5.61084366 0.38915634155273438 0.15144265817070846 +3488 6 5.78829956 0.211700439453125 0.044817076064646244 +3489 8 5.86692142 2.1330785751342773 4.5500242076968789 +3490 7 6.277657 0.72234296798706055 0.52177936340035558 +3491 6 5.543023 0.45697689056396484 0.2088278785095099 +3492 7 6.94785261 0.052147388458251953 0.002719350123015829 +3493 7 6.94785261 0.052147388458251953 0.002719350123015829 +3494 6 6.556063 0.55606317520141602 0.30920625481508068 +3495 7 6.27423429 0.72576570510864258 0.52673585871184514 +3496 7 6.67335939 0.32664060592651367 0.10669408544004 +3497 6 6.202401 0.20240116119384766 0.040966230052617902 +3498 6 5.972077 0.027923107147216797 0.00077969991275494976 +3499 7 7.010567 0.010567188262939453 0.00011166546778440534 +3500 7 6.94785261 0.052147388458251953 0.002719350123015829 +3501 6 6.556063 0.55606317520141602 0.30920625481508068 +3502 5 5.308975 0.3089752197265625 0.095465686405077577 +3503 7 6.563628 0.43637180328369141 0.19042035070106067 +3504 7 6.889004 0.11099576950073242 0.012320060847059722 +3505 7 6.65556574 0.34443426132202148 0.11863496037244659 +3506 6 6.23850346 0.23850345611572266 0.056883898579144443 +3507 7 6.84581852 0.15418148040771484 0.023771928900714556 +3508 5 5.308975 0.3089752197265625 0.095465686405077577 +3509 6 5.449322 0.55067777633666992 0.30324601335109946 +3510 6 6.24513245 0.2451324462890625 0.060089916223660111 +3511 7 6.18416262 0.81583738327026367 0.6655906359412711 +3512 6 6.517426 0.5174260139465332 0.26772967990859797 +3513 6 6.079972 0.079971790313720703 0.0063954872459817125 +3514 6 6.457934 0.45793390274047852 0.20970345927912604 +3515 7 6.49270153 0.50729846954345703 0.2573517372011338 +3516 7 6.91192055 0.088079452514648438 0.007757989955280209 +3517 7 6.699911 0.30008888244628906 0.090053337367862696 +3518 5 5.56025028 0.56025028228759766 0.31388037880333286 +3519 7 6.91017151 0.0898284912109375 0.0080691578332334757 +3520 5 5.1707406 0.17074060440063477 0.02915235399109406 +3521 7 6.501419 0.4985809326171875 0.24858294636942446 +3522 5 5.311646 0.3116459846496582 0.097123219748254996 +3523 5 5.1707406 0.17074060440063477 0.02915235399109406 +3524 6 6.429056 0.42905616760253906 0.18408919495777809 +3525 6 6.429056 0.42905616760253906 0.18408919495777809 +3526 6 5.7761054 0.22389459609985352 0.050128790162716541 +3527 6 5.709012 0.29098796844482422 0.084673997779646015 +3528 4 4.35001 0.35000991821289063 0.12250694284739438 +3529 7 6.84373856 0.15626144409179688 0.02441763890965376 +3530 5 5.494679 0.49467897415161133 0.24470728746769055 +3531 5 5.262818 0.2628178596496582 0.069073227350827437 +3532 6 5.934386 0.065614223480224609 0.0043052263229128584 +3533 6 5.83779144 0.16220855712890625 0.026311616005841643 +3534 5 5.494679 0.49467897415161133 0.24470728746769055 +3535 5 5.262818 0.2628178596496582 0.069073227350827437 +3536 6 6.208285 0.20828485488891602 0.043382580776096802 +3537 5 5.483639 0.48363876342773438 0.23390645348990802 +3538 7 6.782946 0.21705389022827148 0.047112391263226527 +3539 6 6.26574755 0.2657475471496582 0.07062175881605981 +3540 6 6.6306076 0.63060760498046875 0.39766595145920292 +3541 6 6.299932 0.29993200302124023 0.089959206436333261 +3542 6 5.786514 0.2134861946105957 0.045576355289313142 +3543 6 6.21291733 0.21291732788085938 0.045333788511925377 +3544 6 6.21291733 0.21291732788085938 0.045333788511925377 +3545 6 6.42701149 0.42701148986816406 0.18233881247942918 +3546 6 5.786514 0.2134861946105957 0.045576355289313142 +3547 6 6.42701149 0.42701148986816406 0.18233881247942918 +3548 6 6.46981049 0.46981048583984375 0.22072189260507002 +3549 6 6.21291733 0.21291732788085938 0.045333788511925377 +3550 6 6.20411634 0.2041163444519043 0.041663482072408442 +3551 6 5.8129344 0.18706560134887695 0.034993539208016955 +3552 6 5.8129344 0.18706560134887695 0.034993539208016955 +3553 6 5.8129344 0.18706560134887695 0.034993539208016955 +3554 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3555 6 6.012086 0.012085914611816406 0.00014606933200411731 +3556 7 6.29893255 0.70106744766235352 0.49149556617180679 +3557 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3558 6 5.8129344 0.18706560134887695 0.034993539208016955 +3559 4 4.42683029 0.42683029174804688 0.18218409795372281 +3560 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3561 5 4.954984 0.045015811920166016 0.0020264233228317607 +3562 6 6.85508347 0.85508346557617188 0.73116773310175631 +3563 5 4.954984 0.045015811920166016 0.0020264233228317607 +3564 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3565 6 5.82309675 0.17690324783325195 0.031294759093952962 +3566 6 6.042418 0.042418003082275391 0.0017992869854879245 +3567 6 6.221795 0.22179508209228516 0.049193058440323512 +3568 7 6.357106 0.64289379119873047 0.41331242676187685 +3569 6 5.82309675 0.17690324783325195 0.031294759093952962 +3570 6 6.221795 0.22179508209228516 0.049193058440323512 +3571 4 4.23669052 0.23669052124023438 0.05602240284497384 +3572 6 6.042418 0.042418003082275391 0.0017992869854879245 +3573 6 6.055631 0.055631160736083984 0.0030948260448440124 +3574 6 5.628368 0.37163209915161133 0.13811041711983307 +3575 7 6.198657 0.80134296417236328 0.6421505462285495 +3576 5 5.53625536 0.5362553596496582 0.28756981075298427 +3577 7 6.521952 0.47804784774780273 0.22852974473630638 +3578 4 4.71375465 0.71375465393066406 0.50944570600768202 +3579 7 6.520844 0.4791560173034668 0.22959048891812017 +3580 5 5.53965044 0.53965044021606445 0.29122259762539215 +3581 7 6.64749527 0.35250473022460938 0.12425958483072463 +3582 6 6.36762857 0.36762857437133789 0.13515076869430231 +3583 6 5.5800705 0.41992950439453125 0.17634078866103664 +3584 7 6.520844 0.4791560173034668 0.22959048891812017 +3585 7 6.106952 0.89304780960083008 0.79753439023284045 +3586 7 6.386778 0.61322212219238281 0.37604137114612968 +3587 6 5.889993 0.11000680923461914 0.012101498077981887 +3588 6 5.889993 0.11000680923461914 0.012101498077981887 +3589 6 5.889993 0.11000680923461914 0.012101498077981887 +3590 7 6.43335152 0.56664848327636719 0.32109050359940738 +3591 5 5.422166 0.42216587066650391 0.1782240223556073 +3592 7 6.39903641 0.60096359252929688 0.36115723954571877 +3593 7 6.386778 0.61322212219238281 0.37604137114612968 +3594 7 6.21197128 0.78802871704101563 0.62098925888130907 +3595 7 6.384263 0.61573696136474609 0.37913200559069082 +3596 7 6.355336 0.64466381072998047 0.41559142886490008 +3597 6 6.1302495 0.1302495002746582 0.016964932321798187 +3598 7 6.663735 0.33626508712768555 0.11307420882098995 +3599 6 5.54587364 0.45412635803222656 0.20623074905961403 +3600 6 6.097955 0.097955226898193359 0.0095952264766765438 +3601 7 6.593367 0.40663290023803711 0.16535031555599744 +3602 6 6.470431 0.47043085098266602 0.22130518555627532 +3603 7 6.99491072 0.0050892829895019531 2.5900801347233937E-05 +3604 6 6.13144875 0.13144874572753906 0.017278772753343219 +3605 5 5.19285 0.19285011291503906 0.037191166051343316 +3606 5 5.31416941 0.31416940689086914 0.098702416226160494 +3607 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3608 6 6.187198 0.18719816207885742 0.035043151885702173 +3609 6 6.187198 0.18719816207885742 0.035043151885702173 +3610 5 5.19285 0.19285011291503906 0.037191166051343316 +3611 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3612 6 5.98245859 0.017541408538818359 0.00030770101352572965 +3613 6 6.187198 0.18719816207885742 0.035043151885702173 +3614 5 5.31416941 0.31416940689086914 0.098702416226160494 +3615 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3616 5 5.17883968 0.17883968353271484 0.031983632406081597 +3617 5 5.800092 0.80009222030639648 0.64014756099481929 +3618 7 5.956605 1.0433950424194336 1.0886732145454516 +3619 6 5.938953 0.061047077178955078 0.0037267456320932979 +3620 7 6.640628 0.35937213897705078 0.1291483342729407 +3621 7 5.956605 1.0433950424194336 1.0886732145454516 +3622 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3623 6 5.938953 0.061047077178955078 0.0037267456320932979 +3624 7 6.782224 0.21777582168579102 0.047426308510921444 +3625 5 5.17883968 0.17883968353271484 0.031983632406081597 +3626 5 5.800092 0.80009222030639648 0.64014756099481929 +3627 5 5.25973225 0.25973224639892578 0.067460839819432294 +3628 6 5.25973225 0.74026775360107422 0.54799634702158073 +3629 6 5.29488373 0.70511627197265625 0.49718895700061694 +3630 6 5.900844 0.099155902862548828 0.0098318930724872189 +3631 6 5.900844 0.099155902862548828 0.0098318930724872189 +3632 6 5.788138 0.21186208724975586 0.044885544013823164 +3633 6 5.900844 0.099155902862548828 0.0098318930724872189 +3634 7 6.45650148 0.54349851608276367 0.29539063698416612 +3635 6 6.089077 0.089076995849609375 0.0079347111895913258 +3636 7 6.637489 0.36251115798950195 0.13141433966688965 +3637 7 6.28777552 0.71222448348999023 0.50726371488258337 +3638 7 6.76056433 0.23943567276000977 0.057329441390038482 +3639 6 6.234292 0.23429203033447266 0.054892755478249455 +3640 6 6.357985 0.35798501968383789 0.1281532743180378 +3641 6 5.833136 0.16686391830444336 0.027843567231911948 +3642 6 5.833136 0.16686391830444336 0.027843567231911948 +3643 6 6.357985 0.35798501968383789 0.1281532743180378 +3644 7 5.92905951 1.0709404945373535 1.1469135428399113 +3645 6 6.23142 0.23142004013061523 0.053555234974055566 +3646 7 5.85718 1.142819881439209 1.3060372814127277 +3647 7 6.691976 0.30802392959594727 0.094878741203729078 +3648 5 6.03854036 1.0385403633117676 1.0785660862277382 +3649 6 6.512135 0.51213502883911133 0.26228228776403739 +3650 4 4.85898256 0.85898256301879883 0.7378510435703447 +3651 6 5.253411 0.74658918380737305 0.55739540937815946 +3652 6 5.90696764 0.093032360076904297 0.0086550200214787765 +3653 6 5.253411 0.74658918380737305 0.55739540937815946 +3654 6 6.11544943 0.11544942855834961 0.01332857055444947 +3655 7 7.151361 0.15136098861694336 0.022910148875098457 +3656 7 6.62748051 0.37251949310302734 0.13877077274173644 +3657 8 6.869378 1.1306219100952148 1.2783059035873521 +3658 7 6.2651124 0.73488759994506836 0.54005978455302284 +3659 8 7.29730844 0.70269155502319336 0.49377542150091358 +3660 8 7.314732 0.68526792526245117 0.46959212939350436 +3661 6 6.14659071 0.1465907096862793 0.021488836166327019 +3662 4 4.47665358 0.4766535758972168 0.22719863141560381 +3663 6 6.59426832 0.5942683219909668 0.35315483852195939 +3664 8 7.26825142 0.73174858093261719 0.53545598569689901 +3665 8 7.29730844 0.70269155502319336 0.49377542150091358 +3666 7 6.25256157 0.74743843078613281 0.55866420781603665 +3667 8 7.314732 0.68526792526245117 0.46959212939350436 +3668 5 5.123465 0.12346506118774414 0.015243621334093405 +3669 7 7.222342 0.22234201431274414 0.04943597132864852 +3670 6 5.395938 0.60406208038330078 0.36489099695700133 +3671 7 6.971204 0.028796195983886719 0.00082922090314241359 +3672 8 7.117149 0.88285112380981445 0.77942610681225233 +3673 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3674 5 5.25115 0.25115013122558594 0.063076388414629037 +3675 6 5.755384 0.24461603164672852 0.059837002938593287 +3676 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3677 6 6.51675129 0.51675128936767578 0.26703189506315539 +3678 5 5.09006453 0.090064525604248047 0.008111618772318252 +3679 7 6.02219152 0.97780847549438477 0.95610941474865285 +3680 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3681 8 6.98234367 1.0176563262939453 1.0356243984460889 +3682 7 6.398295 0.60170507431030273 0.36204899645076694 +3683 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3684 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3685 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3686 5 5.108233 0.10823297500610352 0.011714376878671828 +3687 5 6.19706631 1.1970663070678711 1.4329677435171106 +3688 6 6.434823 0.43482303619384766 0.18907107280483615 +3689 8 6.98234367 1.0176563262939453 1.0356243984460889 +3690 7 6.53908062 0.46091938018798828 0.21244667503287928 +3691 6 6.327841 0.32784080505371094 0.1074795934582653 +3692 7 6.02219152 0.97780847549438477 0.95610941474865285 +3693 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3694 5 5.09006453 0.090064525604248047 0.008111618772318252 +3695 6 6.70085239 0.70085239410400391 0.49119407832131401 +3696 7 6.398295 0.60170507431030273 0.36204899645076694 +3697 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3698 6 6.24541 0.24540996551513672 0.060226051174140594 +3699 5 5.108233 0.10823297500610352 0.011714376878671828 +3700 5 5.486109 0.48610877990722656 0.23630174590289243 +3701 5 5.20689249 0.20689249038696289 0.042804502578519532 +3702 6 5.67937136 0.32062864303588867 0.10280272673503532 +3703 6 5.67937136 0.32062864303588867 0.10280272673503532 +3704 6 5.67937136 0.32062864303588867 0.10280272673503532 +3705 6 5.67937136 0.32062864303588867 0.10280272673503532 +3706 6 6.30640936 0.30640935897827148 0.09388669526947524 +3707 6 6.302135 0.30213499069213867 0.091285552600538722 +3708 5 5.15478468 0.1547846794128418 0.023958296980936211 +3709 5 5.181745 0.18174505233764648 0.03303126404921386 +3710 5 4.88772964 0.11227035522460938 0.012604632662259974 +3711 6 5.67937136 0.32062864303588867 0.10280272673503532 +3712 5 5.59040737 0.59040737152099609 0.34858086434633151 +3713 5 5.16065025 0.16065025329589844 0.025808503884036327 +3714 4 5.40058327 1.4005832672119141 1.9616334883939999 +3715 6 5.902174 0.097826004028320313 0.009569927064148942 +3716 5 5.655233 0.65523290634155273 0.42933016155279802 +3717 6 5.775761 0.22423887252807617 0.050283071952662795 +3718 5 5.20689249 0.20689249038696289 0.042804502578519532 +3719 5 5.38708639 0.38708639144897461 0.1498358744449888 +3720 7 6.94894171 0.051058292388916016 0.0026069492216720391 +3721 5 5.05060768 0.050607681274414063 0.0025611374039726797 +3722 5 4.98821163 0.011788368225097656 0.00013896562541049207 +3723 7 6.490961 0.50903892517089844 0.25912062733914354 +3724 6 6.30076361 0.30076360702514648 0.090458747310776744 +3725 6 6.23129034 0.23129034042358398 0.053495221573257368 +3726 7 6.634293 0.3657069206237793 0.13374155179212721 +3727 7 6.490961 0.50903892517089844 0.25912062733914354 +3728 7 6.83458853 0.16541147232055664 0.027360955175254276 +3729 5 5.10726643 0.10726642608642578 0.011506086165354645 +3730 6 5.732659 0.26734113693237305 0.071471283496293836 +3731 6 6.02678251 0.026782512664794922 0.00071730298463990039 +3732 5 5.10726643 0.10726642608642578 0.011506086165354645 +3733 6 6.601304 0.60130405426025391 0.36156656566981837 +3734 5 5.412523 0.41252279281616211 0.17017505459284621 +3735 6 6.212704 0.21270418167114258 0.045243068900390426 +3736 4 5.974627 1.9746270179748535 3.8991518601162625 +3737 5 5.66151667 0.66151666641235352 0.437604299941313 +3738 6 5.62562132 0.37437868118286133 0.14015939692421853 +3739 7 6.81513262 0.18486738204956055 0.034175948945858181 +3740 7 6.81513262 0.18486738204956055 0.034175948945858181 +3741 7 6.81513262 0.18486738204956055 0.034175948945858181 +3742 7 6.81513262 0.18486738204956055 0.034175948945858181 +3743 7 6.81513262 0.18486738204956055 0.034175948945858181 +3744 7 6.81513262 0.18486738204956055 0.034175948945858181 +3745 7 6.81513262 0.18486738204956055 0.034175948945858181 +3746 5 6.29884863 1.2988486289978027 1.6870077610494718 +3747 6 5.658112 0.3418879508972168 0.11688737096869772 +3748 5 5.37572527 0.37572526931762695 0.14116947800380331 +3749 6 6.59885168 0.59885168075561523 0.35862333554382531 +3750 7 6.81513262 0.18486738204956055 0.034175948945858181 +3751 5 5.352506 0.35250616073608398 0.12426059335689388 +3752 5 5.411717 0.41171693801879883 0.16951083705157544 +3753 5 5.31119251 0.31119251251220703 0.09684077984366013 +3754 8 7.681114 0.31888580322265625 0.10168815549695864 +3755 6 6.103313 0.10331296920776367 0.010673569606524325 +3756 5 5.352506 0.35250616073608398 0.12426059335689388 +3757 5 5.411717 0.41171693801879883 0.16951083705157544 +3758 5 5.31119251 0.31119251251220703 0.09684077984366013 +3759 6 6.103313 0.10331296920776367 0.010673569606524325 +3760 6 6.155523 0.15552282333374023 0.024187348577697776 +3761 7 6.45952559 0.54047441482543945 0.29211259308090121 +3762 5 5.419359 0.41935920715332031 0.17586214462426142 +3763 5 6.03585434 1.0358543395996094 1.0729942128673429 +3764 8 7.681114 0.31888580322265625 0.10168815549695864 +3765 5 5.24535036 0.24535036087036133 0.060196799579216531 +3766 5 5.24535036 0.24535036087036133 0.060196799579216531 +3767 5 5.24535036 0.24535036087036133 0.060196799579216531 +3768 6 6.072592 0.072591781616210938 0.0052695667582156602 +3769 5 5.24535036 0.24535036087036133 0.060196799579216531 +3770 4 5.85129166 1.8512916564941406 3.4272807974048192 +3771 6 5.96826839 0.031731605529785156 0.0010068947894978919 +3772 6 6.072592 0.072591781616210938 0.0052695667582156602 +3773 5 5.567017 0.5670170783996582 0.32150836719688414 +3774 5 5.42932558 0.42932558059692383 0.18432045415488574 +3775 6 6.555324 0.55532407760620117 0.30838483116917814 +3776 5 6.549726 1.5497260093688965 2.401650704114445 +3777 6 6.555324 0.55532407760620117 0.30838483116917814 +3778 7 6.80112171 0.19887828826904297 0.039552573544824554 +3779 7 6.94228554 0.057714462280273438 0.0033309591563011054 +3780 5 5.42932558 0.42932558059692383 0.18432045415488574 +3781 6 5.932433 0.067566871643066406 0.0045652821436306112 +3782 6 6.227729 0.22772884368896484 0.051860426247912983 +3783 5 5.270208 0.27020788192749023 0.073012299455740504 +3784 6 5.81837845 0.18162155151367188 0.032986387974233367 +3785 7 6.71812534 0.28187465667724609 0.079453322076915356 +3786 5 5.407538 0.40753793716430664 0.16608717022813835 +3787 5 5.24300337 0.24300336837768555 0.059050637042901144 +3788 5 5.36877 0.36877012252807617 0.13599140326937231 +3789 6 5.35680771 0.64319229125976563 0.41369632353598718 +3790 5 5.270208 0.27020788192749023 0.073012299455740504 +3791 5 5.30159664 0.30159664154052734 0.090960534188525344 +3792 6 6.023325 0.023324966430664063 0.00054405405899160542 +3793 6 5.47658157 0.52341842651367188 0.27396684921404812 +3794 5 5.64809132 0.64809131622314453 0.42002235416384792 +3795 6 5.81837845 0.18162155151367188 0.032986387974233367 +3796 6 6.42824173 0.42824172973632813 0.1833909790875623 +3797 5 4.83761024 0.16238975524902344 0.026370432609837735 +3798 5 5.660219 0.66021919250488281 0.43588938215179951 +3799 5 5.69797659 0.69797658920288086 0.4871713190752871 +3800 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3801 6 5.97499 0.025010108947753906 0.00062550554957852 +3802 5 5.660219 0.66021919250488281 0.43588938215179951 +3803 6 6.044695 0.044694900512695313 0.0019976341318397317 +3804 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3805 6 5.97499 0.025010108947753906 0.00062550554957852 +3806 5 4.83761024 0.16238975524902344 0.026370432609837735 +3807 5 5.63379145 0.63379144668579102 0.40169159789206788 +3808 6 5.517979 0.48202085494995117 0.23234410460668187 +3809 6 6.044695 0.044694900512695313 0.0019976341318397317 +3810 3 5.139502 2.1395020484924316 4.5774690155033113 +3811 5 5.86564541 0.86564540863037109 0.74934197348284215 +3812 5 5.660219 0.66021919250488281 0.43588938215179951 +3813 5 5.69797659 0.69797658920288086 0.4871713190752871 +3814 5 5.528592 0.52859210968017578 0.27940961841613898 +3815 7 6.71345472 0.2865452766418457 0.082108195565751885 +3816 5 5.46293068 0.46293067932128906 0.21430481385687017 +3817 6 6.24235964 0.24235963821411133 0.058738194235274932 +3818 6 6.441372 0.44137191772460938 0.19480916975589935 +3819 6 6.441372 0.44137191772460938 0.19480916975589935 +3820 5 5.83183 0.83183002471923828 0.69194119002440857 +3821 6 6.02943945 0.029439449310302734 0.00086668117569388414 +3822 6 6.34592 0.34592008590698242 0.1196607058338941 +3823 5 5.289135 0.28913497924804688 0.083599036224768497 +3824 7 6.34184074 0.65815925598144531 0.43317360623404966 +3825 6 6.542632 0.54263210296630859 0.29444959916963853 +3826 6 6.441372 0.44137191772460938 0.19480916975589935 +3827 5 5.547714 0.5477142333984375 0.29999088146723807 +3828 6 6.24235964 0.24235963821411133 0.058738194235274932 +3829 7 6.90751839 0.092481613159179688 0.0085528487725241575 +3830 7 6.662573 0.33742713928222656 0.11385707432418712 +3831 5 5.104566 0.10456609725952148 0.010934068696087706 +3832 5 5.104566 0.10456609725952148 0.010934068696087706 +3833 6 6.39407635 0.39407634735107422 0.1552961675415645 +3834 5 5.11497831 0.11497831344604492 0.013220012562896954 +3835 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3836 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3837 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3838 5 5.11497831 0.11497831344604492 0.013220012562896954 +3839 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3840 6 6.208704 0.20870399475097656 0.043557357425015653 +3841 6 6.314494 0.31449413299560547 0.09890655968865758 +3842 6 6.040485 0.040484905242919922 0.001639027552528205 +3843 7 6.94303846 0.056961536407470703 0.0032446166298996104 +3844 6 6.208704 0.20870399475097656 0.043557357425015653 +3845 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3846 6 6.27509069 0.27509069442749023 0.075674890160598807 +3847 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3848 6 5.67952156 0.32047843933105469 0.1027064300760685 +3849 5 5.12245846 0.12245845794677734 0.014996073922702635 +3850 6 6.27509069 0.27509069442749023 0.075674890160598807 +3851 7 7.210589 0.21058893203735352 0.044347698296633098 +3852 6 6.20994473 0.20994472503662109 0.044076787570702436 +3853 7 7.079849 0.079848766326904297 0.0063758254839285655 +3854 6 6.775606 0.77560615539550781 0.60156490828740061 +3855 6 6.39135551 0.39135551452636719 0.1531591387501976 +3856 6 6.20994473 0.20994472503662109 0.044076787570702436 +3857 6 6.280806 0.28080606460571289 0.078852045919347802 +3858 6 6.61661 0.61661005020141602 0.38020795400939278 +3859 5 5.38074636 0.38074636459350586 0.14496779415117089 +3860 5 5.38074636 0.38074636459350586 0.14496779415117089 +3861 6 5.924023 0.075976848602294922 0.0057724815235360438 +3862 6 5.903024 0.096975803375244141 0.0094043064402740129 +3863 6 5.903024 0.096975803375244141 0.0094043064402740129 +3864 7 6.547844 0.45215606689453125 0.20444510882953182 +3865 6 6.91423035 0.9142303466796875 0.83581712679006159 +3866 6 6.122323 0.12232303619384766 0.014962925183681364 +3867 5 5.38074636 0.38074636459350586 0.14496779415117089 +3868 6 4.826844 1.1731557846069336 1.37629449495671 +3869 6 5.924023 0.075976848602294922 0.0057724815235360438 +3870 6 5.874355 0.12564516067504883 0.015786706401058836 +3871 6 5.903024 0.096975803375244141 0.0094043064402740129 +3872 4 4.866891 0.86689090728759766 0.75149984513791424 +3873 5 5.13102341 0.13102340698242188 0.017167133177281357 +3874 5 5.2737484 0.27374839782714844 0.074938185312930727 +3875 7 5.953763 1.0462369918823242 1.0946118431829746 +3876 5 5.43160534 0.43160533905029297 0.18628316869671835 +3877 5 5.96922541 0.96922540664672852 0.93939788888951625 +3878 5 5.27135849 0.27135848999023438 0.073635430089780129 +3879 4 3.85325718 0.14674282073974609 0.021533455438657256 +3880 6 5.7290225 0.27097749710083008 0.073428803935030373 +3881 6 5.7290225 0.27097749710083008 0.073428803935030373 +3882 5 5.93204927 0.93204927444458008 0.86871584999266815 +3883 6 6.63882732 0.63882732391357422 0.40810034977857867 +3884 6 5.7290225 0.27097749710083008 0.073428803935030373 +3885 6 6.157238 0.15723800659179688 0.024723790716961958 +3886 6 6.63882732 0.63882732391357422 0.40810034977857867 +3887 6 6.157238 0.15723800659179688 0.024723790716961958 +3888 6 5.7290225 0.27097749710083008 0.073428803935030373 +3889 6 6.10551071 0.10551071166992188 0.011132510277093388 +3890 6 6.19827271 0.198272705078125 0.039312065578997135 +3891 5 5.93204927 0.93204927444458008 0.86871584999266815 +3892 5 5.79291964 0.79291963577270508 0.62872154879391928 +3893 5 4.78047943 0.21952056884765625 0.048189280147198588 +3894 6 6.143109 0.14310884475708008 0.020480141447706046 +3895 6 6.40889549 0.40889549255371094 0.16719552383074188 +3896 6 5.741901 0.25809907913208008 0.066615134648827734 +3897 6 5.997462 0.0025382041931152344 6.442480525947758E-06 +3898 7 6.17240953 0.8275904655456543 0.68490597866207281 +3899 5 5.79291964 0.79291963577270508 0.62872154879391928 +3900 5 4.78047943 0.21952056884765625 0.048189280147198588 +3901 4 4.35597134 0.35597133636474609 0.1267155923133032 +3902 6 5.915008 0.084991931915283203 0.0072236284906921355 +3903 6 6.23150444 0.23150444030761719 0.05359430588214309 +3904 7 7.02997 0.029970169067382813 0.00089821103392750956 +3905 7 6.960154 0.039845943450927734 0.0015876992094945308 +3906 7 6.960154 0.039845943450927734 0.0015876992094945308 +3907 7 6.6903367 0.30966329574584961 0.095891356732181521 +3908 7 6.296472 0.70352792739868164 0.49495154462988467 +3909 7 6.296472 0.70352792739868164 0.49495154462988467 +3910 6 6.341356 0.34135580062866211 0.11652378262283491 +3911 6 5.71503448 0.28496551513671875 0.081205344817135483 +3912 7 6.960154 0.039845943450927734 0.0015876992094945308 +3913 6 5.858565 0.14143514633178711 0.020003900617894033 +3914 7 6.296472 0.70352792739868164 0.49495154462988467 +3915 7 6.872329 0.1276707649230957 0.016299824216048364 +3916 6 6.341356 0.34135580062866211 0.11652378262283491 +3917 5 5.19301939 0.19301939010620117 0.037256484956969871 +3918 7 6.62571 0.37428998947143555 0.14009299621852733 +3919 6 6.55708551 0.55708551406860352 0.31034426998508025 +3920 6 5.821983 0.17801713943481445 0.031690101932554171 +3921 5 5.52710438 0.52710437774658203 0.27783902503961144 +3922 7 6.6903367 0.30966329574584961 0.095891356732181521 +3923 5 5.21137667 0.21137666702270508 0.044680095361627536 +3924 5 5.21137667 0.21137666702270508 0.044680095361627536 +3925 5 5.424182 0.42418193817138672 0.17993031667083415 +3926 6 5.80389357 0.1961064338684082 0.03845773340458436 +3927 5 5.96175432 0.96175432205200195 0.92497137598570589 +3928 5 5.141706 0.14170598983764648 0.020080587555867169 +3929 5 5.141706 0.14170598983764648 0.020080587555867169 +3930 6 6.28535843 0.28535842895507813 0.08142943297571037 +3931 6 6.524964 0.5249638557434082 0.2755870498369859 +3932 8 6.46785831 1.5321416854858398 2.3474581444033902 +3933 4 5.35140467 1.3514046669006348 1.8262945737208156 +3934 6 5.92051172 0.079488277435302734 0.0063183862496316578 +3935 5 5.30682325 0.3068232536315918 0.094140508969076109 +3936 6 5.78626442 0.21373558044433594 0.045682898347877199 +3937 5 5.39522934 0.39522933959960938 0.15620623088034336 +3938 6 5.758783 0.24121713638305664 0.058185706884842148 +3939 6 6.261217 0.26121711730957031 0.068234382375521818 +3940 5 5.339176 0.33917617797851563 0.11504047970811371 +3941 5 5.24542665 0.24542665481567383 0.060234242894011913 +3942 6 5.8923316 0.10766839981079102 0.011592484317816343 +3943 6 5.798487 0.20151281356811523 0.040607414032137967 +3944 6 6.21212339 0.21212339401245117 0.044996334287361606 +3945 6 6.261217 0.26121711730957031 0.068234382375521818 +3946 6 6.54871845 0.54871845245361328 0.30109194006308826 +3947 7 6.61867762 0.38132238388061523 0.14540676044839529 +3948 5 5.584513 0.58451318740844727 0.3416556662543826 +3949 5 5.339176 0.33917617797851563 0.11504047970811371 +3950 5 5.24542665 0.24542665481567383 0.060234242894011913 +3951 5 5.350792 0.35079193115234375 0.12305497896159068 +3952 6 6.112464 0.11246395111083984 0.012648140299461375 +3953 7 6.392265 0.60773515701293945 0.36934202106954217 +3954 5 5.350792 0.35079193115234375 0.12305497896159068 +3955 6 6.112464 0.11246395111083984 0.012648140299461375 +3956 5 5.47008228 0.47008228302001953 0.22097735280931374 +3957 5 5.946553 0.94655323028564453 0.89596301776418841 +3958 6 5.66506624 0.33493375778198242 0.11218062210195967 +3959 6 5.66506624 0.33493375778198242 0.11218062210195967 +3960 6 5.3763175 0.62368249893188477 0.38897985947392044 +3961 5 5.18560743 0.1856074333190918 0.034450119303301108 +3962 7 7.151062 0.15106201171875 0.022819731384515762 +3963 7 6.32142735 0.67857265472412109 0.46046084773934126 +3964 5 5.18217325 0.18217325210571289 0.033187093782771626 +3965 4 5.70695639 1.7069563865661621 2.9137001056390091 +3966 6 5.66506624 0.33493375778198242 0.11218062210195967 +3967 4 5.26928663 1.2692866325378418 1.6110885555392542 +3968 6 5.35175 0.64825010299682617 0.42022819603539574 +3969 6 6.229696 0.22969579696655273 0.052760159144099816 +3970 7 6.19331 0.80669021606445313 0.65074910469411407 +3971 6 6.229696 0.22969579696655273 0.052760159144099816 +3972 6 5.54704952 0.45295047760009766 0.20516413515815657 +3973 4 5.26928663 1.2692866325378418 1.6110885555392542 +3974 6 5.35175 0.64825010299682617 0.42022819603539574 +3975 7 6.709179 0.29082107543945313 0.084576897919760086 +3976 7 7.10497856 0.10497856140136719 0.011020498353900621 +3977 6 6.63561869 0.63561868667602539 0.40401111485175534 +3978 7 6.04282236 0.95717763900756836 0.91618903261610285 +3979 6 6.217364 0.21736383438110352 0.047247036496855799 +3980 5 6.02859735 1.028597354888916 1.0580125184844746 +3981 7 6.28068542 0.7193145751953125 0.51741345808841288 +3982 7 6.709179 0.29082107543945313 0.084576897919760086 +3983 6 5.925124 0.074875831604003906 0.0056063901583911502 +3984 7 7.10497856 0.10497856140136719 0.011020498353900621 +3985 6 6.122168 0.12216806411743164 0.014925035890200888 +3986 6 6.122168 0.12216806411743164 0.014925035890200888 +3987 6 5.71410275 0.28589725494384766 0.081737240384427423 +3988 6 5.879811 0.12018918991088867 0.014445441371435663 +3989 6 6.122168 0.12216806411743164 0.014925035890200888 +3990 6 5.71410275 0.28589725494384766 0.081737240384427423 +3991 5 5.62714958 0.62714958190917969 0.39331659808885888 +3992 7 6.14805937 0.85194063186645508 0.72580284022501473 +3993 7 6.485149 0.51485109329223633 0.26507164826421103 +3994 7 6.485149 0.51485109329223633 0.26507164826421103 +3995 5 5.104947 0.10494709014892578 0.011013891730726755 +3996 7 6.485149 0.51485109329223633 0.26507164826421103 +3997 7 6.735825 0.2641749382019043 0.069788397973979954 +3998 6 5.934058 0.065941810607910156 0.0043483223862494924 +3999 6 5.934058 0.065941810607910156 0.0043483223862494924 +4000 6 5.934058 0.065941810607910156 0.0043483223862494924 +4001 5 5.335033 0.33503293991088867 0.11224707082533314 +4002 6 5.60893059 0.39106941223144531 0.15293528518304811 +4003 6 6.45015 0.4501500129699707 0.20263503417686479 +4004 7 6.7571907 0.24280929565429688 0.058956354056135751 +4005 6 6.45015 0.4501500129699707 0.20263503417686479 +4006 6 6.23378134 0.23378133773803711 0.054653713874586174 +4007 5 5.335033 0.33503293991088867 0.11224707082533314 +4008 6 5.60893059 0.39106941223144531 0.15293528518304811 +4009 6 6.07953453 0.079534530639648438 0.0063257415640691761 +4010 6 6.55589867 0.55589866638183594 0.30902332728510373 +4011 7 6.735825 0.2641749382019043 0.069788397973979954 +4012 6 5.934058 0.065941810607910156 0.0043483223862494924 +4013 6 5.441547 0.55845308303833008 0.31186984595501599 +4014 6 6.24294 0.24293994903564453 0.059019818837441562 +4015 5 4.75735331 0.24264669418334961 0.058877418198107989 +4016 5 5.21397972 0.21397972106933594 0.04578732102891081 +4017 6 6.14959431 0.14959430694580078 0.02237845667059446 +4018 6 6.24294 0.24293994903564453 0.059019818837441562 +4019 5 4.75735331 0.24264669418334961 0.058877418198107989 +4020 4 4.47513533 0.47513532638549805 0.22575357837945376 +4021 5 5.643344 0.64334392547607422 0.41389140644696454 +4022 5 5.21397972 0.21397972106933594 0.04578732102891081 +4023 6 6.39005136 0.39005136489868164 0.1521400672593245 +4024 6 6.409837 0.40983676910400391 0.16796617730960861 +4025 6 6.7355876 0.73558759689331055 0.54108911270327553 +4026 6 6.39005136 0.39005136489868164 0.1521400672593245 +4027 5 5.18595076 0.18595075607299805 0.03457768368411962 +4028 6 6.40132236 0.40132236480712891 0.16105964049438626 +4029 6 6.29972172 0.29972171783447266 0.089833108141647244 +4030 5 5.77380943 0.77380943298339844 0.5987810385740886 +4031 5 5.164775 0.16477489471435547 0.02715076592812693 +4032 5 5.318856 0.31885576248168945 0.10166899726777956 +4033 6 6.01368 0.013679981231689453 0.00018714188649937569 +4034 5 5.318856 0.31885576248168945 0.10166899726777956 +4035 6 6.11864853 0.11864852905273438 0.014077473446377553 +4036 5 5.10300541 0.10300540924072266 0.010610114332848752 +4037 5 5.15395546 0.15395545959472656 0.023702283539023483 +4038 5 5.164775 0.16477489471435547 0.02715076592812693 +4039 4 5.06407642 1.0640764236450195 1.1322586353571751 +4040 5 5.49962044 0.49962043762207031 0.24962058168966905 +4041 5 5.2111783 0.21117830276489258 0.044596275558660636 +4042 7 6.820859 0.17914104461669922 0.03209151386636222 +4043 7 6.820859 0.17914104461669922 0.03209151386636222 +4044 7 6.820859 0.17914104461669922 0.03209151386636222 +4045 7 6.820859 0.17914104461669922 0.03209151386636222 +4046 7 6.707407 0.29259300231933594 0.085610665006242925 +4047 6 6.44117928 0.44117927551269531 0.19463915314190672 +4048 6 6.44117928 0.44117927551269531 0.19463915314190672 +4049 6 6.41707468 0.41707468032836914 0.17395128897101131 +4050 7 6.820859 0.17914104461669922 0.03209151386636222 +4051 6 6.331319 0.33131885528564453 0.10977218386778986 +4052 5 5.2111783 0.21117830276489258 0.044596275558660636 +4053 7 6.820859 0.17914104461669922 0.03209151386636222 +4054 7 6.707407 0.29259300231933594 0.085610665006242925 +4055 6 6.331319 0.33131885528564453 0.10977218386778986 +4056 5 5.77324438 0.77324438095092773 0.59790687267218345 +4057 6 6.295132 0.29513216018676758 0.087102991976507838 +4058 6 6.44117928 0.44117927551269531 0.19463915314190672 +4059 6 6.41707468 0.41707468032836914 0.17395128897101131 +4060 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4061 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4062 6 6.082549 0.082549095153808594 0.0068143531107125455 +4063 5 5.371587 0.37158679962158203 0.13807674965300976 +4064 5 6.223232 1.2232317924499512 1.4962960180603204 +4065 8 7.24055958 0.75944042205810547 0.57674975465579337 +4066 6 6.2537303 0.25373029708862305 0.064379063660680913 +4067 5 5.3426137 0.34261369705200195 0.11738414540764097 +4068 6 6.2537303 0.25373029708862305 0.064379063660680913 +4069 6 6.004174 0.0041742324829101563 1.7424216821382288E-05 +4070 5 5.571743 0.57174301147460938 0.32689007117005531 +4071 6 5.818604 0.1813960075378418 0.032904511550668758 +4072 7 6.515072 0.48492813110351563 0.23515529233554844 +4073 5 4.62328625 0.37671375274658203 0.14191325150841294 +4074 4 4.78012753 0.78012752532958984 0.60859895577686984 +4075 6 5.69815826 0.30184173583984375 0.091108433494810015 +4076 5 5.492518 0.49251794815063477 0.24257392925051136 +4077 6 5.968249 0.031751155853271484 0.001008135898018736 +4078 6 5.7745986 0.22540140151977539 0.050805791807079004 +4079 6 5.88386059 0.11613941192626953 0.013488363002579717 +4080 6 5.865267 0.13473320007324219 0.018153035201976309 +4081 6 5.678007 0.32199287414550781 0.10367941100048483 +4082 6 6.05232334 0.052323341369628906 0.0027377320520827197 +4083 5 5.29502439 0.29502439498901367 0.087039393638633555 +4084 8 6.477889 1.5221109390258789 2.3168217107022429 +4085 6 5.937694 0.062305927276611328 0.0038820285737983795 +4086 6 5.76667166 0.23332834243774414 0.054442115384745193 +4087 6 5.690505 0.30949497222900391 0.095787137835031899 +4088 6 6.06473732 0.064737319946289063 0.0041909205938281957 +4089 6 5.55112648 0.44887351989746094 0.20148743686513626 +4090 6 5.529048 0.47095203399658203 0.22179581832551776 +4091 6 5.82618856 0.17381143569946289 0.030210415179908523 +4092 6 5.28551674 0.71448326110839844 0.51048633040409186 +4093 6 5.351238 0.64876222610473633 0.42089242602037302 +4094 7 7.07337046 0.073370456695556641 0.0053832239157145523 +4095 6 5.351238 0.64876222610473633 0.42089242602037302 +4096 5 4.990592 0.0094079971313476563 8.8510410023445729E-05 +4097 6 5.82618856 0.17381143569946289 0.030210415179908523 +4098 5 6.222002 1.2220020294189453 1.4932889599040209 +4099 6 5.28551674 0.71448326110839844 0.51048633040409186 +4100 6 6.014094 0.014093875885009766 0.0001986373374620598 +4101 5 5.22823429 0.22823429107666016 0.052090891623265634 +4102 5 5.22823429 0.22823429107666016 0.052090891623265634 +4103 7 6.371319 0.62868118286132813 0.39524002968391869 +4104 7 6.347439 0.65256118774414063 0.42583610375004355 +4105 7 6.239276 0.76072406768798828 0.57870110715975898 +4106 5 5.64672947 0.64672946929931641 0.41825900646017544 +4107 6 6.32752848 0.32752847671508789 0.10727490305930587 +4108 6 6.51016045 0.51016044616699219 0.26026368083330453 +4109 6 6.0367527 0.036752700805664063 0.0013507610165106598 +4110 5 5.393194 0.39319419860839844 0.15460167781930068 +4111 6 6.05556536 0.055565357208251953 0.0030875089216806373 +4112 6 6.33822441 0.33822441101074219 0.11439575220356346 +4113 6 6.354503 0.35450315475463867 0.1256724867309913 +4114 6 6.023537 0.023537158966064453 0.00055399785219378828 +4115 6 6.138492 0.13849210739135742 0.019180063809699277 +4116 6 5.4326086 0.56739139556884766 0.32193299576556456 +4117 6 5.4326086 0.56739139556884766 0.32193299576556456 +4118 8 6.47382832 1.5261716842651367 2.3292000098526842 +4119 7 6.62782335 0.3721766471862793 0.13851545671082022 +4120 5 5.605265 0.60526514053344727 0.36634589034497367 +4121 6 5.586563 0.4134368896484375 0.17093006172217429 +4122 6 5.498919 0.50108098983764648 0.25108215837667558 +4123 6 6.05965 0.059649944305419922 0.0035581158556396986 +4124 7 6.57852364 0.42147636413574219 0.17764232552508474 +4125 5 5.755329 0.75532913208007813 0.57052209776884411 +4126 5 5.755329 0.75532913208007813 0.57052209776884411 +4127 5 5.55892754 0.55892753601074219 0.3123999905110395 +4128 5 5.2543 0.25430011749267578 0.064668549756788707 +4129 7 6.86728239 0.13271760940551758 0.017613963846315528 +4130 6 6.040545 0.040544986724853516 0.0016438959485185478 +4131 5 5.36841869 0.36841869354248047 0.13573233375154814 +4132 5 5.36841869 0.36841869354248047 0.13573233375154814 +4133 6 6.171894 0.17189407348632813 0.029547572499723174 +4134 6 6.451214 0.45121383666992188 0.20359392640239093 +4135 5 5.92140675 0.92140674591064453 0.84899039140964305 +4136 6 6.35042429 0.35042428970336914 0.12279718281411078 +4137 5 5.36841869 0.36841869354248047 0.13573233375154814 +4138 6 5.7370224 0.26297760009765625 0.069157218153122813 +4139 7 6.313542 0.68645811080932617 0.47122473789590913 +4140 6 5.932523 0.067477226257324219 0.004553176063382125 +4141 6 5.932523 0.067477226257324219 0.004553176063382125 +4142 6 6.059661 0.059660911560058594 0.0035594243681771331 +4143 6 5.80167866 0.19832134246826172 0.039331354878413549 +4144 6 5.932523 0.067477226257324219 0.004553176063382125 +4145 6 5.81908035 0.18091964721679688 0.032731918749050237 +4146 7 6.51515 0.48484992980957031 0.23507945443634526 +4147 7 6.313542 0.68645811080932617 0.47122473789590913 +4148 6 5.77318668 0.22681331634521484 0.051444280471514503 +4149 7 6.57568932 0.42431068420410156 0.1800395567297528 +4150 5 4.879766 0.12023401260375977 0.014456217786801062 +4151 6 6.349858 0.34985780715942383 0.12240048523040059 +4152 6 5.77318668 0.22681331634521484 0.051444280471514503 +4153 5 5.27344227 0.27344226837158203 0.074770674132196291 +4154 5 5.305294 0.30529403686523438 0.093204448945471086 +4155 5 5.27344227 0.27344226837158203 0.074770674132196291 +4156 5 5.31374645 0.31374645233154297 0.098436836350629164 +4157 7 7.011022 0.011022090911865234 0.00012148648806942219 +4158 7 7.011022 0.011022090911865234 0.00012148648806942219 +4159 7 7.011022 0.011022090911865234 0.00012148648806942219 +4160 7 7.011022 0.011022090911865234 0.00012148648806942219 +4161 7 7.011022 0.011022090911865234 0.00012148648806942219 +4162 7 7.011022 0.011022090911865234 0.00012148648806942219 +4163 5 5.25803375 0.25803375244140625 0.066581417398992926 +4164 5 5.40265226 0.40265226364135742 0.1621288454155092 +4165 7 6.126724 0.8732762336730957 0.76261138029826725 +4166 7 6.56084442 0.43915557861328125 0.19285762222716585 +4167 8 7.22911358 0.77088642120361328 0.59426587439611467 +4168 6 6.27897644 0.2789764404296875 0.077827854314818978 +4169 7 6.44153166 0.55846834182739258 0.3118868888234374 +4170 7 7.011022 0.011022090911865234 0.00012148648806942219 +4171 5 6.280464 1.2804641723632813 1.6395884967059828 +4172 6 6.044114 0.044114112854003906 0.0019460549528957927 +4173 5 5.45170975 0.45170974731445313 0.20404169581888709 +4174 6 5.229326 0.77067422866821289 0.59393876673334489 +4175 7 6.15340567 0.84659433364868164 0.71672196576605529 +4176 6 5.96163368 0.038366317749023438 0.0014719743376190308 +4177 6 6.29175138 0.29175138473510742 0.085118870494852672 +4178 7 6.215218 0.78478193283081055 0.61588268209766284 +4179 5 5.26952362 0.26952362060546875 0.072642982064280659 +4180 6 5.36615658 0.63384342193603516 0.40175748353158269 +4181 6 6.041504 0.04150390625 0.0017225742340087891 +4182 6 5.03049135 0.96950864791870117 0.93994701838914807 +4183 7 6.80200052 0.19799947738647461 0.03920379304531707 +4184 7 6.710221 0.2897791862487793 0.08397197678300472 +4185 5 5.26952362 0.26952362060546875 0.072642982064280659 +4186 5 5.451507 0.4515070915222168 0.20385865369485145 +4187 6 6.58606768 0.58606767654418945 0.34347532148990467 +4188 6 6.19589853 0.19589853286743164 0.038376235179612195 +4189 5 5.30196142 0.30196142196655273 0.091180700356062516 +4190 6 5.93951225 0.060487747192382813 0.0036587675604096148 +4191 5 5.727819 0.72781896591186523 0.52972044714101685 +4192 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4193 6 6.08673 0.086730003356933594 0.0075220934822937124 +4194 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4195 8 7.182058 0.81794214248657227 0.66902934845552409 +4196 6 6.189203 0.18920278549194336 0.035797694037910333 +4197 5 5.442303 0.44230318069458008 0.19563210365254236 +4198 5 5.18446827 0.18446826934814453 0.034028542396299599 +4199 6 6.08673 0.086730003356933594 0.0075220934822937124 +4200 6 6.10387468 0.10387468338012695 0.010789949847321623 +4201 6 6.356462 0.35646200180053711 0.12706515872764612 +4202 6 6.76204062 0.76204061508178711 0.58070589903422842 +4203 5 5.26486969 0.26486968994140625 0.070155952649656683 +4204 6 6.04439 0.044390201568603516 0.00197048999530125 +4205 6 6.356462 0.35646200180053711 0.12706515872764612 +4206 6 5.38576365 0.61423635482788086 0.37728629959224236 +4207 7 6.47487068 0.52512931823730469 0.27576080087237642 +4208 6 6.331671 0.33167123794555664 0.11000581008033805 +4209 6 6.61370659 0.61370658874511719 0.3766357770691684 +4210 6 5.75262737 0.24737262725830078 0.061193216716674215 +4211 6 5.57837772 0.42162227630615234 0.17776534387758147 +4212 4 4.7228303 0.72283029556274414 0.52248363618332405 +4213 4 4.765456 0.76545619964599609 0.58592319357649103 +4214 5 5.2678895 0.26788949966430664 0.071764784030392548 +4215 5 5.2678895 0.26788949966430664 0.071764784030392548 +4216 5 5.2678895 0.26788949966430664 0.071764784030392548 +4217 4 4.667052 0.66705179214477539 0.44495809340355663 +4218 6 6.367011 0.36701107025146484 0.13469712568712566 +4219 5 5.2678895 0.26788949966430664 0.071764784030392548 +4220 6 6.083678 0.083677768707275391 0.0070019689758282766 +4221 6 6.6260004 0.62600040435791016 0.39187650625626702 +4222 4 4.667052 0.66705179214477539 0.44495809340355663 +4223 4 4.13989544 0.13989543914794922 0.019570733894397563 +4224 7 6.72387 0.27613019943237305 0.076247887038562112 +4225 5 5.3994503 0.39945030212402344 0.1595605438669736 +4226 7 6.18949127 0.81050872802734375 0.65692439820850268 +4227 7 6.161215 0.83878517150878906 0.70356056394302868 +4228 6 5.363188 0.63681221008300781 0.40552979091080488 +4229 6 5.806095 0.19390487670898438 0.037599101211526431 +4230 6 5.62430429 0.37569570541381836 0.14114726306638659 +4231 6 6.18936443 0.18936443328857422 0.035858888594702876 +4232 6 6.160059 0.16005897521972656 0.025618875548389042 +4233 6 5.78126955 0.21873044967651367 0.04784300961568988 +4234 6 5.681346 0.31865406036376953 0.10154041018631688 +4235 5 5.34582424 0.34582424163818359 0.1195944061046248 +4236 5 5.34582424 0.34582424163818359 0.1195944061046248 +4237 5 5.86143255 0.86143255233764648 0.74206604222695205 +4238 5 5.34582424 0.34582424163818359 0.1195944061046248 +4239 7 7.03946257 0.039462566375732422 0.0015572941449590871 +4240 6 5.66003942 0.33996057510375977 0.11557319262487908 +4241 6 6.583823 0.58382320404052734 0.34084953357614722 +4242 7 6.668239 0.33176088333129883 0.11006528370876367 +4243 6 6.365007 0.36500692367553711 0.13323005433107937 +4244 5 5.33011436 0.33011436462402344 0.1089754937311227 +4245 5 5.42551851 0.42551851272583008 0.18106600467240241 +4246 6 6.26176071 0.26176071166992188 0.068518670173943974 +4247 6 5.43350172 0.5664982795715332 0.32092030075750699 +4248 6 6.15749 0.15748977661132813 0.024803029737086035 +4249 6 5.72360849 0.27639150619506836 0.076392264696778511 +4250 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4251 6 5.6752367 0.32476329803466797 0.10547119975035457 +4252 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4253 4 5.28086 1.2808599472045898 1.6406022043529447 +4254 5 5.8399086 0.83990859985351563 0.70544645610789303 +4255 5 5.131142 0.13114213943481445 0.017198260735540316 +4256 5 5.131142 0.13114213943481445 0.017198260735540316 +4257 5 5.808099 0.80809879302978516 0.65302365929619555 +4258 6 5.882378 0.11762189865112305 0.013834911042295062 +4259 6 6.31239748 0.31239748001098633 0.097592185517214602 +4260 6 6.113717 0.11371707916259766 0.012931574093272502 +4261 7 6.4979763 0.50202369689941406 0.25202779224855476 +4262 6 6.524527 0.52452707290649414 0.27512865021185462 +4263 6 5.814336 0.18566417694091797 0.034471186599148496 +4264 6 5.97327471 0.026725292205810547 0.00071424124348595797 +4265 6 6.113717 0.11371707916259766 0.012931574093272502 +4266 7 6.4979763 0.50202369689941406 0.25202779224855476 +4267 7 6.4979763 0.50202369689941406 0.25202779224855476 +4268 6 6.506674 0.50667381286621094 0.25671835264438414 +4269 5 5.28652143 0.28652143478393555 0.082094532590645031 +4270 6 5.9458127 0.054187297821044922 0.0029362632451466197 +4271 5 5.14096165 0.14096164703369141 0.019870185934451001 +4272 6 5.72031927 0.27968072891235352 0.078221310124945376 +4273 6 5.72031927 0.27968072891235352 0.078221310124945376 +4274 6 5.72031927 0.27968072891235352 0.078221310124945376 +4275 6 5.72031927 0.27968072891235352 0.078221310124945376 +4276 7 7.23196 0.23195981979370117 0.053805357998726322 +4277 5 5.92046642 0.92046642303466797 0.84725843593423633 +4278 4 4.848876 0.84887599945068359 0.72059046244339697 +4279 6 5.82808638 0.17191362380981445 0.029554294051422403 +4280 6 5.72031927 0.27968072891235352 0.078221310124945376 +4281 5 5.164684 0.16468381881713867 0.027120760180196157 +4282 5 5.164684 0.16468381881713867 0.027120760180196157 +4283 6 6.057775 0.057775020599365234 0.0033379530052570772 +4284 6 6.057775 0.057775020599365234 0.0033379530052570772 +4285 6 6.057775 0.057775020599365234 0.0033379530052570772 +4286 6 6.057775 0.057775020599365234 0.0033379530052570772 +4287 5 5.42380047 0.42380046844482422 0.17960683705405245 +4288 6 5.74335527 0.25664472579956055 0.065866515280731619 +4289 6 5.78677559 0.21322441101074219 0.045464649450877914 +4290 5 5.164684 0.16468381881713867 0.027120760180196157 +4291 5 5.40787935 0.40787935256958008 0.16636556625257981 +4292 6 6.09707 0.097070217132568359 0.0094226270541639678 +4293 5 5.40787935 0.40787935256958008 0.16636556625257981 +4294 5 5.84869528 0.84869527816772461 0.72028367518419145 +4295 5 5.40787935 0.40787935256958008 0.16636556625257981 +4296 6 6.09707 0.097070217132568359 0.0094226270541639678 +4297 6 6.33077431 0.33077430725097656 0.10941164233736345 +4298 6 6.20831966 0.20831966400146484 0.043397082409683208 +4299 6 5.624217 0.37578296661376953 0.14121283799704543 +4300 5 5.38560057 0.38560056686401367 0.14868779716584868 +4301 5 5.13298368 0.13298368453979492 0.017684660353779691 +4302 6 5.647275 0.35272502899169922 0.12441494607719505 +4303 6 6.427828 0.42782783508300781 0.18303665647181333 +4304 6 6.19889164 0.19889163970947266 0.03955788434632268 +4305 6 5.85083961 0.14916038513183594 0.022248820492677623 +4306 6 5.92332029 0.076679706573486328 0.0058797774001959624 +4307 7 6.613306 0.38669395446777344 0.14953221442192444 +4308 6 6.286537 0.28653717041015625 0.082103550026658922 +4309 6 6.396994 0.39699411392211914 0.15760432648880851 +4310 6 5.73678637 0.2632136344909668 0.069281417381944266 +4311 5 6.19426775 1.194267749786377 1.4262754581798163 +4312 6 6.427828 0.42782783508300781 0.18303665647181333 +4313 6 6.24178934 0.24178934097290039 0.058462085408109488 +4314 7 6.47377 0.5262298583984375 0.27691786387003958 +4315 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4316 5 4.89074039 0.10925960540771484 0.011937661373849551 +4317 7 6.58141041 0.41858959197998047 0.17521724651396653 +4318 7 6.47377 0.5262298583984375 0.27691786387003958 +4319 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4320 5 5.485202 0.48520183563232422 0.23542082130097697 +4321 6 5.74379873 0.25620126724243164 0.065639089336627876 +4322 7 6.329284 0.6707158088684082 0.44985969626600308 +4323 6 5.644962 0.35503816604614258 0.12605209934940831 +4324 6 5.88721132 0.11278867721557617 0.012721285708039431 +4325 5 5.29375 0.29374980926513672 0.086288950443304202 +4326 5 5.314613 0.31461286544799805 0.098981255105400123 +4327 5 5.29375 0.29374980926513672 0.086288950443304202 +4328 5 5.825475 0.82547521591186523 0.68140933208474053 +4329 5 5.48227 0.4822697639465332 0.23258412521704486 +4330 5 5.29375 0.29374980926513672 0.086288950443304202 +4331 5 5.314613 0.31461286544799805 0.098981255105400123 +4332 8 7.65718842 0.34281158447265625 0.11751978244865313 +4333 8 7.65718842 0.34281158447265625 0.11751978244865313 +4334 8 7.65718842 0.34281158447265625 0.11751978244865313 +4335 8 7.65718842 0.34281158447265625 0.11751978244865313 +4336 8 7.65718842 0.34281158447265625 0.11751978244865313 +4337 8 7.65718842 0.34281158447265625 0.11751978244865313 +4338 8 7.65718842 0.34281158447265625 0.11751978244865313 +4339 8 6.11387157 1.8861284255981445 3.5574804378493354 +4340 8 7.65718842 0.34281158447265625 0.11751978244865313 +4341 6 5.607523 0.39247703552246094 0.15403822341249906 +4342 6 6.406812 0.40681219100952148 0.16549615875396739 +4343 6 5.87327576 0.1267242431640625 0.016059033805504441 +4344 6 5.649031 0.35096883773803711 0.12317912506318862 +4345 6 6.168647 0.16864681243896484 0.028441747345823387 +4346 6 5.649031 0.35096883773803711 0.12317912506318862 +4347 7 6.41372442 0.58627557754516602 0.34371905282591797 +4348 6 5.38195562 0.61804437637329102 0.3819788511666502 +4349 5 5.33784 0.33784008026123047 0.11413591983091464 +4350 6 5.955332 0.044668197631835938 0.0019952478796767537 +4351 6 6.74399137 0.74399137496948242 0.553523166028981 +4352 5 5.696282 0.69628190994262695 0.48480849811335247 +4353 6 5.936355 0.063644886016845703 0.0040506715160972817 +4354 6 6.277787 0.27778720855712891 0.077165733237961831 +4355 6 6.74399137 0.74399137496948242 0.553523166028981 +4356 5 5.74487638 0.74487638473510742 0.55484082853604377 +4357 6 6.078775 0.078774929046630859 0.0062054894463017263 +4358 5 5.325482 0.32548189163208008 0.10593846178039712 +4359 6 5.146009 0.85399103164672852 0.72930068213304367 +4360 5 5.696282 0.69628190994262695 0.48480849811335247 +4361 6 6.354132 0.35413217544555664 0.12540959768580251 +4362 6 6.827937 0.82793712615966797 0.68547988487352995 +4363 5 5.352111 0.35211086273193359 0.12398205965382658 +4364 6 5.949367 0.050632953643798828 0.002563695994695081 +4365 5 5.644166 0.64416599273681641 0.41494982619860821 +4366 6 6.581495 0.58149480819702148 0.3381362119600908 +4367 5 5.352111 0.35211086273193359 0.12398205965382658 +4368 6 6.24809647 0.24809646606445313 0.061551856473670341 +4369 6 5.949367 0.050632953643798828 0.002563695994695081 +4370 5 5.27093458 0.2709345817565918 0.073405547591619325 +4371 5 5.46512651 0.46512651443481445 0.21634267443027966 +4372 6 6.02718067 0.027180671691894531 0.00073878891362255672 +4373 6 6.348733 0.34873294830322266 0.12161466923225817 +4374 5 5.14362526 0.14362525939941406 0.020628215137548978 +4375 6 5.86484051 0.13515949249267578 0.018268088410877681 +4376 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4377 6 6.304982 0.30498218536376953 0.093014133389260678 +4378 5 5.02749825 0.027498245239257813 0.00075615349123836495 +4379 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4380 6 6.19491 0.19491004943847656 0.037989927372109378 +4381 6 6.542717 0.54271697998046875 0.29454172035912052 +4382 6 6.16713762 0.16713762283325195 0.027934984966350385 +4383 6 6.304982 0.30498218536376953 0.093014133389260678 +4384 5 5.121737 0.12173700332641602 0.014819897978895824 +4385 5 5.121737 0.12173700332641602 0.014819897978895824 +4386 6 6.16324 0.16323995590209961 0.026647283202919425 +4387 6 6.20248032 0.20248031616210938 0.040998278433107771 +4388 6 5.73686457 0.26313543319702148 0.069240256203784156 +4389 4 5.578374 1.578373908996582 2.4912641966011506 +4390 5 5.47506475 0.47506475448608398 0.22568652095492325 +4391 5 5.31349 0.31348991394042969 0.098275926142378012 +4392 5 5.47506475 0.47506475448608398 0.22568652095492325 +4393 6 5.894842 0.10515785217285156 0.011058173873607302 +4394 6 5.92819 0.071809768676757813 0.0051566428774094675 +4395 5 5.36295462 0.36295461654663086 0.13173605367251184 +4396 5 5.33769274 0.3376927375793457 0.11403638501383284 +4397 5 5.33769274 0.3376927375793457 0.11403638501383284 +4398 5 5.33769274 0.3376927375793457 0.11403638501383284 +4399 5 5.36295462 0.36295461654663086 0.13173605367251184 +4400 5 5.33769274 0.3376927375793457 0.11403638501383284 +4401 6 6.450748 0.45074796676635742 0.20317372954400525 +4402 6 6.30272961 0.30272960662841797 0.091645214729396685 +4403 5 5.53840542 0.53840541839599609 0.28988039455816761 +4404 5 5.15546846 0.15546846389770508 0.024170443266712027 +4405 5 5.15546846 0.15546846389770508 0.024170443266712027 +4406 7 6.80952168 0.19047832489013672 0.036281992252952477 +4407 6 6.221997 0.22199678421020508 0.049282572199672359 +4408 5 5.15546846 0.15546846389770508 0.024170443266712027 +4409 7 6.80952168 0.19047832489013672 0.036281992252952477 +4410 5 5.41353559 0.41353559494018555 0.17101168828253321 +4411 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4412 7 6.2168684 0.78313159942626953 0.61329510201994708 +4413 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4414 7 6.2168684 0.78313159942626953 0.61329510201994708 +4415 5 5.189993 0.18999290466308594 0.036097303822316462 +4416 5 5.41353559 0.41353559494018555 0.17101168828253321 +4417 6 5.888463 0.11153697967529297 0.012440497835086717 +4418 6 5.8170557 0.18294429779052734 0.033468616094069148 +4419 6 5.8170557 0.18294429779052734 0.033468616094069148 +4420 6 5.8170557 0.18294429779052734 0.033468616094069148 +4421 6 5.8170557 0.18294429779052734 0.033468616094069148 +4422 6 5.888463 0.11153697967529297 0.012440497835086717 +4423 6 5.888463 0.11153697967529297 0.012440497835086717 +4424 6 5.8170557 0.18294429779052734 0.033468616094069148 +4425 6 5.86058664 0.13941335678100586 0.019436084048948032 +4426 6 5.796547 0.20345306396484375 0.041393149236682802 +4427 5 5.34068727 0.34068727493286133 0.11606781930117904 +4428 6 6.74285555 0.74285554885864258 0.55183436647007511 +4429 6 5.862502 0.13749790191650391 0.018905673031440529 +4430 5 5.16007662 0.16007661819458008 0.025624523692613366 +4431 6 6.27077341 0.27077341079711914 0.073318239994705436 +4432 6 6.455703 0.45570278167724609 0.20766502522837982 +4433 5 4.893008 0.10699176788330078 0.011447238394794113 +4434 6 6.0497036 0.049703598022460938 0.0024704476563783828 +4435 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4436 6 6.199245 0.19924497604370117 0.039698560478655054 +4437 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4438 5 5.572666 0.57266616821289063 0.32794654021563474 +4439 5 5.11934042 0.11934041976928711 0.014242135790709654 +4440 5 5.327377 0.3273768424987793 0.10717559700447055 +4441 6 6.27455759 0.27455759048461914 0.075381870492719827 +4442 5 5.327377 0.3273768424987793 0.10717559700447055 +4443 5 5.11934042 0.11934041976928711 0.014242135790709654 +4444 6 6.25034428 0.25034427642822266 0.062672256740370358 +4445 6 6.25034428 0.25034427642822266 0.062672256740370358 +4446 6 6.77828074 0.77828073501586914 0.60572090249684152 +4447 6 6.490504 0.49050378799438477 0.24059396603684036 +4448 5 5.858529 0.85852909088134766 0.7370721998895533 +4449 6 5.77393 0.22606992721557617 0.051107611991255908 +4450 6 6.023334 0.023334026336669922 0.00054447678508040553 +4451 5 5.18813133 0.18813133239746094 0.035393398229643935 +4452 5 5.270654 0.27065420150756836 0.073253696793699419 +4453 6 6.490504 0.49050378799438477 0.24059396603684036 +4454 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4455 5 5.1645813 0.164581298828125 0.027087003923952579 +4456 5 5.1645813 0.164581298828125 0.027087003923952579 +4457 5 5.1645813 0.164581298828125 0.027087003923952579 +4458 7 6.53274345 0.46725654602050781 0.21832867979901494 +4459 5 5.746503 0.74650287628173828 0.55726654429690825 +4460 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4461 6 6.026326 0.026326179504394531 0.00069306772729760269 +4462 6 6.782111 0.78211116790771484 0.61169787896596972 +4463 6 6.42424965 0.42424964904785156 0.17998776471722522 +4464 5 5.338199 0.33819913864135742 0.1143786573777561 +4465 5 5.338199 0.33819913864135742 0.1143786573777561 +4466 5 6.011748 1.0117478370666504 1.0236336858090453 +4467 5 5.807701 0.80770111083984375 0.65238108445191756 +4468 6 5.99583435 0.0041656494140625 1.735263504087925E-05 +4469 6 6.384077 0.38407707214355469 0.14751519734636531 +4470 6 6.19453 0.19453001022338867 0.037841924877511701 +4471 6 6.190817 0.19081687927246094 0.036411081415280933 +4472 5 5.8315444 0.83154439926147461 0.69146608794312669 +4473 5 4.95860672 0.041393280029296875 0.0017134036315837875 +4474 6 5.73346043 0.26653957366943359 0.071043344331883418 +4475 6 6.585525 0.5855250358581543 0.34283956761669288 +4476 6 6.383046 0.38304615020751953 0.14672435318880162 +4477 5 5.17250633 0.17250633239746094 0.029758434717223281 +4478 5 5.17250633 0.17250633239746094 0.029758434717223281 +4479 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4480 5 5.586254 0.58625411987304688 0.34369389306812081 +4481 5 5.17250633 0.17250633239746094 0.029758434717223281 +4482 6 6.64182758 0.64182758331298828 0.41194264670139091 +4483 4 4.56951332 0.56951332092285156 0.32434542270857492 +4484 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4485 6 6.236687 0.23668718338012695 0.056020822776417845 +4486 6 5.62462854 0.37537145614624023 0.14090373008934876 +4487 6 6.149464 0.14946413040161133 0.022339526276709876 +4488 6 6.630827 0.63082695007324219 0.39794264093870879 +4489 6 6.630827 0.63082695007324219 0.39794264093870879 +4490 6 6.326199 0.32619905471801758 0.10640582329892823 +4491 6 6.552785 0.55278491973876953 0.30557116749059787 +4492 6 6.35064173 0.35064172744750977 0.12294962102737372 +4493 6 5.660044 0.33995580673217773 0.11556995053092578 +4494 6 5.86190653 0.13809347152709961 0.019069806878405871 +4495 6 5.608976 0.39102411270141602 0.15289985671392969 +4496 6 5.86190653 0.13809347152709961 0.019069806878405871 +4497 5 5.241128 0.24112796783447266 0.05814269687198248 +4498 5 5.83831549 0.83831548690795898 0.70277285558972835 +4499 6 6.148644 0.14864397048950195 0.022095029962883928 +4500 6 5.876842 0.12315797805786133 0.015167887559300652 +4501 6 5.262086 0.73791408538818359 0.54451719741427951 +4502 6 6.126531 0.12653112411499023 0.016010125369803063 +4503 7 6.66133976 0.33866024017333984 0.11469075827426423 +4504 5 5.45453358 0.45453357696533203 0.20660077258889942 +4505 5 5.415779 0.41577911376953125 0.17287227144697681 +4506 6 6.422779 0.42277908325195313 0.17874215323536191 +4507 5 6.107822 1.1078219413757324 1.2272694537934967 +4508 4 6.141981 2.1419811248779297 4.588083139333321 +4509 5 5.24329853 0.24329853057861328 0.059194174981712422 +4510 6 6.556102 0.55610179901123047 0.30924921086352697 +4511 6 6.363239 0.36323881149291992 0.13194243417478901 +4512 6 6.363239 0.36323881149291992 0.13194243417478901 +4513 6 6.322394 0.32239389419555664 0.10393782301457577 +4514 5 5.04009628 0.040096282958984375 0.0016077119071269408 +4515 6 6.475341 0.47534084320068359 0.22594891721473687 +4516 6 6.45291376 0.45291376113891602 0.20513087502899907 +4517 6 5.81829929 0.18170070648193359 0.033015146736033785 +4518 6 5.56788 0.43211984634399414 0.18672756160435711 +4519 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4520 5 5.3585043 0.35850429534912109 0.12852532978376985 +4521 5 5.146292 0.14629220962524414 0.021401410597036374 +4522 6 5.56788 0.43211984634399414 0.18672756160435711 +4523 5 5.93566465 0.93566465377807617 0.87546834432964715 +4524 6 5.834097 0.16590309143066406 0.027523835746251279 +4525 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4526 6 6.196083 0.19608306884765625 0.038448569888714701 +4527 6 5.81829929 0.18170070648193359 0.033015146736033785 +4528 6 5.14050531 0.85949468612670898 0.73873111548004999 +4529 6 5.61537933 0.38462066650390625 0.14793305710190907 +4530 6 5.579626 0.42037391662597656 0.17671422977946349 +4531 6 5.579626 0.42037391662597656 0.17671422977946349 +4532 6 6.080338 0.080338001251220703 0.0064541944450411393 +4533 5 5.5772934 0.57729339599609375 0.33326766506070271 +4534 6 6.29704 0.29703998565673828 0.088232753078955284 +4535 6 5.61537933 0.38462066650390625 0.14793305710190907 +4536 6 5.55331945 0.44668054580688477 0.19952351000233648 +4537 5 5.09134531 0.091345310211181641 0.0083439656975770049 +4538 6 6.68299675 0.68299674987792969 0.46648456034381525 +4539 5 5.699331 0.69933080673217773 0.48906357724467853 +4540 6 6.555229 0.55522918701171875 0.30827945010969415 +4541 6 6.245467 0.24546718597412109 0.060254139390053751 +4542 5 5.73857737 0.73857736587524414 0.54549652538321425 +4543 5 5.73857737 0.73857736587524414 0.54549652538321425 +4544 6 6.555229 0.55522918701171875 0.30827945010969415 +4545 6 6.471859 0.47185897827148438 0.22265089537540916 +4546 6 6.549561 0.5495610237121582 0.30201731878355531 +4547 6 6.16732836 0.1673283576965332 0.027998779289418962 +4548 5 5.380732 0.38073205947875977 0.14495690111493786 +4549 5 5.73857737 0.73857736587524414 0.54549652538321425 +4550 6 5.989843 0.010157108306884766 0.00010316684915778751 +4551 6 6.09961939 0.099619388580322266 0.0099240225811172422 +4552 6 6.39423275 0.39423274993896484 0.15541946112443839 +4553 6 6.587703 0.58770322799682617 0.34539508419788945 +4554 6 6.245467 0.24546718597412109 0.060254139390053751 +4555 5 5.292268 0.29226779937744141 0.085420466552932339 +4556 5 6.446664 1.4466638565063477 2.0928363137218184 +4557 6 5.477523 0.52247714996337891 0.27298237223385513 +4558 6 6.34416676 0.34416675567626953 0.11845075571272901 +4559 7 6.019767 0.98023319244384766 0.96085711156865727 +4560 6 6.92705 0.92705011367797852 0.85942191327035289 +4561 6 5.979853 0.020146846771240234 0.00040589543482383306 +4562 7 6.10519552 0.89480447769165039 0.80067505329702726 +4563 7 6.56974125 0.43025875091552734 0.1851225927393898 +4564 7 6.18542957 0.81457042694091797 0.66352498044670938 +4565 5 5.39186049 0.3918604850769043 0.15355463976470674 +4566 5 6.22530937 1.2253093719482422 1.5013830569841957 +4567 5 5.39186049 0.3918604850769043 0.15355463976470674 +4568 6 6.126938 0.1269378662109375 0.016113221878185868 +4569 6 5.77645063 0.22354936599731445 0.049974319037801251 +4570 6 6.01089573 0.010895729064941406 0.00011871691185660893 +4571 7 6.57845736 0.42154264450073242 0.17769820113267087 +4572 7 6.440188 0.55981206893920898 0.31338955252999767 +4573 6 6.33240652 0.33240652084350586 0.1104940950992841 +4574 7 6.96231556 0.037684440612792969 0.0014201170642991201 +4575 7 6.81994772 0.18005228042602539 0.032418823686612086 +4576 5 5.687053 0.68705320358276367 0.4720421045533385 +4577 6 6.075848 0.075848102569580078 0.0057529346634055401 +4578 7 7.087625 0.087625026702880859 0.0076781453046805836 +4579 6 6.26486158 0.2648615837097168 0.070151658525219318 +4580 6 6.45493841 0.45493841171264648 0.20696895845162544 +4581 6 6.339595 0.33959484100341797 0.11532465603613673 +4582 6 5.93023872 0.069761276245117188 0.0048666356633475516 +4583 6 5.75422573 0.24577426910400391 0.060404991353607329 +4584 6 5.89385653 0.10614347457885742 0.011266437195672552 +4585 6 6.566305 0.56630516052246094 0.32070153483437025 +4586 6 6.36007071 0.36007070541381836 0.12965091289720476 +4587 6 6.20307446 0.20307445526123047 0.041239234379645495 +4588 5 6.22775126 1.2277512550354004 1.5073731442410008 +4589 6 6.36007071 0.36007070541381836 0.12965091289720476 +4590 6 6.091628 0.091628074645996094 0.0083957040633322322 +4591 6 5.70858669 0.29141330718994141 0.084921715607379156 +4592 6 6.59907055 0.59907054901123047 0.35888552269261709 +4593 6 6.13447571 0.1344757080078125 0.018083716044202447 +4594 6 6.775327 0.77532720565795898 0.60113227583337903 +4595 6 6.27347231 0.27347230911254883 0.074787103851349457 +4596 6 6.20077658 0.20077657699584961 0.040311233870170327 +4597 6 5.56596 0.43404006958007813 0.18839078200107906 +4598 6 6.13447571 0.1344757080078125 0.018083716044202447 +4599 7 6.42611027 0.57388973236083984 0.32934942490919639 +4600 6 5.52788544 0.47211456298828125 0.22289216058561578 +4601 6 6.18567228 0.18567228317260742 0.034474196738528917 +4602 6 6.04761934 0.047619342803955078 0.0022676018090805883 +4603 6 6.05319738 0.053197383880615234 0.0028299616517415416 +4604 6 6.329858 0.32985782623291016 0.10880618552710075 +4605 6 6.70813274 0.70813274383544922 0.50145198289192194 +4606 5 5.980174 0.98017406463623047 0.9607411969855093 +4607 6 6.19283 0.19283008575439453 0.037183441972047149 +4608 7 6.80754328 0.19245672225952148 0.037039589942878592 +4609 4 4.05158043 0.051580429077148438 0.00266054066378274 +4610 6 5.67133236 0.32866764068603516 0.10802241803412471 +4611 5 6.17913532 1.1791353225708008 1.3903601089341464 +4612 5 5.19891071 0.19891071319580078 0.039565471824062115 +4613 5 5.439533 0.43953323364257813 0.19318946347630117 +4614 5 4.95613146 0.043868541717529297 0.0019244489524226083 +4615 7 6.635701 0.36429882049560547 0.13271363061448938 +4616 5 5.638706 0.63870620727539063 0.40794561921211425 +4617 7 7.10083961 0.10083961486816406 0.010168627926759655 +4618 7 6.635701 0.36429882049560547 0.13271363061448938 +4619 5 4.67914963 0.32085037231445313 0.10294496141432319 +4620 6 6.132133 0.13213300704956055 0.017459131551959217 +4621 7 5.89214468 1.1078553199768066 1.2273434100009126 +4622 7 7.09829 0.098289966583251953 0.0096609175309367856 +4623 6 6.41415739 0.41415739059448242 0.17152634418403068 +4624 6 6.581927 0.58192682266235352 0.33863882693390224 +4625 5 5.071765 0.071764945983886719 0.0051502074720701785 +4626 6 5.950599 0.049400806427001953 0.0024404396756381175 +4627 6 6.050242 0.050241947174072266 0.0025242532558422681 +4628 6 6.050242 0.050241947174072266 0.0025242532558422681 +4629 7 6.102637 0.89736318588256836 0.80526068737731293 +4630 7 6.395737 0.6042628288269043 0.36513356630189264 +4631 7 6.45820141 0.54179859161376953 0.29354571387466422 +4632 6 5.950599 0.049400806427001953 0.0024404396756381175 +4633 6 5.82988358 0.17011642456054688 0.028939597905264236 +4634 6 6.556143 0.55614280700683594 0.30929482178544276 +4635 6 5.80749941 0.19250059127807617 0.037056477642408936 +4636 5 5.358758 0.35875797271728516 0.12870728298821632 +4637 6 6.21625137 0.21625137329101563 0.046764656450250186 +4638 5 5.358758 0.35875797271728516 0.12870728298821632 +4639 6 5.71351528 0.28648471832275391 0.082073493832467648 +4640 6 6.21625137 0.21625137329101563 0.046764656450250186 +4641 6 6.377533 0.377532958984375 0.14253113511949778 +4642 7 6.56437159 0.43562841415405273 0.18977211521837489 +4643 6 5.68015242 0.31984758377075195 0.10230247684398819 +4644 6 6.467866 0.46786594390869141 0.21889854146957077 +4645 7 7.116684 0.1166839599609375 0.013615146512165666 +4646 7 6.183157 0.81684303283691406 0.66723254029420787 +4647 7 6.245689 0.75431108474731445 0.56898521257267021 +4648 5 4.80332327 0.19667673110961914 0.038681736559965429 +4649 5 4.89571047 0.10428953170776367 0.010876306423824644 +4650 5 4.89571047 0.10428953170776367 0.010876306423824644 +4651 7 7.10383368 0.10383367538452148 0.010781432143858183 +4652 5 5.10172224 0.10172224044799805 0.01034741420176033 +4653 7 6.79083633 0.20916366577148438 0.043749439078965224 +4654 7 6.693703 0.30629682540893555 0.093817745255591944 +4655 7 6.693703 0.30629682540893555 0.093817745255591944 +4656 7 6.693703 0.30629682540893555 0.093817745255591944 +4657 7 6.65744543 0.34255456924438477 0.117343632910206 +4658 6 6.77934265 0.7793426513671875 0.60737496824003756 +4659 6 5.98162174 0.018378257751464844 0.00033776035797927761 +4660 6 6.34407759 0.34407758712768555 0.11838938596361004 +4661 5 5.58429432 0.58429431915283203 0.34139985139427154 +4662 6 6.614982 0.61498212814331055 0.37820301793567523 +4663 7 6.454456 0.54554414749145508 0.29761841686217849 +4664 7 6.54663849 0.45336151123046875 0.20553665986517444 +4665 6 6.614982 0.61498212814331055 0.37820301793567523 +4666 5 5.25093174 0.25093173980712891 0.062966738042632642 +4667 7 6.54663849 0.45336151123046875 0.20553665986517444 +4668 7 6.454456 0.54554414749145508 0.29761841686217849 +4669 5 5.71813965 0.7181396484375 0.5157245546579361 +4670 6 5.54932833 0.45067167282104492 0.20310495668331896 +4671 5 5.31061268 0.31061267852783203 0.096480236062234326 +4672 5 5.31061268 0.31061267852783203 0.096480236062234326 +4673 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4674 7 6.654536 0.34546422958374023 0.11934553392188718 +4675 6 6.129326 0.12932586669921875 0.016725179797504097 +4676 6 5.83601332 0.1639866828918457 0.02689163216587076 +4677 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4678 6 5.54932833 0.45067167282104492 0.20310495668331896 +4679 5 5.23454332 0.2345433235168457 0.055010570606327747 +4680 4 4.39819431 0.39819431304931641 0.15855871094481699 +4681 6 6.39631176 0.39631175994873047 0.15706301107366016 +4682 6 5.88950825 0.11049175262451172 0.012208427398036292 +4683 6 6.26491642 0.26491641998291016 0.07018070957656164 +4684 6 6.181033 0.18103313446044922 0.032772995772575086 +4685 5 5.48171139 0.48171138763427734 0.23204586097654101 +4686 4 4.39819431 0.39819431304931641 0.15855871094481699 +4687 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4688 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4689 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4690 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4691 7 6.166903 0.83309698104858398 0.6940505798322647 +4692 5 5.380849 0.38084888458251953 0.14504587288774928 +4693 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4694 7 6.166903 0.83309698104858398 0.6940505798322647 +4695 7 6.8444066 0.1555933952331543 0.024209304640180562 +4696 6 6.423567 0.42356681823730469 0.17940884951167391 +4697 7 6.8444066 0.1555933952331543 0.024209304640180562 +4698 6 5.525318 0.47468185424804688 0.22532286275236402 +4699 5 5.677266 0.67726612091064453 0.45868939853335178 +4700 5 5.677266 0.67726612091064453 0.45868939853335178 +4701 6 5.37392664 0.62607336044311523 0.39196785265653489 +4702 6 5.37392664 0.62607336044311523 0.39196785265653489 +4703 7 6.718226 0.28177404403686523 0.079396611892889268 +4704 6 5.235369 0.76463079452514648 0.58466025193615678 +4705 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4706 7 6.586311 0.41368913650512695 0.17113870166235756 +4707 6 5.868769 0.13123083114624023 0.017221531043333016 +4708 6 6.131867 0.1318669319152832 0.017388887732749936 +4709 6 6.52721071 0.52721071243286133 0.2779511353039652 +4710 7 6.806604 0.19339609146118164 0.037402048192461734 +4711 6 5.868769 0.13123083114624023 0.017221531043333016 +4712 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4713 6 6.289812 0.28981208801269531 0.083991046358278254 +4714 7 6.586311 0.41368913650512695 0.17113870166235756 +4715 6 5.7559824 0.24401760101318359 0.059544589604229259 +4716 6 5.51584244 0.48415756225585938 0.23440854508953635 +4717 6 5.624865 0.37513494491577148 0.14072622689695891 +4718 6 5.660127 0.33987283706665039 0.11551354537573388 +4719 6 5.7559824 0.24401760101318359 0.059544589604229259 +4720 5 5.97237635 0.97237634658813477 0.94551575940408839 +4721 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4722 6 5.706852 0.29314804077148438 0.085935773808159865 +4723 6 5.241431 0.75856876373291016 0.57542656931127567 +4724 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4725 6 5.98745346 0.012546539306640625 0.00015741564857307822 +4726 6 6.88603258 0.8860325813293457 0.78505373517714361 +4727 6 5.706852 0.29314804077148438 0.085935773808159865 +4728 6 6.177205 0.17720508575439453 0.03140164241722232 +4729 5 4.73050737 0.26949262619018555 0.072626275570883081 +4730 5 5.814275 0.81427478790283203 0.66304343021420209 +4731 6 6.402927 0.40292692184448242 0.16235010434706965 +4732 6 6.402927 0.40292692184448242 0.16235010434706965 +4733 6 5.71249247 0.28750753402709961 0.08266058212234384 +4734 6 6.274084 0.27408409118652344 0.075122089041542495 +4735 6 6.13222742 0.13222742080688477 0.017484090813240982 +4736 6 6.10331869 0.10331869125366211 0.010674751962369555 +4737 7 6.892216 0.10778379440307617 0.011617346335924594 +4738 6 6.553041 0.55304098129272461 0.30585432698921977 +4739 6 6.274084 0.27408409118652344 0.075122089041542495 +4740 5 5.089445 0.089445114135742188 0.0080004284427559469 +4741 6 6.25626755 0.25626754760742188 0.065673055956722237 +4742 6 6.11390924 0.11390924453735352 0.012975315991070602 +4743 5 5.83421659 0.83421659469604492 0.69591732686626528 +4744 5 5.35093 0.35093021392822266 0.12315201504770812 +4745 3 3.82722521 0.8272252082824707 0.68430154521797704 +4746 6 5.70762 0.29237985610961914 0.085485980258681593 +4747 6 6.29134369 0.29134368896484375 0.084881145099643618 +4748 5 5.34712839 0.34712839126586914 0.12049812002283034 +4749 6 5.35289049 0.6471095085144043 0.41875071600975389 +4750 5 5.83421659 0.83421659469604492 0.69591732686626528 +4751 6 5.51917839 0.48082160949707031 0.23118942015935318 +4752 7 6.60790968 0.3920903205871582 0.1537348194981405 +4753 6 6.60107851 0.60107851028442383 0.3612953755257422 +4754 6 6.02144527 0.021445274353027344 0.00045989979207661236 +4755 6 6.168067 0.16806697845458984 0.028246509246855567 +4756 7 6.81629038 0.18370962142944336 0.033749225005749395 +4757 7 6.81629038 0.18370962142944336 0.033749225005749395 +4758 6 6.5071764 0.50717639923095703 0.25722789993687911 +4759 6 5.8558073 0.14419269561767578 0.020791533469491696 +4760 6 5.8558073 0.14419269561767578 0.020791533469491696 +4761 6 6.42398167 0.42398166656494141 0.17976045358318515 +4762 7 6.319236 0.68076419830322266 0.46343989369142946 +4763 7 6.73848772 0.26151227951049805 0.068388672334776857 +4764 6 6.180128 0.18012809753417969 0.03244613152128295 +4765 8 7.674349 0.32565116882324219 0.10604868375594378 +4766 8 6.59993362 1.4000663757324219 1.9601858564565191 +4767 7 5.88190556 1.1180944442749023 1.2501351863184027 +4768 6 5.5695467 0.43045330047607422 0.18529004389074544 +4769 6 5.5695467 0.43045330047607422 0.18529004389074544 +4770 6 5.5695467 0.43045330047607422 0.18529004389074544 +4771 6 5.5695467 0.43045330047607422 0.18529004389074544 +4772 5 5.31793 0.31793022155761719 0.10107962577967555 +4773 7 6.28737259 0.71262741088867188 0.50783782674989197 +4774 4 4.94949675 0.94949674606323242 0.90154407078466647 +4775 6 5.788814 0.21118593215942383 0.044599497942044763 +4776 6 5.586607 0.41339302062988281 0.17089378950549872 +4777 6 6.67964554 0.67964553833007813 0.46191805777198169 +4778 6 5.625838 0.37416219711303711 0.13999734974845524 +4779 4 4.226809 0.22680902481079102 0.051442333735622015 +4780 5 5.251493 0.25149297714233398 0.063248717551914524 +4781 5 5.251493 0.25149297714233398 0.063248717551914524 +4782 6 5.6815567 0.31844329833984375 0.10140613425755873 +4783 6 5.6815567 0.31844329833984375 0.10140613425755873 +4784 5 5.534597 0.53459692001342773 0.28579386688784325 +4785 7 6.31295729 0.6870427131652832 0.47202768971351361 +4786 8 7.52037668 0.47962331771850586 0.23003852689930682 +4787 8 7.461737 0.53826284408569336 0.28972688932321944 +4788 5 5.534597 0.53459692001342773 0.28579386688784325 +4789 6 6.130587 0.13058710098266602 0.017052990943057011 +4790 6 6.33779 0.33779001235961914 0.11410209244991165 +4791 6 5.6815567 0.31844329833984375 0.10140613425755873 +4792 6 6.60871 0.60870981216430664 0.37052763542510547 +4793 6 5.391595 0.60840511322021484 0.37015678179250244 +4794 5 5.349109 0.34910917282104492 0.12187721454779421 +4795 7 6.60348368 0.39651632308959961 0.15722519447649574 +4796 7 6.60348368 0.39651632308959961 0.15722519447649574 +4797 6 6.444803 0.44480323791503906 0.19784992045970284 +4798 5 5.5460577 0.54605770111083984 0.2981790129424553 +4799 6 5.86040545 0.13959455490112305 0.019486639758042656 +4800 7 6.06000948 0.93999052047729492 0.8835821785871758 +4801 7 6.60348368 0.39651632308959961 0.15722519447649574 +4802 8 7.498994 0.50100612640380859 0.25100713869414903 +4803 7 6.657819 0.34218120574951172 0.11708797756818967 +4804 4 4.9147253 0.91472530364990234 0.83672238113740605 +4805 6 5.73073435 0.26926565170288086 0.072503991186977146 +4806 6 5.533971 0.46602916717529297 0.21718318465809716 +4807 6 6.277921 0.27792119979858398 0.077240193297484439 +4808 5 5.31803656 0.31803655624389648 0.10114725110747713 +4809 6 5.920948 0.079051971435546875 0.0062492141878465191 +4810 5 5.394947 0.39494705200195313 0.15598317388503347 +4811 6 6.31708336 0.31708335876464844 0.10054185640547075 +4812 7 6.53195238 0.4680476188659668 0.21906857352610132 +4813 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4814 6 6.193335 0.19333505630493164 0.037378443996431088 +4815 7 6.322362 0.67763805389404297 0.45919333208530588 +4816 6 5.68325233 0.31674766540527344 0.10032908353969106 +4817 6 6.478207 0.47820711135864258 0.22868204135397718 +4818 6 6.483267 0.48326683044433594 0.23354682940771454 +4819 6 6.193335 0.19333505630493164 0.037378443996431088 +4820 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4821 6 5.80547857 0.19452142715454102 0.037838585622239407 +4822 6 6.046786 0.046785831451416016 0.002188914024600308 +4823 7 6.37059 0.6294097900390625 0.39615668379701674 +4824 5 5.61957836 0.61957836151123047 0.38387734605294099 +4825 6 6.193167 0.19316720962524414 0.037313570874403013 +4826 6 6.193167 0.19316720962524414 0.037313570874403013 +4827 6 6.30881929 0.30881929397583008 0.09536935633173016 +4828 5 5.61957836 0.61957836151123047 0.38387734605294099 +4829 7 6.587614 0.41238594055175781 0.17006216396475793 +4830 6 5.902513 0.097486972808837891 0.0095037098674310982 +4831 6 5.267164 0.73283576965332031 0.53704826528337435 +4832 5 5.476546 0.47654581069946289 0.22709590969520832 +4833 6 6.285742 0.28574180603027344 0.081648379713442409 +4834 7 6.76315069 0.23684930801391602 0.056097594706670861 +4835 6 6.45354271 0.45354270935058594 0.20570098920507007 +4836 5 5.27756 0.27756023406982422 0.077039683536895609 +4837 6 6.6851635 0.68516349792480469 0.46944901888855384 +4838 6 6.40559673 0.40559673309326172 0.16450870989592659 +4839 4 4.615171 0.61517095565795898 0.37843530468512654 +4840 7 6.953846 0.046154022216796875 0.0021301937667885795 +4841 6 6.42197466 0.42197465896606445 0.1780626128095264 +4842 6 5.909714 0.090285778045654297 0.0081515217173091514 +4843 5 5.849253 0.84925317764282227 0.72123095973643103 +4844 6 5.93484 0.065159797668457031 0.0042457992321942584 +4845 5 5.007286 0.00728607177734375 5.3086841944605112E-05 +4846 6 6.584194 0.58419418334960938 0.34128284385951702 +4847 7 6.47132969 0.52867031097412109 0.2794922977054739 +4848 6 6.12405062 0.12405061721801758 0.015388555632171119 +4849 5 5.252341 0.25234079360961914 0.063675876119532404 +4850 6 6.12405062 0.12405061721801758 0.015388555632171119 +4851 5 5.252341 0.25234079360961914 0.063675876119532404 +4852 5 5.93845654 0.93845653533935547 0.88070066872114694 +4853 5 5.962768 0.9627680778503418 0.9269223717276418 +4854 6 6.64682436 0.64682435989379883 0.41838175255202259 +4855 6 5.811765 0.18823480606079102 0.035432342212743606 +4856 6 5.811765 0.18823480606079102 0.035432342212743606 +4857 6 5.96738768 0.032612323760986328 0.0010635636610913934 +4858 5 5.23224735 0.23224735260009766 0.053938832789754088 +4859 6 6.204521 0.20452117919921875 0.041828912741038948 +4860 6 5.651828 0.34817218780517578 0.1212238723610426 +4861 6 6.31806231 0.31806230545043945 0.10116363014844865 +4862 6 6.010396 0.010396003723144531 0.00010807689341163496 +4863 7 6.99840736 0.0015926361083984375 2.5364897737745196E-06 +4864 5 5.177444 0.1774439811706543 0.031486366453691517 +4865 6 6.59354162 0.59354162216186523 0.35229165723853839 +4866 6 6.05234241 0.052342414855957031 0.0027397283929531113 +4867 6 5.65121841 0.34878158569335938 0.12164859451877419 +4868 6 6.40162659 0.4016265869140625 0.161303915316239 +4869 6 5.28494453 0.71505546569824219 0.51130431902493001 +4870 7 6.390793 0.6092071533203125 0.37113335565663874 +4871 6 6.365685 0.36568498611450195 0.13372550906956349 +4872 5 5.51866674 0.51866674423217773 0.26901519157240728 +4873 6 6.25817537 0.25817537307739258 0.066654523263650844 +4874 6 5.92614746 0.0738525390625 0.0054541975259780884 +4875 6 5.56610727 0.43389272689819336 0.18826289845515021 +4876 7 6.79692745 0.20307254791259766 0.041238459715714271 +4877 5 4.49993134 0.50006866455078125 0.25006866926560178 +4878 4 4.44558573 0.44558572769165039 0.19854664072249761 +4879 6 5.391604 0.60839605331420898 0.37014575768830582 +4880 6 5.391604 0.60839605331420898 0.37014575768830582 +4881 6 6.151292 0.15129184722900391 0.022889223037964257 +4882 5 5.638549 0.63854885101318359 0.40774463513025694 +4883 6 5.91789675 0.082103252410888672 0.0067409440564460965 +4884 5 5.34791565 0.3479156494140625 0.12104529910720885 +4885 6 5.391604 0.60839605331420898 0.37014575768830582 +4886 7 7.167016 0.16701602935791016 0.027894354062482307 +4887 7 6.50685453 0.49314546585083008 0.24319245048923221 +4888 5 5.990843 0.99084281921386719 0.98176949238768429 +4889 6 6.151292 0.15129184722900391 0.022889223037964257 +4890 6 6.509506 0.5095062255859375 0.25959659391082823 +4891 6 5.611698 0.38830184936523438 0.15077832622046117 +4892 5 5.985514 0.98551416397094727 0.97123816738735513 +4893 6 6.2242403 0.22424030303955078 0.050283713507269567 +4894 5 5.458216 0.45821619033813477 0.20996207708799375 +4895 6 5.30194473 0.69805526733398438 0.48728115625272039 +4896 7 6.68631124 0.31368875503540039 0.098400635035659434 +4897 6 6.04107332 0.041073322296142578 0.001687017804442803 diff --git a/test/BaselineOutput/SingleRelease/Command/CommandCrossValidationKeyLabelWithFloatKeyValues-out.txt b/test/BaselineOutput/SingleRelease/Command/CommandCrossValidationKeyLabelWithFloatKeyValues-out.txt new file mode 100644 index 0000000000..3608e165c9 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/Command/CommandCrossValidationKeyLabelWithFloatKeyValues-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=FastRankRanking{t=1} strat=Strat threads=- norm=Warn prexf=rangefilter{col=Label min=20 max=25} prexf=term{col=Strat:Label} dout=%Output% loader=text{col=Features:R4:10-14 col=Label:R4:9 col=GroupId:TX:1 header+} data=%Data% out=%Output% xf=term{col=Label} xf=hash{col=GroupId} +Not adding a normalizer. +Making per-feature arrays +Changing data from row-wise to column-wise +Processed 40 instances +Binning and forming Feature objects +Reserved memory for tree learner: 10764 bytes +Starting to train ... +Not training a calibrator because it is not needed. +Not adding a normalizer. +Making per-feature arrays +Changing data from row-wise to column-wise +Processed 32 instances +Binning and forming Feature objects +Reserved memory for tree learner: 6396 bytes +Starting to train ... +Not training a calibrator because it is not needed. +NDCG@1: 0.000000 +NDCG@2: 0.000000 +NDCG@3: 0.000000 +DCG@1: 0.000000 +DCG@2: 0.000000 +DCG@3: 0.000000 +NDCG@1: 0.000000 +NDCG@2: 0.000000 +NDCG@3: 0.000000 +DCG@1: 0.000000 +DCG@2: 0.000000 +DCG@3: 0.000000 + +OVERALL RESULTS +--------------------------------------- +NDCG@1: 0.000000 (0.0000) +NDCG@2: 0.000000 (0.0000) +NDCG@3: 0.000000 (0.0000) +DCG@1: 0.000000 (0.0000) +DCG@2: 0.000000 (0.0000) +DCG@3: 0.000000 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + diff --git a/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-out.txt b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-out.txt new file mode 100644 index 0000000000..d05c1b0b1c --- /dev/null +++ b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-out.txt @@ -0,0 +1,77 @@ +maml.exe CV tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures threads=- norm=No dout=%Output% data=%Data% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} +Not adding a normalizer. +Warning: Skipped 8 examples with bad label/weight/features in training set +Not training a calibrator because it is not needed. +Not adding a normalizer. +Warning: Skipped 8 examples with bad label/weight/features in training set +Not training a calibrator because it is not needed. +Warning: The predictor produced non-finite prediction values on 8 instances during testing. Possible causes: abnormal data or the predictor is numerically unstable. +TEST POSITIVE RATIO: 0.3785 (134.0/(134.0+220.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 122 | 12 | 0.9104 + negative || 4 | 216 | 0.9818 + ||====================== +Precision || 0.9683 | 0.9474 | +OVERALL 0/1 ACCURACY: 0.954802 +LOG LOSS/instance: 0.259660 +Test-set entropy (prior Log-Loss/instance): 0.956998 +LOG-LOSS REDUCTION (RIG): 72.867233 +AUC: 0.984973 +Warning: The predictor produced non-finite prediction values on 8 instances during testing. Possible causes: abnormal data or the predictor is numerically unstable. +TEST POSITIVE RATIO: 0.3191 (105.0/(105.0+224.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 92 | 13 | 0.8762 + negative || 2 | 222 | 0.9911 + ||====================== +Precision || 0.9787 | 0.9447 | +OVERALL 0/1 ACCURACY: 0.954407 +LOG LOSS/instance: 0.260480 +Test-set entropy (prior Log-Loss/instance): 0.903454 +LOG-LOSS REDUCTION (RIG): 71.168362 +AUC: 0.967049 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.976011 (0.0090) +Accuracy: 0.954605 (0.0002) +Positive precision: 0.973489 (0.0052) +Positive recall: 0.893319 (0.0171) +Negative precision: 0.946025 (0.0013) +Negative recall: 0.986445 (0.0046) +Log-loss: 0.260070 (0.0004) +Log-loss reduction: 72.017798 (0.8494) +F1 Score: 0.931542 (0.0069) +AUPRC: 0.974115 (0.0054) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Normalize' started. +[1] (%Time%) 337 examples +[1] 'Normalize' finished in %Time%. +[2] 'Training' started. +[2] (%Time%) 1 iterations, 329 examples Training-loss: 0.371414389819699 +[2] (%Time%) 2 iterations, 329 examples Training-loss: 0.225137821503565 +[2] (%Time%) 3 iterations, 329 examples Training-loss: 0.197323119398265 +[2] (%Time%) 4 iterations, 329 examples Training-loss: 0.183649426646222 +[2] (%Time%) 5 iterations, 329 examples Training-loss: 0.174400635825405 +[2] 'Training' finished in %Time%. +[3] 'Normalize #2' started. +[3] (%Time%) 362 examples +[3] 'Normalize #2' finished in %Time%. +[4] 'Training #2' started. +[4] (%Time%) 1 iterations, 354 examples Training-loss: 0.35872800705401 +[4] (%Time%) 2 iterations, 354 examples Training-loss: 0.239609312114266 +[4] (%Time%) 3 iterations, 354 examples Training-loss: 0.210775498912242 +[4] (%Time%) 4 iterations, 354 examples Training-loss: 0.19625903089058 +[4] (%Time%) 5 iterations, 354 examples Training-loss: 0.187121580244397 +[4] 'Training #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-rp.txt b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-rp.txt new file mode 100644 index 0000000000..b826c5ae0d --- /dev/null +++ b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer-rp.txt @@ -0,0 +1,4 @@ +FieldAwareFactorizationMachine +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /d /norm /shuf Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.976011 0.954605 0.973489 0.893319 0.946025 0.986445 0.26007 72.0178 0.931542 0.974115 5 - - FieldAwareFactorizationMachine %Data% %Output% 99 0 0 maml.exe CV tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures threads=- norm=No dout=%Output% data=%Data% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} /d:5;/norm:-;/shuf:- + diff --git a/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer.txt b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer.txt new file mode 100644 index 0000000000..c1977a346f --- /dev/null +++ b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-CV-breast-cancer.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +5 1 14.8638926 0.999999642 5.1594804484713121E-07 1 +6 0 -0.8998656 0.289078116 0.49223705031518167 0 +8 0 -2.48059678 0.0772296637 0.11595646754997578 0 +9 0 -2.373167 0.08524186 0.12853774899383463 0 +10 0 -1.8267622 0.138624445 0.2152857123445632 0 +11 0 -2.03787947 0.115282834 0.17671177846463382 0 +18 1 5.347374 0.9952619 0.0068518676812505449 1 +20 1 2.93836784 0.949710846 0.074439765251190851 1 +21 1 4.537781 0.989416063 0.015350773539417332 1 +25 1 0.214011192 0.5532995 0.85386750966876357 1 +28 0 -2.03787947 0.115282834 0.17671177846463382 0 +31 0 -2.22085452 0.09789331 0.14863003134088387 0 +32 1 2.94516468 0.9500345 0.073948191048563552 1 +35 0 -2.03787947 0.115282834 0.17671177846463382 0 +37 0 -3.201078 0.039125178 0.057579598806254788 0 +40 0 +41 1 -1.51869583 0.179653645 2.476709891872058 0 +44 1 6.41933727 0.9983729 0.0023493029812132662 1 +45 0 -2.01876 0.117247269 0.17991871486127162 0 +46 1 5.507395 0.9959597 0.005840729107190099 1 +48 0 -2.64206457 0.0664797947 0.099246846085645518 0 +50 1 -0.7729988 0.315830767 1.6627763744194746 0 +51 1 -1.07958174 0.2535852 1.9794576062795608 0 +52 1 1.92737579 0.87295866 0.196014759754012 1 +54 1 2.360999 0.9138046 0.13004240462108896 1 +56 1 6.64605141 0.9987025 0.0018730745676176913 1 +60 1 0.586817265 0.6426345 0.6379296358599772 1 +63 1 -1.3297224 0.209205285 2.2570087990606815 0 +64 0 -1.85676885 0.135080114 0.20936158691636991 0 +66 0 -2.56239128 0.0715984255 0.10717912551116054 0 +68 1 6.963379 0.999054968 0.0013640370953882713 1 +69 0 -2.07254 0.111794561 0.1710346893319066 0 +70 0 -2.4900763 0.0765568 0.11490487237984263 0 +71 1 2.84816265 0.94522357 0.081272490426858024 1 +72 0 -2.398419 0.08329334 0.12546794171530753 0 +73 1 7.05520535 0.999137759 0.0012444871146033098 1 +74 1 -1.02989769 0.263103932 1.926295284848996 0 +76 0 -1.87518346 0.1329431 0.20580141213002087 0 +77 0 -2.51152325 0.0750542954 0.11255941460668487 0 +79 0 -2.256354 0.09480278 0.14369594410546618 0 +82 0 -2.68407941 0.06391936 0.095295273554898599 0 +88 0 -2.56239128 0.0715984255 0.10717912551116054 0 +90 0 -2.04771137 0.114283845 0.17508366149751475 0 +91 0 -2.108456 0.108277671 0.16533355177618697 0 +92 0 -2.56239128 0.0715984255 0.10717912551116054 0 +93 0 -1.85676885 0.135080114 0.20936158691636991 0 +95 0 -2.04771137 0.114283845 0.17508366149751475 0 +96 0 -1.93042636 0.1267034 0.19545636564796123 0 +97 0 -2.730785 0.0611810647 0.091081154608133083 0 +98 1 5.869131 0.9971826 0.0040703745878533431 1 +99 1 9.67402649 0.999937057 9.0809697580461105E-05 1 +100 1 0.9169636 0.714423 0.48514956618634053 1 +102 0 -2.528028 0.0739165246 0.11078585383424393 0 +104 1 9.67022 0.9999368 9.1153684574596215E-05 1 +105 1 -1.82901669 0.138355449 2.8535486322723087 0 +106 1 9.469551 0.9999229 0.00011127706647502522 1 +108 0 -1.91807806 0.128076032 0.1977257574643819 0 +109 1 4.250736 0.9859466 0.020418590525940875 1 +111 1 1.28113461 0.782642841 0.35357401033762303 1 +112 1 3.845829 0.9790785 0.030503600596017547 1 +113 1 7.44737339 0.9994174 0.00084072413131743907 1 +115 0 -1.45452547 0.18930608 0.30277077223301041 0 +117 1 6.50040436 0.9984994 0.00216654358065164 1 +120 0 -2.10977483 0.108150378 0.16512762206914725 0 +121 0 -2.40890312 0.0824963 0.12421411952463637 0 +122 1 9.287441 0.9999074 0.0001336367089073252 1 +123 1 0.991513252 0.7293867 0.45524422695477623 1 +125 0 -1.85676885 0.135080114 0.20936158691636991 0 +128 1 2.86968613 0.946327448 0.079588624104640571 1 +129 0 -3.50972271 0.0290368516 0.042511553752884852 0 +131 0 -2.22085452 0.09789331 0.14863003134088387 0 +132 1 10.8694086 0.9999809 2.7517486566085523E-05 1 +133 0 -2.231102 0.09699208 0.1471894583221901 0 +137 0 -2.03968573 0.115098737 0.17641160645683859 0 +138 0 -2.37357259 0.08521025 0.12848789225109375 0 +141 0 -1.85219073 0.135615885 0.21025553563894767 0 +144 0 -2.03787947 0.115282834 0.17671177846463382 0 +145 0 +147 0 -2.03505254 0.115571469 0.17718252883609134 0 +150 0 -1.8267622 0.138624445 0.2152857123445632 0 +151 1 0.872104645 0.7051834 0.50392960783522212 1 +152 1 9.204662 0.9998994 0.00014516065994930907 1 +154 0 -1.66311264 0.1593446 0.25041355795755704 0 +156 0 -1.869329 0.133619383 0.20692712807027863 0 +161 0 -2.555451 0.0720611438 0.10789834857071755 0 +164 0 +167 1 3.16309261 0.9594215 0.059763301891325865 1 +169 0 -1.52618456 0.178552613 0.28375991953883767 0 +171 0 -2.04771137 0.114283845 0.17508366149751475 0 +173 1 19.4496174 1 0 1 +174 1 3.02353477 0.9536261 0.068504378788065867 1 +176 0 -2.22085452 0.09789331 0.14863003134088387 0 +177 1 4.302659 0.986648142 0.01939241122666641 1 +179 1 9.584427E-05 0.500023961 0.9999308646308972 1 +180 0 -1.8267622 0.138624445 0.2152857123445632 0 +181 0 -1.66311264 0.1593446 0.25041355795755704 0 +183 1 10.4648762 0.9999715 4.1104439112694392E-05 1 +187 1 10.78104 0.999979258 2.9925291612631146E-05 1 +188 1 8.408628 0.999777138 0.00032155739854406422 1 +189 0 -2.01109338 0.11804311 0.18121995585967673 0 +191 1 12.5877247 0.999996543 4.987505496102727E-06 1 +192 0 -2.57171249 0.0709812939 0.10622044886941406 0 +196 0 3.01742458 0.953355134 4.4221378767752633 1 +198 0 -1.66311264 0.1593446 0.25041355795755704 0 +199 0 -2.21740723 0.0981981754 0.14911766597757717 0 +201 1 6.942314 0.9990349 0.001393043875711089 1 +202 0 -2.04771137 0.114283845 0.17508366149751475 0 +204 0 -2.04771137 0.114283845 0.17508366149751475 0 +205 1 16.2102318 0.9999999 1.7198266111377426E-07 1 +206 1 4.939949 0.9928959 0.010285626570319192 1 +207 0 -1.8267622 0.138624445 0.2152857123445632 0 +209 0 -2.537307 0.07328385 0.109800582737096 0 +210 1 18.7023277 1 0 1 +211 1 10.281146 0.999965668 4.9531853723975585E-05 1 +212 0 -2.04771137 0.114283845 0.17508366149751475 0 +216 0 -1.85676885 0.135080114 0.20936158691636991 0 +218 1 7.263891 0.9993001 0.0010100636449898702 1 +219 0 -2.76439142 0.059279006 0.088161193635133334 0 +223 1 2.7308712 0.9388239 0.091073557949706299 1 +226 1 8.248712 0.9997385 0.00037729327519243937 1 +228 0 -1.8267622 0.138624445 0.2152857123445632 0 +233 1 2.361946 0.913879156 0.12992468715671707 1 +237 1 4.39291763 0.9877864 0.01772897141308883 1 +239 1 1.52190113 0.820818245 0.28486529489841783 1 +240 0 -2.17585921 0.10193938 0.15511526353124511 0 +241 0 -2.29227257 0.09176497 0.13886241586083783 0 +242 0 -2.22085452 0.09789331 0.14863003134088387 0 +244 0 -2.04771137 0.114283845 0.17508366149751475 0 +246 1 14.4728222 0.9999995 6.8793076746672365E-07 1 +247 1 0.83739996 0.697917342 0.51887191386761078 1 +248 0 -2.44329524 0.0799302459 0.12018485315955793 0 +249 0 +250 0 -1.70150161 0.154269248 0.24172965723606502 0 +252 0 1.9876461 0.879493833 3.0528211105339298 1 +254 1 6.02062225 0.9975777 0.0034988407610739244 1 +257 0 -2.21740723 0.0981981754 0.14911766597757717 0 +258 0 -2.39241457 0.08375295 0.12619145057643072 0 +259 0 2.59828758 0.930751264 3.8520684539295051 1 +260 1 6.64796829 0.998705 0.001869458244391086 1 +262 1 10.2717314 0.9999654 4.9875830876224796E-05 1 +267 1 0.8395891 0.6983786 0.51791869634276033 1 +268 1 4.901437 0.992619 0.010688056896805 1 +269 0 -2.04771137 0.114283845 0.17508366149751475 0 +271 0 -2.730785 0.0611810647 0.091081154608133083 0 +272 1 0.8395891 0.6983786 0.51791869634276033 1 +275 0 +276 0 -2.21740723 0.0981981754 0.14911766597757717 0 +277 0 -1.85676885 0.135080114 0.20936158691636991 0 +278 0 -2.04771137 0.114283845 0.17508366149751475 0 +279 1 2.53177547 0.926339567 0.11038695820005974 1 +280 0 -2.39241457 0.08375295 0.12619145057643072 0 +283 1 2.58736229 0.930043757 0.10462950074543359 1 +284 1 6.315773 0.9981957 0.0026053945661372192 1 +285 1 17.0703163 1 0 1 +288 1 -0.602478 0.353776962 1.4990879940554545 0 +290 0 -1.66311264 0.1593446 0.25041355795755704 0 +291 0 -2.04771137 0.114283845 0.17508366149751475 0 +293 1 2.63869476 0.933310747 0.099570586451478413 1 +296 0 -0.04219532 0.48945272 0.96988352376951226 0 +297 0 +299 1 2.437027 0.9196076 0.1209097376152837 1 +300 1 4.886091 0.9925057 0.010852664710009398 1 +301 0 -2.04771137 0.114283845 0.17508366149751475 0 +303 0 -2.04771137 0.114283845 0.17508366149751475 0 +304 1 2.90765285 0.9482235 0.076700989946081224 1 +308 1 4.42898655 0.988214 0.017104577035971798 1 +309 0 -2.17276287 0.102223195 0.15557127190119621 0 +311 0 -1.66311264 0.1593446 0.25041355795755704 0 +312 1 -0.368750572 0.408842951 1.2903813280998107 0 +314 0 -1.63186324 0.163575277 0.25769238876050721 0 +316 1 2.07395124 0.8883455 0.1708072411711142 1 +317 1 9.236988 0.9999026 0.00014051666860547148 1 +319 0 -0.6327839 0.346879572 0.61457906126809736 0 +321 0 +323 1 3.56552029 0.9724956 0.040236349195893271 1 +327 0 -1.85676885 0.135080114 0.20936158691636991 0 +328 1 2.31613636 0.910204649 0.13573713983693664 1 +329 1 3.052658 0.9548971 0.066582810014138891 1 +331 0 -2.85865283 0.0542357638 0.080447507227237577 0 +332 0 -2.45453167 0.0791077837 0.11889578564930094 0 +333 1 3.224123 0.9617321 0.056293037640751442 1 +336 1 4.161271 0.984651566 0.022314800350329005 1 +338 0 -1.63186324 0.163575277 0.25769238876050721 0 +343 0 -1.66311264 0.1593446 0.25041355795755704 0 +344 1 6.48078156 0.99846977 0.0022093461331651669 1 +346 0 -2.4612627 0.07861882 0.11812996027828425 0 +347 0 -1.5268147 0.178460211 0.28359764431931689 0 +348 1 -1.55794716 0.173941419 2.5233265901272413 0 +349 1 0.96990633 0.7251008 0.46374649890978753 1 +350 0 -2.50478745 0.07552324 0.11329104572942034 0 +352 0 -0.8905029 0.291006058 0.49615479540511881 0 +353 1 11.4202032 0.999989033 1.5822490644178947E-05 1 +354 0 -1.85676885 0.135080114 0.20936158691636991 0 +355 0 -2.59761286 0.06929221 0.10359981233578254 0 +358 1 4.168295 0.9847573 0.02215988217787071 1 +360 1 19.7173061 1 0 1 +361 1 4.88178444 0.9924736 0.01089936476746209 1 +366 1 18.082119 1 0 1 +368 0 -1.71223855 0.152873591 0.23935082825368728 0 +370 0 -2.466129 0.07826703 0.11757923930621997 0 +371 0 -1.71223855 0.152873591 0.23935082825368728 0 +373 0 -2.61302185 0.0683050454 0.10207041412114773 0 +376 0 -1.85676885 0.135080114 0.20936158691636991 0 +377 0 -1.63186324 0.163575277 0.25769238876050721 0 +378 0 -2.55687785 0.0719657838 0.1077500970966577 0 +379 0 -2.64790964 0.0661179647 0.098687769592959287 0 +381 1 6.70689869 0.998779 0.0017626085941359387 1 +383 0 -1.85219073 0.135615885 0.21025553563894767 0 +384 0 -1.85219073 0.135615885 0.21025553563894767 0 +387 0 -2.587854 0.06992423 0.10457983932319151 0 +388 0 -2.062164 0.11282903 0.17271593575335431 0 +389 0 -2.63233638 0.06708608 0.10018412244865801 0 +391 1 9.797784 0.999944448 8.0146141443027661E-05 1 +392 0 -2.21740723 0.0981981754 0.14911766597757717 0 +395 0 -2.21740723 0.0981981754 0.14911766597757717 0 +396 0 -2.39241457 0.08375295 0.12619145057643072 0 +398 0 -2.20704079 0.09912 0.15059314510991556 0 +399 0 -1.70332181 0.1540319 0.24132483641316704 0 +404 0 -1.84161174 0.136860788 0.21233483043736184 0 +406 0 -2.33448553 0.08830687 0.13337978519080357 0 +409 0 -2.2088275 0.09896057 0.15033785589508675 0 +413 0 -2.68322229 0.0639706552 0.095374335452958092 0 +414 1 4.470516 0.988688052 0.016412697518568688 1 +415 0 -1.37697363 0.201495469 0.32462750016760433 0 +416 1 6.49479866 0.9984909 0.0021787727517901165 1 +418 0 -2.47054315 0.07794919 0.11708183960876384 0 +419 0 -2.491969 0.07642309 0.11469599534527423 0 +422 0 -2.202886 0.09949162 0.15118839089802541 0 +423 0 -2.4900763 0.0765568 0.11490487237984263 0 +428 0 -1.85676885 0.135080114 0.20936158691636991 0 +429 0 -2.03787947 0.115282834 0.17671177846463382 0 +430 0 -1.88024449 0.1323608 0.20483286117168037 0 +434 0 4.23710155 0.985756457 6.1335481216812706 1 +436 1 2.84663773 0.9451446 0.081393036792859863 1 +439 0 -2.40992618 0.0824188963 0.12409241344887624 0 +440 1 3.80452919 0.9782154 0.031775923054351646 1 +441 0 -1.8284502 0.138423011 0.21494837550204221 0 +442 0 -1.70252347 0.154135972 0.24150232548215611 0 +449 1 12.0930557 0.9999944 8.083207235017858E-06 1 +450 0 -2.296249 0.0914341062 0.13833694513157324 0 +451 0 -2.40992618 0.0824188963 0.12409241344887624 0 +452 0 -2.17240882 0.102255695 0.1556234982659298 0 +453 1 6.529911 0.998543 0.0021035047090949962 1 +454 0 -2.07757616 0.111295484 0.17022427557546105 0 +455 1 -1.9901104 0.120245181 3.0559490175405211 0 +456 1 7.704238 0.9995492 0.00065049902446028007 1 +457 1 7.00719738 0.99909544 0.0013055949383471309 1 +464 0 -2.22559762 0.09747525 0.14796160408536918 0 +465 1 8.38367748 0.999771535 0.00032964240762353795 1 +466 1 6.553727 0.998577237 0.0020540745152688254 1 +467 1 6.02119255 0.997579157 0.0034967719595408674 1 +474 0 -2.40992618 0.0824188963 0.12409241344887624 0 +480 0 -2.20853472 0.09898668 0.15037965733571257 0 +482 1 16.26332 0.9999999 1.7198266111377426E-07 1 +483 1 11.1233063 0.9999852 2.1326006327376515E-05 1 +484 0 -2.38753271 0.08412834 0.1267826495786491 0 +487 1 13.0827723 0.999998 2.9237080272005804E-06 1 +489 1 -2.25294924 0.09509537 3.3944810328808703 0 +492 0 -2.191049 0.100557171 0.15289651175735539 0 +493 1 12.4391136 0.999996066 5.6754386418026423E-06 1 +495 0 -2.006237 0.11854963 0.18204875397128145 0 +497 0 -2.21665764 0.09826457 0.14922388345357948 0 +501 0 -2.39535141 0.0835278556 0.12583706323377797 0 +502 0 -2.446126 0.07972231 0.11985883701567156 0 +504 0 -1.66311264 0.1593446 0.25041355795755704 0 +507 0 -1.5343039 0.177364841 0.28167536187524722 0 +510 0 -1.66311264 0.1593446 0.25041355795755704 0 +513 0 -2.006237 0.11854963 0.18204875397128145 0 +514 1 11.0994911 0.99998486 2.1841961999056935E-05 1 +517 0 -1.63186324 0.163575277 0.25769238876050721 0 +519 1 4.549981 0.9895431 0.01516557768494084 1 +520 0 -1.89241147 0.130969763 0.20252171957783308 0 +521 0 -2.43429351 0.08059475 0.12122718788029851 0 +522 1 0.357010841 0.5883166 0.76533530327012156 1 +523 1 5.51915169 0.9960068 0.0057725219886650735 1 +527 0 -2.56239128 0.0715984255 0.10717912551116054 0 +528 0 -2.52255535 0.07429201 0.11137092307285647 0 +529 0 -2.191049 0.100557171 0.15289651175735539 0 +531 0 -2.33448553 0.08830687 0.13337978519080357 0 +532 0 -1.8267622 0.138624445 0.2152857123445632 0 +533 0 -2.21740723 0.0981981754 0.14911766597757717 0 +534 0 -2.03787947 0.115282834 0.17671177846463382 0 +535 0 -2.08951616 0.110119984 0.16831726594009194 0 +538 0 -2.39535141 0.0835278556 0.12583706323377797 0 +539 0 -2.74649048 0.0602851622 0.089705066266029906 0 +540 0 -2.47341466 0.07774305 0.11675934435269709 0 +541 0 -2.03968573 0.115098737 0.17641160645683859 0 +544 0 -2.07751942 0.111301087 0.17023337107337447 0 +546 1 15.9298019 0.9999999 1.7198266111377426E-07 1 +547 0 -1.63019609 0.1638035 0.25808609509773911 0 +548 0 -1.82455885 0.138887748 0.21572677983014757 0 +549 1 3.53455734 0.9716552 0.04148365754326467 1 +557 0 -2.50478745 0.07552324 0.11329104572942034 0 +558 0 -2.03787947 0.115282834 0.17671177846463382 0 +559 0 -2.57171249 0.0709812939 0.10622044886941406 0 +560 0 -2.730785 0.0611810647 0.091081154608133083 0 +561 0 -2.730785 0.0611810647 0.091081154608133083 0 +563 0 -2.21740723 0.0981981754 0.14911766597757717 0 +565 1 14.4914665 0.9999995 6.8793076746672365E-07 1 +566 0 -2.37125015 0.08539145 0.12877368417465981 0 +569 1 7.86107731 0.9996147 0.00055595503487491883 1 +577 0 -1.85676885 0.135080114 0.20936158691636991 0 +578 0 -1.85676885 0.135080114 0.20936158691636991 0 +581 1 8.679046 0.9998299 0.00024544011948576707 1 +582 1 9.267637 0.9999056 0.00013621668994928923 1 +584 0 -2.791611 0.0577791929 0.085862903474618182 0 +586 1 18.3650551 1 0 1 +590 1 0.8902283 0.7089373 0.49627008273810297 1 +593 0 -2.38753271 0.08412834 0.1267826495786491 0 +594 1 3.65131 0.9746996 0.036970418233996383 1 +600 0 -2.21740723 0.0981981754 0.14911766597757717 0 +602 0 -2.39535141 0.0835278556 0.12583706323377797 0 +604 1 1.157403 0.7608605 0.3942961227380975 1 +606 0 -2.284902 0.0923811048 0.13984145096224598 0 +607 0 -1.66311264 0.1593446 0.25041355795755704 0 +609 0 -2.40992618 0.0824188963 0.12409241344887624 0 +612 1 20.9893341 1 0 1 +613 0 -2.030234 0.1160649 0.17798764430460248 0 +614 0 -1.8198415 0.13945289 0.21667392047737177 0 +617 0 +618 0 -2.39535141 0.0835278556 0.12583706323377797 0 +619 0 -2.57171249 0.0709812939 0.10622044886941406 0 +621 0 -2.57282734 0.07090781 0.10610633667562216 0 +622 0 -2.87062454 0.0536249466 0.079516050420504789 0 +624 0 -2.41982079 0.0816737 0.12292122599990905 0 +627 0 -1.58449054 0.170160457 0.26909569048429549 0 +629 0 -2.22559762 0.09747525 0.14796160408536918 0 +633 1 1.851265 0.8642755 0.21043680463191686 1 +634 0 -2.03968573 0.115098737 0.17641160645683859 0 +638 0 -2.22559762 0.09747525 0.14796160408536918 0 +639 0 -2.50478745 0.07552324 0.11329104572942034 0 +641 0 -2.21740723 0.0981981754 0.14911766597757717 0 +642 0 -2.21740723 0.0981981754 0.14911766597757717 0 +644 0 -1.85219073 0.135615885 0.21025553563894767 0 +645 0 -2.21740723 0.0981981754 0.14911766597757717 0 +649 0 -2.21740723 0.0981981754 0.14911766597757717 0 +652 0 -2.564228 0.07147643 0.10698956187034971 0 +653 0 -2.39535141 0.0835278556 0.12583706323377797 0 +654 0 -2.39241457 0.08375295 0.12619145057643072 0 +656 0 -2.57171249 0.0709812939 0.10622044886941406 0 +657 0 -2.0722928 0.111819126 0.17107458963369743 0 +660 0 -1.85676885 0.135080114 0.20936158691636991 0 +661 0 -2.56239128 0.0715984255 0.10717912551116054 0 +665 0 -1.66311264 0.1593446 0.25041355795755704 0 +668 1 -0.192660332 0.451983333 1.1456585221797912 0 +670 1 6.66539 0.9987274 0.0018371700459368042 1 +678 0 -1.66311264 0.1593446 0.25041355795755704 0 +679 0 -1.85219073 0.135615885 0.21025553563894767 0 +680 1 20.8869 1 0 1 +681 1 12.674202 0.9999969 4.4715558520995569E-06 1 +682 0 -2.713255 0.0621957332 0.092641251857392207 0 +683 0 -1.66311264 0.1593446 0.25041355795755704 0 +685 0 -1.66311264 0.1593446 0.25041355795755704 0 +688 0 -2.22559762 0.09747525 0.14796160408536918 0 +689 0 -2.78634024 0.0580668 0.086303344802401927 0 +691 1 4.852685 0.9922531 0.011219894450214495 1 +692 0 -2.03968573 0.115098737 0.17641160645683859 0 +693 0 -2.36527443 0.08585931 0.12951188152740967 0 +694 0 -2.19330382 0.10035342 0.15256973467024601 0 +696 1 6.44385242 0.998412251 0.0022924573316975153 1 +697 1 2.56533623 0.9285971 0.1068753309513874 1 +698 1 3.769271 0.977451265 0.032903322595354806 1 +0 0 -2.301516 0.09099748 0.13764380069439297 0 +1 0 1.08247185 0.7469615 1.9825710402688395 1 +2 0 -2.0523982 0.113810278 0.17431250107108243 0 +3 0 3.463801 0.96964 5.0416851857458864 1 +4 0 -2.25727749 0.09472357 0.14356969816808129 0 +7 0 -2.013621 0.117780194 0.18078994480689475 0 +12 1 -0.8284931 0.30396378 1.7180286690667717 0 +13 0 -1.81933558 0.139513627 0.21677574901409538 0 +14 1 7.468815 0.999429643 0.00082308574166617431 1 +15 1 -0.935884 0.2817325 1.8276020977115841 0 +16 0 -2.098476 0.109245047 0.16689949442685795 0 +17 0 -2.22533417 0.09749843 0.14799865604012269 0 +19 0 -2.36852455 0.08560456 0.12910989118919178 0 +22 0 -2.00196 0.118997283 0.18278162694192454 0 +23 1 +24 0 -1.941751 0.125455618 0.19339649381178925 0 +26 0 -1.70507562 0.153803527 0.24093542302960627 0 +27 0 -2.18581915 0.101031184 0.15365702371483531 0 +29 0 -1.6321876 0.1635309 0.25761585008130428 0 +30 0 -1.73291934 0.150214538 0.23482943239457851 0 +33 0 -2.09316373 0.109763056 0.16773872242540308 0 +34 0 -1.966197 0.122797951 0.18901891314128982 0 +36 1 10.6047812 0.9999752 3.5772834884537144E-05 1 +38 1 5.09487247 0.99390924 0.0088139788276411432 1 +39 1 0.138988018 0.534691155 0.90322228350613509 1 +42 1 8.104832 0.999698043 0.00043569783898110006 1 +43 1 -2.051857 0.113864884 3.1346052100634472 0 +47 0 -1.78140879 0.144129261 0.22453517072067464 0 +49 1 6.031123 0.997603 0.0034622923707363488 1 +53 1 2.5970068 0.930668652 0.10366048147588253 1 +55 1 3.37955284 0.967059433 0.048323537425725815 1 +57 1 -2.29733229 0.09134414 3.4525440037349249 0 +58 1 -0.8062577 0.308688521 1.6957762577022222 0 +59 1 -0.20775795 0.448246568 1.1576355563258656 0 +61 0 -1.73861909 0.149488419 0.23359721489187701 0 +62 1 5.937831 0.99736917 0.0038004865334286451 1 +65 1 -1.92219067 0.127617478 2.9701021620868731 0 +67 1 1.6232996 0.835249662 0.25972060045188861 1 +75 0 -1.96936083 0.122457556 0.18845918980961393 0 +78 0 -1.95251036 0.124279886 0.19145824716485596 0 +80 0 -2.1607275 0.103333026 0.15735583372897294 0 +81 0 -2.12950277 0.106262207 0.16207646288515981 0 +83 0 -2.52023387 0.07445183 0.11162001257935196 0 +84 1 7.28208447 0.999312758 0.00099182083151890563 1 +85 1 3.20175552 0.9609003 0.057541335571880493 1 +86 1 1.07764864 0.746048748 0.42265819240738722 1 +87 1 6.03411 0.9976101 0.0034520348521077638 1 +89 0 -2.220188 0.0979522 0.14872421333055375 0 +94 0 -2.045452 0.114512727 0.17545652289353517 0 +101 1 -0.09225035 0.4769538 1.0680785545608487 0 +103 1 -2.52788973 0.07392599 3.7577745918272321 0 +107 1 6.7885294 0.9988746 0.0016245164986375925 1 +110 0 -2.08183551 0.110874891 0.16954166005159219 0 +114 0 -1.657285 0.16012679 0.25175654520308971 0 +116 0 -1.4446578 0.1908251 0.30547653402158781 0 +118 0 -2.08073568 0.110983357 0.16971766707069735 0 +119 0 -1.99037921 0.120216757 0.18477997210748806 0 +124 1 4.98317528 0.993194342 0.0098520525459535446 1 +126 1 4.85608768 0.9922792 0.011182023351539032 1 +127 0 -2.13997936 0.105271339 0.16047786433454483 0 +130 0 -2.02583027 0.116517484 0.17872651087564395 0 +134 0 -2.27046967 0.0935983658 0.14177763258855564 0 +135 0 -2.082193 0.110839657 0.16948449080217048 0 +136 0 -2.098476 0.109245047 0.16689949442685795 0 +139 0 +140 0 -1.860422 0.134653866 0.20865077658844469 0 +142 1 1.5520792 0.82521385 0.2771600607430223 1 +143 0 -1.42160451 0.19441016 0.31188260684972846 0 +146 1 -0.379899025 0.406151235 1.2999110632727831 0 +148 0 -3.333778 0.03443041 0.050547855906756659 0 +149 1 9.453949 0.9999217 0.0001129970266666251 1 +153 0 -1.79716134 0.142196968 0.22128167987188255 0 +155 1 2.7138834 0.9378409 0.092584929720156431 1 +157 0 -2.045452 0.114512727 0.17545652289353517 0 +158 0 +159 1 14.5143137 0.9999995 6.8793076746672365E-07 1 +160 1 8.880978 0.999861 0.0002005457089583406 1 +162 0 -2.13997936 0.105271339 0.16047786433454483 0 +163 0 -2.36457872 0.0859139338 0.12959808560549185 0 +165 0 -2.09007239 0.110065483 0.16822891030896434 0 +166 1 8.115719 0.9997012 0.00043113892933886136 1 +168 0 -2.13997936 0.105271339 0.16047786433454483 0 +170 0 -1.860422 0.134653866 0.20865077658844469 0 +172 0 -1.78140879 0.144129261 0.22453517072067464 0 +175 1 7.61374569 0.9995066 0.00071201186227698389 1 +178 0 -2.22533417 0.09749843 0.14799865604012269 0 +182 0 -2.36852455 0.08560456 0.12910989118919178 0 +184 1 4.644288 0.990475237 0.013807187789500337 1 +185 0 -1.77662516 0.144720361 0.22553189902602172 0 +186 1 5.66861629 0.9965592 0.0049725809792141133 1 +190 1 16.6872864 1 0 1 +193 0 -1.941751 0.125455618 0.19339649381178925 0 +194 0 -2.13997936 0.105271339 0.16047786433454483 0 +195 0 -2.22533417 0.09749843 0.14799865604012269 0 +197 0 -2.29312468 0.091693975 0.13874964503480286 0 +200 1 10.1933537 0.999962568 5.4003563100270837E-05 1 +203 0 -2.301516 0.09099748 0.13764380069439297 0 +208 0 -1.67101777 0.158288538 0.24860233230888198 0 +213 1 20.2759647 1 0 1 +214 1 18.7733364 1 0 1 +215 1 8.191004 0.9997229 0.00039982907120573395 1 +217 0 -1.941751 0.125455618 0.19339649381178925 0 +220 0 -2.00243449 0.118947558 0.18270020126928377 0 +221 1 7.44619 0.9994167 0.00084175662910008565 1 +222 1 -1.34953451 0.205946475 2.2796586599059694 0 +224 1 9.052607 0.999882936 0.00016889684917020562 1 +225 0 -1.78140879 0.144129261 0.22453517072067464 0 +227 1 8.601936 0.999816358 0.00026496360361006585 1 +229 1 15.556097 0.9999999 1.7198266111377426E-07 1 +230 1 4.348646 0.9872406 0.018526350463759503 1 +231 1 8.508919 0.999798357 0.00029093798765384679 1 +232 0 -0.296713352 0.426361144 0.80178534411673164 0 +234 0 -1.87558413 0.132896915 0.20572457748992548 0 +235 0 +236 1 9.828637 0.9999461 7.7738252578338893E-05 1 +238 1 15.6847239 0.9999999 1.7198266111377426E-07 1 +243 0 -1.85970509 0.134737432 0.20879010310197682 0 +245 0 -2.17634916 0.101894535 0.15504322373043186 0 +251 1 6.219199 0.998013139 0.00286928622354919 1 +253 1 8.104832 0.999698043 0.00043569783898110006 1 +255 1 3.94488955 0.9810141 0.027654262469072717 1 +256 0 -1.860422 0.134653866 0.20865077658844469 0 +261 1 12.4782257 0.9999962 5.5034553246245386E-06 1 +263 1 6.391608 0.9983272 0.0024153673304377296 1 +264 1 2.26732063 0.906134069 0.14220357185362809 1 +265 0 -1.91125607 0.1288398 0.19899006005896697 0 +266 1 7.600045 0.9994998 0.00072181974597906125 1 +270 1 5.563095 0.9961778 0.0055248450255732757 1 +273 1 -1.02924967 0.263229579 1.925606483115087 0 +274 0 -2.136303 0.105618112 0.16103712188187333 0 +281 0 -2.09316373 0.109763056 0.16773872242540308 0 +282 1 3.098658 0.9568373 0.06365446955853514 1 +286 1 19.419363 1 0 1 +287 0 -2.27046967 0.0935983658 0.14177763258855564 0 +289 1 8.124609 0.999703944 0.00042718215151575466 1 +292 1 +294 0 +295 1 5.98761 0.997496545 0.0036162501096248033 1 +298 0 -2.98175526 0.04825695 0.071355963047900345 0 +302 1 18.99006 1 0 1 +305 1 8.560013 0.9998085 0.00027631658811241448 1 +306 0 -1.941751 0.125455618 0.19339649381178925 0 +307 0 -1.941751 0.125455618 0.19339649381178925 0 +310 0 -2.16668749 0.1027821 0.1564696923073676 0 +313 0 -1.6175487 0.165543213 0.26109075530209375 0 +315 0 +318 0 -2.750764 0.0600435175 0.089334129517283936 0 +320 1 2.96006584 0.950737059 0.072881698029347464 1 +322 0 -2.13997936 0.105271339 0.16047786433454483 0 +324 0 -1.941751 0.125455618 0.19339649381178925 0 +325 0 -1.86101615 0.13458465 0.20853538526771875 0 +326 1 0.5836396 0.6419045 0.6395694800066366 1 +330 1 3.19974613 0.9608247 0.05765481382577594 1 +334 1 5.354478 0.995295346 0.0068033977028160051 1 +335 0 -1.6175487 0.165543213 0.26109075530209375 0 +337 0 -1.941751 0.125455618 0.19339649381178925 0 +339 1 4.42046261 0.9881143 0.01725016366406085 1 +340 1 3.32619667 0.9653167 0.050925737892124082 1 +341 0 -1.941751 0.125455618 0.19339649381178925 0 +342 0 -1.74357152 0.148859844 0.23253137628148873 0 +345 0 -1.6175487 0.165543213 0.26109075530209375 0 +351 0 -2.045452 0.114512727 0.17545652289353517 0 +356 1 -1.66799617 0.158691525 2.6557030083293012 0 +357 1 12.1684132 0.999994755 7.5672564839008544E-06 1 +359 1 2.620923 0.9321961 0.10129464764951893 1 +362 0 -2.19840622 0.0998937041 0.15183271169511453 0 +363 0 -1.04904556 0.2594084 0.43324993672264289 0 +364 0 -2.045452 0.114512727 0.17545652289353517 0 +365 0 -1.89627123 0.130531073 0.20179362469978843 0 +367 1 13.7444353 0.9999989 1.5478446880940214E-06 1 +369 0 -1.49699593 0.182874 0.29136952685596818 0 +372 0 -2.04446387 0.114612974 0.17561986216689546 0 +374 0 -1.966197 0.122797951 0.18901891314128982 0 +375 0 -1.6175487 0.165543213 0.26109075530209375 0 +380 0 -1.6175487 0.165543213 0.26109075530209375 0 +382 0 -1.98493266 0.120794 0.18572686024059626 0 +385 0 -2.27838588 0.09292892 0.14071249291381016 0 +386 1 4.234085 0.985713959 0.020759038727296567 1 +390 0 -1.85135007 0.135714456 0.21042006464991661 0 +393 0 -1.342573 0.207087249 0.33476596791809693 0 +394 0 -1.731577 0.150385961 0.23512048938573521 0 +397 0 -1.96809924 0.122593194 0.1886821979796787 0 +400 1 8.218968 0.9997305 0.00038881917268506155 1 +401 0 -1.860422 0.134653866 0.20865077658844469 0 +402 0 -1.81246018 0.140341058 0.21816369183653808 0 +403 0 -1.63434482 0.163236037 0.25710737448281606 0 +405 0 -1.78140879 0.144129261 0.22453517072067464 0 +407 0 -1.78140879 0.144129261 0.22453517072067464 0 +408 0 -1.77392912 0.145054385 0.22609544513509036 0 +410 0 -1.78140879 0.144129261 0.22453517072067464 0 +411 0 +412 1 9.160485 0.999894857 0.00015169667309156297 1 +417 0 -1.78140879 0.144129261 0.22453517072067464 0 +420 0 -1.71119952 0.1530082 0.23958008015495064 0 +421 1 12.2299891 0.9999951 7.0513059173031522E-06 1 +424 0 -1.860422 0.134653866 0.20865077658844469 0 +425 1 20.1651058 1 0 1 +426 0 -1.3227582 0.210359767 0.34073259653634197 0 +427 1 4.300104 0.9866145 0.019441567487860585 1 +431 0 -2.75610447 0.0597428158 0.088872670403648199 0 +432 0 -2.164125 0.103018656 0.15685011613830954 0 +433 0 -1.83914936 0.137151927 0.21282153695787007 0 +435 1 7.36268234 0.999365866 0.00091515190632679476 1 +437 0 -1.96809924 0.122593194 0.1886821979796787 0 +438 0 -1.880899 0.132285655 0.2047079142247506 0 +443 0 -1.58702278 0.169803187 0.26847470165960907 0 +444 0 -2.40749931 0.08260262 0.12438130785824263 0 +445 0 -1.74357152 0.148859844 0.23253137628148873 0 +446 0 -1.6175487 0.165543213 0.26109075530209375 0 +447 0 -2.06660366 0.1123854 0.17199469628631101 0 +448 0 -1.342573 0.207087249 0.33476596791809693 0 +458 0 -2.00865936 0.118296735 0.18163489276241526 0 +459 0 -1.93524909 0.126170725 0.19457665456288356 0 +460 0 -2.10963583 0.108163789 0.16514931652661516 0 +461 0 -1.5343715 0.177354991 0.2816580881405864 0 +462 0 -2.17302465 0.102199174 0.15553267206171928 0 +463 0 -1.97221267 0.12215142 0.18795598317957285 0 +468 0 -1.96809924 0.122593194 0.1886821979796787 0 +469 0 -1.78214443 0.144038543 0.22438225994148536 0 +470 0 -1.73291934 0.150214538 0.23482943239457851 0 +471 0 -2.17302465 0.102199174 0.15553267206171928 0 +472 0 -1.89049411 0.131188139 0.20288429650077927 0 +473 0 -1.96809924 0.122593194 0.1886821979796787 0 +475 0 -1.860422 0.134653866 0.20865077658844469 0 +476 0 -1.92840433 0.1269273 0.19582630620444338 0 +477 0 -1.96809924 0.122593194 0.1886821979796787 0 +478 0 -2.01690173 0.117439739 0.18023330693767575 0 +479 1 9.129778 0.999891639 0.00015634070042369144 1 +481 0 -1.77698469 0.144675866 0.2254568465498844 0 +485 0 -1.37343407 0.202065587 0.32565792737640359 0 +486 0 -1.73291934 0.150214538 0.23482943239457851 0 +488 1 1.15169907 0.7598212 0.39626817381950297 1 +490 0 -1.6175487 0.165543213 0.26109075530209375 0 +491 1 6.43022442 0.998390555 0.0023238082916929833 1 +494 0 -1.0844636 0.252662241 0.42016767992874143 0 +496 0 -1.342573 0.207087249 0.33476596791809693 0 +498 0 -2.098476 0.109245047 0.16689949442685795 0 +499 0 -2.098476 0.109245047 0.16689949442685795 0 +500 0 -2.36852455 0.08560456 0.12910989118919178 0 +503 0 -2.22533417 0.09749843 0.14799865604012269 0 +505 0 -1.81462574 0.14007999 0.21772562877705068 0 +506 1 12.0963869 0.9999944 8.083207235017858E-06 1 +508 0 -2.06660366 0.1123854 0.17199469628631101 0 +509 0 -1.74357152 0.148859844 0.23253137628148873 0 +511 0 -2.18581915 0.101031184 0.15365702371483531 0 +512 0 -2.06660366 0.1123854 0.17199469628631101 0 +515 1 10.156889 0.999961138 5.6067433641037978E-05 1 +516 0 -1.342573 0.207087249 0.33476596791809693 0 +518 0 -1.87690234 0.132745087 0.20547198672775793 0 +524 0 -2.00196 0.118997283 0.18278162694192454 0 +525 0 -1.91367817 0.128568187 0.19854031339238309 0 +526 0 -1.96809924 0.122593194 0.1886821979796787 0 +530 1 4.653802 0.9905646 0.013677053104199231 1 +536 0 -2.301516 0.09099748 0.13764380069439297 0 +537 0 -2.21493769 0.09841708 0.14946791169661081 0 +542 0 -1.95570588 0.123932526 0.19088610479236329 0 +543 0 -2.098476 0.109245047 0.16689949442685795 0 +545 0 -2.18581915 0.101031184 0.15365702371483531 0 +550 0 -2.00196 0.118997283 0.18278162694192454 0 +551 0 -1.941751 0.125455618 0.19339649381178925 0 +552 0 -2.07113647 0.111934021 0.17126122926502999 0 +553 0 -1.193924 0.232557878 0.38187014349940485 0 +554 0 -1.860422 0.134653866 0.20865077658844469 0 +555 0 -1.62672949 0.16427888 0.25890649895897555 0 +556 0 -1.76245427 0.146483228 0.22850859107163557 0 +562 0 -1.941751 0.125455618 0.19339649381178925 0 +564 0 -2.20704937 0.09911924 0.15059192808996283 0 +567 0 -1.90300918 0.129768282 0.20052849433295125 0 +568 1 1.72357225 0.8485884 0.23686312545110236 1 +570 1 5.530344 0.996051 0.0057084620367186976 1 +571 1 12.7975969 0.999997258 3.955606392614897E-06 1 +572 0 -2.00196 0.118997283 0.18278162694192454 0 +573 0 -1.78140879 0.144129261 0.22453517072067464 0 +574 1 5.131028 0.994124234 0.0085019411118018116 1 +575 0 -2.21493769 0.09841708 0.14946791169661081 0 +576 0 -2.18581915 0.101031184 0.15365702371483531 0 +579 0 -1.941751 0.125455618 0.19339649381178925 0 +580 0 -2.11355782 0.107786037 0.1645383687069783 0 +583 0 -1.860422 0.134653866 0.20865077658844469 0 +585 0 -1.6175487 0.165543213 0.26109075530209375 0 +587 0 -2.164125 0.103018656 0.15685011613830954 0 +588 1 3.97299385 0.9815305 0.026895014627516617 1 +589 0 -2.06660366 0.1123854 0.17199469628631101 0 +591 1 5.15082 0.994238734 0.008335784993429584 1 +592 1 2.59083414 0.930269361 0.10427958420150241 1 +595 0 -2.18581915 0.101031184 0.15365702371483531 0 +596 0 -2.04446387 0.114612974 0.17561986216689546 0 +597 0 -2.112893 0.107849985 0.16464177579708919 0 +598 0 -2.00196 0.118997283 0.18278162694192454 0 +599 0 -1.47923768 0.1855426 0.29608885109001915 0 +601 0 -1.5085547 0.181153089 0.28833433912434342 0 +603 1 2.79953 0.9426504 0.085205310002869877 1 +605 1 9.113677 0.999889851 0.00015892072206770877 1 +608 1 11.1271286 0.999985337 2.1154021144488122E-05 1 +610 1 4.917906 0.992738664 0.010514112839565644 1 +611 1 7.66873455 0.999533057 0.00067381337182235643 1 +615 0 -1.9749856 0.121854387 0.18746790978262812 0 +616 0 -2.00196 0.118997283 0.18278162694192454 0 +620 0 -2.00196 0.118997283 0.18278162694192454 0 +623 0 -1.6175487 0.165543213 0.26109075530209375 0 +625 0 -1.72655845 0.15102832 0.23621166606060956 0 +626 1 3.22024632 0.9615891 0.056507555310947317 1 +628 0 -1.74357152 0.148859844 0.23253137628148873 0 +630 0 -1.88439143 0.131885275 0.20404238182768375 0 +631 0 -2.18581915 0.101031184 0.15365702371483531 0 +632 0 -1.6175487 0.165543213 0.26109075530209375 0 +635 0 -1.74968672 0.148086727 0.23122152652399849 0 +636 1 9.544065 0.999928355 0.00010336527600414941 1 +637 0 -1.525428 0.178663611 0.28395487805787722 0 +640 0 -2.03707385 0.115365021 0.17684580637902217 0 +643 0 -1.6175487 0.165543213 0.26109075530209375 0 +646 0 -1.62914348 0.163947731 0.25833495461491246 0 +647 0 -1.76435113 0.146246225 0.22810804177334876 0 +648 1 11.25837 0.9999871 1.8574245861463165E-05 1 +650 0 -1.90433264 0.1296189 0.20028086228354752 0 +651 0 -1.88349569 0.13198787 0.20421289076099527 0 +655 0 -2.00196 0.118997283 0.18278162694192454 0 +658 1 8.6298 0.999821365 0.00025773902362411926 1 +659 0 -1.6175487 0.165543213 0.26109075530209375 0 +662 0 -1.76741409 0.1458642 0.22746263715138998 0 +663 0 -1.76741409 0.1458642 0.22746263715138998 0 +664 0 -2.07836151 0.111217827 0.17009821449285314 0 +666 0 -2.084568 0.110605806 0.16910510831886344 0 +667 0 -2.13997936 0.105271339 0.16047786433454483 0 +669 1 11.2461758 0.9999869 1.8918215632667518E-05 1 +671 0 -2.11648464 0.1075049 0.16408384130497666 0 +672 0 -2.045452 0.114512727 0.17545652289353517 0 +673 0 -2.11998677 0.107169338 0.1635415204810986 0 +674 0 -1.78140879 0.144129261 0.22453517072067464 0 +675 0 -1.80261636 0.141532868 0.22016519609417487 0 +676 0 -1.78214443 0.144038543 0.22438225994148536 0 +677 0 -2.06660366 0.1123854 0.17199469628631101 0 +684 0 -1.6175487 0.165543213 0.26109075530209375 0 +686 0 -1.6175487 0.165543213 0.26109075530209375 0 +687 0 -2.00984144 0.11817351 0.18143327856658856 0 +690 0 -1.76435113 0.146246225 0.22810804177334876 0 +695 0 -1.74357152 0.148859844 0.23253137628148873 0 diff --git a/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-out.txt b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-out.txt new file mode 100644 index 0000000000..3805af6e7c --- /dev/null +++ b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-out.txt @@ -0,0 +1,51 @@ +maml.exe TrainTest test=%Data% tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures norm=No dout=%Output% data=%Data% out=%Output% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} +Not adding a normalizer. +Warning: Skipped 16 examples with bad label/weight/features in training set +Not training a calibrator because it is not needed. +Warning: The predictor produced non-finite prediction values on 16 instances during testing. Possible causes: abnormal data or the predictor is numerically unstable. +TEST POSITIVE RATIO: 0.3499 (239.0/(239.0+444.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 215 | 24 | 0.8996 + negative || 7 | 437 | 0.9842 + ||====================== +Precision || 0.9685 | 0.9479 | +OVERALL 0/1 ACCURACY: 0.954612 +LOG LOSS/instance: 0.228754 +Test-set entropy (prior Log-Loss/instance): 0.934003 +LOG-LOSS REDUCTION (RIG): 75.508177 +AUC: 0.982029 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.982029 (0.0000) +Accuracy: 0.954612 (0.0000) +Positive precision: 0.968468 (0.0000) +Positive recall: 0.899582 (0.0000) +Negative precision: 0.947939 (0.0000) +Negative recall: 0.984234 (0.0000) +Log-loss: 0.228754 (0.0000) +Log-loss reduction: 75.508177 (0.0000) +F1 Score: 0.932755 (0.0000) +AUPRC: 0.980228 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Normalize' started. +[1] (%Time%) 699 examples +[1] 'Normalize' finished in %Time%. +[2] 'Training' started. +[2] (%Time%) 1 iterations, 683 examples Training-loss: 0.306117119945184 +[2] (%Time%) 2 iterations, 683 examples Training-loss: 0.193084570883075 +[2] (%Time%) 3 iterations, 683 examples Training-loss: 0.173782368769797 +[2] (%Time%) 4 iterations, 683 examples Training-loss: 0.163879262610855 +[2] (%Time%) 5 iterations, 683 examples Training-loss: 0.157117446501075 +[2] 'Training' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-rp.txt b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-rp.txt new file mode 100644 index 0000000000..4a01e926c6 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer-rp.txt @@ -0,0 +1,4 @@ +FieldAwareFactorizationMachine +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /d /norm /shuf Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.982029 0.954612 0.968468 0.899582 0.947939 0.984234 0.228754 75.50818 0.932755 0.980228 5 - - FieldAwareFactorizationMachine %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=FieldAwareFactorizationMachine{d=5 shuf- norm-} col[Feature]=DupFeatures norm=No dout=%Output% data=%Data% out=%Output% seed=1 xf=Copy{col=DupFeatures:Features} xf=MinMax{col=Features col=DupFeatures} /d:5;/norm:-;/shuf:- + diff --git a/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer.txt b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer.txt new file mode 100644 index 0000000000..e142c5c952 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/FieldAwareFactorizationMachine/FieldAwareFactorizationMachine-TrainTest-breast-cancer.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -2.79334736 0.0576847345 0.085718279282943594 0 +1 0 1.188056 0.7663932 2.0978457302965743 1 +2 0 -2.51387787 0.074891 0.11230473674761222 0 +3 0 2.8827734 0.9469883 4.2375449640754628 1 +4 0 -2.73850226 0.0607392974 0.090402444870538778 0 +5 1 17.67403 1 0 1 +6 0 -1.42012978 0.194641247 0.31229651002770953 0 +7 0 -2.48911548 0.07662476 0.11501104509053926 0 +8 0 -3.05736852 0.0449004173 0.066276932485278203 0 +9 0 -2.49013543 0.07655262 0.11489834233223327 0 +10 0 -2.08552837 0.110511363 0.16895191862826214 0 +11 0 -2.303132 0.0908639 0.1374318066173198 0 +12 1 -1.27195454 0.218922853 2.1915055288260206 0 +13 0 -2.25197268 0.09517944 0.14429638095999855 0 +14 1 8.572502 0.9998109 0.00027287628034393304 1 +15 1 -1.27670574 0.218111485 2.196862353947556 0 +16 0 -2.546958 0.07263111 0.10878476978943961 0 +17 0 -2.70365119 0.06275825 0.09350687664921721 0 +18 1 6.88258553 0.998975635 0.0014786043638188881 1 +19 0 -2.87238669 0.0535355881 0.079379834832595766 0 +20 1 3.6811657 0.975425541 0.035896345222225338 1 +21 1 6.199198 0.997973 0.0029272747638287261 1 +22 0 -2.43037367 0.08088568 0.12168377661511501 0 +23 1 +24 0 -2.37061882 0.08544078 0.12885149942120921 0 +25 1 0.301486969 0.574806 0.79885303657013707 1 +26 0 -2.121753 0.107000455 0.16326865504132451 0 +27 0 -2.652885 0.06581142 0.098214282791589516 0 +28 0 -2.303132 0.0908639 0.1374318066173198 0 +29 0 -2.03972268 0.115094975 0.17640547222344355 0 +30 0 -2.15111279 0.104227282 0.15879536747436127 0 +31 0 -2.49228716 0.07640065 0.11466094104662786 0 +32 1 4.41975975 0.988106 0.017262260285248437 1 +33 0 -2.54244328 0.0729358 0.10925884045202583 0 +34 0 -2.4251883 0.08127202 0.12229032950777963 0 +35 0 -2.303132 0.0908639 0.1374318066173198 0 +36 1 11.464077 0.9999895 1.5134552659953847E-05 1 +37 0 -2.90807438 0.05175586 0.076669544650713642 0 +38 1 5.226836 0.9946582 0.0077272859162861246 1 +39 1 0.192784309 0.548047364 0.86762751464658039 1 +40 0 +41 1 -0.340168953 0.415768445 1.266147828359969 0 +42 1 8.853592 0.9998572 0.00020604992936022588 1 +43 1 -2.117641 0.107394 3.2190146693586854 0 +44 1 9.450965 0.999921441 0.0001133410189510066 1 +45 0 -2.40569448 0.0827394947 0.12459657233005934 0 +46 1 5.376622 0.995397866 0.0066548011445776789 1 +47 0 -2.16523314 0.1029163 0.15668549713042432 0 +48 0 -2.73850226 0.0607392974 0.090402444870538778 0 +49 1 5.89553928 0.997255862 0.0039643965487975831 1 +50 1 -0.227107048 0.443465978 1.1731046676718506 0 +51 1 -0.8415785 0.301202446 1.7311946079503711 0 +52 1 3.04452515 0.9545456 0.067113950169056663 1 +53 1 3.61555958 0.9738029 0.038298262118380257 1 +54 1 3.77800655 0.977643 0.032620334610649768 1 +55 1 3.194067 0.9606104 0.057976682417311451 1 +56 1 7.91791248 0.999635935 0.00052533064883456481 1 +57 1 -2.86445379 0.0539389737 4.2125281183154604 0 +58 1 -0.969594 0.274961442 1.8626987732996008 0 +59 1 -0.6607013 0.3405821 1.553925470966943 0 +60 1 1.0063467 0.732304633 0.44948417232333177 1 +61 0 -2.1292522 0.106286012 0.16211488941610727 0 +62 1 6.41300774 0.9983626 0.0023642038022797952 1 +63 1 -1.33857679 0.207744211 2.2671198197586828 0 +64 0 -2.16523314 0.1029163 0.15668549713042432 0 +65 1 -2.526939 0.073991105 3.7565043460709084 0 +66 0 -2.70365119 0.06275825 0.09350687664921721 0 +67 1 1.78247547 0.8560023 0.22431347044655056 1 +68 1 7.800373 0.9995906 0.00059079536563381421 1 +69 0 -2.402561 0.08297762 0.12497115587899781 0 +70 0 -2.56230116 0.0716044158 0.10718843415121884 0 +71 1 3.8944397 0.9800513 0.029070857780294054 1 +72 0 -2.60696554 0.06869147 0.10266890201899616 0 +73 1 8.50068 0.9997967 0.00029334623238004185 1 +74 1 -0.107892036 0.473053157 1.0799257855156403 0 +75 0 -2.46654248 0.07823721 0.11753257018815799 0 +76 0 -2.22932768 0.0971476 0.14743794057217838 0 +77 0 -2.47708964 0.077479966 0.11634785291703036 0 +78 0 -2.41123319 0.08232011 0.1239371005276802 0 +79 0 -2.58705831 0.06997599 0.10466012826020632 0 +80 0 -2.76758575 0.0591011234 0.087888417643977923 0 +81 0 -2.58375478 0.07019129 0.10499414907116332 0 +82 0 -2.69794416 0.06309478 0.094024986527322621 0 +83 0 -3.1041286 0.042937275 0.06331461422116523 0 +84 1 8.480363 0.9997925 0.00029936686178311424 1 +85 1 3.62424469 0.9740235 0.0379714836237331 1 +86 1 0.873991 0.705575466 0.50312769764048526 1 +87 1 6.5370903 0.998553336 0.0020886065803920047 1 +88 0 -2.70365119 0.06275825 0.09350687664921721 0 +89 0 -2.64684486 0.06618374 0.098789382822258742 0 +90 0 -2.37061882 0.08544078 0.12885149942120921 0 +91 0 -2.31983972 0.08949312 0.13525817349750544 0 +92 0 -2.70365119 0.06275825 0.09350687664921721 0 +93 0 -2.16523314 0.1029163 0.15668549713042432 0 +94 0 -2.49228716 0.07640065 0.11466094104662786 0 +95 0 -2.37061882 0.08544078 0.12885149942120921 0 +96 0 -2.19050217 0.10060665 0.15297587812753632 0 +97 0 -2.79334736 0.0576847345 0.085718279282943594 0 +98 1 5.520876 0.996013641 0.0057625933731902997 1 +99 1 11.3165894 0.999987841 1.7542337039908934E-05 1 +100 1 1.017416 0.734468937 0.44522661908047623 1 +101 1 -0.5716233 0.360862345 1.4704794870706024 0 +102 0 -2.66489172 0.0650770739 0.097080658952617693 0 +103 1 -2.88350773 0.05297488 4.2385477822371218 0 +104 1 13.1776581 0.9999981 2.751725038055267E-06 1 +105 1 -1.78037786 0.144256487 2.7932918938163764 0 +106 1 12.0229883 0.99999404 8.5991581706542968E-06 1 +107 1 7.51091671 0.999453247 0.00078901414592929902 1 +108 0 -2.25749826 0.0947046354 0.14353952759458233 0 +109 1 5.029805 0.993502438 0.0094045870149739464 1 +110 0 -2.56023145 0.07174213 0.10740245681394917 0 +111 1 1.76195621 0.85345453 0.22861380249667038 1 +112 1 5.949276 0.9973991 0.0037572056709905387 1 +113 1 9.109059 0.9998894 0.00015960872861869104 1 +114 0 -2.12039614 0.107130177 0.16347824413516199 0 +115 0 -1.8000406 0.14184612 0.22069172747506174 0 +116 0 -1.96252012 0.123194568 0.18967135852054179 0 +117 1 7.06990051 0.9991504 0.0012262413366360865 1 +118 0 -2.46007347 0.07870501 0.11826493158533567 0 +119 0 -2.44013214 0.0801631659 0.1205501245335563 0 +120 0 -2.431875 0.08077414 0.12150871514409342 0 +121 0 -2.50224543 0.07570092 0.11356834207574736 0 +122 1 10.23144 0.999964 5.1939695512002597E-05 1 +123 1 0.452518463 0.6112378 0.71019427344485664 1 +124 1 5.87042236 0.997186244 0.0040651143062878699 1 +125 0 -2.16523314 0.1029163 0.15668549713042432 0 +126 1 5.55969334 0.9961648 0.0055436631836815291 1 +127 0 -2.60329771 0.06892648 0.10303300888915028 0 +128 1 2.87807369 0.9467519 0.07894169481269693 1 +129 0 -4.29203844 0.0134924809 0.019598047692599548 0 +130 0 -2.56230116 0.0716044158 0.10718843415121884 0 +131 0 -2.49228716 0.07640065 0.11466094104662786 0 +132 1 11.527173 0.9999901 1.4274630640975531E-05 1 +133 0 -2.447955 0.0795882344 0.11964866931231606 0 +134 0 -2.709362 0.0624231733 0.092991182628501673 0 +135 0 -2.57368875 0.07085109 0.10601826253397174 0 +136 0 -2.546958 0.07263111 0.10878476978943961 0 +137 0 -2.253997 0.095005244 0.14401866240282399 0 +138 0 -2.52397871 0.0741941854 0.11121847131930589 0 +139 0 +140 0 -2.253997 0.095005244 0.14401866240282399 0 +141 0 -2.11052465 0.108078077 0.16501067045825779 0 +142 1 1.40640354 0.8031981 0.31617223990371063 1 +143 0 -1.8000406 0.14184612 0.22069172747506174 0 +144 0 -2.303132 0.0908639 0.1374318066173198 0 +145 0 +146 1 -0.608948231 0.352299154 1.5051270852918262 0 +147 0 -2.410581 0.08236938 0.12401456162100966 0 +148 0 -3.790462 0.0220863409 0.032221001014681734 0 +149 1 11.1856136 0.9999862 1.9950125438339949E-05 1 +150 0 -2.08552837 0.110511363 0.16895191862826214 0 +151 1 0.7081995 0.6700032 0.57776016109760775 1 +152 1 12.8261318 0.999997258 3.955606392614897E-06 1 +153 0 -2.22495723 0.0975316 0.14805168093637969 0 +154 0 -1.95639491 0.123857722 0.19076292420475424 0 +155 1 2.53439236 0.9265179 0.11010924008025842 1 +156 0 -2.179071 0.10164573 0.15464360520785025 0 +157 0 -2.49228716 0.07640065 0.11466094104662786 0 +158 0 +159 1 15.6741524 0.9999999 1.7198266111377426E-07 1 +160 1 9.474756 0.9999232 0.00011076107881739477 1 +161 0 -2.68982267 0.06357657 0.094767065231191869 0 +162 0 -2.60329771 0.06892648 0.10303300888915028 0 +163 0 -2.98970175 0.0478932858 0.070804811806733092 0 +164 0 +165 0 -2.566331 0.07133699 0.10677292670868219 0 +166 1 8.84706 0.999856234 0.00020742598774193681 1 +167 1 4.890644 0.992539465 0.010803626944692387 1 +168 0 -2.60329771 0.06892648 0.10303300888915028 0 +169 0 -1.76260591 0.146464273 0.22847655310970594 0 +170 0 -2.253997 0.095005244 0.14401866240282399 0 +171 0 -2.37061882 0.08544078 0.12885149942120921 0 +172 0 -2.16523314 0.1029163 0.15668549713042432 0 +173 1 22.0507126 1 0 1 +174 1 4.101033 0.9837141 0.023689008090051845 1 +175 1 8.803769 0.9998498 0.00021671441614871164 1 +176 0 -2.49228716 0.07640065 0.11466094104662786 0 +177 1 5.009384 0.9933693 0.0095979609700506362 1 +178 0 -2.70365119 0.06275825 0.09350687664921721 0 +179 1 -0.333506584 0.417387664 1.2605401318838831 0 +180 0 -2.08552837 0.110511363 0.16895191862826214 0 +181 0 -1.95639491 0.123857722 0.19076292420475424 0 +182 0 -2.87238669 0.0535355881 0.079379834832595766 0 +183 1 11.7801619 0.9999924 1.1006931643385188E-05 1 +184 1 4.80740261 0.991897166 0.011737536892369548 1 +185 0 -2.212134 0.09866614 0.14986650442098268 0 +186 1 5.877905 0.9972071 0.0040349327336088392 1 +187 1 12.8788414 0.9999975 3.6116401888020084E-06 1 +188 1 10.4632988 0.9999714 4.1276426673909545E-05 1 +189 0 -2.33616543 0.08817172 0.13316594116300465 0 +190 1 18.1290474 1 0 1 +191 1 13.2267113 0.9999982 2.5797420694119618E-06 1 +192 0 -2.652885 0.06581142 0.098214282791589516 0 +193 0 -2.37061882 0.08544078 0.12885149942120921 0 +194 0 -2.60329771 0.06892648 0.10303300888915028 0 +195 0 -2.70365119 0.06275825 0.09350687664921721 0 +196 0 4.31835938 0.986853361 6.249162189120602 1 +197 0 -2.78983569 0.0578759126 0.086011004864571042 0 +198 0 -1.95639491 0.123857722 0.19076292420475424 0 +199 0 -2.43037367 0.08088568 0.12168377661511501 0 +200 1 11.15968 0.9999858 2.0466080617959804E-05 1 +201 1 8.401458 0.999775469 0.00032396569438284837 1 +202 0 -2.37061882 0.08544078 0.12885149942120921 0 +203 0 -2.79334736 0.0576847345 0.085718279282943594 0 +204 0 -2.37061882 0.08544078 0.12885149942120921 0 +205 1 17.8429222 1 0 1 +206 1 6.46274567 0.998442 0.0022494800623383254 1 +207 0 -2.08552837 0.110511363 0.16895191862826214 0 +208 0 -2.08552837 0.110511363 0.16895191862826214 0 +209 0 -2.52800727 0.07391794 0.11078805913818714 0 +210 1 21.9436874 1 0 1 +211 1 13.0268564 0.999997854 3.0956910368479058E-06 1 +212 0 -2.37061882 0.08544078 0.12885149942120921 0 +213 1 22.5284481 1 0 1 +214 1 20.4712334 1 0 1 +215 1 8.525514 0.9998017 0.00028612151026144098 1 +216 0 -2.16523314 0.1029163 0.15668549713042432 0 +217 0 -2.37061882 0.08544078 0.12885149942120921 0 +218 1 9.455612 0.9999218 0.00011282503055519205 1 +219 0 -2.714654 0.0621141754 0.092515790827243469 0 +220 0 -2.43490982 0.08054909 0.12115554621880931 0 +221 1 9.159876 0.999894857 0.00015169667309156297 1 +222 1 -1.80774 0.14091149 2.8271388431147284 0 +223 1 3.70435333 0.9759753 0.035083495285141632 1 +224 1 9.788629 0.999944 8.0834110428232468E-05 1 +225 0 -2.16523314 0.1029163 0.15668549713042432 0 +226 1 10.3669252 0.9999685 4.5404134294015166E-05 1 +227 1 8.810473 0.999850869 0.00021516634059471509 1 +228 0 -2.08552837 0.110511363 0.16895191862826214 0 +229 1 17.6545982 1 0 1 +230 1 4.3147707 0.9868068 0.019160423251940339 1 +231 1 9.426738 0.9999194 0.00011626495667983538 1 +232 0 -0.812353134 0.3073893 0.52988339666190787 0 +233 1 3.34824562 0.9660473 0.049834285709967709 1 +234 0 -2.38382244 0.08441466 0.12723373315285244 0 +235 0 +236 1 10.7871552 0.9999794 2.9753305404609972E-05 1 +237 1 6.06969929 0.9976935 0.0033314498282712543 1 +238 1 16.8129368 1 0 1 +239 1 2.5463686 0.9273292 0.10884653830325543 1 +240 0 -2.16806126 0.102655485 0.15626611390641998 0 +241 0 -2.40176368 0.08303831 0.12506663099210433 0 +242 0 -2.49228716 0.07640065 0.11466094104662786 0 +243 0 -2.34700274 0.0873043 0.13179416296824689 0 +244 0 -2.37061882 0.08544078 0.12885149942120921 0 +245 0 -2.65912771 0.06542865 0.097623286813018989 0 +246 1 17.1139336 1 0 1 +247 1 1.33216 0.7911977 0.33788983133296008 1 +248 0 -2.59526634 0.0694436952 0.10383464946038788 0 +249 0 +250 0 -2.00470734 0.118709572 0.18231055874000973 0 +251 1 6.54015732 0.998557866 0.0020820617863629202 1 +252 0 2.0749712 0.8884466 3.1641939848631071 1 +253 1 8.853592 0.9998572 0.00020604992936022588 1 +254 1 6.41300774 0.9983626 0.0023642038022797952 1 +255 1 3.7826376 0.977744043 0.032471253848047714 1 +256 0 -2.253997 0.095005244 0.14401866240282399 0 +257 0 -2.43037367 0.08088568 0.12168377661511501 0 +258 0 -2.60329771 0.06892648 0.10303300888915028 0 +259 0 2.46353149 0.9215453 3.6719968033606416 1 +260 1 8.69649 0.999832869 0.0002411398280924362 1 +261 1 14.626255 0.9999995 6.8793076746672365E-07 1 +262 1 11.909255 0.9999933 9.6310605954860058E-06 1 +263 1 7.177536 0.999237061 0.0011011090587247259 1 +264 1 3.13080788 0.958145857 0.061682803281407773 1 +265 0 -2.517743 0.0746236444 0.111887857908842 0 +266 1 7.81477261 0.9995964 0.00058236478868097896 1 +267 1 0.570395947 0.638854563 0.64644055930061062 1 +268 1 7.142889 0.9992101 0.0011400073388397399 1 +269 0 -2.37061882 0.08544078 0.12885149942120921 0 +270 1 5.226963 0.9946589 0.0077262484789402371 1 +271 0 -2.79334736 0.0576847345 0.085718279282943594 0 +272 1 0.570395947 0.638854563 0.64644055930061062 1 +273 1 -1.541533 0.176312521 2.5037931614232587 0 +274 0 -2.60472631 0.06883486 0.10289105134144588 0 +275 0 +276 0 -2.43037367 0.08088568 0.12168377661511501 0 +277 0 -2.16523314 0.1029163 0.15668549713042432 0 +278 0 -2.37061882 0.08544078 0.12885149942120921 0 +279 1 3.33338261 0.9655565 0.050567409752020474 1 +280 0 -2.60329771 0.06892648 0.10303300888915028 0 +281 0 -2.54244328 0.0729358 0.10925884045202583 0 +282 1 3.29053974 0.964102864 0.052741012904588061 1 +283 1 3.700367 0.9758816 0.035222007864660711 1 +284 1 7.36733246 0.999368846 0.00091084961823976909 1 +285 1 20.352438 1 0 1 +286 1 21.9562721 1 0 1 +287 0 -2.709362 0.0624231733 0.092991182628501673 0 +288 1 -0.586700439 0.357392281 1.4844196184802794 0 +289 1 8.823527 0.9998528 0.0002124142103781059 1 +290 0 -1.95639491 0.123857722 0.19076292420475424 0 +291 0 -2.37061882 0.08544078 0.12885149942120921 0 +292 1 +293 1 3.77584267 0.9775957 0.032690174791706848 1 +294 0 +295 1 6.63497543 0.998688161 0.0018938255499461618 1 +296 0 0.0507936478 0.51269567 1.0371050534420929 1 +297 0 +298 0 -3.44531822 0.0309087858 0.045295631375104138 0 +299 1 3.52736 0.971456349 0.041778923210622917 1 +300 1 6.63810539 0.9986922 0.00188797047076344 1 +301 0 -2.37061882 0.08544078 0.12885149942120921 0 +302 1 21.63637 1 0 1 +303 0 -2.37061882 0.08544078 0.12885149942120921 0 +304 1 3.82702637 0.97868973 0.031076534032479262 1 +305 1 9.007427 0.999877453 0.00017680899902768678 1 +306 0 -2.37061882 0.08544078 0.12885149942120921 0 +307 0 -2.37061882 0.08544078 0.12885149942120921 0 +308 1 6.49249649 0.9984875 0.0021837677951713447 1 +309 0 -2.367922 0.08565173 0.12918431538000874 0 +310 0 -2.58705831 0.06997599 0.10466012826020632 0 +311 0 -1.95639491 0.123857722 0.19076292420475424 0 +312 1 0.721348763 0.672903955 0.571527494298949 1 +313 0 -1.95639491 0.123857722 0.19076292420475424 0 +314 0 -1.876097 0.132837832 0.20562627776187412 0 +315 0 +316 1 1.90932846 0.870943666 0.19934868964045313 1 +317 1 11.0919495 0.999984741 2.2013947263955502E-05 1 +318 0 -3.22425485 0.0382631 0.056285823149524759 0 +319 0 -0.5100851 0.375173569 0.67847261153874627 0 +320 1 3.40061569 0.9677238 0.047332770769414431 1 +321 0 +322 0 -2.60329771 0.06892648 0.10303300888915028 0 +323 1 4.2277 0.985623837 0.020890948016973505 1 +324 0 -2.37061882 0.08544078 0.12885149942120921 0 +325 0 -2.33610034 0.08817695 0.13317421658132386 0 +326 1 0.397289276 0.59803617 0.74169535175171442 1 +327 0 -2.16523314 0.1029163 0.15668549713042432 0 +328 1 3.29097939 0.964118063 0.052718268842774099 1 +329 1 4.33795357 0.98710525 0.018724174263564545 1 +330 1 2.89053345 0.947376549 0.077990134080806572 1 +331 0 -2.99748755 0.0475395061 0.070268841071409238 0 +332 0 -2.44493961 0.0798094 0.11999537191367729 0 +333 1 3.38947582 0.967374 0.047854291800112088 1 +334 1 5.177353 0.994388759 0.0081181070550104366 1 +335 0 -1.95639491 0.123857722 0.19076292420475424 0 +336 1 4.698082 0.9909696 0.013087296874456903 1 +337 0 -2.37061882 0.08544078 0.12885149942120921 0 +338 0 -1.876097 0.132837832 0.20562627776187412 0 +339 1 4.343502 0.987175643 0.018621295533697572 1 +340 1 3.39017 0.9673959 0.047821668989543743 1 +341 0 -2.37061882 0.08544078 0.12885149942120921 0 +342 0 -2.11052465 0.108078077 0.16501067045825779 0 +343 0 -1.95639491 0.123857722 0.19076292420475424 0 +344 1 7.7177906 0.9995553 0.00064172398023939646 1 +345 0 -1.95639491 0.123857722 0.19076292420475424 0 +346 0 -2.565462 0.07139457 0.10686237809729705 0 +347 0 -1.79727888 0.142182633 0.22125757090956827 0 +348 1 -1.28854942 0.216098443 2.2102394195203448 0 +349 1 1.21367073 0.770947754 0.37529500004713245 1 +350 0 -2.57519341 0.0707521 0.10586457082203461 0 +351 0 -2.49228716 0.07640065 0.11466094104662786 0 +352 0 -1.23204327 0.225824 0.36926650823776686 0 +353 1 11.2146692 0.9999865 1.9434170443242565E-05 1 +354 0 -2.16523314 0.1029163 0.15668549713042432 0 +355 0 -2.8185854 0.0563280769 0.083642715320436059 0 +356 1 -2.201137 0.09964843 3.3270091010964316 0 +357 1 14.1900883 0.9999993 1.031896274211761E-06 1 +358 1 5.223918 0.9946426 0.0077498503631306228 1 +359 1 2.35608578 0.9134167 0.13065495391893572 1 +360 1 21.4813557 1 0 1 +361 1 5.294572 0.9950063 0.0072224014614089942 1 +362 0 -2.63699365 0.06679519 0.099734355600720456 0 +363 0 -1.5586791 0.173836261 0.27550035442459786 0 +364 0 -2.49228716 0.07640065 0.11466094104662786 0 +365 0 -2.303132 0.0908639 0.1374318066173198 0 +366 1 19.947937 1 0 1 +367 1 15.1915445 0.999999762 3.4396534272948301E-07 1 +368 0 -2.03972268 0.115094975 0.17640547222344355 0 +369 0 -1.93949687 0.125703141 0.19380487905648439 0 +370 0 -2.61506629 0.0681750551 0.10186914304032915 0 +371 0 -2.03972268 0.115094975 0.17640547222344355 0 +372 0 -2.52397871 0.0741941854 0.11121847131930589 0 +373 0 -2.67554665 0.06443181 0.096085283332132315 0 +374 0 -2.4251883 0.08127202 0.12229032950777963 0 +375 0 -1.95639491 0.123857722 0.19076292420475424 0 +376 0 -2.16523314 0.1029163 0.15668549713042432 0 +377 0 -1.876097 0.132837832 0.20562627776187412 0 +378 0 -2.79220486 0.0577468649 0.085813404732194079 0 +379 0 -2.74447179 0.06039962 0.089880800720694584 0 +380 0 -1.95639491 0.123857722 0.19076292420475424 0 +381 1 8.746121 0.999841 0.00022944310035113074 1 +382 0 -2.4639585 0.07842376 0.11782457436958683 0 +383 0 -2.11052465 0.108078077 0.16501067045825779 0 +384 0 -2.11052465 0.108078077 0.16501067045825779 0 +385 0 -2.79314542 0.05769571 0.085735081775246871 0 +386 1 4.176774 0.984884 0.021974246797932556 1 +387 0 -2.563189 0.0715454146 0.10709675129529037 0 +388 0 -2.33597 0.08818744 0.13319081471442681 0 +389 0 -2.77166653 0.0588746034 0.087541132766088936 0 +390 0 -2.24443483 0.09583059 0.14533498514227941 0 +391 1 12.28669 0.999995351 6.7073389754153415E-06 1 +392 0 -2.43037367 0.08088568 0.12168377661511501 0 +393 0 -1.663213 0.159331158 0.25039049156336257 0 +394 0 -2.18103456 0.101466566 0.15435590868043605 0 +395 0 -2.43037367 0.08088568 0.12168377661511501 0 +396 0 -2.60329771 0.06892648 0.10303300888915028 0 +397 0 -2.386812 0.0841838941 0.12687015785045277 0 +398 0 -2.39560652 0.0835083351 0.12580633468481714 0 +399 0 -2.0224514 0.116865739 0.17929531088912914 0 +400 1 9.442846 0.9999207 0.00011437299629627494 1 +401 0 -2.253997 0.095005244 0.14401866240282399 0 +402 0 -2.32173133 0.0893391 0.13501415250433074 0 +403 0 -2.04644132 0.114412457 0.17529316569822423 0 +404 0 -2.143785 0.104913421 0.15990085822156069 0 +405 0 -2.16523314 0.1029163 0.15668549713042432 0 +406 0 -2.44775438 0.07960292 0.11967168757719346 0 +407 0 -2.16523314 0.1029163 0.15668549713042432 0 +408 0 -2.22424483 0.09759433 0.14815195953491689 0 +409 0 -2.4251883 0.08127202 0.12229032950777963 0 +410 0 -2.16523314 0.1029163 0.15668549713042432 0 +411 0 +412 1 10.2703123 0.9999653 5.0047819483104426E-05 1 +413 0 -2.73679447 0.0608368 0.090552214775961787 0 +414 1 5.42697239 0.9956228 0.0063288062748059282 1 +415 0 -1.37955284 0.201080829 0.32387854587592818 0 +416 1 7.32360268 0.9993406 0.00095163582501576051 1 +417 0 -2.16523314 0.1029163 0.15668549713042432 0 +418 0 -2.48652363 0.07680834 0.11529790529919315 0 +419 0 -2.92190623 0.05108122 0.075643488086837282 0 +420 0 -2.17014742 0.102463476 0.15595744686821872 0 +421 1 14.1832743 0.9999993 1.031896274211761E-06 1 +422 0 -2.21935058 0.09802621 0.14884258107085416 0 +423 0 -2.56230116 0.0716044158 0.10718843415121884 0 +424 0 -2.253997 0.095005244 0.14401866240282399 0 +425 1 23.2536659 1 0 1 +426 0 -1.97403908 0.121955715 0.18763438978981944 0 +427 1 3.93143272 0.9807618 0.028025268445269182 1 +428 0 -2.16523314 0.1029163 0.15668549713042432 0 +429 0 -2.303132 0.0908639 0.1374318066173198 0 +430 0 -2.1786294 0.10168606 0.15470837385047881 0 +431 0 -3.24330187 0.0375683233 0.055243967912172835 0 +432 0 -2.63995266 0.06661098 0.099449594195521407 0 +433 0 -2.278904 0.09288526 0.14064305278762584 0 +434 0 4.94386959 0.9929235 7.1427479209872091 1 +435 1 7.12867451 0.999198854 0.0011562726386102314 1 +436 1 4.3324194 0.9870346 0.018827408813728724 1 +437 0 -2.386812 0.0841838941 0.12687015785045277 0 +438 0 -2.38723946 0.08415094 0.12681824612014014 0 +439 0 -2.50897 0.07523173 0.11283619840279428 0 +440 1 6.34583759 0.998249054 0.0025282952766864627 1 +441 0 -1.81499052 0.140036061 0.21765193123843524 0 +442 0 -2.020601 0.117056854 0.17960755137882647 0 +443 0 -1.93714356 0.125962 0.19423209736428568 0 +444 0 -2.91968775 0.0511888638 0.075807152007862255 0 +445 0 -2.11052465 0.108078077 0.16501067045825779 0 +446 0 -1.95639491 0.123857722 0.19076292420475424 0 +447 0 -2.50897 0.07523173 0.11283619840279428 0 +448 0 -1.663213 0.159331158 0.25039049156336257 0 +449 1 13.44416 0.999998569 2.0637932864940443E-06 1 +450 0 -2.347867 0.08723546 0.13168534659555281 0 +451 0 -2.50897 0.07523173 0.11283619840279428 0 +452 0 -2.37676024 0.08496209 0.12809658311879946 0 +453 1 7.50886631 0.999452055 0.00079073491429955357 1 +454 0 -2.37708616 0.08493676 0.12805664400028163 0 +455 1 -1.54050016 0.176462576 2.5025658459084399 0 +456 1 10.2714491 0.9999654 4.9875830876224796E-05 1 +457 1 9.928566 0.999951243 7.0342619050273796E-05 1 +458 0 -2.483977 0.07698911 0.11558042055485453 0 +459 0 -2.44994617 0.0794424862 0.11942023498557051 0 +460 0 -2.57519341 0.0707521 0.10586457082203461 0 +461 0 -1.95080662 0.124465436 0.19176396054905676 0 +462 0 -2.65842414 0.06547169 0.097689720656269172 0 +463 0 -2.40528941 0.0827702358 0.12464492366430695 0 +464 0 -2.386812 0.0841838941 0.12687015785045277 0 +465 1 11.50494 0.999989867 1.4618599387059818E-05 1 +466 1 8.586574 0.9998135 0.00026909195127407725 1 +467 1 6.92544365 0.999018431 0.0014168006049970199 1 +468 0 -2.386812 0.0841838941 0.12687015785045277 0 +469 0 -2.1956358 0.100143082 0.15223247204165077 0 +470 0 -2.15111279 0.104227282 0.15879536747436127 0 +471 0 -2.65842414 0.06547169 0.097689720656269172 0 +472 0 -2.35197687 0.0869087651 0.13116907530431268 0 +473 0 -2.386812 0.0841838941 0.12687015785045277 0 +474 0 -2.50897 0.07523173 0.11283619840279428 0 +475 0 -2.253997 0.095005244 0.14401866240282399 0 +476 0 -2.379613 0.08474059 0.12774738819728162 0 +477 0 -2.386812 0.0841838941 0.12687015785045277 0 +478 0 -2.45095563 0.0793686956 0.11930459528595055 0 +479 1 9.896286 0.9999497 7.2578504258149067E-05 1 +480 0 -2.23553848 0.09660421 0.14656990931584829 0 +481 0 -2.2461 0.0956864059 0.14510494370298066 0 +482 1 19.90526 1 0 1 +483 1 13.2226048 0.9999982 2.5797420694119618E-06 1 +484 0 -2.483977 0.07698911 0.11558042055485453 0 +485 0 -1.75304985 0.147662938 0.23050402825087019 0 +486 0 -2.15111279 0.104227282 0.15879536747436127 0 +487 1 16.2562943 0.9999999 1.7198266111377426E-07 1 +488 1 0.896533 0.710236549 0.49362849030318379 1 +489 1 -2.11052513 0.108078033 3.2098547752295934 0 +490 0 -1.95639491 0.123857722 0.19076292420475424 0 +491 1 6.42460346 0.9983815 0.0023369001030092021 1 +492 0 -2.27263451 0.09341486 0.14148557773460221 0 +493 1 13.9223871 0.999999046 1.3758618629646341E-06 1 +494 0 -1.544085 0.175942212 0.27918258388346984 0 +495 0 -2.15111279 0.104227282 0.15879536747436127 0 +496 0 -1.663213 0.159331158 0.25039049156336257 0 +497 0 -2.34868431 0.08717041 0.13158253208596138 0 +498 0 -2.546958 0.07263111 0.10878476978943961 0 +499 0 -2.546958 0.07263111 0.10878476978943961 0 +500 0 -2.87238669 0.0535355881 0.079379834832595766 0 +501 0 -2.546958 0.07263111 0.10878476978943961 0 +502 0 -2.58375478 0.07019129 0.10499414907116332 0 +503 0 -2.70365119 0.06275825 0.09350687664921721 0 +504 0 -1.95639491 0.123857722 0.19076292420475424 0 +505 0 -2.207967 0.09903733 0.15046075844804158 0 +506 1 13.1352835 0.999998 2.9237080272005804E-06 1 +507 0 -1.85896659 0.134823546 0.20893369205937654 0 +508 0 -2.50897 0.07523173 0.11283619840279428 0 +509 0 -2.11052465 0.108078077 0.16501067045825779 0 +510 0 -1.95639491 0.123857722 0.19076292420475424 0 +511 0 -2.652885 0.06581142 0.098214282791589516 0 +512 0 -2.50897 0.07523173 0.11283619840279428 0 +513 0 -2.15111279 0.104227282 0.15879536747436127 0 +514 1 13.1494493 0.9999981 2.751725038055267E-06 1 +515 1 11.2234116 0.999986649 1.926218548588174E-05 1 +516 0 -1.663213 0.159331158 0.25039049156336257 0 +517 0 -1.876097 0.132837832 0.20562627776187412 0 +518 0 -2.3127768 0.09007031 0.1361730175390829 0 +519 1 4.88246536 0.9924787 0.010891913451001586 1 +520 0 -2.249304 0.09540951 0.14466326997414256 0 +521 0 -2.66490865 0.0650760457 0.097079072351726234 0 +522 1 2.02141762 0.883027554 0.17946963916334691 1 +523 1 6.809782 0.998898268 0.0015903398846003496 1 +524 0 -2.43037367 0.08088568 0.12168377661511501 0 +525 0 -2.31983972 0.08949312 0.13525817349750544 0 +526 0 -2.386812 0.0841838941 0.12687015785045277 0 +527 0 -2.70365119 0.06275825 0.09350687664921721 0 +528 0 -2.51398182 0.0748837963 0.11229350114078318 0 +529 0 -2.27263451 0.09341486 0.14148557773460221 0 +530 1 4.92369843 0.992780268 0.010453653133861311 1 +531 0 -2.44775438 0.07960292 0.11967168757719346 0 +532 0 -2.08552837 0.110511363 0.16895191862826214 0 +533 0 -2.43037367 0.08088568 0.12168377661511501 0 +534 0 -2.303132 0.0908639 0.1374318066173198 0 +535 0 -2.41980267 0.08167506 0.12292336799782667 0 +536 0 -2.79334736 0.0576847345 0.085718279282943594 0 +537 0 -2.73679447 0.0608368 0.090552214775961787 0 +538 0 -2.546958 0.07263111 0.10878476978943961 0 +539 0 -2.74815464 0.0601909533 0.089560439570368855 0 +540 0 -2.543486 0.0728653148 0.10914915993929039 0 +541 0 -2.253997 0.095005244 0.14401866240282399 0 +542 0 -2.38339472 0.08444773 0.12728583594126508 0 +543 0 -2.546958 0.07263111 0.10878476978943961 0 +544 0 -2.34906387 0.08714021 0.13153480725866068 0 +545 0 -2.652885 0.06581142 0.098214282791589516 0 +546 1 18.4379044 1 0 1 +547 0 -1.82228041 0.139160469 0.21618376511481502 0 +548 0 -1.97069025 0.122314766 0.18822445904268387 0 +549 1 5.37553024 0.9953929 0.0066619714409914422 1 +550 0 -2.43037367 0.08088568 0.12168377661511501 0 +551 0 -2.37061882 0.08544078 0.12885149942120921 0 +552 0 -2.567891 0.07123372 0.10661249990663338 0 +553 0 -1.67024612 0.158391356 0.24877857334123982 0 +554 0 -2.253997 0.095005244 0.14401866240282399 0 +555 0 -2.15087152 0.104249813 0.15883165472574934 0 +556 0 -2.25254679 0.09513001 0.14421757377759611 0 +557 0 -2.57519341 0.0707521 0.10586457082203461 0 +558 0 -2.303132 0.0908639 0.1374318066173198 0 +559 0 -2.652885 0.06581142 0.098214282791589516 0 +560 0 -2.79334736 0.0576847345 0.085718279282943594 0 +561 0 -2.79334736 0.0576847345 0.085718279282943594 0 +562 0 -2.37061882 0.08544078 0.12885149942120921 0 +563 0 -2.43037367 0.08088568 0.12168377661511501 0 +564 0 -2.68982267 0.06357657 0.094767065231191869 0 +565 1 16.7462845 1 0 1 +566 0 -2.58233213 0.07028419 0.10513830229728056 0 +567 0 -2.35164356 0.08693522 0.13121087830396089 0 +568 1 1.66488457 0.840892553 0.25000662577655486 1 +569 1 11.8811359 0.9999931 9.9750282344474815E-06 1 +570 1 6.743778 0.9988232 0.001698726443122326 1 +571 1 13.4375887 0.999998569 2.0637932864940443E-06 1 +572 0 -2.43037367 0.08088568 0.12168377661511501 0 +573 0 -2.16523314 0.1029163 0.15668549713042432 0 +574 1 5.289529 0.9949812 0.0072587859583563598 1 +575 0 -2.73679447 0.0608368 0.090552214775961787 0 +576 0 -2.652885 0.06581142 0.098214282791589516 0 +577 0 -2.16523314 0.1029163 0.15668549713042432 0 +578 0 -2.16523314 0.1029163 0.15668549713042432 0 +579 0 -2.37061882 0.08544078 0.12885149942120921 0 +580 0 -2.61211181 0.06836298 0.10216012821346472 0 +581 1 9.491055 0.9999244 0.00010904112129145599 1 +582 1 10.5543289 0.9999739 3.7664692194035506E-05 1 +583 0 -2.253997 0.095005244 0.14401866240282399 0 +584 0 -2.854372 0.0544557646 0.080783141512571238 0 +585 0 -1.95639491 0.123857722 0.19076292420475424 0 +586 1 22.14612 1 0 1 +587 0 -2.63995266 0.06661098 0.099449594195521407 0 +588 1 4.183667 0.984986365 0.021824341396277779 1 +589 0 -2.50897 0.07523173 0.11283619840279428 0 +590 1 2.24761486 0.904444635 0.14489590312889089 1 +591 1 5.37478161 0.995389462 0.0066669820307222651 1 +592 1 2.52463913 0.925851166 0.11114780094090568 1 +593 0 -2.483977 0.07698911 0.11558042055485453 0 +594 1 3.883813 0.9798425 0.029378249558157231 1 +595 0 -2.652885 0.06581142 0.098214282791589516 0 +596 0 -2.52397871 0.0741941854 0.11121847131930589 0 +597 0 -2.67120314 0.06469413 0.096489851264687398 0 +598 0 -2.43037367 0.08088568 0.12168377661511501 0 +599 0 -2.042253 0.114837505 0.17598577040139771 0 +600 0 -2.43037367 0.08088568 0.12168377661511501 0 +601 0 -1.876097 0.132837832 0.20562627776187412 0 +602 0 -2.546958 0.07263111 0.10878476978943961 0 +603 1 2.76534462 0.9407741 0.088079778169719514 1 +604 1 1.64908409 0.8387672 0.25365769899634338 1 +605 1 9.463315 0.9999224 0.00011196505030560377 1 +606 0 -2.43851948 0.08028216 0.12073676854570529 0 +607 0 -1.95639491 0.123857722 0.19076292420475424 0 +608 1 13.1060286 0.999998 2.9237080272005804E-06 1 +609 0 -2.50897 0.07523173 0.11283619840279428 0 +610 1 5.4565506 0.995749831 0.0061447648647644489 1 +611 1 8.201106 0.999725759 0.00039570034941416836 1 +612 1 24.51187 1 0 1 +613 0 -2.25948548 0.0945344046 0.14326827011600504 0 +614 0 -2.0189333 0.117229328 0.1798893939370643 0 +615 0 -2.491962 0.0764236 0.11469678675361461 0 +616 0 -2.43037367 0.08088568 0.12168377661511501 0 +617 0 +618 0 -2.546958 0.07263111 0.10878476978943961 0 +619 0 -2.652885 0.06581142 0.098214282791589516 0 +620 0 -2.43037367 0.08088568 0.12168377661511501 0 +621 0 -2.19200563 0.100470684 0.15275779542018131 0 +622 0 -2.700953 0.06291714 0.093751478225403542 0 +623 0 -1.95639491 0.123857722 0.19076292420475424 0 +624 0 -2.41144156 0.0823043659 0.1239123508690735 0 +625 0 -2.19398546 0.1002919 0.15247108397309578 0 +626 1 3.657977 0.9748635 0.03672782424977717 1 +627 0 -1.88075233 0.1323025 0.20473591051784815 0 +628 0 -2.11052465 0.108078077 0.16501067045825779 0 +629 0 -2.386812 0.0841838941 0.12687015785045277 0 +630 0 -2.40915632 0.08247714 0.12418398785058164 0 +631 0 -2.652885 0.06581142 0.098214282791589516 0 +632 0 -1.95639491 0.123857722 0.19076292420475424 0 +633 1 3.20818138 0.961141 0.057180018700639101 1 +634 0 -2.253997 0.095005244 0.14401866240282399 0 +635 0 -2.25866842 0.09460436 0.14337973262597348 0 +636 1 11.0438576 0.999984 2.3045859283900738E-05 1 +637 0 -2.06156754 0.112888753 0.17281306044669567 0 +638 0 -2.386812 0.0841838941 0.12687015785045277 0 +639 0 -2.57519341 0.0707521 0.10586457082203461 0 +640 0 -2.48130536 0.07717918 0.11587753928641568 0 +641 0 -2.43037367 0.08088568 0.12168377661511501 0 +642 0 -2.43037367 0.08088568 0.12168377661511501 0 +643 0 -1.95639491 0.123857722 0.19076292420475424 0 +644 0 -2.11052465 0.108078077 0.16501067045825779 0 +645 0 -2.43037367 0.08088568 0.12168377661511501 0 +646 0 -2.00470734 0.118709572 0.18231055874000973 0 +647 0 -2.135698 0.105675265 0.16112931691390375 0 +648 1 13.45014 0.999998569 2.0637932864940443E-06 1 +649 0 -2.43037367 0.08088568 0.12168377661511501 0 +650 0 -2.31990623 0.0894877 0.13524959098307188 0 +651 0 -2.28205872 0.09261979 0.14022090268098497 0 +652 0 -2.63995266 0.06661098 0.099449594195521407 0 +653 0 -2.546958 0.07263111 0.10878476978943961 0 +654 0 -2.60329771 0.06892648 0.10303300888915028 0 +655 0 -2.43037367 0.08088568 0.12168377661511501 0 +656 0 -2.652885 0.06581142 0.098214282791589516 0 +657 0 -2.3856678 0.0842721462 0.12700918908215508 0 +658 1 9.13554 0.999892235 0.00015548069423433847 1 +659 0 -1.95639491 0.123857722 0.19076292420475424 0 +660 0 -2.16523314 0.1029163 0.15668549713042432 0 +661 0 -2.70365119 0.06275825 0.09350687664921721 0 +662 0 -2.21700072 0.09823417 0.14917524963571913 0 +663 0 -2.21700072 0.09823417 0.14917524963571913 0 +664 0 -2.52331543 0.07423976 0.11128949348681842 0 +665 0 -1.95639491 0.123857722 0.19076292420475424 0 +666 0 -2.6012094 0.06906062 0.10324087369927021 0 +667 0 -2.60329771 0.06892648 0.10303300888915028 0 +668 1 0.230495453 0.557370067 0.84329256977903522 1 +669 1 11.8682785 0.999992967 1.0147012084681539E-05 1 +670 1 7.613348 0.9995065 0.00071218392983748437 1 +671 0 -2.56594157 0.071362786 0.10681299857820942 0 +672 0 -2.49228716 0.07640065 0.11466094104662786 0 +673 0 -2.57178926 0.07097623 0.10621258116698419 0 +674 0 -2.16523314 0.1029163 0.15668549713042432 0 +675 0 -2.33810186 0.08801616 0.13291983400253021 0 +676 0 -2.1956358 0.100143082 0.15223247204165077 0 +677 0 -2.50897 0.07523173 0.11283619840279428 0 +678 0 -1.95639491 0.123857722 0.19076292420475424 0 +679 0 -2.11052465 0.108078077 0.16501067045825779 0 +680 1 25.43999 1 0 1 +681 1 14.1827745 0.9999993 1.031896274211761E-06 1 +682 0 -2.7642622 0.05928621 0.088172242863683387 0 +683 0 -1.95639491 0.123857722 0.19076292420475424 0 +684 0 -1.95639491 0.123857722 0.19076292420475424 0 +685 0 -1.95639491 0.123857722 0.19076292420475424 0 +686 0 -1.95639491 0.123857722 0.19076292420475424 0 +687 0 -2.46161175 0.07859354 0.11809037777838542 0 +688 0 -2.386812 0.0841838941 0.12687015785045277 0 +689 0 -3.64467454 0.0254645254 0.037213392183878896 0 +690 0 -2.135698 0.105675265 0.16112931691390375 0 +691 1 5.792588 0.9969592 0.0043936168831631463 1 +692 0 -2.253997 0.095005244 0.14401866240282399 0 +693 0 -2.65598679 0.06562097 0.097920204018736551 0 +694 0 -2.47353578 0.0777343661 0.11674575467283718 0 +695 0 -2.11052465 0.108078077 0.16501067045825779 0 +696 1 7.72577858 0.999558866 0.00063656221445328599 1 +697 1 3.85642529 0.97929436 0.030185519608588427 1 +698 1 5.01899147 0.993432164 0.009506637452477578 1 diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart-out.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart-out.txt new file mode 100644 index 0000000000..44635aa70a --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart-out.txt @@ -0,0 +1,65 @@ +maml.exe CV tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3702 (134.0/(134.0+228.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 128 | 6 | 0.9552 + negative || 10 | 218 | 0.9561 + ||====================== +Precision || 0.9275 | 0.9732 | +OVERALL 0/1 ACCURACY: 0.955801 +LOG LOSS/instance: 0.301908 +Test-set entropy (prior Log-Loss/instance): 0.950799 +LOG-LOSS REDUCTION (RIG): 68.246963 +AUC: 0.982473 +TEST POSITIVE RATIO: 0.3175 (107.0/(107.0+230.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 100 | 7 | 0.9346 + negative || 8 | 222 | 0.9652 + ||====================== +Precision || 0.9259 | 0.9694 | +OVERALL 0/1 ACCURACY: 0.955490 +LOG LOSS/instance: 0.290926 +Test-set entropy (prior Log-Loss/instance): 0.901650 +LOG-LOSS REDUCTION (RIG): 67.734017 +AUC: 0.992076 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.987274 (0.0048) +Accuracy: 0.955645 (0.0002) +Positive precision: 0.926731 (0.0008) +Positive recall: 0.944902 (0.0103) +Negative precision: 0.971323 (0.0019) +Negative recall: 0.960679 (0.0045) +Log-loss: 0.296417 (0.0055) +Log-loss reduction: 67.990490 (0.2565) +F1 Score: 0.935705 (0.0055) +AUPRC: 0.969894 (0.0121) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart-rp.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart-rp.txt new file mode 100644 index 0000000000..e91ca11d6f --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.987274 0.955645 0.926731 0.944902 0.971323 0.960679 0.296417 67.99049 0.935705 0.969894 10 0.2 20 10 dart 1 LightGBM %Data% %Output% 99 0 0 maml.exe CV tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:dart;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart.txt new file mode 100644 index 0000000000..d69c5c6cb2 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-CV-breast-cancer.dart.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +5 1 3.77653313 0.868557751 0.20330631668376986 1 +6 0 -2.74509573 0.202208519 0.32591637677515645 0 +8 0 -4.4950676 0.0955624059 0.14490713407046754 0 +9 0 -4.4950676 0.0955624059 0.14490713407046754 0 +10 0 -3.95260167 0.12171372 0.18723682820261706 0 +11 0 -4.4950676 0.0955624059 0.14490713407046754 0 +18 1 3.28788471 0.8380707 0.25485615558954922 1 +20 1 -0.3835451 0.452203244 1.1449567532979168 0 +21 1 3.795565 0.86964035 0.20150921352918599 1 +25 1 2.431195 0.771287858 0.37465869453483419 1 +28 0 -4.4950676 0.0955624059 0.14490713407046754 0 +31 0 -4.4950676 0.0955624059 0.14490713407046754 0 +32 1 3.795565 0.86964035 0.20150921352918599 1 +35 0 -4.4950676 0.0955624059 0.14490713407046754 0 +37 0 -3.2884233 0.1618928 0.25479331060492399 0 +40 0 3.71898818 0.865237951 2.8915138285634061 1 +41 1 2.85972857 0.8068802 0.30957364967249296 1 +44 1 2.818191 0.803623259 0.31540877464917566 1 +45 0 -4.4950676 0.0955624059 0.14490713407046754 0 +46 1 3.64076519 0.860612035 0.2165650798143455 1 +48 0 -4.4950676 0.0955624059 0.14490713407046754 0 +50 1 -0.241797015 0.469812125 1.089844147810425 0 +51 1 0.876064658 0.607790053 0.71835503102185272 1 +52 1 3.17948556 0.830579937 0.26780907245677338 1 +54 1 3.43507361 0.8478113 0.238184930668183 1 +56 1 2.81186 0.803123236 0.31630671499593227 1 +60 1 1.62435508 0.6925733 0.52996130624785442 1 +63 1 0.6347586 0.578685462 0.78914869318271175 1 +64 0 -4.4950676 0.0955624059 0.14490713407046754 0 +66 0 -4.4950676 0.0955624059 0.14490713407046754 0 +68 1 2.81988215 0.803756654 0.31516931839473161 1 +69 0 -4.4950676 0.0955624059 0.14490713407046754 0 +70 0 -4.10267258 0.113917425 0.17448694396780215 0 +71 1 0.4324849 0.553850949 0.85243032140019048 1 +72 0 -1.42108059 0.329479456 0.5766465594047967 0 +73 1 3.45060849 0.8488108 0.23648509577227655 1 +74 1 1.8917346 0.7202833 0.47336358049787608 1 +76 0 -4.10267258 0.113917425 0.17448694396780215 0 +77 0 -4.4950676 0.0955624059 0.14490713407046754 0 +79 0 -4.4950676 0.0955624059 0.14490713407046754 0 +82 0 -4.4950676 0.0955624059 0.14490713407046754 0 +88 0 -4.4950676 0.0955624059 0.14490713407046754 0 +90 0 -4.4950676 0.0955624059 0.14490713407046754 0 +91 0 -4.4950676 0.0955624059 0.14490713407046754 0 +92 0 -4.4950676 0.0955624059 0.14490713407046754 0 +93 0 -4.4950676 0.0955624059 0.14490713407046754 0 +95 0 -4.4950676 0.0955624059 0.14490713407046754 0 +96 0 -4.4950676 0.0955624059 0.14490713407046754 0 +97 0 -4.4950676 0.0955624059 0.14490713407046754 0 +98 1 0.430126518 0.553559542 0.85318959107180636 1 +99 1 3.795565 0.86964035 0.20150921352918599 1 +100 1 3.05687475 0.8217776 0.28318012010746291 1 +102 0 -4.4950676 0.0955624059 0.14490713407046754 0 +104 1 2.818191 0.803623259 0.31540877464917566 1 +105 1 0.3356665 0.5418601 0.88400766744784764 1 +106 1 3.28788471 0.8380707 0.25485615558954922 1 +108 0 -3.60867739 0.141323745 0.21981379787184632 0 +109 1 3.71898818 0.865237951 0.20883114835681491 1 +111 1 2.595313 0.7854403 0.34842642475764418 1 +112 1 2.90513015 0.8103929 0.30330653156287818 1 +113 1 3.43507361 0.8478113 0.238184930668183 1 +115 0 -2.74509573 0.202208519 0.32591637677515645 0 +117 1 3.787954 0.869208336 0.20222608457666785 1 +120 0 -4.4950676 0.0955624059 0.14490713407046754 0 +121 0 -3.98729 0.11987178 0.18421437967775695 0 +122 1 3.65162063 0.861261845 0.21547617605018932 1 +123 1 2.90513015 0.8103929 0.30330653156287818 1 +125 0 -4.4950676 0.0955624059 0.14490713407046754 0 +128 1 0.6344999 0.5786539 0.789227452110421 1 +129 0 -4.4950676 0.0955624059 0.14490713407046754 0 +131 0 -4.4950676 0.0955624059 0.14490713407046754 0 +132 1 2.234516 0.7534797 0.40835941446199947 1 +133 0 -4.4950676 0.0955624059 0.14490713407046754 0 +137 0 -4.4950676 0.0955624059 0.14490713407046754 0 +138 0 -4.4950676 0.0955624059 0.14490713407046754 0 +141 0 -4.4950676 0.0955624059 0.14490713407046754 0 +144 0 -4.4950676 0.0955624059 0.14490713407046754 0 +145 0 -1.71691072 0.297662169 0.50976294720103688 0 +147 0 -4.521502 0.09442613 0.14309576891318682 0 +150 0 -3.95260167 0.12171372 0.18723682820261706 0 +151 1 3.17948556 0.830579937 0.26780907245677338 1 +152 1 3.77653313 0.868557751 0.20330631668376986 1 +154 0 -4.4950676 0.0955624059 0.14490713407046754 0 +156 0 -4.4950676 0.0955624059 0.14490713407046754 0 +161 0 -4.4950676 0.0955624059 0.14490713407046754 0 +164 0 -2.21088362 0.248721659 0.41258058459205305 0 +167 1 2.35764241 0.764735758 0.38696676020378701 1 +169 0 -3.95260167 0.12171372 0.18723682820261706 0 +171 0 -4.4950676 0.0955624059 0.14490713407046754 0 +173 1 3.69995618 0.864124537 0.21068884816509187 1 +174 1 3.43507361 0.8478113 0.238184930668183 1 +176 0 -4.4950676 0.0955624059 0.14490713407046754 0 +177 1 2.818191 0.803623259 0.31540877464917566 1 +179 1 1.7039789 0.7009843 0.51254596412458053 1 +180 0 -3.95260167 0.12171372 0.18723682820261706 0 +181 0 -4.4950676 0.0955624059 0.14490713407046754 0 +183 1 3.45175433 0.8488843 0.23636018841312478 1 +187 1 3.795565 0.86964035 0.20150921352918599 1 +188 1 3.71898818 0.865237951 0.20883114835681491 1 +189 0 -1.97142136 0.271760136 0.45751437830016045 0 +191 1 3.38114214 0.844299257 0.24417365071625674 1 +192 0 -4.4950676 0.0955624059 0.14490713407046754 0 +196 0 3.59779739 0.8580148 2.8161877619952271 1 +198 0 -4.4950676 0.0955624059 0.14490713407046754 0 +199 0 -4.4950676 0.0955624059 0.14490713407046754 0 +201 1 3.43507361 0.8478113 0.238184930668183 1 +202 0 -4.4950676 0.0955624059 0.14490713407046754 0 +204 0 -4.4950676 0.0955624059 0.14490713407046754 0 +205 1 3.69995618 0.864124537 0.21068884816509187 1 +206 1 2.93677235 0.812812 0.29900644528974929 1 +207 0 -3.95260167 0.12171372 0.18723682820261706 0 +209 0 -3.95260167 0.12171372 0.18723682820261706 0 +210 1 3.77653313 0.868557751 0.20330631668376986 1 +211 1 3.77653313 0.868557751 0.20330631668376986 1 +212 0 -4.4950676 0.0955624059 0.14490713407046754 0 +216 0 -4.4950676 0.0955624059 0.14490713407046754 0 +218 1 3.744044 0.866692066 0.2064085968137431 1 +219 0 -2.53679466 0.21953173 0.35758811403677548 0 +223 1 3.795565 0.86964035 0.20150921352918599 1 +226 1 3.795565 0.86964035 0.20150921352918599 1 +228 0 -3.95260167 0.12171372 0.18723682820261706 0 +233 1 2.99774766 0.8174065 0.29087442236537497 1 +237 1 2.67100215 0.7917491 0.33688473657529261 1 +239 1 3.59779739 0.8580148 0.22092552472643659 1 +240 0 -3.21628237 0.166846842 0.26334636449315257 0 +241 0 -3.95260167 0.12171372 0.18723682820261706 0 +242 0 -4.4950676 0.0955624059 0.14490713407046754 0 +244 0 -4.4950676 0.0955624059 0.14490713407046754 0 +246 1 3.77653313 0.868557751 0.20330631668376986 1 +247 1 2.75803661 0.7988333 0.32403360181334279 1 +248 0 -2.652012 0.209820777 0.33974818267134177 0 +249 0 -2.74509573 0.202208519 0.32591637677515645 0 +250 0 -4.4950676 0.0955624059 0.14490713407046754 0 +252 0 2.431195 0.771287858 2.1283951395582803 1 +254 1 2.81186 0.803123236 0.31630671499593227 1 +257 0 -4.4950676 0.0955624059 0.14490713407046754 0 +258 0 -4.4950676 0.0955624059 0.14490713407046754 0 +259 0 2.12863541 0.7435148 1.9630523809754465 1 +260 1 3.43507361 0.8478113 0.238184930668183 1 +262 1 3.528331 0.8537306 0.22814717259064166 1 +267 1 2.45226932 0.7731413 0.3711959426407867 1 +268 1 2.66535 0.7912828 0.3377347461710663 1 +269 0 -4.4950676 0.0955624059 0.14490713407046754 0 +271 0 -4.4950676 0.0955624059 0.14490713407046754 0 +272 1 2.45226932 0.7731413 0.3711959426407867 1 +275 0 -1.71691072 0.297662169 0.50976294720103688 0 +276 0 -4.4950676 0.0955624059 0.14490713407046754 0 +277 0 -4.4950676 0.0955624059 0.14490713407046754 0 +278 0 -4.4950676 0.0955624059 0.14490713407046754 0 +279 1 2.95580435 0.814255536 0.29644647227204318 1 +280 0 -4.4950676 0.0955624059 0.14490713407046754 0 +283 1 3.59779739 0.8580148 0.22092552472643659 1 +284 1 2.75803661 0.7988333 0.32403360181334279 1 +285 1 3.77653313 0.868557751 0.20330631668376986 1 +288 1 1.10243011 0.6344175 0.65649558599035307 1 +290 0 -4.4950676 0.0955624059 0.14490713407046754 0 +291 0 -4.4950676 0.0955624059 0.14490713407046754 0 +293 1 0.6245051 0.577435 0.79226949720321194 1 +296 0 3.17948556 0.830579937 2.561323359581714 1 +297 0 0.6245051 0.577435 1.2427548742651005 1 +299 1 -0.3835451 0.452203244 1.1449567532979168 0 +300 1 3.26324987 0.8363921 0.25774865164842609 1 +301 0 -4.4950676 0.0955624059 0.14490713407046754 0 +303 0 -4.4950676 0.0955624059 0.14490713407046754 0 +304 1 2.78251958 0.8007933 0.32049820903118192 1 +308 1 3.820621 0.871054053 0.19916584676621468 1 +309 0 -1.7676115 0.29238975 0.49897314970856355 0 +311 0 -4.4950676 0.0955624059 0.14490713407046754 0 +312 1 2.35764241 0.764735758 0.38696676020378701 1 +314 0 -3.95260167 0.12171372 0.18723682820261706 0 +316 1 3.446887 0.848571837 0.23689129673139883 1 +317 1 3.71898818 0.865237951 0.20883114835681491 1 +319 0 3.59018636 0.857550561 2.8114781592283267 1 +321 0 -2.74509573 0.202208519 0.32591637677515645 0 +323 1 2.92117071 0.8116222 0.30111976349282671 1 +327 0 -4.4950676 0.0955624059 0.14490713407046754 0 +328 1 2.855948 0.806585431 0.31010074750104261 1 +329 1 3.14493656 0.8281352 0.27206178914860835 1 +331 0 -4.4950676 0.0955624059 0.14490713407046754 0 +332 0 -4.4950676 0.0955624059 0.14490713407046754 0 +333 1 3.37403178 0.8438313 0.24497349159377674 1 +336 1 2.25354767 0.755243 0.40498718111455023 1 +338 0 -3.95260167 0.12171372 0.18723682820261706 0 +343 0 -4.4950676 0.0955624059 0.14490713407046754 0 +344 1 3.795565 0.86964035 0.20150921352918599 1 +346 0 -3.60867739 0.141323745 0.21981379787184632 0 +347 0 -3.06621146 0.177539736 0.28198211617544272 0 +348 1 1.44182539 0.672808 0.57173325309382417 1 +349 1 3.17948556 0.830579937 0.26780907245677338 1 +350 0 -4.4950676 0.0955624059 0.14490713407046754 0 +352 0 3.46805358 0.84992677 2.7362614397541081 1 +353 1 3.37353134 0.843798339 0.24502984661603949 1 +354 0 -4.4950676 0.0955624059 0.14490713407046754 0 +355 0 -4.4950676 0.0955624059 0.14490713407046754 0 +358 1 3.673432 0.862559855 0.21330352275518588 1 +360 1 3.69995618 0.864124537 0.21068884816509187 1 +361 1 3.42746258 0.8473196 0.23902184830068046 1 +366 1 3.69995618 0.864124537 0.21068884816509187 1 +368 0 -4.10267258 0.113917425 0.17448694396780215 0 +370 0 -4.4950676 0.0955624059 0.14490713407046754 0 +371 0 -4.10267258 0.113917425 0.17448694396780215 0 +373 0 -4.4950676 0.0955624059 0.14490713407046754 0 +376 0 -4.4950676 0.0955624059 0.14490713407046754 0 +377 0 -3.95260167 0.12171372 0.18723682820261706 0 +378 0 -4.4950676 0.0955624059 0.14490713407046754 0 +379 0 -1.20829666 0.3533952 0.62904386389543054 0 +381 1 3.795565 0.86964035 0.20150921352918599 1 +383 0 -4.4950676 0.0955624059 0.14490713407046754 0 +384 0 -4.4950676 0.0955624059 0.14490713407046754 0 +387 0 -1.97142136 0.271760136 0.45751437830016045 0 +388 0 -4.4950676 0.0955624059 0.14490713407046754 0 +389 0 -3.98729 0.11987178 0.18421437967775695 0 +391 1 3.795565 0.86964035 0.20150921352918599 1 +392 0 -4.4950676 0.0955624059 0.14490713407046754 0 +395 0 -4.4950676 0.0955624059 0.14490713407046754 0 +396 0 -4.4950676 0.0955624059 0.14490713407046754 0 +398 0 -4.4950676 0.0955624059 0.14490713407046754 0 +399 0 -3.27428269 0.162854418 0.25644956179242817 0 +404 0 -4.4950676 0.0955624059 0.14490713407046754 0 +406 0 -4.4950676 0.0955624059 0.14490713407046754 0 +409 0 -4.4950676 0.0955624059 0.14490713407046754 0 +413 0 -4.4950676 0.0955624059 0.14490713407046754 0 +414 1 3.67065263 0.862395048 0.21357920070492295 1 +415 0 -2.712303 0.2048665 0.33073098860199474 0 +416 1 3.43507361 0.8478113 0.238184930668183 1 +418 0 -3.98729 0.11987178 0.18421437967775695 0 +419 0 -4.4950676 0.0955624059 0.14490713407046754 0 +422 0 -1.08503139 0.367602557 0.66109656036269859 0 +423 0 -4.10267258 0.113917425 0.17448694396780215 0 +428 0 -4.4950676 0.0955624059 0.14490713407046754 0 +429 0 -4.4950676 0.0955624059 0.14490713407046754 0 +430 0 -4.4950676 0.0955624059 0.14490713407046754 0 +434 0 3.211308 0.8328071 2.5804147157065942 1 +436 1 0.304188818 0.537950456 0.89445478450125759 1 +439 0 -4.4950676 0.0955624059 0.14490713407046754 0 +440 1 3.14493656 0.8281352 0.27206178914860835 1 +441 0 -3.313727 0.160183489 0.25185394324912214 0 +442 0 -4.423438 0.09870304 0.14992557295436484 0 +449 1 3.45175433 0.8488843 0.23636018841312478 1 +450 0 -3.95260167 0.12171372 0.18723682820261706 0 +451 0 -4.4950676 0.0955624059 0.14490713407046754 0 +452 0 -4.4950676 0.0955624059 0.14490713407046754 0 +453 1 3.787954 0.869208336 0.20222608457666785 1 +454 0 -4.4950676 0.0955624059 0.14490713407046754 0 +455 1 -1.63538456 0.306253731 1.7072006735503433 0 +456 1 3.795565 0.86964035 0.20150921352918599 1 +457 1 3.55338717 0.8552881 0.22551764730107363 1 +464 0 -4.4950676 0.0955624059 0.14490713407046754 0 +465 1 3.55338717 0.8552881 0.22551764730107363 1 +466 1 3.67065263 0.862395048 0.21357920070492295 1 +467 1 3.71898818 0.865237951 0.20883114835681491 1 +474 0 -4.4950676 0.0955624059 0.14490713407046754 0 +480 0 -3.95260167 0.12171372 0.18723682820261706 0 +482 1 3.77653313 0.868557751 0.20330631668376986 1 +483 1 3.528331 0.8537306 0.22814717259064166 1 +484 0 -4.4950676 0.0955624059 0.14490713407046754 0 +487 1 3.43507361 0.8478113 0.238184930668183 1 +489 1 -2.07322645 0.261804 1.9334408754706964 0 +492 0 -3.95260167 0.12171372 0.18723682820261706 0 +493 1 3.69995618 0.864124537 0.21068884816509187 1 +495 0 -3.95260167 0.12171372 0.18723682820261706 0 +497 0 -4.4950676 0.0955624059 0.14490713407046754 0 +501 0 -4.4950676 0.0955624059 0.14490713407046754 0 +502 0 -4.4950676 0.0955624059 0.14490713407046754 0 +504 0 -4.4950676 0.0955624059 0.14490713407046754 0 +507 0 -4.423438 0.09870304 0.14992557295436484 0 +510 0 -4.4950676 0.0955624059 0.14490713407046754 0 +513 0 -3.95260167 0.12171372 0.18723682820261706 0 +514 1 3.71898818 0.865237951 0.20883114835681491 1 +517 0 -3.95260167 0.12171372 0.18723682820261706 0 +519 1 3.42746258 0.8473196 0.23902184830068046 1 +520 0 -4.4950676 0.0955624059 0.14490713407046754 0 +521 0 -4.4950676 0.0955624059 0.14490713407046754 0 +522 1 3.59779739 0.8580148 0.22092552472643659 1 +523 1 3.795565 0.86964035 0.20150921352918599 1 +527 0 -4.4950676 0.0955624059 0.14490713407046754 0 +528 0 -3.839656 0.127880737 0.19740265701142998 0 +529 0 -3.95260167 0.12171372 0.18723682820261706 0 +531 0 -4.4950676 0.0955624059 0.14490713407046754 0 +532 0 -3.95260167 0.12171372 0.18723682820261706 0 +533 0 -4.4950676 0.0955624059 0.14490713407046754 0 +534 0 -4.4950676 0.0955624059 0.14490713407046754 0 +535 0 -2.79981112 0.1978311 0.31802205046433563 0 +538 0 -4.4950676 0.0955624059 0.14490713407046754 0 +539 0 -4.23205137 0.107548937 0.16415503318941782 0 +540 0 -3.98729 0.11987178 0.18421437967775695 0 +541 0 -4.4950676 0.0955624059 0.14490713407046754 0 +544 0 -4.10267258 0.113917425 0.17448694396780215 0 +546 1 3.69995618 0.864124537 0.21068884816509187 1 +547 0 -3.95260167 0.12171372 0.18723682820261706 0 +548 0 -3.95260167 0.12171372 0.18723682820261706 0 +549 1 3.795565 0.86964035 0.20150921352918599 1 +557 0 -4.4950676 0.0955624059 0.14490713407046754 0 +558 0 -4.4950676 0.0955624059 0.14490713407046754 0 +559 0 -4.4950676 0.0955624059 0.14490713407046754 0 +560 0 -4.4950676 0.0955624059 0.14490713407046754 0 +561 0 -4.4950676 0.0955624059 0.14490713407046754 0 +563 0 -4.4950676 0.0955624059 0.14490713407046754 0 +565 1 3.45175433 0.8488843 0.23636018841312478 1 +566 0 -4.4950676 0.0955624059 0.14490713407046754 0 +569 1 3.77653313 0.868557751 0.20330631668376986 1 +577 0 -4.4950676 0.0955624059 0.14490713407046754 0 +578 0 -4.4950676 0.0955624059 0.14490713407046754 0 +581 1 3.45175433 0.8488843 0.23636018841312478 1 +582 1 3.71898818 0.865237951 0.20883114835681491 1 +584 0 -4.4950676 0.0955624059 0.14490713407046754 0 +586 1 3.77653313 0.868557751 0.20330631668376986 1 +590 1 2.818191 0.803623259 0.31540877464917566 1 +593 0 -4.4950676 0.0955624059 0.14490713407046754 0 +594 1 3.42746258 0.8473196 0.23902184830068046 1 +600 0 -4.4950676 0.0955624059 0.14490713407046754 0 +602 0 -4.4950676 0.0955624059 0.14490713407046754 0 +604 1 -0.657900333 0.418496072 1.2567140121618541 0 +606 0 -4.4950676 0.0955624059 0.14490713407046754 0 +607 0 -4.4950676 0.0955624059 0.14490713407046754 0 +609 0 -4.4950676 0.0955624059 0.14490713407046754 0 +612 1 3.77653313 0.868557751 0.20330631668376986 1 +613 0 -4.4950676 0.0955624059 0.14490713407046754 0 +614 0 -3.95260167 0.12171372 0.18723682820261706 0 +617 0 -2.16877365 0.252676755 0.42019569817193675 0 +618 0 -4.4950676 0.0955624059 0.14490713407046754 0 +619 0 -4.4950676 0.0955624059 0.14490713407046754 0 +621 0 -1.15806425 0.359155327 0.64195337418302356 0 +622 0 -4.23205137 0.107548937 0.16415503318941782 0 +624 0 -3.95260167 0.12171372 0.18723682820261706 0 +627 0 -2.74509573 0.202208519 0.32591637677515645 0 +629 0 -4.4950676 0.0955624059 0.14490713407046754 0 +633 1 3.820621 0.871054053 0.19916584676621468 1 +634 0 -4.4950676 0.0955624059 0.14490713407046754 0 +638 0 -4.4950676 0.0955624059 0.14490713407046754 0 +639 0 -4.4950676 0.0955624059 0.14490713407046754 0 +641 0 -4.4950676 0.0955624059 0.14490713407046754 0 +642 0 -4.4950676 0.0955624059 0.14490713407046754 0 +644 0 -4.4950676 0.0955624059 0.14490713407046754 0 +645 0 -4.4950676 0.0955624059 0.14490713407046754 0 +649 0 -4.4950676 0.0955624059 0.14490713407046754 0 +652 0 -4.4950676 0.0955624059 0.14490713407046754 0 +653 0 -4.4950676 0.0955624059 0.14490713407046754 0 +654 0 -4.4950676 0.0955624059 0.14490713407046754 0 +656 0 -4.4950676 0.0955624059 0.14490713407046754 0 +657 0 1.44182539 0.672808 1.6117905832976551 1 +660 0 -4.4950676 0.0955624059 0.14490713407046754 0 +661 0 -4.4950676 0.0955624059 0.14490713407046754 0 +665 0 -4.4950676 0.0955624059 0.14490713407046754 0 +668 1 2.69327879 0.793579638 0.33355308595577504 1 +670 1 3.787954 0.869208336 0.20222608457666785 1 +678 0 -4.4950676 0.0955624059 0.14490713407046754 0 +679 0 -4.4950676 0.0955624059 0.14490713407046754 0 +680 1 3.77653313 0.868557751 0.20330631668376986 1 +681 1 3.69995618 0.864124537 0.21068884816509187 1 +682 0 -4.4950676 0.0955624059 0.14490713407046754 0 +683 0 -4.4950676 0.0955624059 0.14490713407046754 0 +685 0 -4.4950676 0.0955624059 0.14490713407046754 0 +688 0 -4.4950676 0.0955624059 0.14490713407046754 0 +689 0 -4.4950676 0.0955624059 0.14490713407046754 0 +691 1 3.55276728 0.855249763 0.22558229646652059 1 +692 0 -4.4950676 0.0955624059 0.14490713407046754 0 +693 0 -4.4950676 0.0955624059 0.14490713407046754 0 +694 0 -4.521502 0.09442613 0.14309576891318682 0 +696 1 3.7250123 0.8655888 0.20824628918166951 1 +697 1 3.04988527 0.821265161 0.2840799962083847 1 +698 1 3.52072024 0.853254735 0.22895157874240141 1 +0 0 -4.21722126 0.108262725 0.16530937144173291 0 +1 0 2.242379 0.7542093 2.0244976481880586 1 +2 0 -4.21722126 0.108262725 0.16530937144173291 0 +3 0 3.291724 0.838331 2.6288848843078343 1 +4 0 -4.21722126 0.108262725 0.16530937144173291 0 +7 0 -4.21722126 0.108262725 0.16530937144173291 0 +12 1 0.192972839 0.5241029 0.93207793080613099 1 +13 0 -4.21722126 0.108262725 0.16530937144173291 0 +14 1 3.79336572 0.869515657 0.20171608841827862 1 +15 1 0.672540247 0.5832842 0.77772910180887356 1 +16 0 -4.21722126 0.108262725 0.16530937144173291 0 +17 0 -4.21722126 0.108262725 0.16530937144173291 0 +19 0 -4.21722126 0.108262725 0.16530937144173291 0 +22 0 -4.21722126 0.108262725 0.16530937144173291 0 +23 1 3.89545536 0.875198662 0.19231756187799642 1 +24 0 -4.21722126 0.108262725 0.16530937144173291 0 +26 0 -4.10339737 0.11388085 0.1744273949600901 0 +27 0 -4.21722126 0.108262725 0.16530937144173291 0 +29 0 -4.18209457 0.109970026 0.16807417114596343 0 +30 0 -4.21722126 0.108262725 0.16530937144173291 0 +33 0 -4.21722126 0.108262725 0.16530937144173291 0 +34 0 -4.21722126 0.108262725 0.16530937144173291 0 +36 1 3.387487 0.844715834 0.24346200120048986 1 +38 1 2.892688 0.8094351 0.30501263212502633 1 +39 1 2.133622 0.74399 0.42664485686872977 1 +42 1 3.45910358 0.8493551 0.23556024760083163 1 +43 1 2.8631916 0.8071498 0.30909159573419437 1 +47 0 -4.21722126 0.108262725 0.16530937144173291 0 +49 1 2.0843153 0.7392661 0.43583434146379191 1 +53 1 2.133622 0.74399 0.42664485686872977 1 +55 1 2.615832 0.7871642 0.34526346540991143 1 +57 1 -1.69778919 0.2996648 1.7385784888034808 0 +58 1 0.7341723 0.5907547 0.75936892249707788 1 +59 1 1.86702275 0.717787147 0.47837200587687095 1 +61 0 -4.21722126 0.108262725 0.16530937144173291 0 +62 1 2.63165426 0.7884866 0.3428418578044744 1 +65 1 2.10306644 0.7410692 0.43231983379717087 1 +67 1 2.54302025 0.781001151 0.3566034210715503 1 +75 0 -4.21722126 0.108262725 0.16530937144173291 0 +78 0 -4.21722126 0.108262725 0.16530937144173291 0 +80 0 -4.10339737 0.11388085 0.1744273949600901 0 +81 0 -4.21722126 0.108262725 0.16530937144173291 0 +83 0 -4.21722126 0.108262725 0.16530937144173291 0 +84 1 3.63569522 0.860307634 0.21707545541356971 1 +85 1 2.67464828 0.7920495 0.3363374494738513 1 +86 1 -0.0406887233 0.494914085 1.0147499946936755 0 +87 1 3.82580924 0.8713451 0.19868387265079065 1 +89 0 -3.984275 0.1200309 0.18447523410951036 0 +94 0 -4.21722126 0.108262725 0.16530937144173291 0 +101 1 0.6893744 0.585328639 0.77268122731014166 1 +103 1 -2.89849544 0.190117374 2.3950377147761603 0 +107 1 3.63569522 0.860307634 0.21707545541356971 1 +110 0 0.183634937 0.522938251 1.0677520812857926 1 +114 0 -1.03915036 0.372951567 0.67335121469776826 0 +116 0 0.915407538 0.6124693 1.3676175481605792 1 +118 0 -3.984275 0.1200309 0.18447523410951036 0 +119 0 -4.10339737 0.11388085 0.1744273949600901 0 +124 1 0.88354665 0.6086815 0.71624057714850642 1 +126 1 3.68252015 0.863097668 0.212404271606807 1 +127 0 -4.21722126 0.108262725 0.16530937144173291 0 +130 0 -4.18209457 0.109970026 0.16807417114596343 0 +134 0 -3.984275 0.1200309 0.18447523410951036 0 +135 0 -3.47422075 0.149680346 0.2339228110632727 0 +136 0 -4.21722126 0.108262725 0.16530937144173291 0 +139 0 -1.16332841 0.358549744 0.64059070493812753 0 +140 0 -4.21722126 0.108262725 0.16530937144173291 0 +142 1 2.615832 0.7871642 0.34526346540991143 1 +143 0 -1.16332841 0.358549744 0.64059070493812753 0 +146 1 0.331296444 0.541317642 0.88545268812251376 1 +148 0 -3.24127483 0.165116981 0.26035402814879488 0 +149 1 3.79336572 0.869515657 0.20171608841827862 1 +153 0 -4.21722126 0.108262725 0.16530937144173291 0 +155 1 2.11217237 0.7419419 0.43062182208330113 1 +157 0 -4.21722126 0.108262725 0.16530937144173291 0 +158 0 -0.9303825 0.385755032 0.7031139617632729 0 +159 1 3.79336572 0.869515657 0.20171608841827862 1 +160 1 3.79336572 0.869515657 0.20171608841827862 1 +162 0 -4.21722126 0.108262725 0.16530937144173291 0 +163 0 -2.99443579 0.182840839 0.29131099034624791 0 +165 0 -4.21722126 0.108262725 0.16530937144173291 0 +166 1 2.11217237 0.7419419 0.43062182208330113 1 +168 0 -4.21722126 0.108262725 0.16530937144173291 0 +170 0 -4.21722126 0.108262725 0.16530937144173291 0 +172 0 -4.21722126 0.108262725 0.16530937144173291 0 +175 1 3.63569522 0.860307634 0.21707545541356971 1 +178 0 -4.21722126 0.108262725 0.16530937144173291 0 +182 0 -4.21722126 0.108262725 0.16530937144173291 0 +184 1 3.79336572 0.869515657 0.20171608841827862 1 +185 0 -4.21722126 0.108262725 0.16530937144173291 0 +186 1 2.98406219 0.816382945 0.2926820521802056 1 +190 1 3.80796957 0.870341837 0.20034594649006462 1 +193 0 -4.21722126 0.108262725 0.16530937144173291 0 +194 0 -4.21722126 0.108262725 0.16530937144173291 0 +195 0 -4.21722126 0.108262725 0.16530937144173291 0 +197 0 -4.21722126 0.108262725 0.16530937144173291 0 +200 1 3.79336572 0.869515657 0.20171608841827862 1 +203 0 -4.21722126 0.108262725 0.16530937144173291 0 +208 0 -4.21722126 0.108262725 0.16530937144173291 0 +213 1 3.79336572 0.869515657 0.20171608841827862 1 +214 1 3.79336572 0.869515657 0.20171608841827862 1 +215 1 3.80796957 0.870341837 0.20034594649006462 1 +217 0 -4.21722126 0.108262725 0.16530937144173291 0 +220 0 -4.21722126 0.108262725 0.16530937144173291 0 +221 1 3.68252015 0.863097668 0.212404271606807 1 +222 1 -1.16332841 0.358549744 1.4797548077982274 0 +224 1 3.79336572 0.869515657 0.20171608841827862 1 +225 0 -4.21722126 0.108262725 0.16530937144173291 0 +227 1 3.87770653 0.8742261 0.19392165556324487 1 +229 1 3.79336572 0.869515657 0.20171608841827862 1 +230 1 2.554106 0.781947732 0.35485591874262995 1 +231 1 3.47036862 0.850074351 0.23433906435670246 1 +232 0 -0.8675968 0.39321968 0.72075379920540494 0 +234 0 -3.49895358 0.1481132 0.23126636939853412 0 +235 0 0.160153255 0.520008445 1.0589190710497358 1 +236 1 3.27737665 0.8373564 0.25608631370171175 1 +238 1 3.08109069 0.823543966 0.2800824229900386 1 +243 0 -1.16332841 0.358549744 0.64059070493812753 0 +245 0 -4.21722126 0.108262725 0.16530937144173291 0 +251 1 3.329408 0.8408685 0.25004794020224513 1 +253 1 3.45910358 0.8493551 0.23556024760083163 1 +255 1 2.11217237 0.7419419 0.43062182208330113 1 +256 0 -4.21722126 0.108262725 0.16530937144173291 0 +261 1 3.63569522 0.860307634 0.21707545541356971 1 +263 1 3.12823987 0.826943755 0.27413888752933768 1 +264 1 3.036798 0.8203026 0.28577188380723062 1 +265 0 -4.18209457 0.109970026 0.16807417114596343 0 +266 1 2.73003769 0.7965742 0.32811938607044011 1 +270 1 3.6991694 0.864078343 0.21076597253285964 1 +273 1 -1.539256 0.316559583 1.6594510251409518 0 +274 0 -4.21722126 0.108262725 0.16530937144173291 0 +281 0 -4.21722126 0.108262725 0.16530937144173291 0 +282 1 2.892688 0.8094351 0.30501263212502633 1 +286 1 3.27737665 0.8373564 0.25608631370171175 1 +287 0 -3.984275 0.1200309 0.18447523410951036 0 +289 1 2.308458 0.7602825 0.39539247977003106 1 +292 1 3.79336572 0.869515657 0.20171608841827862 1 +294 0 -1.16332841 0.358549744 0.64059070493812753 0 +295 1 3.63569522 0.860307634 0.21707545541356971 1 +298 0 -3.87045121 0.126173317 0.19458093529404152 0 +302 1 3.79336572 0.869515657 0.20171608841827862 1 +305 1 2.4229064 0.770556 0.37602833722195828 1 +306 0 -4.21722126 0.108262725 0.16530937144173291 0 +307 0 -4.21722126 0.108262725 0.16530937144173291 0 +310 0 -3.984275 0.1200309 0.18447523410951036 0 +313 0 -4.21722126 0.108262725 0.16530937144173291 0 +315 0 2.308458 0.7602825 2.0605929607501619 1 +318 0 -3.984275 0.1200309 0.18447523410951036 0 +320 1 3.68252015 0.863097668 0.212404271606807 1 +322 0 -4.21722126 0.108262725 0.16530937144173291 0 +324 0 -4.21722126 0.108262725 0.16530937144173291 0 +325 0 -3.47422075 0.149680346 0.2339228110632727 0 +326 1 -0.420327961 0.447651535 1.159551960712597 0 +330 1 2.92609119 0.811998069 0.30045179781474934 1 +334 1 2.533752 0.7802075 0.35807020078158219 1 +335 0 -4.21722126 0.108262725 0.16530937144173291 0 +337 0 -4.21722126 0.108262725 0.16530937144173291 0 +339 1 2.73003769 0.7965742 0.32811938607044011 1 +340 1 3.52560353 0.8535602 0.22843517179518252 1 +341 0 -4.21722126 0.108262725 0.16530937144173291 0 +342 0 -4.21722126 0.108262725 0.16530937144173291 0 +345 0 -4.21722126 0.108262725 0.16530937144173291 0 +351 0 -4.21722126 0.108262725 0.16530937144173291 0 +356 1 0.564958 0.5701539 0.8105767206667458 1 +357 1 3.79336572 0.869515657 0.20171608841827862 1 +359 1 2.554106 0.781947732 0.35485591874262995 1 +362 0 -3.87045121 0.126173317 0.19458093529404152 0 +363 0 0.564958 0.5701539 1.2181078514025263 1 +364 0 -4.21722126 0.108262725 0.16530937144173291 0 +365 0 -4.21722126 0.108262725 0.16530937144173291 0 +367 1 3.82580924 0.8713451 0.19868387265079065 1 +369 0 -4.18209457 0.109970026 0.16807417114596343 0 +372 0 -4.21722126 0.108262725 0.16530937144173291 0 +374 0 -4.21722126 0.108262725 0.16530937144173291 0 +375 0 -4.21722126 0.108262725 0.16530937144173291 0 +380 0 -4.21722126 0.108262725 0.16530937144173291 0 +382 0 -4.10339737 0.11388085 0.1744273949600901 0 +385 0 -2.50911427 0.22191228 0.36199528354268984 0 +386 1 3.79336572 0.869515657 0.20171608841827862 1 +390 0 -4.21722126 0.108262725 0.16530937144173291 0 +393 0 -4.21722126 0.108262725 0.16530937144173291 0 +394 0 -4.06827068 0.115665257 0.17733552539892772 0 +397 0 -4.21722126 0.108262725 0.16530937144173291 0 +400 1 3.63569522 0.860307634 0.21707545541356971 1 +401 0 -4.21722126 0.108262725 0.16530937144173291 0 +402 0 -3.696773 0.136062443 0.21100105313733619 0 +403 0 -4.21722126 0.108262725 0.16530937144173291 0 +405 0 -4.21722126 0.108262725 0.16530937144173291 0 +407 0 -4.21722126 0.108262725 0.16530937144173291 0 +408 0 -1.03915036 0.372951567 0.67335121469776826 0 +410 0 -4.21722126 0.108262725 0.16530937144173291 0 +411 0 -1.16332841 0.358549744 0.64059070493812753 0 +412 1 3.14764333 0.8283277 0.27172643363767274 1 +417 0 -4.21722126 0.108262725 0.16530937144173291 0 +420 0 -4.10339737 0.11388085 0.1744273949600901 0 +421 1 3.79336572 0.869515657 0.20171608841827862 1 +424 0 -4.21722126 0.108262725 0.16530937144173291 0 +425 1 3.79336572 0.869515657 0.20171608841827862 1 +426 0 -3.696773 0.136062443 0.21100105313733619 0 +427 1 2.77488971 0.800184 0.32159629252070843 1 +431 0 -3.984275 0.1200309 0.18447523410951036 0 +432 0 -4.21722126 0.108262725 0.16530937144173291 0 +433 0 -4.10339737 0.11388085 0.1744273949600901 0 +435 1 3.79336572 0.869515657 0.20171608841827862 1 +437 0 -4.21722126 0.108262725 0.16530937144173291 0 +438 0 -4.18209457 0.109970026 0.16807417114596343 0 +443 0 -4.21722126 0.108262725 0.16530937144173291 0 +444 0 -3.984275 0.1200309 0.18447523410951036 0 +445 0 -4.21722126 0.108262725 0.16530937144173291 0 +446 0 -4.21722126 0.108262725 0.16530937144173291 0 +447 0 -4.21722126 0.108262725 0.16530937144173291 0 +448 0 -4.21722126 0.108262725 0.16530937144173291 0 +458 0 -4.21722126 0.108262725 0.16530937144173291 0 +459 0 -4.18209457 0.109970026 0.16807417114596343 0 +460 0 -4.21722126 0.108262725 0.16530937144173291 0 +461 0 -1.16332841 0.358549744 0.64059070493812753 0 +462 0 -4.21722126 0.108262725 0.16530937144173291 0 +463 0 -4.21722126 0.108262725 0.16530937144173291 0 +468 0 -4.21722126 0.108262725 0.16530937144173291 0 +469 0 -4.21722126 0.108262725 0.16530937144173291 0 +470 0 -4.21722126 0.108262725 0.16530937144173291 0 +471 0 -4.21722126 0.108262725 0.16530937144173291 0 +472 0 -4.21722126 0.108262725 0.16530937144173291 0 +473 0 -4.21722126 0.108262725 0.16530937144173291 0 +475 0 -4.21722126 0.108262725 0.16530937144173291 0 +476 0 -4.21722126 0.108262725 0.16530937144173291 0 +477 0 -4.21722126 0.108262725 0.16530937144173291 0 +478 0 -4.10339737 0.11388085 0.1744273949600901 0 +479 1 3.82580924 0.8713451 0.19868387265079065 1 +481 0 -3.7318995 0.13401106 0.20757949523359986 0 +485 0 -4.21722126 0.108262725 0.16530937144173291 0 +486 0 -4.21722126 0.108262725 0.16530937144173291 0 +488 1 2.06796455 0.73768723 0.43891883309176066 1 +490 0 -4.21722126 0.108262725 0.16530937144173291 0 +491 1 3.82580924 0.8713451 0.19868387265079065 1 +494 0 -0.9303825 0.385755032 0.7031139617632729 0 +496 0 -4.21722126 0.108262725 0.16530937144173291 0 +498 0 -4.21722126 0.108262725 0.16530937144173291 0 +499 0 -4.21722126 0.108262725 0.16530937144173291 0 +500 0 -4.21722126 0.108262725 0.16530937144173291 0 +503 0 -4.21722126 0.108262725 0.16530937144173291 0 +505 0 -3.7318995 0.13401106 0.20757949523359986 0 +506 1 3.163171 0.829429 0.26980965540888258 1 +508 0 -4.21722126 0.108262725 0.16530937144173291 0 +509 0 -4.21722126 0.108262725 0.16530937144173291 0 +511 0 -4.21722126 0.108262725 0.16530937144173291 0 +512 0 -4.21722126 0.108262725 0.16530937144173291 0 +515 1 3.82580924 0.8713451 0.19868387265079065 1 +516 0 -4.21722126 0.108262725 0.16530937144173291 0 +518 0 -4.21722126 0.108262725 0.16530937144173291 0 +524 0 -4.21722126 0.108262725 0.16530937144173291 0 +525 0 -4.21722126 0.108262725 0.16530937144173291 0 +526 0 -4.21722126 0.108262725 0.16530937144173291 0 +530 1 3.13503218 0.827429235 0.2732921626735505 1 +536 0 -4.21722126 0.108262725 0.16530937144173291 0 +537 0 -4.21722126 0.108262725 0.16530937144173291 0 +542 0 -3.7318995 0.13401106 0.20757949523359986 0 +543 0 -4.21722126 0.108262725 0.16530937144173291 0 +545 0 -4.21722126 0.108262725 0.16530937144173291 0 +550 0 -4.21722126 0.108262725 0.16530937144173291 0 +551 0 -4.21722126 0.108262725 0.16530937144173291 0 +552 0 -4.10339737 0.11388085 0.1744273949600901 0 +553 0 0.6800365 0.584194958 1.2660208433737543 1 +554 0 -4.21722126 0.108262725 0.16530937144173291 0 +555 0 -3.7318995 0.13401106 0.20757949523359986 0 +556 0 -4.10339737 0.11388085 0.1744273949600901 0 +562 0 -4.21722126 0.108262725 0.16530937144173291 0 +564 0 -4.21722126 0.108262725 0.16530937144173291 0 +567 0 -4.21722126 0.108262725 0.16530937144173291 0 +568 1 3.12814975 0.8269373 0.27415011815927626 1 +570 1 3.68252015 0.863097668 0.212404271606807 1 +571 1 3.79336572 0.869515657 0.20171608841827862 1 +572 0 -4.21722126 0.108262725 0.16530937144173291 0 +573 0 -4.21722126 0.108262725 0.16530937144173291 0 +574 1 2.77488971 0.800184 0.32159629252070843 1 +575 0 -4.21722126 0.108262725 0.16530937144173291 0 +576 0 -4.21722126 0.108262725 0.16530937144173291 0 +579 0 -4.21722126 0.108262725 0.16530937144173291 0 +580 0 -4.21722126 0.108262725 0.16530937144173291 0 +583 0 -4.21722126 0.108262725 0.16530937144173291 0 +585 0 -4.21722126 0.108262725 0.16530937144173291 0 +587 0 -4.21722126 0.108262725 0.16530937144173291 0 +588 1 3.163171 0.829429 0.26980965540888258 1 +589 0 -4.21722126 0.108262725 0.16530937144173291 0 +591 1 3.82580924 0.8713451 0.19868387265079065 1 +592 1 3.329408 0.8408685 0.25004794020224513 1 +595 0 -4.21722126 0.108262725 0.16530937144173291 0 +596 0 -4.21722126 0.108262725 0.16530937144173291 0 +597 0 -4.18209457 0.109970026 0.16807417114596343 0 +598 0 -4.21722126 0.108262725 0.16530937144173291 0 +599 0 -4.06827068 0.115665257 0.17733552539892772 0 +601 0 -4.21722126 0.108262725 0.16530937144173291 0 +603 1 -0.8155857 0.399441481 1.3239439353620859 0 +605 1 3.14764333 0.8283277 0.27172643363767274 1 +608 1 3.63569522 0.860307634 0.21707545541356971 1 +610 1 3.329408 0.8408685 0.25004794020224513 1 +611 1 3.44851971 0.848676741 0.23671295546199683 1 +615 0 -4.18209457 0.109970026 0.16807417114596343 0 +616 0 -4.21722126 0.108262725 0.16530937144173291 0 +620 0 -4.21722126 0.108262725 0.16530937144173291 0 +623 0 -4.21722126 0.108262725 0.16530937144173291 0 +625 0 -2.613113 0.213063642 0.34568113039026332 0 +626 1 2.133622 0.74399 0.42664485686872977 1 +628 0 -4.21722126 0.108262725 0.16530937144173291 0 +630 0 -4.06827068 0.115665257 0.17733552539892772 0 +631 0 -4.21722126 0.108262725 0.16530937144173291 0 +632 0 -4.21722126 0.108262725 0.16530937144173291 0 +635 0 -4.18209457 0.109970026 0.16807417114596343 0 +636 1 3.387487 0.844715834 0.24346200120048986 1 +637 0 -4.06827068 0.115665257 0.17733552539892772 0 +640 0 -4.21722126 0.108262725 0.16530937144173291 0 +643 0 -4.21722126 0.108262725 0.16530937144173291 0 +646 0 -4.10339737 0.11388085 0.1744273949600901 0 +647 0 -4.21722126 0.108262725 0.16530937144173291 0 +648 1 3.44851971 0.848676741 0.23671295546199683 1 +650 0 -3.984275 0.1200309 0.18447523410951036 0 +651 0 -4.10339737 0.11388085 0.1744273949600901 0 +655 0 -4.21722126 0.108262725 0.16530937144173291 0 +658 1 3.79336572 0.869515657 0.20171608841827862 1 +659 0 -4.21722126 0.108262725 0.16530937144173291 0 +662 0 -4.18209457 0.109970026 0.16807417114596343 0 +663 0 -4.18209457 0.109970026 0.16807417114596343 0 +664 0 -4.21722126 0.108262725 0.16530937144173291 0 +666 0 -2.880612 0.191497982 0.30667671944864872 0 +667 0 -4.21722126 0.108262725 0.16530937144173291 0 +669 1 3.66048265 0.8617905 0.21459093643319149 1 +671 0 -4.10339737 0.11388085 0.1744273949600901 0 +672 0 -4.21722126 0.108262725 0.16530937144173291 0 +673 0 -3.49895358 0.1481132 0.23126636939853412 0 +674 0 -4.21722126 0.108262725 0.16530937144173291 0 +675 0 -4.18209457 0.109970026 0.16807417114596343 0 +676 0 -4.21722126 0.108262725 0.16530937144173291 0 +677 0 -4.21722126 0.108262725 0.16530937144173291 0 +684 0 -4.21722126 0.108262725 0.16530937144173291 0 +686 0 -4.21722126 0.108262725 0.16530937144173291 0 +687 0 -3.47422075 0.149680346 0.2339228110632727 0 +690 0 -4.21722126 0.108262725 0.16530937144173291 0 +695 0 -4.21722126 0.108262725 0.16530937144173291 0 diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-out.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-out.txt new file mode 100644 index 0000000000..232f6326d4 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-out.txt @@ -0,0 +1,45 @@ +maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3448 (241.0/(241.0+458.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 239 | 2 | 0.9917 + negative || 12 | 446 | 0.9738 + ||====================== +Precision || 0.9522 | 0.9955 | +OVERALL 0/1 ACCURACY: 0.979971 +LOG LOSS/instance: 0.198312 +Test-set entropy (prior Log-Loss/instance): 0.929318 +LOG-LOSS REDUCTION (RIG): 78.660434 +AUC: 0.995996 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.995996 (0.0000) +Accuracy: 0.979971 (0.0000) +Positive precision: 0.952191 (0.0000) +Positive recall: 0.991701 (0.0000) +Negative precision: 0.995536 (0.0000) +Negative recall: 0.973799 (0.0000) +Log-loss: 0.198312 (0.0000) +Log-loss reduction: 78.660434 (0.0000) +F1 Score: 0.971545 (0.0000) +AUPRC: 0.983584 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-rp.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-rp.txt new file mode 100644 index 0000000000..a29ae4cd9c --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.995996 0.979971 0.952191 0.991701 0.995536 0.973799 0.198312 78.66043 0.971545 0.983584 10 0.2 20 10 dart 1 LightGBM %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:dart;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart.txt new file mode 100644 index 0000000000..80e77323e6 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMDart-TrainTest-breast-cancer.dart.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -5.06709051 0.0735397339 0.11019899139311135 0 +1 0 0.9656145 0.6184105 1.3899067256376549 1 +2 0 -5.06709051 0.0735397339 0.11019899139311135 0 +3 0 0.586611152 0.5728052 1.2270340961595763 1 +4 0 -4.53108168 0.09401735 0.14244467134955621 0 +5 1 4.762709 0.9153944 0.12753458870756793 1 +6 0 -2.32187271 0.238497183 0.39307872073754024 0 +7 0 -5.06709051 0.0735397339 0.11019899139311135 0 +8 0 -4.47418737 0.09646857 0.14635330428919666 0 +9 0 -5.06709051 0.0735397339 0.11019899139311135 0 +10 0 -5.06709051 0.0735397339 0.11019899139311135 0 +11 0 -5.06709051 0.0735397339 0.11019899139311135 0 +12 1 1.81928742 0.7129272 0.48817328533637305 1 +13 0 -4.96936464 0.07693901 0.11550211839374386 0 +14 1 4.762709 0.9153944 0.12753458870756793 1 +15 1 1.44990551 0.6736967 0.5698288693073752 1 +16 0 -5.06709051 0.0735397339 0.11019899139311135 0 +17 0 -5.06709051 0.0735397339 0.11019899139311135 0 +18 1 4.408904 0.9006486 0.15096377544546791 1 +19 0 -3.06499958 0.177628234 0.28213736074538492 0 +20 1 1.49515009 0.6786501 0.55926019685756201 1 +21 1 4.75751543 0.9151931 0.12785194987984716 1 +22 0 -5.06709051 0.0735397339 0.11019899139311135 0 +23 1 4.92465067 0.9214581 0.11800948959829184 1 +24 0 -5.06709051 0.0735397339 0.11019899139311135 0 +25 1 1.14471579 0.6393071 0.64541902001011708 1 +26 0 -5.06709051 0.0735397339 0.11019899139311135 0 +27 0 -5.06709051 0.0735397339 0.11019899139311135 0 +28 0 -5.06709051 0.0735397339 0.11019899139311135 0 +29 0 -5.06528139 0.07360139 0.11029500224239923 0 +30 0 -5.06709051 0.0735397339 0.11019899139311135 0 +31 0 -5.06709051 0.0735397339 0.11019899139311135 0 +32 1 4.77333546 0.915805 0.12688768126860211 1 +33 0 -5.06709051 0.0735397339 0.11019899139311135 0 +34 0 -5.06709051 0.0735397339 0.11019899139311135 0 +35 0 -5.06709051 0.0735397339 0.11019899139311135 0 +36 1 4.97487545 0.923256457 0.11519664784290429 1 +37 0 -1.48606789 0.322341055 0.56136872372208557 0 +38 1 4.033858 0.882563055 0.18022873972886377 1 +39 1 3.797926 0.8697741 0.20128734054858682 1 +40 0 4.79215431 0.9165277 3.5825584675275528 1 +41 1 3.73647714 0.8662543 0.20713743679275598 1 +42 1 4.58626652 0.9083067 0.1387485444709517 1 +43 1 3.63648176 0.8603549 0.21699619394337738 1 +44 1 4.97487545 0.923256457 0.11519664784290429 1 +45 0 -4.47418737 0.09646857 0.14635330428919666 0 +46 1 3.44935179 0.848730147 0.23662217201089117 1 +47 0 -5.06709051 0.0735397339 0.11019899139311135 0 +48 0 -4.53108168 0.09401735 0.14244467134955621 0 +49 1 4.528306 0.905864358 0.14263305429099798 1 +50 1 3.15229177 0.828658 0.27115131951268323 1 +51 1 1.74701333 0.705474854 0.50333343567200772 1 +52 1 3.63053226 0.859997153 0.21759621059878945 1 +53 1 4.505171 0.9048733 0.14421227577053336 1 +54 1 4.69192743 0.912612855 0.13192511857382089 1 +55 1 4.76587534 0.9155169 0.1273415567782486 1 +56 1 3.354113 0.8425144 0.24722675761662352 1 +57 1 2.07040358 0.737923145 0.43845752748612049 1 +58 1 2.767017 0.7995539 0.32273285414040775 1 +59 1 2.415158 0.7698703 0.37731271454330823 1 +60 1 2.496118 0.7769637 0.36408087784159321 1 +61 0 -5.06709051 0.0735397339 0.11019899139311135 0 +62 1 3.50176024 0.8520638 0.23096667790677894 1 +63 1 0.4726046 0.5588022 0.83959042666920336 1 +64 0 -5.06709051 0.0735397339 0.11019899139311135 0 +65 1 0.8255027 0.6017474 0.73277010702318957 1 +66 0 -5.06709051 0.0735397339 0.11019899139311135 0 +67 1 3.26110649 0.8362454 0.25800169470123085 1 +68 1 4.39076948 0.8998343 0.15226877377483761 1 +69 0 -5.06709051 0.0735397339 0.11019899139311135 0 +70 0 -4.67087936 0.08823008 0.13325828196111109 0 +71 1 1.41394949 0.669732332 0.57834347711149325 1 +72 0 -2.89953566 0.1900373 0.30407261512586925 0 +73 1 4.32910728 0.897020936 0.15678643758162616 1 +74 1 3.36993313 0.843561053 0.24543560661037336 1 +75 0 -4.435475 0.09816893 0.14907088318245851 0 +76 0 -5.06528139 0.07360139 0.11029500224239923 0 +77 0 -4.477027 0.09634489 0.14615583491211775 0 +78 0 -4.96936464 0.07693901 0.11550211839374386 0 +79 0 -5.07516241 0.07326523 0.10977159730236945 0 +80 0 -3.48815918 0.148795485 0.23242229245696552 0 +81 0 -5.06709051 0.0735397339 0.11019899139311135 0 +82 0 -5.06709051 0.0735397339 0.11019899139311135 0 +83 0 -3.48815918 0.148795485 0.23242229245696552 0 +84 1 4.79215431 0.9165277 0.12574962932901551 1 +85 1 1.47313929 0.6762453 0.56438149224110934 1 +86 1 2.882103 0.8086174 0.30647082345472848 1 +87 1 4.79215431 0.9165277 0.12574962932901551 1 +88 0 -5.06709051 0.0735397339 0.11019899139311135 0 +89 0 -5.07516241 0.07326523 0.10977159730236945 0 +90 0 -5.06709051 0.0735397339 0.11019899139311135 0 +91 0 -5.06709051 0.0735397339 0.11019899139311135 0 +92 0 -5.06709051 0.0735397339 0.11019899139311135 0 +93 0 -5.06709051 0.0735397339 0.11019899139311135 0 +94 0 -5.06709051 0.0735397339 0.11019899139311135 0 +95 0 -5.06709051 0.0735397339 0.11019899139311135 0 +96 0 -5.06709051 0.0735397339 0.11019899139311135 0 +97 0 -5.06709051 0.0735397339 0.11019899139311135 0 +98 1 4.40058661 0.9002758 0.15156101289846632 1 +99 1 4.746889 0.9147798 0.12850361403582561 1 +100 1 4.12806368 0.8873578 0.17241219672840219 1 +101 1 1.9220736 0.723329365 0.46727537244523693 1 +102 0 -5.06709051 0.0735397339 0.11019899139311135 0 +103 1 1.83467329 0.7144991 0.48499586862453209 1 +104 1 4.97487545 0.923256457 0.11519664784290429 1 +105 1 3.07081413 0.822796047 0.28139323268611288 1 +106 1 4.277077 0.8945929 0.16069681686502538 1 +107 1 4.79215431 0.9165277 0.12574962932901551 1 +108 0 -4.25203848 0.10659349 0.16261132712788906 0 +109 1 4.79128361 0.91649437 0.12580207730770884 1 +110 0 -2.34683728 0.2362376 0.3888041978542367 0 +111 1 4.393726 0.899967432 0.1520553006787865 1 +112 1 4.775628 0.9158933 0.12674853264953564 1 +113 1 4.69192743 0.912612855 0.13192511857382089 1 +114 0 -4.043996 0.116912559 0.17937179753410915 0 +115 0 -2.74227285 0.2024363 0.32632834253161519 0 +116 0 -2.15360236 0.254111826 0.42296874257633776 0 +117 1 4.79215431 0.9165277 0.12574962932901551 1 +118 0 -4.977436 0.0766528845 0.11505499014436699 0 +119 0 -5.06709051 0.0735397339 0.11019899139311135 0 +120 0 -5.06709051 0.0735397339 0.11019899139311135 0 +121 0 -5.06709051 0.0735397339 0.11019899139311135 0 +122 1 4.762709 0.9153944 0.12753458870756793 1 +123 1 4.658702 0.9112789 0.13403542604890845 1 +124 1 2.51770449 0.778828442 0.36062252397422589 1 +125 0 -5.06709051 0.0735397339 0.11019899139311135 0 +126 1 4.76183844 0.9153607 0.12758775921607857 1 +127 0 -5.06709051 0.0735397339 0.11019899139311135 0 +128 1 3.344656 0.841886 0.24830323159161757 1 +129 0 -5.07516241 0.07326523 0.10977159730236945 0 +130 0 -4.67087936 0.08823008 0.13325828196111109 0 +131 0 -5.06709051 0.0735397339 0.11019899139311135 0 +132 1 4.22635651 0.892177463 0.16459739044084723 1 +133 0 -5.06709051 0.0735397339 0.11019899139311135 0 +134 0 -5.07516241 0.07326523 0.10977159730236945 0 +135 0 -4.25203848 0.10659349 0.16261132712788906 0 +136 0 -5.06709051 0.0735397339 0.11019899139311135 0 +137 0 -5.06709051 0.0735397339 0.11019899139311135 0 +138 0 -5.06709051 0.0735397339 0.11019899139311135 0 +139 0 -2.32187271 0.238497183 0.39307872073754024 0 +140 0 -5.06709051 0.0735397339 0.11019899139311135 0 +141 0 -5.06709051 0.0735397339 0.11019899139311135 0 +142 1 4.53071642 0.9059671 0.14246940877837144 1 +143 0 -2.74227285 0.2024363 0.32632834253161519 0 +144 0 -5.06709051 0.0735397339 0.11019899139311135 0 +145 0 -1.21307468 0.352849483 0.62782679662951402 0 +146 1 0.92821 0.613987565 0.70371865759148688 1 +147 0 -5.07516241 0.07326523 0.10977159730236945 0 +148 0 -2.42044783 0.229661435 0.3764354427750301 0 +149 1 4.52514 0.9057293 0.14284817575998529 1 +150 0 -5.06709051 0.0735397339 0.11019899139311135 0 +151 1 3.56729722 0.8561468 0.22406988305493591 1 +152 1 4.75751543 0.9151931 0.12785194987984716 1 +153 0 -4.586527 0.09168242 0.13873129057968608 0 +154 0 -5.06709051 0.0735397339 0.11019899139311135 0 +155 1 3.56202054 0.85582155 0.22461808789195339 1 +156 0 -5.06709051 0.0735397339 0.11019899139311135 0 +157 0 -5.06709051 0.0735397339 0.11019899139311135 0 +158 0 -2.32187271 0.238497183 0.39307872073754024 0 +159 1 4.746889 0.9147798 0.12850361403582561 1 +160 1 4.762709 0.9153944 0.12753458870756793 1 +161 0 -5.06709051 0.0735397339 0.11019899139311135 0 +162 0 -5.06709051 0.0735397339 0.11019899139311135 0 +163 0 -4.376461 0.100812383 0.1533059269998425 0 +164 0 -2.32187271 0.238497183 0.39307872073754024 0 +165 0 -5.06709051 0.0735397339 0.11019899139311135 0 +166 1 4.22635651 0.892177463 0.16459739044084723 1 +167 1 4.595266 0.9086808 0.13815450454307449 1 +168 0 -5.06709051 0.0735397339 0.11019899139311135 0 +169 0 -5.06709051 0.0735397339 0.11019899139311135 0 +170 0 -5.06709051 0.0735397339 0.11019899139311135 0 +171 0 -5.06709051 0.0735397339 0.11019899139311135 0 +172 0 -5.06709051 0.0735397339 0.11019899139311135 0 +173 1 4.79215431 0.9165277 0.12574962932901551 1 +174 1 4.681301 0.912188232 0.13259653664526669 1 +175 1 4.79215431 0.9165277 0.12574962932901551 1 +176 0 -5.06709051 0.0735397339 0.11019899139311135 0 +177 1 4.436872 0.9018929 0.14897197087347003 1 +178 0 -5.06709051 0.0735397339 0.11019899139311135 0 +179 1 1.02219725 0.625063956 0.67792428275805094 1 +180 0 -5.06709051 0.0735397339 0.11019899139311135 0 +181 0 -5.06709051 0.0735397339 0.11019899139311135 0 +182 0 -3.06499958 0.177628234 0.28213736074538492 0 +183 1 4.79215431 0.9165277 0.12574962932901551 1 +184 1 4.39055967 0.899824858 0.15228387288907483 1 +185 0 -5.06709051 0.0735397339 0.11019899139311135 0 +186 1 4.711059 0.913372755 0.13072433860609423 1 +187 1 4.762709 0.9153944 0.12753458870756793 1 +188 1 3.797926 0.8697741 0.20128734054858682 1 +189 0 -4.828518 0.08209182 0.12357825446206985 0 +190 1 4.75751543 0.9151931 0.12785194987984716 1 +191 1 4.76523352 0.9154921 0.12738063074324699 1 +192 0 -5.06709051 0.0735397339 0.11019899139311135 0 +193 0 -5.06709051 0.0735397339 0.11019899139311135 0 +194 0 -5.06709051 0.0735397339 0.11019899139311135 0 +195 0 -5.06709051 0.0735397339 0.11019899139311135 0 +196 0 2.13257957 0.7438907 1.9651684683094377 1 +197 0 -4.53108168 0.09401735 0.14244467134955621 0 +198 0 -5.06709051 0.0735397339 0.11019899139311135 0 +199 0 -5.06709051 0.0735397339 0.11019899139311135 0 +200 1 4.52514 0.9057293 0.14284817575998529 1 +201 1 4.681301 0.912188232 0.13259653664526669 1 +202 0 -5.06709051 0.0735397339 0.11019899139311135 0 +203 0 -5.06709051 0.0735397339 0.11019899139311135 0 +204 0 -5.06709051 0.0735397339 0.11019899139311135 0 +205 1 4.79215431 0.9165277 0.12574962932901551 1 +206 1 4.76587534 0.9155169 0.1273415567782486 1 +207 0 -5.06709051 0.0735397339 0.11019899139311135 0 +208 0 -5.06709051 0.0735397339 0.11019899139311135 0 +209 0 -5.06709051 0.0735397339 0.11019899139311135 0 +210 1 4.746889 0.9147798 0.12850361403582561 1 +211 1 4.77333546 0.915805 0.12688768126860211 1 +212 0 -5.06709051 0.0735397339 0.11019899139311135 0 +213 1 4.746889 0.9147798 0.12850361403582561 1 +214 1 4.762709 0.9153944 0.12753458870756793 1 +215 1 4.75751543 0.9151931 0.12785194987984716 1 +216 0 -5.06709051 0.0735397339 0.11019899139311135 0 +217 0 -5.06709051 0.0735397339 0.11019899139311135 0 +218 1 4.711059 0.913372755 0.13072433860609423 1 +219 0 -4.480684 0.09618582 0.14590190047332427 0 +220 0 -5.06709051 0.0735397339 0.11019899139311135 0 +221 1 4.74601841 0.9147458 0.12855719629318343 1 +222 1 -1.62423491 0.307439476 1.7016256711214062 0 +223 1 4.77333546 0.915805 0.12688768126860211 1 +224 1 4.746889 0.9147798 0.12850361403582561 1 +225 0 -5.06709051 0.0735397339 0.11019899139311135 0 +226 1 4.746889 0.9147798 0.12850361403582561 1 +227 1 4.77333546 0.915805 0.12688768126860211 1 +228 0 -5.06709051 0.0735397339 0.11019899139311135 0 +229 1 4.746889 0.9147798 0.12850361403582561 1 +230 1 3.65319085 0.861355662 0.21531903107074454 1 +231 1 4.711059 0.913372755 0.13072433860609423 1 +232 0 -0.8694895 0.3929939 0.72021707357021347 0 +233 1 4.45700455 0.90278 0.14755364292971973 1 +234 0 -4.439581 0.097987324 0.14878038704451294 0 +235 0 -1.125464 0.362915576 0.65044352816605155 0 +236 1 4.54348469 0.9065096 0.14160583124553194 1 +237 1 4.73225641 0.9142077 0.12940612952900263 1 +238 1 4.75005531 0.9149031 0.12830913656228091 1 +239 1 4.80769873 0.917120337 0.12481704928484323 1 +240 0 -3.855827 0.1269817 0.19591620825721698 0 +241 0 -5.086604 0.07287775 0.10916850994405589 0 +242 0 -5.06709051 0.0735397339 0.11019899139311135 0 +243 0 -1.8382057 0.285140723 0.48426882550157935 0 +244 0 -5.06709051 0.0735397339 0.11019899139311135 0 +245 0 -5.06709051 0.0735397339 0.11019899139311135 0 +246 1 4.52514 0.9057293 0.14284817575998529 1 +247 1 4.072646 0.8845583 0.17697083013255438 1 +248 0 -3.97179437 0.1206916 0.1855588398969503 0 +249 0 -2.32187271 0.238497183 0.39307872073754024 0 +250 0 -5.06709051 0.0735397339 0.11019899139311135 0 +251 1 4.917371 0.921194255 0.11842268050106061 1 +252 0 2.10006452 0.740781069 1.9477570103519279 1 +253 1 4.58626652 0.9083067 0.1387485444709517 1 +254 1 3.50176024 0.8520638 0.23096667790677894 1 +255 1 2.621632 0.7876497 0.34437396428629469 1 +256 0 -5.06709051 0.0735397339 0.11019899139311135 0 +257 0 -5.06709051 0.0735397339 0.11019899139311135 0 +258 0 -5.06709051 0.0735397339 0.11019899139311135 0 +259 0 0.586611152 0.5728052 1.2270340961595763 1 +260 1 4.39055967 0.899824858 0.15228387288907483 1 +261 1 4.79215431 0.9165277 0.12574962932901551 1 +262 1 4.52514 0.9057293 0.14284817575998529 1 +263 1 4.547461 0.9066779 0.14133797201266374 1 +264 1 3.86020255 0.8732606 0.19551581662055781 1 +265 0 -4.58326864 0.0918181762 0.13894693171059244 0 +266 1 4.649226 0.91089505 0.13464325401510344 1 +267 1 4.513293 0.9052223 0.14365597452948417 1 +268 1 4.77333546 0.915805 0.12688768126860211 1 +269 0 -5.06709051 0.0735397339 0.11019899139311135 0 +270 1 4.056826 0.8837481 0.17829286362834104 1 +271 0 -5.06709051 0.0735397339 0.11019899139311135 0 +272 1 4.513293 0.9052223 0.14365597452948417 1 +273 1 2.07283378 0.738158047 0.43799834974155005 1 +274 0 -5.06709051 0.0735397339 0.11019899139311135 0 +275 0 -1.21307468 0.352849483 0.62782679662951402 0 +276 0 -5.06709051 0.0735397339 0.11019899139311135 0 +277 0 -5.06709051 0.0735397339 0.11019899139311135 0 +278 0 -5.06709051 0.0735397339 0.11019899139311135 0 +279 1 4.634048 0.9102772 0.13562216868919963 1 +280 0 -5.06709051 0.0735397339 0.11019899139311135 0 +281 0 -5.06709051 0.0735397339 0.11019899139311135 0 +282 1 3.32898331 0.840840042 0.25009672138147615 1 +283 1 5.09356928 0.9273572 0.10880295581577505 1 +284 1 3.47843766 0.850587845 0.2334678563143473 1 +285 1 4.762709 0.9153944 0.12753458870756793 1 +286 1 4.76523352 0.9154921 0.12738063074324699 1 +287 0 -5.07516241 0.07326523 0.10977159730236945 0 +288 1 1.4611814 0.674934864 0.56717981621238545 1 +289 1 4.409973 0.9006964 0.15088720483476636 1 +290 0 -5.06709051 0.0735397339 0.11019899139311135 0 +291 0 -5.06709051 0.0735397339 0.11019899139311135 0 +292 1 3.63722825 0.8603997 0.21692103450360697 1 +293 1 3.49836516 0.8518497 0.23132923252189919 1 +294 0 -2.32187271 0.238497183 0.39307872073754024 0 +295 1 4.79215431 0.9165277 0.12574962932901551 1 +296 0 1.114413 0.635805964 1.4572207996501014 1 +297 0 1.1827414 0.643679559 1.488752847030872 1 +298 0 -2.64863157 0.210101157 0.34026018673991759 0 +299 1 1.44006455 0.6726141 0.57214907766788337 1 +300 1 3.26746154 0.836680055 0.25725205131358203 1 +301 0 -5.06709051 0.0735397339 0.11019899139311135 0 +302 1 4.746889 0.9147798 0.12850361403582561 1 +303 0 -5.06709051 0.0735397339 0.11019899139311135 0 +304 1 3.596441 0.8579322 0.2210644380785613 1 +305 1 4.75005531 0.9149031 0.12830913656228091 1 +306 0 -5.06709051 0.0735397339 0.11019899139311135 0 +307 0 -5.06709051 0.0735397339 0.11019899139311135 0 +308 1 4.5357666 0.906182 0.14212727497894229 1 +309 0 -1.8382057 0.285140723 0.48426882550157935 0 +310 0 -5.07516241 0.07326523 0.10977159730236945 0 +311 0 -5.06709051 0.0735397339 0.11019899139311135 0 +312 1 4.967415 0.922991753 0.11561033813318858 1 +313 0 -5.06709051 0.0735397339 0.11019899139311135 0 +314 0 -5.06709051 0.0735397339 0.11019899139311135 0 +315 0 4.409973 0.9006964 3.332010123738069 1 +316 1 3.75849748 0.8675248 0.20502308970503244 1 +317 1 4.711059 0.913372755 0.13072433860609423 1 +318 0 -5.07516241 0.07326523 0.10977159730236945 0 +319 0 0.720623851 0.5891159 1.2831966534220296 1 +320 1 4.76183844 0.9153607 0.12758775921607857 1 +321 0 -2.32187271 0.238497183 0.39307872073754024 0 +322 0 -5.06709051 0.0735397339 0.11019899139311135 0 +323 1 3.89754 0.875312448 0.1921300081520497 1 +324 0 -5.06709051 0.0735397339 0.11019899139311135 0 +325 0 -4.25203848 0.10659349 0.16261132712788906 0 +326 1 1.08230472 0.632080436 0.66181993383020321 1 +327 0 -5.06709051 0.0735397339 0.11019899139311135 0 +328 1 4.75005531 0.9149031 0.12830913656228091 1 +329 1 4.26974154 0.8942465 0.1612554982071048 1 +330 1 4.727664 0.9140274 0.12969069223292137 1 +331 0 -4.47418737 0.09646857 0.14635330428919666 0 +332 0 -5.06709051 0.0735397339 0.11019899139311135 0 +333 1 3.19266582 0.831505239 0.26620274145331585 1 +334 1 4.634048 0.9102772 0.13562216868919963 1 +335 0 -5.06709051 0.0735397339 0.11019899139311135 0 +336 1 4.22635651 0.892177463 0.16459739044084723 1 +337 0 -5.06709051 0.0735397339 0.11019899139311135 0 +338 0 -5.06709051 0.0735397339 0.11019899139311135 0 +339 1 4.649226 0.91089505 0.13464325401510344 1 +340 1 5.061498 0.926269531 0.11049603658852435 1 +341 0 -5.06709051 0.0735397339 0.11019899139311135 0 +342 0 -5.06709051 0.0735397339 0.11019899139311135 0 +343 0 -5.06709051 0.0735397339 0.11019899139311135 0 +344 1 4.76183844 0.9153607 0.12758775921607857 1 +345 0 -5.06709051 0.0735397339 0.11019899139311135 0 +346 0 -3.83567047 0.128103167 0.19777065605817651 0 +347 0 -4.25203848 0.10659349 0.16261132712788906 0 +348 1 1.05764711 0.6292087 0.66838951276929492 1 +349 1 2.31751466 0.761106849 0.39382909281031847 1 +350 0 -4.53108168 0.09401735 0.14244467134955621 0 +351 0 -5.06709051 0.0735397339 0.11019899139311135 0 +352 0 0.250423938 0.531262159 1.0931468283016983 1 +353 1 4.409973 0.9006964 0.15088720483476636 1 +354 0 -5.06709051 0.0735397339 0.11019899139311135 0 +355 0 -4.650723 0.0890442 0.13454703685394367 0 +356 1 1.11063206 0.635368049 0.65433555204938332 1 +357 1 4.762709 0.9153944 0.12753458870756793 1 +358 1 4.51489639 0.9052911 0.14354635480411143 1 +359 1 3.66055751 0.861794949 0.21458345278972704 1 +360 1 4.79215431 0.9165277 0.12574962932901551 1 +361 1 3.92105961 0.876590252 0.19002545935254803 1 +362 0 -4.977436 0.0766528845 0.11505499014436699 0 +363 0 -0.8199894 0.398913383 0.73435519677224237 0 +364 0 -5.06709051 0.0735397339 0.11019899139311135 0 +365 0 -5.06709051 0.0735397339 0.11019899139311135 0 +366 1 4.79215431 0.9165277 0.12574962932901551 1 +367 1 4.79215431 0.9165277 0.12574962932901551 1 +368 0 -5.06528139 0.07360139 0.11029500224239923 0 +369 0 -5.06528139 0.07360139 0.11029500224239923 0 +370 0 -4.15225935 0.111438632 0.17045667627503791 0 +371 0 -5.06528139 0.07360139 0.11029500224239923 0 +372 0 -5.06709051 0.0735397339 0.11019899139311135 0 +373 0 -5.06709051 0.0735397339 0.11019899139311135 0 +374 0 -5.06709051 0.0735397339 0.11019899139311135 0 +375 0 -5.06709051 0.0735397339 0.11019899139311135 0 +376 0 -5.06709051 0.0735397339 0.11019899139311135 0 +377 0 -5.06709051 0.0735397339 0.11019899139311135 0 +378 0 -5.09467554 0.07260554 0.10874499082924705 0 +379 0 -1.32017863 0.340719551 0.60103579576585831 0 +380 0 -5.06709051 0.0735397339 0.11019899139311135 0 +381 1 4.52426958 0.9056921 0.14290742049149191 1 +382 0 -5.06709051 0.0735397339 0.11019899139311135 0 +383 0 -5.06709051 0.0735397339 0.11019899139311135 0 +384 0 -5.06709051 0.0735397339 0.11019899139311135 0 +385 0 -4.3209815 0.103354961 0.15739112575571262 0 +386 1 4.38911438 0.89975965 0.1523884242559575 1 +387 0 -2.96974325 0.184692711 0.29458418120802426 0 +388 0 -5.06709051 0.0735397339 0.11019899139311135 0 +389 0 -4.650723 0.0890442 0.13454703685394367 0 +390 0 -5.06709051 0.0735397339 0.11019899139311135 0 +391 1 4.746889 0.9147798 0.12850361403582561 1 +392 0 -5.06709051 0.0735397339 0.11019899139311135 0 +393 0 -5.06709051 0.0735397339 0.11019899139311135 0 +394 0 -4.91612864 0.07885082 0.1184932763939283 0 +395 0 -5.06709051 0.0735397339 0.11019899139311135 0 +396 0 -5.06709051 0.0735397339 0.11019899139311135 0 +397 0 -5.06709051 0.0735397339 0.11019899139311135 0 +398 0 -5.06709051 0.0735397339 0.11019899139311135 0 +399 0 -4.91612864 0.07885082 0.1184932763939283 0 +400 1 4.58626652 0.9083067 0.1387485444709517 1 +401 0 -5.06709051 0.0735397339 0.11019899139311135 0 +402 0 -3.22995162 0.165898934 0.26170589278405587 0 +403 0 -4.258548 0.10628394 0.16211154584631315 0 +404 0 -5.086604 0.07287775 0.10916850994405589 0 +405 0 -5.06709051 0.0735397339 0.11019899139311135 0 +406 0 -5.06709051 0.0735397339 0.11019899139311135 0 +407 0 -5.06709051 0.0735397339 0.11019899139311135 0 +408 0 -4.054418 0.116375618 0.17849486659413633 0 +409 0 -5.06709051 0.0735397339 0.11019899139311135 0 +410 0 -5.06709051 0.0735397339 0.11019899139311135 0 +411 0 -2.32187271 0.238497183 0.39307872073754024 0 +412 1 4.77333546 0.915805 0.12688768126860211 1 +413 0 -5.06709051 0.0735397339 0.11019899139311135 0 +414 1 4.762709 0.9153944 0.12753458870756793 1 +415 0 -3.27486 0.162815079 0.25638176839715521 0 +416 1 4.681301 0.912188232 0.13259653664526669 1 +417 0 -5.06709051 0.0735397339 0.11019899139311135 0 +418 0 -4.47418737 0.09646857 0.14635330428919666 0 +419 0 -4.913885 0.07893233 0.11862094120998633 0 +420 0 -4.988878 0.07624896 0.11442400935782022 0 +421 1 4.681301 0.912188232 0.13259653664526669 1 +422 0 -2.92195082 0.188318178 0.30101379095532071 0 +423 0 -4.67087936 0.08823008 0.13325828196111109 0 +424 0 -5.06709051 0.0735397339 0.11019899139311135 0 +425 1 4.746889 0.9147798 0.12850361403582561 1 +426 0 -3.22995162 0.165898934 0.26170589278405587 0 +427 1 4.97487545 0.923256457 0.11519664784290429 1 +428 0 -5.06709051 0.0735397339 0.11019899139311135 0 +429 0 -5.06709051 0.0735397339 0.11019899139311135 0 +430 0 -5.238652 0.0679049343 0.10145098996675742 0 +431 0 -4.114714 0.1133111 0.17350007475982571 0 +432 0 -5.06709051 0.0735397339 0.11019899139311135 0 +433 0 -5.086604 0.07287775 0.10916850994405589 0 +434 0 1.9130224 0.7224227 1.8490386030968793 1 +435 1 3.65304828 0.861347139 0.21533330719490018 1 +436 1 3.21424055 0.8330112 0.26359218458857103 1 +437 0 -5.06709051 0.0735397339 0.11019899139311135 0 +438 0 -5.06528139 0.07360139 0.11029500224239923 0 +439 0 -5.06709051 0.0735397339 0.11019899139311135 0 +440 1 4.378543 0.8992819 0.1531546327764497 1 +441 0 -3.14050961 0.172180071 0.27261111517536707 0 +442 0 -4.988878 0.07624896 0.11442400935782022 0 +443 0 -5.06709051 0.0735397339 0.11019899139311135 0 +444 0 -4.114714 0.1133111 0.17350007475982571 0 +445 0 -5.06709051 0.0735397339 0.11019899139311135 0 +446 0 -5.06709051 0.0735397339 0.11019899139311135 0 +447 0 -5.06709051 0.0735397339 0.11019899139311135 0 +448 0 -5.06709051 0.0735397339 0.11019899139311135 0 +449 1 4.79215431 0.9165277 0.12574962932901551 1 +450 0 -4.53108168 0.09401735 0.14244467134955621 0 +451 0 -5.06709051 0.0735397339 0.11019899139311135 0 +452 0 -5.086604 0.07287775 0.10916850994405589 0 +453 1 4.79215431 0.9165277 0.12574962932901551 1 +454 0 -4.913885 0.07893233 0.11862094120998633 0 +455 1 -0.09499055 0.488128424 1.0346673326582805 0 +456 1 4.762709 0.9153944 0.12753458870756793 1 +457 1 4.75751543 0.9151931 0.12785194987984716 1 +458 0 -5.06709051 0.0735397339 0.11019899139311135 0 +459 0 -4.67087936 0.08823008 0.13325828196111109 0 +460 0 -4.53108168 0.09401735 0.14244467134955621 0 +461 0 -2.74227285 0.2024363 0.32632834253161519 0 +462 0 -3.06499958 0.177628234 0.28213736074538492 0 +463 0 -5.06709051 0.0735397339 0.11019899139311135 0 +464 0 -5.06709051 0.0735397339 0.11019899139311135 0 +465 1 4.75751543 0.9151931 0.12785194987984716 1 +466 1 4.762709 0.9153944 0.12753458870756793 1 +467 1 4.79215431 0.9165277 0.12574962932901551 1 +468 0 -5.06709051 0.0735397339 0.11019899139311135 0 +469 0 -5.06709051 0.0735397339 0.11019899139311135 0 +470 0 -5.06709051 0.0735397339 0.11019899139311135 0 +471 0 -3.06499958 0.177628234 0.28213736074538492 0 +472 0 -3.06499958 0.177628234 0.28213736074538492 0 +473 0 -5.06709051 0.0735397339 0.11019899139311135 0 +474 0 -5.06709051 0.0735397339 0.11019899139311135 0 +475 0 -5.06709051 0.0735397339 0.11019899139311135 0 +476 0 -5.06709051 0.0735397339 0.11019899139311135 0 +477 0 -5.06709051 0.0735397339 0.11019899139311135 0 +478 0 -5.06709051 0.0735397339 0.11019899139311135 0 +479 1 4.79215431 0.9165277 0.12574962932901551 1 +480 0 -5.06709051 0.0735397339 0.11019899139311135 0 +481 0 -3.941018 0.12233422 0.18825643603031542 0 +482 1 4.75751543 0.9151931 0.12785194987984716 1 +483 1 4.746889 0.9147798 0.12850361403582561 1 +484 0 -5.06709051 0.0735397339 0.11019899139311135 0 +485 0 -4.988878 0.07624896 0.11442400935782022 0 +486 0 -5.06709051 0.0735397339 0.11019899139311135 0 +487 1 4.681301 0.912188232 0.13259653664526669 1 +488 1 3.59504175 0.857846856 0.22120797588077992 1 +489 1 0.191501051 0.523919344 0.93258336526600449 1 +490 0 -5.06709051 0.0735397339 0.11019899139311135 0 +491 1 4.21267176 0.89151746 0.16566504161563095 1 +492 0 -5.06709051 0.0735397339 0.11019899139311135 0 +493 1 4.79215431 0.9165277 0.12574962932901551 1 +494 0 -1.62423491 0.307439476 0.52998793925452881 0 +495 0 -5.06709051 0.0735397339 0.11019899139311135 0 +496 0 -5.06709051 0.0735397339 0.11019899139311135 0 +497 0 -5.06709051 0.0735397339 0.11019899139311135 0 +498 0 -5.06709051 0.0735397339 0.11019899139311135 0 +499 0 -5.06709051 0.0735397339 0.11019899139311135 0 +500 0 -3.06499958 0.177628234 0.28213736074538492 0 +501 0 -5.06709051 0.0735397339 0.11019899139311135 0 +502 0 -5.06709051 0.0735397339 0.11019899139311135 0 +503 0 -5.06709051 0.0735397339 0.11019899139311135 0 +504 0 -5.06709051 0.0735397339 0.11019899139311135 0 +505 0 -5.238652 0.0679049343 0.10145098996675742 0 +506 1 4.29314756 0.8953482 0.15947925483764089 1 +507 0 -4.258548 0.10628394 0.16211154584631315 0 +508 0 -5.06709051 0.0735397339 0.11019899139311135 0 +509 0 -5.06709051 0.0735397339 0.11019899139311135 0 +510 0 -5.06709051 0.0735397339 0.11019899139311135 0 +511 0 -5.06709051 0.0735397339 0.11019899139311135 0 +512 0 -5.06709051 0.0735397339 0.11019899139311135 0 +513 0 -5.06709051 0.0735397339 0.11019899139311135 0 +514 1 4.79215431 0.9165277 0.12574962932901551 1 +515 1 4.79128361 0.91649437 0.12580207730770884 1 +516 0 -5.06709051 0.0735397339 0.11019899139311135 0 +517 0 -5.06709051 0.0735397339 0.11019899139311135 0 +518 0 -5.06709051 0.0735397339 0.11019899139311135 0 +519 1 4.21267176 0.89151746 0.16566504161563095 1 +520 0 -5.07516241 0.07326523 0.10977159730236945 0 +521 0 -4.650723 0.0890442 0.13454703685394367 0 +522 1 3.65319085 0.861355662 0.21531903107074454 1 +523 1 4.762709 0.9153944 0.12753458870756793 1 +524 0 -5.06709051 0.0735397339 0.11019899139311135 0 +525 0 -5.06709051 0.0735397339 0.11019899139311135 0 +526 0 -5.06709051 0.0735397339 0.11019899139311135 0 +527 0 -5.06709051 0.0735397339 0.11019899139311135 0 +528 0 -4.56829453 0.09244441 0.13994208430347921 0 +529 0 -5.06709051 0.0735397339 0.11019899139311135 0 +530 1 4.42197 0.901231647 0.15003012052673442 1 +531 0 -5.06709051 0.0735397339 0.11019899139311135 0 +532 0 -5.06709051 0.0735397339 0.11019899139311135 0 +533 0 -5.06709051 0.0735397339 0.11019899139311135 0 +534 0 -5.06709051 0.0735397339 0.11019899139311135 0 +535 0 -4.97767067 0.07664458 0.11504201020771486 0 +536 0 -5.06709051 0.0735397339 0.11019899139311135 0 +537 0 -5.06709051 0.0735397339 0.11019899139311135 0 +538 0 -5.06709051 0.0735397339 0.11019899139311135 0 +539 0 -3.06499958 0.177628234 0.28213736074538492 0 +540 0 -5.06709051 0.0735397339 0.11019899139311135 0 +541 0 -5.06709051 0.0735397339 0.11019899139311135 0 +542 0 -4.477027 0.09634489 0.14615583491211775 0 +543 0 -5.06709051 0.0735397339 0.11019899139311135 0 +544 0 -5.06528139 0.07360139 0.11029500224239923 0 +545 0 -5.06709051 0.0735397339 0.11019899139311135 0 +546 1 4.79215431 0.9165277 0.12574962932901551 1 +547 0 -5.06709051 0.0735397339 0.11019899139311135 0 +548 0 -5.06709051 0.0735397339 0.11019899139311135 0 +549 1 3.62263346 0.8595209 0.21839535394199591 1 +550 0 -5.06709051 0.0735397339 0.11019899139311135 0 +551 0 -5.06709051 0.0735397339 0.11019899139311135 0 +552 0 -4.435475 0.09816893 0.14907088318245851 0 +553 0 -2.29392338 0.241044477 0.39791275218627792 0 +554 0 -5.06709051 0.0735397339 0.11019899139311135 0 +555 0 -3.04633975 0.1789952 0.28453745036752404 0 +556 0 -5.06709051 0.0735397339 0.11019899139311135 0 +557 0 -4.53108168 0.09401735 0.14244467134955621 0 +558 0 -5.06709051 0.0735397339 0.11019899139311135 0 +559 0 -5.06709051 0.0735397339 0.11019899139311135 0 +560 0 -5.06709051 0.0735397339 0.11019899139311135 0 +561 0 -5.06709051 0.0735397339 0.11019899139311135 0 +562 0 -5.06709051 0.0735397339 0.11019899139311135 0 +563 0 -5.06709051 0.0735397339 0.11019899139311135 0 +564 0 -5.06709051 0.0735397339 0.11019899139311135 0 +565 1 4.79215431 0.9165277 0.12574962932901551 1 +566 0 -5.06709051 0.0735397339 0.11019899139311135 0 +567 0 -4.586527 0.09168242 0.13873129057968608 0 +568 1 3.85500479 0.8729727 0.19599151261732156 1 +569 1 4.77333546 0.915805 0.12688768126860211 1 +570 1 4.68043041 0.9121533 0.1326517794994434 1 +571 1 4.746889 0.9147798 0.12850361403582561 1 +572 0 -5.06709051 0.0735397339 0.11019899139311135 0 +573 0 -5.06709051 0.0735397339 0.11019899139311135 0 +574 1 4.97487545 0.923256457 0.11519664784290429 1 +575 0 -5.06709051 0.0735397339 0.11019899139311135 0 +576 0 -5.06709051 0.0735397339 0.11019899139311135 0 +577 0 -5.06709051 0.0735397339 0.11019899139311135 0 +578 0 -5.06709051 0.0735397339 0.11019899139311135 0 +579 0 -5.06709051 0.0735397339 0.11019899139311135 0 +580 0 -5.06709051 0.0735397339 0.11019899139311135 0 +581 1 4.79215431 0.9165277 0.12574962932901551 1 +582 1 4.79215431 0.9165277 0.12574962932901551 1 +583 0 -5.06709051 0.0735397339 0.11019899139311135 0 +584 0 -4.114714 0.1133111 0.17350007475982571 0 +585 0 -5.06709051 0.0735397339 0.11019899139311135 0 +586 1 4.746889 0.9147798 0.12850361403582561 1 +587 0 -5.06709051 0.0735397339 0.11019899139311135 0 +588 1 4.158567 0.8888733 0.16995033685902611 1 +589 0 -5.06709051 0.0735397339 0.11019899139311135 0 +590 1 4.06327724 0.8840791 0.17775264133485008 1 +591 1 4.79215431 0.9165277 0.12574962932901551 1 +592 1 4.685193 0.912344 0.1323502320499686 1 +593 0 -5.06709051 0.0735397339 0.11019899139311135 0 +594 1 4.21267176 0.89151746 0.16566504161563095 1 +595 0 -5.06709051 0.0735397339 0.11019899139311135 0 +596 0 -5.06709051 0.0735397339 0.11019899139311135 0 +597 0 -4.58326864 0.0918181762 0.13894693171059244 0 +598 0 -5.06709051 0.0735397339 0.11019899139311135 0 +599 0 -4.91612864 0.07885082 0.1184932763939283 0 +600 0 -5.06709051 0.0735397339 0.11019899139311135 0 +601 0 -5.06709051 0.0735397339 0.11019899139311135 0 +602 0 -5.06709051 0.0735397339 0.11019899139311135 0 +603 1 1.193701 0.6449354 0.63277336967845355 1 +604 1 0.36122784 0.54503113 0.87558946083848666 1 +605 1 4.5357666 0.906182 0.14212727497894229 1 +606 0 -5.06709051 0.0735397339 0.11019899139311135 0 +607 0 -5.06709051 0.0735397339 0.11019899139311135 0 +608 1 4.21267176 0.89151746 0.16566504161563095 1 +609 0 -5.06709051 0.0735397339 0.11019899139311135 0 +610 1 4.748452 0.9148407 0.1284075469710346 1 +611 1 4.436872 0.9018929 0.14897197087347003 1 +612 1 4.746889 0.9147798 0.12850361403582561 1 +613 0 -5.238652 0.0679049343 0.10145098996675742 0 +614 0 -5.06709051 0.0735397339 0.11019899139311135 0 +615 0 -5.06528139 0.07360139 0.11029500224239923 0 +616 0 -5.06709051 0.0735397339 0.11019899139311135 0 +617 0 -2.32187271 0.238497183 0.39307872073754024 0 +618 0 -5.06709051 0.0735397339 0.11019899139311135 0 +619 0 -5.06709051 0.0735397339 0.11019899139311135 0 +620 0 -5.06709051 0.0735397339 0.11019899139311135 0 +621 0 -2.10559 0.258688748 0.43184868514469865 0 +622 0 -3.06499958 0.177628234 0.28213736074538492 0 +623 0 -5.06709051 0.0735397339 0.11019899139311135 0 +624 0 -5.06709051 0.0735397339 0.11019899139311135 0 +625 0 -2.92824578 0.187837556 0.30015977916686465 0 +626 1 4.711059 0.913372755 0.13072433860609423 1 +627 0 -2.74227285 0.2024363 0.32632834253161519 0 +628 0 -5.06709051 0.0735397339 0.11019899139311135 0 +629 0 -5.06709051 0.0735397339 0.11019899139311135 0 +630 0 -4.813544 0.08265776 0.12446802613061553 0 +631 0 -5.06709051 0.0735397339 0.11019899139311135 0 +632 0 -5.06709051 0.0735397339 0.11019899139311135 0 +633 1 3.84438276 0.8723826 0.19696713075262356 1 +634 0 -5.06709051 0.0735397339 0.11019899139311135 0 +635 0 -5.06528139 0.07360139 0.11029500224239923 0 +636 1 4.97487545 0.923256457 0.11519664784290429 1 +637 0 -4.19794655 0.109196655 0.16682112010989417 0 +638 0 -5.06709051 0.0735397339 0.11019899139311135 0 +639 0 -4.53108168 0.09401735 0.14244467134955621 0 +640 0 -4.53108168 0.09401735 0.14244467134955621 0 +641 0 -5.06709051 0.0735397339 0.11019899139311135 0 +642 0 -5.06709051 0.0735397339 0.11019899139311135 0 +643 0 -5.06709051 0.0735397339 0.11019899139311135 0 +644 0 -5.06709051 0.0735397339 0.11019899139311135 0 +645 0 -5.06709051 0.0735397339 0.11019899139311135 0 +646 0 -5.06709051 0.0735397339 0.11019899139311135 0 +647 0 -5.086604 0.07287775 0.10916850994405589 0 +648 1 4.436872 0.9018929 0.14897197087347003 1 +649 0 -5.06709051 0.0735397339 0.11019899139311135 0 +650 0 -4.266619 0.105901212 0.16149385206384487 0 +651 0 -5.086604 0.07287775 0.10916850994405589 0 +652 0 -5.06709051 0.0735397339 0.11019899139311135 0 +653 0 -5.06709051 0.0735397339 0.11019899139311135 0 +654 0 -5.06709051 0.0735397339 0.11019899139311135 0 +655 0 -5.06709051 0.0735397339 0.11019899139311135 0 +656 0 -5.06709051 0.0735397339 0.11019899139311135 0 +657 0 -0.657974839 0.418487 0.78211668142342572 0 +658 1 4.38911438 0.89975965 0.1523884242559575 1 +659 0 -5.06709051 0.0735397339 0.11019899139311135 0 +660 0 -5.06709051 0.0735397339 0.11019899139311135 0 +661 0 -5.06709051 0.0735397339 0.11019899139311135 0 +662 0 -5.06528139 0.07360139 0.11029500224239923 0 +663 0 -5.06528139 0.07360139 0.11029500224239923 0 +664 0 -5.086604 0.07287775 0.10916850994405589 0 +665 0 -5.06709051 0.0735397339 0.11019899139311135 0 +666 0 -4.47418737 0.09646857 0.14635330428919666 0 +667 0 -5.06709051 0.0735397339 0.11019899139311135 0 +668 1 2.81698871 0.803528368 0.31557913591179698 1 +669 1 4.711059 0.913372755 0.13072433860609423 1 +670 1 4.711059 0.913372755 0.13072433860609423 1 +671 0 -5.06709051 0.0735397339 0.11019899139311135 0 +672 0 -5.06709051 0.0735397339 0.11019899139311135 0 +673 0 -4.15225935 0.111438632 0.17045667627503791 0 +674 0 -5.06709051 0.0735397339 0.11019899139311135 0 +675 0 -5.06528139 0.07360139 0.11029500224239923 0 +676 0 -5.06709051 0.0735397339 0.11019899139311135 0 +677 0 -5.06709051 0.0735397339 0.11019899139311135 0 +678 0 -5.06709051 0.0735397339 0.11019899139311135 0 +679 0 -5.06709051 0.0735397339 0.11019899139311135 0 +680 1 4.746889 0.9147798 0.12850361403582561 1 +681 1 4.79215431 0.9165277 0.12574962932901551 1 +682 0 -5.06709051 0.0735397339 0.11019899139311135 0 +683 0 -5.06709051 0.0735397339 0.11019899139311135 0 +684 0 -5.06709051 0.0735397339 0.11019899139311135 0 +685 0 -5.06709051 0.0735397339 0.11019899139311135 0 +686 0 -5.06709051 0.0735397339 0.11019899139311135 0 +687 0 -4.25203848 0.10659349 0.16261132712788906 0 +688 0 -5.06709051 0.0735397339 0.11019899139311135 0 +689 0 -4.47418737 0.09646857 0.14635330428919666 0 +690 0 -5.086604 0.07287775 0.10916850994405589 0 +691 1 3.19901466 0.831949532 0.26543208105885724 1 +692 0 -5.06709051 0.0735397339 0.11019899139311135 0 +693 0 -4.47418737 0.09646857 0.14635330428919666 0 +694 0 -5.07516241 0.07326523 0.10977159730236945 0 +695 0 -5.06709051 0.0735397339 0.11019899139311135 0 +696 1 4.711059 0.913372755 0.13072433860609423 1 +697 1 4.711059 0.913372755 0.13072433860609423 1 +698 1 4.711059 0.913372755 0.13072433860609423 1 diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss-out.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss-out.txt new file mode 100644 index 0000000000..8bd89002c1 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss-out.txt @@ -0,0 +1,65 @@ +maml.exe CV tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3702 (134.0/(134.0+228.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 127 | 7 | 0.9478 + negative || 10 | 218 | 0.9561 + ||====================== +Precision || 0.9270 | 0.9689 | +OVERALL 0/1 ACCURACY: 0.953039 +LOG LOSS/instance: 0.240776 +Test-set entropy (prior Log-Loss/instance): 0.950799 +LOG-LOSS REDUCTION (RIG): 74.676422 +AUC: 0.982031 +TEST POSITIVE RATIO: 0.3175 (107.0/(107.0+230.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 100 | 7 | 0.9346 + negative || 5 | 225 | 0.9783 + ||====================== +Precision || 0.9524 | 0.9698 | +OVERALL 0/1 ACCURACY: 0.964392 +LOG LOSS/instance: 0.205801 +Test-set entropy (prior Log-Loss/instance): 0.901650 +LOG-LOSS REDUCTION (RIG): 77.175051 +AUC: 0.994718 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.988374 (0.0063) +Accuracy: 0.958715 (0.0057) +Positive precision: 0.939694 (0.0127) +Positive recall: 0.941170 (0.0066) +Negative precision: 0.969358 (0.0005) +Negative recall: 0.967201 (0.0111) +Log-loss: 0.223289 (0.0175) +Log-loss reduction: 75.925737 (1.2493) +F1 Score: 0.940333 (0.0031) +AUPRC: 0.970067 (0.0183) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss-rp.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss-rp.txt new file mode 100644 index 0000000000..d3c7ce0fd0 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.988374 0.958715 0.939694 0.94117 0.969358 0.967201 0.223289 75.92574 0.940333 0.970067 10 0.2 20 10 goss + 1 LightGBM %Data% %Output% 99 0 0 maml.exe CV tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} threads=- cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:goss;/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss.txt new file mode 100644 index 0000000000..13f90c4658 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-CV-breast-cancer.goss.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +5 1 4.85518169 0.918907166 0.1220089772233957 1 +6 0 -4.24826956 0.106773086 0.16290137276317815 0 +8 0 -6.3378787 0.0403514653 0.059421970461299017 0 +9 0 -6.135313 0.0444612838 0.065613765911889291 0 +10 0 -5.810166 0.0519028679 0.076893224701188714 0 +11 0 -6.242534 0.04223848 0.062261623353632063 0 +18 1 4.00077438 0.880837739 0.18305181399531753 1 +20 1 -0.127774343 0.484033644 1.0468207650886321 0 +21 1 5.126554 0.9284604 0.10708768636667922 1 +25 1 0.6900621 0.5854121 0.77247556630701764 1 +28 0 -6.242534 0.04223848 0.062261623353632063 0 +31 0 -6.242534 0.04223848 0.062261623353632063 0 +32 1 5.126554 0.9284604 0.10708768636667922 1 +35 0 -6.242534 0.04223848 0.062261623353632063 0 +37 0 -2.21439672 0.248393565 0.4119506770088443 0 +40 0 4.70202827 0.9130148 3.523086717288586 1 +41 1 3.108108 0.825498462 0.27666256813913126 1 +44 1 3.122963 0.826565862 0.27479831521838238 1 +45 0 -6.242534 0.04223848 0.062261623353632063 0 +46 1 4.27428675 0.8944613 0.16090907298519624 1 +48 0 -5.99168539 0.04761404 0.070381744820038394 0 +50 1 -1.71840513 0.297505975 1.7490094527393667 0 +51 1 -0.0494352467 0.4938209 1.0179401812696414 0 +52 1 4.23996973 0.8928305 0.1635417973814054 1 +54 1 4.151356 0.888516665 0.17052926002533803 1 +56 1 3.500455 0.851981461 0.23110605685986846 1 +60 1 2.71308422 0.7951971 0.33061554626794903 1 +63 1 1.56245458 0.685944557 0.54383612242454138 1 +64 0 -6.242534 0.04223848 0.062261623353632063 0 +66 0 -6.135313 0.0444612838 0.065613765911889291 0 +68 1 4.91996336 0.9212883 0.11827538541768642 1 +69 0 -6.242534 0.04223848 0.062261623353632063 0 +70 0 -5.38284874 0.0634812862 0.094620271713506648 0 +71 1 -0.00467008725 0.499416232 1.001685382146094 0 +72 0 -0.198462442 0.475212544 0.9301948598312737 0 +73 1 4.7046 0.9131169 0.13112856839964138 1 +74 1 1.08230865 0.6320809 0.66181884547134096 1 +76 0 -4.652814 0.08895943 0.13441279903011069 0 +77 0 -5.82893229 0.0514430664 0.076193726323763242 0 +79 0 -5.633163 0.0564346947 0.083805722897024773 0 +82 0 -6.135313 0.0444612838 0.065613765911889291 0 +88 0 -6.135313 0.0444612838 0.065613765911889291 0 +90 0 -6.242534 0.04223848 0.062261623353632063 0 +91 0 -6.19425154 0.04322597 0.063749864497165798 0 +92 0 -6.135313 0.0444612838 0.065613765911889291 0 +93 0 -6.242534 0.04223848 0.062261623353632063 0 +95 0 -6.242534 0.04223848 0.062261623353632063 0 +96 0 -6.19425154 0.04322597 0.063749864497165798 0 +97 0 -6.135313 0.0444612838 0.065613765911889291 0 +98 1 1.52928579 0.6823609 0.55139314018209817 1 +99 1 4.85518169 0.918907166 0.1220089772233957 1 +100 1 4.152907 0.888593435 0.17040461178071042 1 +102 0 -6.135313 0.0444612838 0.065613765911889291 0 +104 1 3.122963 0.826565862 0.27479831521838238 1 +105 1 0.9779411 0.619863868 0.68997668402080226 1 +106 1 4.069211 0.884382844 0.17725705611683257 1 +108 0 -4.91201973 0.07900017 0.11872720102638425 0 +109 1 4.69007254 0.9125389 0.1320420570535013 1 +111 1 2.340768 0.7632144 0.38983968546284176 1 +112 1 3.65980673 0.8617502 0.21465839075814694 1 +113 1 4.422728 0.9012654 0.14997611645415226 1 +115 0 -4.34361458 0.102310926 0.15571225868762351 0 +117 1 4.30059528 0.8956966 0.15891799661402123 1 +120 0 -6.098907 0.0452410728 0.066791590430185288 0 +121 0 -5.602051 0.05726879 0.085081605616356845 0 +122 1 5.21049833 0.931198657 0.10283911801689605 1 +123 1 5.003908 0.9242787 0.1136001949744247 1 +125 0 -6.242534 0.04223848 0.062261623353632063 0 +128 1 2.05279565 0.736216962 0.44179710528726762 1 +129 0 -5.633163 0.0564346947 0.083805722897024773 0 +131 0 -6.242534 0.04223848 0.062261623353632063 0 +132 1 3.33652782 0.841344237 0.24923189265527487 1 +133 0 -6.242534 0.04223848 0.062261623353632063 0 +137 0 -6.3378787 0.0403514653 0.059421970461299017 0 +138 0 -6.135313 0.0444612838 0.065613765911889291 0 +141 0 -6.3378787 0.0403514653 0.059421970461299017 0 +144 0 -6.242534 0.04223848 0.062261623353632063 0 +145 0 -3.88993287 0.12510325 0.19281532624266143 0 +147 0 -5.099901 0.072429806 0.10847163287095088 0 +150 0 -5.810166 0.0519028679 0.076893224701188714 0 +151 1 4.472859 0.9034735 0.14644581490388903 1 +152 1 4.85518169 0.918907166 0.1220089772233957 1 +154 0 -6.3378787 0.0403514653 0.059421970461299017 0 +156 0 -6.242534 0.04223848 0.062261623353632063 0 +161 0 -6.135313 0.0444612838 0.065613765911889291 0 +164 0 -3.87146831 0.126117259 0.19448838576547844 0 +167 1 1.59076393 0.688985765 0.53745391893088279 1 +169 0 -5.76188326 0.0531037673 0.078721760875576821 0 +171 0 -6.242534 0.04223848 0.062261623353632063 0 +173 1 4.70202827 0.9130148 0.13128980227907441 1 +174 1 4.27562952 0.894524634 0.16080688237702942 1 +176 0 -6.242534 0.04223848 0.062261623353632063 0 +177 1 3.122963 0.826565862 0.27479831521838238 1 +179 1 1.21912742 0.6478413 0.62628770800876199 1 +180 0 -5.810166 0.0519028679 0.076893224701188714 0 +181 0 -6.3378787 0.0403514653 0.059421970461299017 0 +183 1 4.70202827 0.9130148 0.13128980227907441 1 +187 1 4.85518169 0.918907166 0.1220089772233957 1 +188 1 4.70202827 0.9130148 0.13128980227907441 1 +189 0 -3.34654927 0.157988071 0.24808742317517343 0 +191 1 4.7046 0.9131169 0.13112856839964138 1 +192 0 -6.135313 0.0444612838 0.065613765911889291 0 +196 0 4.85518169 0.918907166 3.6242817491605308 1 +198 0 -6.3378787 0.0403514653 0.059421970461299017 0 +199 0 -6.242534 0.04223848 0.062261623353632063 0 +201 1 4.27562952 0.894524634 0.16080688237702942 1 +202 0 -6.242534 0.04223848 0.062261623353632063 0 +204 0 -6.242534 0.04223848 0.062261623353632063 0 +205 1 4.70202827 0.9130148 0.13128980227907441 1 +206 1 3.6366837 0.86036706 0.21697580455939161 1 +207 0 -5.810166 0.0519028679 0.076893224701188714 0 +209 0 -5.70294476 0.0546052568 0.081011252119550181 0 +210 1 4.85518169 0.918907166 0.1220089772233957 1 +211 1 4.85518169 0.918907166 0.1220089772233957 1 +212 0 -6.242534 0.04223848 0.062261623353632063 0 +216 0 -6.242534 0.04223848 0.062261623353632063 0 +218 1 4.37753439 0.899236262 0.15322788124954945 1 +219 0 -3.12401366 0.173358873 0.27466695169648236 0 +223 1 4.990325 0.923802 0.11434439694212548 1 +226 1 4.979455 0.9234185 0.11494342470711602 1 +228 0 -5.810166 0.0519028679 0.076893224701188714 0 +233 1 4.00077438 0.880837739 0.18305181399531753 1 +237 1 3.52581024 0.853573143 0.2284133104478088 1 +239 1 4.092378 0.885562 0.17533477402320735 1 +240 0 -3.64361954 0.139216855 0.21627826641877368 0 +241 0 -5.66653872 0.0555526167 0.082457670945938727 0 +242 0 -6.242534 0.04223848 0.062261623353632063 0 +244 0 -6.242534 0.04223848 0.062261623353632063 0 +246 1 4.85518169 0.918907166 0.1220089772233957 1 +247 1 2.74376464 0.7976841 0.32611062151708015 1 +248 0 -4.8047986 0.08298992 0.12499050827350028 0 +249 0 -4.24826956 0.106773086 0.16290137276317815 0 +250 0 -6.3378787 0.0403514653 0.059421970461299017 0 +252 0 2.37881422 0.766635 2.0993398968716317 1 +254 1 3.7206285 0.865333557 0.20867174426924942 1 +257 0 -6.242534 0.04223848 0.062261623353632063 0 +258 0 -6.242534 0.04223848 0.062261623353632063 0 +259 0 3.15156269 0.828606248 2.5446135757601787 1 +260 1 4.151356 0.888516665 0.17052926002533803 1 +262 1 4.979455 0.9234185 0.11494342470711602 1 +267 1 3.52967453 0.8538145 0.22800546061493704 1 +268 1 3.8141408 0.8706897 0.19976945448062877 1 +269 0 -6.242534 0.04223848 0.062261623353632063 0 +271 0 -6.135313 0.0444612838 0.065613765911889291 0 +272 1 3.52967453 0.8538145 0.22800546061493704 1 +275 0 -3.88993287 0.12510325 0.19281532624266143 0 +276 0 -6.242534 0.04223848 0.062261623353632063 0 +277 0 -6.242534 0.04223848 0.062261623353632063 0 +278 0 -6.242534 0.04223848 0.062261623353632063 0 +279 1 3.500455 0.851981461 0.23110605685986846 1 +280 0 -6.242534 0.04223848 0.062261623353632063 0 +283 1 4.91144276 0.920978844 0.11876007838360149 1 +284 1 3.01267433 0.818517745 0.28891440184822059 1 +285 1 4.85518169 0.918907166 0.1220089772233957 1 +288 1 2.386345 0.767308 0.38212230439278783 1 +290 0 -6.3378787 0.0403514653 0.059421970461299017 0 +291 0 -6.242534 0.04223848 0.062261623353632063 0 +293 1 0.821331739 0.601247549 0.73396898703671409 1 +296 0 4.376199 0.8991757 3.3100847558567241 1 +297 0 -0.5855849 0.427320361 0.80419978430742423 0 +299 1 0.307198554 0.5383245 0.89345207492762446 1 +300 1 4.53068829 0.9059659 0.14247130711177569 1 +301 0 -6.242534 0.04223848 0.062261623353632063 0 +303 0 -6.242534 0.04223848 0.062261623353632063 0 +304 1 4.201643 0.890983 0.16653021305505525 1 +308 1 4.53068829 0.9059659 0.14247130711177569 1 +309 0 -1.133761 0.361956924 0.64827426784843212 0 +311 0 -6.3378787 0.0403514653 0.059421970461299017 0 +312 1 2.73482418 0.7969617 0.32741765652805882 1 +314 0 -5.810166 0.0519028679 0.076893224701188714 0 +316 1 4.51358 0.905234635 0.14363631075946678 1 +317 1 4.70202827 0.9130148 0.13128980227907441 1 +319 0 4.42486858 0.9013606 3.3416917470480749 1 +321 0 -4.24826956 0.106773086 0.16290137276317815 0 +323 1 3.91605759 0.876319468 0.19047118521064277 1 +327 0 -6.242534 0.04223848 0.062261623353632063 0 +328 1 2.23526525 0.753549337 0.4082261219183172 1 +329 1 4.27562952 0.894524634 0.16080688237702942 1 +331 0 -6.135313 0.0444612838 0.065613765911889291 0 +332 0 -5.99168539 0.04761404 0.070381744820038394 0 +333 1 4.55144644 0.9068464 0.1410698780291269 1 +336 1 3.33652782 0.841344237 0.24923189265527487 1 +338 0 -5.810166 0.0519028679 0.076893224701188714 0 +343 0 -6.3378787 0.0403514653 0.059421970461299017 0 +344 1 4.85518169 0.918907166 0.1220089772233957 1 +346 0 -4.048108 0.116700441 0.1790253031014257 0 +347 0 -4.574996 0.0921636745 0.139495878563443 0 +348 1 1.9777838 0.728869 0.4562685119118447 1 +349 1 2.26726246 0.7565084 0.40257197415769308 1 +350 0 -6.08703041 0.0454982668 0.067180277610699737 0 +352 0 3.43233681 0.8476347 2.7143934625780504 1 +353 1 4.15001345 0.888450146 0.17063727140593779 1 +354 0 -6.242534 0.04223848 0.062261623353632063 0 +355 0 -5.525942 0.05935827 0.088282756944531748 0 +358 1 4.13402176 0.8876552 0.17192871100161813 1 +360 1 4.70202827 0.9130148 0.13128980227907441 1 +361 1 2.823096 0.80401 0.31471469627522414 1 +366 1 4.70202827 0.9130148 0.13128980227907441 1 +368 0 -5.585415 0.0577195249 0.085771544883292264 0 +370 0 -5.36318827 0.06406822 0.095524720040672251 0 +371 0 -5.585415 0.0577195249 0.085771544883292264 0 +373 0 -5.99168539 0.04761404 0.070381744820038394 0 +376 0 -6.242534 0.04223848 0.062261623353632063 0 +377 0 -5.810166 0.0519028679 0.076893224701188714 0 +378 0 -5.489536 0.06038282 0.08985500402168177 0 +379 0 -0.7603255 0.406087637 0.75167803038903647 0 +381 1 4.081508 0.88501 0.17623433155332399 1 +383 0 -6.3378787 0.0403514653 0.059421970461299017 0 +384 0 -6.3378787 0.0403514653 0.059421970461299017 0 +387 0 -2.07415 0.261714756 0.43774977197350545 0 +388 0 -6.242534 0.04223848 0.062261623353632063 0 +389 0 -4.72309971 0.0861521 0.12997402898935428 0 +391 1 4.84322643 0.918460667 0.12271015531091441 1 +392 0 -6.242534 0.04223848 0.062261623353632063 0 +395 0 -6.242534 0.04223848 0.062261623353632063 0 +396 0 -6.242534 0.04223848 0.062261623353632063 0 +398 0 -6.242534 0.04223848 0.062261623353632063 0 +399 0 -4.91217041 0.0789946839 0.11871861125458473 0 +404 0 -6.19425154 0.04322597 0.063749864497165798 0 +406 0 -6.135313 0.0444612838 0.065613765911889291 0 +409 0 -6.242534 0.04223848 0.062261623353632063 0 +413 0 -6.135313 0.0444612838 0.065613765911889291 0 +414 1 4.990325 0.923802 0.11434439694212548 1 +415 0 -3.459314 0.150631458 0.23553741746721518 0 +416 1 4.151356 0.888516665 0.17052926002533803 1 +418 0 -5.18884325 0.0694983 0.10391930969435764 0 +419 0 -5.47041 0.0609276779 0.090691824422903702 0 +422 0 -1.49663413 0.321188122 0.55891628526222026 0 +423 0 -5.38284874 0.0634812862 0.094620271713506648 0 +428 0 -6.242534 0.04223848 0.062261623353632063 0 +429 0 -6.242534 0.04223848 0.062261623353632063 0 +430 0 -6.079781 0.04565594 0.067418614232078428 0 +434 0 3.84762073 0.872562766 2.9721412368332492 1 +436 1 0.539397061 0.567018867 0.81853135582316505 1 +439 0 -6.23065758 0.0424793661 0.062624518391501238 0 +440 1 3.37768245 0.8440717 0.24456256392734108 1 +441 0 -5.08747435 0.07284836 0.10912277293344663 0 +442 0 -5.464276 0.0611033961 0.090961805250660777 0 +449 1 4.70202827 0.9130148 0.13128980227907441 1 +450 0 -5.559317 0.05843334 0.086864856564023749 0 +451 0 -6.23065758 0.0424793661 0.062624518391501238 0 +452 0 -6.19425154 0.04322597 0.063749864497165798 0 +453 1 4.30059528 0.8956966 0.15891799661402123 1 +454 0 -5.47041 0.0609276779 0.090691824422903702 0 +455 1 -3.56580019 0.1439454 2.796406449448138 0 +456 1 4.85518169 0.918907166 0.1220089772233957 1 +457 1 4.53068829 0.9059659 0.14247130711177569 1 +464 0 -6.23065758 0.0424793661 0.062624518391501238 0 +465 1 4.53068829 0.9059659 0.14247130711177569 1 +466 1 5.21049833 0.931198657 0.10283911801689605 1 +467 1 4.70202827 0.9130148 0.13128980227907441 1 +474 0 -6.23065758 0.0424793661 0.062624518391501238 0 +480 0 -5.7982893 0.0521958619 0.077339135170347129 0 +482 1 4.85518169 0.918907166 0.1220089772233957 1 +483 1 4.85518169 0.918907166 0.1220089772233957 1 +484 0 -6.23065758 0.0424793661 0.062624518391501238 0 +487 1 4.151356 0.888516665 0.17052926002533803 1 +489 1 -1.62315154 0.3075548 1.7010845499433891 0 +492 0 -5.70294476 0.0546052568 0.081011252119550181 0 +493 1 4.70202827 0.9130148 0.13128980227907441 1 +495 0 -5.810166 0.0519028679 0.076893224701188714 0 +497 0 -6.23065758 0.0424793661 0.062624518391501238 0 +501 0 -6.135313 0.0444612838 0.065613765911889291 0 +502 0 -5.99168539 0.04761404 0.070381744820038394 0 +504 0 -6.3378787 0.0403514653 0.059421970461299017 0 +507 0 -5.60790348 0.0571110062 0.084840162337402394 0 +510 0 -6.3378787 0.0403514653 0.059421970461299017 0 +513 0 -5.810166 0.0519028679 0.076893224701188714 0 +514 1 4.565799 0.907450855 0.14010858234374976 1 +517 0 -5.810166 0.0519028679 0.076893224701188714 0 +519 1 3.721043 0.865357757 0.20863139914490494 1 +520 0 -5.633163 0.0564346947 0.083805722897024773 0 +521 0 -5.525942 0.05935827 0.088282756944531748 0 +522 1 4.84322643 0.918460667 0.12271015531091441 1 +523 1 4.85518169 0.918907166 0.1220089772233957 1 +527 0 -6.135313 0.0444612838 0.065613765911889291 0 +528 0 -4.54600763 0.09338359 0.14143581691346635 0 +529 0 -5.70294476 0.0546052568 0.081011252119550181 0 +531 0 -6.135313 0.0444612838 0.065613765911889291 0 +532 0 -5.810166 0.0519028679 0.076893224701188714 0 +533 0 -6.242534 0.04223848 0.062261623353632063 0 +534 0 -6.242534 0.04223848 0.062261623353632063 0 +535 0 -3.876166 0.1258586 0.19406143587184183 0 +538 0 -6.135313 0.0444612838 0.065613765911889291 0 +539 0 -5.346754 0.0645627156 0.09628716243003746 0 +540 0 -5.33247042 0.0649953857 0.09695461009881863 0 +541 0 -6.3378787 0.0403514653 0.059421970461299017 0 +544 0 -5.3464427 0.06457212 0.096301663882982419 0 +546 1 4.70202827 0.9130148 0.13128980227907441 1 +547 0 -5.90551043 0.0496064536 0.073403055305693618 0 +548 0 -5.90551043 0.0496064536 0.073403055305693618 0 +549 1 4.081508 0.88501 0.17623433155332399 1 +557 0 -6.08703041 0.0454982668 0.067180277610699737 0 +558 0 -6.242534 0.04223848 0.062261623353632063 0 +559 0 -6.135313 0.0444612838 0.065613765911889291 0 +560 0 -6.135313 0.0444612838 0.065613765911889291 0 +561 0 -6.135313 0.0444612838 0.065613765911889291 0 +563 0 -6.242534 0.04223848 0.062261623353632063 0 +565 1 4.70202827 0.9130148 0.13128980227907441 1 +566 0 -6.242534 0.04223848 0.062261623353632063 0 +569 1 4.85518169 0.918907166 0.1220089772233957 1 +577 0 -6.242534 0.04223848 0.062261623353632063 0 +578 0 -6.242534 0.04223848 0.062261623353632063 0 +581 1 4.70202827 0.9130148 0.13128980227907441 1 +582 1 4.70202827 0.9130148 0.13128980227907441 1 +584 0 -5.382314 0.06349718 0.094644753479154534 0 +586 1 4.85518169 0.918907166 0.1220089772233957 1 +590 1 2.48048949 0.775606632 0.36660295486675726 1 +593 0 -6.23065758 0.0424793661 0.062624518391501238 0 +594 1 3.721043 0.865357757 0.20863139914490494 1 +600 0 -6.242534 0.04223848 0.062261623353632063 0 +602 0 -6.135313 0.0444612838 0.065613765911889291 0 +604 1 -0.696793735 0.413771242 1.273094716981011 0 +606 0 -6.08703041 0.0454982668 0.067180277610699737 0 +607 0 -6.3378787 0.0403514653 0.059421970461299017 0 +609 0 -6.23065758 0.0424793661 0.062624518391501238 0 +612 1 4.85518169 0.918907166 0.1220089772233957 1 +613 0 -6.079781 0.04565594 0.067418614232078428 0 +614 0 -5.810166 0.0519028679 0.076893224701188714 0 +617 0 -3.911246 0.123941518 0.19090091416286459 0 +618 0 -6.135313 0.0444612838 0.065613765911889291 0 +619 0 -6.135313 0.0444612838 0.065613765911889291 0 +621 0 0.6244607 0.5774296 1.2427363560236449 1 +622 0 -5.203127 0.06903787 0.10320561169602728 0 +624 0 -5.559317 0.05843334 0.086864856564023749 0 +627 0 -4.34361458 0.102310926 0.15571225868762351 0 +629 0 -6.23065758 0.0424793661 0.062624518391501238 0 +633 1 4.53068829 0.9059659 0.14247130711177569 1 +634 0 -6.3378787 0.0403514653 0.059421970461299017 0 +638 0 -6.23065758 0.0424793661 0.062624518391501238 0 +639 0 -6.08703041 0.0454982668 0.067180277610699737 0 +641 0 -6.242534 0.04223848 0.062261623353632063 0 +642 0 -6.242534 0.04223848 0.062261623353632063 0 +644 0 -6.3378787 0.0403514653 0.059421970461299017 0 +645 0 -6.242534 0.04223848 0.062261623353632063 0 +649 0 -6.242534 0.04223848 0.062261623353632063 0 +652 0 -6.135313 0.0444612838 0.065613765911889291 0 +653 0 -6.135313 0.0444612838 0.065613765911889291 0 +654 0 -6.242534 0.04223848 0.062261623353632063 0 +656 0 -6.135313 0.0444612838 0.065613765911889291 0 +657 0 2.0096736 0.7320085 1.8997409424272591 1 +660 0 -6.242534 0.04223848 0.062261623353632063 0 +661 0 -6.135313 0.0444612838 0.065613765911889291 0 +665 0 -6.3378787 0.0403514653 0.059421970461299017 0 +668 1 3.20690775 0.8325006 0.26447682282869772 1 +670 1 4.30059528 0.8956966 0.15891799661402123 1 +678 0 -6.3378787 0.0403514653 0.059421970461299017 0 +679 0 -6.3378787 0.0403514653 0.059421970461299017 0 +680 1 4.85518169 0.918907166 0.1220089772233957 1 +681 1 4.70202827 0.9130148 0.13128980227907441 1 +682 0 -6.135313 0.0444612838 0.065613765911889291 0 +683 0 -6.3378787 0.0403514653 0.059421970461299017 0 +685 0 -6.3378787 0.0403514653 0.059421970461299017 0 +688 0 -6.23065758 0.0424793661 0.062624518391501238 0 +689 0 -6.3378787 0.0403514653 0.059421970461299017 0 +691 1 4.55144644 0.9068464 0.1410698780291269 1 +692 0 -6.3378787 0.0403514653 0.059421970461299017 0 +693 0 -6.242534 0.04223848 0.062261623353632063 0 +694 0 -5.099901 0.072429806 0.10847163287095088 0 +696 1 4.524633 0.905707657 0.14288263994722966 1 +697 1 3.11245561 0.8258114 0.27611578466961867 1 +698 1 4.30059528 0.8956966 0.15891799661402123 1 +0 0 -5.974533 0.0480044559 0.070973273947168333 0 +1 0 2.678866 0.792396665 2.2680984724905557 1 +2 0 -5.432625 0.0620176345 0.092367295239153435 0 +3 0 1.89577818 0.7206904 1.8400630852016717 1 +4 0 -5.974533 0.0480044559 0.070973273947168333 0 +7 0 -5.555257 0.058545135 0.087036163665638336 0 +12 1 0.060030926 0.507503331 0.97851080425556425 1 +13 0 -4.91115141 0.0790317655 0.11877669824863878 0 +14 1 5.1771 0.930121064 0.10450958583479689 1 +15 1 0.9512126 0.6167098 0.69733625645623987 1 +16 0 -5.974533 0.0480044559 0.070973273947168333 0 +17 0 -5.974533 0.0480044559 0.070973273947168333 0 +19 0 -5.974533 0.0480044559 0.070973273947168333 0 +22 0 -5.974533 0.0480044559 0.070973273947168333 0 +23 1 5.146586 0.929122865 0.1060587067894013 1 +24 0 -5.974533 0.0480044559 0.070973273947168333 0 +26 0 -5.84363365 0.0510855578 0.075650080730339395 0 +27 0 -5.974533 0.0480044559 0.070973273947168333 0 +29 0 -4.762908 0.0845979 0.12752249409956656 0 +30 0 -5.974533 0.0480044559 0.070973273947168333 0 +33 0 -5.974533 0.0480044559 0.070973273947168333 0 +34 0 -5.555257 0.058545135 0.087036163665638336 0 +36 1 4.450465 0.902492642 0.14801292445262823 1 +38 1 3.87085843 0.873849154 0.19454383604597725 1 +39 1 1.07046688 0.6307029 0.66496749879075256 1 +42 1 3.77061033 0.8682193 0.20386857508895609 1 +43 1 2.812319 0.8031595 0.31624161720771332 1 +47 0 -5.974533 0.0480044559 0.070973273947168333 0 +49 1 3.22925186 0.8340526 0.26178968536294561 1 +53 1 1.92274415 0.7233964 0.46714163564157496 1 +55 1 4.38272762 0.8994713 0.15285087299260952 1 +57 1 -1.28345871 0.344855726 1.5359351743199918 0 +58 1 1.33113766 0.660510242 0.59834716256458442 1 +59 1 2.48897457 0.7763441 0.36523181503158558 1 +61 0 -5.432625 0.0620176345 0.092367295239153435 0 +62 1 3.609634 0.8587343 0.21971626085566962 1 +65 1 1.96780252 0.7278816 0.45822427906185348 1 +67 1 4.07177448 0.8845138 0.17704345071093652 1 +75 0 -3.99565387 0.119431272 0.18349248497039539 0 +78 0 -4.91115141 0.0790317655 0.11877669824863878 0 +80 0 -4.406663 0.09945172 0.15112447237205598 0 +81 0 -5.974533 0.0480044559 0.070973273947168333 0 +83 0 -5.432625 0.0620176345 0.092367295239153435 0 +84 1 4.73084354 0.914152265 0.12949360894701575 1 +85 1 3.12721014 0.82687 0.2742675250711904 1 +86 1 -0.3117204 0.461113632 1.1168057786673267 0 +87 1 4.73084354 0.914152265 0.12949360894701575 1 +89 0 -5.864908 0.05057236 0.074870047102428255 0 +94 0 -5.974533 0.0480044559 0.070973273947168333 0 +101 1 0.32106185 0.540046751 0.88884378902522021 1 +103 1 -1.676115 0.301944047 1.7276468641706269 0 +107 1 4.43419743 0.9017745 0.14916133923493161 1 +110 0 -1.21769476 0.352322161 0.62665171377775342 0 +114 0 -0.9544226 0.382910848 0.69644916087447573 0 +116 0 1.48628664 0.6776828 1.6334469930748525 1 +118 0 -4.80152655 0.08311451 0.1251865318331622 0 +119 0 -5.30172539 0.06593586 0.098406471340375598 0 +124 1 1.3495574 0.6625724 0.59385002196764458 1 +126 1 4.9201827 0.9212963 0.118262878162882 1 +127 0 -5.974533 0.0480044559 0.070973273947168333 0 +130 0 -4.762908 0.0845979 0.12752249409956656 0 +134 0 -5.864908 0.05057236 0.074870047102428255 0 +135 0 -4.62521 0.0900844 0.13619535592091017 0 +136 0 -5.974533 0.0480044559 0.070973273947168333 0 +139 0 -1.832093 0.285764128 0.48552750072742312 0 +140 0 -5.974533 0.0480044559 0.070973273947168333 0 +142 1 3.56091166 0.8557531 0.22473344136518184 1 +143 0 -1.832093 0.285764128 0.48552750072742312 0 +146 1 -0.153355062 0.48084 1.0563711866958063 0 +148 0 -4.320837 0.103361659 0.15740190294274298 0 +149 1 4.952993 0.9224776 0.11641421080668345 1 +153 0 -4.91115141 0.0790317655 0.11877669824863878 0 +155 1 2.47921371 0.7754956 0.36680952002717315 1 +157 0 -5.974533 0.0480044559 0.070973273947168333 0 +158 0 -1.3031919 0.342629969 0.60522240860358534 0 +159 1 4.952993 0.9224776 0.11641421080668345 1 +160 1 5.005415 0.9243314 0.11351786033512073 1 +162 0 -5.974533 0.0480044559 0.070973273947168333 0 +163 0 -4.233674 0.107471094 0.16402920021311729 0 +165 0 -5.432625 0.0620176345 0.092367295239153435 0 +166 1 2.9034152 0.8102611 0.30354126743346843 1 +168 0 -5.974533 0.0480044559 0.070973273947168333 0 +170 0 -5.974533 0.0480044559 0.070973273947168333 0 +172 0 -5.974533 0.0480044559 0.070973273947168333 0 +175 1 4.691906 0.912612 0.13192643773024004 1 +178 0 -5.974533 0.0480044559 0.070973273947168333 0 +182 0 -5.974533 0.0480044559 0.070973273947168333 0 +184 1 5.083561 0.927019358 0.10932862988856006 1 +185 0 -5.974533 0.0480044559 0.070973273947168333 0 +186 1 3.578182 0.8568158 0.22294298551465075 1 +190 1 5.05077 0.925902367 0.11106802083275139 1 +193 0 -5.974533 0.0480044559 0.070973273947168333 0 +194 0 -5.974533 0.0480044559 0.070973273947168333 0 +195 0 -5.974533 0.0480044559 0.070973273947168333 0 +197 0 -5.974533 0.0480044559 0.070973273947168333 0 +200 1 4.952993 0.9224776 0.11641421080668345 1 +203 0 -5.974533 0.0480044559 0.070973273947168333 0 +208 0 -5.974533 0.0480044559 0.070973273947168333 0 +213 1 4.952993 0.9224776 0.11641421080668345 1 +214 1 4.95600557 0.922585249 0.11624586929599191 1 +215 1 5.05077 0.925902367 0.11106802083275139 1 +217 0 -5.974533 0.0480044559 0.070973273947168333 0 +220 0 -5.974533 0.0480044559 0.070973273947168333 0 +221 1 4.69607544 0.912778139 0.13166385515487664 1 +222 1 -1.832093 0.285764128 1.8071032688954418 0 +224 1 4.82543755 0.917792 0.1237608284964886 1 +225 0 -5.974533 0.0480044559 0.070973273947168333 0 +227 1 4.34543848 0.8977728 0.15557772526296437 1 +229 1 4.952993 0.9224776 0.11641421080668345 1 +230 1 3.14041662 0.8278133 0.27262261958222528 1 +231 1 3.76383972 0.867831469 0.20451319397782594 1 +232 0 -0.00182669621 0.499771655 0.99934128486766483 0 +234 0 -5.20997143 0.0688182339 0.1028652864533212 0 +235 0 -0.859357953 0.394202977 0.72309360740781903 0 +236 1 4.437218 0.9019082 0.1489474673177292 1 +238 1 4.18336 0.8900919 0.16797380246926541 1 +243 0 -1.832093 0.285764128 0.48552750072742312 0 +245 0 -5.432625 0.0620176345 0.092367295239153435 0 +251 1 4.54024458 0.9063722 0.14182449967612121 1 +253 1 3.77061033 0.8682193 0.20386857508895609 1 +255 1 1.50728106 0.679971457 0.5564539079217623 1 +256 0 -5.974533 0.0480044559 0.070973273947168333 0 +261 1 4.691906 0.912612 0.13192643773024004 1 +263 1 4.66780043 0.911646 0.13345435924027338 1 +264 1 3.55159426 0.8551771 0.22570486636738665 1 +265 0 -4.762908 0.0845979 0.12752249409956656 0 +266 1 4.190417 0.8904366 0.16741521793084876 1 +270 1 4.16370153 0.8891266 0.16953924219013125 1 +273 1 -0.589163661 0.426882535 1.2280889551832246 0 +274 0 -5.974533 0.0480044559 0.070973273947168333 0 +281 0 -5.974533 0.0480044559 0.070973273947168333 0 +282 1 3.74070573 0.8664991 0.20672980075573399 1 +286 1 4.437218 0.9019082 0.1489474673177292 1 +287 0 -5.864908 0.05057236 0.074870047102428255 0 +289 1 3.833934 0.8717998 0.19793117810941421 1 +292 1 4.82543755 0.917792 0.1237608284964886 1 +294 0 -1.832093 0.285764128 0.48552750072742312 0 +295 1 4.541771 0.9064369 0.1417214699870501 1 +298 0 -4.9973526 0.0759510249 0.11395877757940477 0 +302 1 4.952993 0.9224776 0.11641421080668345 1 +305 1 3.67662883 0.8627492 0.21298683231853144 1 +306 0 -5.974533 0.0480044559 0.070973273947168333 0 +307 0 -5.974533 0.0480044559 0.070973273947168333 0 +310 0 -5.864908 0.05057236 0.074870047102428255 0 +313 0 -5.974533 0.0480044559 0.070973273947168333 0 +315 0 3.57622576 0.8566958 2.8028469119882984 1 +318 0 -5.12825155 0.07148322 0.10700010796555662 0 +320 1 4.9201827 0.9212963 0.118262878162882 1 +322 0 -5.974533 0.0480044559 0.070973273947168333 0 +324 0 -5.974533 0.0480044559 0.070973273947168333 0 +325 0 -4.74784231 0.08518308 0.12844504009491406 0 +326 1 -0.569087565 0.429340154 1.2198069880919129 0 +330 1 3.89335084 0.8750837 0.19250710531624327 1 +334 1 3.93655872 0.8774262 0.18865029730739294 1 +335 0 -5.974533 0.0480044559 0.070973273947168333 0 +337 0 -5.974533 0.0480044559 0.070973273947168333 0 +339 1 4.283956 0.8949168 0.16017457674585028 1 +340 1 4.889669 0.9201829 0.1200074736709852 1 +341 0 -5.974533 0.0480044559 0.070973273947168333 0 +342 0 -5.974533 0.0480044559 0.070973273947168333 0 +345 0 -5.974533 0.0480044559 0.070973273947168333 0 +351 0 -5.974533 0.0480044559 0.070973273947168333 0 +356 1 0.232216328 0.5289945 0.91867537055352333 1 +357 1 5.083561 0.927019358 0.10932862988856006 1 +359 1 3.440699 0.848173857 0.23756807946032787 1 +362 0 -4.251351 0.106626235 0.16266420602415232 0 +363 0 -0.0254919771 0.496813536 0.99083498057144959 0 +364 0 -5.974533 0.0480044559 0.070973273947168333 0 +365 0 -5.974533 0.0480044559 0.070973273947168333 0 +367 1 4.988552 0.923739552 0.1144419524293929 1 +369 0 -4.762908 0.0845979 0.12752249409956656 0 +372 0 -5.555257 0.058545135 0.087036163665638336 0 +374 0 -5.555257 0.058545135 0.087036163665638336 0 +375 0 -5.974533 0.0480044559 0.070973273947168333 0 +380 0 -5.974533 0.0480044559 0.070973273947168333 0 +382 0 -5.42435741 0.06225853 0.092737860790008786 0 +385 0 -4.64211941 0.08939376 0.13510074501301572 0 +386 1 4.95600557 0.922585249 0.11624586929599191 1 +390 0 -5.974533 0.0480044559 0.070973273947168333 0 +393 0 -5.974533 0.0480044559 0.070973273947168333 0 +394 0 -4.63200855 0.08980614 0.13575423986181803 0 +397 0 -5.974533 0.0480044559 0.070973273947168333 0 +400 1 4.284063 0.8949218 0.16016650532362478 1 +401 0 -5.974533 0.0480044559 0.070973273947168333 0 +402 0 -4.527248 0.0941807553 0.14270490423693205 0 +403 0 -4.46386 0.09691958 0.14707363043442426 0 +405 0 -5.974533 0.0480044559 0.070973273947168333 0 +407 0 -5.974533 0.0480044559 0.070973273947168333 0 +408 0 -1.47589576 0.323453039 0.56373801560043146 0 +410 0 -5.974533 0.0480044559 0.070973273947168333 0 +411 0 -1.832093 0.285764128 0.48552750072742312 0 +412 1 4.46344376 0.9030622 0.14710269663491421 1 +417 0 -5.974533 0.0480044559 0.070973273947168333 0 +420 0 -3.85605669 0.12696898 0.19589517889931171 0 +421 1 5.083561 0.927019358 0.10932862988856006 1 +424 0 -5.974533 0.0480044559 0.070973273947168333 0 +425 1 4.952993 0.9224776 0.11641421080668345 1 +426 0 -4.527248 0.0941807553 0.14270490423693205 0 +427 1 4.762418 0.9153831 0.1275524372463456 1 +431 0 -5.12825155 0.07148322 0.10700010796555662 0 +432 0 -5.974533 0.0480044559 0.070973273947168333 0 +433 0 -4.91943836 0.0787307 0.11830516058745956 0 +435 1 4.95600557 0.922585249 0.11624586929599191 1 +437 0 -5.974533 0.0480044559 0.070973273947168333 0 +438 0 -4.257989 0.106310487 0.16215439945172758 0 +443 0 -5.432625 0.0620176345 0.092367295239153435 0 +444 0 -5.864908 0.05057236 0.074870047102428255 0 +445 0 -5.974533 0.0480044559 0.070973273947168333 0 +446 0 -5.974533 0.0480044559 0.070973273947168333 0 +447 0 -5.974533 0.0480044559 0.070973273947168333 0 +448 0 -5.974533 0.0480044559 0.070973273947168333 0 +458 0 -5.555257 0.058545135 0.087036163665638336 0 +459 0 -4.762908 0.0845979 0.12752249409956656 0 +460 0 -5.974533 0.0480044559 0.070973273947168333 0 +461 0 -1.832093 0.285764128 0.48552750072742312 0 +462 0 -5.974533 0.0480044559 0.070973273947168333 0 +463 0 -5.974533 0.0480044559 0.070973273947168333 0 +468 0 -5.974533 0.0480044559 0.070973273947168333 0 +469 0 -5.555257 0.058545135 0.087036163665638336 0 +470 0 -5.974533 0.0480044559 0.070973273947168333 0 +471 0 -5.974533 0.0480044559 0.070973273947168333 0 +472 0 -5.974533 0.0480044559 0.070973273947168333 0 +473 0 -5.974533 0.0480044559 0.070973273947168333 0 +475 0 -5.974533 0.0480044559 0.070973273947168333 0 +476 0 -5.555257 0.058545135 0.087036163665638336 0 +477 0 -5.974533 0.0480044559 0.070973273947168333 0 +478 0 -5.84363365 0.0510855578 0.075650080730339395 0 +479 1 4.284063 0.8949218 0.16016650532362478 1 +481 0 -4.81467724 0.0826148 0.12440046487155368 0 +485 0 -4.91115141 0.0790317655 0.11877669824863878 0 +486 0 -5.974533 0.0480044559 0.070973273947168333 0 +488 1 1.81132364 0.7121116 0.48982475674007986 1 +490 0 -5.974533 0.0480044559 0.070973273947168333 0 +491 1 4.41421556 0.900886 0.15058354022546525 1 +494 0 -0.5405644 0.4328378 0.81816674711690196 0 +496 0 -5.974533 0.0480044559 0.070973273947168333 0 +498 0 -5.974533 0.0480044559 0.070973273947168333 0 +499 0 -5.974533 0.0480044559 0.070973273947168333 0 +500 0 -5.974533 0.0480044559 0.070973273947168333 0 +503 0 -5.974533 0.0480044559 0.070973273947168333 0 +505 0 -5.73887253 0.0536852852 0.07960803601171651 0 +506 1 4.33508968 0.8972969 0.15634265908188469 1 +508 0 -5.974533 0.0480044559 0.070973273947168333 0 +509 0 -5.974533 0.0480044559 0.070973273947168333 0 +511 0 -5.974533 0.0480044559 0.070973273947168333 0 +512 0 -5.974533 0.0480044559 0.070973273947168333 0 +515 1 4.603288 0.9090131 0.13762702117804301 1 +516 0 -5.974533 0.0480044559 0.070973273947168333 0 +518 0 -5.555257 0.058545135 0.087036163665638336 0 +524 0 -5.974533 0.0480044559 0.070973273947168333 0 +525 0 -5.974533 0.0480044559 0.070973273947168333 0 +526 0 -5.974533 0.0480044559 0.070973273947168333 0 +530 1 4.4572773 0.902792 0.14753449746593614 1 +536 0 -5.974533 0.0480044559 0.070973273947168333 0 +537 0 -5.555257 0.058545135 0.087036163665638336 0 +542 0 -5.73887253 0.0536852852 0.07960803601171651 0 +543 0 -5.974533 0.0480044559 0.070973273947168333 0 +545 0 -5.974533 0.0480044559 0.070973273947168333 0 +550 0 -5.974533 0.0480044559 0.070973273947168333 0 +551 0 -5.974533 0.0480044559 0.070973273947168333 0 +552 0 -4.406663 0.09945172 0.15112447237205598 0 +553 0 0.170345783 0.521280348 1.0627470642070393 1 +554 0 -5.974533 0.0480044559 0.070973273947168333 0 +555 0 -5.73887253 0.0536852852 0.07960803601171651 0 +556 0 -5.42435741 0.06225853 0.092737860790008786 0 +562 0 -5.974533 0.0480044559 0.070973273947168333 0 +564 0 -5.974533 0.0480044559 0.070973273947168333 0 +567 0 -4.91115141 0.0790317655 0.11877669824863878 0 +568 1 4.25844669 0.893711269 0.16211927936663173 1 +570 1 4.9201827 0.9212963 0.118262878162882 1 +571 1 4.82543755 0.917792 0.1237608284964886 1 +572 0 -5.974533 0.0480044559 0.070973273947168333 0 +573 0 -5.974533 0.0480044559 0.070973273947168333 0 +574 1 3.34847474 0.842139959 0.24786807316439324 1 +575 0 -5.555257 0.058545135 0.087036163665638336 0 +576 0 -5.974533 0.0480044559 0.070973273947168333 0 +579 0 -5.974533 0.0480044559 0.070973273947168333 0 +580 0 -5.555257 0.058545135 0.087036163665638336 0 +583 0 -5.974533 0.0480044559 0.070973273947168333 0 +585 0 -5.974533 0.0480044559 0.070973273947168333 0 +587 0 -5.974533 0.0480044559 0.070973273947168333 0 +588 1 4.46565771 0.9031591 0.14694796930059398 1 +589 0 -5.974533 0.0480044559 0.070973273947168333 0 +591 1 4.43419743 0.9017745 0.14916133923493161 1 +592 1 4.54024458 0.9063722 0.14182449967612121 1 +595 0 -5.974533 0.0480044559 0.070973273947168333 0 +596 0 -5.555257 0.058545135 0.087036163665638336 0 +597 0 -4.762908 0.0845979 0.12752249409956656 0 +598 0 -5.974533 0.0480044559 0.070973273947168333 0 +599 0 -4.63200855 0.08980614 0.13575423986181803 0 +601 0 -5.974533 0.0480044559 0.070973273947168333 0 +603 1 1.34133589 0.6616527 0.59585398095726827 1 +605 1 4.33287573 0.897194862 0.15650673578809424 1 +608 1 4.541771 0.9064369 0.1417214699870501 1 +610 1 4.54024458 0.9063722 0.14182449967612121 1 +611 1 3.312721 0.839748859 0.25197016397640781 1 +615 0 -4.762908 0.0845979 0.12752249409956656 0 +616 0 -5.974533 0.0480044559 0.070973273947168333 0 +620 0 -5.974533 0.0480044559 0.070973273947168333 0 +623 0 -5.974533 0.0480044559 0.070973273947168333 0 +625 0 -3.56294465 0.144121423 0.22452195867006242 0 +626 1 1.81517076 0.7125058 0.48902630146774384 1 +628 0 -5.974533 0.0480044559 0.070973273947168333 0 +630 0 -4.63200855 0.08980614 0.13575423986181803 0 +631 0 -5.974533 0.0480044559 0.070973273947168333 0 +632 0 -5.974533 0.0480044559 0.070973273947168333 0 +635 0 -4.762908 0.0845979 0.12752249409956656 0 +636 1 3.7019937 0.8642441 0.21048923959189306 1 +637 0 -4.1270895 0.112690896 0.17249132359801098 0 +640 0 -5.974533 0.0480044559 0.070973273947168333 0 +643 0 -5.974533 0.0480044559 0.070973273947168333 0 +646 0 -5.42435741 0.06225853 0.092737860790008786 0 +647 0 -5.974533 0.0480044559 0.070973273947168333 0 +648 1 4.327261 0.896935642 0.15692362438793947 1 +650 0 -4.354235 0.101824239 0.15493030597789326 0 +651 0 -5.84363365 0.0510855578 0.075650080730339395 0 +655 0 -5.974533 0.0480044559 0.070973273947168333 0 +658 1 4.95600557 0.922585249 0.11624586929599191 1 +659 0 -5.974533 0.0480044559 0.070973273947168333 0 +662 0 -4.762908 0.0845979 0.12752249409956656 0 +663 0 -4.762908 0.0845979 0.12752249409956656 0 +664 0 -5.974533 0.0480044559 0.070973273947168333 0 +666 0 -4.74688053 0.08522056 0.12850415454866093 0 +667 0 -5.974533 0.0480044559 0.070973273947168333 0 +669 1 4.512311 0.905180156 0.1437231373495434 1 +671 0 -5.84363365 0.0510855578 0.075650080730339395 0 +672 0 -5.974533 0.0480044559 0.070973273947168333 0 +673 0 -5.20997143 0.0688182339 0.1028652864533212 0 +674 0 -5.974533 0.0480044559 0.070973273947168333 0 +675 0 -4.762908 0.0845979 0.12752249409956656 0 +676 0 -5.555257 0.058545135 0.087036163665638336 0 +677 0 -5.974533 0.0480044559 0.070973273947168333 0 +684 0 -5.974533 0.0480044559 0.070973273947168333 0 +686 0 -5.974533 0.0480044559 0.070973273947168333 0 +687 0 -5.16711855 0.07020404 0.10501394052891096 0 +690 0 -5.974533 0.0480044559 0.070973273947168333 0 +695 0 -5.974533 0.0480044559 0.070973273947168333 0 diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-out.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-out.txt new file mode 100644 index 0000000000..ba50420a1d --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-out.txt @@ -0,0 +1,45 @@ +maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3448 (241.0/(241.0+458.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 240 | 1 | 0.9959 + negative || 8 | 450 | 0.9825 + ||====================== +Precision || 0.9677 | 0.9978 | +OVERALL 0/1 ACCURACY: 0.987124 +LOG LOSS/instance: 0.167803 +Test-set entropy (prior Log-Loss/instance): 0.929318 +LOG-LOSS REDUCTION (RIG): 81.943403 +AUC: 0.995765 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.995765 (0.0000) +Accuracy: 0.987124 (0.0000) +Positive precision: 0.967742 (0.0000) +Positive recall: 0.995851 (0.0000) +Negative precision: 0.997783 (0.0000) +Negative recall: 0.982533 (0.0000) +Log-loss: 0.167803 (0.0000) +Log-loss reduction: 81.943403 (0.0000) +F1 Score: 0.981595 (0.0000) +AUPRC: 0.986193 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-rp.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-rp.txt new file mode 100644 index 0000000000..77718de528 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss-rp.txt @@ -0,0 +1,4 @@ +LightGBM +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.995765 0.987124 0.967742 0.995851 0.997783 0.982533 0.167803 81.94341 0.981595 0.986193 10 0.2 20 10 goss + 1 LightGBM %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBM{nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/booster:goss;/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss.txt b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss.txt new file mode 100644 index 0000000000..c5643a9c46 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBM/LightGBMGoss-TrainTest-breast-cancer.goss.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -6.12573862 0.04466511 0.065921539368278048 0 +1 0 0.7871392 0.5971417 1.3116555550127289 1 +2 0 -5.88718367 0.0500402562 0.074061716914150894 0 +3 0 -0.0538624227 0.4932676 0.98070400644517874 0 +4 0 -5.88278341 0.0501449443 0.074220714532658688 0 +5 1 4.913594 0.921057045 0.11863758281262027 1 +6 0 -2.57204 0.216527224 0.35204494911913131 0 +7 0 -6.12573862 0.04466511 0.065921539368278048 0 +8 0 -6.12573862 0.04466511 0.065921539368278048 0 +9 0 -6.12573862 0.04466511 0.065921539368278048 0 +10 0 -6.12573862 0.04466511 0.065921539368278048 0 +11 0 -6.12573862 0.04466511 0.065921539368278048 0 +12 1 0.9067417 0.611440361 0.70971630871106062 1 +13 0 -5.275919 0.06673501 0.09964131392293657 0 +14 1 4.913594 0.921057045 0.11863758281262027 1 +15 1 0.8682936 0.606863439 0.72055618783458208 1 +16 0 -6.12573862 0.04466511 0.065921539368278048 0 +17 0 -6.12573862 0.04466511 0.065921539368278048 0 +18 1 4.694235 0.9127048 0.13177973608325938 1 +19 0 -4.45841932 0.09715795 0.14745447741632708 0 +20 1 2.096338 0.740423143 0.43357810562202381 1 +21 1 4.986593 0.92367053 0.11454975519156474 1 +22 0 -6.12573862 0.04466511 0.065921539368278048 0 +23 1 4.37396049 0.8990742 0.15348791467520745 1 +24 0 -6.12573862 0.04466511 0.065921539368278048 0 +25 1 1.11781752 0.6362 0.65244769857228824 1 +26 0 -6.12573862 0.04466511 0.065921539368278048 0 +27 0 -6.12573862 0.04466511 0.065921539368278048 0 +28 0 -6.12573862 0.04466511 0.065921539368278048 0 +29 0 -5.904324 0.0496344268 0.073445519186050218 0 +30 0 -6.12573862 0.04466511 0.065921539368278048 0 +31 0 -6.12573862 0.04466511 0.065921539368278048 0 +32 1 4.85804653 0.919013858 0.12184147876101566 1 +33 0 -6.12573862 0.04466511 0.065921539368278048 0 +34 0 -6.12573862 0.04466511 0.065921539368278048 0 +35 0 -6.12573862 0.04466511 0.065921539368278048 0 +36 1 4.85834026 0.9190248 0.12182426214416593 1 +37 0 -2.82574654 0.195781261 0.31434014181474312 0 +38 1 3.79839039 0.8698004 0.20124374118024355 1 +39 1 3.604104 0.858398557 0.2202804445036696 1 +40 0 4.94449 0.922173 3.6835858737000455 1 +41 1 4.08736324 0.8853076 0.17574927204930149 1 +42 1 4.084668 0.8851707 0.17597240053835977 1 +43 1 3.17567873 0.8303119 0.26827472950514092 1 +44 1 4.86881256 0.9194136 0.12121404707413413 1 +45 0 -6.12573862 0.04466511 0.065921539368278048 0 +46 1 2.78956151 0.801354349 0.31948776984346594 1 +47 0 -6.12573862 0.04466511 0.065921539368278048 0 +48 0 -5.88278341 0.0501449443 0.074220714532658688 0 +49 1 4.470567 0.903373539 0.14660543821458613 1 +50 1 2.70828986 0.7948064 0.331324567514511 1 +51 1 1.4053 0.668775 0.5804071294460843 1 +52 1 4.20677 0.8912317 0.16612752105266257 1 +53 1 4.77000046 0.9156763 0.12709041910070321 1 +54 1 4.611467 0.909350753 0.13709121986917477 1 +55 1 4.7640996 0.915448248 0.12744976419697612 1 +56 1 3.86125278 0.873318732 0.19541981005507014 1 +57 1 2.523603 0.7793361 0.35968245875358495 1 +58 1 2.48702025 0.7761744 0.36554719587520546 1 +59 1 1.97529042 0.728622556 0.45675643807174765 1 +60 1 3.22504544 0.833761334 0.2622936259972814 1 +61 0 -5.88718367 0.0500402562 0.074061716914150894 0 +62 1 4.39070368 0.899831355 0.15227345639462678 1 +63 1 0.434102565 0.5540508 0.85190982593788134 1 +64 0 -6.12573862 0.04466511 0.065921539368278048 0 +65 1 1.88134885 0.7192359 0.47546306732739252 1 +66 0 -6.12573862 0.04466511 0.065921539368278048 0 +67 1 3.43093181 0.8475439 0.23864000591652512 1 +68 1 4.617587 0.9096027 0.13669155561825619 1 +69 0 -6.12573862 0.04466511 0.065921539368278048 0 +70 0 -5.509922 0.05980708 0.088971279531383576 0 +71 1 1.8125602 0.7122384 0.48956793284940486 1 +72 0 -2.97863269 0.184024364 0.29340201866481563 0 +73 1 4.907225 0.920825243 0.11900071162759861 1 +74 1 3.884019 0.874572754 0.19334969091898527 1 +75 0 -5.20182657 0.06907967 0.10327038637237132 0 +76 0 -5.904324 0.0496344268 0.073445519186050218 0 +77 0 -5.17382336 0.0699855238 0.10467492216060112 0 +78 0 -5.275919 0.06673501 0.09964131392293657 0 +79 0 -6.048977 0.04633175 0.068440605343774177 0 +80 0 -4.493066 0.09564895 0.14504519266029128 0 +81 0 -6.12573862 0.04466511 0.065921539368278048 0 +82 0 -6.12573862 0.04466511 0.065921539368278048 0 +83 0 -4.254511 0.106475823 0.16242132801183079 0 +84 1 4.55594158 0.907036066 0.14076817777784198 1 +85 1 1.725657 0.703251243 0.50788789811799706 1 +86 1 2.55038524 0.781630337 0.35544163150392882 1 +87 1 4.55594158 0.907036066 0.14076817777784198 1 +88 0 -6.12573862 0.04466511 0.065921539368278048 0 +89 0 -6.048977 0.04633175 0.068440605343774177 0 +90 0 -6.12573862 0.04466511 0.065921539368278048 0 +91 0 -6.12573862 0.04466511 0.065921539368278048 0 +92 0 -6.12573862 0.04466511 0.065921539368278048 0 +93 0 -6.12573862 0.04466511 0.065921539368278048 0 +94 0 -6.12573862 0.04466511 0.065921539368278048 0 +95 0 -6.12573862 0.04466511 0.065921539368278048 0 +96 0 -6.12573862 0.04466511 0.065921539368278048 0 +97 0 -6.12573862 0.04466511 0.065921539368278048 0 +98 1 4.260588 0.8938129 0.16195523659395877 1 +99 1 4.96492338 0.9229031 0.11574888242720581 1 +100 1 4.80958557 0.917192042 0.12470425762982235 1 +101 1 0.5993819 0.574367 0.79995526602333489 1 +102 0 -6.12573862 0.04466511 0.065921539368278048 0 +103 1 1.68038464 0.6985057 0.51765620716822192 1 +104 1 4.7297945 0.9141111 0.12955861053021853 1 +105 1 3.71265173 0.8648681 0.20944796162171331 1 +106 1 4.72994661 0.914117038 0.12954920346283152 1 +107 1 4.55594158 0.907036066 0.14076817777784198 1 +108 0 -4.562707 0.0926790759 0.14031516516923384 0 +109 1 4.084668 0.8851707 0.17597240053835977 1 +110 0 -2.311099 0.2394769 0.39493603420278445 0 +111 1 4.55957127 0.907189 0.14052492930299665 1 +112 1 4.94610071 0.92223084 0.11680018409240302 1 +113 1 4.621939 0.909781456 0.13640806630159577 1 +114 0 -3.25624061 0.164088026 0.25857706754711179 0 +115 0 -3.30130816 0.161020562 0.25329264195172102 0 +116 0 -2.00872159 0.2680849 0.45025181165130657 0 +117 1 4.96379662 0.922863066 0.11581149726012986 1 +118 0 -5.47729063 0.06073113 0.090389902282158971 0 +119 0 -5.323412 0.06527118 0.097380212869344535 0 +120 0 -6.12573862 0.04466511 0.065921539368278048 0 +121 0 -5.323412 0.06527118 0.097380212869344535 0 +122 1 4.9408145 0.922041059 0.11709709951078236 1 +123 1 4.1693 0.8894023 0.1690920075230945 1 +124 1 4.048633 0.8833266 0.17898115446692364 1 +125 0 -6.12573862 0.04466511 0.065921539368278048 0 +126 1 4.687142 0.9124219 0.13222704839686869 1 +127 0 -6.12573862 0.04466511 0.065921539368278048 0 +128 1 3.9906776 0.88030684 0.18392161738135088 1 +129 0 -5.39437771 0.06313944 0.094093756062156753 0 +130 0 -5.509922 0.05980708 0.088971279531383576 0 +131 0 -6.12573862 0.04466511 0.065921539368278048 0 +132 1 3.632753 0.8601308 0.21737204988666808 1 +133 0 -6.12573862 0.04466511 0.065921539368278048 0 +134 0 -6.048977 0.04633175 0.068440605343774177 0 +135 0 -3.97436738 0.120555133 0.18533495728267063 0 +136 0 -6.12573862 0.04466511 0.065921539368278048 0 +137 0 -6.12573862 0.04466511 0.065921539368278048 0 +138 0 -6.12573862 0.04466511 0.065921539368278048 0 +139 0 -2.57204 0.216527224 0.35204494911913131 0 +140 0 -6.12573862 0.04466511 0.065921539368278048 0 +141 0 -6.12573862 0.04466511 0.065921539368278048 0 +142 1 4.41024256 0.900708437 0.15086791961091048 1 +143 0 -3.30130816 0.161020562 0.25329264195172102 0 +144 0 -6.12573862 0.04466511 0.065921539368278048 0 +145 0 -2.77348518 0.1999283 0.32179879660040939 0 +146 1 0.494813681 0.56153816 0.83254402924853765 1 +147 0 -5.810422 0.0518965647 0.076883633329030782 0 +148 0 -1.96937633 0.271962553 0.45791543727549477 0 +149 1 4.924066 0.921436965 0.11804261890737246 1 +150 0 -6.12573862 0.04466511 0.065921539368278048 0 +151 1 3.76944828 0.8681528 0.20397911167094482 1 +152 1 4.97612047 0.923300564 0.11512772651515453 1 +153 0 -4.595947 0.09129094 0.13810963729887868 0 +154 0 -6.12573862 0.04466511 0.065921539368278048 0 +155 1 3.7969203 0.8697171 0.20138185980340564 1 +156 0 -6.12573862 0.04466511 0.065921539368278048 0 +157 0 -6.12573862 0.04466511 0.065921539368278048 0 +158 0 -3.50268 0.147878259 0.23086853534747812 0 +159 1 4.941812 0.9220769 0.11704105018174046 1 +160 1 4.9408145 0.922041059 0.11709709951078236 1 +161 0 -6.12573862 0.04466511 0.065921539368278048 0 +162 0 -6.12573862 0.04466511 0.065921539368278048 0 +163 0 -5.275919 0.06673501 0.09964131392293657 0 +164 0 -1.28979349 0.34414047 0.60854123905801871 0 +165 0 -5.88718367 0.0500402562 0.074061716914150894 0 +166 1 3.69228983 0.863673866 0.21144145961034241 1 +167 1 4.012953 0.8814754 0.18200780515801596 1 +168 0 -6.12573862 0.04466511 0.065921539368278048 0 +169 0 -6.12573862 0.04466511 0.065921539368278048 0 +170 0 -6.12573862 0.04466511 0.065921539368278048 0 +171 0 -6.12573862 0.04466511 0.065921539368278048 0 +172 0 -6.12573862 0.04466511 0.065921539368278048 0 +173 1 5.004027 0.924282849 0.11359368245893879 1 +174 1 4.265131 0.8940283 0.1616075853020332 1 +175 1 4.94449 0.922173 0.11689063238018986 1 +176 0 -6.12573862 0.04466511 0.065921539368278048 0 +177 1 4.535296 0.906161964 0.14215915974923193 1 +178 0 -6.12573862 0.04466511 0.065921539368278048 0 +179 1 1.33880115 0.6613689 0.59647287441982744 1 +180 0 -6.12573862 0.04466511 0.065921539368278048 0 +181 0 -6.12573862 0.04466511 0.065921539368278048 0 +182 0 -4.45841932 0.09715795 0.14745447741632708 0 +183 1 4.94449 0.922173 0.11689063238018986 1 +184 1 4.265131 0.8940283 0.1616075853020332 1 +185 0 -6.12573862 0.04466511 0.065921539368278048 0 +186 1 4.5090003 0.905038 0.14394972806289524 1 +187 1 4.930342 0.9216638 0.1176874750230081 1 +188 1 4.586454 0.9083145 0.13873614247612856 1 +189 0 -5.299038 0.06601866 0.098534373417999532 0 +190 1 4.97612047 0.923300564 0.11512772651515453 1 +191 1 4.96466732 0.922894 0.11576313824398836 1 +192 0 -6.12573862 0.04466511 0.065921539368278048 0 +193 0 -6.12573862 0.04466511 0.065921539368278048 0 +194 0 -6.12573862 0.04466511 0.065921539368278048 0 +195 0 -6.12573862 0.04466511 0.065921539368278048 0 +196 0 2.62998962 0.7883478 2.2402324786627403 1 +197 0 -5.88278341 0.0501449443 0.074220714532658688 0 +198 0 -6.12573862 0.04466511 0.065921539368278048 0 +199 0 -6.12573862 0.04466511 0.065921539368278048 0 +200 1 4.9408145 0.922041059 0.11709709951078236 1 +201 1 4.70470667 0.9131211 0.13112188210334919 1 +202 0 -6.12573862 0.04466511 0.065921539368278048 0 +203 0 -6.12573862 0.04466511 0.065921539368278048 0 +204 0 -6.12573862 0.04466511 0.065921539368278048 0 +205 1 5.004027 0.924282849 0.11359368245893879 1 +206 1 5.00101566 0.9241774 0.11375827204562068 1 +207 0 -6.12573862 0.04466511 0.065921539368278048 0 +208 0 -6.12573862 0.04466511 0.065921539368278048 0 +209 0 -6.12573862 0.04466511 0.065921539368278048 0 +210 1 4.91459131 0.921093345 0.1185807267410698 1 +211 1 4.554042 0.906955957 0.14089560098583823 1 +212 0 -6.12573862 0.04466511 0.065921539368278048 0 +213 1 4.93133974 0.9216998 0.11763112286398286 1 +214 1 4.930342 0.9216638 0.1176874750230081 1 +215 1 4.959372 0.9227054 0.11605797639002108 1 +216 0 -6.12573862 0.04466511 0.065921539368278048 0 +217 0 -6.12573862 0.04466511 0.065921539368278048 0 +218 1 4.95708561 0.9226238 0.11618556568194083 1 +219 0 -4.72126245 0.0862244442 0.13008824504508865 0 +220 0 -6.12573862 0.04466511 0.065921539368278048 0 +221 1 4.941812 0.9220769 0.11704105018174046 1 +222 1 -2.26988316 0.24325031 2.0394864488016866 0 +223 1 4.46880245 0.9032965 0.14672852298737726 1 +224 1 4.93133974 0.9216998 0.11763112286398286 1 +225 0 -6.12573862 0.04466511 0.065921539368278048 0 +226 1 4.79576874 0.916665852 0.12553216413691681 1 +227 1 4.418471 0.9010758 0.15027965322376918 1 +228 0 -6.12573862 0.04466511 0.065921539368278048 0 +229 1 4.941812 0.9220769 0.11704105018174046 1 +230 1 3.05095315 0.821343541 0.28394231449164004 1 +231 1 4.55036926 0.906800866 0.14114232582393552 1 +232 0 -1.2109406 0.353093177 0.62837016596481299 0 +233 1 4.89690256 0.9204481 0.11959167995771566 1 +234 0 -5.339473 0.06478294 0.096626847259604867 0 +235 0 -2.31735182 0.238907963 0.3938571690946614 0 +236 1 4.9908905 0.9238219 0.11431330717108838 1 +237 1 4.91474152 0.921098769 0.11857223119865881 1 +238 1 4.974793 0.923253536 0.115201211668675 1 +239 1 4.72157764 0.913787961 0.13006865946632085 1 +240 0 -3.35855079 0.15719144 0.24672312869277493 0 +241 0 -6.138525 0.0443931036 0.065510829404308496 0 +242 0 -6.12573862 0.04466511 0.065921539368278048 0 +243 0 -2.38702083 0.232631683 0.38200889517336939 0 +244 0 -6.12573862 0.04466511 0.065921539368278048 0 +245 0 -5.88718367 0.0500402562 0.074061716914150894 0 +246 1 4.913594 0.921057045 0.11863758281262027 1 +247 1 4.17664766 0.8897631 0.1685067988684536 1 +248 0 -4.60795736 0.09079398 0.13732086179158925 0 +249 0 -2.57204 0.216527224 0.35204494911913131 0 +250 0 -6.12573862 0.04466511 0.065921539368278048 0 +251 1 4.83239174 0.918054 0.12334910346462673 1 +252 0 1.71953213 0.7026118 1.7495807101818632 1 +253 1 4.084668 0.8851707 0.17597240053835977 1 +254 1 4.39070368 0.899831355 0.15227345639462678 1 +255 1 0.69604063 0.5861374 0.77068916535044074 1 +256 0 -6.12573862 0.04466511 0.065921539368278048 0 +257 0 -6.12573862 0.04466511 0.065921539368278048 0 +258 0 -6.12573862 0.04466511 0.065921539368278048 0 +259 0 -0.0538624227 0.4932676 0.98070400644517874 0 +260 1 4.694235 0.9127048 0.13177973608325938 1 +261 1 4.94449 0.922173 0.11689063238018986 1 +262 1 4.924066 0.921436965 0.11804261890737246 1 +263 1 4.857149 0.9189805 0.12189387842436103 1 +264 1 4.510526 0.905103564 0.14384521639383285 1 +265 0 -5.05378866 0.07399416 0.11090680232251976 0 +266 1 4.753974 0.9150555 0.12806882531424363 1 +267 1 3.714267 0.864962459 0.20929057711111543 1 +268 1 4.712003 0.913410068 0.13066540377370875 1 +269 0 -6.12573862 0.04466511 0.065921539368278048 0 +270 1 4.524699 0.905710459 0.14287817759559546 1 +271 0 -6.12573862 0.04466511 0.065921539368278048 0 +272 1 3.714267 0.864962459 0.20929057711111543 1 +273 1 1.93753254 0.724873543 0.46419876197875504 1 +274 0 -6.12573862 0.04466511 0.065921539368278048 0 +275 0 -2.77348518 0.1999283 0.32179879660040939 0 +276 0 -6.12573862 0.04466511 0.065921539368278048 0 +277 0 -6.12573862 0.04466511 0.065921539368278048 0 +278 0 -6.12573862 0.04466511 0.065921539368278048 0 +279 1 4.7640996 0.915448248 0.12744976419697612 1 +280 0 -6.12573862 0.04466511 0.065921539368278048 0 +281 0 -6.12573862 0.04466511 0.065921539368278048 0 +282 1 3.4345994 0.8477807 0.23823696388172805 1 +283 1 4.836411 0.9182051 0.1231116772600446 1 +284 1 4.172628 0.8895658 0.16882672991838824 1 +285 1 4.913594 0.921057045 0.11863758281262027 1 +286 1 4.98141575 0.923487842 0.11483512694662856 1 +287 0 -6.048977 0.04633175 0.068440605343774177 0 +288 1 1.19110167 0.644637764 0.63343938955122503 1 +289 1 4.28883457 0.895145953 0.15980516326846522 1 +290 0 -6.12573862 0.04466511 0.065921539368278048 0 +291 0 -6.12573862 0.04466511 0.065921539368278048 0 +292 1 3.92763638 0.876945555 0.18944081854187686 1 +293 1 3.735207 0.8661807 0.20726003796861786 1 +294 0 -2.57204 0.216527224 0.35204494911913131 0 +295 1 4.94449 0.922173 0.11689063238018986 1 +296 0 0.9474534 0.6162654 1.3818193020414293 1 +297 0 -0.297049969 0.462936848 0.89683635464607525 0 +298 0 -3.72705865 0.134292215 0.20804796188805913 0 +299 1 1.73907173 0.7046491 0.5050231083614678 1 +300 1 4.04607964 0.883195 0.17919611798596427 1 +301 0 -6.12573862 0.04466511 0.065921539368278048 0 +302 1 4.93133974 0.9216998 0.11763112286398286 1 +303 0 -6.12573862 0.04466511 0.065921539368278048 0 +304 1 4.444847 0.902245164 0.1484085896669089 1 +305 1 4.765097 0.9154868 0.127388990454916 1 +306 0 -6.12573862 0.04466511 0.065921539368278048 0 +307 0 -6.12573862 0.04466511 0.065921539368278048 0 +308 1 4.604374 0.909058 0.13755579022428499 1 +309 0 -2.38702083 0.232631683 0.38200889517336939 0 +310 0 -6.048977 0.04633175 0.068440605343774177 0 +311 0 -6.12573862 0.04466511 0.065921539368278048 0 +312 1 4.87276363 0.919559836 0.1209846400424181 1 +313 0 -6.12573862 0.04466511 0.065921539368278048 0 +314 0 -6.12573862 0.04466511 0.065921539368278048 0 +315 0 4.700209 0.9129425 3.5218880744447407 1 +316 1 2.01076746 0.732115746 0.44985634211263337 1 +317 1 4.95708561 0.9226238 0.11618556568194083 1 +318 0 -5.39437771 0.06313944 0.094093756062156753 0 +319 0 0.786699057 0.597088754 1.3114660211791722 1 +320 1 4.97439766 0.9232395 0.1152230996051703 1 +321 0 -2.57204 0.216527224 0.35204494911913131 0 +322 0 -6.12573862 0.04466511 0.065921539368278048 0 +323 1 3.80140662 0.8699711 0.20096062450784979 1 +324 0 -6.12573862 0.04466511 0.065921539368278048 0 +325 0 -4.562707 0.0926790759 0.14031516516923384 0 +326 1 1.71431434 0.702066362 0.51032068905122763 1 +327 0 -6.12573862 0.04466511 0.065921539368278048 0 +328 1 4.06503344 0.8841691 0.17760577631727736 1 +329 1 4.72798443 0.914039969 0.12967084157529202 1 +330 1 4.55366468 0.906940043 0.14092091631139811 1 +331 0 -6.12573862 0.04466511 0.065921539368278048 0 +332 0 -6.12573862 0.04466511 0.065921539368278048 0 +333 1 3.59794188 0.858023643 0.22091069205640057 1 +334 1 4.470567 0.903373539 0.14660543821458613 1 +335 0 -6.12573862 0.04466511 0.065921539368278048 0 +336 1 3.632753 0.8601308 0.21737204988666808 1 +337 0 -6.12573862 0.04466511 0.065921539368278048 0 +338 0 -6.12573862 0.04466511 0.065921539368278048 0 +339 1 4.496154 0.9044845 0.14483229843008744 1 +340 1 4.95012 0.922374845 0.11657492723188825 1 +341 0 -6.12573862 0.04466511 0.065921539368278048 0 +342 0 -6.12573862 0.04466511 0.065921539368278048 0 +343 0 -6.12573862 0.04466511 0.065921539368278048 0 +344 1 4.96392536 0.9228676 0.11580441568439821 1 +345 0 -6.12573862 0.04466511 0.065921539368278048 0 +346 0 -4.136161 0.112238161 0.17175540047562393 0 +347 0 -4.562707 0.0926790759 0.14031516516923384 0 +348 1 0.0302184261 0.5037772 0.98914224795497152 1 +349 1 1.7592566 0.7067452 0.50073790022523745 1 +350 0 -5.88278341 0.0501449443 0.074220714532658688 0 +351 0 -6.12573862 0.04466511 0.065921539368278048 0 +352 0 -0.158508077 0.480196863 0.94396275556539111 0 +353 1 4.232817 0.8924878 0.16409560801765349 1 +354 0 -6.12573862 0.04466511 0.065921539368278048 0 +355 0 -6.048977 0.04633175 0.068440605343774177 0 +356 1 0.3901928 0.54862 0.86612091606133979 1 +357 1 4.913594 0.921057045 0.11863758281262027 1 +358 1 4.75895643 0.915249 0.1277638183136432 1 +359 1 4.357246 0.898313344 0.15470933110328511 1 +360 1 5.004027 0.924282849 0.11359368245893879 1 +361 1 3.29583049 0.8386091 0.25392961055221525 1 +362 0 -4.913519 0.0789456442 0.11864179575930466 0 +363 0 -1.14827621 0.36028254 0.64449323590393592 0 +364 0 -6.12573862 0.04466511 0.065921539368278048 0 +365 0 -6.12573862 0.04466511 0.065921539368278048 0 +366 1 5.004027 0.924282849 0.11359368245893879 1 +367 1 5.004027 0.924282849 0.11359368245893879 1 +368 0 -5.904324 0.0496344268 0.073445519186050218 0 +369 0 -5.904324 0.0496344268 0.073445519186050218 0 +370 0 -5.09706163 0.07252525 0.10862008599631576 0 +371 0 -5.904324 0.0496344268 0.073445519186050218 0 +372 0 -6.12573862 0.04466511 0.065921539368278048 0 +373 0 -6.12573862 0.04466511 0.065921539368278048 0 +374 0 -6.12573862 0.04466511 0.065921539368278048 0 +375 0 -6.12573862 0.04466511 0.065921539368278048 0 +376 0 -6.12573862 0.04466511 0.065921539368278048 0 +377 0 -6.12573862 0.04466511 0.065921539368278048 0 +378 0 -6.061764 0.04605007 0.068014552045070065 0 +379 0 -1.48199821 0.3227857 0.56231566885586359 0 +380 0 -6.12573862 0.04466511 0.065921539368278048 0 +381 1 4.930342 0.9216638 0.1176874750230081 1 +382 0 -6.12573862 0.04466511 0.065921539368278048 0 +383 0 -6.12573862 0.04466511 0.065921539368278048 0 +384 0 -6.12573862 0.04466511 0.065921539368278048 0 +385 0 -5.8586874 0.0507219173 0.075097320852640426 0 +386 1 4.30084324 0.895708144 0.15889937176960803 1 +387 0 -3.57571173 0.1433358 0.22319830268588145 0 +388 0 -6.12573862 0.04466511 0.065921539368278048 0 +389 0 -5.810422 0.0518965647 0.076883633329030782 0 +390 0 -6.12573862 0.04466511 0.065921539368278048 0 +391 1 4.79576874 0.916665852 0.12553216413691681 1 +392 0 -6.12573862 0.04466511 0.065921539368278048 0 +393 0 -6.12573862 0.04466511 0.065921539368278048 0 +394 0 -5.7551713 0.0532727726 0.078979280952392372 0 +395 0 -6.12573862 0.04466511 0.065921539368278048 0 +396 0 -6.12573862 0.04466511 0.065921539368278048 0 +397 0 -6.12573862 0.04466511 0.065921539368278048 0 +398 0 -6.12573862 0.04466511 0.065921539368278048 0 +399 0 -5.7551713 0.0532727726 0.078979280952392372 0 +400 1 4.55594158 0.907036066 0.14076817777784198 1 +401 0 -6.12573862 0.04466511 0.065921539368278048 0 +402 0 -4.108607 0.11361827 0.17399994914914052 0 +403 0 -4.666031 0.0884253 0.13356721214019227 0 +404 0 -6.138525 0.0443931036 0.065510829404308496 0 +405 0 -6.12573862 0.04466511 0.065921539368278048 0 +406 0 -6.12573862 0.04466511 0.065921539368278048 0 +407 0 -6.12573862 0.04466511 0.065921539368278048 0 +408 0 -3.51567078 0.147061646 0.2294866201318366 0 +409 0 -6.12573862 0.04466511 0.065921539368278048 0 +410 0 -6.12573862 0.04466511 0.065921539368278048 0 +411 0 -2.57204 0.216527224 0.35204494911913131 0 +412 1 4.847574 0.918623269 0.12245476759364576 1 +413 0 -6.12573862 0.04466511 0.065921539368278048 0 +414 1 4.50123835 0.9047039 0.14448238012860362 1 +415 0 -2.93420863 0.187383145 0.29935280632471489 0 +416 1 4.68795824 0.9124545 0.13217549722788033 1 +417 0 -6.12573862 0.04466511 0.065921539368278048 0 +418 0 -5.323412 0.06527118 0.097380212869344535 0 +419 0 -5.204088 0.06900698 0.10315774265429886 0 +420 0 -4.95155 0.0775739849 0.11649489306178905 0 +421 1 4.694235 0.9127048 0.13177973608325938 1 +422 0 -3.17850876 0.169488832 0.26792852706287573 0 +423 0 -5.509922 0.05980708 0.088971279531383576 0 +424 0 -6.12573862 0.04466511 0.065921539368278048 0 +425 1 4.93133974 0.9216998 0.11763112286398286 1 +426 0 -3.28017831 0.162452936 0.25575783357248416 0 +427 1 4.68605328 0.9123784 0.13229584898748298 1 +428 0 -6.12573862 0.04466511 0.065921539368278048 0 +429 0 -6.12573862 0.04466511 0.065921539368278048 0 +430 0 -5.93544865 0.0489054658 0.072339349687159854 0 +431 0 -5.1514225 0.07071806 0.10581172066639448 0 +432 0 -6.12573862 0.04466511 0.065921539368278048 0 +433 0 -6.138525 0.0443931036 0.065510829404308496 0 +434 0 2.60647821 0.786379635 2.2268789075895756 1 +435 1 4.214894 0.891624868 0.16549124015720693 1 +436 1 3.39190745 0.8450055 0.24296734230693379 1 +437 0 -6.12573862 0.04466511 0.065921539368278048 0 +438 0 -5.904324 0.0496344268 0.073445519186050218 0 +439 0 -6.12573862 0.04466511 0.065921539368278048 0 +440 1 4.57899952 0.9080037 0.13922993785081683 1 +441 0 -2.695176 0.206264988 0.3332706493409231 0 +442 0 -5.28870535 0.0663379356 0.099027628756686789 0 +443 0 -5.88718367 0.0500402562 0.074061716914150894 0 +444 0 -5.80602169 0.0520049259 0.077048532176877474 0 +445 0 -6.12573862 0.04466511 0.065921539368278048 0 +446 0 -6.12573862 0.04466511 0.065921539368278048 0 +447 0 -6.12573862 0.04466511 0.065921539368278048 0 +448 0 -6.12573862 0.04466511 0.065921539368278048 0 +449 1 5.004027 0.924282849 0.11359368245893879 1 +450 0 -5.88278341 0.0501449443 0.074220714532658688 0 +451 0 -6.12573862 0.04466511 0.065921539368278048 0 +452 0 -6.138525 0.0443931036 0.065510829404308496 0 +453 1 4.96379662 0.922863066 0.11581149726012986 1 +454 0 -5.8586874 0.0507219173 0.075097320852640426 0 +455 1 0.596782267 0.5740492 0.80075376707941792 1 +456 1 4.930342 0.9216638 0.1176874750230081 1 +457 1 4.959372 0.9227054 0.11605797639002108 1 +458 0 -6.12573862 0.04466511 0.065921539368278048 0 +459 0 -5.509922 0.05980708 0.088971279531383576 0 +460 0 -5.88278341 0.0501449443 0.074220714532658688 0 +461 0 -3.30130816 0.161020562 0.25329264195172102 0 +462 0 -4.45841932 0.09715795 0.14745447741632708 0 +463 0 -6.12573862 0.04466511 0.065921539368278048 0 +464 0 -6.12573862 0.04466511 0.065921539368278048 0 +465 1 4.97612047 0.923300564 0.11512772651515453 1 +466 1 4.79477072 0.9166277 0.1255922030194721 1 +467 1 4.53777361 0.9062673 0.1419914879107112 1 +468 0 -6.12573862 0.04466511 0.065921539368278048 0 +469 0 -6.12573862 0.04466511 0.065921539368278048 0 +470 0 -6.12573862 0.04466511 0.065921539368278048 0 +471 0 -4.45841932 0.09715795 0.14745447741632708 0 +472 0 -4.45841932 0.09715795 0.14745447741632708 0 +473 0 -6.12573862 0.04466511 0.065921539368278048 0 +474 0 -6.12573862 0.04466511 0.065921539368278048 0 +475 0 -6.12573862 0.04466511 0.065921539368278048 0 +476 0 -6.12573862 0.04466511 0.065921539368278048 0 +477 0 -6.12573862 0.04466511 0.065921539368278048 0 +478 0 -6.12573862 0.04466511 0.065921539368278048 0 +479 1 4.96379662 0.922863066 0.11581149726012986 1 +480 0 -6.12573862 0.04466511 0.065921539368278048 0 +481 0 -4.930868 0.07831719 0.11765774758534032 0 +482 1 4.97612047 0.923300564 0.11512772651515453 1 +483 1 4.92506361 0.9214731 0.11798606623603609 1 +484 0 -6.12573862 0.04466511 0.065921539368278048 0 +485 0 -5.28870535 0.0663379356 0.099027628756686789 0 +486 0 -6.12573862 0.04466511 0.065921539368278048 0 +487 1 4.694235 0.9127048 0.13177973608325938 1 +488 1 2.97813416 0.815938234 0.29346814906261504 1 +489 1 1.70382535 0.7009682 0.51257908601392099 1 +490 0 -6.12573862 0.04466511 0.065921539368278048 0 +491 1 4.309873 0.8961292 0.15822136074451454 1 +492 0 -6.12573862 0.04466511 0.065921539368278048 0 +493 1 4.94449 0.922173 0.11689063238018986 1 +494 0 -1.86898077 0.2820146 0.47797360412088818 0 +495 0 -6.12573862 0.04466511 0.065921539368278048 0 +496 0 -6.12573862 0.04466511 0.065921539368278048 0 +497 0 -6.12573862 0.04466511 0.065921539368278048 0 +498 0 -6.12573862 0.04466511 0.065921539368278048 0 +499 0 -6.12573862 0.04466511 0.065921539368278048 0 +500 0 -4.45841932 0.09715795 0.14745447741632708 0 +501 0 -6.12573862 0.04466511 0.065921539368278048 0 +502 0 -6.12573862 0.04466511 0.065921539368278048 0 +503 0 -6.12573862 0.04466511 0.065921539368278048 0 +504 0 -6.12573862 0.04466511 0.065921539368278048 0 +505 0 -5.93544865 0.0489054658 0.072339349687159854 0 +506 1 4.61993837 0.9096993 0.13653831889677209 1 +507 0 -4.666031 0.0884253 0.13356721214019227 0 +508 0 -6.12573862 0.04466511 0.065921539368278048 0 +509 0 -6.12573862 0.04466511 0.065921539368278048 0 +510 0 -6.12573862 0.04466511 0.065921539368278048 0 +511 0 -6.12573862 0.04466511 0.065921539368278048 0 +512 0 -6.12573862 0.04466511 0.065921539368278048 0 +513 0 -6.12573862 0.04466511 0.065921539368278048 0 +514 1 5.004027 0.924282849 0.11359368245893879 1 +515 1 5.02333355 0.924955666 0.11254387723751433 1 +516 0 -6.12573862 0.04466511 0.065921539368278048 0 +517 0 -6.12573862 0.04466511 0.065921539368278048 0 +518 0 -6.12573862 0.04466511 0.065921539368278048 0 +519 1 3.707599 0.8645726 0.20994100541133706 1 +520 0 -6.048977 0.04633175 0.068440605343774177 0 +521 0 -6.048977 0.04633175 0.068440605343774177 0 +522 1 3.29415345 0.838495553 0.25412496326918355 1 +523 1 4.687142 0.9124219 0.13222704839686869 1 +524 0 -6.12573862 0.04466511 0.065921539368278048 0 +525 0 -6.12573862 0.04466511 0.065921539368278048 0 +526 0 -6.12573862 0.04466511 0.065921539368278048 0 +527 0 -6.12573862 0.04466511 0.065921539368278048 0 +528 0 -5.177396 0.0698693544 0.10449472429160866 0 +529 0 -6.12573862 0.04466511 0.065921539368278048 0 +530 1 4.83683729 0.918221056 0.12308657886405872 1 +531 0 -6.12573862 0.04466511 0.065921539368278048 0 +532 0 -6.12573862 0.04466511 0.065921539368278048 0 +533 0 -6.12573862 0.04466511 0.065921539368278048 0 +534 0 -6.12573862 0.04466511 0.065921539368278048 0 +535 0 -5.44819069 0.0615664274 0.09167346789220833 0 +536 0 -6.12573862 0.04466511 0.065921539368278048 0 +537 0 -6.12573862 0.04466511 0.065921539368278048 0 +538 0 -6.12573862 0.04466511 0.065921539368278048 0 +539 0 -4.45841932 0.09715795 0.14745447741632708 0 +540 0 -5.88718367 0.0500402562 0.074061716914150894 0 +541 0 -6.12573862 0.04466511 0.065921539368278048 0 +542 0 -5.17382336 0.0699855238 0.10467492216060112 0 +543 0 -6.12573862 0.04466511 0.065921539368278048 0 +544 0 -5.904324 0.0496344268 0.073445519186050218 0 +545 0 -6.12573862 0.04466511 0.065921539368278048 0 +546 1 5.004027 0.924282849 0.11359368245893879 1 +547 0 -6.12573862 0.04466511 0.065921539368278048 0 +548 0 -6.12573862 0.04466511 0.065921539368278048 0 +549 1 4.233742 0.89253217 0.16402392529549129 1 +550 0 -6.12573862 0.04466511 0.065921539368278048 0 +551 0 -6.12573862 0.04466511 0.065921539368278048 0 +552 0 -5.44038153 0.0617924072 0.092020918427318632 0 +553 0 -2.05547643 0.263522834 0.44128729795151717 0 +554 0 -6.12573862 0.04466511 0.065921539368278048 0 +555 0 -4.01450157 0.118443735 0.18187544283824944 0 +556 0 -6.12573862 0.04466511 0.065921539368278048 0 +557 0 -5.88278341 0.0501449443 0.074220714532658688 0 +558 0 -6.12573862 0.04466511 0.065921539368278048 0 +559 0 -6.12573862 0.04466511 0.065921539368278048 0 +560 0 -6.12573862 0.04466511 0.065921539368278048 0 +561 0 -6.12573862 0.04466511 0.065921539368278048 0 +562 0 -6.12573862 0.04466511 0.065921539368278048 0 +563 0 -6.12573862 0.04466511 0.065921539368278048 0 +564 0 -6.12573862 0.04466511 0.065921539368278048 0 +565 1 5.004027 0.924282849 0.11359368245893879 1 +566 0 -6.12573862 0.04466511 0.065921539368278048 0 +567 0 -4.595947 0.09129094 0.13810963729887868 0 +568 1 3.938514 0.8775313 0.18847752650563218 1 +569 1 4.847574 0.918623269 0.12245476759364576 1 +570 1 4.54944563 0.9067618 0.14120444037717286 1 +571 1 4.552568 0.90689373 0.14099458928062417 1 +572 0 -6.12573862 0.04466511 0.065921539368278048 0 +573 0 -6.12573862 0.04466511 0.065921539368278048 0 +574 1 4.85103941 0.91875273 0.122251463360545 1 +575 0 -6.12573862 0.04466511 0.065921539368278048 0 +576 0 -6.12573862 0.04466511 0.065921539368278048 0 +577 0 -6.12573862 0.04466511 0.065921539368278048 0 +578 0 -6.12573862 0.04466511 0.065921539368278048 0 +579 0 -6.12573862 0.04466511 0.065921539368278048 0 +580 0 -6.12573862 0.04466511 0.065921539368278048 0 +581 1 4.94449 0.922173 0.11689063238018986 1 +582 1 4.09530258 0.885710061 0.17509358865445432 1 +583 0 -6.12573862 0.04466511 0.065921539368278048 0 +584 0 -5.80602169 0.0520049259 0.077048532176877474 0 +585 0 -6.12573862 0.04466511 0.065921539368278048 0 +586 1 4.91459131 0.921093345 0.1185807267410698 1 +587 0 -6.12573862 0.04466511 0.065921539368278048 0 +588 1 4.35050344 0.898005 0.15520460314710188 1 +589 0 -6.12573862 0.04466511 0.065921539368278048 0 +590 1 3.54668355 0.854872763 0.22621838555837612 1 +591 1 4.55594158 0.907036066 0.14076817777784198 1 +592 1 4.612346 0.909387 0.13703372644990114 1 +593 0 -6.12573862 0.04466511 0.065921539368278048 0 +594 1 3.707599 0.8645726 0.20994100541133706 1 +595 0 -6.12573862 0.04466511 0.065921539368278048 0 +596 0 -6.12573862 0.04466511 0.065921539368278048 0 +597 0 -5.05378866 0.07399416 0.11090680232251976 0 +598 0 -6.12573862 0.04466511 0.065921539368278048 0 +599 0 -5.7551713 0.0532727726 0.078979280952392372 0 +600 0 -6.12573862 0.04466511 0.065921539368278048 0 +601 0 -6.12573862 0.04466511 0.065921539368278048 0 +602 0 -6.12573862 0.04466511 0.065921539368278048 0 +603 1 1.93389523 0.72451067 0.46492115869820583 1 +604 1 0.8018034 0.5989043 0.73960257622323922 1 +605 1 4.85804653 0.919013858 0.12184147876101566 1 +606 0 -6.12573862 0.04466511 0.065921539368278048 0 +607 0 -6.12573862 0.04466511 0.065921539368278048 0 +608 1 4.71659 0.9135913 0.13037914277520105 1 +609 0 -6.12573862 0.04466511 0.065921539368278048 0 +610 1 4.57899952 0.9080037 0.13922993785081683 1 +611 1 4.74096966 0.914548755 0.1288680126360825 1 +612 1 4.91459131 0.921093345 0.1185807267410698 1 +613 0 -5.93544865 0.0489054658 0.072339349687159854 0 +614 0 -6.12573862 0.04466511 0.065921539368278048 0 +615 0 -5.904324 0.0496344268 0.073445519186050218 0 +616 0 -6.12573862 0.04466511 0.065921539368278048 0 +617 0 -2.57204 0.216527224 0.35204494911913131 0 +618 0 -6.12573862 0.04466511 0.065921539368278048 0 +619 0 -6.12573862 0.04466511 0.065921539368278048 0 +620 0 -6.12573862 0.04466511 0.065921539368278048 0 +621 0 -2.08407712 0.26075685 0.43587912530312761 0 +622 0 -4.45841932 0.09715795 0.14745447741632708 0 +623 0 -6.12573862 0.04466511 0.065921539368278048 0 +624 0 -6.12573862 0.04466511 0.065921539368278048 0 +625 0 -4.8392725 0.08168754 0.12294297386424494 0 +626 1 3.72445273 0.86555624 0.20830053219774505 1 +627 0 -3.30130816 0.161020562 0.25329264195172102 0 +628 0 -6.12573862 0.04466511 0.065921539368278048 0 +629 0 -6.12573862 0.04466511 0.065921539368278048 0 +630 0 -5.422645 0.062308535 0.092814793797065226 0 +631 0 -6.12573862 0.04466511 0.065921539368278048 0 +632 0 -6.12573862 0.04466511 0.065921539368278048 0 +633 1 4.599212 0.9088444 0.13789475993220657 1 +634 0 -6.12573862 0.04466511 0.065921539368278048 0 +635 0 -5.904324 0.0496344268 0.073445519186050218 0 +636 1 4.85834026 0.9190248 0.12182426214416593 1 +637 0 -4.461279 0.0970326 0.14725419077217505 0 +638 0 -6.12573862 0.04466511 0.065921539368278048 0 +639 0 -5.88278341 0.0501449443 0.074220714532658688 0 +640 0 -5.88278341 0.0501449443 0.074220714532658688 0 +641 0 -6.12573862 0.04466511 0.065921539368278048 0 +642 0 -6.12573862 0.04466511 0.065921539368278048 0 +643 0 -6.12573862 0.04466511 0.065921539368278048 0 +644 0 -6.12573862 0.04466511 0.065921539368278048 0 +645 0 -6.12573862 0.04466511 0.065921539368278048 0 +646 0 -6.12573862 0.04466511 0.065921539368278048 0 +647 0 -6.138525 0.0443931036 0.065510829404308496 0 +648 1 4.928055 0.9215812 0.11781679475557053 1 +649 0 -6.12573862 0.04466511 0.065921539368278048 0 +650 0 -4.86740255 0.08063864 0.12129606215924123 0 +651 0 -6.138525 0.0443931036 0.065510829404308496 0 +652 0 -6.12573862 0.04466511 0.065921539368278048 0 +653 0 -6.12573862 0.04466511 0.065921539368278048 0 +654 0 -6.12573862 0.04466511 0.065921539368278048 0 +655 0 -6.12573862 0.04466511 0.065921539368278048 0 +656 0 -6.12573862 0.04466511 0.065921539368278048 0 +657 0 -1.26773977 0.346633583 0.61403579333455072 0 +658 1 4.40070248 0.9002811 0.15155260745829846 1 +659 0 -6.12573862 0.04466511 0.065921539368278048 0 +660 0 -6.12573862 0.04466511 0.065921539368278048 0 +661 0 -6.12573862 0.04466511 0.065921539368278048 0 +662 0 -5.904324 0.0496344268 0.073445519186050218 0 +663 0 -5.904324 0.0496344268 0.073445519186050218 0 +664 0 -6.138525 0.0443931036 0.065510829404308496 0 +665 0 -6.12573862 0.04466511 0.065921539368278048 0 +666 0 -6.12573862 0.04466511 0.065921539368278048 0 +667 0 -6.12573862 0.04466511 0.065921539368278048 0 +668 1 3.583095 0.8571169 0.22243614858809693 1 +669 1 4.95708561 0.9226238 0.11618556568194083 1 +670 1 4.381452 0.8994136 0.15294341877416354 1 +671 0 -6.12573862 0.04466511 0.065921539368278048 0 +672 0 -6.12573862 0.04466511 0.065921539368278048 0 +673 0 -5.09706163 0.07252525 0.10862008599631576 0 +674 0 -6.12573862 0.04466511 0.065921539368278048 0 +675 0 -5.904324 0.0496344268 0.073445519186050218 0 +676 0 -6.12573862 0.04466511 0.065921539368278048 0 +677 0 -6.12573862 0.04466511 0.065921539368278048 0 +678 0 -6.12573862 0.04466511 0.065921539368278048 0 +679 0 -6.12573862 0.04466511 0.065921539368278048 0 +680 1 4.93133974 0.9216998 0.11763112286398286 1 +681 1 4.94449 0.922173 0.11689063238018986 1 +682 0 -6.12573862 0.04466511 0.065921539368278048 0 +683 0 -6.12573862 0.04466511 0.065921539368278048 0 +684 0 -6.12573862 0.04466511 0.065921539368278048 0 +685 0 -6.12573862 0.04466511 0.065921539368278048 0 +686 0 -6.12573862 0.04466511 0.065921539368278048 0 +687 0 -4.562707 0.0926790759 0.14031516516923384 0 +688 0 -6.12573862 0.04466511 0.065921539368278048 0 +689 0 -6.12573862 0.04466511 0.065921539368278048 0 +690 0 -6.138525 0.0443931036 0.065510829404308496 0 +691 1 2.44231081 0.7722668 0.37282873444142556 1 +692 0 -6.12573862 0.04466511 0.065921539368278048 0 +693 0 -6.12573862 0.04466511 0.065921539368278048 0 +694 0 -5.810422 0.0518965647 0.076883633329030782 0 +695 0 -6.12573862 0.04466511 0.065921539368278048 0 +696 1 4.55036926 0.906800866 0.14114232582393552 1 +697 1 3.27134752 0.8369454 0.25679456140192347 1 +698 1 3.72445273 0.86555624 0.20830053219774505 1 diff --git a/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer-out.txt b/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer-out.txt new file mode 100644 index 0000000000..2496917e04 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer-out.txt @@ -0,0 +1,45 @@ +maml.exe TrainTest test=%Data% tr=LightGBMBinary{nt=1 nl=5 mil=5 lr=0.25 iter=20 mb=255} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=binary +Not training a calibrator because it is not needed. +TEST POSITIVE RATIO: 0.3448 (241.0/(241.0+458.0)) +Confusion table + ||====================== +PREDICTED || positive | negative | Recall +TRUTH ||====================== + positive || 240 | 1 | 0.9959 + negative || 11 | 447 | 0.9760 + ||====================== +Precision || 0.9562 | 0.9978 | +OVERALL 0/1 ACCURACY: 0.982833 +LOG LOSS/instance: 0.086938 +Test-set entropy (prior Log-Loss/instance): 0.929318 +LOG-LOSS REDUCTION (RIG): 90.644963 +AUC: 0.996313 + +OVERALL RESULTS +--------------------------------------- +AUC: 0.996313 (0.0000) +Accuracy: 0.982833 (0.0000) +Positive precision: 0.956175 (0.0000) +Positive recall: 0.995851 (0.0000) +Negative precision: 0.997768 (0.0000) +Negative recall: 0.975983 (0.0000) +Log-loss: 0.086938 (0.0000) +Log-loss reduction: 90.644963 (0.0000) +F1 Score: 0.975610 (0.0000) +AUPRC: 0.987034 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer-rp.txt new file mode 100644 index 0000000000..0a2dcff3a5 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer-rp.txt @@ -0,0 +1,4 @@ +LightGBMBinary +AUC Accuracy Positive precision Positive recall Negative precision Negative recall Log-loss Log-loss reduction F1 Score AUPRC /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.996313 0.982833 0.956175 0.995851 0.997768 0.975983 0.086938 90.64497 0.97561 0.987034 20 0.25 5 5 1 LightGBMBinary %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMBinary{nt=1 nl=5 mil=5 lr=0.25 iter=20 mb=255} cache=- dout=%Output% loader=Text{sparse- col=Attr:TX:6 col=Label:0 col=Features:1-5,6,7-9} data=%Data% out=%Output% seed=1 /iter:20;/lr:0.25;/nl:5;/mil:5;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer.txt b/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer.txt new file mode 100644 index 0000000000..8180e64edd --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMBinary/LightGBM-TrainTest-breast-cancer.txt @@ -0,0 +1,700 @@ +Instance Label Score Probability Log-loss Assigned +0 0 -11.1408987 0.003794317 0.0054844536464761871 0 +1 0 0.191842213 0.5239619 1.0708510547998533 1 +2 0 -10.352807 0.00561656 0.0081258244335933715 0 +3 0 -0.745744765 0.407847136 0.75595844049774485 0 +4 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +5 1 9.274134 0.9904069 0.013906771757572052 1 +6 0 -2.67131853 0.2082248 0.33683722078474054 0 +7 0 -11.1408987 0.003794317 0.0054844536464761871 0 +8 0 -9.129003 0.0103077162 0.014948064293186902 0 +9 0 -10.793726 0.00451033656 0.0065217589263549926 0 +10 0 -10.0781832 0.00643791631 0.009317976395589251 0 +11 0 -11.1408987 0.003794317 0.0054844536464761871 0 +12 1 1.4520539 0.6739328 0.56932337184434956 1 +13 0 -8.451772 0.0144019378 0.020928675408500307 0 +14 1 9.274134 0.9904069 0.013906771757572052 1 +15 1 2.33043027 0.762279034 0.3916088992805673 1 +16 0 -11.1408987 0.003794317 0.0054844536464761871 0 +17 0 -11.1408987 0.003794317 0.0054844536464761871 0 +18 1 9.46429348 0.99126935 0.012650971698572483 1 +19 0 -11.1408987 0.003794317 0.0054844536464761871 0 +20 1 5.83090067 0.948604941 0.07612071132266339 1 +21 1 9.014071 0.989089251 0.01582738630202769 1 +22 0 -11.1408987 0.003794317 0.0054844536464761871 0 +23 1 6.695143 0.966025233 0.049867221109728778 1 +24 0 -11.1408987 0.003794317 0.0054844536464761871 0 +25 1 0.353024364 0.544013858 0.87828469270484355 1 +26 0 -10.793726 0.00451033656 0.0065217589263549926 0 +27 0 -11.1408987 0.003794317 0.0054844536464761871 0 +28 0 -11.1408987 0.003794317 0.0054844536464761871 0 +29 0 -11.1249819 0.003824518 0.0055281913271731124 0 +30 0 -10.0781832 0.00643791631 0.009317976395589251 0 +31 0 -11.1408987 0.003794317 0.0054844536464761871 0 +32 1 9.113095 0.989610851 0.015066775731727065 1 +33 0 -11.1408987 0.003794317 0.0054844536464761871 0 +34 0 -11.1408987 0.003794317 0.0054844536464761871 0 +35 0 -11.1408987 0.003794317 0.0054844536464761871 0 +36 1 8.808518 0.9879225 0.017530239508724475 1 +37 0 -8.345987 0.0151723241 0.022056789543357803 0 +38 1 7.432053 0.97624743 0.034681249789809167 1 +39 1 4.67947149 0.9121149 0.13271249251622741 1 +40 0 9.35413551 0.9907795 6.7609422844201523 1 +41 1 5.14519262 0.92907697 0.10612997288183632 1 +42 1 6.044327 0.9535654 0.068596177822018822 1 +43 1 5.26266 0.9328509 0.10028158926423145 1 +44 1 8.722647 0.98739934 0.018294414611490426 1 +45 0 -11.1408987 0.003794317 0.0054844536464761871 0 +46 1 5.39120626 0.9367667 0.094238327334802807 1 +47 0 -11.1408987 0.003794317 0.0054844536464761871 0 +48 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +49 1 5.57127428 0.9418947 0.086362298062532941 1 +50 1 6.173262 0.9563379 0.064407600093902617 1 +51 1 1.62959909 0.6931313 0.52879936912076753 1 +52 1 7.09074545 0.971951544 0.041043703445742354 1 +53 1 8.494669 0.9858994 0.020487668060688979 1 +54 1 9.246337 0.9902739 0.014100489645724055 1 +55 1 7.939049 0.981467545 0.026987533150897716 1 +56 1 6.1828723 0.9565381 0.064105689389443152 1 +57 1 2.662988 0.7910876 0.33809058649873347 1 +58 1 4.5584197 0.9071405 0.14060208942052352 1 +59 1 5.63572073 0.9436334 0.083701645388880766 1 +60 1 6.09145451 0.9545977 0.067035217035386507 1 +61 0 -10.352807 0.00561656 0.0081258244335933715 0 +62 1 6.22759676 0.9574583 0.06271841386822509 1 +63 1 2.96480656 0.8149353 0.29524252355586916 1 +64 0 -11.1408987 0.003794317 0.0054844536464761871 0 +65 1 3.90195155 0.875553 0.19173356307998154 1 +66 0 -11.1408987 0.003794317 0.0054844536464761871 0 +67 1 7.520144 0.977247655 0.033203876676285611 1 +68 1 8.354915 0.9848942 0.021959316673970036 1 +69 0 -11.7515974 0.002798697 0.0040433269201261592 0 +70 0 -11.1249819 0.003824518 0.0055281913271731124 0 +71 1 3.20202327 0.8321597 0.26506767539412135 1 +72 0 -7.30176 0.025310982 0.036986105544657269 0 +73 1 8.049733 0.9824478 0.025547335174044564 1 +74 1 5.354063 0.9356576 0.095947385239666283 1 +75 0 -7.64184952 0.0214378815 0.031264659787381265 0 +76 0 -11.1249819 0.003824518 0.0055281913271731124 0 +77 0 -10.4720278 0.005293259 0.0076568411573198387 0 +78 0 -8.451772 0.0144019378 0.020928675408500307 0 +79 0 -11.1408987 0.003794317 0.0054844536464761871 0 +80 0 -7.324939 0.0250266381 0.036565292561749188 0 +81 0 -11.1408987 0.003794317 0.0054844536464761871 0 +82 0 -10.793726 0.00451033656 0.0065217589263549926 0 +83 0 -7.25121975 0.0259419419 0.03792032909389155 0 +84 1 9.370424 0.990853667 0.013256084002009599 1 +85 1 6.522149 0.963069 0.054288897339336381 1 +86 1 2.97598457 0.8157767 0.29375378289111959 1 +87 1 7.70157576 0.97917974 0.030354387115209134 1 +88 0 -11.1408987 0.003794317 0.0054844536464761871 0 +89 0 -11.1408987 0.003794317 0.0054844536464761871 0 +90 0 -11.1408987 0.003794317 0.0054844536464761871 0 +91 0 -11.1408987 0.003794317 0.0054844536464761871 0 +92 0 -11.1408987 0.003794317 0.0054844536464761871 0 +93 0 -11.1408987 0.003794317 0.0054844536464761871 0 +94 0 -11.1408987 0.003794317 0.0054844536464761871 0 +95 0 -11.1408987 0.003794317 0.0054844536464761871 0 +96 0 -11.1408987 0.003794317 0.0054844536464761871 0 +97 0 -11.1408987 0.003794317 0.0054844536464761871 0 +98 1 9.208157 0.9900883 0.014370921985123001 1 +99 1 9.274134 0.9904069 0.013906771757572052 1 +100 1 7.25592375 0.9741174 0.037832442000692482 1 +101 1 0.6636784 0.582206845 0.78039629287341283 1 +102 0 -11.1408987 0.003794317 0.0054844536464761871 0 +103 1 2.232404 0.75328356 0.40873505071150923 1 +104 1 9.492584 0.991390944 0.012474015207671739 1 +105 1 5.32842731 0.9348816 0.09714438886438892 1 +106 1 9.46429348 0.99126935 0.012650971698572483 1 +107 1 8.700008 0.9872577 0.018501352204702889 1 +108 0 -9.64856 0.007968333 0.011541920197508238 0 +109 1 6.700427 0.966111839 0.049737887225771368 1 +110 0 -4.014178 0.11846064 0.18190310927826997 0 +111 1 7.17823029 0.973119736 0.039310765216591721 1 +112 1 8.721394 0.987391531 0.018305823276373562 1 +113 1 9.105702 0.989572763 0.015122302118022618 1 +114 0 -6.12290955 0.0447255075 0.066012752240725281 0 +115 0 -6.795408 0.0323673 0.047468570938158913 0 +116 0 -2.479353 0.224492311 0.36678701041765982 0 +117 1 8.700008 0.9872577 0.018501352204702889 1 +118 0 -8.451772 0.0144019378 0.020928675408500307 0 +119 0 -10.0056343 0.006674148 0.0096610360020039331 0 +120 0 -11.1408987 0.003794317 0.0054844536464761871 0 +121 0 -10.0056343 0.006674148 0.0096610360020039331 0 +122 1 9.302145 0.990539 0.013714295254109422 1 +123 1 5.14182043 0.9289658 0.10630259950178499 1 +124 1 7.21285248 0.973568857 0.038645076157601946 1 +125 0 -11.1408987 0.003794317 0.0054844536464761871 0 +126 1 9.290635 0.990484953 0.013793036484376598 1 +127 0 -11.1408987 0.003794317 0.0054844536464761871 0 +128 1 6.18321 0.9565451 0.064095081407078522 1 +129 0 -9.641098 0.007997878 0.011584888039440988 0 +130 0 -11.1249819 0.003824518 0.0055281913271731124 0 +131 0 -11.1408987 0.003794317 0.0054844536464761871 0 +132 1 6.50233 0.96271497 0.054819370622932836 1 +133 0 -11.7515974 0.002798697 0.0040433269201261592 0 +134 0 -11.1408987 0.003794317 0.0054844536464761871 0 +135 0 -8.860468 0.0117714843 0.017083408969417173 0 +136 0 -11.1408987 0.003794317 0.0054844536464761871 0 +137 0 -11.1408987 0.003794317 0.0054844536464761871 0 +138 0 -11.1408987 0.003794317 0.0054844536464761871 0 +139 0 -1.60860276 0.309106171 0.53346406927085821 0 +140 0 -11.1408987 0.003794317 0.0054844536464761871 0 +141 0 -11.1408987 0.003794317 0.0054844536464761871 0 +142 1 8.457936 0.9856418 0.020864687335742812 1 +143 0 -6.795408 0.0323673 0.047468570938158913 0 +144 0 -11.1408987 0.003794317 0.0054844536464761871 0 +145 0 -1.31349862 0.3414702 0.60267939336265108 0 +146 1 2.39630437 0.7681959 0.38045377994578972 1 +147 0 -10.352807 0.00561656 0.0081258244335933715 0 +148 0 -6.36205053 0.0398860537 0.058722459807188501 0 +149 1 6.934371 0.969739556 0.044330761266236668 1 +150 0 -10.0781832 0.00643791631 0.009317976395589251 0 +151 1 7.37175035 0.9755382 0.035729736686882549 1 +152 1 9.099943 0.989543 0.015165664584975543 1 +153 0 -8.451772 0.0144019378 0.020928675408500307 0 +154 0 -11.1408987 0.003794317 0.0054844536464761871 0 +155 1 5.424654 0.9377501 0.092724581478057941 1 +156 0 -10.793726 0.00451033656 0.0065217589263549926 0 +157 0 -11.1408987 0.003794317 0.0054844536464761871 0 +158 0 -2.67131853 0.2082248 0.33683722078474054 0 +159 1 9.887188 0.992921531 0.010248386218477984 1 +160 1 9.302145 0.990539 0.013714295254109422 1 +161 0 -11.7515974 0.002798697 0.0040433269201261592 0 +162 0 -11.1408987 0.003794317 0.0054844536464761871 0 +163 0 -5.3771596 0.06365061 0.094881133498308609 0 +164 0 -1.79691482 0.289367616 0.49282466048662621 0 +165 0 -10.9635057 0.004144777 0.0059920758416508691 0 +166 1 7.1727457 0.9730479 0.039417250952604198 1 +167 1 7.52542257 0.977306247 0.033117381775498847 1 +168 0 -11.1408987 0.003794317 0.0054844536464761871 0 +169 0 -10.0781832 0.00643791631 0.009317976395589251 0 +170 0 -11.1408987 0.003794317 0.0054844536464761871 0 +171 0 -11.1408987 0.003794317 0.0054844536464761871 0 +172 0 -11.1408987 0.003794317 0.0054844536464761871 0 +173 1 9.35413551 0.9907795 0.013364048694591426 1 +174 1 8.639983 0.9868746 0.019061347344820612 1 +175 1 8.683719 0.987154841 0.018651696697845825 1 +176 0 -11.1408987 0.003794317 0.0054844536464761871 0 +177 1 9.581268 0.991761267 0.011935212277438465 1 +178 0 -11.1408987 0.003794317 0.0054844536464761871 0 +179 1 2.20761633 0.750973 0.41316708241478539 1 +180 0 -10.0781832 0.00643791631 0.009317976395589251 0 +181 0 -11.1408987 0.003794317 0.0054844536464761871 0 +182 0 -11.1408987 0.003794317 0.0054844536464761871 0 +183 1 9.35413551 0.9907795 0.013364048694591426 1 +184 1 8.639983 0.9868746 0.019061347344820612 1 +185 0 -10.0781832 0.00643791631 0.009317976395589251 0 +186 1 8.566467 0.9863898 0.019770190483280031 1 +187 1 9.973059 0.993217 0.0098191523070945419 1 +188 1 8.49752 0.9859192 0.020458710913685913 1 +189 0 -10.7778091 0.004546211 0.0065737503869248157 0 +190 1 9.099943 0.989543 0.015165664584975543 1 +191 1 8.618975 0.9867378 0.019261336051184869 1 +192 0 -11.1408987 0.003794317 0.0054844536464761871 0 +193 0 -11.1408987 0.003794317 0.0054844536464761871 0 +194 0 -11.1408987 0.003794317 0.0054844536464761871 0 +195 0 -11.1408987 0.003794317 0.0054844536464761871 0 +196 0 2.626489 0.788055539 2.2382418325825175 1 +197 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +198 0 -11.1408987 0.003794317 0.0054844536464761871 0 +199 0 -11.1408987 0.003794317 0.0054844536464761871 0 +200 1 9.302145 0.990539 0.013714295254109422 1 +201 1 9.978819 0.993236363 0.0097910145401494779 1 +202 0 -11.1408987 0.003794317 0.0054844536464761871 0 +203 0 -11.1408987 0.003794317 0.0054844536464761871 0 +204 0 -11.1408987 0.003794317 0.0054844536464761871 0 +205 1 9.35413551 0.9907795 0.013364048694591426 1 +206 1 7.939049 0.981467545 0.026987533150897716 1 +207 0 -10.0781832 0.00643791631 0.009317976395589251 0 +208 0 -10.0781832 0.00643791631 0.009317976395589251 0 +209 0 -10.0781832 0.00643791631 0.009317976395589251 0 +210 1 9.274134 0.9904069 0.013906771757572052 1 +211 1 8.401018 0.985233366 0.021462607069098 1 +212 0 -11.1408987 0.003794317 0.0054844536464761871 0 +213 1 9.973059 0.993217 0.0098191523070945419 1 +214 1 9.973059 0.993217 0.0098191523070945419 1 +215 1 8.401018 0.985233366 0.021462607069098 1 +216 0 -11.1408987 0.003794317 0.0054844536464761871 0 +217 0 -11.1408987 0.003794317 0.0054844536464761871 0 +218 1 8.481019 0.9858042 0.020626967038070158 1 +219 0 -11.1249819 0.003824518 0.0055281913271731124 0 +220 0 -11.1408987 0.003794317 0.0054844536464761871 0 +221 1 9.903688 0.9929793 0.010164469042396825 1 +222 1 -4.304539 0.104119331 3.2636901527043216 0 +223 1 7.09019375 0.971944034 0.041054851068202003 1 +224 1 9.973059 0.993217 0.0098191523070945419 1 +225 0 -11.1408987 0.003794317 0.0054844536464761871 0 +226 1 9.887188 0.992921531 0.010248386218477984 1 +227 1 6.06125546 0.9539388 0.068031408770273541 1 +228 0 -10.0781832 0.00643791631 0.009317976395589251 0 +229 1 9.887188 0.992921531 0.010248386218477984 1 +230 1 5.822027 0.9483882 0.076450353481824412 1 +231 1 8.858544 0.9882173 0.017099791114119234 1 +232 0 -1.68837154 0.300653934 0.51592155708079446 0 +233 1 8.055492 0.9824974 0.025474514025770799 1 +234 0 -8.979688 0.0110978512 0.016100320554689886 0 +235 0 -1.31349862 0.3414702 0.60267939336265108 0 +236 1 8.646986 0.9869198 0.018995213388831089 1 +237 1 9.13141251 0.989704549 0.014930184702656403 1 +238 1 8.396541 0.985200763 0.021510350106347824 1 +239 1 8.05048 0.98245424 0.025537882221233921 1 +240 0 -8.307092 0.0154656731 0.022486586633696577 0 +241 0 -9.540723 0.008406055 0.012178633240645663 0 +242 0 -11.1408987 0.003794317 0.0054844536464761871 0 +243 0 -3.69382024 0.136236086 0.21129105026238285 0 +244 0 -11.1408987 0.003794317 0.0054844536464761871 0 +245 0 -10.352807 0.00561656 0.0081258244335933715 0 +246 1 9.274134 0.9904069 0.013906771757572052 1 +247 1 5.817549 0.9482785 0.076617288483981333 1 +248 0 -9.64856 0.007968333 0.011541920197508238 0 +249 0 -2.67131853 0.2082248 0.33683722078474054 0 +250 0 -10.793726 0.00451033656 0.0065217589263549926 0 +251 1 8.721394 0.987391531 0.018305823276373562 1 +252 0 2.11510253 0.7422223 1.9558006823853182 1 +253 1 6.044327 0.9535654 0.068596177822018822 1 +254 1 6.22759676 0.9574583 0.06271841386822509 1 +255 1 2.48014879 0.775576949 0.36665816906652682 1 +256 0 -11.1408987 0.003794317 0.0054844536464761871 0 +257 0 -11.1408987 0.003794317 0.0054844536464761871 0 +258 0 -11.1408987 0.003794317 0.0054844536464761871 0 +259 0 0.283193856 0.5353402 1.1057532280150515 1 +260 1 10.1194534 0.993692756 0.0091282474748994851 1 +261 1 8.043809 0.9823966 0.025622523365384141 1 +262 1 6.934371 0.969739556 0.044330761266236668 1 +263 1 8.721394 0.987391531 0.018305823276373562 1 +264 1 7.126985 0.9724413 0.040316905121624717 1 +265 0 -11.7356806 0.00282099587 0.0040755880659088068 0 +266 1 8.646986 0.9869198 0.018995213388831089 1 +267 1 4.94409 0.922158659 0.11691310546313334 1 +268 1 9.113095 0.989610851 0.015066775731727065 1 +269 0 -11.1408987 0.003794317 0.0054844536464761871 0 +270 1 7.11166048 0.972235262 0.040622634121999394 1 +271 0 -11.1408987 0.003794317 0.0054844536464761871 0 +272 1 4.94409 0.922158659 0.11691310546313334 1 +273 1 4.1208353 0.886996031 0.17300044622027391 1 +274 0 -11.7515974 0.002798697 0.0040433269201261592 0 +275 0 -1.31349862 0.3414702 0.60267939336265108 0 +276 0 -11.1408987 0.003794317 0.0054844536464761871 0 +277 0 -11.1408987 0.003794317 0.0054844536464761871 0 +278 0 -11.1408987 0.003794317 0.0054844536464761871 0 +279 1 8.623115 0.986764848 0.019221771815457974 1 +280 0 -11.1408987 0.003794317 0.0054844536464761871 0 +281 0 -11.1408987 0.003794317 0.0054844536464761871 0 +282 1 7.44834232 0.9764356 0.034403196863819908 1 +283 1 8.033978 0.9823114 0.025747612286718125 1 +284 1 7.12837362 0.9724599 0.040289315758062355 1 +285 1 9.274134 0.9904069 0.013906771757572052 1 +286 1 9.3179 0.990612566 0.01360717241034631 1 +287 0 -11.1408987 0.003794317 0.0054844536464761871 0 +288 1 3.95294356 0.878304541 0.1872068319257183 1 +289 1 8.045126 0.982408 0.025605804814090766 1 +290 0 -11.1408987 0.003794317 0.0054844536464761871 0 +291 0 -11.1408987 0.003794317 0.0054844536464761871 0 +292 1 7.545969 0.977533 0.032782713841218038 1 +293 1 7.82729864 0.9804234 0.028523190565462438 1 +294 0 -2.67131853 0.2082248 0.33683722078474054 0 +295 1 8.683719 0.987154841 0.018651696697845825 1 +296 0 1.93075657 0.7241973 1.8582916614884373 1 +297 0 1.21198213 0.647025764 1.5023652114898498 1 +298 0 -4.8046937 0.08299391 0.12499677939585228 0 +299 1 6.792139 0.967581451 0.047544982550267206 1 +300 1 7.116138 0.9722956 0.040533128500011242 1 +301 0 -11.1408987 0.003794317 0.0054844536464761871 0 +302 1 9.973059 0.993217 0.0098191523070945419 1 +303 0 -11.1408987 0.003794317 0.0054844536464761871 0 +304 1 7.494034 0.9769556 0.033635108686750376 1 +305 1 9.009594 0.989065051 0.015862684335247734 1 +306 0 -11.1408987 0.003794317 0.0054844536464761871 0 +307 0 -11.1408987 0.003794317 0.0054844536464761871 0 +308 1 7.624736 0.9783819 0.031530421564222699 1 +309 0 -3.69382024 0.136236086 0.21129105026238285 0 +310 0 -11.1408987 0.003794317 0.0054844536464761871 0 +311 0 -11.1408987 0.003794317 0.0054844536464761871 0 +312 1 7.981511 0.9818498 0.026425767238453236 1 +313 0 -11.1408987 0.003794317 0.0054844536464761871 0 +314 0 -10.0781832 0.00643791631 0.009317976395589251 0 +315 0 8.130573 0.983131349 5.88951159247455 1 +316 1 4.73531771 0.9143276 0.1292168911311686 1 +317 1 8.481019 0.9858042 0.020626967038070158 1 +318 0 -9.641098 0.007997878 0.011584888039440988 0 +319 0 0.7705238 0.5951416 1.3045106471098233 1 +320 1 7.97981071 0.98183465 0.026448012968183419 1 +321 0 -2.67131853 0.2082248 0.33683722078474054 0 +322 0 -11.1408987 0.003794317 0.0054844536464761871 0 +323 1 6.252937 0.957971454 0.061945428766314335 1 +324 0 -11.1408987 0.003794317 0.0054844536464761871 0 +325 0 -9.301386 0.009464545 0.013719479606889235 0 +326 1 5.24081039 0.932163358 0.10134529157224524 1 +327 0 -11.1408987 0.003794317 0.0054844536464761871 0 +328 1 7.894324 0.9810564 0.027592028372844139 1 +329 1 8.710652 0.9873245 0.018403802166269453 1 +330 1 7.837536 0.9805214 0.028379005230758148 1 +331 0 -11.1408987 0.003794317 0.0054844536464761871 0 +332 0 -11.4044237 0.00332746375 0.0048085199879913726 0 +333 1 5.46663237 0.9389642 0.090857960051291389 1 +334 1 7.08571625 0.971882939 0.041145539292823469 1 +335 0 -11.1408987 0.003794317 0.0054844536464761871 0 +336 1 6.50233 0.96271497 0.054819370622932836 1 +337 0 -11.1408987 0.003794317 0.0054844536464761871 0 +338 0 -10.0781832 0.00643791631 0.009317976395589251 0 +339 1 7.30815029 0.974767745 0.03686958239855153 1 +340 1 8.05048 0.98245424 0.025537882221233921 1 +341 0 -11.1408987 0.003794317 0.0054844536464761871 0 +342 0 -11.1408987 0.003794317 0.0054844536464761871 0 +343 0 -11.1408987 0.003794317 0.0054844536464761871 0 +344 1 9.290635 0.990484953 0.013793036484376598 1 +345 0 -11.1408987 0.003794317 0.0054844536464761871 0 +346 0 -9.301386 0.009464545 0.013719479606889235 0 +347 0 -8.585843 0.01348073 0.019580863553249173 0 +348 1 3.204673 0.8323447 0.264746958820682 1 +349 1 3.02492 0.819425464 0.28731536957104747 1 +350 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +351 0 -11.1408987 0.003794317 0.0054844536464761871 0 +352 0 0.120472826 0.5150545 1.0441055452097858 1 +353 1 8.061415 0.982548237 0.025399858659549537 1 +354 0 -11.1408987 0.003794317 0.0054844536464761871 0 +355 0 -11.7515974 0.002798697 0.0040433269201261592 0 +356 1 2.28046 0.757721841 0.40025976070621477 1 +357 1 9.274134 0.9904069 0.013906771757572052 1 +358 1 8.413211 0.9853218 0.021333089126220839 1 +359 1 7.354948 0.9753369 0.036027441759334644 1 +360 1 9.35413551 0.9907795 0.013364048694591426 1 +361 1 7.97221 0.9817667 0.02654786023197938 1 +362 0 -8.104598 0.0170853827 0.02486199527913165 0 +363 0 -2.69398451 0.206362531 0.33344795467518717 0 +364 0 -11.1408987 0.003794317 0.0054844536464761871 0 +365 0 -11.1408987 0.003794317 0.0054844536464761871 0 +366 1 9.35413551 0.9907795 0.013364048694591426 1 +367 1 9.35413551 0.9907795 0.013364048694591426 1 +368 0 -11.1249819 0.003824518 0.0055281913271731124 0 +369 0 -10.0622663 0.00648902263 0.009392186896397094 0 +370 0 -10.4720278 0.005293259 0.0076568411573198387 0 +371 0 -11.1249819 0.003824518 0.0055281913271731124 0 +372 0 -11.1408987 0.003794317 0.0054844536464761871 0 +373 0 -11.1408987 0.003794317 0.0054844536464761871 0 +374 0 -11.1408987 0.003794317 0.0054844536464761871 0 +375 0 -11.1408987 0.003794317 0.0054844536464761871 0 +376 0 -11.1408987 0.003794317 0.0054844536464761871 0 +377 0 -10.0781832 0.00643791631 0.009317976395589251 0 +378 0 -11.2141371 0.00365838455 0.0052876112142239253 0 +379 0 -5.271106 0.0668850541 0.099873284283095887 0 +380 0 -11.1408987 0.003794317 0.0054844536464761871 0 +381 1 9.98956 0.993272364 0.009738723040134005 1 +382 0 -11.4044237 0.00332746375 0.0048085199879913726 0 +383 0 -11.1408987 0.003794317 0.0054844536464761871 0 +384 0 -11.1408987 0.003794317 0.0054844536464761871 0 +385 0 -8.386765 0.0148706678 0.021614954448689945 0 +386 1 8.639983 0.9868746 0.019061347344820612 1 +387 0 -9.289907 0.009518501 0.013798067832613392 0 +388 0 -11.7515974 0.002798697 0.0040433269201261592 0 +389 0 -10.9635057 0.004144777 0.0059920758416508691 0 +390 0 -11.1408987 0.003794317 0.0054844536464761871 0 +391 1 9.887188 0.992921531 0.010248386218477984 1 +392 0 -11.1408987 0.003794317 0.0054844536464761871 0 +393 0 -10.0781832 0.00643791631 0.009317976395589251 0 +394 0 -10.7778091 0.004546211 0.0065737503869248157 0 +395 0 -11.1408987 0.003794317 0.0054844536464761871 0 +396 0 -11.1408987 0.003794317 0.0054844536464761871 0 +397 0 -11.1408987 0.003794317 0.0054844536464761871 0 +398 0 -11.4044237 0.00332746375 0.0048085199879913726 0 +399 0 -10.7778091 0.004546211 0.0065737503869248157 0 +400 1 8.700008 0.9872577 0.018501352204702889 1 +401 0 -11.1408987 0.003794317 0.0054844536464761871 0 +402 0 -9.289907 0.009518501 0.013798067832613392 0 +403 0 -6.795408 0.0323673 0.047468570938158913 0 +404 0 -10.8669643 0.00434886431 0.0062877672328930361 0 +405 0 -11.1408987 0.003794317 0.0054844536464761871 0 +406 0 -10.793726 0.00451033656 0.0065217589263549926 0 +407 0 -11.1408987 0.003794317 0.0054844536464761871 0 +408 0 -8.023946 0.0177759528 0.025875951311168544 0 +409 0 -11.1408987 0.003794317 0.0054844536464761871 0 +410 0 -11.1408987 0.003794317 0.0054844536464761871 0 +411 0 -1.60860276 0.309106171 0.53346406927085821 0 +412 1 9.099943 0.989543 0.015165664584975543 1 +413 0 -11.1408987 0.003794317 0.0054844536464761871 0 +414 1 7.96331 0.9816869 0.026665145799971899 1 +415 0 -2.6968832 0.206125274 0.33301672841502694 0 +416 1 6.989869 0.9705433 0.043135478762872534 1 +417 0 -11.1408987 0.003794317 0.0054844536464761871 0 +418 0 -10.616333 0.004926604 0.0071251533271606418 0 +419 0 -8.972227 0.0111388648 0.016160155919286649 0 +420 0 -7.567138 0.02223571 0.032441379080581804 0 +421 1 8.469339 0.985722244 0.020746912751097368 1 +422 0 -7.79756832 0.0198639631 0.02894609453563346 0 +423 0 -11.1249819 0.003824518 0.0055281913271731124 0 +424 0 -11.1408987 0.003794317 0.0054844536464761871 0 +425 1 9.973059 0.993217 0.0098191523070945419 1 +426 0 -9.289907 0.009518501 0.013798067832613392 0 +427 1 8.834639 0.988077343 0.017304120598901823 1 +428 0 -11.1408987 0.003794317 0.0054844536464761871 0 +429 0 -11.1408987 0.003794317 0.0054844536464761871 0 +430 0 -11.0827265 0.003905862 0.0056460013312586337 0 +431 0 -9.714336 0.0077125174 0.011169940367472734 0 +432 0 -11.7515974 0.002798697 0.0040433269201261592 0 +433 0 -10.2562656 0.00589268841 0.0085264990912724478 0 +434 0 2.888761 0.8091321 2.3893535965491437 1 +435 1 8.267367 0.984228969 0.022934115231135192 1 +436 1 5.93617153 0.9511113 0.07231389299691196 1 +437 0 -11.1408987 0.003794317 0.0054844536464761871 0 +438 0 -10.5875225 0.00499773 0.0072282775549519776 0 +439 0 -11.1408987 0.003794317 0.0054844536464761871 0 +440 1 8.867787 0.988271 0.017021391272806899 1 +441 0 -4.054161 0.116388828 0.17851643454804922 0 +442 0 -7.91431141 0.0187587924 0.027320273233670325 0 +443 0 -10.352807 0.00561656 0.0081258244335933715 0 +444 0 -8.824449 0.0119828414 0.017391998029464235 0 +445 0 -11.1408987 0.003794317 0.0054844536464761871 0 +446 0 -11.1408987 0.003794317 0.0054844536464761871 0 +447 0 -11.1408987 0.003794317 0.0054844536464761871 0 +448 0 -10.0781832 0.00643791631 0.009317976395589251 0 +449 1 9.35413551 0.9907795 0.013364048694591426 1 +450 0 -9.540723 0.008406055 0.012178633240645663 0 +451 0 -11.1408987 0.003794317 0.0054844536464761871 0 +452 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +453 1 8.700008 0.9872577 0.018501352204702889 1 +454 0 -10.4720278 0.005293259 0.0076568411573198387 0 +455 1 4.937511 0.9219222 0.11728307577870839 1 +456 1 9.973059 0.993217 0.0098191523070945419 1 +457 1 8.678677 0.987122834 0.018698475671585835 1 +458 0 -11.1408987 0.003794317 0.0054844536464761871 0 +459 0 -11.1249819 0.003824518 0.0055281913271731124 0 +460 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +461 0 -6.795408 0.0323673 0.047468570938158913 0 +462 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +463 0 -11.7515974 0.002798697 0.0040433269201261592 0 +464 0 -11.1408987 0.003794317 0.0054844536464761871 0 +465 1 9.784009 0.992549539 0.010788985249565914 1 +466 1 9.302145 0.990539 0.013714295254109422 1 +467 1 6.044327 0.9535654 0.068596177822018822 1 +468 0 -11.1408987 0.003794317 0.0054844536464761871 0 +469 0 -11.1408987 0.003794317 0.0054844536464761871 0 +470 0 -10.0781832 0.00643791631 0.009317976395589251 0 +471 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +472 0 -10.0781832 0.00643791631 0.009317976395589251 0 +473 0 -11.1408987 0.003794317 0.0054844536464761871 0 +474 0 -11.1408987 0.003794317 0.0054844536464761871 0 +475 0 -11.1408987 0.003794317 0.0054844536464761871 0 +476 0 -11.1408987 0.003794317 0.0054844536464761871 0 +477 0 -11.1408987 0.003794317 0.0054844536464761871 0 +478 0 -10.793726 0.00451033656 0.0065217589263549926 0 +479 1 8.700008 0.9872577 0.018501352204702889 1 +480 0 -10.0781832 0.00643791631 0.009317976395589251 0 +481 0 -9.934567 0.00691389851 0.010009288711116292 0 +482 1 9.784009 0.992549539 0.010788985249565914 1 +483 1 9.257421 0.9903271 0.014022947270317726 1 +484 0 -11.1408987 0.003794317 0.0054844536464761871 0 +485 0 -6.8515954 0.03149888 0.046174376487384906 0 +486 0 -10.0781832 0.00643791631 0.009317976395589251 0 +487 1 10.1194534 0.993692756 0.0091282474748994851 1 +488 1 5.259406 0.9327489 0.10043931993839436 1 +489 1 0.7117242 0.5880384 0.76601776309411718 1 +490 0 -11.1408987 0.003794317 0.0054844536464761871 0 +491 1 6.721 0.966447 0.049237484113479738 1 +492 0 -10.0781832 0.00643791631 0.009317976395589251 0 +493 1 8.683719 0.987154841 0.018651696697845825 1 +494 0 -2.35003781 0.235949 0.38825914437927211 0 +495 0 -10.0781832 0.00643791631 0.009317976395589251 0 +496 0 -10.0781832 0.00643791631 0.009317976395589251 0 +497 0 -10.793726 0.00451033656 0.0065217589263549926 0 +498 0 -11.1408987 0.003794317 0.0054844536464761871 0 +499 0 -11.1408987 0.003794317 0.0054844536464761871 0 +500 0 -11.1408987 0.003794317 0.0054844536464761871 0 +501 0 -11.1408987 0.003794317 0.0054844536464761871 0 +502 0 -11.1408987 0.003794317 0.0054844536464761871 0 +503 0 -11.1408987 0.003794317 0.0054844536464761871 0 +504 0 -11.1408987 0.003794317 0.0054844536464761871 0 +505 0 -10.4720278 0.005293259 0.0076568411573198387 0 +506 1 8.429924 0.985442162 0.021156897062731286 1 +507 0 -6.795408 0.0323673 0.047468570938158913 0 +508 0 -11.1408987 0.003794317 0.0054844536464761871 0 +509 0 -11.1408987 0.003794317 0.0054844536464761871 0 +510 0 -11.1408987 0.003794317 0.0054844536464761871 0 +511 0 -11.1408987 0.003794317 0.0054844536464761871 0 +512 0 -11.1408987 0.003794317 0.0054844536464761871 0 +513 0 -10.0781832 0.00643791631 0.009317976395589251 0 +514 1 9.35413551 0.9907795 0.013364048694591426 1 +515 1 9.386926 0.9909281 0.013147693495487394 1 +516 0 -10.0781832 0.00643791631 0.009317976395589251 0 +517 0 -10.0781832 0.00643791631 0.009317976395589251 0 +518 0 -11.1408987 0.003794317 0.0054844536464761871 0 +519 1 6.73728943 0.9667101 0.048844794129335775 1 +520 0 -11.1408987 0.003794317 0.0054844536464761871 0 +521 0 -11.1408987 0.003794317 0.0054844536464761871 0 +522 1 7.160863 0.9728917 0.039648895618641884 1 +523 1 9.274134 0.9904069 0.013906771757572052 1 +524 0 -11.1408987 0.003794317 0.0054844536464761871 0 +525 0 -11.1408987 0.003794317 0.0054844536464761871 0 +526 0 -11.1408987 0.003794317 0.0054844536464761871 0 +527 0 -11.1408987 0.003794317 0.0054844536464761871 0 +528 0 -11.1249819 0.003824518 0.0055281913271731124 0 +529 0 -10.0781832 0.00643791631 0.009317976395589251 0 +530 1 8.005754 0.982064545 0.02611024762410109 1 +531 0 -10.793726 0.00451033656 0.0065217589263549926 0 +532 0 -10.0781832 0.00643791631 0.009317976395589251 0 +533 0 -11.1408987 0.003794317 0.0054844536464761871 0 +534 0 -11.1408987 0.003794317 0.0054844536464761871 0 +535 0 -11.1249819 0.003824518 0.0055281913271731124 0 +536 0 -11.1408987 0.003794317 0.0054844536464761871 0 +537 0 -11.1408987 0.003794317 0.0054844536464761871 0 +538 0 -11.1408987 0.003794317 0.0054844536464761871 0 +539 0 -11.1408987 0.003794317 0.0054844536464761871 0 +540 0 -10.352807 0.00561656 0.0081258244335933715 0 +541 0 -11.1408987 0.003794317 0.0054844536464761871 0 +542 0 -10.4720278 0.005293259 0.0076568411573198387 0 +543 0 -11.1408987 0.003794317 0.0054844536464761871 0 +544 0 -11.1249819 0.003824518 0.0055281913271731124 0 +545 0 -11.1408987 0.003794317 0.0054844536464761871 0 +546 1 9.35413551 0.9907795 0.013364048694591426 1 +547 0 -10.0781832 0.00643791631 0.009317976395589251 0 +548 0 -10.0781832 0.00643791631 0.009317976395589251 0 +549 1 6.23441839 0.9575971 0.062509346489219977 1 +550 0 -11.1408987 0.003794317 0.0054844536464761871 0 +551 0 -11.1408987 0.003794317 0.0054844536464761871 0 +552 0 -8.08276749 0.0172696561 0.025132491986605564 0 +553 0 -3.9415133 0.122307636 0.18821273881529132 0 +554 0 -11.1408987 0.003794317 0.0054844536464761871 0 +555 0 -7.34011126 0.0248421971 0.03629239594797426 0 +556 0 -10.793726 0.00451033656 0.0065217589263549926 0 +557 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +558 0 -11.1408987 0.003794317 0.0054844536464761871 0 +559 0 -11.1408987 0.003794317 0.0054844536464761871 0 +560 0 -11.1408987 0.003794317 0.0054844536464761871 0 +561 0 -11.1408987 0.003794317 0.0054844536464761871 0 +562 0 -11.1408987 0.003794317 0.0054844536464761871 0 +563 0 -11.1408987 0.003794317 0.0054844536464761871 0 +564 0 -11.7515974 0.002798697 0.0040433269201261592 0 +565 1 9.35413551 0.9907795 0.013364048694591426 1 +566 0 -11.1408987 0.003794317 0.0054844536464761871 0 +567 0 -8.451772 0.0144019378 0.020928675408500307 0 +568 1 5.817549 0.9482785 0.076617288483981333 1 +569 1 9.099943 0.989543 0.015165664584975543 1 +570 1 7.00637 0.9707783 0.042786255012913291 1 +571 1 9.257421 0.9903271 0.014022947270317726 1 +572 0 -11.1408987 0.003794317 0.0054844536464761871 0 +573 0 -11.1408987 0.003794317 0.0054844536464761871 0 +574 1 8.517464 0.9860569 0.020257160851031238 1 +575 0 -11.1408987 0.003794317 0.0054844536464761871 0 +576 0 -11.1408987 0.003794317 0.0054844536464761871 0 +577 0 -11.1408987 0.003794317 0.0054844536464761871 0 +578 0 -11.1408987 0.003794317 0.0054844536464761871 0 +579 0 -11.1408987 0.003794317 0.0054844536464761871 0 +580 0 -11.1408987 0.003794317 0.0054844536464761871 0 +581 1 8.043809 0.9823966 0.025622523365384141 1 +582 1 9.73166 0.9923535 0.011073961860426338 1 +583 0 -11.1408987 0.003794317 0.0054844536464761871 0 +584 0 -8.824449 0.0119828414 0.017391998029464235 0 +585 0 -11.1408987 0.003794317 0.0054844536464761871 0 +586 1 9.274134 0.9904069 0.013906771757572052 1 +587 0 -11.7515974 0.002798697 0.0040433269201261592 0 +588 1 7.760263 0.9797696 0.029485584466509632 1 +589 0 -11.1408987 0.003794317 0.0054844536464761871 0 +590 1 5.14993954 0.9292332 0.10588740490909247 1 +591 1 8.060098 0.9825369 0.025416487304717433 1 +592 1 8.055492 0.9824974 0.025474514025770799 1 +593 0 -11.1408987 0.003794317 0.0054844536464761871 0 +594 1 6.73728943 0.9667101 0.048844794129335775 1 +595 0 -11.1408987 0.003794317 0.0054844536464761871 0 +596 0 -11.1408987 0.003794317 0.0054844536464761871 0 +597 0 -11.1249819 0.003824518 0.0055281913271731124 0 +598 0 -11.1408987 0.003794317 0.0054844536464761871 0 +599 0 -10.7778091 0.004546211 0.0065737503869248157 0 +600 0 -11.1408987 0.003794317 0.0054844536464761871 0 +601 0 -10.0781832 0.00643791631 0.009317976395589251 0 +602 0 -11.1408987 0.003794317 0.0054844536464761871 0 +603 1 5.29666758 0.9339082 0.098647312760696312 1 +604 1 5.38688 0.9366384 0.094435885602072098 1 +605 1 9.113095 0.989610851 0.015066775731727065 1 +606 0 -11.1408987 0.003794317 0.0054844536464761871 0 +607 0 -11.1408987 0.003794317 0.0054844536464761871 0 +608 1 8.830113 0.98805064 0.017343110091630833 1 +609 0 -11.1408987 0.003794317 0.0054844536464761871 0 +610 1 8.867787 0.988271 0.017021391272806899 1 +611 1 8.260937 0.98417896 0.023007419875961721 1 +612 1 9.274134 0.9904069 0.013906771757572052 1 +613 0 -10.4720278 0.005293259 0.0076568411573198387 0 +614 0 -10.0781832 0.00643791631 0.009317976395589251 0 +615 0 -11.1249819 0.003824518 0.0055281913271731124 0 +616 0 -11.1408987 0.003794317 0.0054844536464761871 0 +617 0 -1.60860276 0.309106171 0.53346406927085821 0 +618 0 -11.1408987 0.003794317 0.0054844536464761871 0 +619 0 -11.1408987 0.003794317 0.0054844536464761871 0 +620 0 -11.1408987 0.003794317 0.0054844536464761871 0 +621 0 -3.58913 0.142513961 0.2218149117094308 0 +622 0 -6.65166759 0.0346954949 0.050943982898629274 0 +623 0 -11.1408987 0.003794317 0.0054844536464761871 0 +624 0 -10.0781832 0.00643791631 0.009317976395589251 0 +625 0 -4.167026 0.110709623 0.16927351973216262 0 +626 1 4.842628 0.918438256 0.12274535892278479 1 +627 0 -6.795408 0.0323673 0.047468570938158913 0 +628 0 -11.1408987 0.003794317 0.0054844536464761871 0 +629 0 -11.1408987 0.003794317 0.0054844536464761871 0 +630 0 -10.7778091 0.004546211 0.0065737503869248157 0 +631 0 -11.1408987 0.003794317 0.0054844536464761871 0 +632 0 -11.1408987 0.003794317 0.0054844536464761871 0 +633 1 6.42620564 0.9613244 0.056904752044233863 1 +634 0 -11.1408987 0.003794317 0.0054844536464761871 0 +635 0 -11.1249819 0.003824518 0.0055281913271731124 0 +636 1 9.492584 0.991390944 0.012474015207671739 1 +637 0 -9.452258 0.008782881 0.012726991314300787 0 +638 0 -11.1408987 0.003794317 0.0054844536464761871 0 +639 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +640 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +641 0 -11.1408987 0.003794317 0.0054844536464761871 0 +642 0 -11.1408987 0.003794317 0.0054844536464761871 0 +643 0 -11.1408987 0.003794317 0.0054844536464761871 0 +644 0 -11.1408987 0.003794317 0.0054844536464761871 0 +645 0 -11.1408987 0.003794317 0.0054844536464761871 0 +646 0 -10.793726 0.00451033656 0.0065217589263549926 0 +647 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +648 1 9.615418 0.9918996 0.011733982451323453 1 +649 0 -11.1408987 0.003794317 0.0054844536464761871 0 +650 0 -6.795408 0.0323673 0.047468570938158913 0 +651 0 -10.2562656 0.00589268841 0.0085264990912724478 0 +652 0 -11.7515974 0.002798697 0.0040433269201261592 0 +653 0 -11.1408987 0.003794317 0.0054844536464761871 0 +654 0 -11.1408987 0.003794317 0.0054844536464761871 0 +655 0 -11.1408987 0.003794317 0.0054844536464761871 0 +656 0 -11.1408987 0.003794317 0.0054844536464761871 0 +657 0 -1.18511176 0.356048644 0.63497638250270927 0 +658 1 7.770414 0.979869962 0.029337792601206499 1 +659 0 -11.1408987 0.003794317 0.0054844536464761871 0 +660 0 -11.1408987 0.003794317 0.0054844536464761871 0 +661 0 -11.1408987 0.003794317 0.0054844536464761871 0 +662 0 -11.1249819 0.003824518 0.0055281913271731124 0 +663 0 -11.1249819 0.003824518 0.0055281913271731124 0 +664 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +665 0 -11.1408987 0.003794317 0.0054844536464761871 0 +666 0 -10.793726 0.00451033656 0.0065217589263549926 0 +667 0 -11.1408987 0.003794317 0.0054844536464761871 0 +668 1 7.361788 0.975419 0.035906042607814007 1 +669 1 8.481019 0.9858042 0.020626967038070158 1 +670 1 7.82689238 0.9804195 0.028528891619975134 1 +671 0 -10.793726 0.00451033656 0.0065217589263549926 0 +672 0 -11.1408987 0.003794317 0.0054844536464761871 0 +673 0 -10.4720278 0.005293259 0.0076568411573198387 0 +674 0 -11.1408987 0.003794317 0.0054844536464761871 0 +675 0 -11.1249819 0.003824518 0.0055281913271731124 0 +676 0 -11.1408987 0.003794317 0.0054844536464761871 0 +677 0 -11.1408987 0.003794317 0.0054844536464761871 0 +678 0 -11.1408987 0.003794317 0.0054844536464761871 0 +679 0 -11.1408987 0.003794317 0.0054844536464761871 0 +680 1 9.973059 0.993217 0.0098191523070945419 1 +681 1 8.683719 0.987154841 0.018651696697845825 1 +682 0 -11.7515974 0.002798697 0.0040433269201261592 0 +683 0 -11.1408987 0.003794317 0.0054844536464761871 0 +684 0 -11.1408987 0.003794317 0.0054844536464761871 0 +685 0 -11.1408987 0.003794317 0.0054844536464761871 0 +686 0 -11.1408987 0.003794317 0.0054844536464761871 0 +687 0 -9.64856 0.007968333 0.011541920197508238 0 +688 0 -11.1408987 0.003794317 0.0054844536464761871 0 +689 0 -9.129003 0.0103077162 0.014948064293186902 0 +690 0 -10.6034384 0.00495831249 0.0071711259144706186 0 +691 1 3.86220169 0.873371243 0.19533306500151071 1 +692 0 -11.1408987 0.003794317 0.0054844536464761871 0 +693 0 -11.1408987 0.003794317 0.0054844536464761871 0 +694 0 -10.352807 0.00561656 0.0081258244335933715 0 +695 0 -11.1408987 0.003794317 0.0054844536464761871 0 +696 1 9.067044 0.9893714 0.015415871487885204 1 +697 1 4.20529032 0.89116 0.16624359830210719 1 +698 1 4.20529032 0.89116 0.16624359830210719 1 diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key-out.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key-out.txt new file mode 100644 index 0000000000..193a84b3cd --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key-out.txt @@ -0,0 +1,67 @@ +maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% seed=1 xf=Term{col=Label} +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================== +PREDICTED || 0 | 1 | 2 | Recall +TRUTH ||======================== + 0 || 21 | 0 | 0 | 1.0000 + 1 || 0 | 27 | 3 | 0.9000 + 2 || 0 | 2 | 26 | 0.9286 + ||======================== +Precision ||1.0000 |0.9310 |0.8966 | +Accuracy(micro-avg): 0.936709 +Accuracy(macro-avg): 0.942857 +Log-loss: 0.312759 +Log-loss reduction: 71.240938 + +Confusion table + ||======================== +PREDICTED || 0 | 1 | 2 | Recall +TRUTH ||======================== + 0 || 29 | 0 | 0 | 1.0000 + 1 || 0 | 19 | 1 | 0.9500 + 2 || 0 | 2 | 20 | 0.9091 + ||======================== +Precision ||1.0000 |0.9048 |0.9524 | +Accuracy(micro-avg): 0.957746 +Accuracy(macro-avg): 0.953030 +Log-loss: 0.193389 +Log-loss reduction: 82.186751 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.947228 (0.0105) +Accuracy(macro-avg): 0.947944 (0.0051) +Log-loss: 0.253074 (0.0597) +Log-loss reduction: 76.713844 (5.4729) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Building term dictionary' started. +[1] (%Time%) 71 examples Total Terms: 3 +[1] 'Building term dictionary' finished in %Time%. +[2] 'Loading data for LightGBM' started. +[2] 'Loading data for LightGBM' finished in %Time%. +[3] 'Training with LightGBM' started. +[3] 'Training with LightGBM' finished in %Time%. +[4] 'Building term dictionary #2' started. +[4] (%Time%) 79 examples Total Terms: 3 +[4] 'Building term dictionary #2' finished in %Time%. +[5] 'Loading data for LightGBM #2' started. +[5] 'Loading data for LightGBM #2' finished in %Time%. +[6] 'Training with LightGBM #2' started. +[6] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key-rp.txt new file mode 100644 index 0000000000..b28e5f0924 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.947228 0.947944 0.253074 76.71384 10 0.2 20 10 1 LightGBMMC %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% seed=1 xf=Term{col=Label} /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key.txt new file mode 100644 index 0000000000..eba12784d0 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.key.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +5 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +6 0 0 0.12225796502047259 0.884920061 0.05914253 0.0559373945 0 2 1 +8 0 0 0.13903079517192601 0.87020123 0.07016016 0.0596385933 0 1 2 +9 0 0 0.13970878538557358 0.869611442 0.07047896 0.05990959 0 1 2 +10 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +11 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +18 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +20 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +21 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +25 0 0 0.13970878538557358 0.869611442 0.07047896 0.05990959 0 1 2 +28 0 0 0.12225796502047259 0.884920061 0.05914253 0.0559373945 0 2 1 +31 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +32 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +35 0 0 0.13903079517192601 0.87020123 0.07016016 0.0596385933 0 1 2 +37 0 0 0.13970878538557358 0.869611442 0.07047896 0.05990959 0 1 2 +40 0 0 0.12225796502047259 0.884920061 0.05914253 0.0559373945 0 2 1 +41 0 0 0.17550530270540357 0.839032948 0.09255621 0.068410866 0 1 2 +44 0 0 0.25328601458204941 0.776245832 0.167526156 0.0562280267 0 1 2 +45 0 0 0.13903079517192601 0.87020123 0.07016016 0.0596385933 0 1 2 +46 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +48 0 0 0.12269432479790915 0.884534 0.05934094 0.05612505 0 2 1 +50 1 1 0.48031528673730972 0.6185883 0.2931604 0.0882512555 1 2 0 +51 1 1 0.1855230347406718 0.8306697 0.09896271 0.0703676 1 0 2 +52 1 2 1.8686158620047173 0.7455236 0.154337138 0.100139305 2 1 0 +54 1 1 0.45820041221338154 0.6324207 0.3149093 0.05266998 1 2 0 +56 1 1 0.58631409634709242 0.556374252 0.357764423 0.08586135 1 2 0 +60 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +63 1 1 0.44289031357940112 0.642177641 0.3043398 0.053482566 1 2 0 +64 1 1 0.14288683084862894 0.866852164 0.06818328 0.06496458 1 2 0 +66 1 1 0.13881478450725465 0.8703892 0.0686788 0.0609319545 1 2 0 +68 1 1 0.14755364077036032 0.862816155 0.0811026245 0.0560812131 1 2 0 +69 1 1 0.13689581878715465 0.8720611 0.07104298 0.0568959676 1 2 0 +70 1 1 0.58631409634709242 0.556374252 0.357764423 0.08586135 1 2 0 +71 1 1 0.15245577872775815 0.858596861 0.07763986 0.0637633 1 2 0 +72 1 2 1.4638898231048283 0.7123695 0.231334671 0.05629582 2 1 0 +73 1 1 0.45820041221338154 0.6324207 0.3149093 0.05266998 1 2 0 +74 1 1 0.13842123633682313 0.870731831 0.068711035 0.06055716 1 2 0 +76 1 1 0.45820041221338154 0.6324207 0.3149093 0.05266998 1 2 0 +77 1 2 2.0734225760002563 0.815010965 0.12575464 0.0592344068 2 1 0 +79 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +82 1 1 0.13641482472258923 0.872480631 0.07081 0.0567093827 1 2 0 +88 1 1 0.13407561188247241 0.874523938 0.06425465 0.0612214059 1 2 0 +90 1 1 0.14206322054986673 0.8675664 0.07583086 0.0566027239 1 2 0 +91 1 1 0.44289031357940112 0.642177641 0.3043398 0.053482566 1 2 0 +92 1 1 0.13641482472258923 0.872480631 0.07081 0.0567093827 1 2 0 +93 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +95 1 1 0.13407561188247241 0.874523938 0.06425465 0.0612214059 1 2 0 +96 1 1 0.13407561188247241 0.874523938 0.06425465 0.0612214059 1 2 0 +97 1 1 0.13842123633682313 0.870731831 0.068711035 0.06055716 1 2 0 +98 1 1 0.5490426296940486 0.5775024 0.363434 0.0590636 1 0 2 +99 1 1 0.13879102207379132 0.8704099 0.06865671 0.0609334 1 2 0 +100 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +102 2 2 0.12282263476045074 0.8844205 0.0591995977 0.0563798733 2 1 0 +104 2 2 0.12282263476045074 0.8844205 0.0591995977 0.0563798733 2 1 0 +105 2 2 0.12282263476045074 0.8844205 0.0591995977 0.0563798733 2 1 0 +106 2 1 2.3492272871651649 0.84814316 0.09544288 0.05641394 1 2 0 +108 2 2 0.22657586758781198 0.797258854 0.14797686 0.0547643043 2 1 0 +109 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +111 2 2 0.177848875720656 0.8370689 0.108788565 0.0541424938 2 1 0 +112 2 2 0.13281455464792449 0.875627458 0.06831084 0.0560617261 2 1 0 +113 2 2 0.1962166719523184 0.821834147 0.122739322 0.0554265566 2 1 0 +115 2 2 0.17200937673419167 0.8419713 0.09234353 0.0656852052 2 0 1 +117 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +120 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +121 2 2 0.16411842591849909 0.8486415 0.09412395 0.0572345145 2 1 0 +122 2 2 0.13716672321276682 0.871824861 0.07206305 0.0561121143 2 1 0 +123 2 2 0.28256655698542577 0.753846467 0.18986699 0.0562865436 2 1 0 +125 2 2 0.20564882812625254 0.8141189 0.09413582 0.09174526 2 0 1 +128 2 2 0.13716672321276682 0.871824861 0.07206305 0.0561121143 2 1 0 +129 2 2 0.16567788300150446 0.8473191 0.09548668 0.0571942 2 1 0 +131 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +132 2 2 0.13716672321276682 0.871824861 0.07206305 0.0561121143 2 1 0 +133 2 2 0.29112966022097542 0.747418761 0.191831574 0.06074964 2 1 0 +137 2 2 0.22116855095526036 0.801581562 0.1049951 0.09342333 2 1 0 +138 2 1 0.99148777165233459 0.5769952 0.371024281 0.05198054 1 2 0 +141 2 2 0.18520119392899573 0.8309371 0.09454043 0.07452247 2 0 1 +144 2 2 0.16223550400064654 0.850240946 0.0928473249 0.05691175 2 0 1 +145 2 2 0.14505497806361808 0.864974737 0.07757514 0.0574500971 2 1 0 +147 2 2 0.14505497806361808 0.864974737 0.07757514 0.0574500971 2 1 0 +0 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +1 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +2 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +3 0 0 0.13111980383336003 0.8771127 0.06430127 0.05858605 0 1 2 +4 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +7 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +12 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +13 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +14 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +15 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +16 0 0 0.12377570311405263 0.883578 0.0616899766 0.0547319949 0 1 2 +17 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +19 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +22 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +23 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +24 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +26 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +27 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +29 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +30 0 0 0.13466431803417811 0.874009252 0.0676120147 0.058378756 0 1 2 +33 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +34 0 0 0.13111980383336003 0.8771127 0.06430127 0.05858605 0 1 2 +36 0 0 0.18823437933195611 0.8284205 0.120264143 0.05131534 0 1 2 +38 0 0 0.13227381045206946 0.8761011 0.06422711 0.0596717857 0 1 2 +39 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +42 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +43 0 0 0.13145127781390373 0.876822 0.0646113753 0.0585666336 0 1 2 +47 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +49 0 0 0.12805244799353907 0.879807234 0.0614267066 0.0587660335 0 1 2 +53 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +55 1 1 0.13788477324168841 0.8711991 0.0693822056 0.0594187379 1 2 0 +57 1 1 0.14180960025970848 0.867786467 0.06764004 0.06457352 1 2 0 +58 1 1 0.14599016737971268 0.8641662 0.07662087 0.0592129268 1 2 0 +59 1 1 0.15802382006343754 0.853829443 0.08263559 0.06353495 1 2 0 +61 1 1 0.24588101940191279 0.782015264 0.155458942 0.06252578 1 2 0 +62 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +65 1 1 0.13132980842568853 0.8769285 0.063261956 0.05980951 1 2 0 +67 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +75 1 1 0.16325813194034094 0.8493719 0.09269803 0.0579300523 1 2 0 +78 1 1 0.25856064866775763 0.7721622 0.1669285 0.0609093271 1 2 0 +80 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +81 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +83 1 2 0.93589296161344149 0.5591961 0.392235458 0.04856844 2 1 0 +84 1 1 0.30739855328930082 0.735357463 0.193893984 0.07074856 1 2 0 +85 1 1 0.36387320359326997 0.6949793 0.250199676 0.05482102 1 2 0 +86 1 1 0.22482401043721545 0.798656762 0.137458712 0.06388455 1 2 0 +87 1 1 0.15038993216531976 0.8603724 0.08044732 0.05918027 1 2 0 +89 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +94 1 1 0.13238614086498687 0.876002669 0.06343664 0.0605606847 1 2 0 +101 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +103 2 2 0.1391351873710466 0.8701104 0.06958967 0.0602999441 2 1 0 +107 2 2 0.14333558969752591 0.866463244 0.07176019 0.0617765374 2 1 0 +110 2 2 0.23871432870005888 0.787639856 0.156446457 0.0559136942 2 1 0 +114 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +116 2 2 0.1391351873710466 0.8701104 0.06958967 0.0602999441 2 1 0 +118 2 2 0.12489127544479019 0.882592857 0.06075944 0.05664773 2 0 1 +119 2 1 0.82777746896385962 0.500950456 0.4370195 0.0620300435 1 2 0 +124 2 2 0.15317496105764933 0.8579796 0.08057635 0.0614440367 2 1 0 +126 2 2 0.41542564005029348 0.6600593 0.280402571 0.0595381558 2 1 0 +127 2 2 0.39337756049800737 0.674773932 0.268265069 0.05696099 2 1 0 +130 2 2 0.12489127544479019 0.882592857 0.06075944 0.05664773 2 0 1 +134 2 1 0.85550144650046023 0.5024456 0.42507 0.07248444 1 2 0 +135 2 2 0.12489127544479019 0.882592857 0.06075944 0.05664773 2 0 1 +136 2 2 0.1485323137279633 0.861972153 0.0780924 0.05993546 2 1 0 +139 2 2 0.16469395959924102 0.848153234 0.09065638 0.0611904152 2 1 0 +140 2 2 0.1540180682859322 0.857256532 0.08267425 0.0600692481 2 1 0 +142 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +143 2 2 0.15317496105764933 0.8579796 0.08057635 0.0614440367 2 1 0 +146 2 2 0.1903299513274587 0.8266863 0.116503216 0.05681048 2 1 0 +148 2 2 0.15751162588437911 0.8542669 0.08508965 0.0606434755 2 1 0 +149 2 2 0.22273115731729765 0.80033 0.142754182 0.05691586 2 1 0 diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404-out.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404-out.txt new file mode 100644 index 0000000000..e6f1c68e64 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404-out.txt @@ -0,0 +1,65 @@ +maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================================== +PREDICTED || 0 | 1 | 2 | 3 | 4 | Recall +TRUTH ||======================================== + 0 || 21 | 0 | 0 | 0 | 0 | 1.0000 + 1 || 0 | 27 | 3 | 0 | 0 | 0.9000 + 2 || 0 | 2 | 26 | 0 | 0 | 0.9286 + 3 || 0 | 0 | 0 | 0 | 0 | 0.0000 + 4 || 0 | 0 | 0 | 0 | 0 | 0.0000 + ||======================================== +Precision ||1.0000 |0.9310 |0.8966 |0.0000 |0.0000 | +Accuracy(micro-avg): 0.936709 +Accuracy(macro-avg): 0.942857 +Log-loss: 0.312759 +Log-loss reduction: 71.240931 + +Confusion table + ||======================================== +PREDICTED || 0 | 1 | 2 | 3 | 4 | Recall +TRUTH ||======================================== + 0 || 29 | 0 | 0 | 0 | 0 | 1.0000 + 1 || 0 | 19 | 1 | 0 | 0 | 0.9500 + 2 || 0 | 2 | 20 | 0 | 0 | 0.9091 + 3 || 0 | 0 | 0 | 0 | 0 | 0.0000 + 4 || 0 | 0 | 0 | 0 | 0 | 0.0000 + ||======================================== +Precision ||1.0000 |0.9048 |0.9524 |0.0000 |0.0000 | +Accuracy(micro-avg): 0.957746 +Accuracy(macro-avg): 0.953030 +Log-loss: 0.193390 +Log-loss reduction: 82.186746 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.947228 (0.0105) +Accuracy(macro-avg): 0.947944 (0.0051) +Log-loss: 0.253074 (0.0597) +Log-loss reduction: 76.713839 (5.4729) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404-rp.txt new file mode 100644 index 0000000000..aad98c4e5a --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.947228 0.947944 0.253074 76.71384 10 0.2 20 10 1 LightGBMMC %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404.txt new file mode 100644 index 0000000000..62ea0fc960 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-CV-iris.keyU404.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +5 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +6 0 0 0.12225803237644002 0.88492 0.0591425262 0.05593739 0 2 1 +8 0 0 0.13903086366717143 0.8702012 0.07016015 0.05963859 0 1 2 +9 0 0 0.13970885392727384 0.8696114 0.07047896 0.0599095859 0 1 2 +10 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +11 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +18 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +20 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +21 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +25 0 0 0.13970885392727384 0.8696114 0.07047896 0.0599095859 0 1 2 +28 0 0 0.12225803237644002 0.88492 0.0591425262 0.05593739 0 2 1 +31 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +32 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +35 0 0 0.13903086366717143 0.8702012 0.07016015 0.05963859 0 1 2 +37 0 0 0.13970885392727384 0.8696114 0.07047896 0.0599095859 0 1 2 +40 0 0 0.12225803237644002 0.88492 0.0591425262 0.05593739 0 2 1 +41 0 0 0.17550537374510114 0.8390329 0.0925562 0.06841086 0 1 2 +44 0 0 0.25328609136783631 0.7762458 0.167526156 0.056228023 0 1 2 +45 0 0 0.13903086366717143 0.8702012 0.07016015 0.05963859 0 1 2 +46 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +48 0 0 0.12269439218327444 0.884533942 0.0593409352 0.05612505 0 2 1 +50 1 1 0.48031528673730972 0.6185883 0.293160379 0.08825125 1 2 0 +51 1 1 0.18552310649560261 0.830669641 0.0989627 0.07036759 1 0 2 +52 1 2 1.8686159585541422 0.7455235 0.154337123 0.1001393 2 1 0 +54 1 1 0.45820050646179217 0.632420659 0.314909279 0.0526699759 1 2 0 +56 1 1 0.58631420347758545 0.5563742 0.3577644 0.08586135 1 2 0 +60 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +63 1 1 0.44289040639584898 0.6421776 0.304339767 0.0534825623 1 2 0 +64 1 1 0.14288689960850434 0.8668521 0.06818327 0.06496457 1 2 0 +66 1 1 0.13881485298770596 0.870389163 0.0686788 0.06093195 1 2 0 +68 1 1 0.14755370985187494 0.8628161 0.0811026245 0.05608121 1 2 0 +69 1 1 0.13689588713632034 0.872061 0.07104297 0.0568959638 1 2 0 +70 1 1 0.58631420347758545 0.5563742 0.3577644 0.08586135 1 2 0 +71 1 1 0.15245584814875132 0.8585968 0.0776398554 0.06376329 1 2 0 +72 1 2 1.4638898875186992 0.7123695 0.231334656 0.0562958159 2 1 0 +73 1 1 0.45820050646179217 0.632420659 0.314909279 0.0526699759 1 2 0 +74 1 1 0.13842130479032938 0.8707318 0.06871103 0.0605571568 1 2 0 +76 1 1 0.45820050646179217 0.632420659 0.314909279 0.0526699759 1 2 0 +77 1 2 2.0734226944941909 0.8150109 0.125754625 0.0592344031 2 1 0 +79 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +82 1 1 0.13641489303888726 0.8724806 0.07080999 0.05670938 1 2 0 +88 1 1 0.13407568003915085 0.8745239 0.06425465 0.0612214021 1 2 0 +90 1 1 0.14206328925313413 0.867566347 0.07583086 0.05660272 1 2 0 +91 1 1 0.44289040639584898 0.6421776 0.304339767 0.0534825623 1 2 0 +92 1 1 0.13641489303888726 0.8724806 0.07080999 0.05670938 1 2 0 +93 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +95 1 1 0.13407568003915085 0.8745239 0.06425465 0.0612214021 1 2 0 +96 1 1 0.13407568003915085 0.8745239 0.06425465 0.0612214021 1 2 0 +97 1 1 0.13842130479032938 0.8707318 0.06871103 0.0605571568 1 2 0 +98 1 1 0.54904273290512584 0.57750237 0.363433957 0.0590635948 1 0 2 +99 1 1 0.1387910905526154 0.870409846 0.0686567053 0.0609333962 1 2 0 +100 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +102 2 2 0.1228227021544628 0.884420455 0.059199594 0.05637987 2 1 0 +104 2 2 0.1228227021544628 0.884420455 0.059199594 0.05637987 2 1 0 +105 2 2 0.1228227021544628 0.884420455 0.059199594 0.05637987 2 1 0 +106 2 1 2.3492273652284066 0.8481431 0.0954428762 0.0564139374 1 2 0 +108 2 2 0.22657594234978759 0.7972588 0.147976846 0.0547643 2 1 0 +109 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +111 2 2 0.177848875720656 0.8370689 0.108788557 0.05414249 2 1 0 +112 2 2 0.13281462271870764 0.8756274 0.0683108345 0.0560617223 2 1 0 +113 2 2 0.19621674447868781 0.8218341 0.122739315 0.0554265529 2 1 0 +115 2 2 0.17200944752597333 0.8419712 0.0923435241 0.0656852 2 0 1 +117 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +120 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +121 2 2 0.16411849615386448 0.848641455 0.0941239446 0.05723451 2 1 0 +122 2 2 0.13716679158045109 0.8718248 0.07206305 0.05611211 2 1 0 +123 2 2 0.28256663605278198 0.7538464 0.189866975 0.05628654 2 1 0 +125 2 2 0.20564890133993838 0.814118862 0.09413581 0.09174525 2 0 1 +128 2 2 0.13716679158045109 0.8718248 0.07206305 0.05611211 2 1 0 +129 2 2 0.16567795334648433 0.847319067 0.09548667 0.0571941957 2 1 0 +131 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +132 2 2 0.13716679158045109 0.8718248 0.07206305 0.05611211 2 1 0 +133 2 2 0.29112966022097542 0.747418761 0.191831559 0.0607496351 2 1 0 +137 2 2 0.22116862531406531 0.8015815 0.104995094 0.09342332 2 1 0 +138 2 1 0.99148785197679079 0.576995134 0.371024251 0.05198054 1 2 0 +141 2 2 0.18520126566083658 0.830937 0.0945404246 0.0745224655 2 0 1 +144 2 2 0.16223557410388861 0.8502409 0.09284732 0.0569117479 2 0 1 +145 2 2 0.14505497806361808 0.864974737 0.07757513 0.0574500933 2 1 0 +147 2 2 0.14505497806361808 0.864974737 0.07757513 0.0574500933 2 1 0 +0 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +1 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +2 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +3 0 0 0.13111987178887785 0.8771126 0.06430127 0.0585860461 0 1 2 +4 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +7 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +12 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +13 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +14 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +15 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +16 0 0 0.12377570311405263 0.883578 0.0616899729 0.05473199 0 1 2 +17 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +19 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +22 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +23 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +24 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +26 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +27 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +29 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +30 0 0 0.13466438623099261 0.8740092 0.06761201 0.0583787523 0 1 2 +33 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +34 0 0 0.13111987178887785 0.8771126 0.06430127 0.0585860461 0 1 2 +36 0 0 0.18823445128170324 0.82842046 0.120264135 0.0513153374 0 1 2 +38 0 0 0.13227381045206946 0.8761011 0.0642271042 0.059671782 0 1 2 +39 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +42 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +43 0 0 0.13145134579195075 0.876821935 0.0646113753 0.05856663 0 1 2 +47 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +49 0 0 0.12805244799353907 0.879807234 0.0614267029 0.05876603 0 1 2 +53 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +55 1 1 0.13788484165848175 0.871199 0.0693822056 0.0594187342 1 2 0 +57 1 1 0.14180966894555355 0.8677864 0.06764004 0.06457351 1 2 0 +58 1 1 0.1459902363533046 0.864166141 0.07662086 0.059212923 1 2 0 +59 1 1 0.1580238898720478 0.8538294 0.08263559 0.0635349452 1 2 0 +61 1 1 0.24588109562120131 0.7820152 0.155458942 0.06252578 1 2 0 +62 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +65 1 1 0.13132980842568853 0.8769285 0.063261956 0.0598095059 1 2 0 +67 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +75 1 1 0.16325820211530925 0.84937185 0.09269803 0.05793005 1 2 0 +78 1 1 0.25856072585963152 0.772162139 0.166928485 0.0609093234 1 2 0 +80 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +81 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +83 1 2 0.93589303759413867 0.559196055 0.392235428 0.04856844 2 1 0 +84 1 1 0.30739863434463804 0.7353574 0.193893969 0.07074856 1 2 0 +85 1 1 0.36387328935790564 0.69497925 0.250199646 0.05482102 1 2 0 +86 1 1 0.2248240850683334 0.7986567 0.1374587 0.06388454 1 2 0 +87 1 1 0.15039000144304782 0.860372365 0.0804473162 0.0591802672 1 2 0 +89 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +94 1 1 0.13238620890661379 0.8760026 0.0634366348 0.06056068 1 2 0 +101 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +103 2 2 0.13913525587344278 0.870110333 0.06958966 0.06029994 2 1 0 +107 2 2 0.14333565848826485 0.8664632 0.07176019 0.0617765337 2 1 0 +110 2 2 0.23871440437506003 0.7876398 0.156446442 0.0559136942 2 1 0 +114 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +116 2 2 0.13913525587344278 0.870110333 0.06958966 0.06029994 2 1 0 +118 2 2 0.12489134297836053 0.8825928 0.0607594363 0.0566477254 2 0 1 +119 2 1 0.82777753715835345 0.5009504 0.437019467 0.06203004 1 2 0 +124 2 2 0.1531750305285868 0.857979536 0.0805763453 0.06144403 2 1 0 +126 2 2 0.41542573035225555 0.6600592 0.280402571 0.0595381558 2 1 0 +127 2 2 0.39337764883077281 0.6747739 0.268265069 0.0569609851 2 1 0 +130 2 2 0.12489134297836053 0.8825928 0.0607594363 0.0566477254 2 0 1 +134 2 1 0.85550151661202845 0.5024455 0.425069958 0.07248443 1 2 0 +135 2 2 0.12489134297836053 0.8825928 0.0607594363 0.0566477254 2 0 1 +136 2 2 0.14853238287711923 0.8619721 0.0780924 0.05993546 2 1 0 +139 2 2 0.16469402987504086 0.8481532 0.09065638 0.06119041 2 1 0 +140 2 2 0.15401813781546583 0.8572565 0.08267424 0.0600692444 2 1 0 +142 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +143 2 2 0.1531750305285868 0.857979536 0.0805763453 0.06144403 2 1 0 +146 2 2 0.19033002342813979 0.826686263 0.116503209 0.0568104759 2 1 0 +148 2 2 0.15751169565724296 0.8542668 0.08508964 0.06064347 2 1 0 +149 2 2 0.22273123179238696 0.8003299 0.142754182 0.0569158569 2 1 0 diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key-out.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key-out.txt new file mode 100644 index 0000000000..64a3bc287d --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key-out.txt @@ -0,0 +1,43 @@ +maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% out=%Output% seed=1 xf=Term{col=Label} +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================== +PREDICTED || 0 | 1 | 2 | Recall +TRUTH ||======================== + 0 || 50 | 0 | 0 | 1.0000 + 1 || 0 | 47 | 3 | 0.9400 + 2 || 0 | 1 | 49 | 0.9800 + ||======================== +Precision ||1.0000 |0.9792 |0.9423 | +Accuracy(micro-avg): 0.973333 +Accuracy(macro-avg): 0.973333 +Log-loss: 0.196674 +Log-loss reduction: 82.097919 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.973333 (0.0000) +Accuracy(macro-avg): 0.973333 (0.0000) +Log-loss: 0.196674 (0.0000) +Log-loss reduction: 82.097919 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Building term dictionary' started. +[1] (%Time%) 150 examples Total Terms: 3 +[1] 'Building term dictionary' finished in %Time%. +[2] 'Loading data for LightGBM' started. +[2] 'Loading data for LightGBM' finished in %Time%. +[3] 'Training with LightGBM' started. +[3] 'Training with LightGBM' finished in %Time%. +[4] 'Saving model' started. +[4] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key-rp.txt new file mode 100644 index 0000000000..23dc3f1a86 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.973333 0.973333 0.196674 82.09792 10 0.2 20 10 1 LightGBMMC %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:TX:0 col=Features:1-*} data=%Data% out=%Output% seed=1 xf=Term{col=Label} /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key.txt new file mode 100644 index 0000000000..4fc92f1b19 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.key.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +0 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +1 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +2 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +3 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +4 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +5 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +6 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +7 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +8 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +9 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +10 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +11 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +12 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +13 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +14 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +15 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +16 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +17 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +18 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +19 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +20 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +21 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +22 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +23 0 0 0.33277494936956031 0.7169315 0.227236316 0.0558321662 0 1 2 +24 0 0 0.32796044820794762 0.7203915 0.224743724 0.054864794 0 1 2 +25 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +26 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +27 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +28 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +29 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +30 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +31 0 0 0.12456001063410244 0.8828853 0.0595866032 0.057528127 0 2 1 +32 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +33 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +34 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +35 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +36 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +37 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +38 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +39 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +40 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +41 0 0 0.13811810171792147 0.8709958 0.0645556152 0.06444856 0 1 2 +42 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +43 0 0 0.33277494936956031 0.7169315 0.227236316 0.0558321662 0 1 2 +44 0 0 0.33634513183392067 0.7143765 0.229578465 0.05604506 0 1 2 +45 0 0 0.13247487107987427 0.875924945 0.06492095 0.05915408 0 1 2 +46 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +47 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +48 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +49 0 0 0.12333860159928871 0.8839643 0.05903762 0.05699811 0 2 1 +50 1 1 0.23100889631685528 0.7937324 0.149178371 0.0570892133 1 2 0 +51 1 1 0.15607289835381286 0.8554968 0.0860009938 0.0585021749 1 2 0 +52 1 1 0.50877014563522738 0.601234555 0.345829129 0.052936323 1 2 0 +53 1 1 0.13306515458964616 0.875408053 0.06540278 0.0591891445 1 2 0 +54 1 1 0.15325749593441318 0.8579088 0.08456552 0.05752569 1 2 0 +55 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +56 1 1 0.33773914875897953 0.71338135 0.194789842 0.0918288156 1 2 0 +57 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +58 1 1 0.12416960207104245 0.883230031 0.05863201 0.05813798 1 2 0 +59 1 1 0.1273381037166878 0.880435944 0.0600349456 0.0595290959 1 2 0 +60 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +61 1 1 0.1609832630763833 0.8513063 0.0884949937 0.0601987168 1 2 0 +62 1 1 0.13286234147782883 0.8755856 0.0653095841 0.0591047965 1 2 0 +63 1 1 0.23582975138698256 0.789915144 0.151939109 0.05814572 1 2 0 +64 1 1 0.13095815072854303 0.8772545 0.0616324246 0.06111311 1 2 0 +65 1 1 0.12594102775547797 0.881666839 0.0594169162 0.05891627 1 2 0 +66 1 1 0.1609832630763833 0.8513063 0.0884949937 0.0601987168 1 2 0 +67 1 1 0.12566071119127656 0.881914 0.0592928044 0.058793202 1 2 0 +68 1 1 0.16292738185521705 0.8496529 0.09265414 0.0576929823 1 2 0 +69 1 1 0.13131716612503977 0.8769396 0.06459884 0.05846158 1 2 0 +70 1 2 0.95035919356690834 0.554423034 0.386602134 0.0589748733 2 1 0 +71 1 1 0.12529959921655817 0.882232547 0.0591328628 0.05863461 1 2 0 +72 1 1 0.50877014563522738 0.601234555 0.345829129 0.052936323 1 2 0 +73 1 1 0.23582975138698256 0.789915144 0.151939109 0.05814572 1 2 0 +74 1 1 0.12416960207104245 0.883230031 0.05863201 0.05813798 1 2 0 +75 1 1 0.12594102775547797 0.881666839 0.0594169162 0.05891627 1 2 0 +76 1 1 0.26095097058717287 0.7703187 0.174276143 0.0554051772 1 2 0 +77 1 2 1.6029370592055334 0.738739431 0.2013044 0.0599561781 2 1 0 +78 1 1 0.15976734311668664 0.852342069 0.08787854 0.0597793758 1 2 0 +79 1 1 0.12955227996567303 0.87848866 0.0610127263 0.0604986325 1 2 0 +80 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +81 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +82 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +83 1 2 0.80815870423273684 0.493023425 0.445677936 0.06129863 2 1 0 +84 1 1 0.16454027823998496 0.8482836 0.09029396 0.0614224635 1 2 0 +85 1 1 0.2070731159429981 0.8129602 0.100639634 0.08640016 1 0 2 +86 1 1 0.2987897056212489 0.7417154 0.20252648 0.0557581745 1 2 0 +87 1 1 0.12976317713440702 0.8783034 0.06388293 0.0578136854 1 2 0 +88 1 1 0.12903506453208818 0.878943145 0.06078452 0.06027235 1 2 0 +89 1 1 0.13306515458964616 0.875408053 0.06540278 0.0591891445 1 2 0 +90 1 1 0.1273381037166878 0.880435944 0.0600349456 0.0595290959 1 2 0 +91 1 1 0.12737263080959327 0.880405545 0.0600502156 0.0595442355 1 2 0 +92 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +93 1 1 0.13547311823330146 0.873302639 0.066508 0.06018936 1 2 0 +94 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +95 1 1 0.12903506453208818 0.878943145 0.06078452 0.06027235 1 2 0 +96 1 1 0.12661229526028364 0.8810752 0.05971398 0.05921083 1 2 0 +97 1 1 0.12529959921655817 0.882232547 0.0591328628 0.05863461 1 2 0 +98 1 1 0.44858136712049312 0.638533354 0.30528307 0.0561835542 1 0 2 +99 1 1 0.12725977902560126 0.8805049 0.06000033 0.0594947673 1 2 0 +100 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +101 2 2 0.16184034002313213 0.850577 0.0913400352 0.0580829456 2 1 0 +102 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +103 2 2 0.12568524504717099 0.8818924 0.0596662238 0.05844138 2 1 0 +104 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +105 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +106 2 2 0.44758539287303228 0.639169633 0.301120639 0.0597097427 2 1 0 +107 2 2 0.12568524504717099 0.8818924 0.0596662238 0.05844138 2 1 0 +108 2 2 0.12568524504717099 0.8818924 0.0596662238 0.05844138 2 1 0 +109 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +110 2 2 0.19147015233338821 0.8257443 0.114775449 0.0594803 2 1 0 +111 2 2 0.12895206364866429 0.8790161 0.06284211 0.05814181 2 1 0 +112 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +113 2 2 0.23003014798568333 0.794509649 0.147670493 0.0578198843 2 1 0 +114 2 2 0.16184034002313213 0.850577 0.0913400352 0.0580829456 2 1 0 +115 2 2 0.14622594690253263 0.8639625 0.0778152943 0.0582222156 2 1 0 +116 2 2 0.13019277678014771 0.8779262 0.06272268 0.0593511574 2 1 0 +117 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +118 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +119 2 1 0.85092928263060119 0.5151953 0.427017927 0.05778675 1 2 0 +120 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +121 2 2 0.27313894704628855 0.760987043 0.18166633 0.0573466346 2 1 0 +122 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +123 2 2 0.29377982293137428 0.7454406 0.197279379 0.0572799928 2 1 0 +124 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +125 2 2 0.13019277678014771 0.8779262 0.06272268 0.0593511574 2 1 0 +126 2 2 0.43516329539237014 0.647159 0.2948179 0.0580231175 2 1 0 +127 2 2 0.36323660387324913 0.6954219 0.244927272 0.0596508458 2 1 0 +128 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +129 2 2 0.47537462515590923 0.6216521 0.316322356 0.0620255135 2 1 0 +130 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +131 2 2 0.16468208306001242 0.8481633 0.09738051 0.0544561855 2 0 1 +132 2 2 0.11933918199486065 0.8875067 0.0584422871 0.054051 2 0 1 +133 2 2 0.7071985901643314 0.493023425 0.445677936 0.06129863 2 1 0 +134 2 2 0.47537462515590923 0.6216521 0.316322356 0.0620255135 2 1 0 +135 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +136 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +137 2 2 0.13019277678014771 0.8779262 0.06272268 0.0593511574 2 1 0 +138 2 2 0.55105996253236122 0.5763386 0.362355322 0.06130607 2 1 0 +139 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +140 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +141 2 2 0.18701313089818 0.829432845 0.112345912 0.0582212359 2 1 0 +142 2 2 0.16184034002313213 0.850577 0.0913400352 0.0580829456 2 1 0 +143 2 2 0.12174369977157315 0.885375261 0.0585552119 0.0560695 2 0 1 +144 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +145 2 2 0.14622594690253263 0.8639625 0.0778152943 0.0582222156 2 1 0 +146 2 2 0.23003014798568333 0.794509649 0.147670493 0.0578198843 2 1 0 +147 2 2 0.14864613971263602 0.861874044 0.07900992 0.0591160469 2 1 0 +148 2 2 0.16260754098734898 0.8499247 0.09625085 0.0538244657 2 0 1 +149 2 2 0.20528992585094685 0.814411163 0.1260209 0.05956797 2 1 0 diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-out.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-out.txt new file mode 100644 index 0000000000..0263d06d71 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-out.txt @@ -0,0 +1,42 @@ +maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +Auto-tuning parameters: UseSoftmax = False +LightGBM objective=multiclassova +Not training a calibrator because it is not needed. + +Confusion table + ||======================================== +PREDICTED || 0 | 1 | 2 | 3 | 4 | Recall +TRUTH ||======================================== + 0 || 50 | 0 | 0 | 0 | 0 | 1.0000 + 1 || 0 | 47 | 3 | 0 | 0 | 0.9400 + 2 || 0 | 1 | 49 | 0 | 0 | 0.9800 + 3 || 0 | 0 | 0 | 0 | 0 | 0.0000 + 4 || 0 | 0 | 0 | 0 | 0 | 0.0000 + ||======================================== +Precision ||1.0000 |0.9792 |0.9423 |0.0000 |0.0000 | +Accuracy(micro-avg): 0.973333 +Accuracy(macro-avg): 0.973333 +Log-loss: 0.196675 +Log-loss reduction: 82.097914 + +OVERALL RESULTS +--------------------------------------- +Accuracy(micro-avg): 0.973333 (0.0000) +Accuracy(macro-avg): 0.973333 (0.0000) +Log-loss: 0.196675 (0.0000) +Log-loss reduction: 82.097914 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-rp.txt new file mode 100644 index 0000000000..0842df2191 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404-rp.txt @@ -0,0 +1,4 @@ +LightGBMMC +Accuracy(micro-avg) Accuracy(macro-avg) Log-loss Log-loss reduction /iter /lr /nl /mil /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.973333 0.973333 0.196675 82.09792 10 0.2 20 10 1 LightGBMMC %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMMC{nt=1 iter=10 v=- lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:U4[0-4]:0 col=Features:1-4} data=%Data% out=%Output% seed=1 /iter:10;/lr:0.2;/nl:20;/mil:10;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404.txt b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404.txt new file mode 100644 index 0000000000..41d4c75d8b --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMMC/LightGBMMC-TrainTest-iris.keyU404.txt @@ -0,0 +1,151 @@ +Instance Label Assigned Log-loss #1 Score #2 Score #3 Score #1 Class #2 Class #3 Class +0 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +1 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +2 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +3 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +4 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +5 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +6 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +7 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +8 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +9 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +10 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +11 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +12 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +13 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +14 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +15 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +16 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +17 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +18 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +19 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +20 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +21 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +22 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +23 0 0 0.33277503250811041 0.716931462 0.2272363 0.0558321625 0 1 2 +24 0 0 0.32796053094718908 0.720391452 0.224743709 0.05486479 0 1 2 +25 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +26 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +27 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +28 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +29 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +30 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +31 0 0 0.12456007814530498 0.8828852 0.0595866 0.0575281233 0 2 1 +32 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +33 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +34 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +35 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +36 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +37 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +38 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +39 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +40 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +41 0 0 0.13811817015068023 0.87099576 0.06455561 0.06444855 0 1 2 +42 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +43 0 0 0.33277503250811041 0.716931462 0.2272363 0.0558321625 0 1 2 +44 0 0 0.33634521526982103 0.71437645 0.22957845 0.0560450554 0 1 2 +45 0 0 0.13247487107987427 0.875924945 0.06492095 0.0591540746 0 1 2 +46 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +47 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +48 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +49 0 0 0.1233386690280828 0.883964241 0.0590376146 0.0569981076 0 2 1 +50 1 1 0.23100897141098861 0.793732345 0.149178356 0.05708921 1 2 0 +51 1 1 0.15607296802636475 0.855496764 0.0860009938 0.05850217 1 2 0 +52 1 1 0.50877024477232313 0.6012345 0.3458291 0.052936323 1 2 0 +53 1 1 0.13306522267748996 0.875408 0.06540278 0.05918914 1 2 0 +54 1 1 0.15325756541108468 0.8579087 0.08456551 0.0575256869 1 2 0 +55 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +56 1 1 0.33773923231127212 0.7133813 0.194789827 0.09182881 1 2 0 +57 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +58 1 1 0.12416966955589319 0.88323 0.058632005 0.0581379756 1 2 0 +59 1 1 0.12733817141570353 0.8804359 0.0600349456 0.0595290922 1 2 0 +60 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +61 1 1 0.16098333309189417 0.85130626 0.08849499 0.0601987131 1 2 0 +62 1 1 0.1328624095518649 0.875585556 0.06530958 0.0591047928 1 2 0 +63 1 1 0.23582975138698256 0.789915144 0.151939109 0.0581457168 1 2 0 +64 1 1 0.13095821867307653 0.8772544 0.06163242 0.0611131079 1 2 0 +65 1 1 0.12594109535997908 0.8816668 0.0594169125 0.058916267 1 2 0 +66 1 1 0.16098333309189417 0.85130626 0.08849499 0.0601987131 1 2 0 +67 1 1 0.12566077877682966 0.88191396 0.0592928 0.0587932 1 2 0 +68 1 1 0.16292745200697881 0.8496528 0.09265413 0.05769298 1 2 0 +69 1 1 0.13131723409397075 0.876939535 0.06459884 0.0584615767 1 2 0 +70 1 2 0.95035927065474868 0.554423 0.3866021 0.05897487 2 1 0 +71 1 1 0.12529966677770971 0.8822325 0.05913286 0.0586346053 1 2 0 +72 1 1 0.50877024477232313 0.6012345 0.3458291 0.052936323 1 2 0 +73 1 1 0.23582975138698256 0.789915144 0.151939109 0.0581457168 1 2 0 +74 1 1 0.12416966955589319 0.88323 0.058632005 0.0581379756 1 2 0 +75 1 1 0.12594109535997908 0.8816668 0.0594169125 0.058916267 1 2 0 +76 1 1 0.26095104796378088 0.7703186 0.174276143 0.0554051735 1 2 0 +77 1 2 1.6029370592055334 0.7387394 0.2013044 0.0599561743 2 1 0 +78 1 1 0.159767413047116 0.852342 0.08787853 0.0597793721 1 2 0 +79 1 1 0.12955234781475239 0.8784886 0.0610127226 0.06049863 1 2 0 +80 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +81 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +82 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +83 1 2 0.80815877110237733 0.4930234 0.4456779 0.0612986274 2 1 0 +84 1 1 0.16454034850498556 0.8482835 0.09029395 0.06142246 1 2 0 +85 1 1 0.2070731892610356 0.812960148 0.100639626 0.08640015 1 0 2 +86 1 1 0.29878978598178807 0.7417153 0.202526465 0.05575817 1 2 0 +87 1 1 0.12976324499779707 0.878303349 0.06388293 0.05781368 1 2 0 +88 1 1 0.12903513234608402 0.8789431 0.060784515 0.0602723472 1 2 0 +89 1 1 0.13306522267748996 0.875408 0.06540278 0.05918914 1 2 0 +90 1 1 0.12733817141570353 0.8804359 0.0600349456 0.0595290922 1 2 0 +91 1 1 0.12737269851094649 0.8804055 0.06005021 0.05954423 1 2 0 +92 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +93 1 1 0.13547318648529588 0.8733026 0.0665079951 0.0601893552 1 2 0 +94 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +95 1 1 0.12903513234608402 0.8789431 0.060784515 0.0602723472 1 2 0 +96 1 1 0.12661236291018069 0.881075144 0.0597139746 0.0592108257 1 2 0 +97 1 1 0.12529966677770971 0.8822325 0.05913286 0.0586346053 1 2 0 +98 1 1 0.44858136712049312 0.638533354 0.30528307 0.05618355 1 0 2 +99 1 1 0.1272598467193147 0.880504847 0.0600003265 0.0594947636 1 2 0 +100 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +101 2 2 0.16184034002313213 0.850577 0.09134003 0.0580829419 2 1 0 +102 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +103 2 2 0.12568531263438223 0.8818923 0.05966622 0.0584413745 2 1 0 +104 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +105 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +106 2 2 0.44758548612628529 0.6391696 0.3011206 0.05970974 2 1 0 +107 2 2 0.12568531263438223 0.8818923 0.05966622 0.0584413745 2 1 0 +108 2 2 0.12568531263438223 0.8818923 0.05966622 0.0584413745 2 1 0 +109 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +110 2 2 0.19147022451632548 0.8257442 0.114775442 0.0594802946 2 1 0 +111 2 2 0.12895213145703174 0.879016042 0.06284211 0.0581418052 2 1 0 +112 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +113 2 2 0.23003022300635434 0.7945096 0.147670478 0.05781988 2 1 0 +114 2 2 0.16184034002313213 0.850577 0.09134003 0.0580829419 2 1 0 +115 2 2 0.14622601589238901 0.8639624 0.0778152943 0.0582222119 2 1 0 +116 2 2 0.13019284467269809 0.8779261 0.06272268 0.0593511537 2 1 0 +117 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +118 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +119 2 1 0.85092928263060119 0.515195251 0.427017927 0.05778675 1 2 0 +120 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +121 2 2 0.27313902537173135 0.760987 0.181666315 0.05734663 2 1 0 +122 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +123 2 2 0.29377982293137428 0.7454406 0.197279364 0.05727999 2 1 0 +124 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +125 2 2 0.13019284467269809 0.8779261 0.06272268 0.0593511537 2 1 0 +126 2 2 0.43516338749438732 0.6471589 0.294817865 0.0580231138 2 1 0 +127 2 2 0.36323668958330446 0.6954218 0.244927257 0.0596508421 2 1 0 +128 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +129 2 2 0.47537472103694156 0.621652067 0.316322356 0.06202551 2 1 0 +130 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +131 2 2 0.16468215333497763 0.848163247 0.09738051 0.05445618 2 0 1 +132 2 2 0.11933924915451727 0.887506664 0.0584422834 0.0540509969 2 0 1 +133 2 2 0.70719865061241916 0.4930234 0.4456779 0.0612986274 2 1 0 +134 2 2 0.47537472103694156 0.621652067 0.316322356 0.06202551 2 1 0 +135 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +136 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +137 2 2 0.13019284467269809 0.8779261 0.06272268 0.0593511537 2 1 0 +138 2 2 0.55105996253236122 0.5763386 0.362355322 0.0613060668 2 1 0 +139 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +140 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +141 2 2 0.18701320276011227 0.8294328 0.112345912 0.0582212321 2 1 0 +142 2 2 0.16184034002313213 0.850577 0.09134003 0.0580829419 2 1 0 +143 2 2 0.12174369977157315 0.885375261 0.05855521 0.056069497 2 0 1 +144 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +145 2 2 0.14622601589238901 0.8639624 0.0778152943 0.0582222119 2 1 0 +146 2 2 0.23003022300635434 0.7945096 0.147670478 0.05781988 2 1 0 +147 2 2 0.14864620886966337 0.861874 0.07900992 0.0591160432 2 1 0 +148 2 2 0.16260761111667693 0.8499246 0.09625085 0.053824462 2 0 1 +149 2 2 0.20528999903836082 0.8144111 0.126020879 0.0595679656 2 1 0 diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine-out.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine-out.txt new file mode 100644 index 0000000000..9631870541 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.524348 +L2(avg): 0.466735 +RMS(avg): 0.683180 +Loss-fn(avg): 0.466735 +R Squared: 0.400415 +L1(avg): 0.517508 +L2(avg): 0.458039 +RMS(avg): 0.676786 +Loss-fn(avg): 0.458039 +R Squared: 0.420159 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.520928 (0.0034) +L2(avg): 0.462387 (0.0043) +RMS(avg): 0.679983 (0.0032) +Loss-fn(avg): 0.462387 (0.0043) +R Squared: 0.410287 (0.0099) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l2: 0.189697165394939 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] (%Time%) Iteration: 50 Training-l2: 0.204982247876212 +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine-rp.txt new file mode 100644 index 0000000000..ede416ff06 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.520928 0.462387 0.679983 0.462387 0.410287 50 0.2 20 10 gbdt{l2=0.2 l1=0.2} + 1 LightGBMR %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/booster:gbdt{l2=0.2 l1=0.2};/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine.txt new file mode 100644 index 0000000000..7bc6a0ec0b --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-CV-wine.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +5 6 5.80828 0.19172000885009766 0.036756561793481524 +6 6 5.206482 0.79351806640625 0.62967092171311378 +8 6 5.50727 0.49273014068603516 0.24278299154048 +9 6 5.99071741 0.0092825889587402344 8.6166457776926109E-05 +10 5 5.78352642 0.78352642059326172 0.61391365176768886 +11 5 5.3672 0.36719989776611328 0.13483576491944405 +18 6 5.8091054 0.19089460372924805 0.036440749732946642 +20 8 7.235471 0.76452922821044922 0.58450494078806514 +21 7 5.94430733 1.0556926727294922 1.1144870192547387 +25 6 5.54960966 0.45039033889770508 0.20285145737238963 +28 6 5.599702 0.40029811859130859 0.16023858374774136 +31 6 5.42717361 0.57282638549804688 0.32813006792275701 +32 6 5.800291 0.19970893859863281 0.039883660156192491 +35 5 5.98115873 0.98115873336791992 0.96267246006414098 +37 6 6.093817 0.093817234039306641 0.0088016734027860366 +40 6 5.89986944 0.10013055801391602 0.010026128648178201 +41 6 5.72777 0.27223014831542969 0.074109253651840845 +44 6 5.540586 0.45941400527954102 0.21106122824699014 +45 7 6.048586 0.95141410827636719 0.90518880542731495 +46 4 5.36457253 1.3645725250244141 1.8620581760515051 +48 6 5.482948 0.51705217361450195 0.26734295023948107 +50 6 6.23349476 0.23349475860595703 0.054519802296454145 +51 7 6.19232273 0.80767726898193359 0.65234257083011471 +52 7 6.08130836 0.91869163513183594 0.84399432046120637 +54 6 5.846752 0.15324783325195313 0.02348489839641843 +56 6 6.18618 0.18618011474609375 0.034663035126868635 +60 6 5.48933744 0.51066255569458008 0.2607762457885201 +63 6 5.37699461 0.62300539016723633 0.38813571617743037 +64 6 5.797454 0.20254611968994141 0.04102493060145207 +66 7 6.667073 0.33292722702026367 0.11084053849140219 +68 8 6.305265 1.694735050201416 2.8721268903811961 +69 5 5.570308 0.57030820846557617 0.32525145264321509 +70 6 5.35073948 0.64926052093505859 0.42153922404486366 +71 5 5.31465769 0.31465768814086914 0.09900946070615646 +72 5 4.61791229 0.38208770751953125 0.14599101623753086 +73 6 4.62672138 1.3732786178588867 1.8858941622684142 +74 8 6.305265 1.694735050201416 2.8721268903811961 +76 7 6.493501 0.50649881362915039 0.25654104820773682 +77 7 6.62248468 0.37751531600952148 0.14251781382176887 +79 5 5.094501 0.094501018524169922 0.0089304425021055067 +82 5 5.252633 0.25263309478759766 0.063823480581959302 +88 5 5.29069 0.29068994522094727 0.084500644252557322 +90 6 5.246408 0.75359201431274414 0.56790092403593917 +91 5 5.46798 0.46797990798950195 0.21900519428186271 +92 7 6.8612504 0.13874959945678711 0.019251451349418858 +93 7 6.8399725 0.16002750396728516 0.025608802025999466 +95 6 5.419488 0.58051204681396484 0.33699423649613891 +96 6 5.07628727 0.92371273040771484 0.85324520831727568 +97 7 5.607884 1.3921160697937012 1.9379871517778611 +98 4 4.55244064 0.55244064331054688 0.30519066438137088 +99 6 5.07628727 0.92371273040771484 0.85324520831727568 +100 5 5.95780659 0.95780658721923828 0.91739345852056431 +102 5 5.56467628 0.56467628479003906 0.3188593066042813 +104 5 5.95780659 0.95780658721923828 0.91739345852056431 +105 6 5.93800545 0.061994552612304688 0.003843324553599814 +106 5 5.6098 0.60979986190795898 0.37185587158296585 +108 6 5.85579967 0.14420032501220703 0.020793733733626141 +109 5 5.38346529 0.38346529006958008 0.14704562868814719 +111 5 5.33469868 0.33469867706298828 0.11202320442771452 +112 5 5.152083 0.15208292007446289 0.023129214578375468 +113 5 5.386198 0.38619804382324219 0.14914892905289889 +115 4 4.711909 0.71190881729125977 0.50681416413704028 +117 6 6.29482937 0.29482936859130859 0.086924356583949702 +120 5 5.1826005 0.18260049819946289 0.03334294194269205 +121 5 5.79177856 0.791778564453125 0.62691329512745142 +122 5 5.8222127 0.82221269607543945 0.67603371758764297 +123 6 5.60548544 0.39451456069946289 0.15564173860389019 +125 6 6.067872 0.067872047424316406 0.0046066148215686553 +128 7 5.829576 1.1704239845275879 1.3698923035574353 +129 6 5.54122353 0.45877647399902344 0.21047585309497663 +131 7 6.016204 0.98379611968994141 0.96785480511698552 +132 5 5.54468775 0.54468774795532227 0.29668474277264067 +133 5 5.73237562 0.7323756217956543 0.53637405140057126 +137 5 5.354897 0.35489702224731445 0.12595189640001081 +138 7 6.41750956 0.58249044418334961 0.33929511756491593 +141 5 5.354897 0.35489702224731445 0.12595189640001081 +144 6 5.879665 0.12033510208129883 0.01448053679291661 +145 6 5.90592957 0.0940704345703125 0.0088492466602474451 +147 4 4.823642 0.82364177703857422 0.67838577688326041 +150 7 6.3178277 0.68217229843139648 0.46535904474717427 +151 6 5.796888 0.20311212539672852 0.041254535483176369 +152 6 5.55071 0.44928979873657227 0.20186132324874961 +154 6 4.951878 1.0481219291687012 1.0985595784043198 +156 6 5.969942 0.030057907104492188 0.00090347777950228192 +161 5 5.775102 0.77510213851928711 0.60078332513717214 +164 5 5.67818975 0.67818975448608398 0.45994134308989487 +167 7 6.794436 0.20556402206420898 0.042256567167214598 +169 5 4.723493 0.27650690078735352 0.07645606618302736 +171 6 6.231303 0.23130321502685547 0.053501177281759738 +173 7 6.71465445 0.28534555435180664 0.081422085388339838 +174 5 5.489743 0.48974323272705078 0.23984843400194222 +176 4 6.449584 2.4495840072631836 6.0004618086395567 +177 5 5.73423433 0.73423433303833008 0.53910005581224141 +179 6 5.376075 0.62392520904541016 0.38928266648235876 +180 6 5.22496128 0.77503871917724609 0.60068501622390613 +181 5 5.33182955 0.33182954788208008 0.11011084884762568 +183 6 5.68878937 0.31121063232421875 0.096852057671640068 +187 5 5.94741631 0.94741630554199219 0.8975976560068375 +188 8 6.721152 1.2788481712341309 1.6354526450688809 +189 4 5.49590731 1.4959073066711426 2.2377386701521118 +191 5 5.38427973 0.38427972793579102 0.14767090930240556 +192 6 6.1925 0.19250011444091797 0.037056294059766515 +196 5 5.462054 0.46205377578735352 0.21349369171934995 +198 5 5.19289637 0.19289636611938477 0.037209008062063731 +199 5 5.216614 0.21661376953125 0.046921525150537491 +201 5 5.19289637 0.19289636611938477 0.037209008062063731 +202 5 5.158807 0.15880680084228516 0.025219599993761221 +204 4 5.766838 1.7668380737304688 3.1217167787835933 +205 5 5.790984 0.79098415374755859 0.62565593147974141 +206 5 5.788785 0.78878498077392578 0.62218174589452246 +207 4 5.0619545 1.0619544982910156 1.1277473564405227 +209 6 5.43237972 0.56762027740478516 0.32219277932108525 +210 5 5.047247 0.047246932983398438 0.0022322726763377432 +211 7 6.75930071 0.24069929122924805 0.057936148798262366 +212 5 5.788785 0.78878498077392578 0.62218174589452246 +216 5 6.03553057 1.0355305671691895 1.0723235555417432 +218 5 5.365101 0.36510086059570313 0.13329863840772305 +219 5 6.1874404 1.1874403953552246 1.4100146925213721 +223 6 5.63581467 0.36418533325195313 0.13263095695583615 +226 6 5.96993542 0.030064582824707031 0.00090387914042366901 +228 6 5.96993542 0.030064582824707031 0.00090387914042366901 +233 6 6.032256 0.032256126403808594 0.0010404576905784779 +237 6 5.58524275 0.41475725173950195 0.1720235778705046 +239 6 5.646391 0.35360908508300781 0.12503938505324186 +240 5 5.04183674 0.041836738586425781 0.0017503126955489279 +241 5 5.80289364 0.80289363861083984 0.64463819492175389 +242 7 6.52401257 0.47598743438720703 0.22656403769451572 +244 5 5.1631465 0.1631464958190918 0.026616779098048937 +246 7 6.84524536 0.154754638671875 0.023948998190462589 +247 7 5.84106064 1.1589393615722656 1.3431404438015306 +248 7 5.93824673 1.0617532730102539 1.1273200127479868 +249 5 5.282788 0.28278779983520508 0.079968939735636013 +250 4 4.86858034 0.86858034133911133 0.75443180936076715 +252 5 5.1631465 0.1631464958190918 0.026616779098048937 +254 6 5.5868516 0.41314840316772461 0.17069160304004072 +257 7 5.734293 1.2657070159912109 1.6020142503293755 +258 6 6.62694263 0.62694263458251953 0.39305706705727061 +259 4 4.29258347 0.29258346557617188 0.085605084328562953 +260 6 6.35282 0.35281991958618164 0.12448189565679968 +262 5 5.519015 0.51901483535766602 0.26937639932134516 +267 5 5.42426062 0.42426061630249023 0.17999707054536884 +268 6 5.42426062 0.57573938369750977 0.33147583794038837 +269 6 5.49771452 0.50228548049926758 0.25229070392038011 +271 5 5.63827229 0.63827228546142578 0.4073915103881518 +272 5 5.35147762 0.35147762298583984 0.12353651945977617 +275 6 6.05495071 0.054950714111328125 0.0030195809813449159 +276 6 6.143008 0.14300823211669922 0.020451354453143722 +277 5 4.38187933 0.61812067031860352 0.38207316307511974 +278 4 5.10659647 1.1065964698791504 1.2245557471489974 +279 7 6.1854105 0.81458950042724609 0.66355605420631036 +280 8 6.72976446 1.270235538482666 1.6134983232243485 +283 5 5.426278 0.42627811431884766 0.18171303074723255 +284 5 5.36907625 0.36907625198364258 0.13621727977829323 +285 5 5.147811 0.14781093597412109 0.021848072793545725 +288 7 6.302693 0.69730710983276367 0.48623720542332194 +290 7 6.302693 0.69730710983276367 0.48623720542332194 +291 6 6.182142 0.18214178085327148 0.033175628332401175 +293 7 5.923005 1.0769948959350586 1.1599180058701677 +296 5 5.05519533 0.055195331573486328 0.0030465246275070967 +297 7 6.49540234 0.50459766387939453 0.25461880239254242 +299 6 6.12447357 0.12447357177734375 0.015493670071009547 +300 6 5.95414829 0.045851707458496094 0.0021023790768595063 +301 6 5.298424 0.70157623291015625 0.49220921058440581 +303 6 5.63807344 0.36192655563354492 0.13099083167276149 +304 6 5.45552254 0.54447746276855469 0.29645570746288286 +308 7 5.828621 1.1713790893554688 1.3721289709792472 +309 6 5.78201675 0.21798324584960938 0.047516695471131243 +311 8 5.948389 2.0516109466552734 4.2091074764357472 +312 6 5.93200827 0.067991733551025391 0.0046228758312736318 +314 5 5.734013 0.73401308059692383 0.5387752024873862 +316 6 6.06090975 0.060909748077392578 0.0037099974108514289 +317 5 6.01898 1.0189800262451172 1.0383202938864997 +319 6 6.042424 0.042424201965332031 0.0017998129123952822 +321 5 6.01898 1.0189800262451172 1.0383202938864997 +323 6 5.88778448 0.11221551895141602 0.012592322693535607 +327 6 5.53253555 0.46746444702148438 0.21852300922910217 +328 6 5.698133 0.30186700820922852 0.091123690645190436 +329 5 5.96683931 0.96683931350708008 0.93477825814284188 +331 5 6.11903 1.1190299987792969 1.2522281381679932 +332 6 5.995608 0.0043921470642089844 1.92909558336396E-05 +333 5 5.879673 0.87967300415039063 0.77382459423097316 +336 6 6.19445658 0.19445657730102539 0.037813360455629663 +338 5 5.92611265 0.92611265182495117 0.85768464387024324 +343 5 5.8768 0.8768000602722168 0.76877834569336301 +344 6 6.03104544 0.031045436859130859 0.00096381914977428096 +346 7 5.946189 1.0538110733032227 1.1105177782164901 +347 6 6.44402266 0.44402265548706055 0.19715611858578086 +348 6 6.000975 0.00097513198852539063 9.5088239504548255E-07 +349 5 5.837654 0.83765411376953125 0.7016644143150188 +350 7 7.38578367 0.38578367233276367 0.14882904183855317 +352 6 5.3894496 0.6105504035949707 0.37277179532998161 +353 7 6.588947 0.41105318069458008 0.1689647173591311 +354 6 5.7112484 0.28875160217285156 0.083377487757388735 +355 6 6.368937 0.36893701553344727 0.13611452143072711 +358 6 5.21193743 0.78806257247924805 0.62104261814261008 +360 6 5.77032 0.22968006134033203 0.052752930577298685 +361 5 4.94997835 0.050021648406982422 0.0025021653093517671 +366 6 5.51550245 0.4844975471496582 0.23473787319403527 +368 6 5.511029 0.48897123336791992 0.2390928670613448 +370 6 5.15915 0.84084987640380859 0.70702851464830019 +371 6 5.511029 0.48897123336791992 0.2390928670613448 +373 6 5.628817 0.37118291854858398 0.13777675902224473 +376 7 5.75248051 1.2475194931030273 1.5563048856720343 +377 7 5.87503767 1.124962329864502 1.2655402436141685 +378 6 5.430989 0.56901121139526367 0.32377375869350544 +379 7 5.75248051 1.2475194931030273 1.5563048856720343 +381 6 5.49459362 0.50540637969970703 0.25543560864116444 +383 6 5.628817 0.37118291854858398 0.13777675902224473 +384 7 6.51569 0.48431015014648438 0.23455632153491024 +387 5 5.08900166 0.089001655578613281 0.0079212946957341046 +388 6 5.79040861 0.20959138870239258 0.043928550218197415 +389 7 5.79391527 1.2060847282409668 1.4546403716960867 +391 5 5.36205149 0.36205148696899414 0.13108127921645973 +392 6 4.892251 1.1077489852905273 1.227107814412193 +395 5 4.885891 0.11410903930664063 0.013020872851484455 +396 5 6.08122444 1.0812244415283203 1.1690462929582282 +398 5 5.343458 0.34345817565917969 0.11796351842713193 +399 6 6.66167355 0.66167354583740234 0.43781188126104098 +404 6 6.83485031 0.83485031127929688 0.69697504224313889 +406 7 7.377054 0.37705421447753906 0.14216988065527403 +409 5 6.08122444 1.0812244415283203 1.1690462929582282 +413 5 5.92827368 0.92827367782592773 0.86169202094447428 +414 6 5.657659 0.34234094619750977 0.11719732344340628 +415 6 6.120452 0.12045192718505859 0.014508666762594657 +416 6 5.685086 0.31491422653198242 0.099170970072236742 +418 6 5.685086 0.31491422653198242 0.099170970072236742 +419 6 5.96859169 0.031408309936523438 0.0009864819330687169 +422 6 5.964954 0.035046100616455078 0.001228229168418693 +423 6 5.964954 0.035046100616455078 0.001228229168418693 +428 5 5.70770168 0.70770168304443359 0.50084167218392395 +429 5 5.161595 0.16159486770629883 0.02611290126901622 +430 5 5.31656456 0.31656455993652344 0.10021312060780474 +434 8 6.928819 1.0711808204650879 1.1474283501322589 +436 5 5.35035944 0.35035943984985352 0.12275173709190312 +439 5 5.11043 0.11042976379394531 0.012194732731586555 +440 7 6.18897438 0.81102561950683594 0.65776255549644702 +441 6 5.71624041 0.28375959396362305 0.080519507166400217 +442 8 7.28845739 0.71154260635375977 0.50629288065670153 +449 7 6.21131849 0.7886815071105957 0.62201851965824062 +450 5 5.318568 0.31856822967529297 0.10148571695845021 +451 5 5.7516017 0.7516016960144043 0.564905109451729 +452 7 5.77642059 1.2235794067382813 1.4971465645940043 +453 7 6.491666 0.50833415985107422 0.25840361807149748 +454 7 6.21131849 0.7886815071105957 0.62201851965824062 +455 6 5.854044 0.14595603942871094 0.021303165445715422 +456 7 6.70512962 0.29487037658691406 0.086948538988508517 +457 5 5.45710325 0.45710325241088867 0.2089433833646126 +464 5 4.90521431 0.094785690307617188 0.0089843270870915148 +465 5 5.896737 0.89673709869384766 0.80413742417385947 +466 6 5.90757847 0.092421531677246094 0.0085417395175682032 +467 6 5.37867832 0.62132167816162109 0.38604062775357306 +474 6 5.72567129 0.27432870864868164 0.075256240388853257 +480 5 5.301491 0.30149078369140625 0.090896692650858313 +482 5 5.72171164 0.72171163558959961 0.52086768494541502 +483 5 5.301491 0.30149078369140625 0.090896692650858313 +484 5 5.525054 0.52505397796630859 0.27568167977824487 +487 6 5.93644571 0.063554286956787109 0.0040391473905856401 +489 6 5.572881 0.42711877822875977 0.18243045071562847 +492 6 5.95695925 0.043040752410888672 0.001852506368095419 +493 6 6.18003654 0.18003654479980469 0.03241315746345208 +495 6 6.223172 0.22317218780517578 0.04980582540974865 +497 6 6.77364969 0.77364969253540039 0.59853384676011956 +501 6 6.0556283 0.055628299713134766 0.0030945077289743494 +502 6 4.97781563 1.0221843719482422 1.0448608902552223 +504 6 6.21441841 0.21441841125488281 0.045975255085068056 +507 7 6.07226849 0.92773151397705078 0.86068576202615077 +510 6 4.95028734 1.0497126579284668 1.1018966642152463 +513 6 5.163256 0.83674383163452148 0.70014023977842044 +514 7 5.956624 1.0433759689331055 1.0886334125470967 +517 6 6.57721233 0.57721233367919922 0.33317407815138722 +519 5 4.88908 0.11091995239257813 0.012303235838771798 +520 5 5.1877284 0.1877284049987793 0.035241954043385704 +521 5 5.1877284 0.1877284049987793 0.035241954043385704 +522 6 6.216381 0.21638107299804688 0.04682076875178609 +523 6 6.435857 0.43585681915283203 0.18997116680202453 +527 6 6.677373 0.67737293243408203 0.45883408959434746 +528 6 6.649248 0.64924812316894531 0.42152312543839798 +529 6 6.803005 0.80300521850585938 0.64481738094764296 +531 5 5.847043 0.84704303741455078 0.71748190723246807 +532 6 5.828606 0.17139387130737305 0.029375859121728354 +533 6 5.828606 0.17139387130737305 0.029375859121728354 +534 6 5.828606 0.17139387130737305 0.029375859121728354 +535 5 5.31806469 0.31806468963623047 0.10116514679339161 +538 5 5.6805687 0.68056869506835938 0.46317374870704953 +539 6 4.66531754 1.3346824645996094 1.7813772813096875 +540 4 5.62447166 1.6244716644287109 2.6389081885317864 +541 5 4.80980158 0.19019842147827148 0.036175439532826204 +544 6 5.198272 0.8017277717590332 0.64276742000970444 +546 6 6.07615852 0.076158523559570313 0.0058001207107736263 +547 6 4.63071346 1.3692865371704102 1.874945620876133 +548 7 6.027543 0.97245693206787109 0.94567248472685606 +549 5 4.80980158 0.19019842147827148 0.036175439532826204 +557 6 5.579116 0.42088413238525391 0.17714345289368794 +558 5 5.648824 0.64882421493530273 0.42097286188641192 +559 6 7.030506 1.0305061340332031 1.061942892280058 +560 7 5.983154 1.0168461799621582 1.0339761537036338 +561 5 5.2358346 0.23583459854125977 0.055617957869117163 +563 7 5.19892454 1.8010754585266113 3.2438728073068432 +565 6 5.939111 0.060888767242431641 0.0037074419763030164 +566 6 4.47719574 1.5228042602539063 2.3189328150474466 +569 6 5.248791 0.75120878219604492 0.56431463444846486 +577 7 6.69894743 0.30105257034301758 0.090632650110137547 +578 7 6.661803 0.33819723129272461 0.11437736725406467 +581 5 5.480605 0.48060512542724609 0.23098128658693895 +582 6 5.367171 0.63282918930053711 0.40047278283077503 +584 7 6.44490433 0.55509567260742188 0.30813120574748609 +586 6 5.640957 0.35904312133789063 0.12891196298005525 +590 5 5.35784769 0.35784769058227539 0.12805496965506791 +593 5 5.30848074 0.30848073959350586 0.095160366700156374 +594 5 5.211274 0.21127414703369141 0.044636765204813855 +600 6 5.588999 0.41100120544433594 0.16892199087669724 +602 5 5.30848074 0.30848073959350586 0.095160366700156374 +604 6 5.71898746 0.28101253509521484 0.078968044880639354 +606 5 5.71843529 0.71843528747558594 0.51614926229012781 +607 5 5.71843529 0.71843528747558594 0.51614926229012781 +609 6 5.544185 0.45581483840942383 0.20776716691420916 +612 5 5.36357164 0.3635716438293457 0.13218434019677261 +613 5 5.486784 0.48678398132324219 0.2369586444729066 +614 5 5.486784 0.48678398132324219 0.2369586444729066 +617 6 5.683154 0.31684589385986328 0.10039132045585575 +618 6 5.783254 0.21674585342407227 0.046978764976529419 +619 6 5.98480844 0.015191555023193359 0.00023078334402271139 +621 5 5.4160533 0.41605329513549805 0.17310034439310584 +622 6 6.07667 0.076670169830322266 0.0058783149418104585 +624 5 5.22469759 0.22469758987426758 0.050489006895304556 +627 6 5.40007 0.5999298095703125 0.35991577641107142 +629 6 5.81221437 0.18778562545776367 0.0352634411285635 +633 5 5.39136028 0.39136028289794922 0.15316287102996284 +634 6 6.59777164 0.59777164459228516 0.35733093907856528 +638 5 5.072482 0.072482109069824219 0.0052536561352098943 +639 5 4.970767 0.029232978820800781 0.00085456705073738704 +641 4 5.53252 1.5325198173522949 2.3486169905775114 +642 6 5.80048943 0.19951057434082031 0.039804469273803988 +644 5 5.50555658 0.50555658340454102 0.25558745902367264 +645 5 5.36433029 0.36433029174804688 0.13273656148521695 +649 7 6.382847 0.61715316772460938 0.38087803243251983 +652 7 6.382847 0.61715316772460938 0.38087803243251983 +653 6 5.39073658 0.60926342010498047 0.37120191507801792 +654 7 7.006134 0.006134033203125 3.7626363337039948E-05 +656 6 6.008372 0.0083718299865722656 7.0087537324070581E-05 +657 5 5.15175724 0.15175724029541016 0.02303025998207886 +660 5 5.216773 0.21677303314208984 0.046990547897621582 +661 7 7.137654 0.13765382766723633 0.018948576271441198 +665 5 5.23176527 0.2317652702331543 0.053715140486247037 +668 6 5.657085 0.34291505813598633 0.11759073709640688 +670 6 5.345273 0.65472698211669922 0.42866742111164058 +678 7 6.815811 0.1841888427734375 0.03392552980221808 +679 7 6.815811 0.1841888427734375 0.03392552980221808 +680 5 4.949763 0.050237178802490234 0.0025237741340333741 +681 5 4.90691662 0.093083381652832031 0.0086645159399267868 +682 6 5.310383 0.68961715698242188 0.4755718232045183 +683 5 5.57668543 0.57668542861938477 0.33256608358192352 +685 5 5.48237133 0.48237133026123047 0.23268210025798908 +688 6 5.55162239 0.44837760925292969 0.2010424804793729 +689 7 6.42106438 0.57893562316894531 0.33516645577401505 +691 6 4.88665342 1.1133465766906738 1.2395405998288425 +692 5 5.15047026 0.15047025680541992 0.02264129818308902 +693 5 5.30301332 0.30301332473754883 0.091817074968503221 +694 6 5.21851873 0.78148126602172852 0.61071296914292361 +696 6 6.50944328 0.50944328308105469 0.25953245867640362 +697 5 5.558616 0.55861616134643555 0.31205201571742691 +698 5 5.558616 0.55861616134643555 0.31205201571742691 +700 5 4.836711 0.16328907012939453 0.026663320423722325 +702 4 5.14076853 1.1407685279846191 1.3013528344401948 +704 6 6.58592939 0.58592939376831055 0.34331325448169991 +705 5 4.44670725 0.55329275131225586 0.30613286865468581 +706 5 5.4099164 0.40991640090942383 0.16803145573453548 +707 6 6.31098175 0.31098175048828125 0.096709649136755615 +711 6 6.45854139 0.4585413932800293 0.2102602093511905 +712 6 6.45854139 0.4585413932800293 0.2102602093511905 +714 6 5.98270941 0.017290592193603516 0.00029896457840550283 +718 7 6.532272 0.4677281379699707 0.21876961104885595 +719 7 6.13225555 0.86774444580078125 0.75298042321810499 +720 5 5.08321571 0.083215713500976563 0.0069248549734766129 +721 5 5.865369 0.86536884307861328 0.74886323457121762 +722 6 6.39147 0.39146995544433594 0.15324872601559036 +723 8 6.789572 1.2104282379150391 1.4651365191421064 +724 7 5.677485 1.3225150108337402 1.749045953880568 +725 5 5.19655752 0.19655752182006836 0.038634859384046649 +726 7 6.88660955 0.11339044570922852 0.012857393178137499 +727 5 5.500728 0.50072813034057617 0.25072866051436904 +728 5 5.98868656 0.98868656158447266 0.97750111705772724 +729 5 4.834835 0.16516494750976563 0.027279459885903634 +732 7 4.74686766 2.2531323432922363 5.0766053563895639 +735 6 5.548644 0.45135593414306641 0.2037221792861601 +738 7 6.321803 0.67819690704345703 0.4599510447233115 +749 6 6.13887072 0.1388707160949707 0.019285075788729955 +752 6 5.745285 0.2547149658203125 0.064879713812842965 +757 6 5.58691835 0.41308164596557617 0.17063644623362961 +758 7 6.400842 0.59915781021118164 0.35899008153705836 +760 6 6.033177 0.033176898956298828 0.0011007066243564623 +761 6 5.963089 0.0369110107421875 0.001362422714009881 +764 6 5.44656 0.55344009399414063 0.30629593764024321 +765 6 5.75111437 0.2488856315612793 0.061944057597656865 +770 7 6.303649 0.69635105133056641 0.48490478668918513 +773 5 5.756574 0.75657415390014648 0.57240445034972254 +774 9 5.68372965 3.3162703514099121 10.997649043640422 +778 7 5.64314938 1.3568506240844727 1.8410436160784229 +779 8 6.50265 1.4973502159118652 2.2420576690913094 +780 4 4.171287 0.17128705978393555 0.02933925684942551 +781 6 5.375076 0.6249241828918457 0.39053023436304102 +782 7 5.64314938 1.3568506240844727 1.8410436160784229 +783 8 6.50265 1.4973502159118652 2.2420576690913094 +784 5 5.41523933 0.41523933410644531 0.17242370458916412 +785 6 5.943398 0.056602001190185547 0.0032037865387337661 +786 6 5.822032 0.17796802520751953 0.031672617996264307 +788 7 5.913982 1.0860180854797363 1.1794352819890719 +792 5 5.467223 0.46722316741943359 0.21829748817344807 +794 5 5.26649475 0.2664947509765625 0.07101945229806006 +795 5 5.21801758 0.218017578125 0.047531664371490479 +799 8 6.57892227 1.4210777282714844 2.0194619097892428 +802 5 5.40743256 0.40743255615234375 0.16600128781283274 +806 5 5.651162 0.65116214752197266 0.42401214236542728 +810 5 5.35292768 0.35292768478393555 0.12455795068694897 +816 5 5.17684269 0.17684268951416016 0.03127333683460165 +817 5 5.002493 0.0024929046630859375 6.2145736592356116E-06 +819 5 5.002493 0.0024929046630859375 6.2145736592356116E-06 +821 6 5.21509266 0.78490734100341797 0.61607953396105586 +826 6 6.08280659 0.082806587219238281 0.0068569308868973167 +827 9 6.580013 2.4199872016906738 5.856338056346658 +829 7 6.318461 0.68153905868530273 0.46449548851364852 +836 8 6.86261654 1.1373834609985352 1.2936411373530063 +838 8 6.86261654 1.1373834609985352 1.2936411373530063 +840 7 6.16398954 0.83601045608520508 0.69891348268379261 +841 7 6.03430843 0.96569156646728516 0.93256020154603902 +845 8 6.69226837 1.3077316284179688 1.7101620119647123 +848 7 6.03430843 0.96569156646728516 0.93256020154603902 +850 7 6.313141 0.686859130859375 0.47177546564489603 +851 5 5.332034 0.33203411102294922 0.11024665088280017 +854 7 6.52222 0.47777986526489258 0.22827359965253891 +855 7 5.93773556 1.0622644424438477 1.1284057456805385 +856 5 5.332034 0.33203411102294922 0.11024665088280017 +858 7 5.82581425 1.1741857528686523 1.3787121822397239 +859 5 5.48504925 0.48504924774169922 0.2352727727347883 +860 8 6.057407 1.9425930976867676 3.7736679431802713 +861 7 5.526988 1.4730119705200195 2.1697642652952709 +862 6 6.006587 0.0065870285034179688 4.3388944504840765E-05 +863 6 6.365287 0.36528682708740234 0.13343446604358178 +864 5 6.02387047 1.0238704681396484 1.0483107355285028 +870 5 4.99397 0.0060300827026367188 3.6361897400638554E-05 +871 5 5.05771 0.057710170745849609 0.0033304638075151161 +872 6 5.71040344 0.2895965576171875 0.083866166183724999 +874 5 5.3424654 0.34246540069580078 0.11728255067373539 +876 9 6.88309 2.1169099807739258 4.4813078667002628 +881 6 4.92345238 1.0765476226806641 1.1589547838993894 +885 7 6.233847 0.76615285873413086 0.58699020294648108 +887 7 6.67779875 0.32220125198364258 0.10381364677982674 +888 6 6.02012634 0.0201263427734375 0.00040506967343389988 +890 6 5.569731 0.43026876449584961 0.18513120970078489 +895 6 5.936211 0.063788890838623047 0.0040690225944217673 +896 6 5.90148973 0.098510265350341797 0.0097042723793947516 +898 6 5.175413 0.82458686828613281 0.67994350334993214 +900 7 6.22928333 0.77071666717529297 0.59400418106179131 +902 5 5.566873 0.56687307357788086 0.32134508154763353 +904 8 5.84905863 2.1509413719177246 4.6265487854273033 +906 4 4.528229 0.5282292366027832 0.27902612640195912 +908 4 5.4986105 1.4986104965209961 2.2458334202829064 +910 5 5.32466364 0.32466363906860352 0.10540647853326846 +912 5 5.38664961 0.38664960861206055 0.14949791983985961 +914 4 4.99963474 0.99963474273681641 0.99926961888650112 +918 6 6.35297775 0.35297775268554688 0.12459329389093909 +919 7 5.619564 1.3804359436035156 1.9056033943925286 +920 7 5.61330652 1.3866934776306152 1.9229188009032896 +921 6 5.527122 0.47287797927856445 0.22361358328657843 +924 8 6.40640163 1.5935983657836914 2.5395557514284519 +925 5 5.11208773 0.11208772659301758 0.01256365845279106 +926 5 4.7834034 0.21659660339355469 0.046914088601624826 +927 7 5.36317968 1.6368203163146973 2.6791807479005456 +930 7 5.91567659 1.0843234062194824 1.1757572492754207 +934 5 5.56775 0.56774997711181641 0.32234003651046805 +935 5 5.555936 0.55593585968017578 0.3090646800783361 +936 5 4.933273 0.066727161407470703 0.0044525140694986476 +937 5 5.413934 0.41393423080444336 0.17134154743166619 +938 6 5.60947943 0.39052057266235352 0.15250631767253253 +940 5 5.297755 0.29775476455688477 0.08865789981632588 +944 7 5.64300871 1.3569912910461426 1.8414253639750768 +950 5 5.191386 0.19138622283935547 0.036628686292715429 +953 5 5.78504562 0.78504562377929688 0.61629663141502533 +955 5 5.191386 0.19138622283935547 0.036628686292715429 +956 5 5.052131 0.052131175994873047 0.0027176595106084278 +958 7 5.82465935 1.1753406524658203 1.3814256493387802 +959 6 5.92871237 0.071287631988525391 0.0050819264745314285 +960 6 5.92871237 0.071287631988525391 0.0050819264745314285 +964 6 5.323346 0.67665386199951172 0.45786044895885425 +965 5 5.942498 0.94249820709228516 0.88830287037217204 +968 7 7.037116 0.037116050720214844 0.0013776012210655608 +969 7 5.911967 1.0880331993103027 1.183816242801413 +970 7 6.416778 0.5832219123840332 0.3401477990848889 +971 7 6.362315 0.63768482208251953 0.40664193231441459 +972 6 5.766083 0.233917236328125 0.054717273451387882 +974 6 6.990531 0.99053096771240234 0.98115159799726825 +976 6 6.241904 0.24190378189086914 0.058517439693105189 +980 6 5.416485 0.58351516723632813 0.34048995039483998 +982 6 6.43619442 0.43619441986083984 0.19026557191773463 +983 6 6.454488 0.45448780059814453 0.20655916089253878 +985 6 6.32975 0.32975006103515625 0.10873510275268927 +986 6 5.70133448 0.29866552352905273 0.089201094944883152 +989 7 5.61717 1.3828301429748535 1.9122192043198538 +992 5 5.94553471 0.94553470611572266 0.89403588046934601 +994 6 5.551492 0.44850778579711914 0.20115923392063451 +995 6 5.62143946 0.37856054306030273 0.14330808476211132 +997 6 5.558929 0.4410710334777832 0.19454365657315975 +998 6 5.70035934 0.29964065551757813 0.089784522439003922 +999 7 5.83896065 1.1610393524169922 1.3480123778608686 +1002 6 5.30784845 0.69215154647827148 0.47907376329226281 +1004 6 7.126438 1.1264381408691406 1.2688628852047259 +1006 6 7.126438 1.1264381408691406 1.2688628852047259 +1007 5 5.103116 0.10311603546142578 0.010632916769282019 +1015 5 5.09258461 0.092584609985351563 0.0085719100061396603 +1016 5 5.404233 0.40423297882080078 0.16340430116633797 +1017 6 5.70289135 0.29710865020751953 0.088273550028134196 +1018 6 6.281246 0.28124618530273438 0.079099416747340001 +1021 7 6.380373 0.61962699890136719 0.38393761776751489 +1025 6 6.22872925 0.228729248046875 0.052317068912088871 +1026 6 6.624846 0.62484598159790039 0.39043250071904367 +1027 4 4.34852028 0.34852027893066406 0.12146638482590788 +1030 6 6.000875 0.00087499618530273438 7.6561832429433707E-07 +1032 6 4.932675 1.0673251152038574 1.1391829015449275 +1033 6 4.932675 1.0673251152038574 1.1391829015449275 +1034 3 4.823845 1.8238449096679688 3.3264102545217611 +1037 5 4.860711 0.13928890228271484 0.019401398299123684 +1039 5 5.60733747 0.60733747482299805 0.36885880832437579 +1040 4 4.965731 0.96573114395141602 0.9326366423977106 +1044 7 5.986146 1.0138540267944336 1.0278999876472881 +1045 5 6.377755 1.3777551651000977 1.8982092949599974 +1047 5 3.98646641 1.0135335922241211 1.027250342566731 +1049 6 7.03259325 1.0325932502746582 1.0662488205127829 +1051 6 5.550454 0.44954586029052734 0.20209148050435033 +1052 5 5.950327 0.95032691955566406 0.90312125403215759 +1053 4 5.15795135 1.1579513549804688 1.3408513405011036 +1054 5 3.98646641 1.0135335922241211 1.027250342566731 +1058 6 5.71832275 0.28167724609375 0.079342070966959 +1059 4 5.272726 1.2727260589599609 1.619831621155754 +1060 7 6.133465 0.86653518676757813 0.7508832299063215 +1061 5 5.57759333 0.57759332656860352 0.33361405089658547 +1064 6 5.817982 0.18201780319213867 0.033130480678892127 +1065 5 5.710365 0.71036481857299805 0.50461817546624843 +1068 7 5.31932449 1.6806755065917969 2.8246701584575931 +1069 6 6.440941 0.44094085693359375 0.19442883931333199 +1071 5 5.710365 0.71036481857299805 0.50461817546624843 +1072 7 5.837095 1.162905216217041 1.3523485419048029 +1074 6 4.92468357 1.0753164291381836 1.1563054227744942 +1075 7 6.41403961 0.58596038818359375 0.34334957652026787 +1076 6 5.850889 0.14911079406738281 0.022234028907405445 +1077 5 5.840539 0.84053897857666016 0.70650577450669516 +1079 6 5.75533962 0.24466037750244141 0.059858700319637137 +1080 7 5.96626854 1.0337314605712891 1.0686007325748506 +1082 6 5.46353149 0.536468505859375 0.28779845777899027 +1083 6 6.08476448 0.084764480590820313 0.0071850171698315535 +1084 7 6.05763674 0.94236326217651367 0.88804851789996064 +1085 5 4.6782937 0.32170629501342773 0.1034949402512666 +1086 8 6.900887 1.0991129875183105 1.2080493593314259 +1088 6 6.08476448 0.084764480590820313 0.0071850171698315535 +1090 6 5.80458975 0.19541025161743164 0.038185166437187945 +1091 6 6.049824 0.049824237823486328 0.0024824546746913256 +1092 6 6.16954374 0.16954374313354492 0.028745080835733461 +1094 5 5.402039 0.4020390510559082 0.16163539857393516 +1095 8 6.64956951 1.3504304885864258 1.8236625045037727 +1098 6 6.14059544 0.14059543609619141 0.019767076651078241 +1099 7 7.001953 0.001953125 3.814697265625E-06 +1100 6 5.46353149 0.536468505859375 0.28779845777899027 +1101 6 6.53630066 0.5363006591796875 0.28761839703656733 +1103 5 4.507545 0.49245500564575195 0.24251193258555759 +1112 6 5.460754 0.5392460823059082 0.29078633728227032 +1119 5 4.88808155 0.11191844940185547 0.012525739316515683 +1122 7 6.77279854 0.22720146179199219 0.051620504240418086 +1125 6 4.8543334 1.1456665992736816 1.3125519566913226 +1126 7 7.052003 0.052002906799316406 0.0027043023155783885 +1129 7 6.24118137 0.75881862640380859 0.57580570777736284 +1130 6 6.008379 0.0083789825439453125 7.0207348471740261E-05 +1133 5 5.064787 0.064786911010742188 0.0041973438383138273 +1134 5 5.540143 0.54014301300048828 0.29175447449324565 +1135 6 5.733244 0.26675605773925781 0.071158794340590248 +1136 8 6.59698 1.403019905090332 1.9684648540796843 +1137 8 7.1152873 0.88471269607543945 0.7827165545970729 +1138 5 4.96683359 0.033166408538818359 0.0011000106553638034 +1140 6 5.66273642 0.33726358413696289 0.11374672518491025 +1141 5 5.32665348 0.32665348052978516 0.10670249634222273 +1143 5 5.807357 0.80735683441162109 0.65182505807115376 +1144 5 5.72894239 0.7289423942565918 0.53135701414453251 +1146 5 5.34848356 0.34848356246948242 0.12144079331142166 +1147 5 5.131541 0.13154077529907227 0.01730297556628102 +1148 6 6.152261 0.15226078033447266 0.023183345228062535 +1151 5 5.07304573 0.073045730590820313 0.0053356787575467024 +1153 6 5.74105072 0.25894927978515625 0.067054729501251131 +1155 4 6.077269 2.0772690773010254 4.3150468195110534 +1158 6 5.679586 0.32041406631469727 0.10266517389231922 +1159 6 5.75055456 0.24944543838500977 0.062223026731089703 +1164 6 5.40722132 0.59277868270874023 0.35138656667390933 +1165 5 6.2800765 1.2800765037536621 1.6385958554621993 +1166 5 5.0108695 0.010869503021240234 0.00011814609592875058 +1168 5 6.047814 1.047813892364502 1.0979139530320481 +1169 6 5.86063862 0.13936138153076172 0.019421594662162533 +1170 6 5.34022427 0.65977573394775391 0.43530401910629735 +1174 6 5.70964 0.2903599739074707 0.084308914447547068 +1175 5 5.29879236 0.29879236221313477 0.089276875716905124 +1177 6 5.775562 0.22443819046020508 0.05037250133705129 +1181 6 5.288253 0.71174716949462891 0.50658403328361601 +1182 5 6.285735 1.2857351303100586 1.6531148253134234 +1184 7 7.01639 0.016389846801757813 0.0002686270781850908 +1186 5 5.29342175 0.29342174530029297 0.086096320615069999 +1187 8 6.35788059 1.6421194076538086 2.6965561489932952 +1191 7 6.31105661 0.68894338607788086 0.474642989220456 +1195 6 5.87646532 0.1235346794128418 0.015260817017633599 +1198 6 5.535099 0.46490097045898438 0.21613291233370546 +1199 7 5.668652 1.3313479423522949 1.7724873436056896 +1200 6 6.047008 0.047008037567138672 0.0022097555959135207 +1201 7 5.87261152 1.1273884773254395 1.2710047788061729 +1202 5 5.520709 0.52070903778076172 0.27113790202656674 +1204 6 5.744867 0.25513315200805664 0.065092925253566136 +1206 6 5.34409475 0.65590524673461914 0.43021169269400161 +1207 5 5.520709 0.52070903778076172 0.27113790202656674 +1208 6 6.640169 0.64016914367675781 0.40981653251583339 +1210 6 4.49570036 1.5042996406555176 2.2629174088763193 +1212 6 6.1520853 0.15208530426025391 0.023129939771934005 +1213 6 5.744867 0.25513315200805664 0.065092925253566136 +1214 6 4.65929842 1.3407015800476074 1.7974807267421511 +1216 8 7.04643059 0.95356941223144531 0.90929462394342409 +1218 8 6.13147831 1.8685216903686523 3.4913733073781259 +1220 6 5.87119246 0.12880754470825195 0.016591383573768326 +1221 7 7.03517437 0.035174369812011719 0.0012372362916721613 +1229 3 6.334992 3.3349919319152832 11.122171185940033 +1231 7 6.70507526 0.29492473602294922 0.086980599918206281 +1232 7 6.7074585 0.29254150390625 0.085580531507730484 +1233 6 6.8001194 0.80011940002441406 0.64019105429542833 +1234 6 6.546759 0.54675912857055664 0.29894554467523449 +1238 7 6.551763 0.44823694229125977 0.20091635643461814 +1240 6 6.052974 0.052974224090576172 0.0028062684179985808 +1243 7 6.551763 0.44823694229125977 0.20091635643461814 +1246 7 5.836896 1.1631040573120117 1.3528110481356634 +1248 7 5.80520725 1.1947927474975586 1.4275297094727648 +1249 5 4.852862 0.14713811874389648 0.021649625987492982 +1251 5 5.544311 0.5443110466003418 0.29627451545115946 +1253 7 6.491688 0.50831222534179688 0.25838131843192969 +1254 5 6.03563356 1.0356335639953613 1.0725368788737342 +1255 6 5.61970472 0.3802952766418457 0.14462449743609795 +1257 6 5.95382261 0.046177387237548828 0.0021323510920865374 +1259 6 5.75618744 0.24381256103515625 0.059444564918521792 +1260 6 5.590599 0.40940093994140625 0.16760912962490693 +1261 6 5.6954813 0.30451869964599609 0.092731638434088381 +1263 6 4.91215 1.0878500938415527 1.1834178266710751 +1265 7 5.631242 1.3687582015991211 1.8734990144448602 +1266 8 6.702181 1.2978191375732422 1.6843345138513541 +1268 5 5.42324066 0.42324066162109375 0.17913265764946118 +1269 6 5.73010635 0.26989364624023438 0.072842580280848779 +1274 6 5.73010635 0.26989364624023438 0.072842580280848779 +1277 5 5.42324066 0.42324066162109375 0.17913265764946118 +1280 6 6.709922 0.70992183685302734 0.50398901444077637 +1281 7 6.485117 0.51488304138183594 0.26510454630260938 +1282 5 4.957567 0.042432785034179688 0.0018005412457569037 +1285 6 6.709922 0.70992183685302734 0.50398901444077637 +1290 6 5.946758 0.053242206573486328 0.0028347325608137908 +1291 6 6.065382 0.065382003784179688 0.004274806418834487 +1293 4 4.80942345 0.80942344665527344 0.65516631599530228 +1296 6 6.327094 0.32709407806396484 0.10699053590451513 +1297 7 6.75215244 0.24784755706787109 0.061428411544511619 +1300 6 5.462883 0.53711700439453125 0.2884946764097549 +1301 5 6.1102 1.1101999282836914 1.2325438807611135 +1302 6 5.83469963 0.16530036926269531 0.027324212078383425 +1306 8 6.776491 1.2235088348388672 1.4969738689287624 +1308 6 5.34525156 0.65474843978881836 0.4286955194058919 +1313 5 4.986168 0.01383209228515625 0.00019132677698507905 +1314 6 5.32113028 0.67886972427368164 0.46086410253542454 +1320 6 5.379435 0.62056493759155273 0.38510084176800774 +1323 5 5.58946848 0.58946847915649414 0.34747308791907017 +1324 6 5.761131 0.23886919021606445 0.057058490034478382 +1325 7 6.7117424 0.28825759887695313 0.083092443310306408 +1327 6 5.672103 0.32789707183837891 0.10751648972018302 +1328 6 6.51487637 0.51487636566162109 0.26509767191691935 +1330 5 5.31021452 0.31021451950073242 0.096233048109070296 +1331 6 5.63311625 0.36688375473022461 0.13460368948494761 +1334 6 5.764177 0.23582315444946289 0.055612560174495229 +1336 8 6.128258 1.871741771697998 3.5034172599191606 +1337 5 5.75152 0.75152015686035156 0.56478254616740742 +1338 5 5.75152 0.75152015686035156 0.56478254616740742 +1340 6 5.973752 0.026247978210449219 0.00068895636013621697 +1341 5 4.93071 0.0692901611328125 0.00480112642981112 +1344 8 6.2194767 1.7805233001708984 3.1702632224514673 +1345 8 7.028343 0.97165679931640625 0.94411693565780297 +1346 7 6.610233 0.38976716995239258 0.15191844677269728 +1348 8 6.128258 1.871741771697998 3.5034172599191606 +1350 7 6.45248127 0.54751873016357422 0.2997767598799328 +1354 5 6.381556 1.3815560340881348 1.9086970753253354 +1355 5 5.565555 0.56555509567260742 0.31985256624125213 +1356 6 5.802664 0.19733619689941406 0.038941574606724316 +1361 7 6.167615 0.83238506317138672 0.69286489339083346 +1363 4 5.27680159 1.276801586151123 1.6302222903980237 +1365 7 6.17772865 0.82227134704589844 0.67613016817267635 +1366 6 5.59236765 0.40763235092163086 0.16616413351789561 +1367 5 5.490637 0.49063682556152344 0.24072449459708878 +1370 6 5.50352764 0.49647235870361328 0.24648480295672925 +1372 6 5.22160673 0.77839326858520508 0.60589608057875921 +1373 6 5.22160673 0.77839326858520508 0.60589608057875921 +1375 7 6.76528645 0.23471355438232422 0.055090452610784268 +1379 6 4.334364 1.6656360626220703 2.7743434931071533 +1380 7 6.67767525 0.32232475280761719 0.10389324627249152 +1381 7 6.934968 0.065032005310058594 0.0042291617146474891 +1382 6 4.78057432 1.2194256782531738 1.486998984783213 +1383 6 5.463557 0.53644323348999023 0.28777134275719618 +1384 6 4.730748 1.269251823425293 1.6110001912684311 +1386 7 6.91881466 0.081185340881347656 0.006591059574020619 +1388 7 6.275715 0.72428512573242188 0.52458894335723016 +1389 6 5.81449032 0.18550968170166016 0.034413842005051265 +1393 6 5.76838875 0.23161125183105469 0.053643771974748233 +1394 7 6.91881466 0.081185340881347656 0.006591059574020619 +1395 7 6.602635 0.39736509323120117 0.1578990173186412 +1398 7 5.961599 1.0384011268615723 1.0782769002673831 +1400 7 5.961599 1.0384011268615723 1.0782769002673831 +1403 8 6.53851557 1.461484432220459 2.1359367456227574 +1404 5 4.86699438 0.13300561904907227 0.017690494698626935 +1406 8 5.688696 2.3113040924072266 5.3421266075783933 +1407 6 6.445782 0.44578218460083008 0.19872175610748855 +1408 7 5.961599 1.0384011268615723 1.0782769002673831 +1409 6 5.968728 0.031271934509277344 0.00097793388795253122 +1411 6 6.470186 0.47018623352050781 0.2210750941922015 +1413 6 5.568058 0.43194198608398438 0.18657387934217695 +1416 6 5.71637726 0.28362274169921875 0.080441859608981758 +1419 7 5.735413 1.2645869255065918 1.5991800921622144 +1420 4 5.435072 1.4350719451904297 2.0594314878726436 +1421 6 6.20828724 0.20828723907470703 0.043383573961364164 +1424 6 5.568058 0.43194198608398438 0.18657387934217695 +1425 6 5.89798737 0.10201263427734375 0.010406577552203089 +1426 6 6.426051 0.42605113983154297 0.18151957375175698 +1427 5 6.12100124 1.1210012435913086 1.2566437881332604 +1431 5 5.52014351 0.52014350891113281 0.2705492698623857 +1434 5 6.12100124 1.1210012435913086 1.2566437881332604 +1436 5 4.46587324 0.53412675857543945 0.28529139422630578 +1437 7 6.259091 0.74090909957885742 0.54894629383875326 +1438 5 5.908599 0.90859889984130859 0.82555196079283633 +1439 5 5.26834249 0.26834249496459961 0.072007694603826167 +1440 5 5.372621 0.37262105941772461 0.13884645392158745 +1442 5 5.371896 0.37189579010009766 0.13830647869417589 +1443 6 6.53377056 0.53377056121826172 0.28491101202325808 +1447 6 5.841877 0.15812301635742188 0.025002888301969506 +1456 6 6.359233 0.35923290252685547 0.12904827825786924 +1457 6 6.14253044 0.14253044128417969 0.020314926692662993 +1458 6 6.716283 0.71628284454345703 0.51306111338726623 +1459 6 6.436798 0.436798095703125 0.19079257640987635 +1460 6 6.29338169 0.29338169097900391 0.086072816601699742 +1461 6 5.90714359 0.092856407165527344 0.0086223123516901978 +1462 6 5.841877 0.15812301635742188 0.025002888301969506 +1463 6 5.54711056 0.45288944244384766 0.2051088470770992 +1464 8 6.92592 1.0740799903869629 1.1536478257496583 +1465 5 5.75080967 0.75080966949462891 0.56371515980663389 +1470 7 6.94059563 0.059404373168945313 0.0035288795515953097 +1471 6 6.187877 0.18787717819213867 0.035297834085440627 +1474 4 4.706076 0.70607614517211914 0.49854352278111946 +1478 6 6.05484343 0.054843425750732422 0.0030078013480761001 +1480 6 5.97576237 0.024237632751464844 0.00058746284139488125 +1482 6 5.6252265 0.37477350234985352 0.14045517806357566 +1484 3 5.265096 2.2650961875915527 5.1306607390417867 +1485 6 5.49697828 0.5030217170715332 0.2530308478455936 +1486 6 5.66257668 0.33742332458496094 0.1138544999739679 +1488 6 5.62225533 0.37774467468261719 0.14269103925107629 +1489 5 5.447718 0.44771814346313477 0.20045153598607612 +1492 5 5.587722 0.58772182464599609 0.34541694316521898 +1494 8 6.77752161 1.2224783897399902 1.4944534133812795 +1495 7 6.81155968 0.18844032287597656 0.035509755285602296 +1498 6 5.93317366 0.066826343536376953 0.0044657601904418698 +1502 5 5.409653 0.4096531867980957 0.16781573345383549 +1503 7 6.489947 0.51005315780639648 0.26015422378827679 +1505 7 5.30349255 1.696507453918457 2.8781375412008856 +1506 6 6.09120464 0.091204643249511719 0.0083182869502707035 +1508 6 5.44468641 0.5553135871887207 0.30837318011640491 +1509 5 5.788155 0.78815507888793945 0.62118842837685406 +1510 5 5.76694965 0.76694965362548828 0.58821177119625645 +1511 6 5.69408131 0.30591869354248047 0.093586247058738081 +1514 7 6.561585 0.4384150505065918 0.19220775651069744 +1518 6 5.993828 0.00617218017578125 3.8095808122307062E-05 +1519 5 5.7571373 0.75713729858398438 0.57325688890705351 +1521 5 5.409653 0.4096531867980957 0.16781573345383549 +1522 5 6.08686972 1.0868697166442871 1.181285780958433 +1523 6 5.97075748 0.029242515563964844 0.00085512471650872612 +1524 6 5.48240471 0.51759529113769531 0.26790488540791557 +1525 5 5.188568 0.188568115234375 0.035557934083044529 +1528 6 6.077338 0.077338218688964844 0.005981200069982151 +1529 6 5.48240471 0.51759529113769531 0.26790488540791557 +1531 7 5.76033354 1.2396664619445801 1.536772936870193 +1534 6 5.88148546 0.1185145378112793 0.01404569567262115 +1535 6 5.831912 0.16808795928955078 0.028253562058125681 +1536 5 5.113925 0.11392498016357422 0.012978901105270779 +1537 6 5.46942472 0.53057527542114258 0.2815101228882213 +1539 6 6.008886 0.0088858604431152344 7.8958515814520069E-05 +1541 4 4.825052 0.82505178451538086 0.68071044713201445 +1544 5 5.113925 0.11392498016357422 0.012978901105270779 +1545 6 6.576745 0.57674503326416016 0.33263483339487721 +1546 6 5.71939373 0.28060626983642578 0.078739878671512997 +1547 6 5.71939373 0.28060626983642578 0.078739878671512997 +1548 6 7.57207346 1.5720734596252441 2.4714149624580841 +1550 6 5.99755526 0.0024447441101074219 5.9767737639049301E-06 +1553 7 6.208527 0.7914729118347168 0.62642937016812539 +1555 7 6.55556 0.44443988800048828 0.19752681404588657 +1556 6 6.01286459 0.012864589691162109 0.00016549766792195442 +1557 6 5.99755526 0.0024447441101074219 5.9767737639049301E-06 +1558 4 5.386171 1.3861708641052246 1.9214696644942251 +1563 6 6.553794 0.55379390716552734 0.30668769161366072 +1565 6 5.9825325 0.017467498779296875 0.00030511351360473782 +1566 5 6.17159033 1.1715903282165527 1.3726238971705698 +1568 6 5.727659 0.27234077453613281 0.074169497474940727 +1570 5 5.420094 0.42009401321411133 0.17647897993833794 +1574 4 5.65801764 1.658017635345459 2.7490224791165474 +1575 6 5.65997028 0.34002971649169922 0.11562020809742535 +1577 4 5.276046 1.2760457992553711 1.6282928817972788 +1579 4 5.450556 1.4505558013916016 2.1041121329508314 +1582 7 6.032928 0.9670720100402832 0.93522827260335362 +1583 5 5.13851166 0.13851165771484375 0.019185479322914034 +1584 6 5.304762 0.69523811340332031 0.48335603432860808 +1586 5 5.18219042 0.1821904182434082 0.033193348499708009 +1590 6 6.906599 0.90659904479980469 0.82192182803191827 +1591 6 6.93632364 0.93632364273071289 0.87670196393651167 +1593 6 5.05398464 0.94601535797119141 0.89494505751736142 +1594 6 5.53434753 0.4656524658203125 0.2168322189245373 +1595 6 5.47930336 0.52069664001464844 0.27112499092254438 +1601 6 5.34099054 0.65900945663452148 0.43429346393372725 +1602 5 6.63619566 1.6361956596374512 2.677136236616434 +1604 5 5.01126766 0.011267662048339844 0.00012696020803559804 +1605 9 6.93166 2.0683398246765137 4.2780296303428713 +1606 6 6.49907351 0.49907350540161133 0.24907436379385217 +1608 5 5.16369724 0.16369724273681641 0.026796787279636192 +1611 6 5.64973164 0.35026836395263672 0.12268792678605678 +1612 7 5.99648 1.0035200119018555 1.0070524142875001 +1614 5 5.79273653 0.79273653030395508 0.62843120647835349 +1615 6 6.422241 0.4222412109375 0.17828764021396637 +1618 6 4.82879448 1.1712055206298828 1.3717223715539149 +1620 7 5.99648 1.0035200119018555 1.0070524142875001 +1622 6 4.932357 1.0676431655883789 1.1398619290275747 +1624 7 5.93193245 1.0680675506591797 1.1407682927710994 +1625 6 6.15797472 0.1579747200012207 0.02495601215946408 +1627 5 5.09917068 0.099170684814453125 0.0098348247265676036 +1630 5 4.88835955 0.11164045333862305 0.01246359082165327 +1631 6 6.06227827 0.062278270721435547 0.0038785830040524161 +1635 6 5.59236431 0.40763568878173828 0.16616685476856219 +1637 6 6.312566 0.31256580352783203 0.097697381534999295 +1638 5 4.97513056 0.024869441986083984 0.00061848914469919691 +1640 5 5.26559353 0.26559352874755859 0.070539922512580233 +1643 7 5.743971 1.2560291290283203 1.5776091729676409 +1645 7 5.89232731 1.1076726913452148 1.2269387911519516 +1648 5 6.52520132 1.5252013206481934 2.3262390685069931 +1649 4 5.402714 1.4027137756347656 1.9676059363555396 +1650 7 6.83081436 0.16918563842773438 0.02862378025020007 +1652 4 5.73360443 1.7336044311523438 3.0053843237110414 +1661 6 5.54768658 0.45231342315673828 0.20458743276776659 +1662 7 5.839347 1.1606531143188477 1.34711565177804 +1666 5 5.10381126 0.10381126403808594 0.010776778541185195 +1670 6 5.53445244 0.46554756164550781 0.2167345321540779 +1671 7 6.4646616 0.53533840179443359 0.28658720443581842 +1672 5 5.54212427 0.54212427139282227 0.29389872563319841 +1675 5 5.49875832 0.49875831604003906 0.24875985781909549 +1676 7 6.4646616 0.53533840179443359 0.28658720443581842 +1678 6 5.893253 0.10674715042114258 0.01139495412303404 +1682 7 6.325238 0.67476177215576172 0.45530344916278409 +1683 7 6.325238 0.67476177215576172 0.45530344916278409 +1686 5 5.67819548 0.67819547653198242 0.45994910438844272 +1687 7 6.003312 0.99668788909912109 0.99338674827686191 +1689 6 6.36480761 0.3648076057434082 0.13308458920823796 +1691 7 6.325238 0.67476177215576172 0.45530344916278409 +1692 6 6.534476 0.53447580337524414 0.28566438439361264 +1693 5 5.35202169 0.35202169418334961 0.12391927317571572 +1694 6 5.785526 0.21447420120239258 0.045999182981404374 +1695 6 6.31205273 0.31205272674560547 0.097376904269367515 +1696 6 5.672015 0.32798480987548828 0.1075740355090602 +1698 6 6.534476 0.53447580337524414 0.28566438439361264 +1700 6 6.17246342 0.17246341705322266 0.029743630221673811 +1703 5 5.34564161 0.3456416130065918 0.11946812464179857 +1705 6 6.7654047 0.76540470123291016 0.58584435666944046 +1708 4 5.439889 1.4398889541625977 2.0732802003194593 +1710 5 5.2302 0.23019981384277344 0.052991954293247545 +1712 6 5.777736 0.22226381301879883 0.049401202577655567 +1717 6 5.55541563 0.44458436965942383 0.19765526174546721 +1718 4 5.02554274 1.0255427360534668 1.0517379034720307 +1722 6 6.04382038 0.043820381164550781 0.0019202258054065169 +1726 6 6.851109 0.85110902786254883 0.72438657730913292 +1727 6 5.45301056 0.54698944091796875 0.29919744847575203 +1729 6 6.64549351 0.64549350738525391 0.41666186807651684 +1730 6 5.684866 0.31513404846191406 0.099309468499996001 +1732 5 5.67953 0.67953014373779297 0.46176121624830557 +1733 6 5.80405474 0.19594526290893555 0.038394546056451873 +1737 6 5.75306463 0.24693536758422852 0.060977075763958055 +1738 5 5.839874 0.8398737907409668 0.70538798437360128 +1741 6 6.81806326 0.81806325912475586 0.66922749592981745 +1742 6 5.68590355 0.31409645080566406 0.098656580408714944 +1745 5 4.99210072 0.0078992843627929688 6.2398693444265518E-05 +1750 6 6.551964 0.55196380615234375 0.30466404330218211 +1751 7 6.395873 0.60412693023681641 0.36496934783735924 +1752 6 5.692622 0.30737781524658203 0.094481121305761917 +1757 5 5.09984255 0.099842548370361328 0.0099685344650879415 +1759 5 4.684496 0.31550407409667969 0.099542820771603147 +1760 6 5.528948 0.47105216979980469 0.22189014667310403 +1761 6 5.559502 0.44049787521362305 0.19403837806771662 +1762 7 6.353659 0.64634084701538086 0.41775649052055996 +1763 6 5.96684837 0.033151626586914063 0.0010990303453581873 +1764 5 5.25088 0.25087976455688477 0.062940656264117933 +1766 5 5.003823 0.0038228034973144531 1.4613826579079614E-05 +1769 7 6.535719 0.46428108215332031 0.21555692324545817 +1770 6 5.67120647 0.32879352569580078 0.10810518253947521 +1771 6 5.99136829 0.0086317062377929688 7.4506352575554047E-05 +1777 6 5.99136829 0.0086317062377929688 7.4506352575554047E-05 +1778 8 7.7493763 0.25062370300292969 0.062812240506900707 +1780 5 6.034183 1.0341830253601074 1.0695345299429846 +1781 4 5.52017832 1.5201783180236816 2.3109421185893098 +1782 6 6.0583744 0.058374404907226563 0.0034075711482728366 +1786 7 6.37066031 0.62933969497680664 0.39606845167350002 +1787 7 6.90712833 0.092871665954589844 0.0086251463371809223 +1790 5 5.274954 0.27495384216308594 0.075599615320243174 +1791 5 5.577743 0.5777430534362793 0.33378703579387548 +1792 6 5.61199474 0.38800525665283203 0.15054807919023006 +1793 5 5.126741 0.12674093246459961 0.016063263961996199 +1796 5 6.383996 1.3839960098266602 1.9154449552161168 +1797 8 6.65697432 1.3430256843566895 1.803717988841754 +1798 6 5.957332 0.042667865753173828 0.001820546767930864 +1799 6 6.017667 0.017666816711425781 0.00031211641271511326 +1804 6 5.379597 0.62040281295776367 0.3848996503259059 +1806 5 5.07963467 0.079634666442871094 0.0063416800994673395 +1807 6 5.63211966 0.36788034439086914 0.13533594778914448 +1808 5 5.27121639 0.27121639251708984 0.073558331569984148 +1809 6 5.63211966 0.36788034439086914 0.13533594778914448 +1811 5 5.07963467 0.079634666442871094 0.0063416800994673395 +1813 6 6.01981449 0.019814491271972656 0.00039261406436708057 +1815 6 5.7096796 0.29032039642333984 0.084285932579405198 +1819 6 6.7962656 0.79626560211181641 0.63403890910649352 +1820 6 5.7096796 0.29032039642333984 0.084285932579405198 +1822 7 7.000497 0.00049686431884765625 2.4687415134394541E-07 +1833 7 6.684526 0.31547403335571289 0.09952386572172145 +1834 6 5.58879 0.41121006011962891 0.16909371354358882 +1837 7 6.620609 0.37939119338989258 0.14393767762180687 +1838 6 5.25579643 0.74420356750488281 0.55383894988699467 +1839 6 5.69494152 0.30505847930908203 0.09306067579836963 +1840 5 5.98602247 0.9860224723815918 0.97224031604150696 +1842 6 6.12460756 0.12460756301879883 0.015527044761483921 +1846 5 5.52307034 0.52307033538818359 0.27360257576310687 +1848 5 4.607618 0.39238214492797852 0.15396374765828114 +1849 6 6.30588961 0.30588960647583008 0.093568451349938186 +1850 7 6.00497246 0.99502754211425781 0.9900798095659411 +1851 6 6.067011 0.067010879516601563 0.0044904579735884909 +1852 7 6.1998477 0.80015230178833008 0.64024370605716285 +1853 5 5.065463 0.065463066101074219 0.0042854130233536125 +1855 6 5.905511 0.094489097595214844 0.0089281895643580356 +1856 4 4.58664846 0.58664846420288086 0.34415642055159879 +1857 5 4.86528444 0.13471555709838867 0.018148281324329218 +1860 6 5.79932547 0.20067453384399414 0.04027026853350435 +1864 6 6.284785 0.28478479385375977 0.081102378810328446 +1865 6 5.532091 0.46790885925292969 0.21893870056737796 +1869 7 6.080062 0.91993808746337891 0.84628608476577938 +1870 6 5.981809 0.018190860748291016 0.00033090741476371477 +1872 5 5.009711 0.0097107887268066406 9.4299417696674936E-05 +1875 5 5.46236658 0.46236658096313477 0.21378285519153906 +1880 5 5.258416 0.25841617584228516 0.066778919936950842 +1881 6 5.86735439 0.13264560699462891 0.017594857054973545 +1882 5 5.258416 0.25841617584228516 0.066778919936950842 +1886 5 4.814584 0.18541622161865234 0.034379175239337201 +1891 5 5.142381 0.14238119125366211 0.020272403622811908 +1893 5 5.12605667 0.12605667114257813 0.015890284339548089 +1895 6 5.542293 0.45770692825317383 0.20949563217095601 +1896 6 5.438239 0.56176090240478516 0.31557531147063855 +1897 6 5.438239 0.56176090240478516 0.31557531147063855 +1898 6 4.979807 1.0201930999755859 1.0407939612377959 +1904 6 5.542293 0.45770692825317383 0.20949563217095601 +1907 7 6.702694 0.29730606079101563 0.088390893783071078 +1908 7 6.76456976 0.23543024063110352 0.055427398203619305 +1909 5 5.86436367 0.86436367034912109 0.74712455461940408 +1910 5 5.34539843 0.3453984260559082 0.11930007272189869 +1911 6 5.993113 0.0068869590759277344 4.7430205313503393E-05 +1912 6 6.007423 0.0074229240417480469 5.509980132956116E-05 +1913 6 5.67044 0.3295598030090332 0.10860966375935277 +1914 6 6.594901 0.59490108489990234 0.35390730081508082 +1915 7 6.76456976 0.23543024063110352 0.055427398203619305 +1916 5 5.34539843 0.3453984260559082 0.11930007272189869 +1918 6 5.74891472 0.25108528137207031 0.063043818521691719 +1920 7 5.75763226 1.2423677444458008 1.5434776124393466 +1922 5 5.731976 0.73197603225708008 0.53578891179881794 +1923 5 4.71941042 0.28058958053588867 0.078730512705305955 +1925 6 5.954923 0.045076847076416016 0.0020319221423505951 +1926 6 5.920651 0.079349040985107422 0.0062962703052562574 +1927 5 5.80981636 0.80981636047363281 0.6558025376907608 +1929 5 5.25512838 0.25512838363647461 0.065090492136960165 +1930 6 5.70013952 0.29986047744750977 0.089916305935048513 +1931 3 5.116358 2.1163578033447266 4.4789703517781163 +1933 5 5.0376873 0.037687301635742188 0.0014203327045834158 +1938 5 5.9158864 0.91588640213012695 0.83884790160686862 +1940 5 4.86190462 0.13809537887573242 0.019070333666832084 +1941 5 5.38696527 0.38696527481079102 0.14974212390939101 +1943 5 5.79620075 0.79620075225830078 0.63393563789668406 +1944 5 5.049108 0.049108028411865234 0.0024115984545005631 +1946 6 5.31514931 0.68485069274902344 0.4690204713588173 +1948 7 6.25940466 0.74059534072875977 0.54848145870914777 +1949 5 5.18440056 0.18440055847167969 0.034003565964667359 +1950 5 5.345883 0.34588289260864258 0.11963497539932177 +1951 4 4.95812225 0.95812225341796875 0.91799825249472633 +1952 7 6.54604959 0.45395040512084961 0.20607097030938348 +1953 6 6.370929 0.37092876434326172 0.13758814821721899 +1955 5 5.42086029 0.42086029052734375 0.17712338414276019 +1959 5 5.453207 0.45320701599121094 0.20539659934365773 +1960 5 5.453207 0.45320701599121094 0.20539659934365773 +1966 6 5.371932 0.62806797027587891 0.39446937528646231 +1969 7 6.85478354 0.14521646499633789 0.021087821706032628 +1970 6 5.39096928 0.60903072357177734 0.37091842225436267 +1972 5 5.68259859 0.68259859085083008 0.46594083623153892 +1974 5 5.24890041 0.24890041351318359 0.061951415847033786 +1975 6 5.479768 0.52023220062255859 0.27064154256459005 +1977 6 5.80837154 0.19162845611572266 0.036721465193295444 +1978 6 5.28652048 0.71347951889038086 0.50905302387604934 +1979 6 5.296408 0.70359182357788086 0.49504145420564782 +1980 8 7.485046 0.5149540901184082 0.26517771492967768 +1982 8 7.485046 0.5149540901184082 0.26517771492967768 +1984 8 7.485046 0.5149540901184082 0.26517771492967768 +1985 6 5.973269 0.026731014251708984 0.00071454712292506883 +1986 6 5.805167 0.19483280181884766 0.037959820664582367 +1989 7 6.82315636 0.17684364318847656 0.031273674136173213 +1990 4 5.207319 1.2073187828063965 1.4576186433171188 +1992 5 5.926482 0.92648220062255859 0.85836926807041891 +1993 6 5.79101229 0.20898771286010742 0.043675864126498709 +1996 6 6.06539965 0.065399646759033203 0.0042771137962063221 +1997 6 6.0473156 0.047315597534179688 0.0022387657700164709 +1998 6 6.0473156 0.047315597534179688 0.0022387657700164709 +2001 5 5.064017 0.064016819000244141 0.0040981531149100192 +2002 6 6.60353136 0.6035313606262207 0.36425010325933727 +2003 6 5.79101229 0.20898771286010742 0.043675864126498709 +2004 6 6.215163 0.21516323089599609 0.046295215929603728 +2005 6 6.06539965 0.065399646759033203 0.0042771137962063221 +2007 6 5.89332438 0.10667562484741211 0.011379688936585808 +2008 5 6.035252 1.0352520942687988 1.0717468986879339 +2011 5 6.035252 1.0352520942687988 1.0717468986879339 +2019 6 5.73516369 0.26483631134033203 0.07013827180435328 +2022 6 5.48330927 0.51669073104858398 0.26696931155152015 +2024 5 4.992839 0.0071611404418945313 5.1281932428537402E-05 +2025 5 5.26053953 0.26053953170776367 0.067880847582500792 +2027 5 5.107182 0.10718202590942383 0.011487986678048401 +2028 6 5.429237 0.57076311111450195 0.3257705290091053 +2029 6 5.48330927 0.51669073104858398 0.26696931155152015 +2031 5 5.71048927 0.71048927307128906 0.50479500714936876 +2032 6 5.723135 0.27686500549316406 0.076654231266729767 +2034 5 5.869266 0.86926603317260742 0.75562343642764063 +2035 5 5.689244 0.68924379348754883 0.47505700686110686 +2037 5 5.71048927 0.71048927307128906 0.50479500714936876 +2038 5 5.53941774 0.53941774368286133 0.29097150219990908 +2039 5 5.17752075 0.177520751953125 0.031513617374002934 +2043 6 6.26886225 0.26886224746704102 0.072286908113028403 +2048 5 5.2710104 0.27101039886474609 0.073446636292828771 +2050 3 5.012742 2.0127420425415039 4.0511305298141451 +2051 5 5.20824671 0.20824670791625977 0.043366691357960008 +2052 5 5.20824671 0.20824670791625977 0.043366691357960008 +2057 7 6.78188 0.21812009811401367 0.047576377201266951 +2058 5 5.42770338 0.4277033805847168 0.1829301817635951 +2060 5 5.69225931 0.69225931167602539 0.47922295460216446 +2061 6 6.217498 0.21749782562255859 0.047305304150540906 +2062 5 6.018735 1.0187349319458008 1.0378208615666153 +2063 5 5.508641 0.50864076614379883 0.25871542898335065 +2064 6 5.61093235 0.38906764984130859 0.15137363615303912 +2065 5 5.69977331 0.69977331161499023 0.48968268764861023 +2066 5 5.49579334 0.49579334259033203 0.24581103855689435 +2067 5 5.51807261 0.51807260513305664 0.26839922418935203 +2069 7 6.47043943 0.52956056594848633 0.28043439300768114 +2070 6 5.740727 0.25927305221557617 0.067222515605180888 +2071 6 5.88474464 0.11525535583496094 0.013283797048643464 +2073 5 5.25647974 0.25647974014282227 0.065781857103729635 +2074 6 5.61093235 0.38906764984130859 0.15137363615303912 +2076 5 5.427954 0.42795419692993164 0.18314479466994271 +2078 6 6.103273 0.10327291488647461 0.010665294949149029 +2079 4 5.63887072 1.6388707160949707 2.6858972240736421 +2080 5 5.427954 0.42795419692993164 0.18314479466994271 +2082 6 5.593912 0.40608787536621094 0.16490736251944327 +2084 6 6.01919174 0.019191741943359375 0.00036832295882049948 +2085 6 6.01919174 0.019191741943359375 0.00036832295882049948 +2086 5 5.72145462 0.72145462036132813 0.52049676924070809 +2087 6 6.13345 0.13345003128051758 0.01780891084877112 +2089 6 6.01919174 0.019191741943359375 0.00036832295882049948 +2090 5 5.169893 0.16989278793334961 0.028863559391766103 +2091 5 5.49635267 0.4963526725769043 0.24636597557423556 +2094 5 5.393815 0.39381504058837891 0.15509028619362653 +2096 5 4.93707228 0.062927722930908203 0.0039598983132691501 +2097 5 5.69649458 0.69649457931518555 0.48510469901543729 +2099 5 5.89435 0.89435005187988281 0.79986201529754908 +2102 5 5.21029234 0.21029233932495117 0.044222867978760405 +2103 5 5.43867159 0.43867158889770508 0.19243276290603717 +2104 5 5.89435 0.89435005187988281 0.79986201529754908 +2106 5 5.18669176 0.1866917610168457 0.034853813631571029 +2110 5 5.3566494 0.35664939880371094 0.12719879366704845 +2111 5 5.3566494 0.35664939880371094 0.12719879366704845 +2112 5 5.3566494 0.35664939880371094 0.12719879366704845 +2113 5 5.14198542 0.14198541641235352 0.020159858473789427 +2114 6 6.12237 0.12236976623535156 0.014974359688494587 +2115 5 5.3566494 0.35664939880371094 0.12719879366704845 +2116 4 6.222515 2.2225151062011719 4.9395733972924063 +2118 6 5.98331451 0.01668548583984375 0.00027840543771162629 +2120 5 5.83379126 0.83379125595092773 0.69520785850022548 +2121 7 6.72408 0.27591991424560547 0.076131799077302276 +2122 5 5.536666 0.53666591644287109 0.2880103058714667 +2123 5 5.83379126 0.83379125595092773 0.69520785850022548 +2124 7 6.72408 0.27591991424560547 0.076131799077302276 +2125 5 5.504136 0.50413608551025391 0.25415319271360204 +2128 6 5.11005926 0.88994073867797852 0.79199451835870605 +2129 5 5.92302132 0.92302131652832031 0.85196835076567368 +2131 6 5.55115 0.44885015487670898 0.20146646153284564 +2132 6 5.55115 0.44885015487670898 0.20146646153284564 +2134 6 5.93478727 0.065212726593017578 0.004252699709695662 +2136 6 6.01020527 0.010205268859863281 0.0001041475125020952 +2137 5 5.7383213 0.73832130432128906 0.54511834841468954 +2139 5 5.07746649 0.077466487884521484 0.0060010567451627139 +2142 5 5.49341869 0.49341869354248047 0.24346200713716826 +2143 7 6.608935 0.39106512069702148 0.15293192862577598 +2146 6 5.70015049 0.29984951019287109 0.089909728762904706 +2147 5 5.44971561 0.44971561431884766 0.20224413376217854 +2148 5 5.07746649 0.077466487884521484 0.0060010567451627139 +2150 6 6.55059433 0.55059432983398438 0.30315411604533438 +2152 6 5.93261766 0.067382335662841797 0.0045403791593798815 +2157 6 6.08861732 0.088617324829101563 0.0078530302598665003 +2158 6 5.33268738 0.6673126220703125 0.44530613557435572 +2161 7 6.74377155 0.25622844696044922 0.065653017031763738 +2162 6 4.75042868 1.2495713233947754 1.5614284922505703 +2166 5 5.28467369 0.28467369079589844 0.081039110231358791 +2167 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2168 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2171 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2172 5 5.01180124 0.011801242828369141 0.00013926933229413407 +2173 5 5.22546339 0.2254633903503418 0.050833740388270598 +2174 7 6.92975569 0.070244312286376953 0.0049342634085860482 +2176 5 5.01180124 0.011801242828369141 0.00013926933229413407 +2179 6 5.932353 0.067646980285644531 0.0045761139417663799 +2182 5 5.69115925 0.69115924835205078 0.47770110658257181 +2184 6 6.046692 0.04669189453125 0.0021801330149173737 +2186 5 4.99832344 0.0016765594482421875 2.8108515834901482E-06 +2189 6 6.404397 0.40439701080322266 0.16353694234658178 +2192 6 5.53746462 0.46253538131713867 0.21393897897019087 +2197 6 6.46665955 0.4666595458984375 0.2177711317781359 +2198 5 5.16137743 0.1613774299621582 0.026042674901191276 +2201 6 5.700198 0.29980182647705078 0.089881135158975667 +2202 5 5.16137743 0.1613774299621582 0.026042674901191276 +2203 5 5.47646475 0.47646474838256836 0.22701865645126418 +2204 5 5.351197 0.3511967658996582 0.12333916837837933 +2205 5 5.522396 0.52239608764648438 0.27289767238835339 +2206 6 5.58879 0.41121006011962891 0.16909371354358882 +2209 6 6.157562 0.1575617790222168 0.024825714208645877 +2210 7 5.705906 1.2940940856933594 1.6746795026265318 +2211 6 5.65906954 0.34093046188354492 0.11623357984012728 +2215 6 5.562096 0.43790388107299805 0.19175980905879442 +2216 5 5.402029 0.40202903747558594 0.16162734697354608 +2219 7 6.70257664 0.29742336273193359 0.088460656698771345 +2222 7 6.04341 0.95659017562866211 0.91506476410927462 +2224 7 6.04341 0.95659017562866211 0.91506476410927462 +2226 5 5.322302 0.32230186462402344 0.10387849194012233 +2227 5 5.273082 0.27308177947998047 0.074573658283952682 +2232 6 5.48561 0.51438999176025391 0.26459706362311408 +2233 5 5.79209232 0.79209232330322266 0.62741024863589701 +2235 6 5.46630526 0.53369474411010742 0.28483007989075304 +2238 6 5.868995 0.13100481033325195 0.017162260330451318 +2239 6 5.46630526 0.53369474411010742 0.28483007989075304 +2240 5 5.22449732 0.22449731826782227 0.050399045909443885 +2241 5 5.286269 0.28626918792724609 0.081950047956524941 +2245 7 5.857095 1.1429052352905273 1.3062323768544957 +2247 6 5.868995 0.13100481033325195 0.017162260330451318 +2252 5 5.27887154 0.27887153625488281 0.077769333733158419 +2253 5 5.112074 0.11207389831542969 0.012560558683617273 +2254 6 5.564041 0.4359588623046875 0.19006012962199748 +2255 6 5.67652464 0.32347536087036133 0.10463630909021049 +2258 5 5.041592 0.041592121124267578 0.0017299045396157453 +2259 6 5.44358349 0.55641651153564453 0.30959933430949604 +2260 5 5.041592 0.041592121124267578 0.0017299045396157453 +2266 5 5.3401947 0.3401947021484375 0.11573243536986411 +2267 6 6.28939629 0.28939628601074219 0.083750210356811294 +2270 7 5.61781025 1.3821897506713867 1.9104485068610302 +2271 6 5.50590134 0.49409866333007813 0.24413348910456989 +2272 6 6.20042467 0.2004246711730957 0.04017004881484354 +2273 5 5.55797958 0.55797958374023438 0.31134121587092523 +2274 7 5.61781025 1.3821897506713867 1.9104485068610302 +2275 4 5.20286942 1.2028694152832031 1.446894830223755 +2276 6 5.06417942 0.93582057952880859 0.87576015706963517 +2278 6 5.06417942 0.93582057952880859 0.87576015706963517 +2280 6 5.82958651 0.17041349411010742 0.029040758974815617 +2282 5 4.960868 0.039132118225097656 0.0015313226767830201 +2283 5 4.960868 0.039132118225097656 0.0015313226767830201 +2284 5 4.960868 0.039132118225097656 0.0015313226767830201 +2285 5 4.960868 0.039132118225097656 0.0015313226767830201 +2287 5 4.939122 0.060877799987792969 0.0037061065313537256 +2289 7 6.850773 0.14922714233398438 0.022268740009167232 +2290 7 5.442205 1.5577950477600098 2.4267254108256111 +2291 6 6.19865465 0.1986546516418457 0.03946367061894307 +2292 6 5.148794 0.85120582580566406 0.72455135788550251 +2293 7 6.850773 0.14922714233398438 0.022268740009167232 +2295 6 5.170192 0.82980823516845703 0.68858170715338929 +2296 7 6.062081 0.93791913986206055 0.87969231291958749 +2297 6 5.743333 0.25666713714599609 0.065878019290721568 +2298 8 6.6889596 1.3110404014587402 1.7188269342570948 +2299 7 7.28213453 0.2821345329284668 0.079599894670764115 +2300 7 6.79692125 0.2030787467956543 0.04124097740009347 +2304 6 5.039255 0.96074485778808594 0.92303068176624947 +2306 5 5.22065544 0.22065544128417969 0.04868882376831607 +2310 5 5.378486 0.37848615646362305 0.14325177063460615 +2311 7 6.907369 0.092630863189697266 0.0085804768152684119 +2314 6 6.952427 0.95242691040039063 0.90711701965483371 +2315 6 6.085919 0.085918903350830078 0.00738205795300928 +2317 5 5.5054183 0.50541830062866211 0.25544765861036467 +2318 4 5.44983768 1.4498376846313477 2.1020293117771871 +2319 7 6.905406 0.094594001770019531 0.0089480251708664582 +2321 5 5.564613 0.56461286544799805 0.31878768782939915 +2324 5 5.28028536 0.28028535842895508 0.078559882149647819 +2327 6 5.360427 0.63957309722900391 0.40905374669910088 +2328 5 5.44725466 0.44725465774536133 0.2000367288749203 +2329 5 5.23106432 0.2310643196105957 0.053390719797107522 +2331 5 5.563631 0.56363105773925781 0.31767996924827457 +2332 6 5.479902 0.52009820938110352 0.27050214740143019 +2333 8 7.33445263 0.66554737091064453 0.44295330292607105 +2334 5 5.46037626 0.46037626266479492 0.21194630322520425 +2335 5 5.863933 0.86393308639526367 0.74638037776844612 +2336 5 5.045481 0.045481204986572266 0.0020685400070306059 +2337 4 5.42458248 1.4245824813842773 2.0294352462669849 +2338 5 5.51501942 0.51501941680908203 0.26524499969036697 +2339 6 5.765536 0.23446416854858398 0.054973446333178799 +2340 6 5.9685955 0.031404495239257813 0.00098624232123256661 +2342 8 6.636878 1.3631219863891602 1.8581015497775297 +2344 6 5.765536 0.23446416854858398 0.054973446333178799 +2345 6 5.700315 0.29968500137329102 0.089811100048109438 +2347 6 6.155386 0.15538597106933594 0.024144800005160505 +2349 5 5.10179329 0.10179328918457031 0.010361873723013559 +2350 5 5.512929 0.51292896270751953 0.26309612078421196 +2351 6 5.85234976 0.14765024185180664 0.021800593918896993 +2355 7 6.029962 0.97003793716430664 0.94097359953798332 +2358 5 5.204894 0.20489406585693359 0.041981578223385441 +2359 5 5.25028229 0.25028228759765625 0.062641223485115916 +2365 5 5.20540667 0.20540666580200195 0.042191898355895319 +2366 5 5.31656742 0.31656742095947266 0.10021493201293197 +2367 6 5.47557354 0.52442646026611328 0.27502311222724529 +2370 7 6.327482 0.67251777648925781 0.45228015969405533 +2374 6 6.422069 0.42206907272338867 0.17814230214958116 +2375 6 6.931272 0.93127202987670898 0.86726759363068595 +2376 6 6.422069 0.42206907272338867 0.17814230214958116 +2379 4 4.756755 0.75675487518310547 0.57267794111339754 +2380 4 4.45949 0.45948982238769531 0.21113089687787578 +2381 6 5.986179 0.013821125030517578 0.00019102349710919952 +2383 6 6.14936352 0.14936351776123047 0.02230946043800941 +2386 4 5.41926 1.4192600250244141 2.0142990186323004 +2387 4 5.4051466 1.405146598815918 1.9744369641639423 +2389 8 6.94480133 1.0551986694335938 1.1134442319744267 +2391 6 6.00016 0.00016021728515625 2.5669578462839127E-08 +2392 7 5.617188 1.3828120231628418 1.9121690914037117 +2393 6 5.617188 0.3828120231628418 0.14654504507802812 +2396 5 5.256116 0.25611591339111328 0.065595361092164239 +2401 4 5.10378027 1.1037802696228027 1.2183308836085871 +2403 6 5.75654268 0.24345731735229492 0.059271465372376042 +2406 6 6.770986 0.77098608016967773 0.59441953581540474 +2415 5 5.52892637 0.52892637252807617 0.27976310755570921 +2419 5 5.28138256 0.28138256072998047 0.079176145482961147 +2420 7 6.67350435 0.32649564743041992 0.10659940779100907 +2422 5 4.03719425 0.96280574798583984 0.92699490835457254 +2423 6 5.645845 0.35415506362915039 0.12542580909416756 +2424 5 4.03719425 0.96280574798583984 0.92699490835457254 +2426 6 6.25219631 0.25219631195068359 0.063602979761526512 +2427 6 5.3982296 0.60177040100097656 0.36212761552087613 +2428 6 6.25219631 0.25219631195068359 0.063602979761526512 +2429 6 5.3982296 0.60177040100097656 0.36212761552087613 +2430 5 5.12913275 0.12913274765014648 0.016675266515676412 +2431 5 5.05260849 0.052608489990234375 0.0027676532190525904 +2433 6 4.791566 1.2084341049194336 1.4603129859324326 +2435 4 5.59644747 1.5964474678039551 2.5486445174576602 +2436 5 5.067692 0.067691802978515625 0.0045821801904821768 +2437 6 5.689383 0.31061697006225586 0.096482902090656353 +2439 6 6.093392 0.093391895294189453 0.0087220461066408461 +2440 5 5.38602734 0.38602733612060547 0.14901710423237091 +2441 6 6.452305 0.45230484008789063 0.20457966836693231 +2443 5 5.30036068 0.30036067962646484 0.090216537865671853 +2444 5 5.296285 0.29628515243530273 0.087784891553610578 +2450 5 4.968459 0.031540870666503906 0.00099482652240112657 +2452 7 6.529565 0.47043514251708984 0.22130922331507463 +2453 6 6.33554029 0.3355402946472168 0.11258728933194107 +2455 6 5.79571867 0.20428133010864258 0.041730861830956201 +2456 6 5.56070232 0.43929767608642578 0.19298244821493427 +2459 5 5.270118 0.27011823654174805 0.07296386171242375 +2461 5 4.9582386 0.041761398315429688 0.0017440143892599735 +2464 5 5.31435633 0.31435632705688477 0.098819900360695101 +2465 5 5.03994131 0.039941310882568359 0.0015953083150179737 +2466 5 5.08337355 0.083373546600341797 0.0069511482727193652 +2467 6 5.568081 0.43191909790039063 0.18655410713108722 +2470 5 5.535125 0.53512477874755859 0.28635852882962354 +2472 6 5.576354 0.42364597320556641 0.17947591061329149 +2475 5 4.41602135 0.58397865295410156 0.34103106710608699 +2477 7 6.26229572 0.73770427703857422 0.54420760036100546 +2478 6 5.454049 0.54595088958740234 0.29806237384127598 +2483 6 5.454049 0.54595088958740234 0.29806237384127598 +2486 5 5.928272 0.92827177047729492 0.8616884798650517 +2488 6 6.42370558 0.4237055778503418 0.17952641670149205 +2495 5 5.980746 0.98074579238891602 0.96186230928856276 +2496 5 5.86902666 0.86902666091918945 0.75520733738835588 +2499 6 6.260035 0.26003503799438477 0.067618220984741129 +2502 4 5.1143384 1.1143383979797363 1.2417500652120452 +2503 4 5.1143384 1.1143383979797363 1.2417500652120452 +2504 6 5.21815968 0.78184032440185547 0.6112742928607986 +2505 6 5.03083229 0.96916770935058594 0.93928604884786182 +2511 6 5.4982357 0.50176429748535156 0.25176741023096838 +2512 6 5.612169 0.38783121109008789 0.15041304829560431 +2513 5 5.13564 0.13564014434814453 0.018398248758785485 +2514 7 6.95298 0.04701995849609375 0.0022108764969743788 +2517 6 5.57794857 0.42205142974853516 0.17812740935278271 +2518 7 6.791449 0.20855093002319336 0.043493490413538893 +2519 5 5.55116463 0.55116462707519531 0.30378244613893912 +2522 8 6.104276 1.895723819732666 3.5937688007018096 +2523 5 6.237401 1.237401008605957 1.5311612560990397 +2525 8 6.104276 1.895723819732666 3.5937688007018096 +2526 7 7.040822 0.040822029113769531 0.0016664380609654472 +2531 4 5.01932573 1.0193257331848145 1.0390249503327595 +2532 4 5.01932573 1.0193257331848145 1.0390249503327595 +2534 7 5.86961842 1.1303815841674805 1.2777625258249827 +2536 6 5.60501671 0.39498329162597656 0.15601180066369125 +2537 6 5.178944 0.82105588912963867 0.67413277307446151 +2538 6 5.178944 0.82105588912963867 0.67413277307446151 +2541 6 5.614379 0.38562107086181641 0.14870361029261403 +2545 6 5.877658 0.12234210968017578 0.014967591800996161 +2546 5 5.24112558 0.24112558364868164 0.058141547089917367 +2547 5 4.973504 0.026495933532714844 0.0007020344937700429 +2548 6 5.567487 0.43251323699951172 0.18706770017979579 +2551 6 5.567487 0.43251323699951172 0.18706770017979579 +2552 5 5.26310062 0.26310062408447266 0.069221938393638993 +2554 7 6.83249044 0.16750955581665039 0.028059451289891513 +2555 7 6.9097147 0.090285301208496094 0.0081514356143088662 +2556 5 5.60247326 0.60247325897216797 0.36297402777654497 +2557 7 6.83249044 0.16750955581665039 0.028059451289891513 +2558 7 6.9097147 0.090285301208496094 0.0081514356143088662 +2560 6 5.963154 0.036846160888671875 0.001357639572233893 +2562 6 5.963154 0.036846160888671875 0.001357639572233893 +2563 5 5.25828 0.25827980041503906 0.066708455302432412 +2564 6 5.21689034 0.78310966491699219 0.61326074728640378 +2566 7 6.128587 0.87141323089599609 0.7593610189805986 +2567 5 6.238179 1.2381792068481445 1.5330877482711003 +2568 6 5.407526 0.59247398376464844 0.3510254214379529 +2569 6 6.194025 0.19402503967285156 0.037645716020051623 +2571 6 6.41501474 0.41501474380493164 0.17223723757547305 +2574 5 5.635308 0.63530778884887695 0.40361598657204922 +2575 6 5.561543 0.43845701217651367 0.19224455152675546 +2579 6 5.722208 0.27779197692871094 0.07716838244596147 +2581 7 6.690846 0.30915403366088867 0.095576216528797886 +2583 7 6.690846 0.30915403366088867 0.095576216528797886 +2584 7 6.690846 0.30915403366088867 0.095576216528797886 +2586 7 6.690846 0.30915403366088867 0.095576216528797886 +2592 5 5.79668045 0.79668045043945313 0.63469974011240993 +2593 5 5.87219429 0.87219429016113281 0.76072287978968234 +2595 5 4.964598 0.035401821136474609 0.0012532889397789404 +2596 5 5.10914946 0.10914945602416992 0.011913603750372204 +2599 6 5.62042475 0.37957525253295898 0.14407737233545959 +2600 7 7.30414 0.30414009094238281 0.092501194918440888 +2602 6 6.401818 0.40181779861450195 0.16145754328340445 +2607 6 5.579085 0.42091512680053711 0.17716954396951223 +2609 6 5.292896 0.70710420608520508 0.49999635826338817 +2610 5 5.13112736 0.13112735748291016 0.017194383880450914 +2611 5 5.496989 0.49698877334594727 0.24699784083190934 +2612 7 6.89696455 0.10303544998168945 0.010616303952929229 +2617 7 6.94228029 0.057719707489013672 0.003331564632617301 +2618 7 6.28177166 0.71822834014892578 0.51585194859308103 +2619 6 5.39915 0.60085010528564453 0.36102084902177012 +2621 5 5.347756 0.34775590896606445 0.12093417222081371 +2623 7 6.94228029 0.057719707489013672 0.003331564632617301 +2626 7 6.28341341 0.71658658981323242 0.51349634070015782 +2628 6 5.57233238 0.42766761779785156 0.18289959131288924 +2633 5 5.747111 0.74711084365844727 0.55817461271203683 +2635 6 6.50639057 0.50639057159423828 0.25643141099953937 +2638 6 6.61158371 0.61158370971679688 0.37403463399095926 +2639 6 6.030149 0.030148983001708984 0.00090896117603733728 +2641 5 5.903246 0.90324592590332031 0.81585320266094641 +2644 6 6.09582567 0.095825672149658203 0.0091825594429337798 +2648 6 5.787987 0.21201276779174805 0.044949413706717678 +2650 5 5.39147425 0.39147424697875977 0.153252086047587 +2652 7 6.80050564 0.19949436187744141 0.039798000420887547 +2653 5 5.45156336 0.45156335830688477 0.20390946656539199 +2654 5 4.98665 0.013350009918212891 0.00017822276481638255 +2658 7 6.502366 0.49763393402099609 0.24763953228921309 +2660 6 5.36160755 0.63839244842529297 0.40754491820644034 +2661 6 6.14635 0.14634990692138672 0.021418295255898556 +2664 7 6.55731344 0.44268655776977539 0.19597138843005268 +2665 5 5.342439 0.34243917465209961 0.11726458833641118 +2666 7 7.11803436 0.11803436279296875 0.013932110799942166 +2668 6 6.28019142 0.28019142150878906 0.078507232687115902 +2669 5 5.39382172 0.39382171630859375 0.1550955442362465 +2670 7 7.11803436 0.11803436279296875 0.013932110799942166 +2674 7 5.861015 1.1389851570129395 1.2972871878957903 +2679 6 5.708907 0.29109287261962891 0.0847350604899475 +2680 6 6.65364027 0.6536402702331543 0.42724560287047098 +2681 6 6.35068655 0.35068655014038086 0.12298105644936186 +2683 5 5.26071072 0.26071071624755859 0.067970077566315013 +2694 6 5.9146595 0.085340499877929688 0.007283000919414917 +2697 5 5.87555742 0.87555742263793945 0.76660080033639133 +2698 6 5.506389 0.49361085891723633 0.24365168004101179 +2699 6 5.444553 0.55544710159301758 0.30852148266808399 +2700 7 6.026109 0.97389078140258789 0.94846325410094323 +2703 5 5.42530346 0.42530345916748047 0.18088303237982473 +2706 6 5.4116106 0.58838939666748047 0.34620208211072168 +2707 5 5.42530346 0.42530345916748047 0.18088303237982473 +2709 5 5.918651 0.91865110397338867 0.84391985083152576 +2710 5 5.918651 0.91865110397338867 0.84391985083152576 +2711 5 5.674193 0.67419290542602539 0.45453607372678562 +2712 5 5.732471 0.73247098922729492 0.53651375005961199 +2716 5 5.918651 0.91865110397338867 0.84391985083152576 +2717 6 5.926712 0.0732879638671875 0.0053711256477981806 +2718 6 5.66730261 0.33269739151000977 0.11068755431756472 +2721 5 5.484752 0.48475217819213867 0.23498467426202296 +2722 7 6.53023052 0.46976947784423828 0.22068336231404828 +2723 6 6.4047637 0.40476369857788086 0.16383365168644559 +2724 6 6.22072268 0.22072267532348633 0.04871849940195716 +2727 6 6.02800226 0.028002262115478516 0.00078412668358396331 +2728 6 5.65830135 0.34169864654541016 0.11675796505096514 +2729 7 6.48090172 0.51909828186035156 0.269463026230369 +2730 5 5.030326 0.030325889587402344 0.00091965957926731789 +2731 5 4.903098 0.096901893615722656 0.0093899769863128313 +2732 5 5.092683 0.092682838439941406 0.0085901085412842804 +2733 7 6.48090172 0.51909828186035156 0.269463026230369 +2739 7 6.84986925 0.1501307487487793 0.022539241719869096 +2740 6 5.629528 0.37047195434570313 0.13724946895672474 +2743 6 5.069488 0.9305119514465332 0.86585249178483537 +2744 6 5.069488 0.9305119514465332 0.86585249178483537 +2745 7 6.66979456 0.33020544052124023 0.10903563294982632 +2749 6 5.6916337 0.30836629867553711 0.09508977415885056 +2752 6 6.321662 0.32166194915771484 0.10346640953594033 +2753 8 5.90083933 2.0991606712341309 4.4064755236561268 +2754 5 5.001648 0.00164794921875 2.7157366275787354E-06 +2755 5 5.214188 0.2141880989074707 0.045876541713596453 +2756 6 5.120204 0.87979602813720703 0.77404105112600519 +2757 5 6.278562 1.278562068939209 1.6347209641301106 +2758 6 5.77940369 0.2205963134765625 0.04866273351944983 +2759 6 5.68099546 0.31900453567504883 0.1017638937812535 +2760 6 5.680106 0.31989383697509766 0.10233206693465036 +2761 5 5.40748549 0.4074854850769043 0.16604442054835999 +2762 5 5.307543 0.30754280090332031 0.094582574387459317 +2764 6 6.016877 0.016877174377441406 0.00028483901496656472 +2768 6 5.438565 0.56143522262573242 0.31520950920480573 +2769 5 5.307543 0.30754280090332031 0.094582574387459317 +2770 7 5.659925 1.3400750160217285 1.7958010485656359 +2771 6 5.661485 0.33851480484008789 0.11459227309592279 +2773 7 6.59006643 0.40993356704711914 0.16804552939197492 +2776 8 6.990417 1.0095829963684082 1.0192578265562133 +2778 7 6.59006643 0.40993356704711914 0.16804552939197492 +2779 5 6.28366 1.2836599349975586 1.6477828287179364 +2780 5 4.619333 0.38066720962524414 0.14490752448386957 +2781 6 4.73323345 1.2667665481567383 1.6046974875289379 +2782 6 5.759841 0.24015903472900391 0.057676361961966904 +2784 6 5.759841 0.24015903472900391 0.057676361961966904 +2787 5 5.154094 0.15409421920776367 0.023745028393250323 +2789 5 5.24807024 0.24807024002075195 0.061538843983953484 +2792 5 5.47459 0.47458982467651367 0.22523550168648399 +2793 7 7.030477 0.030477046966552734 0.00092885039180146123 +2795 8 6.281604 1.7183961868286133 2.9528854549071184 +2797 5 5.248554 0.24855422973632813 0.06177920511981938 +2800 5 5.540111 0.54011106491088867 0.2917199624391742 +2804 8 6.281604 1.7183961868286133 2.9528854549071184 +2808 6 5.26842356 0.73157644271850586 0.53520409154066328 +2809 7 6.62437439 0.3756256103515625 0.14109459915198386 +2810 7 6.433074 0.56692600250244141 0.3214050923133982 +2811 5 5.668065 0.66806507110595703 0.44631093923180742 +2813 7 6.62437439 0.3756256103515625 0.14109459915198386 +2814 7 6.61809349 0.38190650939941406 0.14585258192164474 +2818 4 5.808469 1.8084688186645508 3.2705594680819559 +2823 6 6.27581358 0.27581357955932617 0.076073130669328748 +2830 5 5.800622 0.80062198638916016 0.64099556508972455 +2831 5 5.099738 0.099738121032714844 0.0099476927871364751 +2833 7 5.92833 1.0716700553894043 1.1484767076183289 +2836 6 5.74643373 0.25356626510620117 0.064295850799908294 +2837 6 5.851513 0.14848709106445313 0.022048416212783195 +2839 7 5.859615 1.1403851509094238 1.3004782924147094 +2840 6 5.96657133 0.033428668975830078 0.0011174759094956244 +2842 6 5.52991533 0.47008466720581055 0.22097959434199765 +2844 5 5.898055 0.89805507659912109 0.80650292060545326 +2846 7 6.969701 0.030299186706542969 0.00091804071507795015 +2847 5 6.262068 1.2620677947998047 1.5928151186708419 +2848 5 5.204508 0.20450782775878906 0.041823451614618534 +2850 5 5.99285364 0.99285364151000977 0.98575835345968699 +2852 5 5.972932 0.97293186187744141 0.94659640785630472 +2854 6 6.112688 0.11268806457519531 0.012698599897703389 +2856 7 6.85824966 0.14175033569335938 0.020093157669180073 +2860 6 5.47837162 0.52162837982177734 0.27209616663549241 +2861 6 6.112688 0.11268806457519531 0.012698599897703389 +2863 6 6.65813065 0.65813064575195313 0.43313594687788282 +2865 6 6.6311245 0.63112449645996094 0.39831813003183925 +2868 5 5.65523767 0.65523767471313477 0.42933641036347581 +2869 6 6.94134426 0.94134426116943359 0.8861290180366268 +2870 7 6.93730831 0.062691688537597656 0.0039302478116951534 +2871 6 6.28578663 0.28578662872314453 0.081673997156940459 +2872 7 7.50544739 0.5054473876953125 0.25547706172801554 +2873 8 7.100377 0.89962291717529297 0.80932139310698403 +2879 6 6.63262224 0.63262224197387695 0.40021090104005452 +2881 7 6.52594 0.47406005859375 0.22473293915390968 +2890 8 6.85379457 1.1462054252624512 1.3137868769010765 +2891 6 5.87739563 0.1226043701171875 0.015031831571832299 +2893 7 7.978032 0.97803211212158203 0.95654681234100281 +2895 5 5.43063641 0.43063640594482422 0.18544771412507544 +2896 5 5.205651 0.20565080642700195 0.042292254184076228 +2898 5 5.73327 0.73327016830444336 0.53768513972522669 +2902 5 5.41895247 0.41895246505737305 0.17552116797764938 +2903 6 6.160978 0.16097784042358398 0.02591386510744087 +2904 7 5.80037928 1.1996207237243652 1.4390898807889698 +2905 5 5.474959 0.47495889663696289 0.2255859534946012 +2906 5 5.359196 0.35919618606567383 0.12902190008412617 +2910 5 5.279104 0.27910423278808594 0.077899172760226065 +2911 5 5.41895247 0.41895246505737305 0.17552116797764938 +2913 5 6.005797 1.0057969093322754 1.0116274228223574 +2919 5 6.438273 1.4382729530334473 2.0686290874275528 +2920 4 5.60087061 1.6008706092834473 2.5627867076675557 +2923 6 6.241534 0.24153423309326172 0.058338785755950084 +2924 6 6.32152033 0.32152032852172852 0.10337532165272023 +2927 7 6.90382433 0.096175670623779297 0.009249759619933684 +2929 6 6.32152033 0.32152032852172852 0.10337532165272023 +2933 6 6.241534 0.24153423309326172 0.058338785755950084 +2934 5 5.298636 0.29863595962524414 0.089183436381290448 +2937 5 5.67272425 0.67272424697875977 0.45255791247313937 +2940 6 5.942824 0.057176113128662109 0.0032691079125015676 +2941 5 5.81210947 0.81210947036743164 0.65952179186047033 +2943 8 7.476893 0.52310705184936523 0.27364098769453449 +2944 6 5.942824 0.057176113128662109 0.0032691079125015676 +2947 6 6.210386 0.21038579940795898 0.044262184592525955 +2948 6 5.40534925 0.5946507453918457 0.3536095089950777 +2949 6 5.43621063 0.56378936767578125 0.31785845110425726 +2950 5 5.08234453 0.082344532012939453 0.0067806219524300104 +2953 5 5.08234453 0.082344532012939453 0.0067806219524300104 +2955 5 6.242766 1.2427659034729004 1.5444670908348144 +2956 6 6.03635645 0.036356449127197266 0.0013217913931384828 +2959 7 7.05597639 0.055976390838623047 0.0031333563313182822 +2961 6 6.331708 0.33170795440673828 0.11003016701670276 +2962 5 5.27895737 0.27895736694335938 0.07781721257197205 +2964 5 6.17455339 1.174553394317627 1.3795756761030589 +2965 8 7.1527915 0.84720849990844727 0.71776224231712149 +2967 6 5.957492 0.042508125305175781 0.0018069407169605256 +2968 5 5.81376457 0.81376457214355469 0.66221277887598262 +2970 5 5.81376457 0.81376457214355469 0.66221277887598262 +2971 5 4.99322844 0.0067715644836425781 4.5854085556129576E-05 +2975 6 6.17230034 0.17230033874511719 0.029687406731682131 +2981 7 6.48654 0.51346015930175781 0.26364133519018651 +2984 6 4.562323 1.4376769065856934 2.0669148877298085 +2985 7 6.512452 0.48754787445068359 0.23770292988137953 +2987 7 6.60074 0.39926004409790039 0.15940858281305736 +2989 6 6.429061 0.42906093597412109 0.18409328677898884 +2991 7 6.909401 0.09059906005859375 0.0082081896835006773 +2994 7 6.60074 0.39926004409790039 0.15940858281305736 +2996 8 5.7872653 2.2127346992492676 4.8961948492617466 +2997 6 6.427847 0.42784690856933594 0.18305297717233771 +2999 7 6.60074 0.39926004409790039 0.15940858281305736 +3000 7 6.512452 0.48754787445068359 0.23770292988137953 +3001 7 6.57342339 0.42657661437988281 0.18196760793580324 +3002 7 6.909401 0.09059906005859375 0.0082081896835006773 +3004 6 6.277748 0.27774810791015625 0.077144011447671801 +3005 6 6.057661 0.057661056518554688 0.003324797438835958 +3006 6 6.429061 0.42906093597412109 0.18409328677898884 +3013 6 6.67181063 0.67181062698364258 0.45132951852815495 +3014 6 5.558968 0.44103193283081055 0.19450916577648059 +3016 6 6.67181063 0.67181062698364258 0.45132951852815495 +3020 6 4.05025244 1.9497475624084473 3.801515557117682 +3022 5 5.064984 0.064983844757080078 0.004222900079412284 +3023 6 5.558968 0.44103193283081055 0.19450916577648059 +3026 6 5.6375 0.36250019073486328 0.13140638828281226 +3027 5 5.77296543 0.77296543121337891 0.5974755578508848 +3028 6 5.745474 0.25452613830566406 0.064783555080794031 +3029 8 7.19962168 0.80037832260131836 0.64060545929010004 +3031 6 5.923202 0.076797962188720703 0.0058979269963401748 +3033 6 5.77843237 0.22156763076782227 0.04909221500406602 +3034 6 5.63558245 0.36441755294799805 0.13280015289660696 +3037 6 5.42967224 0.5703277587890625 0.32527375244535506 +3038 6 6.38509274 0.38509273529052734 0.14829641477354016 +3039 6 5.31801128 0.68198871612548828 0.46510860892249184 +3040 5 6.381903 1.3819031715393066 1.9096563755103944 +3043 6 5.588426 0.41157388687133789 0.16939306435438084 +3044 6 5.87649345 0.12350654602050781 0.015253866909915814 +3045 6 6.14374876 0.14374876022338867 0.020663706065761289 +3046 6 6.83705759 0.83705759048461914 0.70066540978791636 +3049 5 5.32754469 0.3275446891784668 0.10728552340901842 +3050 4 5.0039525 1.0039525032043457 1.0079206286902718 +3053 5 5.62100029 0.62100028991699219 0.38564136007698835 +3055 6 6.298503 0.29850292205810547 0.089103994477227388 +3056 5 5.31829453 0.31829452514648438 0.10131140473822597 +3058 5 5.35015059 0.35015058517456055 0.12260543229808718 +3059 6 5.40152 0.598480224609375 0.35817857924848795 +3062 8 6.9144206 1.0855793952941895 1.178482623487298 +3064 5 5.388519 0.3885188102722168 0.15094686593533879 +3065 6 6.27987 0.27987003326416016 0.078327235519282112 +3066 5 5.388519 0.3885188102722168 0.15094686593533879 +3069 8 5.07914543 2.9208545684814453 8.5313914102189301 +3070 8 6.9144206 1.0855793952941895 1.178482623487298 +3072 6 6.397393 0.39739322662353516 0.15792137656626437 +3073 5 6.52471828 1.5247182846069336 2.3247658474147102 +3074 5 6.30772257 1.3077225685119629 1.7101383161955255 +3075 7 6.25977373 0.74022626876831055 0.54793492897465512 +3076 5 5.427511 0.42751121520996094 0.18276583913029754 +3077 5 5.35015059 0.35015058517456055 0.12260543229808718 +3078 5 6.802679 1.8026790618896484 3.2496518001753429 +3079 5 5.684782 0.68478202819824219 0.46892642614329816 +3080 6 5.40152 0.598480224609375 0.35817857924848795 +3084 6 6.54111862 0.54111862182617188 0.29280936288705561 +3086 7 7.17780447 0.17780447006225586 0.03161442957411964 +3088 6 6.27715 0.27715015411376953 0.076812207925286202 +3090 6 6.54111862 0.54111862182617188 0.29280936288705561 +3091 6 5.58051538 0.41948461532592773 0.17596734249514157 +3094 6 4.10049248 1.8995075225830078 3.6081288283494359 +3095 6 4.10049248 1.8995075225830078 3.6081288283494359 +3097 5 6.741381 1.7413811683654785 3.032408373537919 +3099 7 6.51613331 0.48386669158935547 0.23412697522962844 +3101 6 5.866829 0.13317108154296875 0.017734536959324032 +3102 6 5.42601442 0.57398557662963867 0.32945944217885881 +3104 5 5.773071 0.7730708122253418 0.59763848071474968 +3105 6 5.76177263 0.23822736740112305 0.056752278578869664 +3106 6 6.02370739 0.023707389831542969 0.00056204033262474695 +3108 5 5.81408358 0.81408357620239258 0.66273206904247672 +3111 7 6.49721241 0.50278759002685547 0.25279536068501329 +3112 5 5.442617 0.44261693954467773 0.1959097551718969 +3113 6 5.5020566 0.49794340133666992 0.24794763093473193 +3114 6 6.28996038 0.28996038436889648 0.084077024503358189 +3115 6 6.28996038 0.28996038436889648 0.084077024503358189 +3116 7 6.45204258 0.54795742034912109 0.30025733451566339 +3117 7 6.49721241 0.50278759002685547 0.25279536068501329 +3119 5 4.900861 0.099139213562011719 0.0098285836656941683 +3120 6 5.438194 0.56180620193481445 0.31562620853242151 +3122 6 6.961881 0.96188116073608398 0.92521536737899623 +3124 6 5.5020566 0.49794340133666992 0.24794763093473193 +3125 5 5.66976547 0.66976547241210938 0.44858578803541604 +3126 7 6.22714758 0.77285242080688477 0.59730086434706209 +3128 6 6.38471365 0.38471364974975586 0.14800459230377783 +3131 5 5.26796055 0.26796054840087891 0.071802855499299767 +3133 6 6.66105556 0.66105556488037109 0.43699445985930652 +3135 6 5.55962849 0.44037151336669922 0.19392706978487695 +3138 6 6.08207035 0.082070350646972656 0.0067355424553170451 +3140 6 5.55962849 0.44037151336669922 0.19392706978487695 +3141 7 5.62027645 1.3797235488891602 1.9036370713592987 +3143 5 5.493113 0.49311304092407227 0.24316047112938577 +3144 6 5.89535141 0.10464859008789063 0.01095132740738336 +3145 6 5.89535141 0.10464859008789063 0.01095132740738336 +3146 6 5.89535141 0.10464859008789063 0.01095132740738336 +3147 6 5.691378 0.30862188339233398 0.095247466908631395 +3151 6 5.89535141 0.10464859008789063 0.01095132740738336 +3154 6 6.88422871 0.88422870635986328 0.78186040515083732 +3157 7 6.794643 0.20535707473754883 0.042171528144763215 +3158 7 7.03653 0.036530017852783203 0.0013344422043246595 +3159 6 6.4036 0.40360021591186523 0.16289313428410424 +3162 7 6.794643 0.20535707473754883 0.042171528144763215 +3164 6 5.591423 0.40857696533203125 0.16693513659993187 +3166 6 6.93464851 0.93464851379394531 0.87356784433723078 +3167 7 6.354538 0.6454620361328125 0.41662124008871615 +3168 6 6.76005125 0.76005125045776367 0.5776779033224102 +3172 8 6.63394737 1.3660526275634766 1.8660997812730784 +3173 8 6.65707636 1.342923641204834 1.8034439061068497 +3174 8 6.82011032 1.1798896789550781 1.3921396545047173 +3175 6 5.84485531 0.15514469146728516 0.024069875290479104 +3176 6 6.38577461 0.38577461242675781 0.1488220515930152 +3177 5 5.93752146 0.93752145767211914 0.87894648359565508 +3178 6 5.928312 0.071688175201416016 0.0051391944637089182 +3179 4 5.694992 1.6949920654296875 2.872998101869598 +3181 6 6.218146 0.21814584732055664 0.047587610703203609 +3182 5 6.04654074 1.0465407371520996 1.09524751451886 +3183 6 6.174143 0.17414283752441406 0.030325727861054474 +3189 5 6.06723547 1.0672354698181152 1.1389915480378932 +3190 7 7.04060841 0.040608406066894531 0.0016490426432937966 +3192 6 6.218146 0.21814584732055664 0.047587610703203609 +3193 5 6.04654074 1.0465407371520996 1.09524751451886 +3195 6 6.26814 0.26813983917236328 0.071898973351380846 +3197 6 6.472759 0.47275876998901367 0.22350085460152513 +3199 7 6.48691034 0.51308965682983398 0.2632609959457568 +3200 7 7.05278635 0.052786350250244141 0.0027863987727414496 +3201 6 6.472759 0.47275876998901367 0.22350085460152513 +3204 5 5.69841528 0.69841527938842773 0.48778390248321557 +3206 7 6.803375 0.1966252326965332 0.03866148213296583 +3208 5 6.13848734 1.1384873390197754 1.296153421108329 +3209 5 5.56524849 0.56524848937988281 0.31950585474623949 +3211 6 6.22323 0.22322988510131836 0.049831581602347796 +3212 5 6.169505 1.1695051193237305 1.367742224124413 +3215 6 6.30010271 0.30010271072387695 0.090061636983818971 +3216 5 6.26681948 1.2668194770812988 1.6048315875125354 +3217 5 5.16897726 0.16897726058959961 0.028553314596365453 +3218 4 5.06769848 1.0676984786987305 1.1399800414155834 +3220 5 5.50094748 0.50094747543334961 0.25094837314304641 +3224 6 6.3995347 0.39953470230102539 0.15962797834276898 +3225 7 6.534587 0.46541309356689453 0.21660934766350692 +3228 6 5.305252 0.6947479248046875 0.48267467902041972 +3229 7 6.28676 0.71324014663696289 0.50871150677471633 +3230 6 5.628512 0.37148809432983398 0.13800340422881163 +3231 6 6.54455757 0.54455757141113281 0.29654294858119101 +3233 6 6.819964 0.81996393203735352 0.6723408498421577 +3234 6 5.81466961 0.18533039093017578 0.034347353802331781 +3235 6 6.3995347 0.39953470230102539 0.15962797834276898 +3237 7 6.28185368 0.71814632415771484 0.51573414290123765 +3238 5 5.628002 0.62800216674804688 0.39438672144024167 +3243 7 6.62556076 0.37443923950195313 0.14020474407880101 +3245 5 5.628002 0.62800216674804688 0.39438672144024167 +3249 7 6.28185368 0.71814632415771484 0.51573414290123765 +3250 6 7.093312 1.0933117866516113 1.1953306628313385 +3254 5 6.18474531 1.1847453117370605 1.4036214536829448 +3257 6 6.21816874 0.21816873550415039 0.047597597151479931 +3259 6 6.21816874 0.21816873550415039 0.047597597151479931 +3260 6 6.21816874 0.21816873550415039 0.047597597151479931 +3261 5 6.670792 1.6707921028137207 2.7915462508246947 +3262 7 6.145352 0.85464811325073242 0.73042339748303675 +3265 3 5.247516 2.2475161552429199 5.0513288680779169 +3268 6 6.50005341 0.50005340576171875 0.25005340861389413 +3270 5 6.018678 1.0186781883239746 1.0377052513670151 +3276 8 6.301276 1.6987237930297852 2.8856625250055004 +3279 6 5.93030453 0.069695472717285156 0.0048574589172858396 +3280 5 6.018678 1.0186781883239746 1.0377052513670151 +3285 7 6.433152 0.56684780120849609 0.32131642973490671 +3286 7 6.352344 0.64765596389770508 0.41945824757226546 +3289 5 5.342055 0.34205484390258789 0.11700151623722377 +3291 8 6.82019329 1.1798067092895508 1.3919438712846386 +3292 5 5.342055 0.34205484390258789 0.11700151623722377 +3294 6 5.68973255 0.31026744842529297 0.096265889552341832 +3301 8 6.82019329 1.1798067092895508 1.3919438712846386 +3304 7 6.88351154 0.11648845672607422 0.013569560550422466 +3307 3 5.8957386 2.8957386016845703 8.3853020492861106 +3312 7 6.76305866 0.23694133758544922 0.056141197456781811 +3315 7 6.36094856 0.63905143737792969 0.40838673961479799 +3320 5 5.636375 0.63637495040893555 0.40497307750797518 +3322 7 6.73071337 0.2692866325378418 0.072515290463570636 +3324 6 6.155808 0.1558079719543457 0.024276124124526177 +3325 7 6.96725035 0.032749652862548828 0.0010725397626174527 +3327 7 6.50289774 0.49710226058959961 0.2471106574832902 +3329 6 6.26983547 0.26983547210693359 0.072811182007171737 +3331 6 5.80678654 0.19321346282958984 0.037331442218601296 +3334 6 6.02954 0.029540061950683594 0.00087261526005022461 +3338 6 4.53636837 1.4636316299438477 2.1422175481720842 +3339 6 5.969812 0.030188083648681641 0.00091132039437979984 +3340 6 6.42462969 0.42462968826293945 0.18031037215428114 +3341 6 5.969812 0.030188083648681641 0.00091132039437979984 +3345 6 5.878929 0.12107086181640625 0.014658153580967337 +3348 6 4.53636837 1.4636316299438477 2.1422175481720842 +3349 6 5.888847 0.11115312576293945 0.012355017366871834 +3350 6 6.474879 0.47487878799438477 0.22550986328701583 +3352 6 6.51672649 0.51672649383544922 0.26700626943147654 +3353 6 6.63064528 0.6306452751159668 0.39771346302609345 +3354 7 6.961644 0.038355827331542969 0.0014711694902871386 +3358 6 6.51672649 0.51672649383544922 0.26700626943147654 +3360 7 6.0704236 0.92957639694213867 0.86411227775192856 +3362 6 6.474879 0.47487878799438477 0.22550986328701583 +3364 6 6.260106 0.26010608673095703 0.067655176354492141 +3367 6 6.59981632 0.59981632232666016 0.35977962052947987 +3368 6 5.883497 0.11650276184082031 0.013572893516538898 +3373 7 6.808924 0.19107580184936523 0.036509962052377887 +3374 5 5.82516146 0.82516145706176758 0.6808914302202993 +3375 6 5.946118 0.053882122039794922 0.0029032830755113537 +3377 6 5.72262573 0.277374267578125 0.076936484314501286 +3378 8 6.531135 1.468864917755127 2.1575641466117759 +3379 5 5.22318745 0.22318744659423828 0.049812636317255965 +3380 7 6.92272663 0.077273368835449219 0.0059711735311793745 +3381 7 6.2997756 0.70022439956665039 0.49031420974847606 +3385 6 6.621978 0.62197780609130859 0.38685639127015747 +3386 8 6.531135 1.468864917755127 2.1575641466117759 +3388 6 5.837392 0.16260814666748047 0.026441409362632839 +3391 8 6.387185 1.6128149032592773 2.6011719121752321 +3392 6 6.6376133 0.63761329650878906 0.40655071588480496 +3393 6 6.22890139 0.22890138626098633 0.052395844632201261 +3394 5 5.47459 0.47458982467651367 0.22523550168648399 +3395 5 5.509231 0.5092310905456543 0.25931630357831637 +3396 6 6.11340332 0.1134033203125 0.012860313057899475 +3398 5 5.378982 0.3789820671081543 0.14362740718956957 +3402 6 5.28050137 0.71949863433837891 0.51767828481479228 +3403 5 6.06067371 1.060673713684082 1.125028726900382 +3404 6 5.25454664 0.7454533576965332 0.55570070850103548 +3407 5 5.378982 0.3789820671081543 0.14362740718956957 +3410 7 6.179308 0.82069206237792969 0.67353546125013963 +3412 6 5.82096052 0.17903947830200195 0.032055134790653028 +3413 6 5.61508751 0.38491249084472656 0.14815762560829171 +3415 7 6.34700537 0.65299463272094727 0.42640199036236481 +3417 4 6.689371 2.6893711090087891 7.232716961971164 +3418 6 5.75941849 0.24058151245117188 0.057879464133293368 +3419 7 6.34700537 0.65299463272094727 0.42640199036236481 +3420 5 5.35013247 0.35013246536254883 0.12259274330085645 +3421 8 6.36025953 1.6397404670715332 2.6887487993519699 +3424 6 6.2162385 0.21623849868774414 0.046759088314729524 +3426 6 6.236654 0.23665380477905273 0.056005023316402003 +3427 6 6.425235 0.42523479461669922 0.18082463055270637 +3428 6 6.2162385 0.21623849868774414 0.046759088314729524 +3429 5 5.9808383 0.98083829879760742 0.96204376838818462 +3430 6 6.236654 0.23665380477905273 0.056005023316402003 +3432 5 6.193153 1.193152904510498 1.4236138535418377 +3433 7 6.986817 0.013183116912841797 0.00017379457153765543 +3434 6 5.64902449 0.35097551345825195 0.1231838110472836 +3436 6 6.465708 0.46570777893066406 0.21688373535653227 +3438 5 5.14778042 0.14778041839599609 0.021839052061295661 +3440 5 6.438942 1.4389419555664063 2.0705539514892735 +3441 5 6.080147 1.0801467895507813 1.1667170869768597 +3443 6 6.19375563 0.1937556266784668 0.037541242869565394 +3444 5 5.14778042 0.14778041839599609 0.021839052061295661 +3445 8 6.94122648 1.0587735176086426 1.1210013615893786 +3446 6 5.21913433 0.78086566925048828 0.60975119341401296 +3447 6 6.29725456 0.29725456237792969 0.088360274854494492 +3448 7 7.261501 0.26150083541870117 0.068382686924678637 +3449 8 6.94122648 1.0587735176086426 1.1210013615893786 +3453 6 6.26551533 0.26551532745361328 0.070498389112799487 +3460 6 6.21407652 0.21407651901245117 0.045828755992488368 +3462 6 6.394197 0.39419698715209961 0.15539126467979258 +3464 5 5.73516941 0.73516941070556641 0.54047406243716978 +3466 6 6.394197 0.39419698715209961 0.15539126467979258 +3468 8 6.66443 1.3355698585510254 1.783746847070006 +3469 6 5.840723 0.15927696228027344 0.025369150713231647 +3471 6 6.21407652 0.21407651901245117 0.045828755992488368 +3474 6 5.58264971 0.41735029220581055 0.17418126640427545 +3476 8 7.32128954 0.6787104606628418 0.46064788941316692 +3479 7 7.112981 0.11298084259033203 0.012764670792421384 +3485 7 5.81863832 1.1813616752624512 1.3956154077789051 +3486 6 5.92535448 0.074645519256591797 0.0055719535450862168 +3489 8 5.245248 2.7547521591186523 7.5886594581688769 +3492 7 7.013208 0.013207912445068359 0.00017444895115659165 +3495 7 6.28093338 0.71906661987304688 0.51705680381564889 +3496 7 6.481858 0.5181422233581543 0.26847136362653146 +3498 6 5.777094 0.22290611267089844 0.049687135066051269 +3499 7 7.088905 0.088904857635498047 0.0079040737111881754 +3501 6 6.25927 0.25927019119262695 0.067221032041061335 +3505 7 6.2764 0.72359991073608398 0.52359683081726871 +3508 5 5.340404 0.34040403366088867 0.11587490613260343 +3509 6 5.88247347 0.11752653121948242 0.013812485540483976 +3510 6 6.16876173 0.1687617301940918 0.028480521578103435 +3512 6 6.10856533 0.10856533050537109 0.011786430987740459 +3514 6 6.71761 0.71760988235473633 0.51496394325317851 +3515 7 6.43362331 0.56637668609619141 0.32078255055330374 +3521 7 6.25795937 0.74204063415527344 0.55062430273756036 +3524 6 6.80415726 0.80415725708007813 0.64666889411455486 +3525 6 6.80415726 0.80415725708007813 0.64666889411455486 +3530 5 5.47427368 0.474273681640625 0.22493552509695292 +3534 5 5.47427368 0.474273681640625 0.22493552509695292 +3535 5 5.32360458 0.32360458374023438 0.10471992661769036 +3538 7 6.769995 0.23000478744506836 0.052902202247651076 +3539 6 6.66193151 0.66193151473999023 0.43815333020597791 +3540 6 6.68253851 0.68253850936889648 0.46585881677151519 +3545 6 5.902541 0.097458839416503906 0.0094982253804118955 +3548 6 6.40086937 0.40086936950683594 0.16069625140880817 +3549 6 6.234617 0.23461723327636719 0.055045246150257299 +3550 6 6.28539371 0.28539371490478516 0.081449572507153789 +3552 6 5.958351 0.04164886474609375 0.0017346279346384108 +3553 6 5.958351 0.04164886474609375 0.0017346279346384108 +3554 6 5.695507 0.30449295043945313 0.092715956867323257 +3556 7 6.32758856 0.67241144180297852 0.45213714706756036 +3557 6 5.695507 0.30449295043945313 0.092715956867323257 +3558 6 5.958351 0.04164886474609375 0.0017346279346384108 +3559 4 4.56899071 0.56899070739746094 0.32375042510466301 +3561 5 4.667524 0.33247613906860352 0.11054038304996538 +3562 6 6.965445 0.96544504165649414 0.93208412845910971 +3563 5 4.667524 0.33247613906860352 0.11054038304996538 +3565 6 5.897271 0.10272884368896484 0.010553215325671772 +3569 6 5.897271 0.10272884368896484 0.010553215325671772 +3570 6 6.1648035 0.16480350494384766 0.027160195241776819 +3571 4 4.48588562 0.4858856201171875 0.23608483583666384 +3575 7 6.23748446 0.76251554489135742 0.58142995620096372 +3583 6 5.41491938 0.58508062362670898 0.3423193361434187 +3584 7 6.06448555 0.93551445007324219 0.87518728629584075 +3586 7 6.019777 0.98022317886352539 0.96083748038131489 +3587 6 5.63349771 0.36650228500366211 0.13432392491290557 +3592 7 6.047007 0.95299291610717773 0.9081954981504623 +3598 7 6.731533 0.26846694946289063 0.072074502953910269 +3599 6 5.406142 0.59385776519775391 0.35266704528567061 +3600 6 6.567454 0.56745386123657227 0.32200388463229501 +3605 5 5.234682 0.23468208312988281 0.055075680142181227 +3607 6 6.07156134 0.071561336517333984 0.0051210248841471184 +3613 6 6.29382372 0.2938237190246582 0.086332377861481291 +3614 5 5.31686544 0.31686544418334961 0.10040370971751145 +3615 6 6.234737 0.23473691940307617 0.055101421330846279 +3616 5 5.135875 0.13587522506713867 0.018462076787045589 +3620 7 6.37463236 0.62536764144897461 0.39108468697145327 +3622 6 6.234737 0.23473691940307617 0.055101421330846279 +3625 5 5.135875 0.13587522506713867 0.018462076787045589 +3627 5 5.206159 0.20615911483764648 0.042501580630641911 +3628 6 5.126278 0.87372207641601563 0.76339026681671385 +3629 6 5.37236261 0.62763738632202148 0.39392868870913844 +3631 6 5.87679 0.12320995330810547 0.01518069259418553 +3635 6 6.12622452 0.12622451782226563 0.015932628899463452 +3637 7 5.76559067 1.2344093322753906 1.5237663996085757 +3638 7 6.650932 0.34906816482543945 0.12184858369460017 +3639 6 6.99471331 0.99471330642700195 0.98945456198293869 +3640 6 6.340162 0.34016180038452148 0.11571005044083904 +3643 6 6.340162 0.34016180038452148 0.11571005044083904 +3645 6 6.351741 0.35174083709716797 0.12372161648181645 +3646 7 5.50947475 1.4905252456665039 2.2216655079691918 +3647 7 7.066052 0.066051959991455078 0.0043628614187127823 +3650 4 5.207849 1.2078490257263184 1.4588992689480165 +3652 6 5.94521332 0.05478668212890625 0.0030015805386938155 +3653 6 5.465872 0.53412818908691406 0.28529292237726622 +3655 7 7.232871 0.23287105560302734 0.054228928537668253 +3656 7 6.5983386 0.40166139602661133 0.1613318770580463 +3658 7 6.19759941 0.80240058898925781 0.64384670521030785 +3660 8 7.28588152 0.71411848068237305 0.50996520445210081 +3661 6 6.05568 0.055679798126220703 0.0031002399193766905 +3668 5 4.161898 0.83810186386108398 0.70241473420742295 +3677 6 6.41289663 0.41289663314819336 0.17048362966511377 +3679 7 6.120346 0.8796539306640625 0.77379103773273528 +3680 6 6.035059 0.035058975219726563 0.0012291317434574012 +3681 8 6.888233 1.1117668151855469 1.2360254513478139 +3684 7 6.92954063 0.070459365844726563 0.0049645222352410201 +3687 5 6.88020945 1.8802094459533691 3.5351875606522754 +3688 6 6.72161055 0.72161054611206055 0.52072178026014626 +3697 6 6.035059 0.035058975219726563 0.0012291317434574012 +3698 6 6.39411926 0.3941192626953125 0.15532999322749674 +3699 5 5.1721015 0.17210149765014648 0.029618925493423376 +3702 6 5.99003363 0.0099663734436035156 9.9328599617365398E-05 +3703 6 5.99003363 0.0099663734436035156 9.9328599617365398E-05 +3704 6 5.99003363 0.0099663734436035156 9.9328599617365398E-05 +3706 6 6.51541328 0.51541328430175781 0.26565085363472463 +3714 4 5.95268631 1.9526863098144531 3.8129838245367864 +3716 5 6.049506 1.0495061874389648 1.1014632374726716 +3718 5 5.32817268 0.32817268371582031 0.10769731033724383 +3720 7 7.13351345 0.13351345062255859 0.017825841497142392 +3721 5 5.27913761 0.27913761138916016 0.077917806092045794 +3723 7 6.52531 0.47468996047973633 0.22533055858025364 +3724 6 6.28641844 0.28641843795776367 0.082035521602165318 +3728 7 6.68674 0.31326007843017578 0.098131876738079882 +3730 6 5.48833 0.51167011260986328 0.26180630413819017 +3731 6 6.3389554 0.33895540237426758 0.11489076479870164 +3733 6 6.53397942 0.53397941589355469 0.28513401659802184 +3734 5 5.700733 0.70073318481445313 0.49102699630020652 +3735 6 6.66451836 0.66451835632324219 0.44158464589054347 +3738 6 5.4453907 0.55460929870605469 0.30759147421122179 +3739 7 6.935587 0.064413070678710938 0.0041490436742606107 +3741 7 6.935587 0.064413070678710938 0.0041490436742606107 +3744 7 6.935587 0.064413070678710938 0.0041490436742606107 +3745 7 6.935587 0.064413070678710938 0.0041490436742606107 +3748 5 5.463842 0.46384191513061523 0.21514932223203687 +3749 6 6.3819747 0.38197469711303711 0.14590466923459644 +3750 7 6.935587 0.064413070678710938 0.0041490436742606107 +3753 5 5.480336 0.48033618927001953 0.23072285472244403 +3757 5 5.4016695 0.40166950225830078 0.1613383890444311 +3759 6 6.210043 0.21004295349121094 0.044118042311311001 +3762 5 5.33852148 0.33852148056030273 0.11459679280073942 +3764 8 7.608175 0.39182519912719727 0.15352698667106779 +3766 5 5.06073856 0.060738563537597656 0.0036891731006107875 +3767 5 5.06073856 0.060738563537597656 0.0036891731006107875 +3769 5 5.06073856 0.060738563537597656 0.0036891731006107875 +3771 6 5.91118431 0.088815689086914063 0.0078882266279833857 +3772 6 6.0771904 0.077190399169921875 0.0059583577240118757 +3776 5 6.74684 1.7468400001525879 3.0514499861330933 +3778 7 6.67663431 0.32336568832397461 0.10456536838523789 +3779 7 6.32261753 0.67738246917724609 0.45884700954866275 +3782 6 6.412977 0.41297721862792969 0.17055018310566084 +3785 7 6.92169 0.078310012817382813 0.0061324581074586604 +3786 5 5.189933 0.18993282318115234 0.036074477321562881 +3790 5 5.34790945 0.34790945053100586 0.12104098576878641 +3794 5 5.83044529 0.83044528961181641 0.68963937903845363 +3795 6 5.59086227 0.40913772583007813 0.16739367869740818 +3796 6 6.42995358 0.42995357513427734 0.18486007677074667 +3797 5 5.022169 0.022169113159179688 0.00049146957826451398 +3799 5 6.094518 1.0945181846618652 1.1979700565555049 +3802 5 5.595747 0.59574699401855469 0.35491448088214383 +3803 6 6.150232 0.15023183822631836 0.02256960521685869 +3804 5 5.549744 0.5497441291809082 0.30221860756887509 +3806 5 5.022169 0.022169113159179688 0.00049146957826451398 +3807 5 5.709923 0.70992279052734375 0.50399036851013079 +3810 3 5.56449556 2.5644955635070801 6.5766374952474962 +3811 5 5.97139454 0.97139453887939453 0.94360735016471153 +3812 5 5.595747 0.59574699401855469 0.35491448088214383 +3813 5 6.094518 1.0945181846618652 1.1979700565555049 +3814 5 5.48091125 0.4809112548828125 0.23127563507296145 +3816 5 5.563448 0.56344795227050781 0.31747359491782845 +3817 6 6.265292 0.26529216766357422 0.070379934223637974 +3818 6 6.96043253 0.96043252944946289 0.9224306436246934 +3819 6 6.96043253 0.96043252944946289 0.9224306436246934 +3822 6 6.096108 0.096107959747314453 0.0092367399267914152 +3825 6 6.25888348 0.25888347625732422 0.067020654279076552 +3826 6 6.96043253 0.96043252944946289 0.9224306436246934 +3827 5 6.038882 1.038881778717041 1.079275350150283 +3828 6 6.265292 0.26529216766357422 0.070379934223637974 +3829 7 7.161894 0.16189384460449219 0.026209616920823464 +3831 5 5.2977705 0.29777050018310547 0.088667270779296814 +3832 5 5.2977705 0.29777050018310547 0.088667270779296814 +3835 5 4.87871933 0.12128067016601563 0.014709000955917872 +3836 6 5.974171 0.025828838348388672 0.00066712889042719326 +3837 6 5.974171 0.025828838348388672 0.00066712889042719326 +3840 6 6.614344 0.61434412002563477 0.37741869781007154 +3842 6 6.45290661 0.45290660858154297 0.20512439609683497 +3844 6 6.614344 0.61434412002563477 0.37741869781007154 +3845 5 4.981601 0.018398761749267578 0.00033851443390631175 +3846 6 6.192758 0.19275808334350586 0.037155678694261951 +3847 5 4.981601 0.018398761749267578 0.00033851443390631175 +3849 5 4.961581 0.038418769836425781 0.0014760018757442595 +3851 7 7.275682 0.27568197250366211 0.076000549963509911 +3852 6 6.26231146 0.26231145858764648 0.068807301306378577 +3856 6 6.26231146 0.26231145858764648 0.068807301306378577 +3857 6 6.128902 0.12890195846557617 0.016615714896261125 +3858 6 6.57184649 0.57184648513793945 0.32700840256461561 +3859 5 5.50589275 0.50589275360107422 0.25592747814607719 +3861 6 5.85925865 0.14074134826660156 0.019808127111900831 +3864 7 6.47671556 0.5232844352722168 0.27382660019816285 +3865 6 7.15604162 1.1560416221618652 1.3364322321706368 +3867 5 5.50589275 0.50589275360107422 0.25592747814607719 +3868 6 5.647613 0.3523869514465332 0.12417656354978135 +3871 6 5.68695974 0.31304025650024414 0.097994202189738644 +3873 5 5.255146 0.25514602661132813 0.06509949489554856 +3874 5 5.43803358 0.4380335807800293 0.19187341789097445 +3877 5 5.99010754 0.99010753631591797 0.98031293346957682 +3878 5 5.527993 0.52799320220947266 0.27877682157941308 +3879 4 4.91237736 0.91237735748291016 0.83243244244749803 +3880 6 5.699999 0.30000114440917969 0.090000686646817485 +3881 6 5.699999 0.30000114440917969 0.090000686646817485 +3882 5 5.99318933 0.99318933486938477 0.98642505489829091 +3883 6 6.58375263 0.58375263214111328 0.34076713553167792 +3884 6 5.699999 0.30000114440917969 0.090000686646817485 +3885 6 6.473375 0.47337484359741211 0.22408374255087438 +3887 6 6.473375 0.47337484359741211 0.22408374255087438 +3890 6 6.30750275 0.30750274658203125 0.094557939155492932 +3892 5 6.229194 1.229194164276123 1.5109182934904766 +3895 6 6.381786 0.38178586959838867 0.14576045022499784 +3896 6 5.91276646 0.087233543395996094 0.0076096910934211337 +3898 7 6.231013 0.76898717880249023 0.59134128116261309 +3899 5 6.229194 1.229194164276123 1.5109182934904766 +3901 4 4.6103096 0.61030960083007813 0.3724778088653693 +3902 6 6.039623 0.039622783660888672 0.0015699649850375863 +3905 7 7.09633732 0.096337318420410156 0.009280878920435498 +3906 7 7.09633732 0.096337318420410156 0.009280878920435498 +3908 7 6.07826757 0.92173242568969727 0.84959066456781329 +3909 7 6.07826757 0.92173242568969727 0.84959066456781329 +3910 6 6.56103 0.56102991104125977 0.31475456108296385 +3911 6 5.48336744 0.5166325569152832 0.26690919886482334 +3913 6 5.76502657 0.23497343063354492 0.055212513103697347 +3914 7 6.07826757 0.92173242568969727 0.84959066456781329 +3915 7 7.30798674 0.30798673629760742 0.094855829735251973 +3917 5 5.298418 0.29841804504394531 0.089053329607850173 +3920 6 5.70013428 0.29986572265625 0.089919451624155045 +3922 7 6.772524 0.22747611999511719 0.051745385168032954 +3923 5 4.84254742 0.15745258331298828 0.024791315991933516 +3925 5 5.9297 0.92969989776611328 0.86434189990632149 +3926 6 6.27461052 0.27461051940917969 0.075410937370179454 +3927 5 6.35843372 1.358433723449707 1.8453421810054351 +3928 5 5.164068 0.16406822204589844 0.026918381485302234 +3930 6 6.30921459 0.30921459197998047 0.095613663893345802 +3931 6 6.703116 0.70311594009399414 0.49437202521426116 +3932 8 6.61660242 1.3833975791931152 1.9137888621173715 +3933 4 5.20369053 1.2036905288696289 1.4488708892904469 +3936 6 6.05036974 0.050369739532470703 0.002537110660568942 +3937 5 5.59848833 0.59848833084106445 0.35818828215292342 +3940 5 5.272034 0.2720341682434082 0.07400258869188292 +3941 5 5.37050867 0.37050867080688477 0.1372766751430845 +3942 6 5.744685 0.25531482696533203 0.065185660868337436 +3943 6 5.6546936 0.345306396484375 0.11923650745302439 +3944 6 6.18634558 0.18634557723999023 0.034724674156905166 +3945 6 6.18634558 0.18634557723999023 0.034724674156905166 +3946 6 6.70885563 0.70885562896728516 0.50247630271860544 +3947 7 6.46026945 0.53973054885864258 0.29130906537125156 +3949 5 5.272034 0.2720341682434082 0.07400258869188292 +3950 5 5.37050867 0.37050867080688477 0.1372766751430845 +3951 5 5.32029867 0.32029867172241211 0.10259123910714152 +3952 6 6.31042576 0.31042575836181641 0.096364151454508828 +3953 7 6.074407 0.92559289932250977 0.8567222152762497 +3954 5 5.32029867 0.32029867172241211 0.10259123910714152 +3956 5 5.69653654 0.69653654098510742 0.48516315292749823 +3959 6 5.67546844 0.32453155517578125 0.10532073030481115 +3960 6 5.61647 0.3835301399230957 0.14709536822942937 +3962 7 7.10236073 0.10236072540283203 0.010477718104993983 +3963 7 6.26382637 0.73617362976074219 0.54195161315510632 +3965 4 5.4957037 1.4957036972045898 2.2371295498314794 +3967 4 5.365923 1.3659229278564453 1.8657454448439239 +3970 7 6.320763 0.67923688888549805 0.46136275122285042 +3973 4 5.365923 1.3659229278564453 1.8657454448439239 +3978 7 5.71544456 1.2845554351806641 1.6500826660521852 +3982 7 7.37746859 0.37746858596801758 0.14248253339269468 +3985 6 6.22989225 0.22989225387573242 0.052850448392064209 +3990 6 5.629327 0.37067317962646484 0.13739860609439347 +3993 7 6.456397 0.54360294342041016 0.29550416009533365 +3994 7 6.456397 0.54360294342041016 0.29550416009533365 +3995 5 4.807619 0.19238090515136719 0.037010412666859338 +3996 7 6.456397 0.54360294342041016 0.29550416009533365 +3997 7 6.59891129 0.40108871459960938 0.1608721569791669 +4002 6 5.69266367 0.30733633041381836 0.094455619992231732 +4003 6 6.37953 0.37952995300292969 0.14404298522640602 +4004 7 6.56926346 0.43073654174804688 0.18553396839706693 +4006 6 6.12772465 0.12772464752197266 0.016313585584612156 +4009 6 5.98062944 0.019370555877685547 0.00037521843501053809 +4010 6 6.53024626 0.53024625778198242 0.28116109389179655 +4011 7 6.59891129 0.40108871459960938 0.1608721569791669 +4014 6 6.0624485 0.062448501586914063 0.0038998153504508082 +4015 5 5.20229053 0.20229053497314453 0.040921460539721011 +4017 6 6.266227 0.26622676849365234 0.07087669226257276 +4018 6 6.0624485 0.062448501586914063 0.0038998153504508082 +4019 5 5.20229053 0.20229053497314453 0.040921460539721011 +4021 5 5.525948 0.52594804763793945 0.27662134881416023 +4022 5 5.184402 0.1844019889831543 0.034004093540943359 +4024 6 6.41054964 0.41054964065551758 0.16855100744237461 +4025 6 6.88123941 0.88123941421508789 0.77658290516615125 +4027 5 5.225659 0.22565889358520508 0.05092193625409891 +4029 6 6.156711 0.15671110153198242 0.024558369343367303 +4031 5 5.03427553 0.034275531768798828 0.0011748120780339377 +4032 5 5.47714472 0.47714471817016602 0.22766708207768716 +4033 6 5.79416132 0.20583868026733398 0.042369562294197749 +4034 5 5.47714472 0.47714471817016602 0.22766708207768716 +4035 6 6.311769 0.31176900863647461 0.09719991474617018 +4037 5 5.1469183 0.14691829681396484 0.021584985938716272 +4039 4 5.378083 1.3780832290649414 1.8991133862300558 +4043 7 6.78501034 0.21498966217041016 0.046220554840147088 +4044 7 6.78501034 0.21498966217041016 0.046220554840147088 +4047 6 6.32993937 0.32993936538696289 0.10885998483195181 +4049 6 6.327114 0.32711410522460938 0.10700363783689681 +4050 7 6.78501034 0.21498966217041016 0.046220554840147088 +4051 6 7.054825 1.0548248291015625 1.1126554200891405 +4052 5 5.30189657 0.30189657211303711 0.091141540253602216 +4053 7 6.78501034 0.21498966217041016 0.046220554840147088 +4054 7 6.77009153 0.22990846633911133 0.052857902894402287 +4055 6 7.054825 1.0548248291015625 1.1126554200891405 +4056 5 5.582327 0.58232688903808594 0.33910460569677525 +4059 6 6.327114 0.32711410522460938 0.10700363783689681 +4064 5 6.198673 1.1986727714538574 1.4368164130248715 +4066 6 6.30273151 0.30273151397705078 0.091646369554837293 +4070 5 5.66637039 0.66637039184570313 0.44404949912859593 +4071 6 6.1098485 0.1098484992980957 0.012066692798043732 +4075 6 5.666741 0.33325910568237305 0.11106163152021509 +4078 6 5.879165 0.1208348274230957 0.014601055518369321 +4082 6 6.022336 0.022336006164550781 0.0004988971713828505 +4085 6 5.08671474 0.91328525543212891 0.83408995778972894 +4086 6 5.488061 0.51193904876708984 0.26208158965255279 +4087 6 5.64334774 0.35665225982666016 0.12720083443946351 +4088 6 5.72493553 0.27506446838378906 0.075660461767256493 +4091 6 5.634808 0.36519193649291992 0.13336515047944886 +4094 7 7.48243332 0.48243331909179688 0.2327419073699275 +4096 5 5.089331 0.089331150054931641 0.0079800543701367133 +4097 6 5.634808 0.36519193649291992 0.13336515047944886 +4099 6 5.024937 0.97506284713745117 0.95074755586779247 +4100 6 6.250351 0.2503509521484375 0.062675599241629243 +4101 5 5.439694 0.43969392776489258 0.19333075011331857 +4102 5 5.439694 0.43969392776489258 0.19333075011331857 +4103 7 6.61045074 0.38954925537109375 0.15174862236017361 +4105 7 6.051799 0.94820117950439453 0.89908547681352502 +4107 6 6.30281353 0.30281352996826172 0.091696033931839338 +4108 6 6.50387859 0.50387859344482422 0.25389363693193445 +4109 6 6.676968 0.67696809768676758 0.45828580528564089 +4111 6 5.916855 0.0831451416015625 0.0069131145719438791 +4112 6 6.29033375 0.29033374786376953 0.084293685148622899 +4119 7 6.77510738 0.22489261627197266 0.05057668885365274 +4120 5 5.63756371 0.63756370544433594 0.40648747849991196 +4122 6 5.22994566 0.77005434036254883 0.5929836871112002 +4125 5 5.72206545 0.72206544876098633 0.52137851229440457 +4126 5 5.6171937 0.61719369888305664 0.38092806194094919 +4128 5 5.545142 0.54514217376708984 0.29717998961950798 +4131 5 5.435503 0.43550300598144531 0.18966286821887479 +4132 5 5.435503 0.43550300598144531 0.18966286821887479 +4133 6 6.504245 0.50424480438232422 0.25426282274656842 +4134 6 6.438658 0.43865823745727539 0.1924210492891234 +4136 6 6.71551752 0.71551752090454102 0.51196532272138029 +4137 5 5.435503 0.43550300598144531 0.18966286821887479 +4138 6 5.60441542 0.3955845832824707 0.156487162530766 +4139 7 6.48148727 0.51851272583007813 0.26885544684773777 +4140 6 5.954033 0.04596710205078125 0.0021129744709469378 +4141 6 5.954033 0.04596710205078125 0.0021129744709469378 +4143 6 5.744161 0.25583887100219727 0.065453527915678933 +4147 7 6.48148727 0.51851272583007813 0.26885544684773777 +4149 7 6.590849 0.40915107727050781 0.16740460403161705 +4150 5 5.16339254 0.16339254379272461 0.026697123367057429 +4151 6 6.510788 0.5107879638671875 0.26090434403158724 +4152 6 5.592431 0.40756893157958984 0.16611243398892839 +4154 5 5.376306 0.37630605697631836 0.14160624851706416 +4155 5 5.29260063 0.29260063171386719 0.085615129679354141 +4159 7 7.16390467 0.16390466690063477 0.026864739831808038 +4160 7 7.16390467 0.16390466690063477 0.026864739831808038 +4162 7 7.16390467 0.16390466690063477 0.026864739831808038 +4163 5 5.101523 0.10152292251586914 0.010306903796163169 +4165 7 6.356756 0.64324378967285156 0.4137625729526917 +4166 7 6.32713461 0.67286539077758789 0.45274783410627606 +4168 6 6.39330339 0.39330339431762695 0.15468755998176675 +4169 7 6.687795 0.31220483779907227 0.097471860745145023 +4170 7 7.16390467 0.16390466690063477 0.026864739831808038 +4171 5 6.347183 1.3471832275390625 1.8149026485625654 +4174 6 5.44309568 0.55690431594848633 0.31014241712205148 +4177 6 6.19482231 0.19482231140136719 0.037955733019771287 +4178 7 6.57164145 0.42835855484008789 0.18349105150468858 +4179 5 5.05455256 0.054552555084228516 0.0029759812662177865 +4180 6 5.084555 0.91544485092163086 0.83803927507892695 +4181 6 5.96743 0.03256988525390625 0.0010607974254526198 +4184 7 6.5577774 0.44222259521484375 0.19556082371855155 +4186 5 5.90006351 0.90006351470947266 0.8101143305111691 +4187 6 6.46320343 0.46320343017578125 0.21455741772660986 +4188 6 6.44960356 0.44960355758666992 0.20214335899459002 +4189 5 5.297014 0.29701423645019531 0.08821745665409253 +4195 8 6.76916 1.2308402061462402 1.5149676130661192 +4196 6 6.51287127 0.51287126541137695 0.26303693488466706 +4199 6 6.176452 0.1764521598815918 0.031135364726878834 +4203 5 5.38581276 0.38581275939941406 0.14885148531539016 +4205 6 6.52375174 0.52375173568725586 0.27431588063541312 +4206 6 5.432502 0.56749820709228516 0.32205421505295817 +4207 7 6.581491 0.41850900650024414 0.17514978852182139 +4208 6 6.212375 0.21237516403198242 0.04510321029761144 +4210 6 5.67804 0.3219599723815918 0.10365822381595535 +4211 6 5.51014376 0.48985624313354492 0.23995913893691068 +4212 4 5.212126 1.2121257781982422 1.4692489021726942 +4213 4 5.060474 1.0604739189147949 1.124604932698503 +4215 5 5.059038 0.059038162231445313 0.0034855045996664558 +4218 6 6.394302 0.3943018913269043 0.15547398150397385 +4221 6 6.65286064 0.65286064147949219 0.42622701719301404 +4222 4 4.633886 0.63388586044311523 0.40181128406970856 +4223 4 4.400543 0.400543212890625 0.16043486539274454 +4225 5 5.63308668 0.6330866813659668 0.40079874612297317 +4227 7 5.683286 1.316713809967041 1.733735257357921 +4228 6 5.52954865 0.47045135498046875 0.22132447740295902 +4229 6 5.500939 0.49906110763549805 0.24906198915437017 +4230 6 5.10506773 0.89493227005004883 0.80090376797693352 +4231 6 6.10618258 0.10618257522583008 0.011274739281589063 +4233 6 5.702374 0.29762601852416992 0.088581246902549537 +4235 5 5.387373 0.38737297058105469 0.15005781833679066 +4236 5 5.387373 0.38737297058105469 0.15005781833679066 +4237 5 6.079797 1.0797967910766602 1.1659611100194525 +4240 6 6.04235 0.042349815368652344 0.0017935068617589423 +4241 6 6.64007854 0.64007854461669922 0.40970054327863181 +4244 5 5.441324 0.44132423400878906 0.19476707952344441 +4249 6 5.78925276 0.21074724197387695 0.044414399999595844 +4251 6 5.858612 0.141387939453125 0.019990549422800541 +4253 4 5.8745327 1.8745326995849609 3.5138728418132814 +4254 5 5.450234 0.45023393630981445 0.20271059740503006 +4256 5 5.133646 0.13364601135253906 0.017861256350443 +4257 5 6.02000427 1.0200042724609375 1.0404087158385664 +4260 6 6.01973867 0.019738674163818359 0.00038961525774539041 +4261 7 6.56697464 0.43302536010742188 0.18751096249616239 +4262 6 6.330959 0.33095884323120117 0.10953375591293479 +4263 6 5.64368629 0.35631370544433594 0.12695945668747299 +4266 7 6.56697464 0.43302536010742188 0.18751096249616239 +4268 6 6.285269 0.28526878356933594 0.081378278879128629 +4271 5 5.01476955 0.014769554138183594 0.00021813972944073612 +4272 6 5.781704 0.21829605102539063 0.047653165893279947 +4274 6 5.781704 0.21829605102539063 0.047653165893279947 +4275 6 5.781704 0.21829605102539063 0.047653165893279947 +4278 4 4.938565 0.93856477737426758 0.88090384132760846 +4279 6 6.01974726 0.019747257232666016 0.00038995416821308027 +4281 5 5.319337 0.31933689117431641 0.1019760500648772 +4288 6 6.14997339 0.14997339248657227 0.02249201845393145 +4291 5 5.485445 0.48544502258300781 0.23565686995061697 +4292 6 6.1382513 0.13825130462646484 0.01911342323091958 +4295 5 5.485445 0.48544502258300781 0.23565686995061697 +4297 6 6.570992 0.57099199295043945 0.3260318560135147 +4300 5 5.6564436 0.65644359588623047 0.43091819458004466 +4301 5 5.090175 0.090175151824951172 0.0081315580066529947 +4304 6 6.063004 0.063004016876220703 0.0039695061425391032 +4306 6 5.888244 0.1117558479309082 0.012489369546756279 +4307 7 6.46735144 0.53264856338500977 0.28371449207611477 +4308 6 6.231441 0.23144102096557617 0.053564946185588269 +4310 6 5.56281471 0.43718528747558594 0.19113097558511072 +4311 5 6.594462 1.5944619178771973 2.5423088075606302 +4314 7 6.20663929 0.79336071014404297 0.62942121640026016 +4315 7 7.05764341 0.057643413543701172 0.0033227631249701517 +4318 7 6.20663929 0.79336071014404297 0.62942121640026016 +4319 7 7.05764341 0.057643413543701172 0.0033227631249701517 +4322 7 6.27760839 0.72239160537719727 0.5218496315194443 +4323 6 6.29443645 0.29443645477294922 0.086692825899262971 +4324 6 6.31806231 0.31806230545043945 0.10116363014844865 +4325 5 5.31029463 0.31029462814331055 0.09628275625459537 +4327 5 5.31029463 0.31029462814331055 0.09628275625459537 +4331 5 5.391353 0.39135313034057617 0.153157272627368 +4336 8 7.729702 0.27029800415039063 0.073061011047684588 +4338 8 7.729702 0.27029800415039063 0.073061011047684588 +4339 8 5.958715 2.0412850379943848 4.1668446063397369 +4342 6 6.291953 0.29195308685302734 0.085236604923011328 +4344 6 5.317271 0.68272876739501953 0.46611856982872268 +4345 6 6.31709051 0.31709051132202148 0.10054639237046104 +4346 6 5.317271 0.68272876739501953 0.46611856982872268 +4347 7 6.621838 0.37816190719604492 0.14300642805415009 +4348 6 5.36084461 0.63915538787841797 0.40851960985401092 +4350 6 6.83250046 0.83250045776367188 0.69305701217672322 +4356 5 5.504216 0.50421619415283203 0.25423397044596641 +4357 6 6.453199 0.45319890975952148 0.2053892518072189 +4359 6 5.04429054 0.95570945739746094 0.9133805669589492 +4360 5 5.40712547 0.40712547302246094 0.16575115078376257 +4364 6 6.245087 0.2450871467590332 0.06006770950648388 +4367 5 5.45087051 0.45087051391601563 0.20328422031889204 +4368 6 6.67910862 0.67910861968994141 0.46118851733717747 +4371 5 5.74291 0.74290990829467773 0.55191513184240648 +4373 6 6.36110163 0.36110162734985352 0.13039438527471248 +4374 5 5.32525253 0.32525253295898438 0.10578921019623522 +4377 6 7.04408646 1.0440864562988281 1.0901165282266447 +4379 5 5.196431 0.19643115997314453 0.038585200608395098 +4381 6 6.36042356 0.36042356491088867 0.12990514614307358 +4383 6 7.04408646 1.0440864562988281 1.0901165282266447 +4384 5 5.18999052 0.18999052047729492 0.036096397871233421 +4385 5 5.18999052 0.18999052047729492 0.036096397871233421 +4387 6 6.435978 0.43597793579101563 0.19007676049659494 +4389 4 5.99478436 1.9947843551635742 3.9791646236053566 +4390 5 5.17939425 0.17939424514770508 0.032182295192114907 +4391 5 5.379522 0.37952184677124023 0.14403683217665275 +4392 5 5.17939425 0.17939424514770508 0.032182295192114907 +4394 6 5.834315 0.16568517684936523 0.027451577827605433 +4395 5 5.269406 0.26940584182739258 0.072579507610726068 +4396 5 5.316714 0.31671380996704102 0.10030763742383897 +4401 6 7.47518349 1.4751834869384766 2.1761663201359625 +4402 6 6.7421875 0.7421875 0.55084228515625 +4404 5 5.17557526 0.17557525634765625 0.030826670641545206 +4405 5 5.17557526 0.17557525634765625 0.030826670641545206 +4407 6 6.18221474 0.18221473693847656 0.033202210357558215 +4409 7 6.862802 0.13719797134399414 0.018823283340907437 +4412 7 6.47333336 0.52666664123535156 0.27737775099012651 +4416 5 5.318562 0.31856203079223633 0.10148176746247373 +4420 6 5.97056 0.029439926147460938 0.0008667092515679542 +4423 6 5.966315 0.033685207366943359 0.0011346931953539752 +4424 6 5.97056 0.029439926147460938 0.0008667092515679542 +4425 6 5.889046 0.11095380783081055 0.012310747472156436 +4427 5 5.589685 0.58968496322631836 0.34772835585522444 +4429 6 5.65252161 0.34747838973999023 0.12074123133629655 +4430 5 5.1771245 0.1771245002746582 0.031373088597547394 +4432 6 6.515359 0.51535892486572266 0.26559482143875357 +4433 5 4.73562431 0.26437568664550781 0.069894503689283738 +4434 6 6.01353645 0.013536453247070313 0.00018323556651012041 +4435 6 5.850846 0.1491541862487793 0.022246971275535543 +4438 5 5.73496962 0.7349696159362793 0.54018033634952189 +4441 6 6.27864456 0.27864456176757813 0.077642791802645661 +4444 6 6.3316474 0.33164739608764648 0.10998999533171627 +4450 6 6.14488649 0.14488649368286133 0.020992096051713816 +4451 5 5.14968872 0.149688720703125 0.022406713105738163 +4452 5 5.28926849 0.28926849365234375 0.083676261419896036 +4454 6 5.80965662 0.19034337997436523 0.036230602300065584 +4458 7 6.61311436 0.38688564300537109 0.14968050076367945 +4463 6 6.658324 0.65832376480102539 0.4333901793017958 +4464 5 5.120392 0.120391845703125 0.014494196511805058 +4467 5 5.73596573 0.73596572875976563 0.54164555390889291 +4468 6 6.12151051 0.12151050567626953 0.01476480298970273 +4469 6 6.24088 0.24088001251220703 0.058023180427881016 +4471 6 6.16272926 0.16272926330566406 0.026480813136004144 +4474 6 5.6268096 0.37319040298461914 0.13927107687982243 +4476 6 6.544504 0.54450416564941406 0.29648478640956455 +4477 5 5.24585152 0.24585151672363281 0.060442968275310704 +4479 5 4.967896 0.032104015350341797 0.0010306678016149817 +4480 5 6.4718976 1.4718976020812988 2.1664825510126775 +4483 4 4.978445 0.97844505310058594 0.95735472193700843 +4484 5 4.967896 0.032104015350341797 0.0010306678016149817 +4485 6 6.47099161 0.47099161148071289 0.2218330980851988 +4487 6 6.01450157 0.014501571655273438 0.00021029558047302999 +4488 6 6.66565847 0.66565847396850586 0.44310120396607999 +4490 6 6.46030855 0.46030855178833008 0.21188396284946975 +4492 6 6.17970562 0.17970561981201172 0.032294109792019299 +4495 6 5.32732725 0.67267274856567383 0.45248862666289824 +4500 6 5.7847333 0.21526670455932617 0.046339754091832219 +4501 6 4.38273048 1.6172695159912109 2.6155606873544457 +4502 6 6.209939 0.20993900299072266 0.044074384976738656 +4505 5 5.354311 0.35431098937988281 0.12553627719535143 +4506 6 6.38854027 0.38854026794433594 0.15096353981425636 +4508 4 6.35570669 2.3557066917419434 5.5493540175177714 +4510 6 7.131123 1.1311230659484863 1.2794393903207038 +4513 6 6.408106 0.40810585021972656 0.16655038498356589 +4515 6 6.40050936 0.40050935745239258 0.16040774540692837 +4518 6 5.206761 0.79323911666870117 0.62922829621334131 +4519 6 6.27893829 0.27893829345703125 0.077806571556720883 +4523 5 6.205263 1.2052631378173828 1.4526592313814035 +4524 6 5.74004173 0.25995826721191406 0.067578300691820914 +4525 6 6.27893829 0.27893829345703125 0.077806571556720883 +4529 6 5.65850925 0.34149074554443359 0.11661592929249309 +4537 5 5.47643948 0.47643947601318359 0.22699457430371694 +4538 6 7.06011152 1.0601115226745605 1.1238364405073753 +4539 5 5.625727 0.62572717666625977 0.39153449961872866 +4540 6 7.01432848 1.0143284797668457 1.0288622648661203 +4541 6 6.414744 0.41474390029907227 0.1720125028352868 +4545 6 6.605016 0.60501623153686523 0.36604464042306972 +4546 6 6.60486555 0.60486555099487305 0.36586233478033137 +4547 6 6.235944 0.23594379425048828 0.055669474045316747 +4548 5 5.460303 0.46030282974243164 0.21187869506889001 +4550 6 5.86993 0.13007020950317383 0.016918259400199531 +4553 6 7.01432848 1.0143284797668457 1.0288622648661203 +4555 5 5.59962273 0.59962272644042969 0.35954741406385438 +4559 7 5.797486 1.2025141716003418 1.4460403328996563 +4560 6 7.544105 1.544105052947998 2.3842604145395399 +4562 7 6.26490545 0.73509454727172852 0.54036399342862751 +4563 7 6.43433571 0.56566429138183594 0.31997609054451459 +4569 6 5.82548571 0.1745142936706543 0.03045523869536737 +4571 7 6.409703 0.59029722213745117 0.34845081046319137 +4574 7 7.56355667 0.56355667114257813 0.31759612158930395 +4575 7 6.80576038 0.19423961639404297 0.037729028576904966 +4576 5 5.672396 0.67239618301391602 0.45211662693168364 +4578 7 6.73552 0.2644801139831543 0.069949730692542289 +4581 6 6.09460163 0.094601631164550781 0.0089494686189937056 +4582 6 5.86895657 0.13104343414306641 0.017172381632008182 +4588 5 6.259477 1.2594771385192871 1.5862826624527315 +4589 6 6.50933647 0.50933647155761719 0.25942364125876338 +4591 6 5.471005 0.52899503707885742 0.27983574925406174 +4592 6 6.50867176 0.50867176055908203 0.25874695999027608 +4594 6 7.082544 1.0825438499450684 1.1719011870538907 +4595 6 6.133527 0.13352680206298828 0.017829406869168452 +4601 6 6.48194647 0.48194646835327148 0.23227239835819091 +4603 6 6.293041 0.29304122924804688 0.085873162039206363 +4604 6 6.22902727 0.22902727127075195 0.052453490985726603 +4610 6 5.326705 0.67329502105712891 0.45332618538031966 +4611 5 6.039484 1.0394840240478516 1.0805270362507144 +4612 5 5.33843374 0.33843374252319336 0.11453739807825514 +4614 5 4.97168446 0.028315544128417969 0.00080177003928838531 +4616 5 5.59241867 0.59241867065429688 0.35095988133980427 +4618 7 6.42852545 0.57147455215454102 0.32658316376023322 +4620 6 5.808576 0.19142389297485352 0.036643106801648173 +4622 7 7.204969 0.20496892929077148 0.042012261974605281 +4626 6 6.09176064 0.091760635375976563 0.0084200142046029214 +4627 6 6.17300463 0.1730046272277832 0.029930601042224225 +4628 6 6.17300463 0.1730046272277832 0.029930601042224225 +4629 7 6.012713 0.98728704452514648 0.97473570828719858 +4631 7 6.16862 0.83137989044189453 0.69119252223117655 +4633 6 5.419295 0.58070516586303711 0.33721848966001744 +4634 6 6.527281 0.52728080749511719 0.27802504995270283 +4637 6 6.35494137 0.35494136810302734 0.12598337479084876 +4638 5 5.38869524 0.38869524002075195 0.15108398961478997 +4640 6 6.35494137 0.35494136810302734 0.12598337479084876 +4643 6 5.883711 0.11628913879394531 0.013523163801437477 +4646 7 6.12449837 0.87550163269042969 0.76650310884360806 +4649 5 5.01977348 0.019773483276367188 0.00039099064088077284 +4651 7 7.3044734 0.3044734001159668 0.09270405137817761 +4652 5 5.218393 0.21839284896850586 0.047695436480580611 +4656 7 6.594793 0.40520715713500977 0.1641928401934365 +4657 7 6.594793 0.40520715713500977 0.1641928401934365 +4661 5 5.733464 0.73346376419067383 0.53796909338075238 +4664 7 6.38869572 0.61130428314208984 0.37369292658786435 +4667 7 6.38869572 0.61130428314208984 0.37369292658786435 +4668 7 6.396843 0.60315704345703125 0.36379841907182708 +4669 5 6.01887846 1.0188784599304199 1.0381133161101843 +4673 7 6.829722 0.17027807235717773 0.028994621925676256 +4674 7 7.480595 0.48059511184692383 0.23097166153115722 +4678 6 5.634528 0.36547183990478516 0.13356966576338891 +4679 5 5.25704 0.25704002380371094 0.066069573837012285 +4682 6 5.864652 0.13534784317016602 0.018319038650815855 +4684 6 5.99708748 0.0029125213623046875 8.4827806858811527E-06 +4685 5 5.60988665 0.60988664627075195 0.37196172129938532 +4686 4 4.5981946 0.59819459915161133 0.35783677845415696 +4688 6 5.99485159 0.0051484107971191406 2.6506133735892945E-05 +4692 5 5.76820374 0.7682037353515625 0.59013697900809348 +4693 6 5.99485159 0.0051484107971191406 2.6506133735892945E-05 +4694 7 5.9951334 1.0048666000366211 1.0097568838691586 +4695 7 7.197026 0.19702577590942383 0.038819156372710495 +4698 6 5.40118074 0.59881925582885742 0.35858450115142659 +4699 5 5.850246 0.85024595260620117 0.72291817992322649 +4700 5 5.850246 0.85024595260620117 0.72291817992322649 +4702 6 5.25802 0.74198007583618164 0.55053443293786586 +4703 7 6.73666143 0.26333856582641602 0.069347200251513641 +4704 6 5.49017763 0.50982236862182617 0.25991884754716921 +4705 6 5.82633734 0.17366266250610352 0.030158720348708812 +4709 6 6.57755852 0.57755851745605469 0.33357384108603583 +4710 7 6.916105 0.083895206451416016 0.0070384056655257154 +4711 6 5.845137 0.15486288070678711 0.023982511820804575 +4714 7 6.586605 0.41339492797851563 0.17089536647836212 +4717 6 5.740331 0.25966882705688477 0.06742789974509833 +4720 5 6.219128 1.2191281318664551 1.4862734019081927 +4721 6 6.535844 0.53584384918212891 0.28712863070632011 +4724 6 6.535844 0.53584384918212891 0.28712863070632011 +4726 6 6.86302328 0.86302328109741211 0.7448091837161428 +4728 6 6.30442429 0.30442428588867188 0.092674145838827826 +4731 6 6.8704896 0.87048959732055664 0.75775213904330485 +4732 6 6.8704896 0.87048959732055664 0.75775213904330485 +4736 6 5.867101 0.13289880752563477 0.017662093041735716 +4739 6 6.42715454 0.427154541015625 0.18246100191026926 +4740 5 5.4530344 0.45303440093994141 0.20524016843501158 +4741 6 6.15025043 0.15025043487548828 0.022575193180273345 +4742 6 6.04357 0.043570041656494141 0.0018983485299486347 +4744 5 5.634781 0.6347808837890625 0.40294677042402327 +4745 3 5.54872656 2.5487265586853027 6.4960070709478259 +4747 6 6.425161 0.42516088485717773 0.18076177801253834 +4749 6 5.05324841 0.94675159454345703 0.89633858177057846 +4750 5 5.608757 0.60875701904296875 0.37058510823408142 +4751 6 5.22416258 0.77583742141723633 0.60192370447134635 +4753 6 6.984895 0.98489522933959961 0.97001861277590251 +4755 6 6.162296 0.16229581832885742 0.026339932647033493 +4760 6 5.80196 0.19804000854492188 0.039219844984472729 +4761 6 6.1952095 0.19520950317382813 0.038106750129372813 +4763 7 7.03779554 0.037795543670654297 0.0014285031213603361 +4765 8 6.97475052 1.0252494812011719 1.0511364987032721 +4767 7 5.745017 1.2549829483032227 1.5749822005318492 +4768 6 5.863212 0.13678789138793945 0.01871092723035872 +4769 6 5.863212 0.13678789138793945 0.01871092723035872 +4777 6 6.517849 0.51784896850585938 0.26816755418258253 +4778 6 5.594188 0.40581178665161133 0.16468320618537291 +4779 4 4.573623 0.5736231803894043 0.32904355308005506 +4780 5 5.31235266 0.31235265731811523 0.097564182533687926 +4781 5 5.38558674 0.38558673858642578 0.14867713297371665 +4782 6 5.71773052 0.28226947784423828 0.079676058122458926 +4786 8 7.073131 0.92686891555786133 0.85908598662740587 +4787 8 7.001248 0.99875211715698242 0.99750579152555474 +4788 5 5.602041 0.60204076766967773 0.36245308593629488 +4790 6 6.56148863 0.56148862838745117 0.31526947980842124 +4792 6 7.33942556 1.3394255638122559 1.7940608409937795 +4795 7 6.783159 0.21684122085571289 0.047020115062196055 +4798 5 5.705885 0.70588493347167969 0.49827353930231766 +4799 6 5.50493431 0.49506568908691406 0.24509003651110106 +4805 6 5.933027 0.066973209381103516 0.004485410774805132 +4806 6 5.25618362 0.74381637573242188 0.55326280080771539 +4809 6 5.84081841 0.15918159484863281 0.025338780138554284 +4810 5 5.76808643 0.76808643341064453 0.58995676918948448 +4814 6 6.0173893 0.017389297485351563 0.00030238766703405418 +4818 6 6.429421 0.42942094802856445 0.18440235060575105 +4819 6 6.0173893 0.017389297485351563 0.00030238766703405418 +4820 5 5.26329374 0.26329374313354492 0.069323595173273134 +4821 6 5.773676 0.22632408142089844 0.051222589831013465 +4823 7 6.05669355 0.94330644607543945 0.88982705120747596 +4824 5 5.61980629 0.61980628967285156 0.38415983671802678 +4825 6 6.29941463 0.29941463470458984 0.089649123475282977 +4827 6 6.6732707 0.67327070236206055 0.45329343865910232 +4831 6 5.590648 0.40935182571411133 0.16756891721547618 +4833 6 5.94547939 0.054520606994628906 0.0029724965870627784 +4838 6 6.32839632 0.32839632034301758 0.10784414321483382 +4840 7 6.710075 0.28992509841918945 0.084056562693376691 +4842 6 5.77888966 0.22111034393310547 0.04888978419421619 +4843 5 6.01944 1.0194401741027832 1.0392582685747129 +4847 7 6.45959568 0.54040431976318359 0.29203682881870918 +4848 6 6.241429 0.24142885208129883 0.058287890617293669 +4855 6 5.87883329 0.12116670608520508 0.014681370663538473 +4857 6 5.837939 0.16206121444702148 0.026263837228043485 +4858 5 5.23321867 0.23321866989135742 0.054390947985893945 +4861 6 5.94553232 0.054467678070068359 0.0029667279543446057 +4863 7 7.39696741 0.39696741104125977 0.15758312542880049 +4864 5 5.52893162 0.52893161773681641 0.27976865624168568 +4865 6 7.049436 1.049436092376709 1.1013161119828965 +4868 6 6.187224 0.18722391128540039 0.035052792957003476 +4870 7 6.183802 0.81619787216186523 0.6661789665215565 +4873 6 6.869692 0.86969184875488281 0.75636391179068596 +4874 6 5.979304 0.020696163177490234 0.00042833117026930267 +4875 6 5.571311 0.42868900299072266 0.18377426128517982 +4877 5 4.36846638 0.63153362274169922 0.39883471665325487 +4884 5 5.59040356 0.59040355682373047 0.34857635991011193 +4885 6 5.74394369 0.25605630874633789 0.065564833248799914 +4890 6 6.7028656 0.7028656005859375 0.49402005248703063 +4891 6 5.521093 0.47890710830688477 0.22935201838686226 +4892 5 5.94552565 0.9455256462097168 0.89401874764030254 +4893 6 6.23143 0.2314300537109375 0.053559869760647416 +4895 6 5.37373352 0.6262664794921875 0.39220970333553851 +4897 6 5.62531757 0.37468242645263672 0.14038692069243552 +0 6 5.760466 0.23953390121459961 0.057376489831085564 +1 6 5.294115 0.70588493347167969 0.49827353930231766 +2 6 5.59617853 0.40382146835327148 0.16307177830299224 +3 6 5.84859467 0.15140533447265625 0.022923575306776911 +4 6 5.84859467 0.15140533447265625 0.022923575306776911 +7 6 5.760466 0.23953390121459961 0.057376489831085564 +12 5 6.1283617 1.128361701965332 1.2732001304621008 +13 7 6.41504 0.58495998382568359 0.34217818267734401 +14 5 5.24674654 0.24674654006958008 0.060883855036308887 +15 7 6.208092 0.79190778732299805 0.62711794362280671 +16 6 4.963639 1.0363612174987793 1.0740445731355521 +17 8 6.49511576 1.5048842430114746 2.264676584864219 +19 5 5.36396646 0.36396646499633789 0.13247158764193045 +22 8 6.25016737 1.7498326301574707 3.0619142335638116 +23 5 5.02689552 0.026895523071289063 0.00072336916127824225 +24 6 5.06524944 0.93475055694580078 0.87375860371048475 +26 6 6.074901 0.074901103973388672 0.0056101753764323803 +27 6 5.796622 0.20337820053100586 0.041362692451230032 +29 7 6.52617359 0.47382640838623047 0.22451146528419486 +30 6 5.333254 0.66674613952636719 0.4445504145733139 +33 6 6.07082129 0.070821285247802734 0.0050156544441506412 +34 5 5.449047 0.44904708862304688 0.20164328780083451 +36 5 5.051116 0.051115989685058594 0.0026128444014830166 +38 5 5.340738 0.34073781967163086 0.11610226175457683 +39 5 5.340738 0.34073781967163086 0.11610226175457683 +42 6 5.60342 0.39658021926879883 0.15727587031528856 +43 6 6.01738262 0.017382621765136719 0.00030215553942980478 +47 5 4.866223 0.13377714157104492 0.017896323606919395 +49 5 6.221687 1.221686840057373 1.4925187351693694 +53 6 6.41970825 0.419708251953125 0.17615501675754786 +55 6 5.986149 0.013851165771484375 0.00019185479322914034 +57 6 5.406242 0.59375810623168945 0.35254868871584222 +58 6 5.20185137 0.79814863204956055 0.63704123884258479 +59 6 5.90068769 0.099312305450439453 0.0098629340138813859 +61 6 5.406242 0.59375810623168945 0.35254868871584222 +62 5 5.29558659 0.29558658599853516 0.08737142982226942 +65 5 4.91127968 0.088720321655273438 0.0078712954746151809 +67 5 5.35263872 0.35263872146606445 0.12435406787722059 +75 5 5.26306438 0.26306438446044922 0.069202870371555036 +78 5 5.796858 0.79685783386230469 0.63498240738772438 +80 6 6.851635 0.85163497924804688 0.72528213787882123 +81 6 6.130857 0.13085699081420898 0.017123552044949975 +83 6 5.73027 0.2697300910949707 0.072754322042101194 +84 5 5.232582 0.23258209228515625 0.054094429651740938 +85 6 5.21471 0.78528976440429688 0.61668001407815609 +86 6 5.27120543 0.72879457473754883 0.53114153216688464 +87 6 5.56987047 0.4301295280456543 0.18501141089677731 +89 6 5.21471 0.78528976440429688 0.61668001407815609 +94 7 6.043582 0.95641803741455078 0.91473546229190106 +101 5 5.535883 0.53588294982910156 0.28717053591753938 +103 5 5.394018 0.39401817321777344 0.15525032082587131 +107 6 6.09827232 0.098272323608398438 0.0096574495873937849 +110 6 5.97177 0.028230190277099609 0.00079694364308124932 +114 5 5.17982864 0.17982864379882813 0.032338341130525805 +116 6 6.428582 0.42858219146728516 0.18368269484290067 +118 5 5.192375 0.19237518310546875 0.037008211074862629 +119 5 5.13975763 0.13975763320922852 0.019532196040245253 +124 6 5.696412 0.30358791351318359 0.092165621231288242 +126 5 6.026167 1.0261669158935547 1.0530185392744897 +127 7 6.21480465 0.78519535064697266 0.61653173867762234 +130 5 4.77477 0.22523021697998047 0.050728650640849082 +134 5 5.139866 0.13986587524414063 0.019562463057809509 +135 5 5.60496473 0.6049647331237793 0.36598232832352551 +136 6 5.858693 0.14130687713623047 0.019967633525993733 +139 6 6.03543043 0.035430431365966797 0.0012553154667784838 +140 5 5.60465 0.60465002059936523 0.3656016474108128 +142 6 6.084482 0.084482192993164063 0.007137240932934219 +143 6 5.8161664 0.18383359909057617 0.033794792154594688 +146 6 5.524167 0.47583293914794922 0.22641698597817594 +148 7 6.906253 0.093747138977050781 0.0087885260663824738 +149 6 5.58138275 0.41861724853515625 0.17524040077114478 +153 5 5.875115 0.87511491775512695 0.76582611927756261 +155 6 5.928622 0.071378231048583984 0.0050948518676250387 +157 7 6.41029167 0.58970832824707031 0.34775591240395443 +158 8 6.370565 1.6294350624084473 2.6550586226060204 +159 8 6.370565 1.6294350624084473 2.6550586226060204 +160 7 6.41029167 0.58970832824707031 0.34775591240395443 +162 5 5.36589956 0.36589956283569336 0.13388249008335151 +163 6 5.928622 0.071378231048583984 0.0050948518676250387 +165 5 5.708807 0.70880699157714844 0.50240735130864778 +166 6 5.26426 0.73574018478393555 0.54131361950589962 +168 5 5.207327 0.20732688903808594 0.042984438918210799 +170 6 6.053034 0.053033828735351563 0.0028125869903306011 +172 4 4.75167847 0.751678466796875 0.56502051744610071 +175 6 6.3391943 0.33919429779052734 0.11505277165360894 +178 4 4.61763 0.6176300048828125 0.38146682293154299 +182 5 5.274463 0.27446317672729492 0.075330035379238325 +184 5 5.32252359 0.32252359390258789 0.10402146862384143 +185 5 5.36232662 0.36232662200927734 0.13128058101665374 +186 6 5.84258556 0.15741443634033203 0.024779304768344446 +190 6 5.46028948 0.53971052169799805 0.29128744723152522 +193 5 6.09086466 1.0908646583557129 1.1899857028495262 +194 5 5.24797 0.2479701042175293 0.061489172585652341 +195 6 5.31127167 0.68872833251953125 0.47434671601513401 +197 5 5.21954346 0.21954345703125 0.048199329525232315 +200 5 5.61530256 0.61530256271362305 0.37859724368195202 +203 6 6.86750841 0.8675084114074707 0.75257084386271345 +208 5 5.026546 0.026546001434326172 0.00070469019215124717 +213 6 6.026121 0.026121139526367188 0.00068231393015594222 +214 7 6.450726 0.54927396774291992 0.30170189164005023 +215 5 5.307987 0.30798721313476563 0.094856123454519548 +217 5 5.307987 0.30798721313476563 0.094856123454519548 +220 5 5.54282665 0.54282665252685547 0.29466077469351148 +221 6 5.35106373 0.64893627166748047 0.42111828468569001 +222 7 6.450726 0.54927396774291992 0.30170189164005023 +224 6 5.836071 0.16392898559570313 0.026872712318436243 +225 5 5.64871836 0.64871835708618164 0.42083550682059467 +227 6 5.07952 0.92047977447509766 0.84728301521772664 +229 5 5.64871836 0.64871835708618164 0.42083550682059467 +230 4 4.760241 0.76024103164672852 0.57796642619928207 +231 6 5.60397243 0.39602756500244141 0.15683783224176295 +232 6 5.85416746 0.14583253860473633 0.021267129315901911 +234 6 6.16361237 0.16361236572265625 0.026769006217364222 +235 6 6.16361237 0.16361236572265625 0.026769006217364222 +236 6 6.16361237 0.16361236572265625 0.026769006217364222 +238 7 6.311166 0.68883419036865234 0.47449254182083678 +243 6 5.903076 0.096923828125 0.009394228458404541 +245 6 5.514191 0.4858088493347168 0.23601023809192156 +251 3 4.82756948 1.8275694847106934 3.3400102214457092 +253 3 4.84502363 1.8450236320495605 3.4041122028213522 +255 8 5.828538 2.1714620590209961 4.7152474737677039 +256 7 6.028649 0.97135114669799805 0.94352305019151572 +261 5 5.66695833 0.66695833206176758 0.44483341670661503 +263 6 5.779109 0.22089099884033203 0.048792833368679567 +264 6 5.468629 0.53137111663818359 0.28235526359731011 +265 5 5.66695833 0.66695833206176758 0.44483341670661503 +266 6 5.227504 0.77249622344970703 0.5967504152440597 +270 6 5.227504 0.77249622344970703 0.5967504152440597 +273 5 5.04690742 0.046907424926757813 0.0022003065132594202 +274 5 5.32239056 0.32239055633544922 0.10393567081428046 +281 8 6.920855 1.0791449546813965 1.1645538332143133 +282 4 5.13089275 1.1308927536010742 1.27891842014742 +286 6 5.202199 0.79780101776123047 0.63648646394085517 +287 7 6.399926 0.60007381439208984 0.36008858271907229 +289 7 6.399926 0.60007381439208984 0.36008858271907229 +292 5 5.56242371 0.5624237060546875 0.31632042513228953 +294 3 4.28524733 1.2852473258972168 1.6518606887259466 +295 6 5.396621 0.6033787727355957 0.36406594338791365 +298 6 5.701315 0.29868507385253906 0.089212773342296714 +302 6 5.887432 0.11256790161132813 0.012671532473177649 +305 6 5.437251 0.56274890899658203 0.31668633457684336 +306 5 5.30845976 0.30845975875854492 0.095147422773379731 +307 6 5.404123 0.59587717056274414 0.35506960239786167 +310 7 6.45454025 0.54545974731445313 0.29752633594034705 +313 6 5.506036 0.49396419525146484 0.24400062619042728 +315 6 5.470152 0.52984809875488281 0.28073900775416405 +318 7 6.52936554 0.47063446044921875 0.22149679536232725 +320 7 5.68558025 1.3144197463989258 1.7276992697234164 +322 6 6.05053425 0.050534248352050781 0.0025537102565067471 +324 5 4.646965 0.35303497314453125 0.1246336922631599 +325 5 4.59268665 0.40731334686279297 0.1659041625325699 +326 6 5.789024 0.21097612380981445 0.044510924817814157 +330 8 6.97127628 1.0287237167358398 1.0582724853748005 +334 5 6.14773369 1.1477336883544922 1.3172926193838066 +335 6 6.41830826 0.41830825805664063 0.17498179875838105 +337 6 5.28686953 0.71313047409057617 0.50855507307664993 +339 7 6.665181 0.33481884002685547 0.11210365563692903 +340 7 5.694383 1.3056168556213379 1.7046353736825495 +341 6 5.31231642 0.6876835823059082 0.47290870937308682 +342 6 5.279088 0.72091197967529297 0.51971408243935002 +345 6 5.887382 0.11261796951293945 0.01268280705721736 +351 7 7.006105 0.0061049461364746094 3.727036732925626E-05 +356 6 6.174892 0.17489194869995117 0.030587193720066352 +357 6 5.64322853 0.35677146911621094 0.12728588117533945 +359 6 6.14331532 0.14331531524658203 0.020539279584227188 +362 6 5.94113731 0.058862686157226563 0.0034648158216441516 +363 6 6.174892 0.17489194869995117 0.030587193720066352 +364 7 6.49051857 0.50948143005371094 0.25957132756957435 +365 7 6.982633 0.017366886138916016 0.00030160873416207323 +367 6 5.258188 0.74181222915649414 0.55028538332612698 +369 5 6.047746 1.0477461814880371 1.0977720608227628 +372 5 5.063949 0.063949108123779297 0.0040894884298268153 +374 7 6.68047762 0.31952238082885742 0.10209455185054139 +375 7 6.68047762 0.31952238082885742 0.10209455185054139 +380 7 5.89107656 1.1089234352111816 1.2297111851605678 +382 6 5.279668 0.72033214569091797 0.51887840011568187 +385 7 6.68047762 0.31952238082885742 0.10209455185054139 +386 7 6.47401237 0.52598762512207031 0.27666298178155557 +390 7 5.77210665 1.2278933525085449 1.5077220851346738 +393 6 6.532292 0.53229188919067383 0.28333465529817659 +394 5 5.113532 0.11353206634521484 0.012889530088614265 +397 6 6.450558 0.45055818557739258 0.20300267859079213 +400 6 6.450558 0.45055818557739258 0.20300267859079213 +401 5 5.113532 0.11353206634521484 0.012889530088614265 +402 5 4.784559 0.21544122695922852 0.046414922273697812 +403 5 5.150881 0.15088081359863281 0.02276501991218538 +405 5 5.233643 0.2336430549621582 0.054589077132050079 +407 5 5.072737 0.072737216949462891 0.0052907027295532316 +408 6 6.07039 0.070390224456787109 0.0049547836990768701 +410 6 5.85691261 0.14308738708496094 0.020474000342801446 +411 6 5.7674613 0.23253870010375977 0.054074247045946322 +412 5 5.63204336 0.63204336166381836 0.3994788110233003 +417 5 5.089598 0.089598178863525391 0.0080278336556602881 +420 7 6.749453 0.25054693222045898 0.062773765245083268 +421 6 5.98592949 0.014070510864257813 0.00019797927598119713 +424 7 5.79814625 1.2018537521362305 1.4444524415239357 +425 6 5.98592949 0.014070510864257813 0.00019797927598119713 +426 6 5.98592949 0.014070510864257813 0.00019797927598119713 +427 5 5.209277 0.20927715301513672 0.043796926774120948 +431 5 4.8581214 0.14187860488891602 0.020129538525225144 +432 7 6.188831 0.81116914749145508 0.657995385842014 +433 4 4.92514372 0.92514371871948242 0.85589090028611281 +435 7 7.09158134 0.091581344604492188 0.0083871426795667503 +437 8 6.49513674 1.5048632621765137 2.2646134378485385 +438 7 6.188831 0.81116914749145508 0.657995385842014 +443 6 5.614153 0.38584709167480469 0.14887797815390513 +444 6 5.97591734 0.024082660675048828 0.00057997454518954328 +445 3 6.120806 3.1208062171936035 9.7394314452742492 +446 5 6.695441 1.6954407691955566 2.8745194018504208 +447 6 5.89296055 0.10703945159912109 0.011457444198640587 +448 6 5.89296055 0.10703945159912109 0.011457444198640587 +458 6 5.25619 0.74381017684936523 0.55325357918468399 +459 5 4.669416 0.33058404922485352 0.10928581360190037 +460 5 5.560707 0.56070709228515625 0.31439244333887473 +461 5 5.771966 0.77196598052978516 0.59593147509531263 +462 5 5.23972225 0.23972225189208984 0.057466758052214573 +463 6 5.216147 0.78385305404663086 0.6144256103382304 +468 5 5.023873 0.023872852325439453 0.0005699130781522399 +469 5 5.52225828 0.52225828170776367 0.27275371281234584 +470 6 5.096721 0.90327882766723633 0.81591264051189683 +471 5 5.729003 0.72900295257568359 0.53144530486406438 +472 6 6.24567556 0.24567556381225586 0.060356482654469801 +473 7 6.18447256 0.81552743911743164 0.66508500395343617 +475 5 5.78770447 0.7877044677734375 0.62047832855023444 +476 7 6.38093758 0.61906242370605469 0.38323828444481478 +477 6 6.25798655 0.25798654556274414 0.066557057691397858 +478 6 4.977918 1.0220818519592285 1.0446513121044063 +479 6 6.291813 0.29181289672851563 0.085154766697087325 +481 6 5.883209 0.116790771484375 0.013640084303915501 +485 6 6.138332 0.13833189010620117 0.019135711820354118 +486 6 5.8698926 0.13010740280151367 0.016927936263755328 +488 6 6.530078 0.53007793426513672 0.2809826163947946 +490 6 6.16165 0.16165018081665039 0.026130780958055766 +491 7 6.2314353 0.76856470108032227 0.59069169974668512 +494 6 6.6919 0.69189977645874023 0.47872530066365471 +496 4 5.114645 1.1146450042724609 1.2424334855495545 +498 5 5.27051 0.27051019668579102 0.073175766510985341 +499 4 5.114645 1.1146450042724609 1.2424334855495545 +500 6 5.722214 0.2777857780456543 0.077164938484429513 +503 5 5.04213572 0.042135715484619141 0.0017754185194007732 +505 6 6.0714097 0.071409702301025391 0.005099345582721071 +506 5 4.865561 0.13443899154663086 0.018073842448075084 +508 6 6.37310457 0.37310457229614258 0.13920702186828748 +509 7 5.84958029 1.1504197120666504 1.3234655139115148 +511 6 5.65211773 0.34788227081298828 0.12102207434600132 +512 6 6.2494874 0.24948740005493164 0.062243962786169504 +515 6 5.62628031 0.37371969223022461 0.1396664083606538 +516 5 5.912393 0.91239309310913086 0.83246115635324713 +518 6 6.74377871 0.74377870559692383 0.55320676289943549 +524 5 4.760686 0.23931407928466797 0.057271228543868347 +525 6 5.27357674 0.72642326354980469 0.527690757826349 +526 4 6.060733 2.0607328414916992 4.2466198440024527 +530 6 6.473486 0.47348594665527344 0.22418894168004044 +536 5 5.16379738 0.16379737854003906 0.026829581216588849 +537 6 5.760993 0.23900699615478516 0.057124344210933486 +542 6 5.306597 0.69340276718139648 0.48080739753481794 +543 6 5.959676 0.040324211120605469 0.0016260420024991618 +545 6 6.357703 0.35770320892333984 0.12795158567405451 +550 7 5.32338524 1.6766147613525391 2.8110370579852315 +551 7 5.943192 1.0568079948425293 1.1168431379630874 +552 7 6.1307826 0.8692173957824707 0.75553888113086032 +553 7 5.32338524 1.6766147613525391 2.8110370579852315 +554 7 6.1307826 0.8692173957824707 0.75553888113086032 +555 7 5.943192 1.0568079948425293 1.1168431379630874 +556 5 4.966044 0.033956050872802734 0.0011530133908763673 +562 6 5.03047132 0.9695286750793457 0.93998585180111149 +564 5 5.114619 0.11461877822875977 0.013137464322653614 +567 5 5.716825 0.71682500839233398 0.51383809265666969 +568 6 5.59775925 0.40224075317382813 0.16179762351384852 +570 5 4.94926262 0.050737380981445313 0.0025742818288563285 +571 7 6.66947842 0.33052158355712891 0.10924451719711215 +572 5 5.33599567 0.33599567413330078 0.11289309303629125 +573 7 7.127603 0.12760305404663086 0.016282539402027396 +574 7 6.14305973 0.85694026947021484 0.73434662543968443 +575 6 5.78696442 0.21303558349609375 0.045384159835521132 +576 6 5.6825285 0.31747150421142578 0.10078815598626534 +579 7 6.459541 0.54045915603637695 0.29209609934355285 +580 5 4.94926262 0.050737380981445313 0.0025742818288563285 +583 6 5.17567348 0.82432651519775391 0.6795142036580728 +585 6 5.17567348 0.82432651519775391 0.6795142036580728 +587 7 6.182838 0.81716203689575195 0.66775379454361428 +588 7 6.94865036 0.051349639892578125 0.0026367855170974508 +589 6 5.834272 0.16572809219360352 0.027465800542131547 +591 6 6.23586273 0.23586273193359375 0.055631228315178305 +592 5 5.251458 0.25145816802978516 0.063231210268895666 +595 7 5.37297726 1.6270227432250977 2.6472030069717221 +596 5 5.251458 0.25145816802978516 0.063231210268895666 +597 6 6.31547976 0.31547975540161133 0.099527476068260512 +598 8 6.12208557 1.8779144287109375 3.5265626015607268 +599 7 5.801997 1.198002815246582 1.4352107453387362 +601 6 6.101768 0.10176801681518555 0.010356729246495888 +603 5 4.881016 0.11898422241210938 0.014157245183014311 +605 6 5.47040653 0.52959346771240234 0.28046924104364734 +608 5 5.13522959 0.13522958755493164 0.018287041350276922 +610 8 6.99854326 1.0014567375183105 1.0029155971208183 +611 6 5.71053934 0.28946065902709961 0.083787473124402823 +615 5 5.508101 0.50810098648071289 0.25816661246267358 +616 7 6.078271 0.92172908782958984 0.84958451135116775 +620 5 5.102666 0.10266590118408203 0.010540287265939696 +623 5 5.14863729 0.14863729476928711 0.022093045396331945 +625 8 6.411424 1.5885758399963379 2.5235731994200705 +626 4 4.92221451 0.92221450805664063 0.85047959887015168 +628 6 5.51115227 0.48884773254394531 0.23897210561335669 +630 5 6.03271961 1.032719612121582 1.0665097972605508 +631 5 6.03271961 1.032719612121582 1.0665097972605508 +632 6 6.430566 0.43056583404541016 0.18538693744721968 +635 6 6.40166759 0.40166759490966797 0.16133685680051713 +636 7 6.378405 0.62159490585327148 0.38638022698273744 +637 5 5.22644949 0.22644948959350586 0.051279371337159319 +640 7 6.365346 0.63465404510498047 0.40278575696811458 +643 5 5.40024 0.40023994445800781 0.16019201313974918 +646 4 4.877896 0.87789583206176758 0.77070109195142322 +647 6 5.42187929 0.57812070846557617 0.33422355355673972 +648 5 5.12070274 0.12070274353027344 0.014569152295734966 +650 7 6.49445772 0.50554227828979492 0.25557299513843645 +651 7 6.49445772 0.50554227828979492 0.25557299513843645 +655 6 6.75058842 0.75058841705322266 0.56338297181446251 +658 5 6.03086853 1.0308685302734375 1.0626899267081171 +659 4 5.07536459 1.0753645896911621 1.1564090007616414 +662 4 4.80875 0.80875015258789063 0.65407680931093637 +663 5 5.040732 0.040731906890869141 0.001659088238966433 +664 6 5.695841 0.30415916442871094 0.092512797305971617 +666 6 6.43564749 0.43564748764038086 0.18978873348737579 +667 6 5.695841 0.30415916442871094 0.092512797305971617 +669 5 5.57963753 0.57963752746582031 0.3359796632466896 +671 6 6.40359831 0.40359830856323242 0.16289159467510217 +672 8 7.066577 0.93342304229736328 0.87127857589166524 +673 6 6.343106 0.34310579299926758 0.11772158518965625 +674 5 5.478634 0.47863388061523438 0.22909039167279843 +675 6 4.78799152 1.2120084762573242 1.4689645465196008 +676 6 4.74690247 1.2530975341796875 1.5702534301672131 +677 7 6.78537464 0.21462535858154297 0.0460640445462559 +684 5 5.723876 0.72387599945068359 0.52399646258072607 +686 7 6.37023 0.62976980209350586 0.39661000362889354 +687 4 5.161622 1.1616220474243164 1.3493657810622608 +690 4 6.082882 2.0828819274902344 4.338397123865434 +695 5 5.33051825 0.33051824569702148 0.10924231073863666 +699 5 5.48718262 0.4871826171875 0.23734690248966217 +701 7 6.914577 0.085422992706298828 0.0072970876829003828 +703 6 5.65349865 0.34650135040283203 0.12006318583098619 +708 6 6.082324 0.082324028015136719 0.0067772455886370153 +709 5 4.987764 0.012236118316650391 0.00014972259145906719 +710 5 5.24866629 0.24866628646850586 0.06183492202603702 +713 5 5.492665 0.49266481399536133 0.24271861894908398 +715 7 6.51023674 0.48976325988769531 0.23986805073582218 +716 6 5.139985 0.86001491546630859 0.73962565482452192 +717 5 5.587695 0.58769512176513672 0.34538555614653887 +730 6 6.027294 0.027294158935546875 0.00074497111199889332 +731 6 5.51182747 0.48817253112792969 0.23831242014784948 +733 6 5.83744335 0.16255664825439453 0.026424663891702949 +734 5 5.47097254 0.47097253799438477 0.2218151315448722 +736 6 5.83744335 0.16255664825439453 0.026424663891702949 +737 5 5.47097254 0.47097253799438477 0.2218151315448722 +739 6 5.6218257 0.3781743049621582 0.14301580493361143 +740 3 5.22292662 2.2229266166687012 4.9414027430941587 +741 6 6.449 0.44899988174438477 0.2016008938064715 +742 6 6.38735151 0.38735151290893555 0.15004119455284126 +743 5 5.3871417 0.38714170455932617 0.14987869940910059 +744 5 5.3076973 0.30769729614257813 0.094677626053453423 +745 6 6.703045 0.70304489135742188 0.49427211926376913 +746 6 5.54885435 0.45114564895629883 0.20353239657220001 +747 6 6.505473 0.50547313690185547 0.25550309212940192 +748 6 5.89029551 0.10970449447631836 0.012035076108304565 +750 6 6.505473 0.50547313690185547 0.25550309212940192 +751 6 6.275194 0.27519416809082031 0.075731830151198665 +753 6 5.54885435 0.45114564895629883 0.20353239657220001 +754 5 5.21971035 0.21971035003662109 0.048272637913214567 +755 7 6.596735 0.40326499938964844 0.16262265973273315 +756 5 5.29386139 0.29386138916015625 0.086354516039136797 +759 7 6.5696454 0.43035459518432617 0.18520507759626526 +762 5 5.06554747 0.065547466278076172 0.0042964703354755329 +763 6 5.86560154 0.13439846038818359 0.018062946154714155 +766 5 5.16220665 0.16220664978027344 0.026310997232940281 +767 6 5.43860626 0.56139373779296875 0.31516292883316055 +768 7 5.741325 1.2586750984191895 1.5842630033805563 +769 7 5.741325 1.2586750984191895 1.5842630033805563 +771 7 6.02586 0.97414016723632813 0.94894906542322133 +772 7 5.645487 1.3545131683349609 1.8347059231928142 +775 6 6.31435871 0.31435871124267578 0.098821399334156013 +776 6 6.0731554 0.073155403137207031 0.0053517130081672803 +777 5 5.74329 0.74328994750976563 0.55247994606907014 +787 6 5.772376 0.22762393951416016 0.051812657839946041 +789 6 5.608652 0.39134788513183594 0.15315316719716066 +790 6 5.772376 0.22762393951416016 0.051812657839946041 +791 7 6.60906744 0.39093255996704102 0.15282826644238412 +793 7 6.60906744 0.39093255996704102 0.15282826644238412 +796 6 5.285374 0.71462583541870117 0.51069008464787657 +797 6 6.10648537 0.10648536682128906 0.011339133347064489 +798 6 5.4663415 0.53365850448608398 0.28479139941032372 +800 6 5.266454 0.73354578018188477 0.53808941162265 +801 5 5.12194 0.12194013595581055 0.01486939675692156 +803 7 5.714782 1.2852177619934082 1.6517846957433449 +804 6 5.444122 0.5558781623840332 0.30900053141544959 +805 6 5.266454 0.73354578018188477 0.53808941162265 +807 6 5.24923134 0.75076866149902344 0.56365358308903524 +808 6 4.86180449 1.1381955146789551 1.2954890296352914 +809 6 5.24923134 0.75076866149902344 0.56365358308903524 +811 6 5.0033145 0.99668550491333008 0.99338199570433972 +812 7 4.800945 2.1990551948547363 4.8358437500176024 +813 6 5.35610628 0.64389371871948242 0.41459912100640395 +814 6 4.76751566 1.2324843406677246 1.5190176499911558 +815 5 5.230801 0.23080110549926758 0.053269150299684043 +818 5 5.230801 0.23080110549926758 0.053269150299684043 +820 9 6.74644756 2.2535524368286133 5.0784985855361811 +822 5 5.849502 0.8495020866394043 0.72165379520470196 +823 6 5.83266354 0.16733646392822266 0.028001492160001362 +824 5 5.382196 0.38219594955444336 0.14607374385582261 +825 6 5.932135 0.067864894866943359 0.0046056439553012751 +828 7 6.31619263 0.683807373046875 0.46759252343326807 +830 6 5.80719566 0.19280433654785156 0.03717351219165721 +831 4 6.26753235 2.2675323486328125 5.1417029520962387 +832 8 6.940169 1.0598311424255371 1.1232420504550191 +833 6 6.203789 0.20378923416137695 0.041530051960080527 +834 6 5.80719566 0.19280433654785156 0.03717351219165721 +835 8 6.948848 1.051152229309082 1.104921009181453 +837 8 7.10874 0.89126014709472656 0.79434464979931363 +839 7 6.408877 0.59112310409545898 0.34942652419545084 +842 7 6.515357 0.48464298248291016 0.23487882046993036 +843 7 6.23895073 0.76104927062988281 0.57919599232627661 +844 8 6.849922 1.1500778198242188 1.3226789916516282 +846 5 5.760487 0.76048707962036133 0.57834059826950579 +847 5 5.67596 0.67596006393432617 0.45692200803409833 +849 6 6.19975758 0.19975757598876953 0.039903089164909034 +852 7 6.506963 0.49303722381591797 0.24308570406810759 +853 5 5.18266726 0.18266725540161133 0.033367326195957503 +857 5 5.06863356 0.068633556365966797 0.0047105650594403414 +865 6 6.448615 0.44861507415771484 0.20125548476153199 +866 7 6.506963 0.49303722381591797 0.24308570406810759 +867 8 5.900881 2.0991191864013672 4.4063013587183377 +868 7 6.13432264 0.8656773567199707 0.74939728593767541 +869 6 6.330358 0.33035802841186523 0.10913642693617476 +873 3 5.39196968 2.3919696807861328 5.7215189538001141 +875 7 5.945717 1.0542831420898438 1.1115129436948337 +877 6 5.27623844 0.72376155853271484 0.52383079360970441 +878 6 5.729253 0.27074718475341797 0.073304038051901443 +879 8 7.033074 0.96692609786987305 0.93494607874185931 +880 7 5.945717 1.0542831420898438 1.1115129436948337 +882 6 6.47362232 0.47362232208251953 0.22431810397483787 +883 6 6.47362232 0.47362232208251953 0.22431810397483787 +884 6 6.0108 0.010799884796142578 0.00011663751160995162 +886 6 5.72650337 0.27349662780761719 0.074800405422138283 +889 7 6.836567 0.16343307495117188 0.026710369987995364 +891 7 6.05931 0.94069004058837891 0.88489775246216595 +892 5 5.83085966 0.83085966110229492 0.69032777644702037 +893 7 5.88735628 1.1126437187194824 1.2379760448059187 +894 7 6.05931 0.94069004058837891 0.88489775246216595 +897 6 5.356787 0.64321279525756836 0.41372269998305455 +899 6 5.940027 0.059972763061523438 0.0035967323092336301 +901 6 5.439856 0.56014394760131836 0.31376124203438849 +903 6 5.16906166 0.83093833923339844 0.69045852360795834 +905 4 5.119085 1.1190848350524902 1.2523508680444593 +907 8 6.72354841 1.276451587677002 1.629328655683139 +909 5 5.951847 0.95184707641601563 0.90601285688171629 +911 5 5.17918253 0.17918252944946289 0.032106378859907636 +913 5 5.018202 0.018201828002929688 0.00033130654264823534 +915 5 5.038798 0.038797855377197266 0.0015052735818699148 +916 7 6.2027626 0.79723739624023438 0.63558746596390847 +917 6 6.036959 0.036959171295166016 0.0013659803428254236 +922 6 5.438461 0.5615391731262207 0.31532624295527967 +923 6 5.67066 0.32933998107910156 0.10846482313718298 +928 5 5.700507 0.70050716400146484 0.49071028681737516 +929 5 5.23482 0.23481988906860352 0.055140380302191261 +931 5 5.416477 0.41647720336914063 0.17345326092618052 +932 6 5.64696264 0.35303735733032227 0.12463537567077765 +933 5 5.43066549 0.43066549301147461 0.18547276687081649 +939 7 5.80225849 1.1977415084838867 1.4345847211452565 +941 6 5.62785 0.37214994430541992 0.13849558104652715 +942 7 5.356612 1.6433877944946289 2.7007234430939207 +943 7 6.63288736 0.36711263656616211 0.13477168792655903 +945 7 6.26371 0.73628997802734375 0.54212293174350634 +946 5 5.47489262 0.47489261627197266 0.22552299698963907 +947 5 5.80209875 0.80209875106811523 0.64336240646503029 +948 4 4.016797 0.016797065734863281 0.00028214141730131814 +949 5 5.809106 0.80910587310791016 0.65465231389771361 +951 6 5.86978531 0.13021469116210938 0.016955865794443525 +952 6 6.022801 0.022800922393798828 0.00051988206200803688 +954 6 5.86978531 0.13021469116210938 0.016955865794443525 +957 7 6.50963163 0.49036836624145508 0.24046113461031382 +961 7 6.85018969 0.1498103141784668 0.02244313023425093 +962 6 5.93246365 0.067536354064941406 0.0045611591203851276 +963 6 6.31939554 0.31939554214477539 0.10201351234195499 +966 6 5.41205454 0.58794546127319336 0.34567986543174811 +967 6 5.92570257 0.074297428131103516 0.005520107826896492 +973 7 6.949879 0.050120830535888672 0.0025120976536072703 +975 5 5.173891 0.17389106750488281 0.030238103357987711 +977 5 5.95053864 0.95053863525390625 0.90352369711035863 +978 7 6.605027 0.39497280120849609 0.15600351369448617 +979 5 5.769002 0.76900196075439453 0.59136401564410335 +981 7 6.605027 0.39497280120849609 0.15600351369448617 +984 5 6.3729744 1.3729743957519531 1.8850586913904408 +987 6 5.5826726 0.4173274040222168 0.17416216214792257 +988 5 6.3729744 1.3729743957519531 1.8850586913904408 +990 6 6.21594143 0.21594142913818359 0.046630700818241166 +991 4 4.94119453 0.94119453430175781 0.88584715139950276 +993 4 5.06608534 1.0660853385925293 1.1365379491619478 +996 5 5.17936563 0.17936563491821289 0.032172030989613631 +1000 7 5.52855635 1.4714436531066895 2.1651464242679594 +1001 5 5.712898 0.71289777755737305 0.50822324124624174 +1003 7 5.70227766 1.297722339630127 1.6840832707750906 +1005 6 6.584769 0.58476877212524414 0.34195451685286571 +1008 7 6.029186 0.97081422805786133 0.94248026539958119 +1009 6 5.62538576 0.37461423873901367 0.14033582786601073 +1010 6 6.15891266 0.15891265869140625 0.025253233092371374 +1011 7 6.02436256 0.97563743591308594 0.95186840635506087 +1012 6 5.62912273 0.37087726593017578 0.13754994638384233 +1013 5 5.50491762 0.50491762161254883 0.25494180461487304 +1014 5 6.15509129 1.1550912857055664 1.3342358783129384 +1019 6 5.742344 0.25765609741210938 0.066386664533638395 +1020 7 6.23330545 0.76669454574584961 0.58782052647643468 +1022 8 6.47398043 1.5260195732116699 2.3287357378251272 +1023 6 6.22773075 0.22773075103759766 0.051861294968148286 +1024 6 6.031418 0.0314178466796875 0.00098708108998835087 +1028 7 6.00834942 0.99165058135986328 0.98337087551135482 +1029 4 5.17407846 1.1740784645080566 1.378460240821596 +1031 6 5.45544338 0.54455661773681641 0.29654190992096119 +1035 6 6.33974743 0.33974742889404297 0.11542831544011278 +1036 5 6.43673229 1.436732292175293 2.0641996793792714 +1038 7 6.24824667 0.75175333023071289 0.56513306951296727 +1041 5 5.91462135 0.91462135314941406 0.83653221963686519 +1042 4 5.50987244 1.5098724365234375 2.2797147745732218 +1043 5 5.33948231 0.33948230743408203 0.11524823706076859 +1046 5 5.62477064 0.6247706413269043 0.3903383542640313 +1048 5 5.034732 0.034731864929199219 0.0012063024414601387 +1050 5 5.59548426 0.59548425674438477 0.35460150003041235 +1055 5 5.39846945 0.39846944808959961 0.15877790106083012 +1056 6 5.9916153 0.00838470458984375 7.0303271058946848E-05 +1057 5 5.16176367 0.16176366806030273 0.026167484304323807 +1062 5 5.52524757 0.52524757385253906 0.27588501383797848 +1063 5 5.34958124 0.34958124160766602 0.12220704448395736 +1066 6 5.38780165 0.6121983528137207 0.37478682318783285 +1067 7 6.16809368 0.83190631866455078 0.69206812303400511 +1070 7 5.71303272 1.2869672775268555 1.6562847734248862 +1073 5 5.672453 0.67245292663574219 0.45219293854097486 +1078 5 5.86502457 0.86502456665039063 0.74826750090869609 +1081 6 5.666392 0.33360815048217773 0.11129439806813934 +1087 8 6.18193 1.8180699348449707 3.305378287987196 +1089 7 6.042182 0.95781803131103516 0.91741538110454712 +1093 7 6.22694731 0.77305269241333008 0.59761046524749872 +1096 6 5.72905 0.2709498405456543 0.073413816091715489 +1097 7 6.01744366 0.98255634307861328 0.96541696732401761 +1102 5 6.45477772 1.454777717590332 2.1163782075973359 +1104 5 5.133098 0.13309812545776367 0.017715111000370598 +1105 7 6.572625 0.42737483978271484 0.18264925367930118 +1106 8 7.194024 0.80597591400146484 0.64959717395049665 +1107 7 6.734277 0.26572322845458984 0.070608834140330146 +1108 7 6.37152 0.62847995758056641 0.39498705708047055 +1109 4 5.30562353 1.3056235313415527 1.7046528055927865 +1110 7 6.734277 0.26572322845458984 0.070608834140330146 +1111 6 6.009964 0.0099639892578125 9.9281081929802895E-05 +1113 5 6.037582 1.0375819206237793 1.0765762420053306 +1114 4 4.41076326 0.41076326370239258 0.1687264588074413 +1115 8 5.98748255 2.0125174522399902 4.0502264955705414 +1116 5 4.90289736 0.097102642059326172 0.0094289230949016201 +1117 5 5.82768726 0.82768726348876953 0.6850662061415278 +1118 5 4.90289736 0.097102642059326172 0.0094289230949016201 +1120 6 6.10586357 0.10586357116699219 0.01120709570022882 +1121 6 5.18950462 0.81049537658691406 0.65690275546876364 +1123 5 4.903581 0.096418857574462891 0.0092965960959645599 +1124 5 5.744567 0.74456691741943359 0.55437989451547764 +1127 7 6.33109 0.66891002655029297 0.44744062361951364 +1128 5 5.677559 0.67755889892578125 0.45908606151351705 +1131 6 5.63907 0.36092996597290039 0.13027044033719903 +1132 5 5.72486734 0.72486734390258789 0.52543266625639262 +1139 5 6.42748642 1.4274864196777344 2.0377174783643568 +1142 5 4.971568 0.028431892395019531 0.00080837250516196946 +1145 5 5.10051 0.1005101203918457 0.010102284301183317 +1149 5 5.462134 0.46213388442993164 0.21356772713829741 +1150 5 5.117995 0.11799478530883789 0.013922769360078746 +1152 4 4.57453156 0.57453155517578125 0.33008650789270177 +1154 4 5.413978 1.413978099822998 1.9993340667790562 +1156 6 5.30396843 0.69603157043457031 0.48445994704161421 +1157 6 5.30396843 0.69603157043457031 0.48445994704161421 +1160 6 6.187364 0.18736410140991211 0.035105306497143829 +1161 6 5.30396843 0.69603157043457031 0.48445994704161421 +1162 7 5.98087168 1.0191283226013184 1.0386225379281768 +1163 6 5.293566 0.70643377304077148 0.49904867569262024 +1167 6 5.66483259 0.33516740798950195 0.11233719137840126 +1171 5 4.899895 0.10010480880737305 0.010020972746360712 +1172 6 6.07855 0.078549861907958984 0.0061700808057594259 +1173 5 6.19663334 1.1966333389282227 1.4319313478345066 +1176 7 5.74743557 1.2525644302368164 1.5689176518944805 +1178 5 5.472783 0.47278308868408203 0.22352384894566057 +1179 5 5.756897 0.75689697265625 0.57289302721619606 +1180 5 4.899895 0.10010480880737305 0.010020972746360712 +1183 6 6.20801973 0.20801973342895508 0.043272209495853531 +1185 5 5.087918 0.087917804718017578 0.0077295403864354739 +1188 6 5.65794563 0.34205436706542969 0.11700119002853171 +1189 5 4.939712 0.060287952423095703 0.0036346372073694511 +1190 6 6.07855 0.078549861907958984 0.0061700808057594259 +1192 6 5.7700386 0.22996139526367188 0.052882243311614729 +1193 7 5.82296658 1.1770334243774414 1.3854076821016861 +1194 6 5.47563 0.52437019348144531 0.27496409981176839 +1196 7 6.705709 0.29429101943969727 0.086607204122856274 +1197 7 5.82296658 1.1770334243774414 1.3854076821016861 +1203 6 5.899554 0.10044622421264648 0.010089443958577249 +1205 5 4.849187 0.15081310272216797 0.022744591952687188 +1209 6 6.46530867 0.46530866622924805 0.21651215486804176 +1211 5 5.415062 0.41506195068359375 0.17227642290527001 +1215 5 5.75489759 0.7548975944519043 0.56987037810927177 +1217 5 4.94168 0.058320045471191406 0.0034012277037618333 +1219 8 6.149987 1.8500127792358398 3.4225472833359163 +1222 6 5.252237 0.74776315689086914 0.55914973880339858 +1223 5 5.75489759 0.7548975944519043 0.56987037810927177 +1224 7 6.828078 0.17192220687866211 0.029557245218029493 +1225 6 6.36836958 0.36836957931518555 0.13569614696484678 +1226 7 6.828078 0.17192220687866211 0.029557245218029493 +1227 5 6.02813625 1.0281362533569336 1.0570641554668327 +1228 6 5.928509 0.071490764617919922 0.005110929425654831 +1230 6 5.70135975 0.29864025115966797 0.089185999612709566 +1235 5 5.32679749 0.3267974853515625 0.10679659643210471 +1236 6 6.36836958 0.36836957931518555 0.13569614696484678 +1237 5 6.57272768 1.5727276802062988 2.4734723560870862 +1239 5 5.11314869 0.11314868927001953 0.012802625883523433 +1241 7 6.17593575 0.82406425476074219 0.6790818959743774 +1242 7 7.049261 0.049261093139648438 0.0024266552973131184 +1244 5 5.48783636 0.48783636093139648 0.23798431504678774 +1245 4 5.28817654 1.2881765365600586 1.659398789343868 +1247 6 5.9337616 0.0662384033203125 0.004387526074424386 +1250 7 5.70580244 1.2941975593566895 1.6749473226448117 +1252 6 5.28407574 0.71592426300048828 0.51254755035279231 +1256 6 6.01677132 0.016771316528320313 0.0002812770580931101 +1258 6 5.34223127 0.65776872634887695 0.43265969736262377 +1262 6 6.01677132 0.016771316528320313 0.0002812770580931101 +1264 5 5.9943676 0.99436759948730469 0.98876692291014479 +1267 7 5.75471735 1.2452826499938965 1.5507288783758213 +1270 7 5.75471735 1.2452826499938965 1.5507288783758213 +1271 5 5.586012 0.58601188659667969 0.34340993123259977 +1272 5 5.23190975 0.23190975189208984 0.053782133022650669 +1273 5 5.586012 0.58601188659667969 0.34340993123259977 +1275 6 5.607518 0.39248180389404297 0.154041966387922 +1276 7 5.75471735 1.2452826499938965 1.5507288783758213 +1278 6 5.40593958 0.59406042098999023 0.35290778378680443 +1279 6 5.93613434 0.06386566162109375 0.0040788227343000472 +1283 8 7.28526354 0.7147364616394043 0.51084820959681565 +1284 7 6.51235151 0.48764848709106445 0.23780104696220405 +1286 7 5.999429 1.0005707740783691 1.0011418739397868 +1287 7 6.010927 0.98907279968261719 0.97826500307201059 +1288 7 6.059415 0.94058513641357422 0.88470039884214202 +1289 6 6.580059 0.58005905151367188 0.33646850324294064 +1292 6 6.481823 0.48182296752929688 0.23215337203873787 +1294 4 4.84203959 0.84203958511352539 0.70903066289815797 +1295 6 5.849522 0.15047788619995117 0.022643594235205455 +1298 6 6.438703 0.43870306015014648 0.19246037498510304 +1299 5 5.84311 0.84311008453369141 0.71083461464240827 +1303 6 6.040718 0.04071807861328125 0.0016579619259573519 +1304 5 5.23674536 0.23674535751342773 0.056048364304160714 +1305 7 5.961569 1.0384311676025391 1.0783392898483726 +1307 5 5.201838 0.20183801651000977 0.040738584908694975 +1309 6 5.140684 0.85931587219238281 0.73842376820175559 +1310 6 5.39392853 0.60607147216796875 0.36732262937584892 +1311 6 5.793617 0.20638322830200195 0.04259403692435626 +1312 5 5.47025442 0.47025442123413086 0.22113922069024738 +1315 6 5.966254 0.033745765686035156 0.0011387767017367878 +1316 6 5.96671247 0.033287525177001953 0.0011080593324095389 +1317 5 6.4081254 1.4081254005432129 1.9828171436549837 +1318 6 6.69151068 0.69151067733764648 0.47818701687197063 +1319 5 5.55651 0.55650997161865234 0.30970334851099324 +1321 6 6.663579 0.66357898712158203 0.44033707214930473 +1322 6 5.82713461 0.17286539077758789 0.029882443328688169 +1326 6 5.40980434 0.59019565582275391 0.34833091215205059 +1329 5 5.092535 0.092535018920898438 0.0085627297266910318 +1332 7 5.692085 1.307915210723877 1.7106421984428835 +1333 8 7.02583933 0.97416067123413086 0.94898901337933239 +1335 6 4.97064 1.0293598175048828 1.0595816338936856 +1339 6 6.011735 0.011734962463378906 0.00013770934401691193 +1342 6 6.011735 0.011734962463378906 0.00013770934401691193 +1343 6 6.17206049 0.17206048965454102 0.029604812100160416 +1347 7 7.23906326 0.23906326293945313 0.057151243687258102 +1349 4 5.488322 1.4883217811584473 2.215101724270653 +1351 7 6.8603344 0.13966560363769531 0.01950648083948181 +1352 6 4.97064 1.0293598175048828 1.0595816338936856 +1353 5 5.547811 0.54781103134155273 0.30009692605949567 +1357 6 5.488955 0.51104497909545898 0.26116697065867811 +1358 8 6.688844 1.3111557960510254 1.7191295215181981 +1359 7 6.5702467 0.42975330352783203 0.18468790189308493 +1360 6 5.92257833 0.077421665191650391 0.0059941142410480097 +1362 7 5.93040943 1.0695905685424805 1.1440239843150266 +1364 5 5.73871326 0.73871326446533203 0.54569728709702758 +1368 6 6.17178631 0.17178630828857422 0.029510535715417063 +1369 5 5.040043 0.040042877197265625 0.0016034320142352954 +1371 7 6.6165185 0.38348150253295898 0.14705806278493583 +1374 7 6.341347 0.65865278244018555 0.43382348781619839 +1376 6 5.66357231 0.33642768859863281 0.11318358965581865 +1377 6 5.50639057 0.49360942840576172 0.2436502678110628 +1378 7 6.506033 0.49396705627441406 0.24400345268441015 +1385 5 5.176291 0.17629098892211914 0.031078512775138734 +1387 6 6.60271931 0.60271930694580078 0.36327056296522642 +1390 6 6.133471 0.13347101211547852 0.017814511075130213 +1391 6 6.58808565 0.58808565139770508 0.3458447333798631 +1392 6 6.60271931 0.60271930694580078 0.36327056296522642 +1396 7 5.920642 1.0793581008911133 1.1650139099592707 +1397 7 6.475289 0.52471113204956055 0.27532177209673137 +1399 6 6.41273 0.41273021697998047 0.17034623200834176 +1401 6 5.14331245 0.85668754577636719 0.73391355108833523 +1402 8 6.59536552 1.4046344757080078 1.97299801034751 +1405 4 4.97745275 0.97745275497436523 0.95541388820697648 +1410 6 6.84542227 0.84542226791381836 0.71473881108454407 +1412 8 6.71645546 1.2835445404052734 1.6474865872041846 +1414 6 6.140478 0.14047813415527344 0.019734106175747002 +1415 5 4.79202175 0.20797824859619141 0.043254951889139193 +1417 3 4.953996 1.9539961814880371 3.8181010772698301 +1418 5 5.049917 0.049917221069335938 0.0024917289592849556 +1422 5 5.3871603 0.38716030120849609 0.14989309883185342 +1423 4 5.36329365 1.3632936477661133 1.8585695700394353 +1428 7 6.534054 0.46594619750976563 0.21710585897380952 +1429 5 5.45791769 0.45791769027709961 0.20968861106871373 +1430 4 4.918244 0.9182438850402832 0.84317183241387283 +1432 7 6.30958557 0.6904144287109375 0.4766720833722502 +1433 6 6.0021987 0.0021986961364746094 4.8342647005483741E-06 +1435 5 5.6443 0.64429998397827148 0.41512246935440089 +1441 5 5.43425846 0.43425846099853516 0.18858041094881628 +1444 6 6.30873156 0.3087315559387207 0.095315173632343431 +1445 6 6.33068848 0.3306884765625 0.10935486853122711 +1446 6 6.361789 0.36178922653198242 0.13089144443461009 +1448 6 5.79400826 0.20599174499511719 0.042432599006133387 +1449 6 6.40241 0.40241003036499023 0.16193383253835236 +1450 6 6.30873156 0.3087315559387207 0.095315173632343431 +1451 5 5.064728 0.064727783203125 0.0041896859183907509 +1452 6 6.30873156 0.3087315559387207 0.095315173632343431 +1453 7 6.630288 0.36971187591552734 0.13668687119297829 +1454 5 5.63396454 0.63396453857421875 0.40191103616962209 +1455 5 5.307369 0.30736923217773438 0.094475844889529981 +1466 6 6.40241 0.40241003036499023 0.16193383253835236 +1467 7 6.904765 0.095234870910644531 0.0090696806373671279 +1468 5 5.18547869 0.18547868728637695 0.034402343437477612 +1469 5 5.064728 0.064727783203125 0.0041896859183907509 +1472 5 5.25965261 0.25965261459350586 0.067419480265243692 +1473 6 6.145816 0.14581584930419922 0.021262261908304936 +1475 6 5.63432074 0.36567926406860352 0.13372132416975546 +1476 5 5.59673834 0.59673833847045898 0.35609664460048407 +1477 6 4.993153 1.0068469047546387 1.0137406896139964 +1479 6 5.99484158 0.0051584243774414063 2.660934205778176E-05 +1481 6 5.814835 0.1851649284362793 0.034286050722812433 +1483 4 5.096024 1.0960240364074707 1.2012686883829247 +1487 6 5.494021 0.50597906112670898 0.25601481029866591 +1490 6 5.90605736 0.093942642211914063 0.0088252200257556979 +1491 5 5.36705828 0.36705827713012695 0.13473177880973708 +1493 8 7.507157 0.4928431510925293 0.24289437157881366 +1496 5 3.73965025 1.2603497505187988 1.5884814936327984 +1497 7 6.33508444 0.66491556167602539 0.44211270415894433 +1499 6 6.15693665 0.1569366455078125 0.024629110703244805 +1500 7 6.62924862 0.37075138092041016 0.13745658645439107 +1501 5 5.42421675 0.42421674728393555 0.17995984867616244 +1504 8 6.618411 1.3815889358520508 1.9087879876688021 +1507 6 5.60484552 0.39515447616577148 0.15614706003384526 +1512 7 6.41460657 0.58539342880249023 0.3426854664851362 +1513 6 6.1881566 0.1881566047668457 0.035402907917386983 +1515 6 6.406722 0.40672206878662109 0.16542284123806894 +1516 6 5.8938427 0.10615730285644531 0.011269372949755052 +1517 6 5.738828 0.26117181777954102 0.068210718402269777 +1520 6 5.710736 0.28926420211791992 0.083673778626916828 +1526 6 5.80973148 0.19026851654052734 0.036202108386532927 +1527 6 5.870094 0.12990617752075195 0.01687561495805312 +1530 5 5.09535074 0.095350742340087891 0.0090917640648058295 +1532 7 5.39276028 1.6072397232055664 2.5832195278499057 +1533 6 6.650949 0.65094900131225586 0.42373460230942328 +1538 6 5.309088 0.69091176986694336 0.4773590737406721 +1540 6 6.17057276 0.17057275772094727 0.029095065676528975 +1542 6 6.437708 0.43770790100097656 0.1915882065986807 +1543 6 6.494682 0.49468183517456055 0.24471011805167109 +1549 6 5.93311 0.066889762878417969 0.0044742403779309825 +1551 6 5.79150629 0.20849370956420898 0.043469626927844729 +1552 7 6.568247 0.43175315856933594 0.18641078993459814 +1554 7 6.26918 0.7308201789855957 0.53409813401253814 +1559 4 5.560808 1.5608081817626953 2.4361221802573709 +1560 6 6.349241 0.34924077987670898 0.1219691223288919 +1561 5 4.81193638 0.18806362152099609 0.035367925739592465 +1562 7 6.56004429 0.43995571136474609 0.19356102796245978 +1564 5 4.81193638 0.18806362152099609 0.035367925739592465 +1567 5 5.56694126 0.56694126129150391 0.32142239375480131 +1569 5 5.486824 0.48682403564453125 0.23699764168122783 +1571 6 5.42728138 0.57271862030029297 0.32800661803867115 +1572 6 5.95556974 0.044430255889892578 0.0019740476384413341 +1573 5 5.71593142 0.71593141555786133 0.51255779178268313 +1576 6 5.3123 0.68769979476928711 0.47293100772571961 +1578 5 5.89515352 0.89515352249145508 0.80129982882885997 +1580 5 4.789808 0.21019220352172852 0.044180762421319741 +1581 6 6.12694454 0.12694454193115234 0.016114916726110096 +1585 5 5.095582 0.095582008361816406 0.0091359203224783414 +1587 6 5.43847561 0.56152439117431641 0.31530964188368671 +1588 5 5.095582 0.095582008361816406 0.0091359203224783414 +1589 6 6.57659435 0.57659435272216797 0.33246104759109585 +1592 6 5.995277 0.0047230720520019531 2.230740960840194E-05 +1596 5 6.15547037 1.1554703712463379 1.3351117788281499 +1597 6 5.42937946 0.57062053680419922 0.32560779702271248 +1598 6 5.5156 0.48439979553222656 0.2346431619116629 +1599 6 5.63169432 0.36830568313598633 0.13564907623026556 +1600 6 5.406555 0.59344482421875 0.35217675939202309 +1603 7 5.52368355 1.4763164520263672 2.1795102665237209 +1607 7 5.521132 1.4788680076599121 2.1870505840799979 +1609 7 5.96955967 1.0304403305053711 1.0618072747320184 +1610 6 6.05691242 0.056912422180175781 0.0032390237984145642 +1613 7 6.103424 0.896575927734375 0.80384839419275522 +1616 6 5.335125 0.66487503051757813 0.44205880620575044 +1617 6 5.52980137 0.47019863128662109 0.22108675286381185 +1619 8 6.729283 1.2707171440124512 1.6147220600871606 +1621 5 4.84396172 0.15603828430175781 0.024347946167836199 +1623 6 5.68089437 0.31910562515258789 0.10182840000402393 +1626 6 5.63088036 0.36911964416503906 0.13624931170852506 +1628 6 5.57520962 0.42479038238525391 0.18044686896701023 +1629 6 5.65554953 0.34445047378540039 0.1186461288909868 +1632 8 7.12291 0.8770899772644043 0.76928682821767325 +1633 7 6.45866 0.54133987426757813 0.29304885947203729 +1634 6 5.487575 0.51242494583129883 0.26257932511020954 +1636 5 5.24233532 0.24233531951904297 0.058726407086396648 +1639 5 5.68869734 0.68869733810424805 0.47430402351187695 +1641 6 5.73338747 0.26661252975463867 0.071082241022168091 +1642 7 5.563681 1.4363188743591309 2.0630119088402807 +1644 7 5.563681 1.4363188743591309 2.0630119088402807 +1646 6 5.73338747 0.26661252975463867 0.071082241022168091 +1647 7 6.283148 0.71685218811035156 0.51387705959859886 +1651 6 4.98633 1.0136699676513672 1.0275268033183238 +1653 6 5.289247 0.71075296401977539 0.50516977586289613 +1654 5 5.107417 0.10741710662841797 0.011538434796420916 +1655 5 5.704415 0.70441484451293945 0.49620027317018867 +1656 5 5.69252 0.6925201416015625 0.47958414652384818 +1657 6 6.306578 0.30657815933227539 0.093990167779566036 +1658 5 5.217158 0.21715784072875977 0.047157527789977394 +1659 5 5.266233 0.26623296737670898 0.07087999291820779 +1660 6 5.272804 0.72719621658325195 0.52881433741299588 +1663 6 5.289247 0.71075296401977539 0.50516977586289613 +1664 4 5.28846645 1.2884664535522461 1.6601458019295023 +1665 8 6.539163 1.4608368873596191 2.1340444114705406 +1667 6 6.103382 0.10338211059570313 0.010687860791222192 +1668 7 5.517866 1.4821338653564453 2.1967207948364376 +1669 6 5.002777 0.997222900390625 0.99445351306349039 +1673 5 5.44804335 0.4480433464050293 0.20074284025781708 +1674 6 5.60366058 0.39633941650390625 0.15708493307465687 +1677 6 6.12342 0.12341976165771484 0.015232437567647139 +1679 5 5.36758 0.36757993698120117 0.13511501007110382 +1680 5 5.30406761 0.30406761169433594 0.092457112481497461 +1681 6 6.31024456 0.31024456024169922 0.096251687159565336 +1684 7 6.14880276 0.85119724273681641 0.72453674604275875 +1685 7 6.75045347 0.24954652786254883 0.062273469568253859 +1688 3 5.08076429 2.0807642936706543 4.3295800458147369 +1690 4 4.711043 0.71104288101196289 0.50558197863779242 +1697 6 6.4876914 0.48769140243530273 0.23784290400931241 +1699 6 6.16492939 0.16492938995361328 0.027201703670471034 +1701 5 5.8191824 0.81918239593505859 0.6710597978099031 +1702 4 4.340795 0.34079504013061523 0.11614125937762765 +1704 5 5.396419 0.39641904830932617 0.15714806186247188 +1706 6 6.20638561 0.20638561248779297 0.042595021041961445 +1707 5 5.43179274 0.4317927360534668 0.18644496690853885 +1709 5 6.212621 1.2126212120056152 1.4704502038059672 +1711 5 6.309819 1.309819221496582 1.7156263930019122 +1713 6 5.396862 0.60313796997070313 0.36377541082038078 +1714 5 5.380734 0.38073396682739258 0.14495835349612207 +1715 8 6.369188 1.6308121681213379 2.6595483276926188 +1716 6 6.466825 0.46682500839233398 0.21792558846050269 +1719 6 5.80834866 0.19165134429931641 0.036730237771735119 +1720 7 6.154079 0.84592103958129883 0.71558240520630534 +1721 7 5.694867 1.3051328659057617 1.703371797667387 +1723 8 6.369188 1.6308121681213379 2.6595483276926188 +1724 6 6.248959 0.24895906448364258 0.061980615788570503 +1725 6 5.7679286 0.2320713996887207 0.053857134553481956 +1728 5 5.380734 0.38073396682739258 0.14495835349612207 +1731 6 5.26263046 0.73736953735351563 0.54371383461693767 +1734 6 5.87407446 0.12592554092407227 0.015857241857020199 +1735 6 6.79139137 0.79139137268066406 0.62630030475338572 +1736 5 5.39636326 0.39636325836181641 0.15710383257919602 +1739 4 5.18590927 1.1859092712402344 1.4063807996135438 +1740 6 5.19072962 0.80927038192749023 0.65491855106506591 +1743 6 5.31016731 0.68983268737792969 0.47586913657505647 +1744 5 5.531529 0.53152894973754883 0.28252302440910171 +1746 5 5.797213 0.79721307754516602 0.63554869100903488 +1747 6 5.31016731 0.68983268737792969 0.47586913657505647 +1748 5 5.8615346 0.86153459548950195 0.74224185922525976 +1749 6 5.804206 0.19579410552978516 0.038335331760208646 +1753 7 6.184713 0.81528711318969727 0.66469307693319024 +1754 6 6.77167845 0.77167844772338867 0.5954876266807787 +1755 6 5.508878 0.49112176895141602 0.24120059193796806 +1756 5 5.125717 0.1257171630859375 0.015804805094376206 +1758 5 5.452408 0.4524078369140625 0.20467285090126097 +1765 5 5.18423843 0.18423843383789063 0.033943800503038801 +1767 5 5.255097 0.2550969123840332 0.065074434707867113 +1768 5 5.13475275 0.13475275039672852 0.018158303739483017 +1772 6 5.847888 0.15211200714111328 0.023138062716498098 +1773 6 5.847888 0.15211200714111328 0.023138062716498098 +1774 6 6.19572735 0.19572734832763672 0.038309194883368036 +1775 6 6.664879 0.66487884521484375 0.44206387881422415 +1776 5 6.248544 1.2485442161560059 1.5588626596966151 +1779 8 6.81899166 1.1810083389282227 1.3947806966179996 +1783 6 4.47723866 1.522761344909668 2.3188021135511008 +1784 7 6.801015 0.19898509979248047 0.039595069939423411 +1785 6 6.31658554 0.31658554077148438 0.1002264046255732 +1788 5 6.75687361 1.756873607635498 3.0866048732061699 +1789 7 5.92843246 1.0715675354003906 1.1482569829240674 +1794 5 5.250449 0.25044918060302734 0.062724792064727808 +1795 6 5.26829338 0.73170661926269531 0.53539457667284296 +1800 6 5.250173 0.74982690811157227 0.56224039212816024 +1801 5 5.31909275 0.31909275054931641 0.10182018345312827 +1802 6 6.01945448 0.019454479217529297 0.00037847676162527932 +1803 6 6.015074 0.015073776245117188 0.00022721873028785922 +1805 5 5.166034 0.16603422164916992 0.027567362758645686 +1810 6 5.31367254 0.68632745742797852 0.47104537881955366 +1812 6 6.18724251 0.18724250793457031 0.035059756777627626 +1814 7 6.72885752 0.27114248275756836 0.073518245955938255 +1816 7 6.89374733 0.10625267028808594 0.0112896299433487 +1817 4 5.07511234 1.0751123428344727 1.1558665497150287 +1818 6 6.42408848 0.42408847808837891 0.17985103724731744 +1821 5 5.98397446 0.98397445678710938 0.96820573160948697 +1823 6 5.735797 0.26420307159423828 0.069803263039830199 +1824 5 5.2308197 0.2308197021484375 0.053277734899893403 +1825 5 5.304334 0.30433416366577148 0.092619283174144584 +1826 5 5.2308197 0.2308197021484375 0.053277734899893403 +1827 6 5.735797 0.26420307159423828 0.069803263039830199 +1828 6 5.798369 0.20163106918334961 0.040655088060020717 +1829 7 6.39849 0.60151004791259766 0.36181433773981553 +1830 7 6.39849 0.60151004791259766 0.36181433773981553 +1831 7 6.769 0.23099994659423828 0.053360975326540938 +1832 7 6.39849 0.60151004791259766 0.36181433773981553 +1835 5 5.286033 0.28603315353393555 0.081814964920567945 +1836 6 5.85457 0.14543008804321289 0.021149910508256653 +1841 7 6.87208366 0.12791633605957031 0.016362589030904928 +1843 6 6.158535 0.15853500366210938 0.025133347386145033 +1844 6 6.583081 0.58308076858520508 0.33998318269391348 +1845 5 5.119748 0.11974811553955078 0.014339611175273603 +1847 5 5.119748 0.11974811553955078 0.014339611175273603 +1854 7 5.83165932 1.1683406829833984 1.3650199515141139 +1858 5 4.904401 0.095599174499511719 0.0091392021649880917 +1859 6 5.984875 0.015124797821044922 0.00022875950912748522 +1861 6 5.82768631 0.17231369018554688 0.029692007825360633 +1862 7 6.22135639 0.77864360809326172 0.60628586842449295 +1863 5 5.38612461 0.38612461090087891 0.14909221514335513 +1866 6 5.44316244 0.55683755874633789 0.3100680668305813 +1867 6 6.447666 0.44766616821289063 0.20040499816241208 +1868 7 6.56608438 0.43391561508178711 0.18828276101180563 +1871 6 6.08121634 0.081216335296630859 0.0065960931190147676 +1873 5 5.3560524 0.35605239868164063 0.12677331060694996 +1874 5 5.856788 0.85678815841674805 0.73408594840316255 +1876 6 5.976185 0.023815155029296875 0.00056716160906944424 +1877 6 5.42421627 0.57578372955322266 0.33152690321821865 +1878 6 5.481139 0.51886081695556641 0.26921654737179779 +1879 6 5.55618 0.44381999969482422 0.19697619212911377 +1883 5 5.539126 0.53912591934204102 0.29065675690640091 +1884 5 6.11783743 1.1178374290466309 1.2495605177775815 +1885 6 5.55618 0.44381999969482422 0.19697619212911377 +1887 5 6.036951 1.0369510650634766 1.0752675113362784 +1888 5 6.078992 1.0789918899536133 1.1642234985856703 +1889 5 6.20253038 1.2025303840637207 1.4460793245964396 +1890 5 5.539126 0.53912591934204102 0.29065675690640091 +1892 5 5.426909 0.42690896987915039 0.18225126856327734 +1894 5 5.325189 0.32518911361694336 0.1057479596149733 +1899 7 6.870124 0.12987613677978516 0.016867810904841463 +1900 6 5.666265 0.33373498916625977 0.11137904299380352 +1901 5 5.854561 0.85456085205078125 0.73027424985775724 +1902 6 5.9222703 0.077729701995849609 0.0060419065723635867 +1903 5 5.57865524 0.57865524291992188 0.3348418901587138 +1905 6 5.44087934 0.55912065505981445 0.31261590691451602 +1906 5 5.76264858 0.76264858245849609 0.58163286032595352 +1917 6 6.08581066 0.085810661315917969 0.0073634695954751805 +1919 6 5.901009 0.098990917205810547 0.0097992016892476386 +1921 5 5.6296773 0.62967729568481445 0.39649349670094125 +1924 4 5.005332 1.0053319931030273 1.0106924163565054 +1928 6 5.99948263 0.00051736831665039063 2.6766997507365886E-07 +1932 6 4.2580533 1.7419466972351074 3.034378296008299 +1934 6 6.11376858 0.11376857757568359 0.012943289243594336 +1935 5 5.52794266 0.52794265747070313 0.27872344957722817 +1936 6 6.0192523 0.019252300262451172 0.00037065106539557746 +1937 7 6.255805 0.74419498443603516 0.55382617485975061 +1939 5 5.17908669 0.17908668518066406 0.032072040808998281 +1942 5 4.74660873 0.25339126586914063 0.064207133618765511 +1945 6 5.68932152 0.31067848205566406 0.096521119212411577 +1947 5 5.152422 0.15242195129394531 0.023232451236253837 +1954 5 5.30072069 0.3007206916809082 0.090432934405043852 +1956 5 5.660834 0.66083383560180664 0.43670135827619561 +1957 6 5.72360754 0.27639245986938477 0.076392791872649468 +1958 6 5.227452 0.77254819869995117 0.59683071931453924 +1961 5 5.33527327 0.33527326583862305 0.112408162786096 +1962 5 4.870322 0.12967777252197266 0.016816324686260486 +1963 6 5.227452 0.77254819869995117 0.59683071931453924 +1964 5 4.94884157 0.051158428192138672 0.0026171847750902089 +1965 6 5.241108 0.75889205932617188 0.57591715770831797 +1967 7 5.806977 1.1930232048034668 1.4233043671995347 +1968 6 6.512014 0.51201391220092773 0.26215824628729933 +1971 7 6.75558329 0.24441671371459961 0.059739529943044545 +1973 5 5.07161427 0.071614265441894531 0.0051286030147821293 +1976 5 5.4603076 0.46030759811401367 0.21188308488149232 +1981 8 7.75330448 0.24669551849365234 0.060858678844851966 +1983 8 7.75330448 0.24669551849365234 0.060858678844851966 +1987 5 6.11174345 1.1117434501647949 1.2359734989843219 +1988 6 5.883041 0.1169590950012207 0.01367942990350457 +1991 8 7.75330448 0.24669551849365234 0.060858678844851966 +1994 6 5.72388744 0.27611255645751953 0.076238143833506911 +1995 6 6.02649355 0.026493549346923828 0.000701908156997888 +1999 6 6.81447172 0.81447172164916992 0.66336418536616293 +2000 5 5.215534 0.21553421020507813 0.046454995768726803 +2006 6 6.02649355 0.026493549346923828 0.000701908156997888 +2009 7 7.09648 0.096479892730712891 0.0093083697013298661 +2010 6 6.19020176 0.19020175933837891 0.036176709255414607 +2012 5 6.44898653 1.4489865303039551 2.0995619650022945 +2013 6 5.4776516 0.52234840393066406 0.27284785508891218 +2014 5 6.09270144 1.0927014350891113 1.1939964262458034 +2015 6 6.06119633 0.061196327209472656 0.0037449904639288434 +2016 7 6.723304 0.27669620513916016 0.076560789938412199 +2017 5 6.09270144 1.0927014350891113 1.1939964262458034 +2018 7 6.109254 0.89074611663818359 0.79342864430600457 +2020 6 6.076952 0.076951980590820313 0.0059216073168499861 +2021 6 5.7072506 0.29274940490722656 0.085702214073535288 +2023 6 5.7072506 0.29274940490722656 0.085702214073535288 +2026 5 4.99418974 0.0058102607727050781 3.3759130246835412E-05 +2030 6 5.936183 0.063817024230957031 0.0040726125816945569 +2033 5 6.131294 1.131293773651123 1.2798256023017984 +2036 6 5.1974144 0.80258560180664063 0.6441436482273275 +2040 6 5.84815359 0.15184640884399414 0.023057331878817422 +2041 5 5.480253 0.48025321960449219 0.2306431549404806 +2042 6 5.619582 0.38041782379150391 0.14471772065826372 +2044 6 5.464227 0.53577280044555664 0.28705249369727426 +2045 5 5.30614138 0.30614137649536133 0.093722542402474573 +2046 5 4.952074 0.047925949096679688 0.0022968965968175326 +2047 5 5.364253 0.36425304412841797 0.13268028015681921 +2049 7 5.550204 1.449796199798584 2.1019090209504157 +2053 5 6.461071 1.4610710144042969 2.1347285091324011 +2054 5 6.461071 1.4610710144042969 2.1347285091324011 +2055 6 6.188693 0.18869304656982422 0.035605065823801851 +2056 5 5.366029 0.36602878570556641 0.13397707196509145 +2059 5 5.17987537 0.17987537384033203 0.032355150114199205 +2068 6 6.36916876 0.36916875839233398 0.13628557217293746 +2072 5 6.0042057 1.0042057037353516 1.0084290954146127 +2075 5 5.44059229 0.44059228897094727 0.1941215651006587 +2077 6 5.883988 0.1160120964050293 0.013458806512289812 +2081 5 5.297085 0.29708480834960938 0.088259383352124132 +2083 5 4.993862 0.006137847900390625 3.7673176848329604E-05 +2088 6 5.370086 0.6299138069152832 0.39679140414250469 +2092 5 5.100627 0.10062694549560547 0.010125782159775554 +2093 5 5.26249743 0.2624974250793457 0.068904898173286711 +2095 5 5.11470842 0.11470842361450195 0.013158022448124029 +2098 6 5.54454 0.4554600715637207 0.20744387678882958 +2100 5 5.67114925 0.67114925384521484 0.45044132093698863 +2101 6 6.203464 0.20346403121948242 0.041397612000082518 +2105 5 4.79189 0.20810985565185547 0.04330971201943612 +2107 6 6.144533 0.14453315734863281 0.020889833573164651 +2108 6 5.54454 0.4554600715637207 0.20744387678882958 +2109 6 6.09675169 0.096751689910888672 0.0093608895006127568 +2117 5 5.680355 0.68035507202148438 0.46288302402535919 +2119 4 5.769792 1.7697920799255371 3.1321640061671587 +2126 5 5.23718929 0.23718929290771484 0.056258760670061747 +2127 5 4.92841053 0.071589469909667969 0.0051250522019472555 +2130 5 6.167457 1.167457103729248 1.3629560890478842 +2133 6 6.208752 0.20875215530395508 0.04357746234404658 +2135 5 5.686537 0.68653678894042969 0.4713327625686361 +2138 5 5.24775362 0.24775362014770508 0.061381856296293336 +2140 5 5.356593 0.35659313201904297 0.12715866180315061 +2141 5 5.356593 0.35659313201904297 0.12715866180315061 +2144 6 6.144319 0.14431905746459961 0.020827990347470404 +2145 6 5.79513073 0.20486927032470703 0.041971417923377885 +2149 6 6.46941233 0.46941232681274414 0.22034793256375451 +2151 5 5.356593 0.35659313201904297 0.12715866180315061 +2153 6 5.702473 0.29752683639526367 0.088522218375373996 +2154 4 4.58447027 0.58447027206420898 0.34160549892681047 +2155 5 5.991484 0.99148416519165039 0.98304084982578388 +2156 4 5.90772533 1.9077253341674805 3.639415950624425 +2159 4 5.62724733 1.6272473335266113 2.6479338844694666 +2160 6 6.665399 0.66539907455444336 0.44275592841790967 +2163 6 6.30488348 0.30488348007202148 0.092953936420826722 +2164 5 5.963228 0.96322822570800781 0.92780861480059684 +2165 5 5.02107 0.021070003509521484 0.00044394504789124767 +2169 7 6.877237 0.12276315689086914 0.015070792689812151 +2170 7 6.877237 0.12276315689086914 0.015070792689812151 +2175 7 6.90269566 0.097304344177246094 0.0094681353957639658 +2177 7 5.132139 1.8678607940673828 3.4889039460140339 +2178 5 4.92999363 0.070006370544433594 0.0049008919168045395 +2180 6 5.18151331 0.81848669052124023 0.66992046256041249 +2181 6 6.148518 0.14851808547973633 0.022057621714566267 +2183 5 5.435717 0.43571710586547852 0.18984939634378861 +2185 7 5.74344969 1.2565503120422363 1.5789186866934415 +2187 5 5.352044 0.35204410552978516 0.12393505223826651 +2188 6 6.02323 0.023230075836181641 0.00053963642335475015 +2190 6 6.57424259 0.57424259185791016 0.32975455430369038 +2191 5 5.592154 0.59215402603149414 0.35064639054530744 +2193 6 5.934508 0.065492153167724609 0.0042892221265447006 +2194 6 6.02323 0.023230075836181641 0.00053963642335475015 +2195 5 5.352044 0.35204410552978516 0.12393505223826651 +2196 6 5.596691 0.40330886840820313 0.1626580433367053 +2199 6 5.59486771 0.40513229370117188 0.16413217539957259 +2200 5 5.302277 0.3022770881652832 0.091371438029682395 +2207 7 6.24579573 0.75420427322387695 0.56882408574915644 +2208 5 6.12349844 1.1234984397888184 1.2622487442079091 +2212 6 6.01525831 0.015258312225341797 0.00023281609196601494 +2213 6 6.45868874 0.45868873596191406 0.21039535649833851 +2214 5 6.12349844 1.1234984397888184 1.2622487442079091 +2217 6 5.918304 0.081696033477783203 0.0066742418860030739 +2218 6 6.095583 0.095582962036132813 0.0091361026316008065 +2220 6 5.801627 0.19837284088134766 0.039351783999336476 +2221 6 6.00986242 0.0098624229431152344 9.7267386308885762E-05 +2223 6 5.76725245 0.23274755477905273 0.054171424255628153 +2225 4 6.12911 2.1291098594665527 4.5331087936776839 +2228 7 5.87837029 1.1216297149658203 1.2580532174943073 +2229 6 6.26292 0.26291990280151367 0.069126875289157397 +2230 7 5.87837029 1.1216297149658203 1.2580532174943073 +2231 6 6.26292 0.26291990280151367 0.069126875289157397 +2234 5 5.7482605 0.748260498046875 0.55989377293735743 +2236 5 5.239353 0.23935317993164063 0.057289944743388332 +2237 4 5.21864271 1.2186427116394043 1.4850900586318403 +2242 5 5.52886868 0.52886867523193359 0.27970207564158045 +2243 5 6.186667 1.1866669654846191 1.4081784869724743 +2244 5 5.318094 0.31809377670288086 0.10118365077710223 +2246 4 5.21864271 1.2186427116394043 1.4850900586318403 +2248 6 5.74933434 0.25066566467285156 0.062833275445882464 +2249 5 5.066485 0.066484928131103516 0.0044202456685979996 +2250 6 5.04836 0.95164012908935547 0.90561893529320514 +2251 7 6.596238 0.40376186370849609 0.16302364258535817 +2256 5 6.17655468 1.1765546798706055 1.3842809147254229 +2257 6 5.453563 0.54643678665161133 0.2985931618061386 +2261 6 5.09705639 0.90294361114501953 0.81530716490760824 +2262 6 5.53213072 0.46786928176879883 0.21890166482285167 +2263 5 5.155079 0.15507888793945313 0.02404946148453746 +2264 6 6.54189157 0.54189157485961914 0.29364647890383822 +2265 5 5.155079 0.15507888793945313 0.02404946148453746 +2268 6 5.37617826 0.62382173538208008 0.38915355753510994 +2269 6 5.787396 0.21260404586791992 0.045200480319408598 +2277 6 6.41014862 0.41014862060546875 0.16822189098456874 +2279 5 5.151719 0.15171909332275391 0.023018683278678509 +2281 6 5.45302343 0.54697656631469727 0.29918336409741642 +2286 5 5.052512 0.052512168884277344 0.0027575278809308656 +2288 5 5.064839 0.064838886260986328 0.0042040811715651216 +2294 7 7.06264973 0.062649726867675781 0.0039249882765943767 +2301 5 5.93844175 0.93844175338745117 0.88067292450091372 +2302 5 4.70638 0.29362010955810547 0.086212768736913858 +2303 5 5.21226931 0.21226930618286133 0.04505825834735333 +2305 7 6.662912 0.33708810806274414 0.11362839259732027 +2307 5 5.53247929 0.53247928619384766 0.28353419022550952 +2308 5 5.29220247 0.29220247268676758 0.085382285044261153 +2309 6 5.16241026 0.83758974075317383 0.70155657381496894 +2312 5 5.29220247 0.29220247268676758 0.085382285044261153 +2313 7 6.83518839 0.16481161117553711 0.027162867178276429 +2316 7 6.41389847 0.58610153198242188 0.34351500579214189 +2320 6 6.270724 0.27072381973266602 0.073291386570645045 +2322 6 5.31858063 0.68141937255859375 0.46433236129814759 +2323 6 6.34466648 0.34466648101806641 0.11879498313737713 +2325 6 4.86779928 1.1322007179260254 1.2818784656722073 +2326 5 5.164012 0.16401195526123047 0.026899921468611865 +2330 6 5.418478 0.58152198791503906 0.33816782242865884 +2341 5 5.289282 0.28928184509277344 0.083683985900279367 +2343 5 6.607133 1.6071329116821289 2.5828761958118776 +2346 4 5.22390175 1.2239017486572266 1.497935490366217 +2348 6 5.732352 0.26764822006225586 0.07163556970249374 +2352 6 4.92892838 1.0710716247558594 1.1471944253571564 +2353 7 6.629093 0.37090682983398438 0.13757187641749624 +2354 6 6.40233326 0.40233325958251953 0.16187205176629504 +2356 6 6.0423007 0.042300701141357422 0.0017893493170504371 +2357 5 5.656014 0.65601396560668945 0.43035432307101473 +2360 6 5.923725 0.076274871826171875 0.0058178560720989481 +2361 5 5.435309 0.43530893325805664 0.18949386737426721 +2362 6 6.59601164 0.59601163864135742 0.35522987339595602 +2363 5 5.40386868 0.40386867523193359 0.16310990683359705 +2364 5 5.101656 0.10165596008300781 0.010333934220398078 +2368 6 6.03222227 0.032222270965576172 0.0010382747461790132 +2369 6 6.44548035 0.4454803466796875 0.19845273927785456 +2371 5 5.05729532 0.057295322418212891 0.0032827539710069686 +2372 4 4.919681 0.91968107223510742 0.84581327462751688 +2373 3 4.649655 1.6496548652648926 2.7213611744921309 +2377 6 5.685666 0.31433391571044922 0.098805810565863794 +2378 5 5.3659873 0.36598730087280273 0.13394670440015943 +2382 8 6.08168459 1.9183154106140137 3.6799340145992119 +2384 8 6.08168459 1.9183154106140137 3.6799340145992119 +2385 5 6.075173 1.0751729011535645 1.1559967673749725 +2388 4 5.50844765 1.5084476470947266 2.2754143040256167 +2390 8 6.72099352 1.2790064811706543 1.6358575788765393 +2394 5 4.58178139 0.41821861267089844 0.17490680798437097 +2395 5 5.433248 0.43324804306030273 0.18770386681558193 +2397 6 6.34468651 0.34468650817871094 0.11880878892043256 +2398 6 5.82847166 0.17152833938598633 0.029421971212514109 +2399 6 5.86013937 0.13986063003540039 0.019560995833899142 +2400 4 5.371424 1.3714241981506348 1.8808043312731115 +2402 6 5.738343 0.2616572380065918 0.068464510201238227 +2404 5 5.227812 0.22781181335449219 0.051898222303861985 +2405 5 5.53696 0.53696012496948242 0.28832617580724218 +2407 6 6.45428562 0.45428562164306641 0.20637542603162728 +2408 5 5.178765 0.17876482009887695 0.031956860904983841 +2409 4 6.19751453 2.197514533996582 4.8290701271262151 +2410 6 5.979308 0.020691871643066406 0.00042815355209313566 +2411 6 5.34828043 0.65171957015991211 0.4247383981294206 +2412 4 4.916668 0.91666793823242188 0.84028010898327921 +2413 4 6.19751453 2.197514533996582 4.8290701271262151 +2414 4 4.938815 0.93881511688232422 0.88137382368677208 +2416 6 5.90936852 0.090631484985351563 0.0082140660706500057 +2417 5 5.098955 0.098955154418945313 0.009792122586077312 +2418 5 5.14088 0.14088010787963867 0.01984720479617863 +2421 5 5.53499174 0.53499174118041992 0.28621616313125742 +2425 6 5.7708354 0.22916460037231445 0.052516414063802586 +2432 5 5.24270248 0.24270248413085938 0.058904495803290047 +2434 6 5.044686 0.95531415939331055 0.91262514313734755 +2438 5 5.163544 0.1635441780090332 0.02674669816065034 +2442 5 5.403841 0.40384101867675781 0.16308756836588145 +2445 5 5.26599836 0.26599836349487305 0.07075512938195061 +2446 5 5.146648 0.14664793014526367 0.021505615415890134 +2447 6 5.372452 0.6275482177734375 0.39381676563061774 +2448 6 6.4595356 0.45953559875488281 0.21117296652300865 +2449 6 5.92163754 0.078362464904785156 0.0061406759059536853 +2451 5 5.25498247 0.25498247146606445 0.065016060754942373 +2454 5 5.75557137 0.75557136535644531 0.57088808814660297 +2457 6 6.171699 0.17169904708862305 0.029480562771141194 +2458 6 5.670337 0.32966279983520508 0.10867756159518649 +2460 5 5.292545 0.29254484176635742 0.085582484444103102 +2462 5 5.344185 0.34418487548828125 0.11846322851488367 +2463 7 5.982689 1.0173110961914063 1.0349218664341606 +2468 6 5.92515135 0.074848651885986328 0.0056023206891495647 +2469 5 5.10332346 0.10332345962524414 0.010675737308929456 +2471 7 6.763718 0.2362818717956543 0.055829122939258014 +2473 6 5.359101 0.6408991813659668 0.4107517606755664 +2474 7 6.66483355 0.33516645431518555 0.11233655209821336 +2476 6 5.617904 0.3820958137512207 0.14599721088620754 +2479 6 5.733638 0.26636219024658203 0.07094881639295636 +2480 5 5.60609865 0.60609865188598633 0.36735557581801004 +2481 6 5.534317 0.4656829833984375 0.21686064102686942 +2482 6 5.51141644 0.48858356475830078 0.23871389975192869 +2484 5 4.99243975 0.0075602531433105469 5.7157427590937004E-05 +2485 6 5.452924 0.54707622528076172 0.29929239626744675 +2487 6 6.08044624 0.080446243286132813 0.0064715980588516686 +2489 6 5.251443 0.74855709075927734 0.56033771812599298 +2490 6 5.63068438 0.36931562423706055 0.1363940303056097 +2491 5 5.337746 0.33774614334106445 0.11407245734176286 +2492 6 5.251443 0.74855709075927734 0.56033771812599298 +2493 4 4.97407532 0.9740753173828125 0.9488227239344269 +2494 4 4.97407532 0.9740753173828125 0.9488227239344269 +2497 5 5.861051 0.86105108261108398 0.74140896686571978 +2498 5 5.861051 0.86105108261108398 0.74140896686571978 +2500 5 5.861051 0.86105108261108398 0.74140896686571978 +2501 5 5.58227253 0.58227252960205078 0.3390412987291711 +2506 6 5.66883469 0.33116531372070313 0.10967046501173172 +2507 7 6.7565403 0.24345970153808594 0.059272626273013884 +2508 6 5.29136038 0.70863962173461914 0.5021701134921841 +2509 5 5.079103 0.079102993011474609 0.0062572835033734009 +2510 6 5.2369175 0.76308250427246094 0.58229490832673036 +2515 7 6.55906534 0.44093465805053711 0.19442337267014409 +2516 6 5.811081 0.1889190673828125 0.03569041402079165 +2520 5 5.290832 0.2908320426940918 0.084583277057618034 +2521 7 6.52523851 0.4747614860534668 0.22539846863969615 +2524 5 5.290832 0.2908320426940918 0.084583277057618034 +2527 6 6.490842 0.49084186553955078 0.24092573696634645 +2528 6 6.352836 0.35283613204956055 0.12449333607969493 +2529 5 5.23124552 0.23124551773071289 0.05347448947054545 +2530 6 5.951566 0.048433780670166016 0.0023458311100057472 +2533 5 5.814865 0.8148651123046875 0.66400515125133097 +2535 6 5.80516768 0.19483232498168945 0.037959634857770652 +2539 5 5.67786741 0.67786741256713867 0.45950422902046739 +2540 5 5.81270027 0.81270027160644531 0.66048173146918998 +2542 5 5.65886974 0.65886974334716797 0.43410933869836299 +2543 6 5.83148432 0.16851568222045898 0.028397535154226716 +2544 6 6.05693531 0.056935310363769531 0.0032416295662187622 +2549 5 5.859064 0.85906410217285156 0.73799113164204755 +2550 5 5.152034 0.15203380584716797 0.023114278120374365 +2553 7 6.7520833 0.24791669845581055 0.061462689373229296 +2559 5 5.22799063 0.22799062728881836 0.051979726131548887 +2561 5 5.33876657 0.33876657485961914 0.11476279224211794 +2565 5 5.59515524 0.59515523910522461 0.35420975863439708 +2570 5 6.33803844 1.338038444519043 1.79034687901094 +2572 5 5.527744 0.52774381637573242 0.27851353572282278 +2573 5 5.510949 0.51094913482666016 0.26106901838011254 +2576 5 5.52992439 0.52992439270019531 0.28081986197867082 +2577 5 5.52948666 0.52948665618896484 0.28035611908217106 +2578 7 7.174179 0.1741790771484375 0.030338350916281343 +2580 5 5.20988464 0.2098846435546875 0.044051563600078225 +2582 7 6.89886475 0.10113525390625 0.010228339582681656 +2585 7 6.89886475 0.10113525390625 0.010228339582681656 +2587 6 5.308645 0.69135522842407227 0.47797205186930114 +2588 7 6.89886475 0.10113525390625 0.010228339582681656 +2589 4 4.752048 0.75204801559448242 0.56557621775959888 +2590 6 5.84936428 0.15063571929931641 0.022691119928822445 +2591 7 6.7222743 0.2777256965637207 0.077131562531803866 +2594 7 6.5785265 0.42147350311279297 0.1776399138261695 +2597 6 6.427939 0.42793893814086914 0.18313173477713462 +2598 5 5.18123627 0.18123626708984375 0.032846584508661181 +2601 5 5.74279642 0.74279642105102539 0.5517465231262122 +2603 7 6.79414 0.20586013793945313 0.042378396392450668 +2604 7 6.79414 0.20586013793945313 0.042378396392450668 +2605 6 5.72790956 0.27209043502807617 0.074033204833767741 +2606 6 6.387043 0.38704299926757813 0.14980228328204248 +2608 6 6.0678134 0.067813396453857422 0.0045986567386080424 +2613 5 5.126914 0.12691402435302734 0.016107169577480818 +2614 5 6.94864941 1.9486494064331055 3.7972345091920943 +2615 7 6.824006 0.17599391937255859 0.030973859656114655 +2616 7 6.824006 0.17599391937255859 0.030973859656114655 +2620 5 5.711483 0.71148300170898438 0.50620806172082666 +2622 7 6.08931541 0.91068458557128906 0.82934641439715051 +2624 5 6.94864941 1.9486494064331055 3.7972345091920943 +2625 5 4.77114964 0.22885036468505859 0.052372489416484314 +2627 7 6.292391 0.70760917663574219 0.50071074685911299 +2629 5 5.016961 0.016961097717285156 0.00028767883577529574 +2630 6 5.658123 0.34187698364257813 0.11687987194454763 +2631 7 7.00162125 0.001621246337890625 2.6284396881237626E-06 +2632 5 5.24547338 0.24547338485717773 0.060257182673240095 +2634 5 5.226285 0.22628498077392578 0.05120489252385596 +2636 5 5.24788761 0.24788761138916016 0.061448267880223284 +2637 5 5.226285 0.22628498077392578 0.05120489252385596 +2640 6 5.900393 0.099606990814208984 0.009921552619061913 +2642 5 5.567663 0.56766319274902344 0.32224150040201494 +2643 5 5.44986 0.4498600959777832 0.20237410595314032 +2645 7 6.19523335 0.80476665496826172 0.6476493689488052 +2646 7 5.6784997 1.321500301361084 1.7463630464974358 +2647 5 5.91222429 0.91222429275512695 0.83215316029259156 +2649 6 5.982657 0.017343044281005859 0.00030078118493293005 +2651 5 5.137049 0.13704919815063477 0.018782482713731952 +2655 5 5.89877558 0.89877557754516602 0.80779753879164673 +2656 4 5.77243853 1.7724385261535645 3.1415383289934198 +2657 7 6.763962 0.2360382080078125 0.055714035639539361 +2659 6 6.37671328 0.37671327590942383 0.14191289224640968 +2662 6 6.27378 0.27377986907958984 0.074955416713237355 +2663 8 5.605367 2.3946328163146973 5.7342663249712587 +2667 7 6.06611156 0.93388843536376953 0.87214760970618954 +2671 7 6.997082 0.0029177665710449219 8.5133617631072411E-06 +2672 7 5.70440626 1.2955937385559082 1.678563135385275 +2673 6 5.376573 0.62342691421508789 0.38866111736774656 +2675 7 5.65682268 1.343177318572998 1.8041253091289491 +2676 6 6.117843 0.1178431510925293 0.013887008259416689 +2677 6 6.376442 0.37644195556640625 0.14170854591066018 +2678 5 5.088139 0.088139057159423828 0.0077684933969521808 +2682 6 6.55787754 0.55787754058837891 0.31122735029293835 +2684 6 6.64978456 0.64978456497192383 0.4222199808757523 +2685 7 6.16082764 0.83917236328125 0.70421025529503822 +2686 6 6.421867 0.42186689376831055 0.17797167605772302 +2687 5 5.601118 0.60111808776855469 0.36134295544252382 +2688 6 5.775768 0.22423219680786133 0.050280078085279456 +2689 6 5.77052832 0.22947168350219727 0.052657253529332593 +2690 6 5.477135 0.52286481857299805 0.27338761850137416 +2691 6 6.19818 0.19818019866943359 0.039275391144656169 +2692 6 5.3088727 0.69112730026245117 0.47765694516806434 +2693 6 6.40099239 0.40099239349365234 0.16079489963976812 +2695 6 6.671632 0.67163181304931641 0.4510892922999119 +2696 6 6.101705 0.10170507431030273 0.010343922140464201 +2701 5 5.683027 0.68302679061889648 0.46652559670314986 +2702 5 5.683027 0.68302679061889648 0.46652559670314986 +2704 6 5.40905666 0.59094333648681641 0.34921402693817072 +2705 6 5.377111 0.62288904190063477 0.38799075851989073 +2708 6 5.674005 0.32599496841430664 0.10627271943144478 +2713 6 5.674005 0.32599496841430664 0.10627271943144478 +2714 6 5.63665152 0.36334848403930664 0.13202212085366227 +2715 6 5.961359 0.038640975952148438 0.0014931250225345138 +2719 6 6.00781345 0.0078134536743164063 6.1050058320688549E-05 +2720 7 6.928305 0.071694850921630859 0.0051401516486748733 +2725 5 5.436736 0.43673610687255859 0.19073842704619892 +2726 6 6.01847649 0.018476486206054688 0.00034138054252252914 +2734 6 5.772902 0.22709798812866211 0.051573496212085956 +2735 6 5.495194 0.5048060417175293 0.25482913975451993 +2736 6 6.02836132 0.028361320495605469 0.00080436450025445083 +2737 7 5.989409 1.0105910301208496 1.02129423016072 +2738 5 4.737275 0.26272487640380859 0.069024360681396502 +2741 5 4.737275 0.26272487640380859 0.069024360681396502 +2742 6 6.055468 0.055468082427978516 0.003076708168237019 +2746 6 5.836874 0.16312599182128906 0.026610089207679266 +2747 6 5.7550745 0.24492549896240234 0.059988500041981752 +2748 8 6.51024771 1.4897522926330566 2.2193618934054484 +2750 8 6.51024771 1.4897522926330566 2.2193618934054484 +2751 6 6.259954 0.25995397567749023 0.067576069470533184 +2763 6 5.62238073 0.37761926651000977 0.14259631043955778 +2765 6 6.661471 0.66147089004516602 0.43754373837714411 +2766 6 6.56617546 0.56617546081542969 0.32055465242956416 +2767 6 5.70376873 0.29623126983642578 0.087752965228901303 +2772 7 6.78145933 0.21854066848754883 0.047760023782984717 +2774 8 6.670294 1.3297061920166016 1.7681185570872913 +2775 8 6.670294 1.3297061920166016 1.7681185570872913 +2777 6 6.15103436 0.15103435516357422 0.022811376439676678 +2783 6 6.03249025 0.032490253448486328 0.0010556165691468777 +2785 5 5.375451 0.37545108795166016 0.14096351944408525 +2786 6 6.6210227 0.62102270126342773 0.38566919548452461 +2788 5 5.12538052 0.12538051605224609 0.01572027380552754 +2790 6 6.03864765 0.038647651672363281 0.0014936409797883243 +2791 5 5.305353 0.30535316467285156 0.093240555175725603 +2794 5 5.126914 0.12691402435302734 0.016107169577480818 +2796 7 6.79185629 0.20814371109008789 0.043323804466353977 +2798 7 6.130739 0.86926078796386719 0.75561431749156327 +2799 7 6.46095467 0.53904533386230469 0.29056987195872352 +2801 5 5.305835 0.30583477020263672 0.093534906664899609 +2802 6 5.2526474 0.74735260009765625 0.5585359088727273 +2803 8 6.48372269 1.5162773132324219 2.299096890623332 +2805 6 6.56267643 0.56267642974853516 0.31660476459455822 +2806 5 5.630569 0.6305689811706543 0.39761724001459697 +2807 5 5.77354336 0.77354335784912109 0.59836932647249341 +2812 6 6.34839 0.34839010238647461 0.12137566344085826 +2815 5 5.861833 0.86183309555053711 0.74275628458622123 +2816 5 6.02125645 1.0212564468383789 1.0429647302089506 +2817 7 6.998362 0.0016379356384277344 2.6828331556316698E-06 +2819 6 6.00246859 0.0024685859680175781 6.0939166814932832E-06 +2820 5 5.3738 0.37379980087280273 0.13972629113254698 +2821 5 5.538675 0.53867483139038086 0.29017057397345525 +2822 5 5.93718 0.9371800422668457 0.8783064316232867 +2824 6 5.525997 0.47400283813476563 0.22467869055981282 +2825 6 5.664385 0.33561515808105469 0.11263753433377133 +2826 6 5.576673 0.42332696914672852 0.17920572280695524 +2827 7 6.09040356 0.90959644317626953 0.82736568943892053 +2828 7 6.09040356 0.90959644317626953 0.82736568943892053 +2829 5 5.81203938 0.81203937530517578 0.65940794704602013 +2832 6 6.443174 0.44317388534545898 0.19640309265219003 +2834 6 6.52443933 0.52443933486938477 0.27503661595824269 +2835 6 5.664385 0.33561515808105469 0.11263753433377133 +2838 7 6.574909 0.42509078979492188 0.18070217956847046 +2841 6 5.288304 0.71169614791870117 0.50651140696231778 +2843 6 5.576536 0.42346382141113281 0.17932160804411978 +2845 7 6.77294 0.22705984115600586 0.051556171465790612 +2849 5 4.95902538 0.040974617004394531 0.0016789192386568175 +2851 5 5.447955 0.44795513153076172 0.20066379986474203 +2853 6 6.56922865 0.5692286491394043 0.32402125500107104 +2855 7 6.19740772 0.80259227752685547 0.64415436394574499 +2857 8 6.96427441 1.0357255935668945 1.072727505169496 +2858 7 6.19740772 0.80259227752685547 0.64415436394574499 +2859 6 6.38069248 0.38069248199462891 0.14492676584723085 +2862 6 7.406578 1.4065780639648438 1.9784618500270881 +2864 6 6.56922865 0.5692286491394043 0.32402125500107104 +2866 7 6.92963028 0.070369720458984375 0.0049518975574756041 +2867 7 6.45028639 0.5497136116027832 0.30218505478137558 +2874 7 7.00020456 0.00020456314086914063 4.1846078602247871E-08 +2875 6 6.091036 0.091035842895507813 0.0082875246916955803 +2876 5 5.73519039 0.73519039154052734 0.5405049118135139 +2877 5 5.667036 0.66703605651855469 0.44493710069582448 +2878 6 7.063399 1.0633988380432129 1.1308170887516553 +2880 5 5.79379845 0.79379844665527344 0.63011597391232499 +2882 5 6.03466845 1.0346684455871582 1.0705387922937462 +2883 7 6.6983304 0.30166959762573242 0.091004546131671304 +2884 7 6.882702 0.11729812622070313 0.013758850414888002 +2885 6 6.69207048 0.69207048416137695 0.47896155504736271 +2886 5 5.645948 0.64594793319702148 0.41724873240150373 +2887 5 6.44235039 1.4423503875732422 2.080374640532682 +2888 4 5.687807 1.6878070831298828 2.8486927498634032 +2889 6 6.115722 0.1157221794128418 0.013391622808057946 +2892 5 5.230067 0.23006677627563477 0.05293072154586298 +2894 7 6.08665466 0.9133453369140625 0.83419970446266234 +2897 5 5.230067 0.23006677627563477 0.05293072154586298 +2899 5 5.345107 0.34510707855224609 0.11909889566686616 +2900 6 6.304159 0.30415916442871094 0.092512797305971617 +2901 7 6.9534893 0.046510696411132813 0.0021632448806485627 +2907 6 5.99173832 0.0082616806030273438 6.8255366386438254E-05 +2908 6 6.029345 0.029345035552978516 0.0008611311116055731 +2909 6 6.13224649 0.13224649429321289 0.01748913525284479 +2912 7 6.9534893 0.046510696411132813 0.0021632448806485627 +2914 6 6.29565048 0.29565048217773438 0.087409207611926831 +2915 6 6.29565048 0.29565048217773438 0.087409207611926831 +2916 6 7.28764725 1.2876472473144531 1.6580354335164884 +2917 7 6.59266424 0.40733575820922852 0.16592241991588708 +2918 6 5.818439 0.18156099319458008 0.032964394249802353 +2921 6 5.24437332 0.75562667846679688 0.57097167721076403 +2922 8 6.92716074 1.0728392601013184 1.1509840780147442 +2925 5 5.60205 0.60204982757568359 0.36246399488391035 +2926 8 6.49473143 1.5052685737609863 2.2658334791524339 +2928 7 6.657715 0.34228515625 0.11715912818908691 +2930 8 6.3040967 1.6959033012390137 2.8760880071533848 +2931 8 6.49473143 1.5052685737609863 2.2658334791524339 +2932 6 5.77632141 0.2236785888671875 0.050032111117616296 +2935 4 5.64942026 1.6494202613830566 2.7205871986609509 +2936 5 5.53018761 0.53018760681152344 0.28109889841653057 +2938 8 6.46726751 1.5327324867248535 2.3492688758617533 +2939 8 6.46726751 1.5327324867248535 2.3492688758617533 +2942 5 5.406212 0.40621185302734375 0.16500806953990832 +2945 8 6.766925 1.2330751419067383 1.5204743055883227 +2946 6 6.597327 0.59732723236083984 0.35679982251986075 +2951 5 5.378861 0.3788609504699707 0.14353561979100959 +2952 5 5.267042 0.26704216003417969 0.071311515235720435 +2954 7 6.799798 0.20020198822021484 0.040080836087327043 +2957 6 6.349566 0.34956598281860352 0.12219637634393621 +2958 5 5.378861 0.3788609504699707 0.14353561979100959 +2960 7 6.284437 0.71556282043457031 0.51203014998827712 +2963 7 6.68011761 0.31988239288330078 0.1023247452767464 +2966 6 5.974721 0.025279045104980469 0.000639030121419637 +2969 6 6.09424448 0.094244480133056641 0.0088820220355501078 +2972 6 5.933644 0.066356182098388672 0.0044031429026745172 +2973 6 5.974721 0.025279045104980469 0.000639030121419637 +2974 6 5.957036 0.042963981628417969 0.0018459037173670367 +2976 6 6.69672871 0.69672870635986328 0.48543089026588859 +2977 6 5.54298067 0.45701932907104492 0.20886666714454805 +2978 6 5.54298067 0.45701932907104492 0.20886666714454805 +2979 7 6.81259727 0.18740272521972656 0.035119781419780338 +2980 7 6.51479244 0.48520755767822266 0.23542637402806577 +2982 6 5.97326 0.026740074157714844 0.00071503156596008921 +2983 6 6.640424 0.64042377471923828 0.41014261122563767 +2986 7 6.75716543 0.24283456802368164 0.058968627427248066 +2988 7 6.219643 0.78035688400268555 0.60895686641038083 +2990 7 7.345382 0.3453822135925293 0.11928887346607553 +2992 7 6.498168 0.50183200836181641 0.25183536461645417 +2993 7 6.69612646 0.30387353897094727 0.092339127686727807 +2995 6 6.423425 0.42342519760131836 0.1792888979637155 +2998 7 5.98535633 1.014643669128418 1.0295017753023785 +3003 7 6.219643 0.78035688400268555 0.60895686641038083 +3007 7 7.345382 0.3453822135925293 0.11928887346607553 +3008 7 6.825198 0.17480182647705078 0.030555678539712972 +3009 6 6.295004 0.29500389099121094 0.087027295699954266 +3010 5 5.711464 0.71146392822265625 0.50618092116201296 +3011 6 6.46941233 0.46941232681274414 0.22034793256375451 +3012 6 6.697702 0.69770193099975586 0.48678798452078809 +3015 6 6.49390459 0.49390459060668945 0.24394174462236151 +3017 6 6.946234 0.94623422622680664 0.89535921088304349 +3018 8 6.962376 1.0376238822937012 1.0766633211062526 +3019 6 6.49390459 0.49390459060668945 0.24394174462236151 +3021 4 5.24641752 1.2464175224304199 1.5535566402215863 +3024 6 6.009761 0.0097608566284179688 9.5274322120530996E-05 +3025 7 6.219143 0.78085708618164063 0.60973778904008213 +3030 8 7.225498 0.77450180053710938 0.59985303903522436 +3032 5 6.4052043 1.4052042961120605 1.9745991138117915 +3035 7 6.15401649 0.84598350524902344 0.71568809115342447 +3036 5 5.49720573 0.49720573425292969 0.24721354217399494 +3041 6 5.60923433 0.39076566696166992 0.15269780647599873 +3042 6 5.63067532 0.36932468414306641 0.13640072231737577 +3047 5 5.81673336 0.81673336029052734 0.66705338181145635 +3048 6 6.29114628 0.29114627838134766 0.084766155415309186 +3051 5 4.942138 0.057861804962158203 0.0033479884734788357 +3052 7 5.52170372 1.4782962799072266 2.1853598911875451 +3054 6 6.31711531 0.31711530685424805 0.1005621178412639 +3057 5 7.07048559 2.0704855918884277 4.2869105862175729 +3060 5 5.98335648 0.98335647583007813 0.96698995855695102 +3061 5 5.98335648 0.98335647583007813 0.96698995855695102 +3063 5 5.98335648 0.98335647583007813 0.96698995855695102 +3067 4 5.51983833 1.5198383331298828 2.3099085588510206 +3068 6 6.672843 0.67284297943115234 0.4527176749697901 +3071 7 6.574376 0.42562389373779297 0.18115569892052008 +3081 5 5.98335648 0.98335647583007813 0.96698995855695102 +3082 6 5.716046 0.28395414352416992 0.080629955624544891 +3083 7 7.03537655 0.035376548767089844 0.0012515002026702859 +3085 6 6.038491 0.038490772247314453 0.0014815395481946325 +3087 3 5.562565 2.5625648498535156 6.5667386097047711 +3089 7 6.300327 0.69967317581176758 0.48954255295052462 +3092 6 6.07498169 0.074981689453125 0.0056222537532448769 +3093 7 6.38679647 0.61320352554321289 0.37601856373862574 +3096 7 6.29434252 0.7056574821472168 0.49795248211034959 +3098 7 6.51368141 0.48631858825683594 0.23650576928412193 +3100 7 6.214272 0.78572797775268555 0.61736845502332471 +3103 7 6.38679647 0.61320352554321289 0.37601856373862574 +3107 6 5.8152194 0.18478059768676758 0.034143869281479056 +3109 4 5.217391 1.2173910140991211 1.4820408812092865 +3110 6 6.220336 0.22033596038818359 0.04854793544018321 +3118 7 6.662462 0.33753776550292969 0.11393174314071075 +3121 5 5.7390213 0.73902130126953125 0.54615248373011127 +3123 5 5.898568 0.89856815338134766 0.80742472627116513 +3127 5 5.530425 0.53042507171630859 0.28135075670525111 +3129 6 6.40345764 0.4034576416015625 0.16277806856669486 +3130 6 6.532478 0.53247785568237305 0.2835326667920981 +3132 6 6.18413734 0.18413734436035156 0.033906561588082695 +3134 6 6.30036449 0.30036449432373047 0.090218829450350313 +3136 5 5.418242 0.41824197769165039 0.17492635190342298 +3137 6 6.030046 0.030045986175537109 0.00090276128526056709 +3139 6 5.48615837 0.51384162902832031 0.26403321972247795 +3142 6 5.927244 0.072755813598632813 0.0052934084123990033 +3148 6 5.863857 0.13614320755004883 0.018534972962015672 +3149 6 5.978788 0.021212100982666016 0.00044995322809882055 +3150 6 6.86632347 0.86632347106933594 0.75051635652562254 +3152 6 6.020052 0.020051956176757813 0.00040208094651461579 +3153 6 6.675877 0.67587709426879883 0.45680984655723478 +3155 7 7.07547855 0.075478553771972656 0.0056970120795085677 +3156 5 5.45387 0.45386981964111328 0.2059978131810567 +3160 6 5.46099949 0.53900051116943359 0.29052155104091071 +3161 5 5.45387 0.45386981964111328 0.2059978131810567 +3163 7 7.082826 0.082826137542724609 0.006860169060246335 +3165 6 5.32146263 0.67853736877441406 0.46041296082330518 +3169 6 5.94287443 0.057125568389892578 0.0032633305638682941 +3170 6 5.82820129 0.1717987060546875 0.029514795402064919 +3171 6 6.13454771 0.13454771041870117 0.018103086378914668 +3180 6 6.229454 0.22945404052734375 0.052649156714323908 +3184 7 6.49895573 0.50104427337646484 0.25104536388334964 +3185 6 6.42349863 0.42349863052368164 0.17935109005543381 +3186 4 4.975396 0.97539615631103516 0.95139766174634133 +3187 7 6.33176565 0.66823434829711914 0.44653714424407553 +3188 8 6.155749 1.8442511558532715 3.4012623258661279 +3191 6 6.22899628 0.22899627685546875 0.052439294813666493 +3194 5 5.332969 0.33296918869018555 0.11086848061700039 +3196 7 6.38609028 0.61390972137451172 0.37688514599813061 +3198 7 6.38609028 0.61390972137451172 0.37688514599813061 +3202 7 6.58337927 0.41662073135375977 0.17357283379374167 +3203 7 6.38609028 0.61390972137451172 0.37688514599813061 +3205 7 6.77105665 0.2289433479309082 0.052415056561812889 +3207 6 6.487988 0.48798799514770508 0.23813228340827663 +3210 5 5.164092 0.16409206390380859 0.026926205436211603 +3213 6 6.04922438 0.049224376678466797 0.0024230392593835859 +3214 6 6.378387 0.3783869743347168 0.14317670234618163 +3219 7 6.99409437 0.0059056282043457031 3.4876444487963454E-05 +3221 6 6.578329 0.57832908630371094 0.33446453206488513 +3222 6 6.260792 0.26079177856445313 0.068012351766810752 +3223 6 6.038379 0.038379192352294922 0.001472962405614453 +3226 6 5.90616274 0.093837261199951172 0.0088054315895078616 +3227 6 5.297394 0.702606201171875 0.49365547392517328 +3232 5 6.33687925 1.3368792533874512 1.7872461381377889 +3236 6 6.73901 0.73900985717773438 0.54613556900585536 +3239 7 6.717206 0.28279399871826172 0.079972445711064211 +3240 6 6.097996 0.097996234893798828 0.009603262053360595 +3241 7 6.155386 0.84461402893066406 0.71337285786648863 +3242 6 6.638215 0.63821506500244141 0.40731846919607051 +3244 7 6.78101444 0.21898555755615234 0.047954674418178911 +3246 6 6.296465 0.29646492004394531 0.087891448816662887 +3247 6 6.18805265 0.18805265426635742 0.035363800776622156 +3248 7 6.380581 0.61941909790039063 0.38368001884373371 +3251 6 5.43093538 0.56906461715698242 0.32383453850002297 +3252 8 6.62019968 1.3798003196716309 1.9038489221659347 +3253 8 6.28288651 1.7171134948730469 2.9484787542751292 +3255 6 6.162778 0.16277790069580078 0.02649664495493198 +3256 6 6.162778 0.16277790069580078 0.02649664495493198 +3258 6 6.162778 0.16277790069580078 0.02649664495493198 +3263 8 6.648934 1.3510661125183105 1.8253796403953402 +3264 6 4.76881361 1.2311863899230957 1.5158199267318651 +3266 6 6.52629471 0.52629470825195313 0.27698611993400846 +3267 6 5.456572 0.54342794418334961 0.29531393051934174 +3269 5 5.305388 0.30538797378540039 0.093261814532752396 +3271 7 6.67051172 0.32948827743530273 0.10856252496728303 +3272 7 6.15691328 0.84308671951293945 0.71079521661908984 +3273 7 6.470145 0.52985477447509766 0.2807460820340566 +3274 5 6.602502 1.6025018692016602 2.5680122407948147 +3275 4 5.10975838 1.1097583770751953 1.2315636554885714 +3277 7 6.07994556 0.92005443572998047 0.84650016470641276 +3278 5 5.305388 0.30538797378540039 0.093261814532752396 +3281 6 6.1144104 0.114410400390625 0.013089739717543125 +3282 7 6.54771852 0.45228147506713867 0.20455853268890678 +3283 6 6.13799 0.13798999786376953 0.01904123951044312 +3284 6 6.074531 0.074531078338623047 0.0055548816383179656 +3287 7 6.549185 0.45081520080566406 0.20323434527745121 +3288 6 6.13799 0.13798999786376953 0.01904123951044312 +3290 5 5.538323 0.53832292556762695 0.28979157219168883 +3293 7 5.87733269 1.1226673126220703 1.2603818948300614 +3295 5 5.37942362 0.37942361831665039 0.1439622821364992 +3296 5 5.385761 0.38576078414916992 0.14881138258738247 +3297 5 5.46297359 0.46297359466552734 0.21434454935752001 +3298 6 6.486424 0.48642396926879883 0.23660827787921335 +3299 7 6.907785 0.092215061187744141 0.0085036175098593958 +3300 5 5.538323 0.53832292556762695 0.28979157219168883 +3302 6 6.837441 0.83744096755981445 0.7013073741475182 +3303 7 6.97040558 0.02959442138671875 0.00087582977721467614 +3305 7 6.44612741 0.55387258529663086 0.30677484074317363 +3306 7 6.650588 0.34941196441650391 0.12208872087740019 +3308 6 5.71844 0.28155994415283203 0.079276002151345892 +3309 7 7.01717138 0.017171382904052734 0.00029485639083759452 +3310 7 6.34131145 0.65868854522705078 0.43387059961332852 +3311 7 6.4923954 0.50760459899902344 0.25766242892495939 +3313 7 5.71587229 1.2841277122497559 1.6489839813677918 +3314 6 5.3228364 0.67716360092163086 0.45855054241314974 +3316 6 6.5741744 0.57417440414428711 0.32967624637444715 +3317 6 6.148521 0.14852094650268555 0.022058471550053582 +3318 7 6.34272146 0.65727853775024414 0.43201507618709911 +3319 5 6.048157 1.0481572151184082 1.098633547604777 +3321 6 7.08008051 1.080080509185791 1.1665739063230376 +3323 6 6.115237 0.11523723602294922 0.013279620566208905 +3326 5 5.86527252 0.86527252197265625 0.74869653728092089 +3328 5 6.12279 1.1227898597717285 1.2606570692062178 +3330 6 5.853405 0.14659500122070313 0.021490094382897951 +3332 7 6.677882 0.32211780548095703 0.10375988060786767 +3333 6 5.77039862 0.22960138320922852 0.052716795171591002 +3335 6 5.34549332 0.65450668334960938 0.42837899854930583 +3336 6 5.34549332 0.65450668334960938 0.42837899854930583 +3337 6 5.34549332 0.65450668334960938 0.42837899854930583 +3342 5 6.33434725 1.3343472480773926 1.7804825784517107 +3343 7 5.351585 1.6484150886535645 2.7172723045007388 +3344 6 5.34549332 0.65450668334960938 0.42837899854930583 +3346 6 6.06787443 0.067874431610107422 0.0046069384663951496 +3347 6 5.473527 0.52647304534912109 0.27717386747917772 +3351 6 6.575538 0.57553815841674805 0.33124417179374177 +3355 6 6.61243725 0.61243724822998047 0.37507938301951071 +3356 6 5.67187738 0.32812261581420898 0.10766445100875899 +3357 7 6.22333241 0.77666759490966797 0.6032125529827681 +3359 6 6.455224 0.45522403717041016 0.20722892401772697 +3361 6 6.04721 0.047210216522216797 0.0022288045440745918 +3363 6 6.575538 0.57553815841674805 0.33124417179374177 +3365 7 6.32687855 0.67312145233154297 0.45309248958892567 +3366 6 6.063332 0.063332080841064453 0.0040109524636591232 +3369 7 6.996855 0.0031452178955078125 9.8923956102225929E-06 +3370 6 6.12963772 0.12963771820068359 0.01680593798027985 +3371 6 6.063332 0.063332080841064453 0.0040109524636591232 +3372 6 6.205173 0.20517301559448242 0.042095966328133727 +3376 6 5.938579 0.061420917510986328 0.003772529107891387 +3382 7 6.91614866 0.083851337432861328 0.0070310467892795714 +3383 6 6.39578152 0.39578151702880859 0.15664300922162511 +3384 6 5.7451396 0.25486040115356445 0.064953824076155797 +3387 5 5.19510555 0.19510555267333984 0.038066176683969388 +3389 7 6.93638754 0.063612461090087891 0.0040465452059379459 +3390 6 6.849008 0.84900808334350586 0.72081472558261339 +3397 6 5.76644 0.23356008529663086 0.054550313443769483 +3399 6 6.414225 0.41422510147094727 0.17158243468861656 +3400 6 5.49066544 0.50933456420898438 0.25942169829795603 +3401 5 6.021369 1.0213689804077148 1.043194594139095 +3405 6 5.91241646 0.087583541870117188 0.0076708768065145705 +3406 6 6.414225 0.41422510147094727 0.17158243468861656 +3408 6 5.93870974 0.061290264129638672 0.0037564964770808729 +3409 3 6.19192934 3.1919293403625488 10.188412913867296 +3411 6 5.952903 0.047097206115722656 0.0022181468239068636 +3414 7 6.563632 0.43636798858642578 0.19041702146296302 +3416 6 5.661405 0.33859491348266602 0.11464651543633408 +3422 8 6.904515 1.0954852104187012 1.200087846246106 +3423 5 5.99837971 0.99837970733642578 0.99676204002116719 +3425 6 5.99837971 0.0016202926635742188 2.6253483156324364E-06 +3431 6 5.99837971 0.0016202926635742188 2.6253483156324364E-06 +3435 6 6.5048027 0.50480270385742188 0.25482576982176397 +3437 5 5.184186 0.18418598175048828 0.033924475873391202 +3439 5 5.184186 0.18418598175048828 0.033924475873391202 +3442 7 6.286774 0.7132258415222168 0.50869110101507431 +3450 7 6.264104 0.73589611053466797 0.54154308550005226 +3451 7 6.264104 0.73589611053466797 0.54154308550005226 +3452 5 5.423088 0.42308807373046875 0.17900351813295856 +3454 5 6.26566124 1.2656612396240234 1.6018983734866197 +3455 6 6.27837944 0.27837944030761719 0.077495112785982201 +3456 5 5.248194 0.24819421768188477 0.0616003696907228 +3457 7 6.41663027 0.58336973190307617 0.34032024410066697 +3458 7 6.66799736 0.33200263977050781 0.11022575281458558 +3459 6 5.45284367 0.54715633392333984 0.29938005375242938 +3461 8 5.74069548 2.2593045234680176 5.104456929763046 +3463 7 6.4216876 0.57831239700317383 0.33444522852755654 +3465 6 6.35328 0.35328006744384766 0.12480680605312955 +3467 5 5.426408 0.42640781402587891 0.18182362386232853 +3470 8 5.74069548 2.2593045234680176 5.104456929763046 +3472 6 6.27772 0.27771997451782227 0.077128384246179849 +3473 8 6.909926 1.0900740623474121 1.1882614614025897 +3475 6 5.10875368 0.89124631881713867 0.79432000080510079 +3477 7 5.978974 1.0210261344909668 1.0424943673135658 +3478 6 5.10875368 0.89124631881713867 0.79432000080510079 +3480 8 6.909926 1.0900740623474121 1.1882614614025897 +3481 5 5.437664 0.43766403198242188 0.1915498048911104 +3482 8 6.716783 1.2832169532775879 1.6466457491790152 +3483 7 6.300488 0.69951200485229492 0.48931704493247707 +3484 8 6.966226 1.0337738990783691 1.0686884744156941 +3487 6 5.76212358 0.23787641525268555 0.056585188933468089 +3488 6 5.669864 0.33013582229614258 0.10898966116315023 +3490 7 5.978974 1.0210261344909668 1.0424943673135658 +3491 6 5.86625338 0.13374662399291992 0.017888159429503503 +3493 7 6.80228853 0.19771146774291992 0.039089824477059665 +3494 6 6.465614 0.46561384201049805 0.21679624987177704 +3497 6 6.49325275 0.49325275421142578 0.24329827953715721 +3500 7 6.80228853 0.19771146774291992 0.039089824477059665 +3502 5 5.604294 0.6042938232421875 0.36517102480866015 +3503 7 6.91178846 0.088211536407470703 0.0077812751553665294 +3504 7 6.53602171 0.46397829055786133 0.21527585410899519 +3506 6 6.3817296 0.3817296028137207 0.14571748966432096 +3507 7 6.95021248 0.049787521362304688 0.0024787972834019456 +3511 7 6.14064837 0.85935163497924805 0.73848523254150678 +3513 6 6.194863 0.19486284255981445 0.037971527410491035 +3516 7 7.160789 0.16078901290893555 0.025853106672229842 +3517 7 6.42108536 0.57891464233398438 0.33514216310868505 +3518 5 5.62887764 0.62887763977050781 0.39548708580332459 +3519 7 6.91881466 0.081185340881347656 0.006591059574020619 +3520 5 4.49786 0.50214004516601563 0.25214462495932821 +3522 5 5.28192759 0.28192758560180664 0.079483163523264011 +3523 5 4.49786 0.50214004516601563 0.25214462495932821 +3526 6 5.8437705 0.15622949600219727 0.024407655421100571 +3527 6 5.46539 0.53460979461669922 0.28580763250010932 +3528 4 4.4780035 0.47800350189208984 0.22848734782110114 +3529 7 6.96215773 0.037842273712158203 0.0014320376797058998 +3531 5 5.334848 0.33484792709350586 0.11212313427881782 +3532 6 6.010312 0.010312080383300781 0.00010633900183165679 +3533 6 5.45931339 0.54068660736083984 0.29234200737937499 +3536 6 6.167815 0.16781520843505859 0.028161944182102161 +3537 5 5.384029 0.38402891159057617 0.14747820493744257 +3541 6 6.34305763 0.34305763244628906 0.11768853917965316 +3542 6 5.784195 0.2158050537109375 0.046571821207180619 +3543 6 5.960298 0.039701938629150391 0.001576243930912824 +3544 6 5.960298 0.039701938629150391 0.001576243930912824 +3546 6 5.784195 0.2158050537109375 0.046571821207180619 +3547 6 6.22976446 0.22976446151733398 0.052791707776350449 +3551 6 5.85590124 0.14409875869750977 0.020764452258163146 +3555 6 5.74821234 0.25178766250610352 0.063397026990287486 +3560 6 5.88100147 0.11899852752685547 0.014160649553559779 +3564 6 5.88100147 0.11899852752685547 0.014160649553559779 +3566 6 6.084973 0.084972858428955078 0.0072203866695872421 +3567 6 6.27822161 0.27822160720825195 0.077407262717542835 +3568 7 6.10018253 0.89981746673583984 0.80967147344290424 +3572 6 6.084973 0.084972858428955078 0.0072203866695872421 +3573 6 5.96597672 0.034023284912109375 0.0011575839162105694 +3574 6 5.874278 0.12572193145751953 0.015806004049409239 +3576 5 5.308861 0.30886077880859375 0.095394980686251074 +3577 7 6.527867 0.47213315963745117 0.22290972042924295 +3578 4 5.243605 1.2436051368713379 1.546553736452779 +3579 7 6.63758755 0.36241245269775391 0.13134278587040171 +3580 5 5.46338272 0.46338272094726563 0.21472354607249144 +3581 7 6.72054243 0.27945756912231445 0.07809653293975316 +3582 6 6.45041752 0.45041751861572266 0.20287594107594487 +3585 7 5.9680953 1.0319046974182129 1.0648273045537735 +3588 6 5.62326431 0.37673568725585938 0.14192977805214468 +3589 6 5.62326431 0.37673568725585938 0.14192977805214468 +3590 7 6.22018242 0.77981758117675781 0.60811545991236926 +3591 5 5.94550943 0.94550943374633789 0.89398808930332052 +3593 7 6.567736 0.43226385116577148 0.18685203702466424 +3594 7 6.36764431 0.63235569000244141 0.39987371867846377 +3595 7 6.124147 0.87585306167602539 0.76711858564726754 +3596 7 6.226759 0.77324104309082031 0.59790171072017984 +3597 6 5.781614 0.21838617324829102 0.047692520666032578 +3601 7 6.532061 0.46793889999389648 0.21896681412749786 +3602 6 6.54178429 0.54178428649902344 0.29353021309725591 +3603 7 7.277727 0.27772712707519531 0.077132357113441685 +3604 6 6.17229366 0.17229366302490234 0.029685106318538601 +3606 5 5.02290344 0.0229034423828125 0.00052456767298281193 +3608 6 6.042901 0.042901039123535156 0.0018404991578790941 +3609 6 6.042901 0.042901039123535156 0.0018404991578790941 +3610 5 5.149426 0.14942598342895508 0.022328124523710358 +3611 6 6.25682163 0.25682163238525391 0.065957350861026498 +3612 6 6.182319 0.18231916427612305 0.033240277662343942 +3617 5 5.84981 0.84981012344360352 0.72217724590723265 +3618 7 5.523922 1.4760780334472656 2.178806360825547 +3619 6 5.89736557 0.10263442993164063 0.010533826207392849 +3621 7 5.523922 1.4760780334472656 2.178806360825547 +3623 6 5.89736557 0.10263442993164063 0.010533826207392849 +3624 7 6.647185 0.35281515121459961 0.12447853092658079 +3626 5 5.84981 0.84981012344360352 0.72217724590723265 +3630 6 6.034987 0.034986972808837891 0.0012240882663263619 +3632 6 5.87621975 0.12378025054931641 0.015321550426051544 +3633 6 6.034987 0.034986972808837891 0.0012240882663263619 +3634 7 6.41386271 0.58613729476928711 0.34355692831945817 +3636 7 5.85150146 1.14849853515625 1.319048885256052 +3641 6 6.379178 0.37917804718017578 0.14377599146337161 +3642 6 6.379178 0.37917804718017578 0.14377599146337161 +3644 7 5.766061 1.2339391708374023 1.522605877326896 +3648 5 5.762733 0.76273298263549805 0.58176160280004297 +3649 6 6.608306 0.60830593109130859 0.37003610580086388 +3651 6 5.29889727 0.70110273361206055 0.49154504307830393 +3654 6 5.84720135 0.15279865264892578 0.023347428251327074 +3657 8 5.421206 2.578794002532959 6.6501785074999589 +3659 8 7.105409 0.89459085464477539 0.80029279721406965 +3662 4 4.376965 0.37696504592895508 0.14210264585221921 +3663 6 6.50556326 0.50556325912475586 0.25559420897684504 +3664 8 6.748468 1.2515320777893066 1.5663325417356191 +3665 8 7.105409 0.89459085464477539 0.80029279721406965 +3666 7 5.80096 1.1990399360656738 1.4376967682803752 +3667 8 7.36449432 0.63550567626953125 0.40386746457079425 +3669 7 7.10047436 0.10047435760498047 0.010095096536133497 +3670 6 5.35885763 0.64114236831665039 0.41106353645068339 +3671 7 6.66211176 0.33788824081420898 0.11416846328052088 +3672 8 6.41473675 1.5852632522583008 2.513059578960565 +3673 7 6.55105972 0.44894027709960938 0.20154737240227405 +3674 5 5.291589 0.29158878326416016 0.085024018525473366 +3675 6 5.73092127 0.26907873153686523 0.072403363765488393 +3676 7 6.61730766 0.38269233703613281 0.14645342482617707 +3678 5 5.57581854 0.57581853866577148 0.33156698947118457 +3682 7 6.502991 0.4970088005065918 0.24701774778100116 +3683 6 6.082693 0.082693099975585938 0.006838148783572251 +3685 6 6.082693 0.082693099975585938 0.006838148783572251 +3686 5 5.173567 0.17356681823730469 0.030125440393021563 +3689 8 7.2585597 0.7414402961730957 0.54973371278924787 +3690 7 6.452725 0.54727506637573242 0.29950999827656233 +3691 6 6.33922768 0.33922767639160156 0.11507541643004515 +3692 7 6.2607 0.73929977416992188 0.54656415608769748 +3693 7 6.9394455 0.06055450439453125 0.0036668480024673045 +3694 5 5.57581854 0.57581853866577148 0.33156698947118457 +3695 6 6.42376041 0.42376041412353516 0.17957288857815001 +3696 7 6.502991 0.4970088005065918 0.24701774778100116 +3700 5 5.07225561 0.072255611419677734 0.0052208733816314634 +3701 5 5.23490524 0.23490524291992188 0.055180473151267506 +3705 6 5.877325 0.12267494201660156 0.015049141398776555 +3707 6 6.45800257 0.45800256729125977 0.20976635164538493 +3708 5 4.759108 0.24089193344116211 0.058028923597021276 +3709 5 5.23494053 0.23494052886962891 0.055197052105540934 +3710 5 4.60004759 0.39995241165161133 0.15996193158593996 +3711 6 5.877325 0.12267494201660156 0.015049141398776555 +3712 5 5.68548536 0.6854853630065918 0.46989018289627893 +3713 5 5.06799841 0.067998409271240234 0.0046237836634190899 +3715 6 5.36293173 0.63706827163696289 0.40585598272650714 +3717 6 5.639399 0.36060094833374023 0.13003304393919279 +3719 5 5.583803 0.58380317687988281 0.34082614933504374 +3722 5 5.07799673 0.077996730804443359 0.0060834900161808037 +3725 6 6.860689 0.86068916320800781 0.74078583566370071 +3726 7 6.08775568 0.91224431991577148 0.83218969921858843 +3727 7 6.540676 0.45932388305664063 0.21097842954623047 +3729 5 5.07445 0.074450016021728516 0.0055428048856356327 +3732 5 5.07445 0.074450016021728516 0.0055428048856356327 +3736 4 6.51138926 2.5113892555236816 6.3070759927597919 +3737 5 5.62473774 0.62473773956298828 0.39029724323427217 +3740 7 6.76206827 0.23793172836303711 0.056611507361822078 +3742 7 6.76206827 0.23793172836303711 0.056611507361822078 +3743 7 6.76206827 0.23793172836303711 0.056611507361822078 +3746 5 6.23751 1.2375102043151855 1.5314315057842123 +3747 6 5.72499752 0.27500247955322266 0.075626363760420645 +3751 5 5.497589 0.497589111328125 0.24759492371231318 +3752 5 5.71907949 0.71907949447631836 0.51707531937631757 +3754 8 7.540161 0.4598388671875 0.21145178377628326 +3755 6 6.30786037 0.30786037445068359 0.094778010156915116 +3756 5 5.497589 0.497589111328125 0.24759492371231318 +3758 5 5.5047245 0.50472450256347656 0.25474682348794886 +3760 6 6.32082844 0.32082843780517578 0.10293088650450954 +3761 7 6.16920328 0.83079671859741211 0.69022318763222756 +3763 5 6.21218348 1.2121834754943848 1.4693887782616457 +3765 5 5.13151646 0.13151645660400391 0.017296578357672843 +3768 6 5.74247456 0.25752544403076172 0.066319354323240987 +3770 4 6.401444 2.4014439582824707 5.7669330847713809 +3773 5 5.84778261 0.84778261184692383 0.71873535694999191 +3774 5 5.19562674 0.19562673568725586 0.038269819715651465 +3775 6 7.05194664 1.0519466400146484 1.1065917334381083 +3777 6 7.05194664 1.0519466400146484 1.1065917334381083 +3780 5 5.19562674 0.19562673568725586 0.038269819715651465 +3781 6 6.4230175 0.42301750183105469 0.17894380685538636 +3783 5 5.183643 0.18364286422729492 0.033724701581604677 +3784 6 5.7984395 0.20156049728393555 0.040626634065347389 +3787 5 5.26239729 0.26239728927612305 0.068852337419457399 +3788 5 5.363848 0.36384820938110352 0.13238551946983534 +3789 6 5.2043786 0.79562139511108398 0.63301340435850761 +3791 5 5.26949024 0.26949024200439453 0.072624990535587131 +3792 6 5.717157 0.28284311294555664 0.080000226540732911 +3793 6 5.21008873 0.78991127014160156 0.62395981469671824 +3798 5 5.749331 0.74933099746704102 0.56149694376495063 +3800 5 5.224291 0.22429084777832031 0.050306384397117654 +3801 6 5.82138157 0.17861843109130859 0.031904543925520557 +3805 6 5.82138157 0.17861843109130859 0.031904543925520557 +3808 6 5.37288952 0.62711048126220703 0.39326755570891692 +3809 6 5.95666265 0.043337345123291016 0.0018781254823352356 +3815 7 6.536592 0.46340799331665039 0.21474696826976469 +3820 5 5.71193933 0.71193933486938477 0.50685761653426198 +3821 6 5.86657572 0.13342428207397461 0.017802039046955542 +3823 5 5.403213 0.4032130241394043 0.16258074283564383 +3824 7 6.30346251 0.69653749465942383 0.48516448146642688 +3830 7 6.236936 0.76306390762329102 0.5822665271173264 +3833 6 5.77439 0.22560977935791016 0.050899772541924904 +3834 5 5.173202 0.1732020378112793 0.029998945901979823 +3838 5 5.173202 0.1732020378112793 0.029998945901979823 +3839 5 5.009995 0.0099949836730957031 9.9899698625449673E-05 +3841 6 6.08930826 0.089308261871337891 0.0079759656384794653 +3843 7 6.8901124 0.10988759994506836 0.012075284621687388 +3848 6 5.46327162 0.5367283821105957 0.28807735616305763 +3850 6 6.41540051 0.41540050506591797 0.17255757960901974 +3853 7 6.89614964 0.10385036468505859 0.010784898245219665 +3854 6 7.155131 1.1551308631896973 1.3343273110933751 +3855 6 6.148987 0.14898681640625 0.022197071462869644 +3860 5 5.29700661 0.29700660705566406 0.088212924634717638 +3862 6 5.397261 0.60273885726928711 0.36329413006228606 +3863 6 5.397261 0.60273885726928711 0.36329413006228606 +3866 6 5.8716774 0.12832260131835938 0.016466690009110607 +3869 6 5.493267 0.50673294067382813 0.25677827316394541 +3870 6 5.86107063 0.13892936706542969 0.019301369033200899 +3872 4 5.1494236 1.1494235992431641 1.3211746104971098 +3875 7 5.99542236 1.00457763671875 1.0091762281954288 +3876 5 5.434084 0.43408393859863281 0.18842886574930162 +3886 6 6.69179535 0.69179534912109375 0.47858080506557599 +3888 6 5.799838 0.20016193389892578 0.040064799782157934 +3889 6 5.704214 0.29578590393066406 0.08748930096408003 +3891 5 5.775384 0.77538394927978516 0.60122026880071644 +3893 5 4.805878 0.1941218376159668 0.037683287839399782 +3894 6 6.364979 0.36497879028320313 0.13320951735659037 +3897 6 5.863347 0.13665294647216797 0.018674027779525204 +3900 5 4.805878 0.1941218376159668 0.037683287839399782 +3903 6 6.1915493 0.19154930114746094 0.03669113477008068 +3904 7 6.72974825 0.27025175094604492 0.073036008889403092 +3907 7 6.973695 0.026305198669433594 0.00069196347703837091 +3912 7 7.129527 0.12952709197998047 0.016777267556790321 +3916 6 6.510377 0.51037693023681641 0.26048461091795616 +3918 7 6.473529 0.52647113800048828 0.27717185914752918 +3919 6 6.34661436 0.34661436080932617 0.12014151511925775 +3921 5 5.35047245 0.35047245025634766 0.12283093838868808 +3924 5 5.19889069 0.19889068603515625 0.039557504991535097 +3929 5 5.176083 0.17608308792114258 0.031005253851844827 +3934 6 5.984907 0.015092849731445313 0.00022779411301598884 +3935 5 5.36477 0.36476993560791016 0.13305710592339892 +3938 6 6.098598 0.098598003387451172 0.0097215662719918328 +3939 6 6.2004323 0.20043230056762695 0.040173107110831552 +3948 5 5.643932 0.64393186569213867 0.41464824765375852 +3955 6 6.22030973 0.22030973434448242 0.048536379046936418 +3957 5 6.63103867 1.6310386657714844 2.6602871292416239 +3958 6 5.819886 0.18011379241943359 0.032440978219710814 +3961 5 5.08412075 0.084120750427246094 0.0070763006524430239 +3964 5 5.15813351 0.15813350677490234 0.025006205964928085 +3966 6 5.739699 0.26030111312866211 0.06775666949602055 +3968 6 5.160427 0.83957290649414063 0.704882665319019 +3969 6 6.30193424 0.30193424224853516 0.091164286642197112 +3971 6 6.30193424 0.30193424224853516 0.091164286642197112 +3972 6 5.221729 0.77827119827270508 0.60570605806083222 +3974 6 5.160427 0.83957290649414063 0.704882665319019 +3975 7 6.56129646 0.43870353698730469 0.19246079336517141 +3976 7 7.03108168 0.031081676483154297 0.00096607061300346686 +3977 6 6.7676506 0.76765060424804688 0.58928745020239148 +3979 6 6.005453 0.0054531097412109375 2.9736405849689618E-05 +3980 5 5.800408 0.80040788650512695 0.64065278477960419 +3981 7 6.6836977 0.31630229949951172 0.10004714466867881 +3983 6 5.8931303 0.10686969757080078 0.011421132258874422 +3984 7 7.03108168 0.031081676483154297 0.00096607061300346686 +3986 6 5.96196938 0.038030624389648438 0.0014463283914665226 +3987 6 5.75529051 0.24470949172973633 0.059882735342625892 +3988 6 5.97655 0.023449897766113281 0.00054989770524116466 +3989 6 5.96196938 0.038030624389648438 0.0014463283914665226 +3991 5 5.94195461 0.94195461273193359 0.88727849244696699 +3992 7 5.93896532 1.0610346794128418 1.125794590916712 +3998 6 5.95320749 0.046792507171630859 0.0021895387274071254 +3999 6 5.95320749 0.046792507171630859 0.0021895387274071254 +4000 6 5.95320749 0.046792507171630859 0.0021895387274071254 +4001 5 5.302957 0.30295705795288086 0.091782978963465212 +4005 6 6.513918 0.51391792297363281 0.26411163155353279 +4007 5 5.302957 0.30295705795288086 0.091782978963465212 +4008 6 5.57442427 0.42557573318481445 0.18111470467579238 +4012 6 5.95320749 0.046792507171630859 0.0021895387274071254 +4013 6 5.14580154 0.85419845581054688 0.7296550019091228 +4016 5 4.962957 0.037043094635009766 0.0013721908601382893 +4020 4 4.688758 0.68875789642333984 0.47438743988550414 +4023 6 6.234725 0.23472499847412109 0.05509582490867615 +4026 6 6.234725 0.23472499847412109 0.05509582490867615 +4028 6 6.42392159 0.42392158508300781 0.17970951029928983 +4030 5 5.791537 0.79153680801391602 0.62653051844085894 +4036 5 5.21523428 0.21523427963256836 0.046325795128950631 +4038 5 5.08173847 0.081738471984863281 0.0066811778024202795 +4040 5 5.61071 0.61071014404296875 0.37296688003698364 +4041 5 5.223783 0.22378301620483398 0.05007883834173299 +4042 7 6.82277 0.17722988128662109 0.031410430820869806 +4045 7 6.82277 0.17722988128662109 0.031410430820869806 +4046 7 6.9875083 0.012491703033447266 0.00015604264467583562 +4048 6 6.15472126 0.15472126007080078 0.023938668317896372 +4057 6 6.28539753 0.28539752960205078 0.081451749902953452 +4058 6 6.15472126 0.15472126007080078 0.023938668317896372 +4060 5 4.857431 0.14256906509399414 0.020325938321775538 +4061 5 4.857431 0.14256906509399414 0.020325938321775538 +4062 6 6.06900644 0.069006443023681641 0.0047618891787806206 +4063 5 5.51296663 0.51296663284301758 0.2631347664103032 +4065 8 6.8692975 1.1307024955749512 1.2784881334994225 +4067 5 5.12521124 0.12521123886108398 0.015677854337127428 +4068 6 6.401434 0.40143394470214844 0.16114921195912757 +4069 6 5.72744131 0.27255868911743164 0.074288239013412749 +4072 7 6.0370245 0.96297550201416016 0.92732181747942377 +4073 5 4.602127 0.3978729248046875 0.15830286429263651 +4074 4 4.94903946 0.94903945922851563 0.90067589517275337 +4076 5 5.611673 0.61167287826538086 0.37414371000545543 +4077 6 6.1862545 0.18625450134277344 0.034690739270445192 +4079 6 5.8900733 0.10992670059204102 0.012083879503052231 +4080 6 5.72423 0.27577018737792969 0.07604919624645845 +4081 6 5.674435 0.32556486129760742 0.10599247891173036 +4083 5 5.2860117 0.28601169586181641 0.081802690169752168 +4084 8 5.7264595 2.2735404968261719 5.1689863907085964 +4089 6 5.294126 0.70587396621704102 0.49825805618297636 +4090 6 5.23996973 0.76003026962280273 0.57764601074291022 +4092 6 5.294522 0.70547819137573242 0.49769947850677454 +4093 6 4.98445845 1.0155415534973145 1.0313246468797388 +4095 6 4.98445845 1.0155415534973145 1.0313246468797388 +4098 5 6.04345465 1.043454647064209 1.0887976004798929 +4104 7 6.358297 0.64170312881469727 0.41178290553057195 +4106 5 5.692534 0.69253396987915039 0.47960329943657598 +4110 5 5.68967056 0.68967056274414063 0.47564548511581961 +4113 6 6.400872 0.40087223052978516 0.16069854520992521 +4114 6 5.801262 0.19873809814453125 0.039496831654105335 +4115 6 5.96592236 0.034077644348144531 0.0011612858443186269 +4116 6 5.15404654 0.84595346450805664 0.71563726411318385 +4117 6 5.15404654 0.84595346450805664 0.71563726411318385 +4118 8 6.34038639 1.6596136093139648 2.7543173322201255 +4121 6 5.723781 0.27621889114379883 0.076296875824709787 +4123 6 6.31618643 0.31618642807006836 0.099973857295708513 +4124 7 6.58742 0.41258001327514648 0.17022226735412005 +4127 5 5.39415359 0.39415359497070313 0.15535705642832909 +4129 7 6.79277468 0.20722532272338867 0.042942334377812585 +4130 6 6.04917336 0.049173355102539063 0.0024180188520404045 +4135 5 6.357899 1.3578991889953613 1.84389020747426 +4142 6 6.02567 0.025670051574707031 0.00065895154784811893 +4144 6 5.75873327 0.24126672744750977 0.058209633773230962 +4145 6 5.731949 0.2680511474609375 0.07185141765512526 +4146 7 5.82673454 1.1732654571533203 1.3765518329491897 +4148 6 5.90310144 0.096898555755615234 0.0093893301075240743 +4153 5 5.16035843 0.16035842895507813 0.025714825736940838 +4156 5 5.33752441 0.3375244140625 0.11392273008823395 +4157 7 7.163793 0.16379308700561523 0.026828175350829042 +4158 7 7.163793 0.16379308700561523 0.026828175350829042 +4161 7 7.163793 0.16379308700561523 0.026828175350829042 +4164 5 5.70770454 0.70770454406738281 0.50084572169362218 +4167 8 6.47032166 1.5296783447265625 2.3399158383253962 +4172 6 5.80711365 0.1928863525390625 0.037205144995823503 +4173 5 5.48750067 0.48750066757202148 0.2376569008831666 +4175 7 6.18734026 0.81265974044799805 0.66041585374500755 +4176 6 6.30238962 0.30238962173461914 0.091439483332806049 +4182 6 5.118956 0.88104391098022461 0.77623837307532995 +4183 7 6.74477 0.25522994995117188 0.0651423273520777 +4185 5 5.45041275 0.45041275024414063 0.2028716455824906 +4190 6 5.78829861 0.21170139312744141 0.044817479852099495 +4191 5 5.714152 0.71415185928344727 0.51001287811800466 +4192 6 5.66603136 0.3339686393737793 0.11153505208517345 +4193 6 5.9803896 0.019610404968261719 0.0003845679830192239 +4194 6 5.66603136 0.3339686393737793 0.11153505208517345 +4197 5 5.455963 0.455963134765625 0.20790238026529551 +4198 5 5.106357 0.10635709762573242 0.011311832215369577 +4200 6 5.97465658 0.025343418121337891 0.00064228884207295778 +4201 6 6.104894 0.10489416122436523 0.011002785058963127 +4202 6 6.57342958 0.57342958450317383 0.32882148838348257 +4204 6 6.07713747 0.077137470245361328 0.0059501893158540042 +4209 6 6.687663 0.68766307830810547 0.47288050926817959 +4214 5 5.250823 0.25082302093505859 0.062912187830988842 +4216 5 5.250823 0.25082302093505859 0.062912187830988842 +4217 4 4.716484 0.71648406982421875 0.51334942231187597 +4219 5 5.250823 0.25082302093505859 0.062912187830988842 +4220 6 5.991435 0.0085649490356445313 7.3358351983188186E-05 +4224 7 6.574186 0.42581415176391602 0.1813176918424233 +4226 7 5.74867153 1.2513284683227539 1.5658229356349693 +4232 6 6.462127 0.4621272087097168 0.21356155702983415 +4234 6 5.617531 0.38246917724609375 0.14628267154330388 +4238 5 5.304575 0.30457496643066406 0.092765910176240141 +4239 7 6.4709487 0.52905130386352539 0.27989528211969628 +4242 7 6.803386 0.19661378860473633 0.038656981869507945 +4243 6 6.294727 0.29472684860229492 0.086863915287040072 +4245 5 5.304516 0.30451583862304688 0.092729895972297527 +4246 6 6.62987375 0.62987375259399414 0.39674094420684014 +4247 6 5.315835 0.68416500091552734 0.46808174847774353 +4248 6 5.47403669 0.52596330642700195 0.27663739970762435 +4250 6 5.65320539 0.34679460525512695 0.12026649823405933 +4252 6 5.65320539 0.34679460525512695 0.12026649823405933 +4255 5 5.06073236 0.060732364654541016 0.0036884201165321429 +4258 6 5.836208 0.16379213333129883 0.026827862941217973 +4259 6 6.598309 0.59830904006958008 0.35797370742898238 +4264 6 6.344581 0.34458112716674805 0.11873615319950659 +4265 6 5.87048626 0.12951374053955078 0.016773808988546079 +4267 7 6.85002375 0.14997625350952148 0.022492876616752255 +4269 5 5.29990435 0.29990434646606445 0.089942617029237226 +4270 6 5.849698 0.15030193328857422 0.022590671150283015 +4273 6 5.85590124 0.14409875869750977 0.020764452258163146 +4276 7 7.51885366 0.51885366439819336 0.26920912505943306 +4277 5 5.975496 0.97549581527709961 0.95159208562313324 +4280 6 5.85590124 0.14409875869750977 0.020764452258163146 +4282 5 5.540368 0.54036808013916016 0.29199766203328181 +4283 6 6.06771231 0.067712306976318359 0.004584956516055172 +4284 6 6.06771231 0.067712306976318359 0.004584956516055172 +4285 6 6.06771231 0.067712306976318359 0.004584956516055172 +4286 6 6.06771231 0.067712306976318359 0.004584956516055172 +4287 5 5.364779 0.36477899551391602 0.13306371556814156 +4289 6 5.39277 0.60723018646240234 0.36872849935116392 +4290 5 5.540368 0.54036808013916016 0.29199766203328181 +4293 5 5.352377 0.35237693786621094 0.12416950633996748 +4294 5 6.12349844 1.1234984397888184 1.2622487442079091 +4296 6 6.119482 0.11948204040527344 0.014275957979407394 +4298 6 6.53625965 0.53625965118408203 0.28757441348807333 +4299 6 5.33871174 0.66128826141357422 0.43730216468338767 +4302 6 5.57782555 0.42217445373535156 0.1782312693867425 +4303 6 6.18824339 0.18824338912963867 0.035435573551012567 +4305 6 6.193798 0.19379806518554688 0.037557690069661476 +4309 6 6.52417946 0.52417945861816406 0.27476410483723157 +4312 6 6.18824339 0.18824338912963867 0.035435573551012567 +4313 6 6.25637245 0.25637245178222656 0.065726834032830084 +4316 5 4.7827754 0.2172245979309082 0.047186525946244728 +4317 7 6.98226547 0.017734527587890625 0.00031451346876565367 +4320 5 5.331039 0.3310389518737793 0.10958678765769037 +4321 6 5.965597 0.034402847290039063 0.0011835559016617481 +4326 5 5.196533 0.196533203125 0.03862529993057251 +4328 5 5.81707525 0.81707525253295898 0.6676119683017987 +4329 5 5.66501427 0.66501426696777344 0.44224397527068504 +4330 5 5.36759853 0.36759853363037109 0.13512868192719907 +4332 8 7.563051 0.43694877624511719 0.19092423306210549 +4333 8 7.563051 0.43694877624511719 0.19092423306210549 +4334 8 7.563051 0.43694877624511719 0.19092423306210549 +4335 8 7.563051 0.43694877624511719 0.19092423306210549 +4337 8 7.563051 0.43694877624511719 0.19092423306210549 +4340 8 7.563051 0.43694877624511719 0.19092423306210549 +4341 6 5.349428 0.65057182312011719 0.42324369703783304 +4343 6 6.26234961 0.26234960556030273 0.068827315537646427 +4349 5 4.904963 0.095036983489990234 0.0090320282308766764 +4351 6 6.69831133 0.69831132888793945 0.48763871205323994 +4352 5 5.71307564 0.71307563781738281 0.50847686524866731 +4353 6 6.03289175 0.032891750335693359 0.0010818672401455842 +4354 6 6.4404335 0.44043350219726563 0.19398166985774878 +4355 6 6.69831133 0.69831132888793945 0.48763871205323994 +4358 5 5.545092 0.54509210586547852 0.29712540387686204 +4361 6 6.434056 0.43405580520629883 0.18840444203328843 +4362 6 6.71373272 0.71373271942138672 0.50941439477264794 +4363 5 5.230393 0.2303929328918457 0.053080903526506518 +4365 5 5.13981152 0.13981151580810547 0.019547259952560125 +4366 6 6.799898 0.79989814758300781 0.63983704650672735 +4369 6 5.830846 0.16915416717529297 0.028613132272766961 +4370 5 5.41643667 0.41643667221069336 0.17341950196191647 +4372 6 5.703184 0.29681587219238281 0.088099661985324929 +4375 6 5.947179 0.052821159362792969 0.0027900748764295713 +4376 5 5.03130627 0.031306266784667969 0.00098008233999280492 +4378 5 4.92310953 0.076890468597412109 0.0059121441611296177 +4380 6 6.52618837 0.52618837356567383 0.27687420447568911 +4382 6 5.97180367 0.028196334838867188 0.0007950332983455155 +4386 6 6.30707 0.30706977844238281 0.094291848832654068 +4388 6 5.86662054 0.13337945938110352 0.017790080184795443 +4393 6 5.38777351 0.61222648620605469 0.37482127041221247 +4397 5 5.297247 0.29724693298339844 0.088355739168036962 +4398 5 5.297247 0.29724693298339844 0.088355739168036962 +4399 5 5.61268663 0.6126866340637207 0.3753849115603316 +4400 5 5.297247 0.29724693298339844 0.088355739168036962 +4403 5 5.609075 0.60907506942749023 0.37097244019810205 +4406 7 6.93056154 0.069438457489013672 0.0048216993784535589 +4408 5 5.07466841 0.074668407440185547 0.0055753710696535563 +4410 5 5.34693146 0.34693145751953125 0.12036143621662632 +4411 7 6.754829 0.24517107009887695 0.060108853613428437 +4413 7 6.754829 0.24517107009887695 0.060108853613428437 +4414 7 6.689015 0.31098508834838867 0.096711725175055108 +4415 5 5.03584576 0.035845756530761719 0.0012849182612626464 +4417 6 5.767893 0.23210716247558594 0.053873734872468049 +4418 6 6.090339 0.090339183807373047 0.0081611681309823325 +4419 6 6.090339 0.090339183807373047 0.0081611681309823325 +4421 6 6.090339 0.090339183807373047 0.0081611681309823325 +4422 6 5.767893 0.23210716247558594 0.053873734872468049 +4426 6 5.79476738 0.20523262023925781 0.042120428410271415 +4428 6 6.550341 0.55034112930297852 0.30287535860247772 +4431 6 6.55115938 0.55115938186645508 0.30377666421941285 +4436 6 6.38329029 0.38329029083251953 0.14691144704647741 +4437 6 5.74162626 0.25837373733520508 0.066756988144561547 +4439 5 5.159874 0.15987396240234375 0.025559683854226023 +4440 5 5.046295 0.046295166015625 0.0021432423964142799 +4442 5 5.046295 0.046295166015625 0.0021432423964142799 +4443 5 5.159874 0.15987396240234375 0.025559683854226023 +4445 6 6.25906467 0.25906467437744141 0.067114505510289746 +4446 6 7.02105 1.021049976348877 1.0425430542020422 +4447 6 6.868141 0.86814117431640625 0.75366909854346886 +4448 5 5.758686 0.75868606567382813 0.57560454624763224 +4449 6 5.47040653 0.52959346771240234 0.28046924104364734 +4453 6 6.868141 0.86814117431640625 0.75366909854346886 +4455 5 5.494454 0.49445390701293945 0.24448466616036058 +4456 5 5.494454 0.49445390701293945 0.24448466616036058 +4457 5 5.494454 0.49445390701293945 0.24448466616036058 +4459 5 5.78956127 0.78956127166748047 0.6234070017171689 +4460 6 6.16204548 0.16204547882080078 0.026258737206262595 +4461 6 5.98530626 0.014693737030029297 0.00021590590790765418 +4462 6 6.9270153 0.92701530456542969 0.85935737489853636 +4465 5 5.23201847 0.23201847076416016 0.053832570775739441 +4466 5 6.13223457 1.1322345733642578 1.2819551291213429 +4470 6 6.18318462 0.18318462371826172 0.033556606366801134 +4472 5 6.27475071 1.2747507095336914 1.6249893714566497 +4473 5 5.007015 0.007015228271484375 4.9213427701033652E-05 +4475 6 6.679543 0.67954301834106445 0.46177871377608426 +4478 5 5.228984 0.22898387908935547 0.052433616882808565 +4481 5 5.228984 0.22898387908935547 0.052433616882808565 +4482 6 6.764298 0.7642979621887207 0.58415137500583114 +4486 6 5.52998972 0.47001028060913086 0.22090966387827393 +4489 6 6.793877 0.79387712478637695 0.63024088925908472 +4491 6 6.86674261 0.86674261093139648 0.75124275360417414 +4493 6 5.470741 0.52925920486450195 0.28011530593380485 +4494 6 5.330176 0.66982412338256836 0.44866435626522616 +4496 6 5.330176 0.66982412338256836 0.44866435626522616 +4497 5 5.06463528 0.064635276794433594 0.0041777190062930458 +4498 5 5.89736652 0.89736652374267578 0.8052666779340143 +4499 6 6.21874046 0.21874046325683594 0.047847390265815193 +4503 7 6.168795 0.83120489120483398 0.6909015711628399 +4504 5 5.46944 0.46943998336791992 0.22037389798447293 +4507 5 6.61253 1.6125302314758301 2.6002537474234941 +4509 5 5.41654444 0.41654443740844727 0.17350926833591984 +4511 6 6.10758734 0.10758733749389648 0.011575035189025584 +4512 6 6.10758734 0.10758733749389648 0.011575035189025584 +4514 5 4.692554 0.30744600296020508 0.09452304473620643 +4516 6 6.863519 0.86351919174194336 0.74566539450665914 +4517 6 5.75581551 0.24418449401855469 0.05962606711909757 +4520 5 5.19558239 0.19558238983154297 0.038252471212217642 +4521 5 5.27875662 0.27875661849975586 0.077705252357418431 +4522 6 5.6984477 0.30155229568481445 0.090933787032781765 +4526 6 6.114628 0.11462783813476563 0.013139541275450028 +4527 6 5.75581551 0.24418449401855469 0.05962606711909757 +4528 6 4.93128061 1.0687193870544434 1.1421611282660251 +4530 6 5.38715839 0.61284160614013672 0.37557483421642246 +4531 6 5.38715839 0.61284160614013672 0.37557483421642246 +4532 6 6.157311 0.15731096267700195 0.024746738978365102 +4533 5 5.603791 0.60379123687744141 0.36456385772999056 +4534 6 6.32857943 0.32857942581176758 0.10796443906679087 +4535 6 5.538044 0.46195602416992188 0.21340336826688144 +4536 6 5.38715839 0.61284160614013672 0.37557483421642246 +4542 5 6.22740364 1.2274036407470703 1.5065196973191632 +4543 5 6.22740364 1.2274036407470703 1.5065196973191632 +4544 6 6.4345727 0.43457269668579102 0.18885342870476052 +4549 5 6.22740364 1.2274036407470703 1.5065196973191632 +4551 6 5.8944006 0.10559940338134766 0.011151233994496579 +4552 6 6.49616 0.49616003036499023 0.24617477573178803 +4554 6 6.08486366 0.084863662719726563 0.007201841250207508 +4556 5 6.536952 1.536952018737793 2.3622215079021771 +4557 6 5.29681063 0.70318937301635742 0.49447529432313786 +4558 6 6.41869736 0.41869735717773438 0.17530747690761928 +4561 6 6.520865 0.52086496353149414 0.27130031023466472 +4564 7 6.22001362 0.77998638153076172 0.60837875537345099 +4565 5 6.13613462 1.1361346244812012 1.29080188494504 +4566 5 6.5219326 1.5219326019287109 2.3162788448134961 +4567 5 6.13613462 1.1361346244812012 1.29080188494504 +4568 6 6.322889 0.32288885116577148 0.10425721020715173 +4570 6 6.31788635 0.3178863525390625 0.10105173313058913 +4572 7 6.277157 0.72284317016601563 0.52250224865565542 +4573 6 6.44510651 0.44510650634765625 0.19811980199301615 +4577 6 5.970567 0.029432773590087891 0.00086628816120537522 +4579 6 6.22496557 0.22496557235717773 0.050609508745992571 +4580 6 6.645353 0.64535284042358398 0.41648028864278785 +4583 6 5.402732 0.59726810455322266 0.35672918871659931 +4584 6 6.00640726 0.0064072608947753906 4.1052992173717939E-05 +4585 6 6.381577 0.3815770149230957 0.1456010183176204 +4586 6 6.00690842 0.006908416748046875 4.772622196469456E-05 +4587 6 6.292461 0.29246091842651367 0.085533388806879884 +4590 6 6.12023926 0.1202392578125 0.014457479119300842 +4593 6 5.970617 0.029383182525634766 0.00086337141533476824 +4596 6 6.02695847 0.026958465576171875 0.00072675886622164398 +4597 6 4.66897345 1.331026554107666 1.7716316877397276 +4598 6 5.970617 0.029383182525634766 0.00086337141533476824 +4599 7 6.31390667 0.68609333038330078 0.47072405799644912 +4600 6 5.592253 0.40774679183959961 0.16625744625548577 +4602 6 5.68200874 0.31799125671386719 0.10111843934646458 +4605 6 6.718238 0.71823787689208984 0.51586564780245681 +4606 5 6.014402 1.014401912689209 1.0290112404675256 +4607 6 6.366955 0.36695480346679688 0.13465582778735552 +4608 7 6.719237 0.28076314926147461 0.07882794598322107 +4609 4 3.58334613 0.41665387153625488 0.17360044866614999 +4613 5 5.56812954 0.56812953948974609 0.32277117364083097 +4615 7 6.48936749 0.51063251495361328 0.26074556532785209 +4617 7 6.89289141 0.10710859298706055 0.011472250691667796 +4619 5 4.744896 0.25510406494140625 0.065078083949629217 +4621 7 5.60056925 1.3994307518005371 1.9584064290850165 +4623 6 6.641723 0.6417231559753418 0.41180860891495286 +4624 6 6.91729259 0.91729259490966797 0.84142570467611222 +4625 5 5.395468 0.39546823501586914 0.15639512490656671 +4630 7 5.665024 1.3349761962890625 1.7821614446584135 +4632 6 6.213084 0.21308422088623047 0.045404885190691857 +4635 6 5.715031 0.28496885299682617 0.081207247178326725 +4636 5 5.216097 0.21609687805175781 0.046697860703716287 +4639 6 5.123841 0.8761591911315918 0.76765492820436521 +4641 6 6.089448 0.089447975158691406 0.0080009402599898749 +4642 7 6.574551 0.42544889450073242 0.18100676183189535 +4644 6 6.24152946 0.24152946472167969 0.058336482328741113 +4645 7 6.48060846 0.51939153671264648 0.2697675684087244 +4647 7 6.13382149 0.86617851257324219 0.75026521564359427 +4648 5 4.853619 0.14638090133666992 0.021427368276135894 +4650 5 4.56051 0.43948984146118164 0.19315132074757457 +4653 7 6.845636 0.15436410903930664 0.02382827815949895 +4654 7 6.73595858 0.26404142379760742 0.069717873481067727 +4655 7 6.73595858 0.26404142379760742 0.069717873481067727 +4658 6 6.96779537 0.96779537200927734 0.93662788208257552 +4659 6 5.803561 0.19643878936767578 0.038588197968238092 +4660 6 6.200283 0.20028305053710938 0.040113300332450308 +4662 6 6.893102 0.89310216903686523 0.7976314843383534 +4663 7 6.494305 0.50569486618041992 0.25572729768123281 +4665 6 6.893102 0.89310216903686523 0.7976314843383534 +4666 5 5.05701542 0.057015419006347656 0.0032507580044693896 +4670 6 5.604501 0.39549922943115234 0.15641964048063528 +4671 5 5.28037834 0.28037834167480469 0.078612014480313519 +4672 5 5.28037834 0.28037834167480469 0.078612014480313519 +4675 6 5.96652365 0.033476352691650391 0.0011206661895357684 +4676 6 5.651302 0.34869813919067383 0.12159039227503854 +4677 7 6.623289 0.37671089172363281 0.1419110959432146 +4680 4 4.31187439 0.3118743896484375 0.09726563491858542 +4681 6 6.13964272 0.13964271545410156 0.019500087979395175 +4683 6 5.97821426 0.021785736083984375 0.00047461829672101885 +4687 6 5.80405569 0.19594430923461914 0.038394172321432052 +4689 6 5.80405569 0.19594430923461914 0.038394172321432052 +4690 6 5.80405569 0.19594430923461914 0.038394172321432052 +4691 7 6.169539 0.83046102523803711 0.68966551443941171 +4696 6 6.34956169 0.34956169128417969 0.12219337601345615 +4697 7 6.844913 0.15508699417114258 0.024051975761040012 +4701 6 5.30037546 0.69962453842163086 0.48947449476168003 +4706 7 6.419825 0.58017492294311523 0.3366029412120497 +4707 6 6.145443 0.14544296264648438 0.021153655383386649 +4708 6 6.09184551 0.091845512390136719 0.0084355981462067575 +4712 6 5.99468327 0.0053167343139648438 2.8267663765291218E-05 +4713 6 6.242741 0.24274110794067383 0.058923245484265863 +4715 6 5.57592058 0.42407941818237305 0.17984335292590004 +4716 6 5.64552069 0.35447931289672852 0.12565558327173676 +4718 6 5.69662333 0.30337667465209961 0.092037406722965898 +4719 6 5.57592058 0.42407941818237305 0.17984335292590004 +4722 6 5.76592445 0.23407554626464844 0.054791361359093571 +4723 6 5.09452 0.90547990798950195 0.81989386377267692 +4725 6 5.77877331 0.22122669219970703 0.048941249341623916 +4727 6 5.76592445 0.23407554626464844 0.054791361359093571 +4729 5 5.04089 0.040890216827392578 0.0016720098321911792 +4730 5 5.79183769 0.79183769226074219 0.62700693088481785 +4733 6 5.38009 0.61990976333618164 0.38428811467952073 +4734 6 6.050664 0.050663948059082031 0.0025668356329333619 +4735 6 5.92308235 0.076917648315429688 0.0059163246223761234 +4737 7 6.36828756 0.63171243667602539 0.39906060265116139 +4738 6 6.63842154 0.63842153549194336 0.40758205697989069 +4743 5 5.5243535 0.5243535041809082 0.27494659734679772 +4746 6 5.203251 0.79674911499023438 0.63480915223772172 +4748 5 5.32940531 0.32940530776977539 0.10850785678690045 +4752 7 6.69350529 0.30649471282958984 0.093939008992492745 +4754 6 5.914886 0.085114002227783203 0.0072443933752310841 +4756 7 6.854581 0.14541912078857422 0.021146720690921939 +4757 7 6.854581 0.14541912078857422 0.021146720690921939 +4758 6 6.226448 0.22644805908203125 0.051278723462019116 +4759 6 5.644577 0.3554229736328125 0.12632549018599093 +4762 7 6.60214663 0.39785337448120117 0.1582873075860789 +4764 6 6.12550163 0.12550163269042969 0.01575065980796353 +4766 8 6.66040468 1.3395953178405762 1.7945156155803943 +4770 6 5.706313 0.29368686676025391 0.086251975707455131 +4771 6 5.706313 0.29368686676025391 0.086251975707455131 +4772 5 5.219483 0.2194828987121582 0.048172742827091497 +4773 7 6.10453272 0.89546728134155273 0.80186165195323156 +4774 4 5.47965336 1.4796533584594727 2.1893740612003967 +4775 6 5.44863558 0.55136442184448242 0.30400272567590036 +4776 6 5.44695759 0.55304241180419922 0.30585590925420547 +4783 6 5.37171173 0.62828826904296875 0.39474614901700988 +4784 5 5.42426443 0.42426443099975586 0.1800003074115466 +4785 7 6.221619 0.7783808708190918 0.60587678005708767 +4789 6 5.49157 0.50843000411987305 0.25850106908933412 +4791 6 5.37171173 0.62828826904296875 0.39474614901700988 +4793 6 5.165858 0.83414220809936523 0.69579322333288474 +4794 5 5.16718 0.16718006134033203 0.027949172909757181 +4796 7 6.41808653 0.58191347122192383 0.33862328798954877 +4797 6 6.462242 0.46224212646484375 0.2136677834787406 +4800 7 5.83382559 1.1661744117736816 1.3599627586756924 +4801 7 6.41808653 0.58191347122192383 0.33862328798954877 +4802 8 6.6250205 1.3749794960021973 1.8905686144264564 +4803 7 6.71922445 0.28077554702758789 0.078834907808641219 +4804 4 5.554571 1.5545711517333984 2.4166914658017049 +4807 6 5.99386072 0.0061392784118652344 3.7690739418394514E-05 +4808 5 5.56873131 0.56873130798339844 0.32345530068050721 +4811 6 6.37171 0.37170982360839844 0.13816819296698668 +4812 7 6.333003 0.66699695587158203 0.44488493914195715 +4813 5 5.160439 0.16043901443481445 0.0257406773528146 +4815 7 5.545589 1.4544110298156738 2.1153114436494889 +4816 6 5.28646374 0.71353626251220703 0.50913399791988923 +4817 6 6.44789171 0.4478917121887207 0.20060698584734382 +4822 6 6.01049948 0.010499477386474609 0.00011023902538909169 +4826 6 6.35310268 0.35310268402099609 0.12468150546283141 +4828 5 5.462024 0.46202421188354492 0.21346637236661081 +4829 7 6.69648361 0.30351638793945313 0.092122197747812606 +4830 6 6.00627041 0.0062704086303710938 3.9318024391832296E-05 +4832 5 5.865965 0.86596488952636719 0.74989518989241333 +4834 7 6.36888 0.63112020492553711 0.39831271306525196 +4835 6 6.0981555 0.098155498504638672 0.0096345018866941246 +4836 5 5.09540653 0.095406532287597656 0.0091024064031444141 +4837 6 6.83529234 0.83529233932495117 0.69771329213494937 +4839 4 4.56506252 0.56506252288818359 0.31929565477275901 +4841 6 6.10761261 0.10761260986328125 0.011580473801586777 +4844 6 6.14371252 0.14371252059936523 0.020653288577022977 +4845 5 4.975312 0.024687767028808594 0.0006094858408687287 +4846 6 6.43904543 0.43904542922973633 0.19276088892752341 +4849 5 5.26026344 0.26026344299316406 0.06773705975865596 +4850 6 6.110013 0.11001300811767578 0.012102861955099797 +4851 5 5.26026344 0.26026344299316406 0.06773705975865596 +4852 5 6.32657051 1.3265705108642578 1.759789320294658 +4853 5 6.24574852 1.2457485198974609 1.5518893748267146 +4854 6 6.420056 0.42005586624145508 0.1764469307638592 +4856 6 5.965333 0.034667015075683594 0.0012018019342576736 +4859 6 6.22630453 0.22630453109741211 0.051213740795219564 +4860 6 5.83978939 0.16021060943603516 0.025667439375865797 +4862 6 6.11810541 0.11810541152954102 0.01394888823256224 +4866 6 5.978206 0.021793842315673828 0.00047497156288045517 +4867 6 4.43492126 1.5650787353515625 2.4494714478496462 +4869 6 5.88256931 0.11743068695068359 0.01378996623770945 +4871 6 6.876634 0.87663412094116211 0.76848738199828404 +4872 5 5.71218348 0.71218347549438477 0.50720530276726095 +4876 7 6.576274 0.42372608184814453 0.17954379243838048 +4878 4 4.537464 0.53746414184570313 0.28886770376993809 +4879 6 5.50284052 0.49715948104858398 0.24716754959649734 +4880 6 5.50284052 0.49715948104858398 0.24716754959649734 +4881 6 5.90926361 0.09073638916015625 0.0082330923178233206 +4882 5 5.77714348 0.77714347839355469 0.6039519860096334 +4883 6 6.174638 0.17463779449462891 0.030498359265948238 +4886 7 6.898373 0.10162687301635742 0.010328021319082836 +4887 7 4.873293 2.1267070770263672 4.5228829914740345 +4888 5 5.89248848 0.89248847961425781 0.79653568624416948 +4889 6 5.90926361 0.09073638916015625 0.0082330923178233206 +4894 5 5.370122 0.37012195587158203 0.13699026221820532 +4896 7 6.225442 0.77455806732177734 0.59994019965324696 diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine-out.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine-out.txt new file mode 100644 index 0000000000..56988214d4 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine-out.txt @@ -0,0 +1,32 @@ +maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.402080 +L2(avg): 0.272274 +RMS(avg): 0.521799 +Loss-fn(avg): 0.272274 +R Squared: 0.652798 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.402080 (0.0000) +L2(avg): 0.272274 (0.0000) +RMS(avg): 0.521799 (0.0000) +Loss-fn(avg): 0.272274 (0.0000) +R Squared: 0.652798 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l2: 0.272273893168108 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine-rp.txt new file mode 100644 index 0000000000..981a680d8e --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /booster /v /nt Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.40208 0.272274 0.521799 0.272274 0.652798 50 0.2 20 10 gbdt{l2=0.2 l1=0.2} + 1 LightGBMR %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/booster:gbdt{l2=0.2 l1=0.2};/v:+;/nt:1 + diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine.txt new file mode 100644 index 0000000000..1bbc59f006 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMReg-TrainTest-wine.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +0 6 5.75468349 0.24531650543212891 0.060180187837431731 +1 6 5.428862 0.57113790512084961 0.32619850666583261 +2 6 5.565058 0.43494176864624023 0.18917434211311956 +3 6 5.806712 0.19328784942626953 0.037360192735832243 +4 6 5.806712 0.19328784942626953 0.037360192735832243 +5 6 5.565058 0.43494176864624023 0.18917434211311956 +6 6 5.374303 0.62569713592529297 0.39149690590511455 +7 6 5.75468349 0.24531650543212891 0.060180187837431731 +8 6 5.428862 0.57113790512084961 0.32619850666583261 +9 6 5.88526535 0.11473464965820313 0.01316403983219061 +10 5 5.56626 0.56625986099243164 0.320650230171168 +11 5 5.603975 0.60397481918334961 0.36478558220755986 +12 5 5.915541 0.91554117202758789 0.83821563767764928 +13 7 6.79125071 0.20874929428100586 0.043576267862817986 +14 5 5.12093067 0.12093067169189453 0.014624227355852781 +15 7 6.61398268 0.3860173225402832 0.14900937330116903 +16 6 5.12558126 0.87441873550415039 0.76460812500067732 +17 8 7.381921 0.61807918548583984 0.38202187953083921 +18 6 5.768282 0.23171806335449219 0.053693260884756455 +19 5 5.330098 0.33009815216064453 0.10896479005987203 +20 8 7.381921 0.61807918548583984 0.38202187953083921 +21 7 6.091793 0.90820693969726563 0.82483984531427268 +22 8 6.882561 1.117438793182373 1.2486694565088783 +23 5 4.760516 0.23948383331298828 0.057352506418283156 +24 6 5.32735825 0.67264175415039063 0.45244692942651454 +25 6 5.824215 0.17578506469726563 0.030900388970621862 +26 6 6.12207937 0.12207937240600586 0.014903373167044265 +27 6 6.27089357 0.27089357376098633 0.07338332830499894 +28 6 5.47679138 0.5232086181640625 0.27374725812114775 +29 7 6.673289 0.32671117782592773 0.10674019371640497 +30 6 5.680629 0.31937122344970703 0.1019979783677627 +31 6 5.676132 0.3238677978515625 0.10489035048522055 +32 6 6.144576 0.14457607269287109 0.020902240795294347 +33 6 6.04860258 0.048602581024169922 0.0023622108822110022 +34 5 5.23357868 0.23357868194580078 0.05455900065953756 +35 5 5.87163448 0.87163448333740234 0.75974667254286032 +36 5 5.122443 0.12244319915771484 0.014992337019975821 +37 6 5.98563528 0.014364719390869141 0.00020634516317841189 +38 5 5.11015034 0.11015033721923828 0.01213309678951191 +39 5 5.11015034 0.11015033721923828 0.01213309678951191 +40 6 5.806291 0.19370889663696289 0.037523136636309573 +41 6 5.562098 0.43790197372436523 0.19175813859169466 +42 6 5.39396858 0.60603141784667969 0.36727407941725687 +43 6 5.786384 0.21361589431762695 0.045631750305119567 +44 6 5.781356 0.21864414215087891 0.047805260896893742 +45 7 6.03766251 0.96233749389648438 0.9260934521589661 +46 4 5.05566454 1.0556645393371582 1.1144276196139344 +47 5 5.05566454 0.055664539337158203 0.003098540939618033 +48 6 5.39396858 0.60603141784667969 0.36727407941725687 +49 5 5.97254 0.97253990173339844 0.94583386046360829 +50 6 5.861218 0.13878202438354492 0.019260450291994857 +51 7 6.28765249 0.71234750747680664 0.50743897140841909 +52 7 6.41036272 0.58963727951049805 0.3476721213885412 +53 6 6.265282 0.26528215408325195 0.070374621275050231 +54 6 5.92683554 0.073164463043212891 0.0053530386524016649 +55 6 6.08680248 0.086802482604980469 0.0075346709863879369 +56 6 6.05274343 0.052743434906005859 0.0027818699256840773 +57 6 5.7438097 0.25619029998779297 0.065633469807835354 +58 6 5.452292 0.54770803451538086 0.29998409107270163 +59 6 6.20660353 0.2066035270690918 0.042685017397388947 +60 6 5.573681 0.42631912231445313 0.18174799405096564 +61 6 5.7438097 0.25619029998779297 0.065633469807835354 +62 5 4.92492676 0.0750732421875 0.0056359916925430298 +63 6 5.452292 0.54770803451538086 0.29998409107270163 +64 6 5.91558838 0.08441162109375 0.0071253217756748199 +65 5 5.12823963 0.12823963165283203 0.016445403126454039 +66 7 6.71586752 0.28413248062133789 0.080731266544034952 +67 5 4.984102 0.015898227691650391 0.00025275364373555931 +68 8 6.74372244 1.2562775611877441 1.5782333107438262 +69 5 5.446637 0.44663715362548828 0.19948474699867802 +70 6 5.39191866 0.60808134078979492 0.36976291701671471 +71 5 5.164618 0.16461801528930664 0.027099090957790395 +72 5 4.74779 0.25221014022827148 0.063609954833964366 +73 6 5.20674467 0.79325532913208008 0.62925401719644469 +74 8 6.74372244 1.2562775611877441 1.5782333107438262 +75 5 5.446637 0.44663715362548828 0.19948474699867802 +76 7 7.25402069 0.25402069091796875 0.064526511414442211 +77 7 6.24755239 0.75244760513305664 0.56617739847047233 +78 5 5.80187654 0.80187654495239258 0.64300599334478648 +79 5 5.11330938 0.11330938339233398 0.012839016364750933 +80 6 6.300786 0.30078601837158203 0.090472228847829683 +81 6 5.94111967 0.058880329132080078 0.0034668931587020779 +82 5 5.41016674 0.41016674041748047 0.16823675494470081 +83 6 5.70397139 0.29602861404418945 0.087632940332923681 +84 5 5.188725 0.18872499465942383 0.035617123609199552 +85 6 5.39039373 0.60960626602172852 0.37161979957295443 +86 6 5.290827 0.70917320251464844 0.50292663116488256 +87 6 5.482315 0.5176849365234375 0.26799769350327551 +88 5 5.188725 0.18872499465942383 0.035617123609199552 +89 6 5.39039373 0.60960626602172852 0.37161979957295443 +90 6 5.290827 0.70917320251464844 0.50292663116488256 +91 5 5.279007 0.2790069580078125 0.077844882616773248 +92 7 6.50266075 0.49733924865722656 0.24734632825493463 +93 7 6.653836 0.34616422653198242 0.11982967173048564 +94 7 6.12829065 0.87170934677124023 0.75987718524834236 +95 6 5.79502344 0.20497655868530273 0.042015389610469356 +96 6 5.26495934 0.73504066467285156 0.54028477872270741 +97 7 5.870676 1.1293239593505859 1.2753726051632839 +98 4 4.314463 0.31446313858032227 0.098887065525786966 +99 6 5.26495934 0.73504066467285156 0.54028477872270741 +100 5 5.7749877 0.77498769760131836 0.60060593143339247 +101 5 5.58767366 0.58767366409301758 0.34536033546851286 +102 5 5.23754454 0.23754453659057617 0.056427406864031582 +103 5 5.09081936 0.090819358825683594 0.0082481559375082725 +104 5 5.7749877 0.77498769760131836 0.60060593143339247 +105 6 6.152058 0.15205812454223633 0.023121673239302254 +106 5 5.58767366 0.58767366409301758 0.34536033546851286 +107 6 5.934953 0.065046787261962891 0.0042310845331030578 +108 6 5.934953 0.065046787261962891 0.0042310845331030578 +109 5 5.43903732 0.43903732299804688 0.19275377098529134 +110 6 5.66466951 0.33533048629760742 0.11244653504058988 +111 5 5.189618 0.18961811065673828 0.035955027889031044 +112 5 5.102654 0.10265398025512695 0.010537839662219994 +113 5 5.34510136 0.34510135650634766 0.11909494626252126 +114 5 5.34510136 0.34510135650634766 0.11909494626252126 +115 4 4.26780653 0.2678065299987793 0.071720337509987075 +116 6 6.12102032 0.12102031707763672 0.01464591714557173 +117 6 6.259355 0.25935506820678711 0.067265051404547194 +118 5 5.102654 0.10265398025512695 0.010537839662219994 +119 5 5.278118 0.27811813354492188 0.077349696206510998 +120 5 5.385162 0.3851618766784668 0.14834967124647847 +121 5 5.60905361 0.60905361175537109 0.37094630199226231 +122 5 5.926923 0.92692279815673828 0.85918587374271738 +123 6 5.714049 0.28595113754272461 0.081768053061978208 +124 6 5.820791 0.17920923233032227 0.032115948952423423 +125 6 6.33170271 0.33170270919799805 0.11002668728929166 +126 5 5.804877 0.80487680435180664 0.64782667018357643 +127 7 5.94108725 1.0589127540588379 1.1212962207084729 +128 7 6.26106644 0.73893356323242188 0.54602281087136362 +129 6 6.170016 0.17001581192016602 0.028905376302873265 +130 5 5.027666 0.027666091918945313 0.00076541264206753112 +131 7 5.94108725 1.0589127540588379 1.1212962207084729 +132 5 5.46517944 0.465179443359375 0.21639191452413797 +133 5 5.532 0.53200006484985352 0.28302406900024835 +134 5 5.287642 0.28764200210571289 0.082737921375382939 +135 5 5.55317259 0.55317258834838867 0.30599991250005587 +136 6 6.024812 0.024812221527099609 0.00061564633710986527 +137 5 5.15711546 0.15711545944213867 0.024685267595714322 +138 7 6.29848 0.70151996612548828 0.49213026287270623 +139 6 6.027224 0.027224063873291016 0.00074114965377702902 +140 5 5.41884947 0.41884946823120117 0.17543487703756 +141 5 5.15711546 0.15711545944213867 0.024685267595714322 +142 6 5.97671032 0.023289680480957031 0.00054240921690507093 +143 6 5.85617161 0.14382839202880859 0.020686606353592651 +144 6 5.79136848 0.20863151550292969 0.043527109261049191 +145 6 5.877765 0.12223482131958008 0.014941351543029668 +146 6 5.749695 0.25030517578125 0.062652681022882462 +147 4 4.63994741 0.63994741439819336 0.40953269319493302 +148 7 6.415667 0.58433294296264648 0.34144498823138747 +149 6 5.506055 0.49394512176513672 0.24398178331557574 +150 7 6.524688 0.47531223297119141 0.22592171881206013 +151 6 5.790869 0.20913076400756836 0.04373567645438925 +152 6 5.506055 0.49394512176513672 0.24398178331557574 +153 5 6.085953 1.0859532356262207 1.179294429967058 +154 6 5.27088 0.72911977767944336 0.53161565020332091 +155 6 6.091402 0.091402053833007813 0.0083543354448920581 +156 6 6.091402 0.091402053833007813 0.0083543354448920581 +157 7 6.425449 0.57455110549926758 0.3301089728304305 +158 8 7.30207253 0.69792747497558594 0.48710276032579714 +159 8 7.30207253 0.69792747497558594 0.48710276032579714 +160 7 6.425449 0.57455110549926758 0.3301089728304305 +161 5 5.54679966 0.54679965972900391 0.29898986787975446 +162 5 5.46407843 0.46407842636108398 0.21536878581378005 +163 6 6.091402 0.091402053833007813 0.0083543354448920581 +164 5 5.61681652 0.61681652069091797 0.38046262019724963 +165 5 5.702333 0.70233297348022461 0.49327160563757388 +166 6 5.74394369 0.25605630874633789 0.065564833248799914 +167 7 6.678452 0.3215479850769043 0.10339310670701707 +168 5 5.23894262 0.23894262313842773 0.057093577152272701 +169 5 4.72458029 0.27541971206665039 0.075856017794876607 +170 6 6.121615 0.12161493301391602 0.01479019193197928 +171 6 6.020179 0.020178794860839844 0.00040718376203585649 +172 4 4.177219 0.17721891403198242 0.031406543490675176 +173 7 6.80681133 0.19318866729736328 0.037321861172131321 +174 5 5.562073 0.5620732307434082 0.3159263167183326 +175 6 6.20894337 0.20894336700439453 0.043657330615133105 +176 4 5.530099 1.5300989151000977 2.3412026899904959 +177 5 5.26488543 0.26488542556762695 0.070164288678142839 +178 4 4.37374353 0.37374353408813477 0.13968422927268875 +179 6 5.627479 0.37252092361450195 0.1387718385306016 +180 6 5.41738129 0.58261871337890625 0.33944456517929211 +181 5 5.03604841 0.036048412322998047 0.0012994880310088774 +182 5 5.22736263 0.22736263275146484 0.051693766771677474 +183 6 5.45467854 0.54532146453857422 0.29737549968649546 +184 5 5.25501537 0.25501537322998047 0.065032840583626239 +185 5 5.296224 0.29622411727905273 0.087748727657753989 +186 6 5.853021 0.14697885513305664 0.02160278385622405 +187 5 5.998221 0.99822092056274414 0.99644500624913235 +188 8 7.056808 0.9431920051574707 0.88961115859297024 +189 4 5.332552 1.3325519561767578 1.7756947159105039 +190 6 5.27124071 0.7287592887878418 0.531090100994561 +191 5 5.22736263 0.22736263275146484 0.051693766771677474 +192 6 6.16341448 0.16341447830200195 0.026704291718715467 +193 5 5.771303 0.77130317687988281 0.59490859066499979 +194 5 5.28241158 0.28241157531738281 0.079756297873245785 +195 6 5.40575838 0.59424161911010742 0.35312310188260199 +196 5 5.21673441 0.21673440933227539 0.046973804188610302 +197 5 5.192751 0.19275093078613281 0.037152921318920562 +198 5 5.33667469 0.33667469024658203 0.11334984705263196 +199 5 5.192751 0.19275093078613281 0.037152921318920562 +200 5 5.13898754 0.13898754119873047 0.019317536608468799 +201 5 5.33667469 0.33667469024658203 0.11334984705263196 +202 5 5.25656748 0.25656747817993164 0.065826870859609699 +203 6 6.87973166 0.87973165512084961 0.77392778502166948 +204 4 5.5412097 1.5412096977233887 2.3753273323566191 +205 5 5.47215 0.47214984893798828 0.22292547985216515 +206 5 5.819323 0.81932306289672852 0.67129028139447655 +207 4 4.38594675 0.38594675064086914 0.14895489433024522 +208 5 4.990595 0.0094051361083984375 8.8456585217500106E-05 +209 6 5.401164 0.59883594512939453 0.35860448917901522 +210 5 5.362051 0.36205101013183594 0.13108093393748277 +211 7 6.553773 0.44622707366943359 0.19911860127558612 +212 5 5.819323 0.81932306289672852 0.67129028139447655 +213 6 5.920044 0.0799560546875 0.0063929706811904907 +214 7 6.7516346 0.24836540222167969 0.061685373020736733 +215 5 5.31538868 0.31538867950439453 0.099470019159525691 +216 5 5.990885 0.99088478088378906 0.98185264898711466 +217 5 5.31538868 0.31538867950439453 0.099470019159525691 +218 5 5.173066 0.17306613922119141 0.029951888544928806 +219 5 6.04188538 1.0418853759765625 1.085525136673823 +220 5 5.990885 0.99088478088378906 0.98185264898711466 +221 6 5.235949 0.76405096054077148 0.58377387030327554 +222 7 6.7516346 0.24836540222167969 0.061685373020736733 +223 6 5.79227161 0.20772838592529297 0.043151082319127454 +224 6 6.029271 0.029271125793457031 0.00085679880521638552 +225 5 5.384162 0.38416194915771484 0.14758040318065468 +226 6 5.95489836 0.045101642608642578 0.0020341581659977237 +227 6 5.499437 0.50056314468383789 0.25056346181577283 +228 6 5.95489836 0.045101642608642578 0.0020341581659977237 +229 5 5.384162 0.38416194915771484 0.14758040318065468 +230 4 4.446024 0.44602394104003906 0.19893735598088824 +231 6 5.74688053 0.25311946868896484 0.064069465429383854 +232 6 5.749846 0.25015401840209961 0.06257703292271799 +233 6 6.15617752 0.15617752075195313 0.024391417988226749 +234 6 6.15617752 0.15617752075195313 0.024391417988226749 +235 6 6.15617752 0.15617752075195313 0.024391417988226749 +236 6 6.15617752 0.15617752075195313 0.024391417988226749 +237 6 5.46915054 0.53084945678710938 0.2818011457711691 +238 7 7.05990648 0.059906482696533203 0.0035887866690700321 +239 6 5.64534473 0.35465526580810547 0.12578035756541794 +240 5 4.95311737 0.04688262939453125 0.0021979809389449656 +241 5 5.690982 0.69098186492919922 0.47745593766103411 +242 7 6.38708448 0.6129155158996582 0.37566542963054417 +243 6 5.92264938 0.077350616455078125 0.0059831178659806028 +244 5 5.301481 0.30148077011108398 0.09089065474677227 +245 6 5.91515 0.084849834442138672 0.007199494404858342 +246 7 6.88372326 0.11627674102783203 0.013520280504053517 +247 7 6.059374 0.94062614440917969 0.88477754354607896 +248 7 6.03445435 0.965545654296875 0.93227841053158045 +249 5 5.359669 0.35966920852661133 0.12936193956215902 +250 4 5.167353 1.1673531532287598 1.3627133843531283 +251 3 4.49473763 1.4947376251220703 2.2342405679555668 +252 5 5.301481 0.30148077011108398 0.09089065474677227 +253 3 4.322997 1.3229970932006836 1.7503213086174583 +254 6 5.589023 0.41097688674926758 0.16890200144212031 +255 8 6.295933 1.7040672302246094 2.9038451251253719 +256 7 5.87387753 1.1261224746704102 1.2681518279578086 +257 7 5.87387753 1.1261224746704102 1.2681518279578086 +258 6 6.36277533 0.36277532577514648 0.13160593699126366 +259 4 3.98837662 0.011623382568359375 0.00013510302233044058 +260 6 6.302642 0.30264186859130859 0.091592100624438899 +261 5 5.3442893 0.34428930282592773 0.11853512404036337 +262 5 5.49438143 0.49438142776489258 0.2444129961188537 +263 6 5.616195 0.3838047981262207 0.14730612306470903 +264 6 5.7502203 0.24977970123291016 0.062389899148001859 +265 5 5.3442893 0.34428930282592773 0.11853512404036337 +266 6 5.16183329 0.83816671371459961 0.70252343997913158 +267 5 5.348096 0.34809589385986328 0.1211707513220972 +268 6 5.348096 0.65190410614013672 0.42497896360237064 +269 6 5.369744 0.63025617599487305 0.39722284737968039 +270 6 5.16183329 0.83816671371459961 0.70252343997913158 +271 5 5.102849 0.10284900665283203 0.010577918169474287 +272 5 5.39269733 0.39269733428955078 0.1542111963581192 +273 5 5.05073929 0.050739288330078125 0.0025744753802428022 +274 5 5.482709 0.48270893096923828 0.23300791203746485 +275 6 5.93928432 0.060715675354003906 0.0036863932336927974 +276 6 5.98012447 0.019875526428222656 0.00039503655079897726 +277 5 5.00867653 0.0086765289306640625 7.528215428465046E-05 +278 4 4.974161 0.97416114807128906 0.94898994241157197 +279 7 6.429354 0.57064580917358398 0.32563663952737443 +280 8 6.91723728 1.0827627182006836 1.172375103925333 +281 8 6.97333765 1.0266623497009277 1.05403558029343 +282 4 5.16001034 1.1600103378295898 1.3456239838715192 +283 5 5.15820456 0.15820455551147461 0.025028681384583251 +284 5 5.1790514 0.17905139923095703 0.03205940356656356 +285 5 5.094003 0.094003200531005859 0.0088366017100725003 +286 6 5.35268736 0.64731264114379883 0.41901365538456048 +287 7 6.3021884 0.69781160354614258 0.48694103404363887 +288 7 6.3021884 0.69781160354614258 0.48694103404363887 +289 7 6.3021884 0.69781160354614258 0.48694103404363887 +290 7 6.3021884 0.69781160354614258 0.48694103404363887 +291 6 5.820911 0.17908906936645508 0.032072894766542959 +292 5 5.341021 0.34102106094360352 0.11629536400710094 +293 7 5.87495327 1.1250467300415039 1.2657301447770806 +294 3 3.93183255 0.93183255195617676 0.86831190488516086 +295 6 5.65310144 0.34689855575561523 0.12033860798533169 +296 5 5.18066072 0.18066072463989258 0.032638297427411089 +297 7 6.394417 0.60558319091796875 0.36673100112238899 +298 6 5.9266243 0.073375701904296875 0.005383993629948236 +299 6 5.99227858 0.0077214241027832031 5.9620390175041393E-05 +300 6 5.87351751 0.12648248672485352 0.015997819448102746 +301 6 5.71431828 0.28568172454833984 0.08161404774091352 +302 6 5.87351751 0.12648248672485352 0.015997819448102746 +303 6 5.87837744 0.12162256240844727 0.01479204768679665 +304 6 5.394941 0.60505914688110352 0.3660965712244888 +305 6 5.394941 0.60505914688110352 0.3660965712244888 +306 5 5.220892 0.22089195251464844 0.0487932546857337 +307 6 5.33827353 0.66172647476196289 0.43788192740089471 +308 7 6.0804224 0.91957759857177734 0.84562295979503688 +309 6 5.93416357 0.065836429595947266 0.004334435461942121 +310 7 6.722236 0.27776384353637695 0.077152752776100897 +311 8 7.22786236 0.77213764190673828 0.5961965380492984 +312 6 6.118533 0.11853313446044922 0.014050103965018934 +313 6 5.402841 0.59715890884399414 0.3565987624117497 +314 5 5.365508 0.36550807952880859 0.13359615620083787 +315 6 5.698318 0.3016819953918457 0.091012026343605612 +316 6 6.04022455 0.040224552154541016 0.0016180145960333903 +317 5 6.033596 1.0335960388183594 1.0683207714610035 +318 7 6.607716 0.39228391647338867 0.15388667112370058 +319 6 6.24146557 0.24146556854248047 0.058305620791543333 +320 7 6.51413059 0.48586940765380859 0.23606908129386284 +321 5 6.033596 1.0335960388183594 1.0683207714610035 +322 6 6.04022455 0.040224552154541016 0.0016180145960333903 +323 6 5.963121 0.036879062652587891 0.001360065262133503 +324 5 5.16921139 0.16921138763427734 0.028632493705117668 +325 5 4.408439 0.59156084060668945 0.34994422813929305 +326 6 5.74754953 0.25245046615600586 0.06373123786238466 +327 6 5.44730234 0.55269765853881836 0.30547470175429225 +328 6 5.488627 0.51137304306030273 0.26150238916875423 +329 5 5.86261129 0.86261129379272461 0.74409824417875825 +330 8 7.090369 0.90963077545166016 0.82742814764878858 +331 5 6.05666828 1.0566682815551758 1.1165478572447682 +332 6 6.319801 0.31980085372924805 0.1022725860459559 +333 5 5.58119726 0.58119726181030273 0.33779025713579358 +334 5 5.65321 0.65321016311645508 0.42668351719862585 +335 6 6.319801 0.31980085372924805 0.1022725860459559 +336 6 6.11735344 0.11735343933105469 0.013771829722827533 +337 6 5.38936663 0.61063337326049805 0.37287311653949473 +338 5 5.330161 0.33016109466552734 0.10900634843073931 +339 7 6.78890038 0.21109962463378906 0.044563051520526642 +340 7 5.92403841 1.0759615898132324 1.1576933427534186 +341 6 5.41036749 0.58963251113891602 0.34766649819198392 +342 6 5.59871244 0.40128755569458008 0.16103170235533071 +343 5 5.429605 0.42960500717163086 0.184560462186937 +344 6 5.709671 0.2903289794921875 0.08429091633297503 +345 6 5.948705 0.051294803619384766 0.0026311568783512485 +346 7 6.09437847 0.90562152862548828 0.82015035310996609 +347 6 6.19719934 0.19719934463500977 0.038887581524477355 +348 6 6.097723 0.097723007202148438 0.0095497861366311554 +349 5 5.76003933 0.76003932952880859 0.5776597824306009 +350 7 6.79789734 0.2021026611328125 0.04084548563696444 +351 7 6.578576 0.42142391204833984 0.17759811364612688 +352 6 5.371543 0.62845706939697266 0.39495828807503131 +353 7 6.578576 0.42142391204833984 0.17759811364612688 +354 6 5.670751 0.32924890518188477 0.10840484156346974 +355 6 6.183845 0.18384504318237305 0.03379899990272861 +356 6 6.183845 0.18384504318237305 0.03379899990272861 +357 6 5.336155 0.66384506225585938 0.44069026668148581 +358 6 5.296089 0.70391082763671875 0.49549045326421037 +359 6 6.08911371 0.089113712310791016 0.0079412537218104262 +360 6 5.67155838 0.32844161987304688 0.10787389766483102 +361 5 4.84053326 0.15946674346923828 0.02542964227268385 +362 6 5.97343636 0.026563644409179688 0.00070562720429734327 +363 6 6.183845 0.18384504318237305 0.03379899990272861 +364 7 6.583856 0.41614389419555664 0.17317574067624264 +365 7 7.08582544 0.085825443267822266 0.0073660067121181783 +366 6 5.89871 0.10129022598266602 0.01025970987961955 +367 6 5.30400562 0.69599437713623047 0.48440817300524941 +368 6 5.83022356 0.16977643966674805 0.02882403946591694 +369 5 5.58880329 0.58880329132080078 0.34668931587020779 +370 6 5.30400562 0.69599437713623047 0.48440817300524941 +371 6 5.83022356 0.16977643966674805 0.02882403946591694 +372 5 4.772894 0.22710609436035156 0.051577178095612908 +373 6 5.60631132 0.39368867874145508 0.15499077576919262 +374 7 6.83962536 0.16037464141845703 0.025720025610098673 +375 7 6.83962536 0.16037464141845703 0.025720025610098673 +376 7 5.858397 1.1416029930114746 1.3032573936527569 +377 7 5.830574 1.1694259643554688 1.3675570861087181 +378 6 5.26461172 0.73538827896118164 0.54079592083348871 +379 7 5.858397 1.1416029930114746 1.3032573936527569 +380 7 5.830574 1.1694259643554688 1.3675570861087181 +381 6 5.43521452 0.56478548049926758 0.31898263898278856 +382 6 5.43323469 0.56676530838012695 0.3212229147832204 +383 6 5.60631132 0.39368867874145508 0.15499077576919262 +384 7 6.733138 0.26686191558837891 0.071215281991499069 +385 7 6.83962536 0.16037464141845703 0.025720025610098673 +386 7 6.863374 0.13662576675415039 0.018666600141159506 +387 5 5.254784 0.25478410720825195 0.064914941285906025 +388 6 5.87611 0.12388992309570313 0.015348713044659235 +389 7 5.93216467 1.0678353309631348 1.1402722940531476 +390 7 5.93216467 1.0678353309631348 1.1402722940531476 +391 5 5.07553434 0.075534343719482422 0.0057054370811329136 +392 6 5.30473661 0.69526338577270508 0.48339117559612532 +393 6 6.15231037 0.15231037139892578 0.023198449235678709 +394 5 5.16831541 0.16831541061401367 0.028330077450164026 +395 5 5.233454 0.23345422744750977 0.054500876313113622 +396 5 5.96566343 0.96566343307495117 0.9325058659781007 +397 6 6.100245 0.10024499893188477 0.010049059810853578 +398 5 5.2522397 0.25223970413208008 0.063624868340639296 +399 6 6.407573 0.40757322311401367 0.16611593219954557 +400 6 6.100245 0.10024499893188477 0.010049059810853578 +401 5 5.16831541 0.16831541061401367 0.028330077450164026 +402 5 5.118631 0.11863088607788086 0.014073287131623147 +403 5 5.3481245 0.34812450408935547 0.12119067034745967 +404 6 6.675493 0.67549276351928711 0.45629047356692354 +405 5 5.233454 0.23345422744750977 0.054500876313113622 +406 7 7.081275 0.081274986267089844 0.0066056233927156427 +407 5 4.94992352 0.050076484680175781 0.0025076543179238797 +408 6 5.90589857 0.094101428985595703 0.0088550789371311112 +409 5 5.96566343 0.96566343307495117 0.9325058659781007 +410 6 5.7482605 0.251739501953125 0.063372776843607426 +411 6 5.9920783 0.0079216957092285156 6.2753262909609475E-05 +412 5 5.56511974 0.56511974334716797 0.319360324320769 +413 5 5.56511974 0.56511974334716797 0.319360324320769 +414 6 5.7482605 0.251739501953125 0.063372776843607426 +415 6 5.9920783 0.0079216957092285156 6.2753262909609475E-05 +416 6 5.86958933 0.13041067123413086 0.017006943171736566 +417 5 5.11206532 0.11206531524658203 0.012558634881315811 +418 6 5.86958933 0.13041067123413086 0.017006943171736566 +419 6 5.831169 0.16883087158203125 0.028503863199148327 +420 7 6.689255 0.3107447624206543 0.096562307371868883 +421 6 5.87943363 0.12056636810302734 0.014536249117554689 +422 6 5.87943363 0.12056636810302734 0.014536249117554689 +423 6 5.87943363 0.12056636810302734 0.014536249117554689 +424 7 5.95081234 1.0491876602172852 1.1007947463522214 +425 6 5.87943363 0.12056636810302734 0.014536249117554689 +426 6 5.87943363 0.12056636810302734 0.014536249117554689 +427 5 5.24868631 0.24868631362915039 0.061844882586456151 +428 5 5.4483943 0.4483942985534668 0.20105744697525552 +429 5 5.16103458 0.16103458404541016 0.025932137258678267 +430 5 5.24868631 0.24868631362915039 0.061844882586456151 +431 5 5.10770464 0.10770463943481445 0.011600289355783389 +432 7 6.57548237 0.42451763153076172 0.18021521948048758 +433 4 4.708309 0.70830917358398438 0.50170188538322691 +434 8 6.96170425 1.0382957458496094 1.0780580558493966 +435 7 6.91244125 0.087558746337890625 0.0076665340602630749 +436 5 5.4172473 0.41724729537963867 0.17409530550162344 +437 8 7.2327404 0.76725959777832031 0.58868729038294987 +438 7 6.57548237 0.42451763153076172 0.18021521948048758 +439 5 5.09460831 0.094608306884765625 0.0089507317316019908 +440 7 6.333899 0.66610097885131836 0.44369051402668447 +441 6 6.071405 0.071404933929443359 0.0050986645894681715 +442 8 7.38202429 0.61797571182250977 0.38189398040253764 +443 6 5.58170938 0.41829061508178711 0.17496703866549979 +444 6 5.96860075 0.031399250030517578 0.00098591290247895813 +445 3 5.549208 2.5492081642150879 6.4984622645008585 +446 5 6.19848967 1.1984896659851074 1.4363774794730944 +447 6 5.756496 0.24350404739379883 0.059294221097161426 +448 6 5.756496 0.24350404739379883 0.059294221097161426 +449 7 6.6492877 0.35071229934692383 0.12299911691320631 +450 5 5.02871132 0.028711318969726563 0.00082433983698138036 +451 5 5.507411 0.50741100311279297 0.2574659260799308 +452 7 6.136642 0.8633580207824707 0.74538707204942511 +453 7 6.4758153 0.5241847038269043 0.27476960372609938 +454 7 6.6492877 0.35071229934692383 0.12299911691320631 +455 6 5.756496 0.24350404739379883 0.059294221097161426 +456 7 6.834708 0.16529178619384766 0.027321374583152647 +457 5 5.640308 0.64030790328979492 0.40999421101537337 +458 6 5.32179976 0.67820024490356445 0.4599555721872548 +459 5 4.82953072 0.17046928405761719 0.029059776807116577 +460 5 5.640308 0.64030790328979492 0.40999421101537337 +461 5 5.43269873 0.43269872665405273 0.18722818804803865 +462 5 5.321591 0.32159090042114258 0.10342070723368124 +463 6 5.20089865 0.79910135269165039 0.63856297187362543 +464 5 4.98644924 0.013550758361816406 0.00018362305218033725 +465 5 5.4275465 0.42754650115966797 0.18279601065387396 +466 6 6.059653 0.059652805328369141 0.0035584571835443057 +467 6 5.20089865 0.79910135269165039 0.63856297187362543 +468 5 4.98644924 0.013550758361816406 0.00018362305218033725 +469 5 5.323033 0.32303285598754883 0.10435022604747246 +470 6 5.18785763 0.81214237213134766 0.65957523261113238 +471 5 5.20747042 0.20747041702270508 0.043043973939575153 +472 6 6.2822175 0.28221750259399414 0.079646718770391089 +473 7 6.1696806 0.83031940460205078 0.68943031365870411 +474 6 5.81795454 0.18204545974731445 0.033140549414611087 +475 5 5.7082715 0.70827150344848633 0.50164852259717918 +476 7 6.5067544 0.49324560165405273 0.24329122355106847 +477 6 6.148587 0.14858722686767578 0.022078163988226152 +478 6 5.16096258 0.83903741836547852 0.70398378941740702 +479 6 6.0799365 0.079936504364013672 0.0063898447299379768 +480 5 5.271217 0.27121686935424805 0.073558590222319253 +481 6 6.171603 0.17160320281982422 0.029447659218021727 +482 5 5.573488 0.57348823547363281 0.32888875622666092 +483 5 5.271217 0.27121686935424805 0.073558590222319253 +484 5 5.36182356 0.36182355880737305 0.13091628770803254 +485 6 6.199785 0.19978523254394531 0.039914139142638305 +486 6 5.96590042 0.034099578857421875 0.0011627812782535329 +487 6 5.9241333 0.07586669921875 0.0057557560503482819 +488 6 6.31041574 0.31041574478149414 0.096357934608249707 +489 6 5.47512054 0.52487945556640625 0.27549844287568703 +490 6 6.19690561 0.19690561294555664 0.038771820409465363 +491 7 6.62910938 0.37089061737060547 0.13755985005354887 +492 6 5.87253046 0.12746953964233398 0.016248483536628555 +493 6 6.263361 0.26336097717285156 0.069359004297439242 +494 6 6.2679 0.26789999008178711 0.071770404685821632 +495 6 6.6444664 0.64446640014648438 0.41533694091776852 +496 4 4.775965 0.77596521377563477 0.60212201298986656 +497 6 6.66031027 0.66031026840209961 0.43600965055725283 +498 5 5.107339 0.10733890533447266 0.011521640598402882 +499 4 4.775965 0.77596521377563477 0.60212201298986656 +500 6 5.39384 0.60616016387939453 0.36743014427429443 +501 6 6.040598 0.040597915649414063 0.0016481907550769392 +502 6 5.154273 0.84572696685791016 0.71525410247068066 +503 5 5.159687 0.15968704223632813 0.025499951458186843 +504 6 6.167881 0.16788101196289063 0.028184034177684225 +505 6 6.167881 0.16788101196289063 0.028184034177684225 +506 5 5.08835363 0.088353633880615234 0.0078063646199098002 +507 7 6.095513 0.90448713302612305 0.81809697380981561 +508 6 6.2309227 0.23092269897460938 0.053325292901718058 +509 7 6.095513 0.90448713302612305 0.81809697380981561 +510 6 5.272565 0.72743511199951172 0.52916184216974216 +511 6 5.5821805 0.41781949996948242 0.17457313455474832 +512 6 6.258699 0.25869894027709961 0.066925141700494351 +513 6 5.81159925 0.1884007453918457 0.03549484086420307 +514 7 6.098065 0.90193510055541992 0.81348692561391545 +515 6 5.45307732 0.54692268371582031 0.29912442196291522 +516 5 5.978399 0.97839879989624023 0.95726421163840314 +517 6 6.02913475 0.029134750366210938 0.00084883367890142836 +518 6 6.19396639 0.19396638870239258 0.037622959946247647 +519 5 5.23702669 0.23702669143676758 0.056181652453460629 +520 5 5.448774 0.44877386093139648 0.20139797825527239 +521 5 5.448774 0.44877386093139648 0.20139797825527239 +522 6 6.07142735 0.071427345275878906 0.0051018656531596207 +523 6 6.2844224 0.28442239761352539 0.080896100264226334 +524 5 4.514703 0.48529720306396484 0.23551337530170713 +525 6 5.40235 0.59765005111694336 0.35718558360008501 +526 4 4.72034931 0.72034931182861328 0.51890313105195673 +527 6 6.59680128 0.5968012809753418 0.35617176897380887 +528 6 6.51870775 0.5187077522277832 0.26905773222119933 +529 6 6.36267757 0.36267757415771484 0.13153502279692475 +530 6 6.037053 0.037053108215332031 0.0013729328284171061 +531 5 5.97751045 0.97751045227050781 0.95552668429809273 +532 6 5.8616004 0.13839960098266602 0.019154449552161168 +533 6 5.8616004 0.13839960098266602 0.019154449552161168 +534 6 5.8616004 0.13839960098266602 0.019154449552161168 +535 5 5.19603348 0.19603347778320313 0.038429124411777593 +536 5 5.19603348 0.19603347778320313 0.038429124411777593 +537 6 5.8616004 0.13839960098266602 0.019154449552161168 +538 5 5.589188 0.5891880989074707 0.34714261589419948 +539 6 5.37892151 0.6210784912109375 0.38573849224485457 +540 4 5.45178461 1.451784610748291 2.1076785560055669 +541 5 4.952542 0.047458171844482422 0.0022522780748204241 +542 6 5.618697 0.38130283355712891 0.14539185087869555 +543 6 5.904283 0.095716953277587891 0.0091617351447439432 +544 6 5.34441471 0.65558528900146484 0.42979207115513418 +545 6 6.13511848 0.13511848449707031 0.01825700485278503 +546 6 5.9491806 0.05081939697265625 0.0025826111086644232 +547 6 5.68298626 0.31701374053955078 0.10049771169087762 +548 7 6.17158461 0.8284153938293457 0.68627206473342994 +549 5 4.952542 0.047458171844482422 0.0022522780748204241 +550 7 5.66757774 1.3324222564697266 1.7753490695358778 +551 7 5.746953 1.253046989440918 1.570126757746948 +552 7 6.27114058 0.72885942459106445 0.53123606081521757 +553 7 5.66757774 1.3324222564697266 1.7753490695358778 +554 7 6.27114058 0.72885942459106445 0.53123606081521757 +555 7 5.746953 1.253046989440918 1.570126757746948 +556 5 5.00603962 0.0060396194458007813 3.6477003050094936E-05 +557 6 5.82325029 0.17674970626831055 0.031240458665934057 +558 5 5.31163931 0.31163930892944336 0.097119058870021036 +559 6 6.750174 0.75017404556274414 0.56276109863597412 +560 7 6.050167 0.94983291625976563 0.90218256881053094 +561 5 5.197575 0.19757509231567383 0.039035917103547035 +562 6 5.17906332 0.82093667984008789 0.67393703230686697 +563 7 5.404128 1.5958719253540039 2.5468072021330954 +564 5 5.222314 0.22231388092041016 0.049423461649894307 +565 6 5.77024126 0.22975873947143555 0.052789078363502995 +566 6 5.583592 0.41640806198120117 0.17339567408293988 +567 5 5.776841 0.77684116363525391 0.60348219351817534 +568 6 5.72432041 0.27567958831787109 0.075999235415110888 +569 6 5.43442726 0.56557273864746094 0.31987252270118915 +570 5 5.004094 0.0040941238403320313 1.67618500199751E-05 +571 7 6.748615 0.25138521194458008 0.063194524784421446 +572 5 5.23731852 0.23731851577758789 0.056320077930877233 +573 7 6.81844759 0.18155241012573242 0.032961277622462148 +574 7 6.23604345 0.76395654678344727 0.58362960537328945 +575 6 5.939097 0.060903072357177734 0.0037091842225436267 +576 6 5.931183 0.068817138671875 0.0047357985749840736 +577 7 6.689255 0.3107447624206543 0.096562307371868883 +578 7 6.748615 0.25138521194458008 0.063194524784421446 +579 7 6.88390064 0.11609935760498047 0.013479060836289136 +580 5 5.004094 0.0040941238403320313 1.67618500199751E-05 +581 5 5.65414333 0.65414333343505859 0.42790350067753025 +582 6 5.61086226 0.38913774490356445 0.1514281845086316 +583 6 5.693468 0.30653190612792969 0.093961809474421898 +584 7 6.39591646 0.60408353805541992 0.36491692094955397 +585 6 5.693468 0.30653190612792969 0.093961809474421898 +586 6 5.60034037 0.39965963363647461 0.15972782275844111 +587 7 6.347285 0.65271520614624023 0.42603714033452889 +588 7 6.963931 0.036068916320800781 0.001300966724556929 +589 6 5.88822651 0.11177349090576172 0.012493313269260398 +590 5 4.95751238 0.042487621307373047 0.0018051979643587401 +591 6 6.25201368 0.2520136833190918 0.063510896580055487 +592 5 5.41490841 0.41490840911865234 0.17214898795737099 +593 5 5.11563158 0.1156315803527832 0.013370662374882158 +594 5 4.971714 0.028285980224609375 0.00080009667726699263 +595 7 5.776347 1.2236528396606445 1.497326272009559 +596 5 5.41490841 0.41490840911865234 0.17214898795737099 +597 6 6.041546 0.041545867919921875 0.0017260591412195936 +598 8 6.3806777 1.6193222999572754 2.6222047111389202 +599 7 6.228356 0.77164411544799805 0.59543464090552334 +600 6 5.45590353 0.54409646987915039 0.29604096853495321 +601 6 5.675238 0.32476186752319336 0.10547027059715219 +602 5 5.11563158 0.1156315803527832 0.013370662374882158 +603 5 4.971714 0.028285980224609375 0.00080009667726699263 +604 6 5.638143 0.36185693740844727 0.13094044315062092 +605 6 5.638143 0.36185693740844727 0.13094044315062092 +606 5 5.494974 0.49497413635253906 0.24499939565794193 +607 5 5.494974 0.49497413635253906 0.24499939565794193 +608 5 5.25137138 0.25137138366699219 0.063187572526658187 +609 6 5.36752748 0.63247251510620117 0.40002148236476387 +610 8 7.06434345 0.93565654754638672 0.87545317496642383 +611 6 5.55398846 0.44601154327392578 0.19892629673358897 +612 5 5.240067 0.2400670051574707 0.057632166965277065 +613 5 5.35241652 0.3524165153503418 0.1241974002916777 +614 5 5.35241652 0.3524165153503418 0.1241974002916777 +615 5 5.240067 0.2400670051574707 0.057632166965277065 +616 7 6.07053661 0.92946338653564453 0.86390218691030896 +617 6 5.68455839 0.31544160842895508 0.099503408328246223 +618 6 5.708391 0.29160881042480469 0.085035698317369679 +619 6 6.07619429 0.076194286346435547 0.0058055692718426144 +620 5 5.26621342 0.26621341705322266 0.070869583419153059 +621 5 5.37356234 0.37356233596801758 0.13954881885388204 +622 6 5.79691 0.20309019088745117 0.041245625634701355 +623 5 4.9132266 0.086773395538330078 0.0075296221732514823 +624 5 5.115207 0.11520719528198242 0.013272697844740833 +625 8 6.59713936 1.4028606414794922 1.9680179794122523 +626 4 4.457788 0.45778799057006836 0.209569844310181 +627 6 5.31530046 0.68469953536987305 0.46881345373572003 +628 6 5.31530046 0.68469953536987305 0.46881345373572003 +629 6 5.594381 0.40561914443969727 0.16452689033599199 +630 5 5.24268532 0.24268531799316406 0.058896163569443161 +631 5 5.24268532 0.24268531799316406 0.058896163569443161 +632 6 5.875219 0.12478113174438477 0.015570330839409507 +633 5 5.23071766 0.23071765899658203 0.05323063817286311 +634 6 6.51998425 0.51998424530029297 0.27038361536051525 +635 6 6.08986759 0.089867591857910156 0.0080761840663399198 +636 7 6.29875374 0.70124626159667969 0.49174631940331892 +637 5 5.257495 0.25749492645263672 0.066303637148848793 +638 5 5.275801 0.27580118179321289 0.076066291878532866 +639 5 5.323193 0.32319307327270508 0.10445376261145611 +640 7 6.396723 0.60327720642089844 0.3639433877870033 +641 4 5.229983 1.229982852935791 1.5128578185160677 +642 6 5.86662674 0.13337326049804688 0.017788426615879871 +643 5 5.45093775 0.45093774795532227 0.20334485253101775 +644 5 5.45093775 0.45093774795532227 0.20334485253101775 +645 5 5.24437666 0.24437665939331055 0.059719951656234116 +646 4 4.74324846 0.74324846267700195 0.55241827727172677 +647 6 6.00779343 0.007793426513671875 6.0737496824003756E-05 +648 5 5.18965864 0.18965864181518555 0.035970400415180848 +649 7 6.326384 0.67361593246459961 0.45375842447015202 +650 7 6.326384 0.67361593246459961 0.45375842447015202 +651 7 6.326384 0.67361593246459961 0.45375842447015202 +652 7 6.326384 0.67361593246459961 0.45375842447015202 +653 6 5.4366684 0.56333160400390625 0.31734249606961384 +654 7 6.830691 0.16930913925170898 0.028665584634154584 +655 6 6.590023 0.59002304077148438 0.34812718864122871 +656 6 6.23281145 0.23281145095825195 0.054201171697286554 +657 5 5.062823 0.062822818756103516 0.0039467065564622317 +658 5 5.59347248 0.59347248077392578 0.35220958543595771 +659 4 4.17119837 0.17119836807250977 0.029308881230690531 +660 5 5.04121876 0.041218757629394531 0.0016989859805107699 +661 7 6.913087 0.086913108825683594 0.0075538884857451194 +662 4 4.35116768 0.35116767883300781 0.12331873865696252 +663 5 5.04121876 0.041218757629394531 0.0016989859805107699 +664 6 5.86935139 0.13064861297607422 0.017069060072572029 +665 5 5.10480833 0.10480833053588867 0.010984786149720094 +666 6 6.54895258 0.54895257949829102 0.30134893453782752 +667 6 5.86935139 0.13064861297607422 0.017069060072572029 +668 6 5.53544044 0.46455955505371094 0.21581558019170188 +669 5 5.39997 0.39997005462646484 0.15997604459789727 +670 6 5.265179 0.73482084274291992 0.53996167092941505 +671 6 6.171881 0.17188119888305664 0.029543146529476871 +672 8 7.181752 0.81824779510498047 0.6695294541941621 +673 6 6.02429342 0.024293422698974609 0.00059017038643105479 +674 5 5.3664 0.36639976501464844 0.13424878780278959 +675 6 5.31930161 0.68069839477539063 0.46335030464979354 +676 6 5.35488653 0.64511346817016602 0.4161713868145398 +677 7 6.96780729 0.032192707061767578 0.0010363703879647801 +678 7 6.96780729 0.032192707061767578 0.0010363703879647801 +679 7 6.96780729 0.032192707061767578 0.0010363703879647801 +680 5 5.2060957 0.20609569549560547 0.042475435701817332 +681 5 4.946529 0.053471088409423828 0.0028591572956884193 +682 6 5.399353 0.60064697265625 0.36077678576111794 +683 5 5.263034 0.26303386688232422 0.069186815127068257 +684 5 5.50861454 0.50861454010009766 0.25868875040123385 +685 5 5.07341576 0.073415756225585938 0.0053898732621746603 +686 7 6.00908756 0.99091243743896484 0.98190745867123042 +687 4 4.52703762 0.52703762054443359 0.27776865346913837 +688 6 5.58062744 0.41937255859375 0.17587334290146828 +689 7 6.52020073 0.47979927062988281 0.23020734009696753 +690 4 5.823676 1.8236761093139648 3.3257945516825203 +691 6 5.42463827 0.57536172866821289 0.33104111881607423 +692 5 5.35376024 0.3537602424621582 0.12514630914688496 +693 5 5.23882055 0.23882055282592773 0.05703525645208174 +694 6 5.30280161 0.69719839096069336 0.48608559635817983 +695 5 5.145367 0.14536714553833008 0.021131607001962038 +696 6 6.2366724 0.23667240142822266 0.05601382559780177 +697 5 5.362401 0.36240100860595703 0.13133449103861494 +698 5 5.362401 0.36240100860595703 0.13133449103861494 +699 5 5.58441544 0.58441543579101563 0.34154140159080271 +700 5 5.12781763 0.12781763076782227 0.016337346735099345 +701 7 6.85601139 0.14398860931396484 0.020732719612169603 +702 4 5.173525 1.1735248565673828 1.3771605889814964 +703 6 5.646388 0.35361194610595703 0.12504140842884226 +704 6 6.358103 0.35810279846191406 0.12823761426625424 +705 5 5.29434967 0.29434967041015625 0.086641728470567614 +706 5 5.38131 0.38130998611450195 0.14539730551064167 +707 6 6.40786076 0.40786075592041016 0.16635039621996839 +708 6 6.00541 0.0054101943969726563 2.9270203413034324E-05 +709 5 4.96764946 0.032350540161132813 0.001046557448717067 +710 5 5.475811 0.47581100463867188 0.22639611213526223 +711 6 6.164548 0.16454792022705078 0.027076018051047868 +712 6 6.164548 0.16454792022705078 0.027076018051047868 +713 5 5.60174274 0.60174274444580078 0.36209433049316431 +714 6 6.04477644 0.044776439666748047 0.0020049295492299279 +715 7 6.664191 0.33580923080444336 0.11276783949347191 +716 6 5.479746 0.52025413513183594 0.27066436512177461 +717 5 5.49299 0.49299001693725586 0.24303915679979582 +718 7 6.664191 0.33580923080444336 0.11276783949347191 +719 7 6.562948 0.43705177307128906 0.19101425234475755 +720 5 5.10616255 0.10616254806518555 0.011270486611692832 +721 5 5.317372 0.31737184524536133 0.10072488815444558 +722 6 6.002906 0.0029058456420898438 8.4439388956525363E-06 +723 8 6.75251627 1.2474837303161621 1.5562156574035271 +724 7 5.946286 1.0537137985229492 1.1103127691976624 +725 5 5.30462027 0.30462026596069336 0.092793506433963557 +726 7 6.85490274 0.14509725570678711 0.021053213613640764 +727 5 5.35527563 0.35527563095092773 0.1262207739475798 +728 5 6.074019 1.0740189552307129 1.1535167161948721 +729 5 4.81860971 0.18139028549194336 0.032902435670848718 +730 6 6.13959646 0.13959646224975586 0.019487172272647513 +731 6 5.731812 0.2681879997253418 0.071924803196679932 +732 7 5.99923 1.000770092010498 1.0015407770627007 +733 6 5.84573126 0.15426874160766602 0.023798844637212824 +734 5 5.34902859 0.34902858734130859 0.12182095478146948 +735 6 5.605581 0.39441919326782227 0.15556650001803973 +736 6 5.84573126 0.15426874160766602 0.023798844637212824 +737 5 5.34902859 0.34902858734130859 0.12182095478146948 +738 7 6.128486 0.87151384353637695 0.75953637947554853 +739 6 5.605581 0.39441919326782227 0.15556650001803973 +740 3 4.629902 1.6299018859863281 2.6565801579417894 +741 6 6.385394 0.38539409637451172 0.14852860952032643 +742 6 6.08729458 0.087294578552246094 0.0076203434446142637 +743 5 5.519646 0.51964616775512695 0.27003213966258954 +744 5 5.47758532 0.4775853157043457 0.22808773377641955 +745 6 6.33001661 0.3300166130065918 0.10891096486034257 +746 6 5.7296977 0.27030229568481445 0.073063331052480862 +747 6 6.12972736 0.12972736358642578 0.01682918886308471 +748 6 5.93445158 0.065548419952392578 0.0042965953582552174 +749 6 6.08697748 0.086977481842041016 0.0075650823475825746 +750 6 6.12972736 0.12972736358642578 0.01682918886308471 +751 6 6.10662651 0.10662651062011719 0.011369212767021963 +752 6 5.984835 0.015164852142333984 0.00022997274049885164 +753 6 5.7296977 0.27030229568481445 0.073063331052480862 +754 5 5.149871 0.14987087249755859 0.022461278423179465 +755 7 6.61580563 0.38419437408447266 0.14760531707815971 +756 5 5.41311169 0.41311168670654297 0.17066126569352491 +757 6 5.977644 0.022356033325195313 0.00049979222603724338 +758 7 6.57947254 0.42052745819091797 0.17684334309251426 +759 7 6.623723 0.37627696990966797 0.14158435808440117 +760 6 5.93445158 0.065548419952392578 0.0042965953582552174 +761 6 5.89669228 0.10330772399902344 0.010672485837858403 +762 5 5.196006 0.19600582122802734 0.038418281955273414 +763 6 5.80283 0.19716978073120117 0.038875922433589949 +764 6 5.57660151 0.42339849472045898 0.17926628533155053 +765 6 6.0163517 0.016351699829101563 0.00026737808730104007 +766 5 4.96117973 0.038820266723632813 0.0015070131084939931 +767 6 5.613486 0.38651418685913086 0.14939321664337513 +768 7 6.477986 0.52201414108276367 0.2724987634903755 +769 7 6.477986 0.52201414108276367 0.2724987634903755 +770 7 6.369348 0.63065195083618164 0.39772188309348167 +771 7 6.260023 0.73997688293457031 0.54756578727756278 +772 7 6.090812 0.90918779373168945 0.82662244427069709 +773 5 5.334377 0.33437681198120117 0.11180785239071156 +774 9 6.33221531 2.6677846908569336 7.1170751567706247 +775 6 6.322846 0.3228459358215332 0.10422949827648154 +776 6 6.14606333 0.14606332778930664 0.021334495724886438 +777 5 5.67473936 0.67473936080932617 0.45527320502537805 +778 7 6.27057648 0.72942352294921875 0.53205867583164945 +779 8 7.25729275 0.74270725250244141 0.55161406291972526 +780 4 4.25158453 0.25158452987670898 0.063294775673284676 +781 6 5.46962643 0.53037357330322266 0.2812961272584289 +782 7 6.27057648 0.72942352294921875 0.53205867583164945 +783 8 7.25729275 0.74270725250244141 0.55161406291972526 +784 5 5.67473936 0.67473936080932617 0.45527320502537805 +785 6 5.984593 0.015407085418701172 0.00023737828109915426 +786 6 5.73779 0.26220989227294922 0.068754027605791634 +787 6 5.73779 0.26220989227294922 0.068754027605791634 +788 7 5.744564 1.2554359436035156 1.5761194084916497 +789 6 5.984593 0.015407085418701172 0.00023737828109915426 +790 6 5.73779 0.26220989227294922 0.068754027605791634 +791 7 6.72236443 0.27763557434082031 0.077081512139557162 +792 5 5.33879137 0.3387913703918457 0.11477959265198479 +793 7 6.72236443 0.27763557434082031 0.077081512139557162 +794 5 5.357848 0.35784816741943359 0.12805531092544697 +795 5 5.146967 0.14696693420410156 0.021599279749352718 +796 6 5.565932 0.43406820297241211 0.18841520483169916 +797 6 5.848738 0.15126180648803711 0.022880134102024385 +798 6 5.683093 0.31690692901611328 0.10043000165842386 +799 8 6.89512539 1.1048746109008789 1.2207479058133686 +800 6 5.54755449 0.45244550704956055 0.20470693684933394 +801 5 5.25595665 0.25595664978027344 0.06551380656674155 +802 5 5.45315027 0.45315027236938477 0.2053451693484476 +803 7 5.900673 1.0993270874023438 1.2085200450965203 +804 6 5.57087564 0.42912435531616211 0.18414771232551175 +805 6 5.54755449 0.45244550704956055 0.20470693684933394 +806 5 5.43025064 0.43025064468383789 0.18511561725085812 +807 6 5.45095158 0.54904842376708984 0.30145417164112587 +808 6 5.265709 0.73429107666015625 0.53918338526273146 +809 6 5.38183546 0.6181645393371582 0.38212739769392101 +810 5 5.25595665 0.25595664978027344 0.06551380656674155 +811 6 5.19684839 0.80315160751342773 0.64505250465140307 +812 7 5.290009 1.7099909782409668 2.9240691456654986 +813 6 5.39861631 0.60138368606567383 0.36166233786593693 +814 6 5.16599131 0.83400869369506836 0.69557050115895436 +815 5 5.2495265 0.2495265007019043 0.062263474552537446 +816 5 5.339467 0.33946704864501953 0.11523787711576006 +817 5 5.18921566 0.18921566009521484 0.035802566025267879 +818 5 5.2495265 0.2495265007019043 0.062263474552537446 +819 5 5.18921566 0.18921566009521484 0.035802566025267879 +820 9 7.59099245 1.4090075492858887 1.985302273944626 +821 6 5.282037 0.71796321868896484 0.51547118339021836 +822 5 5.76482248 0.76482248306274414 0.58495343059826155 +823 6 5.7928896 0.20711040496826172 0.042894719846117368 +824 5 5.339467 0.33946704864501953 0.11523787711576006 +825 6 5.967984 0.032015800476074219 0.0010250114801237942 +826 6 5.883083 0.11691713333129883 0.013669616066408707 +827 9 7.18077564 1.8192243576049805 3.3095772633032539 +828 7 6.28743362 0.71256637573242188 0.50775083982443903 +829 7 6.37156773 0.62843227386474609 0.39492712283481524 +830 6 5.99365139 0.0063486099243164063 4.0304847971128765E-05 +831 4 5.97875738 1.978757381439209 3.9154807746001552 +832 8 7.28261232 0.71738767623901367 0.5146450780196119 +833 6 6.34423351 0.34423351287841797 0.11849671138861595 +834 6 5.99365139 0.0063486099243164063 4.0304847971128765E-05 +835 8 6.9307394 1.0692605972290039 1.1433182247865261 +836 8 7.40185452 0.59814548492431641 0.35777802113534563 +837 8 7.40185452 0.59814548492431641 0.35777802113534563 +838 8 7.40185452 0.59814548492431641 0.35777802113534563 +839 7 6.12130642 0.87869358062744141 0.77210240863587387 +840 7 6.10929 0.89070987701416016 0.79336408501058031 +841 7 6.560469 0.43953084945678711 0.19318736762420485 +842 7 6.560469 0.43953084945678711 0.19318736762420485 +843 7 6.28632545 0.71367454528808594 0.50933135659215623 +844 8 6.815397 1.184603214263916 1.4032847752444013 +845 8 6.815397 1.184603214263916 1.4032847752444013 +846 5 5.744107 0.74410676956176758 0.55369488450764948 +847 5 5.505699 0.50569915771484375 0.25573163811350241 +848 7 6.560469 0.43953084945678711 0.19318736762420485 +849 6 6.179038 0.17903804779052734 0.032054622556643153 +850 7 6.28632545 0.71367454528808594 0.50933135659215623 +851 5 5.222547 0.22254705429077148 0.049527191373499591 +852 7 6.845798 0.15420198440551758 0.023778251994599486 +853 5 5.05667639 0.056676387786865234 0.0032122129325671267 +854 7 6.845798 0.15420198440551758 0.023778251994599486 +855 7 6.591907 0.40809297561645508 0.1665398767474926 +856 5 5.222547 0.22254705429077148 0.049527191373499591 +857 5 5.28674126 0.28674125671386719 0.082220548301847884 +858 7 6.067086 0.93291378021240234 0.87032812131019455 +859 5 5.37729025 0.37729024887084961 0.14234793189302763 +860 8 6.29607058 1.7039294242858887 2.90337548294724 +861 7 6.279361 0.72063922882080078 0.51932089811543847 +862 6 5.761328 0.23867177963256836 0.056964218392977273 +863 6 6.351686 0.35168600082397461 0.12368304317556067 +864 5 5.67746735 0.67746734619140625 0.45896200515562668 +865 6 6.29066324 0.29066324234008789 0.084485120447652662 +866 7 6.845798 0.15420198440551758 0.023778251994599486 +867 8 6.719907 1.2800931930541992 1.6386385829036954 +868 7 6.091088 0.90891218185424805 0.82612135432304967 +869 6 6.09487629 0.094876289367675781 0.0090015102841789485 +870 5 4.84508 0.15492010116577148 0.024000237745212871 +871 5 5.05667639 0.056676387786865234 0.0032122129325671267 +872 6 5.842372 0.15762805938720703 0.024846605106176867 +873 3 4.258792 1.2587919235229492 1.5845571067266064 +874 5 5.26144648 0.26144647598266602 0.068354259803754758 +875 7 6.0310564 0.96894359588623047 0.9388516920089387 +876 9 7.59398556 1.4060144424438477 1.9768766123606838 +877 6 5.71128035 0.28871965408325195 0.083359038653952666 +878 6 6.17698956 0.17698955535888672 0.031325302706136426 +879 8 7.301932 0.69806814193725586 0.48729913078773279 +880 7 6.0310564 0.96894359588623047 0.9388516920089387 +881 6 4.977804 1.0221958160400391 1.0448842863297614 +882 6 6.22262239 0.22262239456176758 0.049560730560415323 +883 6 6.22262239 0.22262239456176758 0.049560730560415323 +884 6 5.929256 0.070744037628173828 0.0050047188599364745 +885 7 6.7628746 0.23712539672851563 0.056228453773655929 +886 6 5.867425 0.13257503509521484 0.017576139930497447 +887 7 6.904134 0.095866203308105469 0.0091903289367110119 +888 6 5.867425 0.13257503509521484 0.017576139930497447 +889 7 6.904134 0.095866203308105469 0.0091903289367110119 +890 6 5.41642475 0.58357524871826172 0.34056007091658103 +891 7 6.571357 0.42864322662353516 0.18373501573023532 +892 5 5.903946 0.9039459228515625 0.81711823143996298 +893 7 6.39641476 0.60358524322509766 0.3643151458391003 +894 7 6.571357 0.42864322662353516 0.18373501573023532 +895 6 5.795584 0.20441579818725586 0.041785818548532916 +896 6 6.044704 0.044703960418701172 0.0019984440771168011 +897 6 5.53706169 0.46293830871582031 0.21431187767666415 +898 6 5.99871159 0.0012884140014648438 1.6600106391706504E-06 +899 6 6.044704 0.044703960418701172 0.0019984440771168011 +900 7 6.42305946 0.57694053649902344 0.332860382655781 +901 6 5.644117 0.35588312149047852 0.12665279616180669 +902 5 5.376226 0.37622594833374023 0.14154596419962218 +903 6 5.4128356 0.58716440200805664 0.34476203498547875 +904 8 5.905926 2.0940737724304199 4.3851449643809701 +905 4 5.15215969 1.1521596908569336 1.3274719532355448 +906 4 4.686398 0.68639802932739258 0.47114225466452808 +907 8 7.10625744 0.89374256134033203 0.79877576595117716 +908 4 5.538096 1.5380959510803223 2.3657391547296811 +909 5 6.001538 1.0015377998352051 1.0030779644987433 +910 5 5.33533525 0.33533525466918945 0.11244973302405015 +911 5 5.265445 0.26544523239135742 0.070461171399301747 +912 5 5.27746153 0.27746152877807617 0.076984899951867192 +913 5 5.02890873 0.028908729553222656 0.000835714644381369 +914 4 4.618807 0.61880683898925781 0.38292190397987724 +915 5 5.02890873 0.028908729553222656 0.000835714644381369 +916 7 6.41210556 0.58789443969726563 0.34561987222696189 +917 6 5.79484129 0.20515871047973633 0.042090096485708273 +918 6 6.30130339 0.30130338668823242 0.090783730829798515 +919 7 5.49856329 1.501436710357666 2.2543121952096499 +920 7 5.924132 1.0758681297302246 1.1574922325692114 +921 6 5.415235 0.58476495742797852 0.34195005543574553 +922 6 5.415235 0.58476495742797852 0.34195005543574553 +923 6 5.6857233 0.31427669525146484 0.098769841178182105 +924 8 7.1898 0.81020021438598633 0.65642438739109821 +925 5 4.880244 0.11975622177124023 0.014341552652922473 +926 5 4.65471268 0.34528732299804688 0.11922333542315755 +927 7 5.814518 1.1854820251464844 1.4053676319454098 +928 5 5.665487 0.66548681259155273 0.44287269773326443 +929 5 5.26054239 0.26054239273071289 0.067882338409845033 +930 7 6.386512 0.61348819732666016 0.37636776825911511 +931 5 5.3852005 0.38520050048828125 0.14837942557642236 +932 6 5.74774551 0.25225448608398438 0.063632325749495067 +933 5 5.48427868 0.48427867889404297 0.23452583883135958 +934 5 5.25979567 0.2597956657409668 0.067493787937792149 +935 5 5.39290571 0.39290571212768555 0.15437489862256371 +936 5 5.031928 0.031928062438964844 0.0010194011711064377 +937 5 5.26054239 0.26054239273071289 0.067882338409845033 +938 6 5.805165 0.19483518600463867 0.037960749705462149 +939 7 5.841794 1.1582059860229492 1.341441106059392 +940 5 5.4379406 0.43794059753417969 0.19179196696859435 +941 6 5.4995656 0.50043439865112305 0.25043458735331114 +942 7 5.84281254 1.1571874618530273 1.3390828218698516 +943 7 6.667791 0.33220911026000977 0.11036289293974733 +944 7 5.80859041 1.1914095878601074 1.419456806044991 +945 7 6.29415846 0.7058415412902832 0.49821228141104257 +946 5 4.972539 0.027461051940917969 0.00075410937370179454 +947 5 5.56696272 0.56696271896362305 0.32144672469462421 +948 4 4.32402658 0.32402658462524414 0.1049932275439005 +949 5 5.413275 0.41327476501464844 0.17079603139791288 +950 5 5.189596 0.18959617614746094 0.035946710009739036 +951 6 5.98419046 0.015809535980224609 0.0002499414279100165 +952 6 5.73206854 0.26793146133422852 0.07178726797269519 +953 5 5.75603533 0.75603532791137695 0.57158941705006328 +954 6 5.98419046 0.015809535980224609 0.0002499414279100165 +955 5 5.189596 0.18959617614746094 0.035946710009739036 +956 5 4.97038651 0.029613494873046875 0.00087695907859597355 +957 7 6.168868 0.83113193511962891 0.69078029357569903 +958 7 6.26521635 0.73478364944458008 0.53990701149109555 +959 6 5.910377 0.089622974395751953 0.0080322775395416102 +960 6 5.910377 0.089622974395751953 0.0080322775395416102 +961 7 6.86594248 0.13405752182006836 0.017971419156538104 +962 6 5.910377 0.089622974395751953 0.0080322775395416102 +963 6 6.619384 0.61938381195068359 0.38363630650655978 +964 6 5.39164448 0.60835552215576172 0.37009644133740949 +965 5 5.822154 0.82215404510498047 0.67593727388248226 +966 6 5.30688763 0.69311237335205078 0.48040476209371263 +967 6 5.84447241 0.15552759170532227 0.024188831781657427 +968 7 6.907046 0.092954158782958984 0.0086404756350475509 +969 7 6.48757744 0.51242256164550781 0.26257688168334425 +970 7 6.853606 0.14639377593994141 0.021431137633953767 +971 7 6.58319426 0.41680574417114258 0.17372702837405996 +972 6 5.84447241 0.15552759170532227 0.024188831781657427 +973 7 6.907046 0.092954158782958984 0.0086404756350475509 +974 6 6.300776 0.30077600479125977 0.090466205058191917 +975 5 5.21892643 0.21892642974853516 0.047928781642440299 +976 6 6.132713 0.13271284103393555 0.017612698175298647 +977 5 5.34033251 0.3403325080871582 0.1158262160608956 +978 7 6.68473768 0.3152623176574707 0.099390328934759964 +979 5 5.52983046 0.5298304557800293 0.28072031187207358 +980 6 5.64436245 0.35563755035400391 0.12647806722179666 +981 7 6.68473768 0.3152623176574707 0.099390328934759964 +982 6 6.33463573 0.33463573455810547 0.11198107484324282 +983 6 6.484856 0.48485612869262695 0.23508546553080123 +984 5 5.95464563 0.95464563369750977 0.91134828593771999 +985 6 6.035773 0.035772800445556641 0.0012796932517176174 +986 6 5.657669 0.3423309326171875 0.11719046742655337 +987 6 5.644068 0.35593223571777344 0.12668775642305263 +988 5 5.95464563 0.95464563369750977 0.91134828593771999 +989 7 6.054229 0.94577121734619141 0.89448319556049682 +990 6 5.938118 0.06188201904296875 0.003829384280834347 +991 4 4.6924963 0.69249629974365234 0.47955112515865039 +992 5 5.46030664 0.46030664443969727 0.21188220691533388 +993 4 4.682115 0.68211507797241211 0.46528097959730985 +994 6 5.68704033 0.31295967102050781 0.097943755685264478 +995 6 5.751753 0.24824714660644531 0.061626645798241952 +996 5 4.88118124 0.11881875991821289 0.014117897708501914 +997 6 5.532356 0.46764421463012695 0.21869111147702824 +998 6 5.715275 0.28472518920898438 0.081068433370091952 +999 7 6.12828445 0.87171554565429688 0.75988799253536854 +1000 7 5.75078869 1.249211311340332 1.560528900380632 +1001 5 5.37959146 0.37959146499633789 0.14408968029806601 +1002 6 5.324381 0.67561912536621094 0.45646120256060385 +1003 7 5.734845 1.2651548385620117 1.6006167655368699 +1004 6 6.470826 0.47082614898681641 0.22167726256975584 +1005 6 6.26050854 0.26050853729248047 0.067864698002267687 +1006 6 6.470826 0.47082614898681641 0.22167726256975584 +1007 5 4.969872 0.030128002166748047 0.00090769651455957501 +1008 7 5.990216 1.0097842216491699 1.0196641742916199 +1009 6 6.03905725 0.039057254791259766 0.0015254691518293839 +1010 6 5.961968 0.038032054901123047 0.0014464372000020376 +1011 7 6.40974426 0.5902557373046875 0.34840183542110026 +1012 6 5.83015 0.16984987258911133 0.028848979218537352 +1013 5 5.47680569 0.47680568695068359 0.22734366310851328 +1014 5 5.880411 0.88041114807128906 0.77512378964820527 +1015 5 5.34980726 0.3498072624206543 0.1223651208422325 +1016 5 5.21006966 0.21006965637207031 0.044129260528279701 +1017 6 5.961968 0.038032054901123047 0.0014464372000020376 +1018 6 5.96575975 0.034240245819091797 0.0011723944337518333 +1019 6 5.856124 0.14387607574462891 0.020700325171674194 +1020 7 6.15400028 0.84599971771240234 0.71571552236946445 +1021 7 6.15400028 0.84599971771240234 0.71571552236946445 +1022 8 7.124521 0.87547922134399414 0.76646386700508629 +1023 6 5.8021183 0.19788169860839844 0.039157166644145036 +1024 6 6.3128047 0.3128046989440918 0.097846779681503904 +1025 6 6.03922939 0.039229393005371094 0.0015389452755698585 +1026 6 6.19870853 0.19870853424072266 0.039485081580096448 +1027 4 4.37104034 0.37104034423828125 0.13767093705246225 +1028 7 6.500612 0.49938821792602539 0.24938859220333143 +1029 4 4.8798933 0.87989330291748047 0.77421222451903304 +1030 6 5.86210537 0.13789463043212891 0.019014929102013411 +1031 6 5.66682529 0.33317470550537109 0.11100538438859076 +1032 6 5.55122232 0.44877767562866211 0.20140140214266467 +1033 6 5.55122232 0.44877767562866211 0.20140140214266467 +1034 3 4.10867262 1.1086726188659668 1.2291549758231213 +1035 6 6.16589975 0.16589975357055664 0.027522728234771421 +1036 5 5.71157932 0.71157932281494141 0.50634513265777059 +1037 5 4.98682547 0.013174533843994141 0.00017356834200654703 +1038 7 6.22729349 0.77270650863647461 0.59707534848917021 +1039 5 5.944244 0.9442439079284668 0.89159655766002288 +1040 4 4.656221 0.65622091293334961 0.43062588657107881 +1041 5 5.56935263 0.56935262680053711 0.32416241364467169 +1042 4 5.12880945 1.1288094520568848 1.2742107790529644 +1043 5 5.25701237 0.25701236724853516 0.066055356918695907 +1044 7 6.045879 0.95412111282348633 0.91034709793552793 +1045 5 5.825871 0.82587099075317383 0.68206289336762893 +1046 5 5.405234 0.40523386001586914 0.16421448130336103 +1047 5 4.630548 0.36945199966430664 0.13649478005595483 +1048 5 5.02841234 0.028412342071533203 0.00080726118198981567 +1049 6 6.89803839 0.89803838729858398 0.80647294506184153 +1050 5 5.57447243 0.57447242736816406 0.33001856980627053 +1051 6 5.75370646 0.24629354476928711 0.060660510195020834 +1052 5 5.565639 0.56563901901245117 0.3199474998293681 +1053 4 4.707374 0.70737409591674805 0.50037811157403667 +1054 5 4.630548 0.36945199966430664 0.13649478005595483 +1055 5 5.54014635 0.5401463508605957 0.29175808034801776 +1056 6 5.71638632 0.28361368179321289 0.080436720500301817 +1057 5 5.032247 0.032247066497802734 0.0010398732977137115 +1058 6 5.71638632 0.28361368179321289 0.080436720500301817 +1059 4 4.853614 0.85361385345458984 0.72865661080959399 +1060 7 6.41022825 0.58977174758911133 0.34783071425431444 +1061 5 5.65601873 0.65601873397827148 0.43036057933045413 +1062 5 5.03708935 0.037089347839355469 0.0013756197231487022 +1063 5 5.27974224 0.27974224090576172 0.078255721346977225 +1064 6 6.02264 0.022640228271484375 0.00051257993618492037 +1065 5 5.512553 0.51255321502685547 0.26271079823436594 +1066 6 5.341002 0.65899801254272461 0.43427838053526102 +1067 7 6.18087673 0.81912326812744141 0.67096292838778027 +1068 7 6.045392 0.95460796356201172 0.91127636409601109 +1069 6 6.692119 0.69211912155151367 0.47902887841723896 +1070 7 5.93807173 1.0619282722473145 1.1276916553981664 +1071 5 5.512553 0.51255321502685547 0.26271079823436594 +1072 7 6.101792 0.8982081413269043 0.80677786514593208 +1073 5 5.67952 0.6795201301574707 0.46174760728922593 +1074 6 5.47626066 0.52373933792114258 0.27430289408607678 +1075 7 6.69735241 0.30264759063720703 0.091595564118506445 +1076 6 5.935822 0.064177989959716797 0.00411881439526951 +1077 5 5.92465544 0.92465543746948242 0.85498767804187992 +1078 5 5.23349667 0.23349666595458984 0.054520693011909316 +1079 6 5.53093767 0.46906232833862305 0.22001946786645021 +1080 7 6.04816961 0.95183038711547852 0.90598108583640169 +1081 6 5.610572 0.38942813873291016 0.15165427523697872 +1082 6 5.610572 0.38942813873291016 0.15165427523697872 +1083 6 6.01216745 0.012167453765869141 0.00014804693114456313 +1084 7 6.06720972 0.93279027938842773 0.87009770532154107 +1085 5 4.8821125 0.11788749694824219 0.013897461936721811 +1086 8 7.018562 0.98143815994262695 0.9632208617915694 +1087 8 6.23180676 1.768193244934082 3.1265073514305186 +1088 6 6.01216745 0.012167453765869141 0.00014804693114456313 +1089 7 6.29614735 0.70385265350341797 0.49540855784380255 +1090 6 5.83192348 0.16807651519775391 0.0282497149610208 +1091 6 6.15303469 0.15303468704223633 0.023419615438115216 +1092 6 5.70561 0.29439020156860352 0.086665590779603008 +1093 7 6.08976 0.91024017333984375 0.8285371731617488 +1094 5 5.412741 0.41274118423461914 0.17035528516339582 +1095 8 6.758789 1.2412109375 1.5406045913696289 +1096 6 5.97093248 0.029067516326904297 0.00084492050541484787 +1097 7 6.06720972 0.93279027938842773 0.87009770532154107 +1098 6 6.07918739 0.079187393188476563 0.0062706432399863843 +1099 7 7.03807 0.038070201873779297 0.0014493402707103087 +1100 6 5.610572 0.38942813873291016 0.15165427523697872 +1101 6 6.43299437 0.43299436569213867 0.18748412072113751 +1102 5 5.85943174 0.85943174362182617 0.73862292194485235 +1103 5 5.10429573 0.10429573059082031 0.010877599419472972 +1104 5 4.8821125 0.11788749694824219 0.013897461936721811 +1105 7 6.770464 0.22953605651855469 0.052686801242089132 +1106 8 7.018562 0.98143815994262695 0.9632208617915694 +1107 7 6.98446751 0.015532493591308594 0.00024125835716404254 +1108 7 6.594719 0.40528106689453125 0.16425274318316951 +1109 4 4.91977644 0.91977643966674805 0.84598869896603901 +1110 7 6.98446751 0.015532493591308594 0.00024125835716404254 +1111 6 5.80645752 0.19354248046875 0.037458691745996475 +1112 6 5.579233 0.42076683044433594 0.17704472560217255 +1113 5 5.85607052 0.85607051849365234 0.73285673263399076 +1114 4 4.210546 0.21054601669311523 0.044329625145337559 +1115 8 6.52873039 1.4712696075439453 2.1646342580825149 +1116 5 4.93939924 0.060600757598876953 0.0036724518215578428 +1117 5 5.30673933 0.30673933029174805 0.094089016747830101 +1118 5 4.93939924 0.060600757598876953 0.0036724518215578428 +1119 5 5.132389 0.13238906860351563 0.017526865485706367 +1120 6 6.11902142 0.11902141571044922 0.014166097397719568 +1121 6 5.462161 0.53783893585205078 0.2892707209184664 +1122 7 7.01724672 0.017246723175048828 0.00029744946027676633 +1123 5 5.10792828 0.10792827606201172 0.011648512773717812 +1124 5 5.47876072 0.47876071929931641 0.22921182634399884 +1125 6 5.50789976 0.49210023880004883 0.24216264502706508 +1126 7 7.1118207 0.11182069778442383 0.012503868452995448 +1127 7 6.765686 0.23431396484375 0.054903034120798111 +1128 5 5.402971 0.40297079086303711 0.16238545828878159 +1129 7 6.556822 0.44317817687988281 0.1964068964625767 +1130 6 5.892219 0.10778093338012695 0.011616729600291364 +1131 6 5.73756075 0.26243925094604492 0.06887436043712114 +1132 5 5.37563229 0.37563228607177734 0.14109961433950957 +1133 5 5.6008687 0.60086870193481445 0.36104319696482889 +1134 5 5.608214 0.60821390151977539 0.36992415000190704 +1135 6 5.44677258 0.55322742462158203 0.30606058335342823 +1136 8 7.178051 0.82194900512695313 0.67560016702918801 +1137 8 6.969251 1.0307488441467285 1.0624431797098168 +1138 5 5.00738 0.0073800086975097656 5.4464528375319787E-05 +1139 5 5.977937 0.97793722152709961 0.9563612092481435 +1140 6 5.87731743 0.12268257141113281 0.015051013328047702 +1141 5 4.867375 0.13262510299682617 0.01758941794491875 +1142 5 5.00738 0.0073800086975097656 5.4464528375319787E-05 +1143 5 5.85505152 0.85505151748657227 0.73111309755609 +1144 5 5.85505152 0.85505151748657227 0.73111309755609 +1145 5 5.10958338 0.10958337783813477 0.012008516698415406 +1146 5 5.43428946 0.43428945541381836 0.18860733108363092 +1147 5 4.82746458 0.17253541946411133 0.029768470969656846 +1148 6 6.254219 0.25421905517578125 0.064627328014466912 +1149 5 5.412803 0.41280317306518555 0.17040645969268553 +1150 5 5.112308 0.11230802536010742 0.012613092560286532 +1151 5 5.10958338 0.10958337783813477 0.012008516698415406 +1152 4 4.478788 0.47878789901733398 0.2292378522454328 +1153 6 6.06767225 0.067672252655029297 0.0045795337794061197 +1154 4 5.525569 1.525568962097168 2.3273606581142303 +1155 4 5.83603525 1.8360352516174316 3.3710254451818855 +1156 6 5.705391 0.29460906982421875 0.086794504022691399 +1157 6 5.705391 0.29460906982421875 0.086794504022691399 +1158 6 5.613663 0.3863368034362793 0.14925612568936231 +1159 6 5.705391 0.29460906982421875 0.086794504022691399 +1160 6 6.03820658 0.038206577301025391 0.0014597425490592286 +1161 6 5.705391 0.29460906982421875 0.086794504022691399 +1162 7 5.89303446 1.1069655418395996 1.2253727108202384 +1163 6 5.613663 0.3863368034362793 0.14925612568936231 +1164 6 5.57107639 0.42892360687255859 0.18397546053256519 +1165 5 6.21637726 1.2163772583007813 1.4795736345113255 +1166 5 5.03993464 0.039934635162353516 0.0015947750855502818 +1167 6 5.658946 0.34105396270751953 0.11631780547850212 +1168 5 5.60502958 0.60502958297729492 0.3660607962776794 +1169 6 6.03820658 0.038206577301025391 0.0014597425490592286 +1170 6 5.52565 0.4743499755859375 0.2250078993383795 +1171 5 5.103544 0.10354423522949219 0.010721408649260411 +1172 6 5.77168846 0.22831153869628906 0.052126158701867098 +1173 5 5.65733957 0.65733957290649414 0.43209531410889213 +1174 6 6.049003 0.049003124237060547 0.0024013061849927908 +1175 5 5.524268 0.52426815032958984 0.27485709345000942 +1176 7 5.779589 1.2204108238220215 1.4894025789019452 +1177 6 5.1657753 0.83422470092773438 0.69593085163796786 +1178 5 5.137906 0.13790607452392578 0.019018085390598571 +1179 5 5.877721 0.87772083282470703 0.77039386037449731 +1180 5 5.103544 0.10354423522949219 0.010721408649260411 +1181 6 5.537969 0.46203088760375977 0.21347254109991809 +1182 5 5.65733957 0.65733957290649414 0.43209531410889213 +1183 6 5.982406 0.017593860626220703 0.00030954393173487915 +1184 7 7.129286 0.12928581237792969 0.016714821282221237 +1185 5 5.1653595 0.1653594970703125 0.027343763271346688 +1186 5 5.1552124 0.15521240234375 0.02409088984131813 +1187 8 6.62410975 1.3758902549743652 1.8930739937334238 +1188 6 6.0923624 0.092362403869628906 0.0085308136485764408 +1189 5 4.7566247 0.24337530136108398 0.059231537312598448 +1190 6 5.77168846 0.22831153869628906 0.052126158701867098 +1191 7 6.228344 0.77165603637695313 0.5954530384769896 +1192 6 5.88427734 0.11572265625 0.013391733169555664 +1193 7 6.62193251 0.3780674934387207 0.14293502959503712 +1194 6 5.724867 0.27513313293457031 0.075698240838391939 +1195 6 5.85270834 0.14729166030883789 0.021694833196534091 +1196 7 6.228344 0.77165603637695313 0.5954530384769896 +1197 7 6.62193251 0.3780674934387207 0.14293502959503712 +1198 6 5.88427734 0.11572265625 0.013391733169555664 +1199 7 5.937553 1.0624470710754395 1.1287937788367799 +1200 6 6.37769175 0.37769174575805664 0.1426510548137685 +1201 7 6.44489861 0.55510139465332031 0.30813755834606127 +1202 5 5.310828 0.31082820892333984 0.096614175462491403 +1203 6 5.63135147 0.36864852905273438 0.13590173797274474 +1204 6 5.63135147 0.36864852905273438 0.13590173797274474 +1205 5 4.72144365 0.27855634689331055 0.07759363839454636 +1206 6 5.289617 0.71038293838500977 0.50464391914852058 +1207 5 5.310828 0.31082820892333984 0.096614175462491403 +1208 6 6.11222935 0.11222934722900391 0.012595426379448327 +1209 6 6.17824745 0.17824745178222656 0.031772154066857183 +1210 6 5.282294 0.71770620346069336 0.51510219448596217 +1211 5 5.3563714 0.35637140274047852 0.12700057669121634 +1212 6 6.04702139 0.047021389007568359 0.0022110110242010705 +1213 6 5.63135147 0.36864852905273438 0.13590173797274474 +1214 6 5.363396 0.63660383224487305 0.40526443922885846 +1215 5 5.69043732 0.69043731689453125 0.47670368856051937 +1216 8 6.838419 1.1615810394287109 1.3492705111602845 +1217 5 4.86424255 0.1357574462890625 0.01843008422292769 +1218 8 6.467907 1.5320930480957031 2.3473091080231825 +1219 8 6.838419 1.1615810394287109 1.3492705111602845 +1220 6 5.6570406 0.34295940399169922 0.11762115278634155 +1221 7 6.91511154 0.084888458251953125 0.0072060503443935886 +1222 6 5.43544245 0.56455755233764648 0.31872522990147445 +1223 5 5.69043732 0.69043731689453125 0.47670368856051937 +1224 7 6.894313 0.10568714141845703 0.011169771861204936 +1225 6 6.245586 0.24558591842651367 0.060312443329394227 +1226 7 6.894313 0.10568714141845703 0.011169771861204936 +1227 5 6.100359 1.1003589630126953 1.2107898474823742 +1228 6 5.5494566 0.45054340362548828 0.20298935855043965 +1229 3 5.304199 2.30419921875 5.3093340396881104 +1230 6 5.946202 0.053798198699951172 0.002894246183359428 +1231 7 6.70273447 0.29726552963256836 0.088366795107731377 +1232 7 6.92535257 0.074647426605224609 0.0055722382987823948 +1233 6 6.646057 0.64605712890625 0.41738981381058693 +1234 6 6.09385824 0.093858242034912109 0.0088093695978841424 +1235 5 5.44398 0.44398021697998047 0.19711843306959054 +1236 6 6.245586 0.24558591842651367 0.060312443329394227 +1237 5 6.10185528 1.1018552780151367 1.2140850536898142 +1238 7 6.84097576 0.15902423858642578 0.02528870845799247 +1239 5 5.387145 0.38714504241943359 0.14988128386994504 +1240 6 5.8931427 0.1068572998046875 0.011418482521548867 +1241 7 6.54278 0.45722007751464844 0.20905019928250113 +1242 7 6.73510265 0.26489734649658203 0.070170604180930241 +1243 7 6.84097576 0.15902423858642578 0.02528870845799247 +1244 5 5.3529973 0.3529973030090332 0.1246070959316512 +1245 4 4.574822 0.57482194900512695 0.33042027305805277 +1246 7 5.863571 1.1364288330078125 1.2914704924914986 +1247 6 5.985528 0.014472007751464844 0.00020943900835845852 +1248 7 5.85182476 1.1481752395629883 1.3183063807455255 +1249 5 4.89960527 0.10039472579956055 0.010079100968368948 +1250 7 6.29567766 0.70432233810424805 0.4960699559526347 +1251 5 5.595309 0.59530878067016602 0.35439254434299983 +1252 6 5.614072 0.38592815399169922 0.14894054004344071 +1253 7 6.781205 0.21879482269287109 0.0478711744372049 +1254 5 5.56732273 0.56732273101806641 0.32185508112979733 +1255 6 5.882935 0.1170649528503418 0.013704203185852748 +1256 6 5.8892746 0.11072540283203125 0.012260114832315594 +1257 6 5.95164537 0.048354625701904297 0.0023381698267712636 +1258 6 5.41884851 0.58115148544311523 0.33773704903273938 +1259 6 5.756651 0.24334907531738281 0.059218772457825253 +1260 6 5.58933926 0.41066074371337891 0.16864224642722547 +1261 6 5.84502745 0.15497255325317383 0.024016492261807798 +1262 6 5.8892746 0.11072540283203125 0.012260114832315594 +1263 6 5.237282 0.76271820068359375 0.58173905365401879 +1264 5 5.38367939 0.38367938995361328 0.14720987427517684 +1265 7 6.2032733 0.79672670364379883 0.63477344029911364 +1266 8 6.718538 1.2814621925354004 1.6421453508976356 +1267 7 6.47745848 0.52254152297973633 0.27304964323798231 +1268 5 5.3250103 0.32501029968261719 0.10563169489978463 +1269 6 5.612442 0.3875579833984375 0.15020119049586356 +1270 7 6.47745848 0.52254152297973633 0.27304964323798231 +1271 5 5.10060358 0.10060358047485352 0.010121080404360328 +1272 5 5.27133226 0.2713322639465332 0.073621197458351162 +1273 5 5.10060358 0.10060358047485352 0.010121080404360328 +1274 6 5.612442 0.3875579833984375 0.15020119049586356 +1275 6 5.458334 0.54166603088378906 0.29340208901339793 +1276 7 6.47745848 0.52254152297973633 0.27304964323798231 +1277 5 5.3250103 0.32501029968261719 0.10563169489978463 +1278 6 5.51326656 0.48673343658447266 0.23690943828933086 +1279 6 5.76638126 0.23361873626708984 0.054577713935032079 +1280 6 6.193863 0.1938629150390625 0.037582829827442765 +1281 7 6.465979 0.53402090072631836 0.28517832241254837 +1282 5 4.972692 0.027307987213134766 0.00074572616563273186 +1283 8 7.43220043 0.56779956817626953 0.32239634962115815 +1284 7 6.465979 0.53402090072631836 0.28517832241254837 +1285 6 6.193863 0.1938629150390625 0.037582829827442765 +1286 7 6.305199 0.69480085372924805 0.48274822634289194 +1287 7 6.35717773 0.642822265625 0.41322046518325806 +1288 7 6.65708542 0.34291458129882813 0.1175904100673506 +1289 6 6.093326 0.093326091766357422 0.0087097594043825666 +1290 6 5.65154362 0.34845638275146484 0.12142185068023537 +1291 6 5.93934059 0.060659408569335938 0.0036795638479816262 +1292 6 6.11116362 0.11116361618041992 0.012357349562307718 +1293 4 5.20322227 1.2032222747802734 1.4477438425274158 +1294 4 5.20646429 1.2064642906188965 1.4555560845385571 +1295 6 5.93934059 0.060659408569335938 0.0036795638479816262 +1296 6 6.33243275 0.33243274688720703 0.11051153120297386 +1297 7 6.47113848 0.52886152267456055 0.27969451016565472 +1298 6 6.46381426 0.46381425857543945 0.21512366645788461 +1299 5 5.814402 0.81440210342407227 0.6632507860615533 +1300 6 5.65920353 0.34079647064208984 0.1161422344021048 +1301 5 6.145593 1.1455931663513184 1.3123837027908394 +1302 6 5.79424763 0.20575237274169922 0.042334038888839132 +1303 6 5.99417257 0.0058274269104003906 3.3958904396058642E-05 +1304 5 4.760337 0.23966312408447266 0.057438413045929337 +1305 7 5.967471 1.0325288772583008 1.0661158823722872 +1306 8 6.71653032 1.2834696769714355 1.6472944117051611 +1307 5 4.928889 0.071111202239990234 0.0050568030840167921 +1308 6 5.519699 0.4803009033203125 0.23068895773030818 +1309 6 5.25417376 0.74582624435424805 0.55625678676756252 +1310 6 5.555265 0.44473505020141602 0.19778926487765602 +1311 6 5.90800333 0.091996669769287109 0.0084633872486392647 +1312 5 5.37995148 0.37995147705078125 0.14436312491307035 +1313 5 4.78751326 0.21248674392700195 0.045150616344699301 +1314 6 5.3819623 0.61803770065307617 0.38197059942854139 +1315 6 5.965221 0.034779071807861328 0.0012095838358163746 +1316 6 6.133198 0.13319778442382813 0.01774164977541659 +1317 5 5.727461 0.72746086120605469 0.52919930458665476 +1318 6 5.96416569 0.035834312438964844 0.0012840979479733505 +1319 5 5.315215 0.31521511077880859 0.099360566063296574 +1320 6 5.53202772 0.4679722785949707 0.21899805353336887 +1321 6 6.27661276 0.27661275863647461 0.076514618240480559 +1322 6 5.9950614 0.0049386024475097656 2.4389794134549447E-05 +1323 5 5.63579941 0.63579940795898438 0.40424088716099504 +1324 6 5.84845543 0.15154457092285156 0.022965756976191187 +1325 7 6.57000828 0.42999172210693359 0.1848928810804864 +1326 6 5.332149 0.66785097122192383 0.44602491976206693 +1327 6 5.70322227 0.29677772521972656 0.088077018186595524 +1328 6 6.19832325 0.19832324981689453 0.039332111417934357 +1329 5 5.24106073 0.24106073379516602 0.058110277377863895 +1330 5 5.275782 0.27578210830688477 0.076055771262190319 +1331 6 5.9980464 0.0019536018371582031 3.8165601381479064E-06 +1332 7 6.28721142 0.71278858184814453 0.50806756241308904 +1333 8 7.208517 0.79148292541503906 0.62644522122354829 +1334 6 5.80906248 0.19093751907348633 0.036457136189937955 +1335 6 5.53973341 0.4602665901184082 0.21184533397922678 +1336 8 6.56598568 1.4340143203735352 2.0563970710363719 +1337 5 5.58535767 0.585357666015625 0.34264359716325998 +1338 5 5.58535767 0.585357666015625 0.34264359716325998 +1339 6 5.59666157 0.40333843231201172 0.16268189097991126 +1340 6 5.68894053 0.31105947494506836 0.09675799695310161 +1341 5 5.024909 0.024909019470214844 0.00062045925096754218 +1342 6 5.59666157 0.40333843231201172 0.16268189097991126 +1343 6 5.52039242 0.47960758209228516 0.23002343280040805 +1344 8 6.76283932 1.2371606826782227 1.5305665547648459 +1345 8 7.29672575 0.70327425003051758 0.49459467075598695 +1346 7 6.62656832 0.37343168258666992 0.1394512215595114 +1347 7 6.4981637 0.50183629989624023 0.25183967189354917 +1348 8 6.56598568 1.4340143203735352 2.0563970710363719 +1349 4 4.51300955 0.51300954818725586 0.26317879653129239 +1350 7 6.694145 0.30585479736328125 0.093547157070133835 +1351 7 6.78723574 0.21276426315307617 0.045268631675071447 +1352 6 5.53973341 0.4602665901184082 0.21184533397922678 +1353 5 5.58535767 0.585357666015625 0.34264359716325998 +1354 5 5.855622 0.8556218147277832 0.73208868983806497 +1355 5 5.634065 0.63406515121459961 0.40203861598479307 +1356 6 5.88986158 0.1101384162902832 0.01213047074293172 +1357 6 5.48553562 0.51446437835693359 0.26467359659818612 +1358 8 6.64505959 1.3549404144287109 1.8358635266522469 +1359 7 6.36494541 0.63505458831787109 0.40329433014358074 +1360 6 6.15028334 0.1502833366394043 0.022585081271472518 +1361 7 6.441375 0.55862522125244141 0.31206213781933911 +1362 7 6.15109444 0.84890556335449219 0.72064065549420775 +1363 4 4.86845255 0.86845254898071289 0.75420982983109752 +1364 5 5.634065 0.63406515121459961 0.40203861598479307 +1365 7 6.202309 0.79769086837768555 0.63631072149314605 +1366 6 6.18606329 0.18606328964233398 0.034619547752527069 +1367 5 5.06025934 0.060259342193603516 0.003631188321605805 +1368 6 5.88986158 0.1101384162902832 0.01213047074293172 +1369 5 5.00331259 0.0033125877380371094 1.0973237522193813E-05 +1370 6 5.57671547 0.42328453063964844 0.17916979387882748 +1371 7 6.227106 0.77289390563964844 0.59736498937490978 +1372 6 5.65561247 0.34438753128051758 0.11860277170148947 +1373 6 5.65561247 0.34438753128051758 0.11860277170148947 +1374 7 6.524151 0.47584915161132813 0.22643241508922074 +1375 7 6.52171946 0.47828054428100586 0.22875227903773521 +1376 6 5.316654 0.68334579467773438 0.46696147510374431 +1377 6 5.37147141 0.62852859497070313 0.39504819469584618 +1378 7 6.430662 0.56933784484863281 0.32414558157688589 +1379 6 5.082979 0.91702079772949219 0.84092714346843422 +1380 7 6.746756 0.25324392318725586 0.064132484631272746 +1381 7 6.964511 0.035489082336425781 0.0012594749650816084 +1382 6 5.17345047 0.82654953002929688 0.68318412559165154 +1383 6 5.44885063 0.55114936828613281 0.30376562616220326 +1384 6 5.353897 0.6461029052734375 0.41744896420277655 +1385 5 5.214962 0.21496200561523438 0.046208663858124055 +1386 7 6.70045853 0.29954147338867188 0.089725094279856421 +1387 6 6.51349 0.51349020004272461 0.26367218553991734 +1388 7 6.2468257 0.7531743049621582 0.56727153365523009 +1389 6 5.64481068 0.35518932342529297 0.12615945547531737 +1390 6 5.88739872 0.11260128021240234 0.012679048305471952 +1391 6 6.315742 0.31574201583862305 0.099693020565837287 +1392 6 6.51349 0.51349020004272461 0.26367218553991734 +1393 6 5.75668669 0.24331331253051758 0.059201368054573322 +1394 7 6.70045853 0.29954147338867188 0.089725094279856421 +1395 7 6.47507143 0.52492856979370117 0.2755500033856606 +1396 7 6.2468257 0.7531743049621582 0.56727153365523009 +1397 7 6.46521664 0.53478336334228516 0.28599324570768658 +1398 7 6.46521664 0.53478336334228516 0.28599324570768658 +1399 6 6.17105865 0.17105865478515625 0.029261063376907259 +1400 7 6.46521664 0.53478336334228516 0.28599324570768658 +1401 6 5.33331 0.66668987274169922 0.4444753864163431 +1402 8 6.738231 1.2617688179016113 1.5920605498288296 +1403 8 6.82005262 1.1799473762512207 1.3922758107221398 +1404 5 5.197244 0.19724416732788086 0.038905261544869063 +1405 4 4.788163 0.78816318511962891 0.62120120637791842 +1406 8 5.997945 2.0020551681518555 4.0082248963235543 +1407 6 6.16638 0.16637992858886719 0.027682280637236545 +1408 7 6.46521664 0.53478336334228516 0.28599324570768658 +1409 6 5.84087849 0.15912151336669922 0.025319656016108638 +1410 6 6.91486263 0.91486263275146484 0.83697363680494163 +1411 6 6.17105865 0.17105865478515625 0.029261063376907259 +1412 8 6.925897 1.0741028785705566 1.1536969937535559 +1413 6 5.74678326 0.25321674346923828 0.064118719173166028 +1414 6 6.30511141 0.30511140823364258 0.093092971434316496 +1415 5 4.77416 0.22584009170532227 0.051003747021468371 +1416 6 5.730961 0.26903915405273438 0.072382066413410939 +1417 3 3.87556767 0.87556767463684082 0.76661875286896475 +1418 5 5.128478 0.12847805023193359 0.016506609391399252 +1419 7 5.832464 1.1675357818603516 1.3631398019242624 +1420 4 5.022509 1.0225090980529785 1.0455248556011156 +1421 6 6.31783152 0.31783151626586914 0.10101687273186144 +1422 5 5.643516 0.64351606369018555 0.41411292422731094 +1423 4 4.68935776 0.68935775756835938 0.47521411791967694 +1424 6 5.74678326 0.25321674346923828 0.064118719173166028 +1425 6 5.866952 0.13304805755615234 0.017701785619465227 +1426 6 6.1267 0.12669992446899414 0.01605287086044882 +1427 5 5.5781126 0.57811260223388672 0.33421418086163612 +1428 7 6.30638742 0.69361257553100586 0.48109840493475531 +1429 5 5.425704 0.42570400238037109 0.181223897642667 +1430 4 4.59027672 0.59027671813964844 0.34842660397771397 +1431 5 5.425704 0.42570400238037109 0.181223897642667 +1432 7 6.45146465 0.54853534698486328 0.30089102689180436 +1433 6 6.12620735 0.12620735168457031 0.015928295619232813 +1434 5 5.5781126 0.57811260223388672 0.33421418086163612 +1435 5 5.358219 0.35821914672851563 0.12832095708290581 +1436 5 4.74604464 0.25395536422729492 0.064493327019818025 +1437 7 6.30638742 0.69361257553100586 0.48109840493475531 +1438 5 5.376018 0.37601804733276367 0.1413895719199445 +1439 5 5.31217 0.31217002868652344 0.097450126810144866 +1440 5 5.34141731 0.34141731262207031 0.11656578135807649 +1441 5 5.31631041 0.31631040573120117 0.1000522727738371 +1442 5 5.239716 0.2397160530090332 0.057463786070229617 +1443 6 6.53284931 0.53284931182861328 0.28392838911622675 +1444 6 6.13901567 0.13901567459106445 0.019325357782008723 +1445 6 6.249914 0.24991416931152344 0.062457092022668803 +1446 6 6.32129574 0.32129573822021484 0.10323095139847283 +1447 6 5.96523571 0.034764289855957031 0.0012085558491889969 +1448 6 5.96523571 0.034764289855957031 0.0012085558491889969 +1449 6 6.238419 0.2384190559387207 0.056843646234710832 +1450 6 6.13901567 0.13901567459106445 0.019325357782008723 +1451 5 4.972824 0.0271759033203125 0.00073852972127497196 +1452 6 6.13901567 0.13901567459106445 0.019325357782008723 +1453 7 6.924468 0.075531959533691406 0.0057050769109991961 +1454 5 5.481235 0.48123502731323242 0.23158715151316756 +1455 5 5.152508 0.15250778198242188 0.023258623565197922 +1456 6 6.32129574 0.32129573822021484 0.10323095139847283 +1457 6 6.249914 0.24991416931152344 0.062457092022668803 +1458 6 6.5971756 0.59717559814453125 0.35661869501927868 +1459 6 6.099336 0.099336147308349609 0.0098676701620661333 +1460 6 6.1909585 0.19095849990844727 0.036465148687284454 +1461 6 6.055593 0.055593013763427734 0.0030905831793006655 +1462 6 5.96523571 0.034764289855957031 0.0012085558491889969 +1463 6 5.404578 0.59542179107666016 0.35452710928893794 +1464 8 7.21596861 0.78403139114379883 0.61470522229888047 +1465 5 5.483042 0.48304176330566406 0.23332934509744518 +1466 6 6.238419 0.2384190559387207 0.056843646234710832 +1467 7 6.716609 0.28339099884033203 0.080310458223721071 +1468 5 5.373811 0.37381076812744141 0.13973449036802776 +1469 5 4.972824 0.0271759033203125 0.00073852972127497196 +1470 7 6.924468 0.075531959533691406 0.0057050769109991961 +1471 6 6.13901567 0.13901567459106445 0.019325357782008723 +1472 5 4.685822 0.3141779899597168 0.098707809375127908 +1473 6 6.3247633 0.32476329803466797 0.10547119975035457 +1474 4 4.968365 0.96836519241333008 0.93773114587770579 +1475 6 5.644989 0.355010986328125 0.12603280041366816 +1476 5 5.26950741 0.26950740814208984 0.072634243043466995 +1477 6 5.090542 0.90945816040039063 0.82711414551886264 +1478 6 5.942869 0.057130813598632813 0.0032639298624417279 +1479 6 5.958142 0.041858196258544922 0.0017521085940188641 +1480 6 5.644989 0.355010986328125 0.12603280041366816 +1481 6 5.81158543 0.18841457366943359 0.035500051571034419 +1482 6 5.731278 0.2687220573425293 0.072211544102401604 +1483 4 4.968365 0.96836519241333008 0.93773114587770579 +1484 3 4.72003746 1.7200374603271484 2.9585288649286667 +1485 6 5.74980974 0.25019025802612305 0.062595165211178028 +1486 6 6.04464531 0.044645309448242188 0.0019932036557293031 +1487 6 5.584739 0.41526079177856445 0.17244152518856026 +1488 6 5.4774065 0.52259349822998047 0.2731039643922486 +1489 5 5.54700565 0.54700565338134766 0.29921518483115506 +1490 6 6.117487 0.11748695373535156 0.013803184298012638 +1491 5 5.28033733 0.28033733367919922 0.078589020654362685 +1492 5 5.511872 0.5118718147277832 0.26201275471271401 +1493 8 7.21298552 0.78701448440551758 0.61939179866408267 +1494 8 6.91919661 1.080803394317627 1.1681359771685038 +1495 7 6.89 0.1100001335144043 0.012100029373186771 +1496 5 4.47227573 0.52772426605224609 0.27849290098038182 +1497 7 6.363376 0.63662385940551758 0.40528993836437621 +1498 6 6.229407 0.22940683364868164 0.052627495324713891 +1499 6 6.32839346 0.32839345932006836 0.10784226412420139 +1500 7 6.508002 0.49199819564819336 0.24206222452107795 +1501 5 5.62988043 0.62988042831420898 0.39674935397329136 +1502 5 5.25582027 0.25582027435302734 0.06544401277005818 +1503 7 6.683228 0.3167719841003418 0.1003444899108672 +1504 8 6.89950371 1.1004962921142578 1.2110920889572299 +1505 7 5.938468 1.0615320205688477 1.1268502306929804 +1506 6 5.97229433 0.027705669403076172 0.00076760411707255116 +1507 6 5.688956 0.31104421615600586 0.096748504404104096 +1508 6 5.87291145 0.12708854675292969 0.016151498715771595 +1509 5 5.75635767 0.75635766983032227 0.57207692471115479 +1510 5 5.488938 0.4889378547668457 0.2390602258240051 +1511 6 5.843129 0.15687084197998047 0.024608461063508003 +1512 7 6.549167 0.45083284378051758 0.20325025303122857 +1513 6 6.254115 0.25411510467529297 0.064574486424135102 +1514 7 6.508002 0.49199819564819336 0.24206222452107795 +1515 6 6.25105858 0.25105857849121094 0.063030409834027523 +1516 6 6.023645 0.023644924163818359 0.00055908243871272134 +1517 6 5.769742 0.23025798797607422 0.053018741026789939 +1518 6 6.08221436 0.08221435546875 0.006759200245141983 +1519 5 5.62988043 0.62988042831420898 0.39674935397329136 +1520 6 5.637359 0.3626408576965332 0.13150839167087724 +1521 5 5.25582027 0.25582027435302734 0.06544401277005818 +1522 5 5.9717474 0.97174739837646484 0.94429300625142787 +1523 6 5.85238028 0.14761972427368164 0.021791582994637793 +1524 6 5.722701 0.27729892730712891 0.076894695085684361 +1525 5 5.175857 0.1758570671081543 0.030925708051881884 +1526 6 5.79728031 0.20271968841552734 0.041095272071288491 +1527 6 6.118867 0.11886692047119141 0.014129344782304543 +1528 6 5.967835 0.032165050506591797 0.0010345904740916012 +1529 6 5.722701 0.27729892730712891 0.076894695085684361 +1530 5 5.175857 0.1758570671081543 0.030925708051881884 +1531 7 6.23848534 0.76151466369628906 0.57990458302447223 +1532 7 6.21835041 0.78164958953857422 0.61097608082582155 +1533 6 6.054538 0.054537773132324219 0.0029743686982328654 +1534 6 6.03214836 0.032148361206054688 0.001033517128234962 +1535 6 6.021887 0.021886825561523438 0.00047903313316055574 +1536 5 4.937884 0.062116146087646484 0.0038584156047818396 +1537 6 5.64776373 0.35223627090454102 0.12407039054073721 +1538 6 5.63121843 0.36878156661987305 0.13599984387860786 +1539 6 6.054538 0.054537773132324219 0.0029743686982328654 +1540 6 6.03214836 0.032148361206054688 0.001033517128234962 +1541 4 4.78551245 0.78551244735717773 0.61702980495306292 +1542 6 6.13340139 0.13340139389038086 0.017795931891896544 +1543 6 6.26117373 0.26117372512817383 0.068211714697326897 +1544 5 4.937884 0.062116146087646484 0.0038584156047818396 +1545 6 6.10239172 0.10239171981811523 0.010484064287311412 +1546 6 5.70011139 0.29988861083984375 0.08993317891145125 +1547 6 5.70011139 0.29988861083984375 0.08993317891145125 +1548 6 6.932836 0.93283605575561523 0.87018310691769329 +1549 6 6.021887 0.021886825561523438 0.00047903313316055574 +1550 6 6.09009027 0.090090274810791016 0.0081162576154838462 +1551 6 5.807327 0.1926732063293457 0.037122964437230621 +1552 7 6.95572 0.044280052185058594 0.0019607230215115123 +1553 7 6.56591129 0.43408870697021484 0.18843300551907305 +1554 7 6.32974529 0.67025470733642578 0.44924137270663778 +1555 7 6.827229 0.17277097702026367 0.029849810500536478 +1556 6 5.97219038 0.027809619903564453 0.00077337495918072818 +1557 6 6.09009027 0.090090274810791016 0.0081162576154838462 +1558 4 5.05523 1.0552301406860352 1.1135106498122695 +1559 4 4.55122566 0.55122566223144531 0.30384973070249544 +1560 6 6.44468355 0.44468355178833008 0.19774346123108444 +1561 5 4.740227 0.25977277755737305 0.067481895959872418 +1562 7 7.064521 0.064520835876464844 0.0041629382621977129 +1563 6 6.44468355 0.44468355178833008 0.19774346123108444 +1564 5 4.740227 0.25977277755737305 0.067481895959872418 +1565 6 6.068884 0.068883895874023438 0.0047449911107833032 +1566 5 5.817742 0.81774187088012695 0.66870176739053022 +1567 5 5.55821562 0.55821561813354492 0.31160467632821565 +1568 6 5.69551039 0.3044896125793457 0.092713924168720041 +1569 5 5.243182 0.24318218231201172 0.059137573794032505 +1570 5 5.32225132 0.32225131988525391 0.10384591316778824 +1571 6 5.69551039 0.3044896125793457 0.092713924168720041 +1572 6 5.98878431 0.011215686798095703 0.00012579163035297825 +1573 5 5.653162 0.65316200256347656 0.42662060159273096 +1574 4 5.28284025 1.2828402519226074 1.6456791119528589 +1575 6 5.921736 0.078264236450195313 0.0061252907071320806 +1576 6 5.4334197 0.56658029556274414 0.32101323131996651 +1577 4 4.55412769 0.55412769317626953 0.30705750034485391 +1578 5 5.47052336 0.47052335739135742 0.22139222985083507 +1579 4 4.95065 0.95065021514892578 0.90373583156269888 +1580 5 4.83012533 0.16987466812133789 0.028857402869334692 +1581 6 5.79309464 0.20690536499023438 0.042809830061742105 +1582 7 6.382326 0.61767387390136719 0.38152101450032205 +1583 5 5.47052336 0.47052335739135742 0.22139222985083507 +1584 6 5.36747742 0.6325225830078125 0.40008481801487505 +1585 5 5.183105 0.1831049919128418 0.03352743806340186 +1586 5 5.07949257 0.079492568969726563 0.0063190685214067344 +1587 6 5.36747742 0.6325225830078125 0.40008481801487505 +1588 5 5.183105 0.1831049919128418 0.03352743806340186 +1589 6 6.20743036 0.20743036270141602 0.043027355370441001 +1590 6 6.254276 0.25427579879760742 0.064656181854161332 +1591 6 6.23296738 0.23296737670898438 0.054273798610665835 +1592 6 5.70682764 0.29317235946655273 0.085950032355185613 +1593 6 5.682406 0.31759405136108398 0.10086598145994685 +1594 6 5.50038338 0.49961662292480469 0.24961676990278647 +1595 6 5.378048 0.62195205688476563 0.38682436106319074 +1596 5 5.471547 0.47154712677001953 0.22235669276506087 +1597 6 5.378048 0.62195205688476563 0.38682436106319074 +1598 6 5.786599 0.21340084075927734 0.045539918836766446 +1599 6 5.995114 0.0048861503601074219 2.3874465341577888E-05 +1600 6 5.50038338 0.49961662292480469 0.24961676990278647 +1601 6 5.7212 0.27880001068115234 0.077729445955810661 +1602 5 6.388898 1.3888978958129883 1.9290373649937465 +1603 7 6.34934 0.65066003799438477 0.42335848504285423 +1604 5 5.23386431 0.23386430740356445 0.054692514277348891 +1605 9 7.51498842 1.4850115776062012 2.2052593856244584 +1606 6 6.256978 0.25697803497314453 0.066037710458658694 +1607 7 6.41602325 0.58397674560546875 0.34102883940795437 +1608 5 5.227486 0.22748613357543945 0.051749940969102681 +1609 7 6.09239149 0.9076085090637207 0.82375320572486999 +1610 6 6.256978 0.25697803497314453 0.066037710458658694 +1611 6 5.482277 0.51772308349609375 0.26803719118470326 +1612 7 6.301487 0.69851303100585938 0.48792045448499266 +1613 7 6.70857239 0.2914276123046875 0.084930053213611245 +1614 5 5.67042351 0.67042350769042969 0.44946767966393963 +1615 6 6.16949129 0.16949129104614258 0.028727297740488211 +1616 6 5.23981476 0.76018524169921875 0.57788160169729963 +1617 6 5.620055 0.37994480133056641 0.14435805205812358 +1618 6 5.42863655 0.57136344909667969 0.32645619096365408 +1619 8 7.24344873 0.75655126571655273 0.57236981765731798 +1620 7 6.301487 0.69851303100585938 0.48792045448499266 +1621 5 4.877641 0.12235879898071289 0.014971675688002506 +1622 6 5.1973033 0.80269670486450195 0.64432200000032935 +1623 6 6.01609564 0.016095638275146484 0.00025906957148436049 +1624 7 6.30074549 0.69925451278686523 0.48895687365279628 +1625 6 5.95052862 0.049471378326416016 0.0024474172735153843 +1626 6 5.89849854 0.10150146484375 0.010302547365427017 +1627 5 4.877641 0.12235879898071289 0.014971675688002506 +1628 6 5.86008358 0.13991641998291016 0.0195766045808341 +1629 6 5.651425 0.34857511520385742 0.12150461093938247 +1630 5 5.21269 0.21268987655639648 0.045236983589575175 +1631 6 5.86008358 0.13991641998291016 0.0195766045808341 +1632 8 7.2880435 0.71195650100708008 0.50688205932624442 +1633 7 6.217728 0.7822718620300293 0.61194926612392919 +1634 6 5.67150831 0.3284916877746582 0.10790678893704353 +1635 6 5.516388 0.483612060546875 0.23388062510639429 +1636 5 5.21493769 0.21493768692016602 0.046198209258591305 +1637 6 6.02342 0.023419857025146484 0.00054848970307830314 +1638 5 5.076503 0.076502799987792969 0.0058526784059722559 +1639 5 5.92867231 0.92867231369018555 0.86243226621468239 +1640 5 5.21493769 0.21493768692016602 0.046198209258591305 +1641 6 5.908219 0.091781139373779297 0.0084237775447491003 +1642 7 6.565082 0.43491792678833008 0.18915360304185924 +1643 7 5.79451656 1.2054834365844727 1.4531903158795103 +1644 7 6.565082 0.43491792678833008 0.18915360304185924 +1645 7 6.00915 0.99084997177124023 0.98178366655906757 +1646 6 5.908219 0.091781139373779297 0.0084237775447491003 +1647 7 6.117744 0.88225603103637695 0.77837570430006053 +1648 5 5.75815058 0.75815057754516602 0.57479229823206879 +1649 4 4.91885138 0.91885137557983398 0.84428785040495313 +1650 7 6.6463275 0.35367250442504883 0.12508424038628618 +1651 6 5.18333 0.81666994094848633 0.66694979244880415 +1652 4 5.41829157 1.4182915687561035 2.0115509740046491 +1653 6 5.86178446 0.13821554183959961 0.01910353600601411 +1654 5 5.20454645 0.20454645156860352 0.041839250849307064 +1655 5 5.36041641 0.36041641235351563 0.12989999029377941 +1656 5 5.37715673 0.37715673446655273 0.14224720235347377 +1657 6 6.272336 0.27233600616455078 0.074166900253658241 +1658 5 5.17258549 0.17258548736572266 0.029785750449264015 +1659 5 5.2393117 0.23931169509887695 0.057270087411097848 +1660 6 5.30503654 0.69496345520019531 0.48297420406379388 +1661 6 5.5524416 0.44755840301513672 0.20030852410945954 +1662 7 6.02084 0.97915983200073242 0.95875397660370254 +1663 6 5.86178446 0.13821554183959961 0.01910353600601411 +1664 4 5.09628 1.0962800979614258 1.2018300531863133 +1665 8 7.22773361 0.77226638793945313 0.59639537394104991 +1666 5 4.93944645 0.060553550720214844 0.0036667325048256316 +1667 6 5.8606534 0.13934659957885742 0.019417474814190427 +1668 7 6.10476971 0.89523029327392578 0.80143727799531916 +1669 6 5.03797865 0.9620213508605957 0.92548507951164538 +1670 6 5.59164524 0.40835475921630859 0.16675360937460937 +1671 7 6.882999 0.11700105667114258 0.013689247262163917 +1672 5 5.59216356 0.5921635627746582 0.35065768507797657 +1673 5 5.51849842 0.51849842071533203 0.26884061228429346 +1674 6 5.934598 0.065402030944824219 0.0042774256517077447 +1675 5 5.248185 0.24818515777587891 0.061595872540237906 +1676 7 6.882999 0.11700105667114258 0.013689247262163917 +1677 6 6.154132 0.15413188934326172 0.023756639312523475 +1678 6 6.01720238 0.017202377319335938 0.00029592178543680348 +1679 5 5.416397 0.4163970947265625 0.17338654049672186 +1680 5 5.22387362 0.22387361526489258 0.050119395611773143 +1681 6 6.222181 0.22218084335327148 0.049364327153170962 +1682 7 6.552593 0.44740676879882813 0.20017281676700804 +1683 7 6.552593 0.44740676879882813 0.20017281676700804 +1684 7 6.147742 0.85225820541381836 0.72634404869518221 +1685 7 6.552593 0.44740676879882813 0.20017281676700804 +1686 5 5.913256 0.91325616836547852 0.83403682905759524 +1687 7 6.147742 0.85225820541381836 0.72634404869518221 +1688 3 4.05032873 1.0503287315368652 1.1031904442918403 +1689 6 6.512403 0.51240301132202148 0.26255684601187568 +1690 4 4.340952 0.34095191955566406 0.11624821144869202 +1691 7 6.552593 0.44740676879882813 0.20017281676700804 +1692 6 6.273069 0.27306890487670898 0.07456662681056514 +1693 5 5.412921 0.41292095184326172 0.17050371247114526 +1694 6 5.885221 0.11477899551391602 0.013174217811183553 +1695 6 6.52959633 0.52959632873535156 0.28047227140996256 +1696 6 5.40495539 0.59504461288452148 0.35407809132289003 +1697 6 6.019387 0.019386768341064453 0.00037584678671009897 +1698 6 6.273069 0.27306890487670898 0.07456662681056514 +1699 6 6.10461664 0.10461664199829102 0.010944641782998588 +1700 6 5.73511171 0.26488828659057617 0.070165804372891216 +1701 5 5.65722847 0.65722846984863281 0.43194926157957525 +1702 4 4.538543 0.5385432243347168 0.2900288044768331 +1703 5 5.31020069 0.31020069122314453 0.096224468835316657 +1704 5 5.31020069 0.31020069122314453 0.096224468835316657 +1705 6 6.40745354 0.40745353698730469 0.16601838480346487 +1706 6 6.12257051 0.12257051467895508 0.015023531068663942 +1707 5 5.19459629 0.19459629058837891 0.037867716310756805 +1708 4 4.698 0.69799995422363281 0.4872039360961935 +1709 5 5.6977067 0.69770669937133789 0.48679463834764647 +1710 5 5.070458 0.070457935333251953 0.004964320651424714 +1711 5 6.22978067 1.2297806739807129 1.5123605060964564 +1712 6 5.730933 0.26906681060791016 0.072396948570712993 +1713 6 5.36452341 0.63547658920288086 0.40383049542492699 +1714 5 5.384505 0.38450479507446289 0.1478439374352547 +1715 8 7.081153 0.91884708404541016 0.84427996385875304 +1716 6 6.10853767 0.10853767395019531 0.011780426666518906 +1717 6 5.4734683 0.52653169631958008 0.2772356272291745 +1718 4 4.947448 0.94744777679443359 0.89765728975271486 +1719 6 5.783446 0.21655416488647461 0.046895706329678433 +1720 7 6.25786257 0.74213743209838867 0.55076796812159046 +1721 7 6.4139185 0.58608150482177734 0.34349153029415902 +1722 6 6.32412243 0.32412242889404297 0.10505534891217394 +1723 8 7.081153 0.91884708404541016 0.84427996385875304 +1724 6 6.30066347 0.30066347122192383 0.090398522927216618 +1725 6 5.754034 0.24596595764160156 0.060499252318550134 +1726 6 6.520613 0.52061319351196289 0.27103809725872452 +1727 6 5.98238945 0.017610549926757813 0.0003101314687228296 +1728 5 5.384505 0.38450479507446289 0.1478439374352547 +1729 6 6.46460056 0.46460056304931641 0.21585368318574183 +1730 6 5.518448 0.4815521240234375 0.23189244815148413 +1731 6 5.678014 0.32198619842529297 0.10367511197637214 +1732 5 5.49025154 0.49025154113769531 0.24034657358788536 +1733 6 5.878735 0.12126493453979492 0.014705184348940747 +1734 6 5.746217 0.25378322601318359 0.064405925805658626 +1735 6 6.333721 0.33372116088867188 0.11136981322488282 +1736 5 5.36819935 0.36819934844970703 0.13557076019878878 +1737 6 5.746217 0.25378322601318359 0.064405925805658626 +1738 5 5.43976355 0.43976354598999023 0.19339197638169026 +1739 4 4.2871747 0.28717470169067383 0.082469309291127502 +1740 6 5.2528553 0.74714469909667969 0.55822520138826803 +1741 6 6.82206631 0.82206630706787109 0.67579301321620733 +1742 6 5.62115145 0.37884855270385742 0.14352622588580743 +1743 6 5.6809206 0.31907939910888672 0.10181166293568822 +1744 5 5.759692 0.75969219207763672 0.57713222670372488 +1745 5 5.11411858 0.11411857604980469 0.013023049399635056 +1746 5 5.80971241 0.80971240997314453 0.65563418686451769 +1747 6 5.6809206 0.31907939910888672 0.10181166293568822 +1748 5 5.64571142 0.64571142196655273 0.41694324045806752 +1749 6 5.94423151 0.055768489837646484 0.0031101244587716792 +1750 6 6.285816 0.28581619262695313 0.081690895967767574 +1751 7 6.485704 0.51429605484008789 0.26450043202407869 +1752 6 5.63064766 0.36935234069824219 0.13642115157927037 +1753 7 6.43418837 0.5658116340637207 0.32014280524185779 +1754 6 6.579439 0.57943916320800781 0.33574974385919631 +1755 6 5.62115145 0.37884855270385742 0.14352622588580743 +1756 5 5.163484 0.16348409652709961 0.026727049817282023 +1757 5 5.04545259 0.045452594757080078 0.0020659383701513434 +1758 5 5.160804 0.16080379486083984 0.025857860441647063 +1759 5 5.12348461 0.12348461151123047 0.015248449280079512 +1760 6 5.661794 0.33820581436157227 0.11438317286797428 +1761 6 5.71764851 0.28235149383544922 0.079722366071109718 +1762 7 6.49546671 0.50453329086303711 0.25455384158908601 +1763 6 5.75959873 0.24040126800537109 0.057792769658590259 +1764 5 5.163484 0.16348409652709961 0.026727049817282023 +1765 5 5.04545259 0.045452594757080078 0.0020659383701513434 +1766 5 5.096784 0.096784114837646484 0.0093671648849067424 +1767 5 5.053221 0.053221225738525391 0.0028324988691110775 +1768 5 5.07901 0.079010009765625 0.0062425816431641579 +1769 7 6.85152245 0.14847755432128906 0.022045584137231344 +1770 6 5.873308 0.12669181823730469 0.016050816808274249 +1771 6 6.204919 0.20491886138916016 0.041991739753029833 +1772 6 5.873308 0.12669181823730469 0.016050816808274249 +1773 6 5.873308 0.12669181823730469 0.016050816808274249 +1774 6 6.087834 0.087833881378173828 0.0077147907179551112 +1775 6 6.2735157 0.27351570129394531 0.074810838854318717 +1776 5 5.410328 0.41032791137695313 0.1683689948549727 +1777 6 6.204919 0.20491886138916016 0.041991739753029833 +1778 8 7.307756 0.69224405288696289 0.47920182875736828 +1779 8 7.307756 0.69224405288696289 0.47920182875736828 +1780 5 5.72046137 0.72046136856079102 0.51906458358848795 +1781 4 4.912416 0.91241598129272461 0.83250292291836558 +1782 6 6.076927 0.07692718505859375 0.0059177918010391295 +1783 6 4.881966 1.1180338859558105 1.2499997701454504 +1784 7 6.59484243 0.40515756607055664 0.16415265334421747 +1785 6 6.076927 0.07692718505859375 0.0059177918010391295 +1786 7 6.360997 0.63900279998779297 0.40832457839223935 +1787 7 7.01656771 0.016567707061767578 0.00027448891728454328 +1788 5 6.143606 1.1436061859130859 1.3078351084586757 +1789 7 6.33957958 0.66042041778564453 0.43615512822816527 +1790 5 5.29969263 0.29969263076782227 0.089815672936538249 +1791 5 5.249451 0.2494511604309082 0.062225881440326702 +1792 6 5.723403 0.27659702301025391 0.076505913138134929 +1793 5 5.207859 0.20785903930664063 0.043205380221479572 +1794 5 5.19692469 0.19692468643188477 0.03877933212629614 +1795 6 5.24541235 0.75458765029907227 0.56940252198387498 +1796 5 6.265488 1.2654881477355957 1.6014602520592689 +1797 8 6.965482 1.034517765045166 1.0702270061940453 +1798 6 5.884701 0.11529922485351563 0.013293911251821555 +1799 6 5.82440472 0.17559528350830078 0.030833703590360528 +1800 6 5.29319572 0.70680427551269531 0.4995722838830261 +1801 5 4.91377449 0.086225509643554688 0.0074348385132907424 +1802 6 5.884701 0.11529922485351563 0.013293911251821555 +1803 6 5.82440472 0.17559528350830078 0.030833703590360528 +1804 6 5.29319572 0.70680427551269531 0.4995722838830261 +1805 5 5.04264 0.042640209197998047 0.0018181874404490372 +1806 5 5.02612352 0.026123523712158203 0.00068243849113969191 +1807 6 6.09280062 0.092800617218017578 0.0086119545560450206 +1808 5 5.04264 0.042640209197998047 0.0018181874404490372 +1809 6 6.09280062 0.092800617218017578 0.0086119545560450206 +1810 6 5.255104 0.74489593505859375 0.55486995406681672 +1811 5 5.02612352 0.026123523712158203 0.00068243849113969191 +1812 6 6.23844051 0.23844051361083984 0.056853878531001101 +1813 6 6.055648 0.055647850036621094 0.0030966832136982703 +1814 7 6.84700155 0.15299844741821289 0.023408524912383655 +1815 6 5.847058 0.15294218063354492 0.023391310616943883 +1816 7 6.807296 0.19270420074462891 0.037134908984626236 +1817 4 4.387817 0.3878169059753418 0.1504019525602871 +1818 6 6.41068125 0.41068124771118164 0.16865908722161294 +1819 6 6.407588 0.40758800506591797 0.16612798187361477 +1820 6 5.847058 0.15294218063354492 0.023391310616943883 +1821 5 5.86094856 0.86094856262207031 0.74123242748100893 +1822 7 6.84700155 0.15299844741821289 0.023408524912383655 +1823 6 5.91580439 0.084195613861083984 0.0070889013934447576 +1824 5 4.94229841 0.057701587677001953 0.0033294732204467437 +1825 5 5.17851543 0.17851543426513672 0.031867760270870349 +1826 5 4.94229841 0.057701587677001953 0.0033294732204467437 +1827 6 5.91580439 0.084195613861083984 0.0070889013934447576 +1828 6 5.984389 0.015611171722412109 0.00024370868254663947 +1829 7 6.62336445 0.37663555145263672 0.14185433861803176 +1830 7 6.62336445 0.37663555145263672 0.14185433861803176 +1831 7 6.98497629 0.015023708343505859 0.00022571181239072757 +1832 7 6.62336445 0.37663555145263672 0.14185433861803176 +1833 7 6.98497629 0.015023708343505859 0.00022571181239072757 +1834 6 5.795934 0.20406579971313477 0.041642850612561233 +1835 5 4.829798 0.17020177841186523 0.028968645374561675 +1836 6 5.89136076 0.10863924026489258 0.011802484525333057 +1837 7 6.92395926 0.076040744781494141 0.0057821948669243284 +1838 6 5.541737 0.45826292037963867 0.21000490419487505 +1839 6 5.89136076 0.10863924026489258 0.011802484525333057 +1840 5 6.09481955 1.0948195457458496 1.1986298377471485 +1841 7 6.92395926 0.076040744781494141 0.0057821948669243284 +1842 6 6.06164074 0.061640739440917969 0.0037995807588231401 +1843 6 6.09501934 0.095019340515136719 0.0090286750719315023 +1844 6 6.220677 0.22067689895629883 0.048698293732968523 +1845 5 5.0563755 0.056375503540039063 0.0031781973993929569 +1846 5 5.255092 0.25509214401245117 0.065072001936869128 +1847 5 5.0563755 0.056375503540039063 0.0031781973993929569 +1848 5 5.009955 0.0099549293518066406 9.9100618399461382E-05 +1849 6 5.931581 0.068418979644775391 0.0046811567756321892 +1850 7 5.88479948 1.1152005195617676 1.2436721988308364 +1851 6 6.220677 0.22067689895629883 0.048698293732968523 +1852 7 6.638763 0.3612370491027832 0.1304922056444866 +1853 5 5.22545147 0.22545146942138672 0.050828365064262471 +1854 7 6.01192665 0.98807334899902344 0.97628894300214597 +1855 6 5.9560647 0.043935298919677734 0.0019303104911614355 +1856 4 4.10342932 0.10342931747436523 0.010697623713213034 +1857 5 4.620319 0.37968111038208008 0.14415774558096928 +1858 5 4.919397 0.080603122711181641 0.0064968633907938056 +1859 6 5.9560647 0.043935298919677734 0.0019303104911614355 +1860 6 6.04375 0.043749809265136719 0.0019140458107358427 +1861 6 6.03792238 0.037922382354736328 0.0014381070834588172 +1862 7 6.806666 0.19333410263061523 0.037378075239985264 +1863 5 5.32885742 0.328857421875 0.10814720392227173 +1864 6 6.014627 0.014626979827880859 0.00021394853888523357 +1865 6 5.269379 0.7306208610534668 0.53380684260650924 +1866 6 5.62850952 0.371490478515625 0.13800517562776804 +1867 6 6.451072 0.45107221603393555 0.20346614407776542 +1868 7 6.66807175 0.33192825317382813 0.11017636525502894 +1869 7 6.102109 0.89789104461669922 0.80620832800286735 +1870 6 5.899302 0.10069799423217773 0.0101400860423837 +1871 6 5.88717651 0.112823486328125 0.012729139067232609 +1872 5 5.08207035 0.082070350646972656 0.0067355424553170451 +1873 5 5.08207035 0.082070350646972656 0.0067355424553170451 +1874 5 5.97225142 0.97225141525268555 0.94527281446084999 +1875 5 5.113133 0.11313295364379883 0.012799065200169935 +1876 6 6.020215 0.020215034484863281 0.00040864761922421167 +1877 6 6.050329 0.050329208374023438 0.0025330292155558709 +1878 6 5.714985 0.28501510620117188 0.081233610762865283 +1879 6 5.87600851 0.12399148941040039 0.015373889446209432 +1880 5 5.345978 0.345977783203125 0.11970062647014856 +1881 6 5.87600851 0.12399148941040039 0.015373889446209432 +1882 5 5.345978 0.345977783203125 0.11970062647014856 +1883 5 5.345978 0.345977783203125 0.11970062647014856 +1884 5 6.06035852 1.0603585243225098 1.1243602001034105 +1885 6 5.87600851 0.12399148941040039 0.015373889446209432 +1886 5 4.68862867 0.3113713264465332 0.096952102933073547 +1887 5 5.749301 0.74930095672607422 0.56145192375061015 +1888 5 5.445546 0.44554615020751953 0.19851137196474156 +1889 5 5.742894 0.74289417266845703 0.55189175178475125 +1890 5 5.345978 0.345977783203125 0.11970062647014856 +1891 5 5.36257029 0.36257028579711914 0.13145721214300465 +1892 5 5.08076429 0.080764293670654297 0.0065228711321196897 +1893 5 5.08076429 0.080764293670654297 0.0065228711321196897 +1894 5 5.25159 0.25158977508544922 0.063297414927546924 +1895 6 5.80944967 0.19055032730102539 0.036309427234527902 +1896 6 5.24799 0.75200986862182617 0.56551884250461626 +1897 6 5.24799 0.75200986862182617 0.56551884250461626 +1898 6 5.155396 0.8446040153503418 0.7133559427459204 +1899 7 6.94139671 0.058603286743164063 0.0034343452171015088 +1900 6 5.823166 0.1768341064453125 0.031270301202312112 +1901 5 5.69784641 0.69784641265869141 0.48698961566060461 +1902 6 5.729632 0.27036809921264648 0.073098909071859453 +1903 5 5.36386776 0.36386775970458984 0.13239974655243714 +1904 6 5.80944967 0.19055032730102539 0.036309427234527902 +1905 6 5.24799 0.75200986862182617 0.56551884250461626 +1906 5 5.558832 0.55883216857910156 0.31229339263882139 +1907 7 6.79576731 0.20423269271850586 0.041710992775051636 +1908 7 6.680592 0.31940793991088867 0.10202143207811787 +1909 5 5.67669249 0.67669248580932617 0.4579127203508051 +1910 5 5.4686 0.46859979629516602 0.21958576908787109 +1911 6 5.70000124 0.29999876022338867 0.089999256135570249 +1912 6 5.850281 0.14971923828125 0.022415850311517715 +1913 6 5.388945 0.61105489730834961 0.37338808752451769 +1914 6 6.44605 0.44605016708374023 0.19896075155543258 +1915 7 6.680592 0.31940793991088867 0.10202143207811787 +1916 5 5.4686 0.46859979629516602 0.21958576908787109 +1917 6 5.70000124 0.29999876022338867 0.089999256135570249 +1918 6 5.7495923 0.25040769577026367 0.062704014100972927 +1919 6 5.886413 0.1135869026184082 0.012901984446443748 +1920 7 5.743813 1.2561869621276855 1.5780056838195833 +1921 5 5.67669249 0.67669248580932617 0.4579127203508051 +1922 5 5.669428 0.66942787170410156 0.44813367541428306 +1923 5 4.989098 0.010901927947998047 0.00011885203298334091 +1924 4 4.73279762 0.73279762268066406 0.5369923558064329 +1925 6 5.83154726 0.16845273971557617 0.028376325517683654 +1926 6 5.64685774 0.35314226150512695 0.12470945686095547 +1927 5 5.77821064 0.77821063995361328 0.60561180013701232 +1928 6 5.857794 0.14220619201660156 0.020222601047862554 +1929 5 5.54489565 0.54489564895629883 0.29691126825150604 +1930 6 5.84882736 0.15117263793945313 0.022853166461572982 +1931 3 3.392923 0.39292311668395996 0.15438857562463681 +1932 6 5.1673274 0.8326725959777832 0.69334365209238058 +1933 5 5.02177858 0.021778583526611328 0.00047430670042558631 +1934 6 5.9227314 0.077268600463867188 0.0059704366176447365 +1935 5 5.54489565 0.54489564895629883 0.29691126825150604 +1936 6 5.84882736 0.15117263793945313 0.022853166461572982 +1937 7 6.28827858 0.71172142028808594 0.50654738009689027 +1938 5 5.794291 0.79429101943969727 0.63089822356255354 +1939 5 5.254755 0.25475502014160156 0.064900120287347818 +1940 5 5.00748158 0.0074815750122070313 5.597396466328064E-05 +1941 5 5.254755 0.25475502014160156 0.064900120287347818 +1942 5 5.00748158 0.0074815750122070313 5.597396466328064E-05 +1943 5 5.58706045 0.58706045150756836 0.34463997372427002 +1944 5 4.965873 0.034127235412597656 0.0011646681969068595 +1945 6 5.76166153 0.23833847045898438 0.056805226500728168 +1946 6 5.283599 0.71640110015869141 0.5132305363085834 +1947 5 4.965873 0.034127235412597656 0.0011646681969068595 +1948 7 6.313704 0.68629598617553711 0.47100218064065302 +1949 5 5.20408154 0.20408153533935547 0.041649273066468595 +1950 5 5.35217953 0.35217952728271484 0.12403041943707649 +1951 4 4.37076139 0.37076139450073242 0.13746401165212774 +1952 7 6.63146448 0.36853551864624023 0.13581842850385328 +1953 6 6.311296 0.31129598617553711 0.096905191009000191 +1954 5 5.35217953 0.35217952728271484 0.12403041943707649 +1955 5 5.34369326 0.34369325637817383 0.11812505447983312 +1956 5 5.299818 0.29981803894042969 0.089890856474085012 +1957 6 5.87184048 0.12815952301025391 0.0164248633382158 +1958 6 5.689827 0.31017303466796875 0.096207311435136944 +1959 5 4.98411274 0.015887260437011719 0.00025240504419343779 +1960 5 4.98411274 0.015887260437011719 0.00025240504419343779 +1961 5 5.12694454 0.12694454193115234 0.016114916726110096 +1962 5 5.295978 0.29597806930541992 0.087603017509763959 +1963 6 5.689827 0.31017303466796875 0.096207311435136944 +1964 5 5.230468 0.23046779632568359 0.053115405143216776 +1965 6 5.40837 0.59162998199462891 0.35002603559496492 +1966 6 5.723364 0.27663612365722656 0.076527544912096346 +1967 7 5.95787 1.0421299934387207 1.0860349232245881 +1968 6 6.14720058 0.14720058441162109 0.021668012051122787 +1969 7 6.716495 0.28350496292114258 0.080375064000918428 +1970 6 5.717197 0.28280305862426758 0.079977569967240925 +1971 7 6.716495 0.28350496292114258 0.080375064000918428 +1972 5 5.58269548 0.58269548416137695 0.3395340272620615 +1973 5 5.138886 0.1388859748840332 0.019289314019488302 +1974 5 5.138886 0.1388859748840332 0.019289314019488302 +1975 6 5.42846346 0.57153654098510742 0.32665401768122138 +1976 5 5.39033556 0.3903355598449707 0.15236184927948671 +1977 6 5.720798 0.27920198440551758 0.077953748095978881 +1978 6 5.35937166 0.64062833786010742 0.41040466726940394 +1979 6 5.30258036 0.69741964340209961 0.48639415900311178 +1980 8 7.68329954 0.31670045852661133 0.10029918043096586 +1981 8 7.68329954 0.31670045852661133 0.10029918043096586 +1982 8 7.68329954 0.31670045852661133 0.10029918043096586 +1983 8 7.68329954 0.31670045852661133 0.10029918043096586 +1984 8 7.68329954 0.31670045852661133 0.10029918043096586 +1985 6 6.075756 0.075756072998046875 0.0057389825960854068 +1986 6 5.96010828 0.039891719818115234 0.0015913493100470077 +1987 5 5.86364174 0.86364173889160156 0.74587705315570929 +1988 6 5.943341 0.056659221649169922 0.0032102673978897656 +1989 7 6.692215 0.3077850341796875 0.094731627264991403 +1990 4 4.806215 0.80621480941772461 0.64998231892445801 +1991 8 7.68329954 0.31670045852661133 0.10029918043096586 +1992 5 5.80926657 0.80926656723022461 0.65491237683659165 +1993 6 5.71915674 0.28084325790405273 0.078872935510162279 +1994 6 5.90227032 0.097729682922363281 0.0095510909241056652 +1995 6 6.130645 0.13064479827880859 0.017068063317310589 +1996 6 5.90227032 0.097729682922363281 0.0095510909241056652 +1997 6 6.130645 0.13064479827880859 0.017068063317310589 +1998 6 6.130645 0.13064479827880859 0.017068063317310589 +1999 6 6.572855 0.57285499572753906 0.3281628461299988 +2000 5 5.113103 0.11310291290283203 0.012792268907105608 +2001 5 5.03617239 0.036172389984130859 0.0013084417971640505 +2002 6 6.53848076 0.53848075866699219 0.28996152745457948 +2003 6 5.71915674 0.28084325790405273 0.078872935510162279 +2004 6 5.98823071 0.011769294738769531 0.00013851629864802817 +2005 6 5.90227032 0.097729682922363281 0.0095510909241056652 +2006 6 6.130645 0.13064479827880859 0.017068063317310589 +2007 6 5.986577 0.013422966003417969 0.00018017601632891456 +2008 5 5.262037 0.26203680038452148 0.068663284755757559 +2009 7 6.89477158 0.10522842407226563 0.011073021232732572 +2010 6 6.091445 0.091444969177246094 0.0083621823878274881 +2011 5 5.262037 0.26203680038452148 0.068663284755757559 +2012 5 5.99970531 0.99970531463623047 0.99941071611192456 +2013 6 5.64873266 0.35126733779907227 0.12338874260444754 +2014 5 5.20198536 0.20198535919189453 0.040798085327878653 +2015 6 6.13061333 0.13061332702636719 0.017059841196896741 +2016 7 7.07036066 0.070360660552978516 0.004950622553451467 +2017 5 5.20198536 0.20198535919189453 0.040798085327878653 +2018 7 6.070636 0.92936420440673828 0.86371782443256961 +2019 6 5.64873266 0.35126733779907227 0.12338874260444754 +2020 6 5.99316072 0.0068392753601074219 4.6775687451372505E-05 +2021 6 5.798797 0.2012028694152832 0.040482594660943505 +2022 6 5.55679941 0.44320058822631836 0.1964267614041546 +2023 6 5.798797 0.2012028694152832 0.040482594660943505 +2024 5 4.847904 0.15209579467773438 0.023133130758651532 +2025 5 5.08376265 0.083762645721435547 0.0070161808182547247 +2026 5 4.944269 0.055730819702148438 0.0031059242646733765 +2027 5 5.070517 0.070517063140869141 0.0049726561940133251 +2028 6 5.94484043 0.055159568786621094 0.003042578028725984 +2029 6 5.55679941 0.44320058822631836 0.1964267614041546 +2030 6 5.885327 0.11467313766479492 0.013149928501889008 +2031 5 5.854764 0.85476398468017578 0.73062146950633178 +2032 6 5.80357075 0.19642925262451172 0.038584451286624244 +2033 5 5.78247929 0.78247928619384766 0.61227383332243335 +2034 5 5.584074 0.58407402038574219 0.34114246128956438 +2035 5 5.391613 0.39161300659179688 0.15336074693186674 +2036 6 5.683799 0.31620121002197266 0.099983205219359661 +2037 5 5.854764 0.85476398468017578 0.73062146950633178 +2038 5 5.47931051 0.47931051254272461 0.22973856743396937 +2039 5 5.10026169 0.10026168823242188 0.010052406127215363 +2040 6 5.587714 0.41228580474853516 0.16997958479714725 +2041 5 5.47931051 0.47931051254272461 0.22973856743396937 +2042 6 5.59508228 0.40491771697998047 0.16395835752427956 +2043 6 6.188592 0.18859195709228516 0.035566926279898325 +2044 6 5.51965761 0.48034238815307617 0.23072880985660049 +2045 5 5.10026169 0.10026168823242188 0.010052406127215363 +2046 5 5.27681828 0.27681827545166016 0.076628357624031196 +2047 5 5.202298 0.20229816436767578 0.040924547306531167 +2048 5 5.22819233 0.22819232940673828 0.052071739200073353 +2049 7 5.916048 1.0839519500732422 1.1749518300675845 +2050 3 4.86571169 1.8657116889953613 3.4808801064539239 +2051 5 5.301681 0.3016810417175293 0.091011450931773652 +2052 5 5.301681 0.3016810417175293 0.091011450931773652 +2053 5 5.82433939 0.82433938980102539 0.67953542957752688 +2054 5 5.82433939 0.82433938980102539 0.67953542957752688 +2055 6 6.10678625 0.10678625106811523 0.011403303417182542 +2056 5 5.301681 0.3016810417175293 0.091011450931773652 +2057 7 6.74051332 0.25948667526245117 0.067333334638760789 +2058 5 5.39320326 0.3932032585144043 0.15460880250634546 +2059 5 5.17256451 0.17256450653076172 0.029778508914205304 +2060 5 5.469499 0.46949911117553711 0.22042941539461935 +2061 6 6.131151 0.13115119934082031 0.017200637088535586 +2062 5 6.16290665 1.1629066467285156 1.3523518690053606 +2063 5 5.51166773 0.51166772842407227 0.26180386431065017 +2064 6 5.94528627 0.054713726043701172 0.0029935918175851839 +2065 5 5.34100866 0.34100866317749023 0.11628690836209898 +2066 5 5.42366552 0.42366552352905273 0.17949247582714634 +2067 5 5.42366552 0.42366552352905273 0.17949247582714634 +2068 6 6.36523342 0.36523342132568359 0.13339545205326431 +2069 7 6.286891 0.71310901641845703 0.50852446929729922 +2070 6 5.28514051 0.7148594856262207 0.51102408418978484 +2071 6 6.005229 0.0052289962768554688 2.7342402063368354E-05 +2072 5 5.93074942 0.93074941635131836 0.86629447603831977 +2073 5 5.35567665 0.35567665100097656 0.12650588006727048 +2074 6 5.94528627 0.054713726043701172 0.0029935918175851839 +2075 5 5.51166773 0.51166772842407227 0.26180386431065017 +2076 5 5.118412 0.11841201782226563 0.014021405964740552 +2077 6 5.855995 0.14400482177734375 0.020737388695124537 +2078 6 6.076282 0.076282024383544922 0.005818947244051742 +2079 4 5.34362173 1.3436217308044434 1.8053193554899281 +2080 5 5.118412 0.11841201782226563 0.014021405964740552 +2081 5 5.451315 0.45131492614746094 0.20368516256348812 +2082 6 5.66807032 0.33192968368530273 0.11017731491142513 +2083 5 5.27994061 0.27994060516357422 0.078366742419348157 +2084 6 6.06697464 0.066974639892578125 0.0044856023887405172 +2085 6 6.06697464 0.066974639892578125 0.0044856023887405172 +2086 5 5.50176668 0.50176668167114258 0.25176980283526973 +2087 6 6.04193258 0.041932582855224609 0.0017583415049102769 +2088 6 5.73626757 0.2637324333190918 0.069554796384409201 +2089 6 6.06697464 0.066974639892578125 0.0044856023887405172 +2090 5 5.283904 0.28390407562255859 0.080601524155099469 +2091 5 5.375473 0.3754730224609375 0.14097999059595168 +2092 5 5.079679 0.079679012298583984 0.0063487450008778978 +2093 5 5.1351285 0.13512849807739258 0.01825971099265189 +2094 5 5.1351285 0.13512849807739258 0.01825971099265189 +2095 5 5.338806 0.33880615234375 0.11478960886597633 +2096 5 4.8727994 0.12720060348510742 0.016179993526975522 +2097 5 5.54609776 0.54609775543212891 0.29822275848800928 +2098 6 6.14330435 0.14330434799194336 0.020536136153396001 +2099 5 5.527509 0.52750921249389648 0.27826596926593083 +2100 5 5.54609776 0.54609775543212891 0.29822275848800928 +2101 6 6.23822355 0.23822355270385742 0.056750461062847535 +2102 5 5.32251453 0.32251453399658203 0.10401562463903247 +2103 5 5.34272051 0.34272050857543945 0.11745734699820787 +2104 5 5.527509 0.52750921249389648 0.27826596926593083 +2105 5 4.8727994 0.12720060348510742 0.016179993526975522 +2106 5 5.035476 0.035476207733154297 0.0012585613151259167 +2107 6 5.93114567 0.068854331970214844 0.0047409190310645499 +2108 6 6.14330435 0.14330434799194336 0.020536136153396001 +2109 6 5.92951775 0.070482254028320313 0.0049677481329126749 +2110 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2111 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2112 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2113 5 5.149098 0.14909791946411133 0.022230189588526628 +2114 6 5.92951775 0.070482254028320313 0.0049677481329126749 +2115 5 5.07154226 0.071542263031005859 0.0051182953995976277 +2116 4 5.852532 1.852531909942627 3.4318744773556773 +2117 5 5.57782 0.57781982421875 0.33387574926018715 +2118 6 6.14478445 0.14478445053100586 0.020962537115565283 +2119 4 5.80488253 1.8048825263977051 3.2576009340957626 +2120 5 5.551959 0.55195903778076172 0.30465877938786434 +2121 7 7.031645 0.031644821166992188 0.0010013947066909168 +2122 5 5.3448925 0.34489250183105469 0.11895083781928406 +2123 5 5.551959 0.55195903778076172 0.30465877938786434 +2124 7 7.031645 0.031644821166992188 0.0010013947066909168 +2125 5 5.446592 0.44659185409545898 0.19944428414441973 +2126 5 5.337021 0.3370208740234375 0.11358306952752173 +2127 5 4.86048555 0.13951444625854492 0.019464280714828419 +2128 6 5.56485748 0.43514251708984375 0.18934901017928496 +2129 5 6.24411345 1.2441134452819824 1.5478182647314043 +2130 5 6.119552 1.1195521354675293 1.2533969840299051 +2131 6 5.40368462 0.59631538391113281 0.35559203708908171 +2132 6 5.40368462 0.59631538391113281 0.35559203708908171 +2133 6 6.14214373 0.14214372634887695 0.020204838940344416 +2134 6 6.136567 0.13656711578369141 0.018650577113476174 +2135 5 5.83917761 0.83917760848999023 0.70421905859097933 +2136 6 6.22776365 0.22776365280151367 0.051876281537488467 +2137 5 5.83917761 0.83917760848999023 0.70421905859097933 +2138 5 5.524169 0.52416896820068359 0.27475310722456925 +2139 5 5.025896 0.025896072387695313 0.0006706065651087556 +2140 5 5.2133007 0.21330070495605469 0.045497190734749893 +2141 5 5.2133007 0.21330070495605469 0.045497190734749893 +2142 5 5.309244 0.30924415588378906 0.095631947948277229 +2143 7 6.958703 0.041296958923339844 0.0017054388163160183 +2144 6 5.889221 0.11077880859375 0.012271944433450699 +2145 6 5.70829439 0.29170560836791992 0.085092161953298273 +2146 6 5.921274 0.078725814819335938 0.0061977539189683739 +2147 5 5.40994263 0.409942626953125 0.16805295739322901 +2148 5 5.025896 0.025896072387695313 0.0006706065651087556 +2149 6 6.53269434 0.53269433975219727 0.28376325960402937 +2150 6 6.549871 0.54987096786499023 0.30235808130078112 +2151 5 5.2133007 0.21330070495605469 0.045497190734749893 +2152 6 5.682142 0.31785821914672852 0.10103384747912969 +2153 6 5.77969551 0.22030448913574219 0.048534067933360348 +2154 4 4.248038 0.24803781509399414 0.061522757716602428 +2155 5 5.60414028 0.60414028167724609 0.36498547994506225 +2156 4 5.46349 1.4634900093078613 2.141803007343924 +2157 6 6.10743046 0.10743045806884766 0.011541303320882434 +2158 6 6.07451153 0.074511528015136719 0.0055519678071505041 +2159 4 4.98861456 0.98861455917358398 0.97735874660997979 +2160 6 6.48047829 0.48047828674316406 0.23085938403164619 +2161 7 6.83936453 0.16063547134399414 0.025803754653907163 +2162 6 5.335519 0.66448116302490234 0.44153521601492685 +2163 6 6.10743046 0.10743045806884766 0.011541303320882434 +2164 5 5.37191248 0.37191247940063477 0.13831889233392758 +2165 5 5.199658 0.19965791702270508 0.039863283829845386 +2166 5 5.199658 0.19965791702270508 0.039863283829845386 +2167 7 6.89165068 0.10834932327270508 0.01173957585365315 +2168 7 6.89165068 0.10834932327270508 0.01173957585365315 +2169 7 6.89165068 0.10834932327270508 0.01173957585365315 +2170 7 6.89165068 0.10834932327270508 0.01173957585365315 +2171 7 6.89165068 0.10834932327270508 0.01173957585365315 +2172 5 4.909876 0.090124130249023438 0.0081223588531429414 +2173 5 5.22056675 0.22056674957275391 0.048649691017089935 +2174 7 6.89165068 0.10834932327270508 0.01173957585365315 +2175 7 6.87728834 0.1227116584777832 0.015058151126368102 +2176 5 4.909876 0.090124130249023438 0.0081223588531429414 +2177 7 5.235744 1.7642560005187988 3.1125992353665879 +2178 5 5.22056675 0.22056674957275391 0.048649691017089935 +2179 6 5.972474 0.027525901794433594 0.00075767526959680254 +2180 6 5.27915764 0.72084236145019531 0.51961371006109403 +2181 6 6.10079861 0.10079860687255859 0.010160359147448617 +2182 5 5.40179 0.40179014205932617 0.16143531825605351 +2183 5 5.42879057 0.42879056930541992 0.18386135232526613 +2184 6 5.755803 0.24419689178466797 0.059632121957292838 +2185 7 5.900644 1.0993561744689941 1.2085839983431015 +2186 5 4.90778875 0.092211246490478516 0.0085029139793277864 +2187 5 4.98141146 0.018588542938232422 0.00034553392856651044 +2188 6 5.86708736 0.13291263580322266 0.017665768756160105 +2189 6 6.13499641 0.13499641418457031 0.018224031842692057 +2190 6 6.517881 0.51788091659545898 0.26820064377375274 +2191 5 5.432943 0.43294286727905273 0.18743952632780747 +2192 6 5.41571856 0.58428144454956055 0.3413848064449212 +2193 6 6.13499641 0.13499641418457031 0.018224031842692057 +2194 6 5.86708736 0.13291263580322266 0.017665768756160105 +2195 5 4.98141146 0.018588542938232422 0.00034553392856651044 +2196 6 6.001491 0.0014910697937011719 2.2232891296880553E-06 +2197 6 6.077741 0.077741146087646484 0.0060436857950207923 +2198 5 5.23285532 0.23285531997680664 0.054221600041501006 +2199 6 5.63764 0.36236000061035156 0.13130477004233398 +2200 5 5.408938 0.40893793106079102 0.16723023146028027 +2201 6 5.59414864 0.40585136413574219 0.1647153297708428 +2202 5 5.23285532 0.23285531997680664 0.054221600041501006 +2203 5 5.406095 0.40609502792358398 0.16491317170425646 +2204 5 5.11989975 0.11989974975585938 0.0143759499915177 +2205 5 5.380273 0.38027286529541016 0.14460745207998116 +2206 6 5.93944168 0.060558319091796875 0.0036673100112238899 +2207 7 6.39073563 0.60926437377929688 0.37120307715667877 +2208 5 5.924955 0.92495489120483398 0.85554155076374627 +2209 6 6.31965542 0.31965541839599609 0.10217958650991932 +2210 7 5.84579563 1.1542043685913086 1.3321877244752613 +2211 6 5.993177 0.0068230628967285156 4.6554187292713323E-05 +2212 6 6.31965542 0.31965541839599609 0.10217958650991932 +2213 6 6.095436 0.09543609619140625 0.0091080484562553465 +2214 5 5.924955 0.92495489120483398 0.85554155076374627 +2215 6 6.031555 0.03155517578125 0.00099572911858558655 +2216 5 5.20941067 0.20941066741943359 0.043852827629052626 +2217 6 5.818059 0.18194103240966797 0.03310253927429585 +2218 6 5.866191 0.13380908966064453 0.017904872475810407 +2219 7 6.95728445 0.042715549468994141 0.0018246181664380856 +2220 6 6.066302 0.066301822662353516 0.0043959316883501742 +2221 6 6.031555 0.03155517578125 0.00099572911858558655 +2222 7 6.41842175 0.58157825469970703 0.3382332663395573 +2223 6 5.74332047 0.25667953491210938 0.065884383642696775 +2224 7 6.41842175 0.58157825469970703 0.3382332663395573 +2225 4 5.301856 1.3018560409545898 1.6948291513699587 +2226 5 5.18825626 0.18825626373291016 0.035440420834675024 +2227 5 5.23327971 0.23327970504760742 0.054419420787098716 +2228 7 6.38512373 0.61487627029418945 0.37807282777089313 +2229 6 6.26501751 0.26501750946044922 0.070234280320619291 +2230 7 6.38512373 0.61487627029418945 0.37807282777089313 +2231 6 6.26501751 0.26501750946044922 0.070234280320619291 +2232 6 5.50034 0.49966001510620117 0.24966013069592918 +2233 5 5.005345 0.0053448677062988281 2.8567610797836096E-05 +2234 5 5.36880445 0.3688044548034668 0.13601672588288238 +2235 6 5.15101051 0.84898948669433594 0.72078314851751202 +2236 5 5.279118 0.27911806106567383 0.077906892013061224 +2237 4 4.755305 0.75530481338500977 0.57048536112256443 +2238 6 5.81597137 0.18402862548828125 0.033866534999106079 +2239 6 5.15101051 0.84898948669433594 0.72078314851751202 +2240 5 5.31853 0.31853008270263672 0.10146141358654859 +2241 5 5.279118 0.27911806106567383 0.077906892013061224 +2242 5 5.341262 0.34126186370849609 0.11645965962179616 +2243 5 5.89338827 0.89338827133178711 0.79814260335319887 +2244 5 5.26064634 0.26064634323120117 0.067936516239797129 +2245 7 5.975706 1.0242938995361328 1.0491779926269373 +2246 4 4.755305 0.75530481338500977 0.57048536112256443 +2247 6 5.81597137 0.18402862548828125 0.033866534999106079 +2248 6 5.80423069 0.19576930999755859 0.038325622736920195 +2249 5 5.112997 0.11299705505371094 0.012768334450811381 +2250 6 5.51153231 0.48846769332885742 0.2386006874260147 +2251 7 6.61156225 0.38843774795532227 0.15088388403660247 +2252 5 5.28885174 0.28885173797607422 0.083435326531798637 +2253 5 5.112997 0.11299705505371094 0.012768334450811381 +2254 6 5.780869 0.2191309928894043 0.048018392044696157 +2255 6 5.905129 0.094871044158935547 0.0090005150198066985 +2256 5 5.74268055 0.74268054962158203 0.55157439878621517 +2257 6 5.513558 0.48644208908081055 0.23662590602930322 +2258 5 5.1727047 0.17270469665527344 0.029826912246790016 +2259 6 5.513558 0.48644208908081055 0.23662590602930322 +2260 5 5.1727047 0.17270469665527344 0.029826912246790016 +2261 6 5.250121 0.74987888336181641 0.56231833971196465 +2262 6 5.674826 0.32517385482788086 0.10573803586362374 +2263 5 5.21189451 0.21189451217651367 0.044899284290522701 +2264 6 6.183153 0.18315315246582031 0.033545077258168021 +2265 5 5.21189451 0.21189451217651367 0.044899284290522701 +2266 5 5.29360437 0.29360437393188477 0.086203528391934015 +2267 6 6.183153 0.18315315246582031 0.033545077258168021 +2268 6 5.172826 0.82717418670654297 0.68421713515363081 +2269 6 6.08651543 0.086515426635742188 0.0074849190459644888 +2270 7 6.53247643 0.46752357482910156 0.21857829302098253 +2271 6 5.51747131 0.4825286865234375 0.23283393331803381 +2272 6 6.08014965 0.080149650573730469 0.0064239664870910929 +2273 5 4.94806051 0.051939487457275391 0.0026977103573244676 +2274 7 6.53247643 0.46752357482910156 0.21857829302098253 +2275 4 4.87486267 0.8748626708984375 0.76538469293154776 +2276 6 5.252231 0.74776887893676758 0.55915829630635017 +2277 6 5.94082737 0.059172630310058594 0.003501400177810865 +2278 6 5.252231 0.74776887893676758 0.55915829630635017 +2279 5 5.32774067 0.32774066925048828 0.10741394628075795 +2280 6 5.95069265 0.049307346343994141 0.0024312144034865923 +2281 6 5.98364353 0.016356468200683594 0.0002675340519999736 +2282 5 5.10705328 0.10705327987670898 0.011460404732360985 +2283 5 5.10705328 0.10705327987670898 0.011460404732360985 +2284 5 5.10705328 0.10705327987670898 0.011460404732360985 +2285 5 5.10705328 0.10705327987670898 0.011460404732360985 +2286 5 5.255406 0.25540590286254883 0.065232175217033728 +2287 5 5.04064369 0.040643692016601563 0.0016519097007403616 +2288 5 5.10705328 0.10705327987670898 0.011460404732360985 +2289 7 6.975762 0.024238109588623047 0.00058748595643010049 +2290 7 6.01900434 0.98099565505981445 0.96235247524623446 +2291 6 6.01213932 0.012139320373535156 0.00014736309913132573 +2292 6 5.082049 0.91795110702514648 0.84263423488869194 +2293 7 6.975762 0.024238109588623047 0.00058748595643010049 +2294 7 7.15972137 0.15972137451171875 0.02551091747591272 +2295 6 5.543599 0.45640087127685547 0.2083017553022728 +2296 7 6.03206825 0.96793174743652344 0.9368918676955218 +2297 6 5.525688 0.47431182861328125 0.22497171076247469 +2298 8 6.825002 1.1749978065490723 1.3806198453951311 +2299 7 7.15972137 0.15972137451171875 0.02551091747591272 +2300 7 7.12855768 0.12855768203735352 0.016527077610817287 +2301 5 5.64900637 0.64900636672973633 0.421209264055733 +2302 5 4.962141 0.037858963012695313 0.0014333010803966317 +2303 5 5.078949 0.078948974609375 0.0062329405918717384 +2304 6 5.204391 0.7956089973449707 0.6329936766562696 +2305 7 6.719511 0.28048896789550781 0.078674061111087212 +2306 5 5.347551 0.34755086898803711 0.12079160653433973 +2307 5 5.493848 0.49384784698486328 0.24388569597158494 +2308 5 5.03939629 0.039396286010742188 0.0015520673514402006 +2309 6 4.99927 1.000730037689209 1.0014606083334456 +2310 5 5.493848 0.49384784698486328 0.24388569597158494 +2311 7 6.676727 0.3232731819152832 0.10450555014563179 +2312 5 5.03939629 0.039396286010742188 0.0015520673514402006 +2313 7 6.59226847 0.40773153305053711 0.16624500304374124 +2314 6 6.75099134 0.7509913444519043 0.56398799944167877 +2315 6 6.20311642 0.20311641693115234 0.04125627882694971 +2316 7 6.70196724 0.29803276062011719 0.088823526402848074 +2317 5 5.40779161 0.4077916145324707 0.16629400088299917 +2318 4 5.22995758 1.2299575805664063 1.5127956499927677 +2319 7 7.1599 0.15990018844604492 0.025568070265080678 +2320 6 6.534845 0.53484487533569336 0.28605904067285337 +2321 5 4.79688025 0.20311975479125977 0.041257634786461495 +2322 6 5.37514925 0.62485074996948242 0.39043845973742464 +2323 6 6.43884945 0.43884944915771484 0.19258883902602975 +2324 5 5.21170664 0.21170663833618164 0.044819700715606814 +2325 6 4.96660471 1.0333952903747559 1.067905826168726 +2326 5 5.23989534 0.23989534378051758 0.057549775967572714 +2327 6 4.96660471 1.0333952903747559 1.067905826168726 +2328 5 5.23989534 0.23989534378051758 0.057549775967572714 +2329 5 5.39162445 0.39162445068359375 0.15336971037322655 +2330 6 5.52637434 0.47362565994262695 0.22432126575608891 +2331 5 5.642715 0.6427149772644043 0.41308254199998373 +2332 6 5.70127439 0.29872560501098633 0.08923698708917982 +2333 8 7.634215 0.36578512191772461 0.13379875541636466 +2334 5 4.72977543 0.27022457122802734 0.073021318895371223 +2335 5 5.563473 0.56347322463989258 0.31750207488607884 +2336 5 4.43548155 0.56451845169067383 0.31868108229923564 +2337 4 5.1952877 1.1952877044677734 1.4287126964518393 +2338 5 5.461004 0.46100378036499023 0.21252448551081216 +2339 6 5.68787336 0.31212663650512695 0.09742303721600365 +2340 6 5.77562952 0.22437047958374023 0.050342112108637593 +2341 5 5.461004 0.46100378036499023 0.21252448551081216 +2342 8 6.9745307 1.0254693031311035 1.0515872916641911 +2343 5 6.21626854 1.2162685394287109 1.4793091600040498 +2344 6 5.68787336 0.31212663650512695 0.09742303721600365 +2345 6 5.964076 0.035923957824707031 0.0012905307457913295 +2346 4 5.00611448 1.0061144828796387 1.0122663526601627 +2347 6 6.032659 0.032659053802490234 0.0010666137952739518 +2348 6 5.979141 0.0208587646484375 0.00043508806265890598 +2349 5 5.04481649 0.044816493988037109 0.0020085181333797664 +2350 5 5.54842949 0.54842948913574219 0.30077490455369116 +2351 6 5.86459446 0.13540554046630859 0.018334660388973134 +2352 6 5.2427454 0.75725460052490234 0.57343453001612943 +2353 7 6.393229 0.60677099227905273 0.36817103707130627 +2354 6 5.97516 0.024839878082275391 0.00061701954314230534 +2355 7 6.41990471 0.58009529113769531 0.33651054680012749 +2356 6 5.74326134 0.25673866271972656 0.065914740935113514 +2357 5 5.605159 0.60515880584716797 0.36621718029437034 +2358 5 5.40133858 0.40133857727050781 0.16107265360551537 +2359 5 5.15412426 0.15412425994873047 0.023754287504743843 +2360 6 5.684558 0.31544208526611328 0.099503709157033882 +2361 5 5.361921 0.36192083358764648 0.1309866897847769 +2362 6 6.2134304 0.21343040466308594 0.045552537634648615 +2363 5 5.35377932 0.35377931594848633 0.12515980439297891 +2364 5 5.09424829 0.094248294830322266 0.0088827410784233507 +2365 5 5.24187565 0.24187564849853516 0.058503829336586932 +2366 5 5.289029 0.28902912139892578 0.083537833016634977 +2367 6 5.289107 0.71089315414428711 0.50536907660921315 +2368 6 5.888105 0.11189508438110352 0.012520509908654276 +2369 6 5.946237 0.053762912750244141 0.002890450787390364 +2370 7 6.52725029 0.47274971008300781 0.22349228838356794 +2371 5 5.12754726 0.12754726409912109 0.016268304579170945 +2372 4 4.236829 0.23682880401611328 0.056087882411702594 +2373 3 3.86445427 0.86445426940917969 0.74728118389975862 +2374 6 6.472952 0.47295188903808594 0.22368348934469395 +2375 6 6.807021 0.80702114105224609 0.65128312210526929 +2376 6 6.472952 0.47295188903808594 0.22368348934469395 +2377 6 5.663546 0.33645391464233398 0.11320123667815096 +2378 5 5.27205563 0.27205562591552734 0.074014263592289353 +2379 4 4.47827053 0.47827053070068359 0.22874270053671353 +2380 4 4.47827053 0.47827053070068359 0.22874270053671353 +2381 6 6.20269156 0.20269155502319336 0.041083866477720221 +2382 8 6.92358637 1.076413631439209 1.1586663059481452 +2383 6 6.59504271 0.59504270553588867 0.35407582141147032 +2384 8 6.92358637 1.076413631439209 1.1586663059481452 +2385 5 5.97708464 0.97708463668823242 0.95469438725217515 +2386 4 5.147523 1.1475229263305664 1.3168088664542665 +2387 4 5.14467859 1.1446785926818848 1.3102890805441803 +2388 4 4.95968 0.95968008041381836 0.92098585674307287 +2389 8 7.235937 0.76406288146972656 0.58379208683982142 +2390 8 6.88572645 1.1142735481262207 1.2416055400537971 +2391 6 5.947992 0.052008152008056641 0.002704847875293126 +2392 7 6.005415 0.99458503723144531 0.98919939628467546 +2393 6 5.93540573 0.064594268798828125 0.0041724195616552606 +2394 5 5.061161 0.061161041259765625 0.0037406729679787531 +2395 5 5.44356155 0.44356155395507813 0.19674685214704368 +2396 5 5.024654 0.024653911590576172 0.00060781535671594611 +2397 6 6.36759043 0.36759042739868164 0.13512272231514544 +2398 6 5.95639 0.043610095977783203 0.0019018404711914627 +2399 6 5.99291468 0.0070853233337402344 5.0201806743643829E-05 +2400 4 4.96698666 0.96698665618896484 0.9350631932475153 +2401 4 5.41945934 1.419459342956543 2.0148648263066207 +2402 6 5.724603 0.27539682388305664 0.075843410604875316 +2403 6 6.153986 0.15398597717285156 0.023711681165877962 +2404 5 4.909302 0.090697765350341797 0.008226084639545661 +2405 5 5.50746536 0.50746536254882813 0.25752109418681357 +2406 6 6.72038031 0.72038030624389648 0.51894778562405008 +2407 6 6.304238 0.30423784255981445 0.092560664845450447 +2408 5 5.204785 0.20478487014770508 0.04193684304141243 +2409 4 5.755078 1.7550778388977051 3.0802982205898388 +2410 6 5.889095 0.11090517044067383 0.012299956830474912 +2411 6 5.495484 0.5045161247253418 0.25453652010787664 +2412 4 4.567272 0.56727218627929688 0.32179773332609329 +2413 4 5.755078 1.7550778388977051 3.0802982205898388 +2414 4 4.49246454 0.49246454238891602 0.24252132551032446 +2415 5 5.50717735 0.50717735290527344 0.25722886730000027 +2416 6 5.889095 0.11090517044067383 0.012299956830474912 +2417 5 5.11089039 0.11089038848876953 0.01229667825919023 +2418 5 5.35015631 0.35015630722045898 0.12260943948626846 +2419 5 5.025919 0.025918960571289063 0.00067179251709603705 +2420 7 6.794381 0.20561885833740234 0.042279114903976733 +2421 5 5.55628 0.55628013610839844 0.30944758982877829 +2422 5 4.60507631 0.39492368698120117 0.15596471853882576 +2423 6 5.75788975 0.24211025238037109 0.058617374307686987 +2424 5 4.60507631 0.39492368698120117 0.15596471853882576 +2425 6 5.75788975 0.24211025238037109 0.058617374307686987 +2426 6 6.110245 0.1102452278137207 0.012154010255699177 +2427 6 5.64332628 0.3566737174987793 0.12721614075439902 +2428 6 6.110245 0.1102452278137207 0.012154010255699177 +2429 6 5.64332628 0.3566737174987793 0.12721614075439902 +2430 5 5.13360643 0.1336064338684082 0.017850679171033335 +2431 5 5.08932161 0.089321613311767578 0.007978350604616935 +2432 5 5.17863 0.17862987518310547 0.031908632307931839 +2433 6 5.377493 0.62250709533691406 0.38751508374480181 +2434 6 5.518652 0.48134803771972656 0.23169593341663131 +2435 4 5.145903 1.1459031105041504 1.3130939386630871 +2436 5 5.19192553 0.1919255256652832 0.036835407401895282 +2437 6 5.77196264 0.22803735733032227 0.052001036338197082 +2438 5 5.19192553 0.1919255256652832 0.036835407401895282 +2439 6 6.008643 0.0086431503295898438 7.4704047619889025E-05 +2440 5 5.18086863 0.18086862564086914 0.032713459741216866 +2441 6 6.38087845 0.38087844848632813 0.14506839252135251 +2442 5 5.02869463 0.028694629669189453 0.00082338177185192762 +2443 5 5.252044 0.2520442008972168 0.06352627920591658 +2444 5 5.02869463 0.028694629669189453 0.00082338177185192762 +2445 5 5.246009 0.24600887298583984 0.060520365587763081 +2446 5 5.252044 0.2520442008972168 0.06352627920591658 +2447 6 5.67375374 0.32624626159667969 0.10643662320580916 +2448 6 6.2183075 0.2183074951171875 0.047658162424340844 +2449 6 5.812583 0.18741703033447266 0.035125143259392644 +2450 5 5.37584734 0.37584733963012695 0.141261222707044 +2451 5 5.37584734 0.37584733963012695 0.141261222707044 +2452 7 6.854299 0.14570093154907227 0.021228761454267442 +2453 6 6.284056 0.28405618667602539 0.080687917188924985 +2454 5 5.381132 0.38113212585449219 0.14526169735836447 +2455 6 5.80150557 0.19849443435668945 0.039400040470582098 +2456 6 5.78387928 0.21612071990966797 0.046708165574273153 +2457 6 5.78387928 0.21612071990966797 0.046708165574273153 +2458 6 5.80150557 0.19849443435668945 0.039400040470582098 +2459 5 5.122227 0.12222719192504883 0.014939486445882721 +2460 5 5.122227 0.12222719192504883 0.014939486445882721 +2461 5 4.78146458 0.21853542327880859 0.047757731227648037 +2462 5 4.896528 0.10347223281860352 0.01070650296446729 +2463 7 6.22579765 0.77420234680175781 0.59938927379334928 +2464 5 5.400786 0.40078592300415039 0.16062935607828877 +2465 5 5.08618641 0.086186408996582031 0.0074280970957261161 +2466 5 5.16699362 0.16699361801147461 0.027886868456562297 +2467 6 5.645084 0.35491609573364258 0.12596543501081214 +2468 6 5.73548174 0.26451826095581055 0.069969910379086286 +2469 5 5.10323334 0.10323333740234375 0.010657121951226145 +2470 5 5.553936 0.55393600463867188 0.30684509723505471 +2471 7 6.896915 0.10308504104614258 0.0106265256874849 +2472 6 5.57246351 0.4275364875793457 0.18278744821168402 +2473 6 5.38096952 0.61903047561645508 0.38319872974193459 +2474 7 6.54121256 0.45878744125366211 0.21048591625208246 +2475 5 4.755563 0.24443721771240234 0.059749553402980382 +2476 6 5.478174 0.52182579040527344 0.27230215553208836 +2477 7 6.54121256 0.45878744125366211 0.21048591625208246 +2478 6 5.45521164 0.54478836059570313 0.29679435784055386 +2479 6 5.54736233 0.45263767242431641 0.20488086249770276 +2480 5 5.26764965 0.26764965057373047 0.071636335452240019 +2481 6 5.515577 0.48442316055297852 0.2346657984801368 +2482 6 5.498918 0.50108194351196289 0.25108311411372597 +2483 6 5.45521164 0.54478836059570313 0.29679435784055386 +2484 5 5.048979 0.048978805541992188 0.0023989233923202846 +2485 6 5.576148 0.42385196685791016 0.17965048980931897 +2486 5 5.57141066 0.5714106559753418 0.32651013776217042 +2487 6 6.054063 0.054062843322753906 0.0029227910281406366 +2488 6 6.054063 0.054062843322753906 0.0029227910281406366 +2489 6 5.417714 0.58228588104248047 0.33905684726141772 +2490 6 5.333998 0.66600179672241211 0.44355839323748114 +2491 5 5.37121058 0.37121057510375977 0.13779729106886407 +2492 6 5.417714 0.58228588104248047 0.33905684726141772 +2493 4 4.939772 0.93977212905883789 0.88317165455578106 +2494 4 4.939772 0.93977212905883789 0.88317165455578106 +2495 5 5.6389513 0.63895130157470703 0.40825876578401221 +2496 5 5.562788 0.56278800964355469 0.3167303437985538 +2497 5 5.339306 0.33930587768554688 0.1151284786319593 +2498 5 5.339306 0.33930587768554688 0.1151284786319593 +2499 6 6.341508 0.34150791168212891 0.11662765374148876 +2500 5 5.339306 0.33930587768554688 0.1151284786319593 +2501 5 5.429243 0.42924308776855469 0.18424962839708314 +2502 4 4.857595 0.85759496688842773 0.73546912723236346 +2503 4 4.857595 0.85759496688842773 0.73546912723236346 +2504 6 5.39802 0.60198020935058594 0.36238017244977527 +2505 6 5.350875 0.64912509918212891 0.42136339438820869 +2506 6 5.44687939 0.55312061309814453 0.3059424126340673 +2507 7 6.84971571 0.1502842903137207 0.022585367915098686 +2508 6 5.37374973 0.62625026702880859 0.39218939695365407 +2509 5 5.177659 0.17765903472900391 0.031562732620841416 +2510 6 5.473051 0.52694892883300781 0.27767517359825433 +2511 6 5.32681227 0.6731877326965332 0.45318172345309904 +2512 6 5.648741 0.35125923156738281 0.12338304776130826 +2513 5 5.189906 0.18990612030029297 0.036064334527509345 +2514 7 6.82964373 0.17035627365112305 0.02902125997229632 +2515 7 6.536579 0.46342086791992188 0.21475890082365368 +2516 6 5.708578 0.29142189025878906 0.084926718122005695 +2517 6 5.782086 0.21791410446166992 0.047486556923331591 +2518 7 6.536579 0.46342086791992188 0.21475890082365368 +2519 5 5.46886444 0.46886444091796875 0.21983386395731941 +2520 5 5.02772331 0.027723312377929688 0.00076858204920426942 +2521 7 6.915324 0.084675788879394531 0.0071699892223477946 +2522 8 6.48247051 1.5175294876098633 2.3028957457654542 +2523 5 5.884742 0.88474178314208984 0.78276802283744473 +2524 5 5.02772331 0.027723312377929688 0.00076858204920426942 +2525 8 6.48247051 1.5175294876098633 2.3028957457654542 +2526 7 6.915324 0.084675788879394531 0.0071699892223477946 +2527 6 6.1603756 0.16037559509277344 0.025720331501361215 +2528 6 6.13957453 0.13957452774047852 0.019481048793977607 +2529 5 5.06424427 0.064244270324707031 0.0041273262695540325 +2530 6 6.075336 0.075335979461669922 0.0056755098014491523 +2531 4 4.62371826 0.62371826171875 0.38902447000145912 +2532 4 4.62371826 0.62371826171875 0.38902447000145912 +2533 5 5.874933 0.87493276596069336 0.76550734495162942 +2534 7 6.029249 0.97075080871582031 0.94235713262241916 +2535 6 5.720717 0.27928304672241211 0.077999020186553025 +2536 6 5.726112 0.27388811111450195 0.075014697409869768 +2537 6 5.468898 0.53110218048095703 0.28206952611162706 +2538 6 5.468898 0.53110218048095703 0.28206952611162706 +2539 5 5.56798553 0.56798553466796875 0.32260756759205833 +2540 5 5.68123245 0.68123245239257813 0.46407765419280622 +2541 6 5.720717 0.27928304672241211 0.077999020186553025 +2542 5 5.711144 0.71114397048950195 0.50572574676357362 +2543 6 5.726112 0.27388811111450195 0.075014697409869768 +2544 6 6.21710253 0.2171025276184082 0.047133507498301697 +2545 6 5.887309 0.11269092559814453 0.012699244712166546 +2546 5 5.450121 0.45012092590332031 0.20260884793606238 +2547 5 5.08151436 0.081514358520507813 0.0066445906450098846 +2548 6 5.55139828 0.44860172271728516 0.201243505624916 +2549 5 5.91132641 0.91132640838623047 0.83051582262214652 +2550 5 5.08151436 0.081514358520507813 0.0066445906450098846 +2551 6 5.55139828 0.44860172271728516 0.201243505624916 +2552 5 4.86496 0.1350398063659668 0.018235749303357807 +2553 7 6.786768 0.21323204040527344 0.045467903055396164 +2554 7 6.776767 0.22323322296142578 0.049833071833745635 +2555 7 6.786768 0.21323204040527344 0.045467903055396164 +2556 5 5.62658167 0.62658166885375977 0.39260458774356266 +2557 7 6.776767 0.22323322296142578 0.049833071833745635 +2558 7 6.786768 0.21323204040527344 0.045467903055396164 +2559 5 5.06189 0.061890125274658203 0.0038303876065128861 +2560 6 5.631182 0.36881780624389648 0.13602657420256037 +2561 5 5.24192762 0.2419276237487793 0.05852897513273092 +2562 6 5.631182 0.36881780624389648 0.13602657420256037 +2563 5 5.06189 0.061890125274658203 0.0038303876065128861 +2564 6 5.62755537 0.37244462966918945 0.13871500216941968 +2565 5 5.40115833 0.40115833282470703 0.16092800799469842 +2566 7 6.38711166 0.61288833618164063 0.37563211262749974 +2567 5 6.20616 1.2061600685119629 1.454822110872783 +2568 6 5.408229 0.59177112579345703 0.35019306532285555 +2569 6 6.057435 0.057435035705566406 0.003298783326499688 +2570 5 6.20616 1.2061600685119629 1.454822110872783 +2571 6 6.188366 0.18836593627929688 0.035481725950376131 +2572 5 5.30330133 0.30330133438110352 0.091991699437357966 +2573 5 5.37471962 0.37471961975097656 0.14041479342631646 +2574 5 5.736238 0.73623800277709961 0.54204639673321253 +2575 6 5.9216547 0.078345298767089844 0.0061379858389045694 +2576 5 5.440002 0.4400019645690918 0.19360172882466031 +2577 5 5.652346 0.65234613418579102 0.42555547878714606 +2578 7 6.88552141 0.11447858810424805 0.013105347134342082 +2579 6 5.612733 0.38726711273193359 0.14997581660372816 +2580 5 5.30633926 0.30633926391601563 0.093843744616606273 +2581 7 6.78701258 0.21298742294311523 0.04536364233194945 +2582 7 6.78701258 0.21298742294311523 0.04536364233194945 +2583 7 6.78701258 0.21298742294311523 0.04536364233194945 +2584 7 6.78701258 0.21298742294311523 0.04536364233194945 +2585 7 6.78701258 0.21298742294311523 0.04536364233194945 +2586 7 6.78701258 0.21298742294311523 0.04536364233194945 +2587 6 5.47037554 0.52962446212768555 0.28050207088404022 +2588 7 6.78701258 0.21298742294311523 0.04536364233194945 +2589 4 4.558096 0.55809593200683594 0.31147106932257884 +2590 6 6.21032572 0.21032571792602539 0.044236907621097998 +2591 7 6.52475357 0.47524642944335938 0.22585916869866196 +2592 5 5.80257 0.80256986618041992 0.64411839010085714 +2593 5 5.87175465 0.87175464630126953 0.75995616334785154 +2594 7 6.80093145 0.19906854629516602 0.039628286124070655 +2595 5 5.0406127 0.040612697601318359 0.00164939120645613 +2596 5 5.361028 0.36102819442749023 0.13034135717157369 +2597 6 6.29323149 0.29323148727416992 0.085984705129021677 +2598 5 5.361028 0.36102819442749023 0.13034135717157369 +2599 6 5.52094364 0.47905635833740234 0.22949499446349364 +2600 7 6.705906 0.29409408569335938 0.086491331239813007 +2601 5 5.446015 0.4460148811340332 0.19892927419300577 +2602 6 6.29323149 0.29323148727416992 0.085984705129021677 +2603 7 6.834382 0.16561794281005859 0.027429302980635839 +2604 7 6.834382 0.16561794281005859 0.027429302980635839 +2605 6 5.62017155 0.37982845306396484 0.14426965375696454 +2606 6 6.07756424 0.077564239501953125 0.0060162112495163456 +2607 6 5.83296537 0.16703462600708008 0.027900566285325112 +2608 6 5.97012949 0.029870510101318359 0.00089224737371296214 +2609 6 5.62017155 0.37982845306396484 0.14426965375696454 +2610 5 5.357526 0.35752582550048828 0.1278247158998056 +2611 5 5.46344376 0.46344375610351563 0.21478011507133488 +2612 7 6.834382 0.16561794281005859 0.027429302980635839 +2613 5 5.212436 0.21243619918823242 0.045129138725542361 +2614 5 5.966585 0.96658515930175781 0.93428687018240453 +2615 7 6.66529751 0.33470249176025391 0.11202575799052283 +2616 7 6.66529751 0.33470249176025391 0.11202575799052283 +2617 7 6.66529751 0.33470249176025391 0.11202575799052283 +2618 7 6.16085 0.83914995193481445 0.70417264183220141 +2619 6 5.38147259 0.61852741241455078 0.38257615990823979 +2620 5 5.15913773 0.15913772583007813 0.025324815782369114 +2621 5 5.212436 0.21243619918823242 0.045129138725542361 +2622 7 6.16085 0.83914995193481445 0.70417264183220141 +2623 7 6.66529751 0.33470249176025391 0.11202575799052283 +2624 5 5.966585 0.96658515930175781 0.93428687018240453 +2625 5 4.83140373 0.16859626770019531 0.028424701482435921 +2626 7 6.534824 0.46517610549926758 0.21638880912746572 +2627 7 6.400417 0.59958314895629883 0.35949995251235123 +2628 6 5.97330952 0.026690483093261719 0.00071238188775168965 +2629 5 4.389117 0.61088323593139648 0.37317832794201422 +2630 6 5.90676069 0.093239307403564453 0.008693568445096389 +2631 7 6.491511 0.50848913192749023 0.25856119728837257 +2632 5 5.12749624 0.12749624252319336 0.016255291857532939 +2633 5 5.50522661 0.50522661209106445 0.25525392956501491 +2634 5 5.23011732 0.2301173210144043 0.052953981430846397 +2635 6 6.11222172 0.11222171783447266 0.012593713953719998 +2636 5 5.50522661 0.50522661209106445 0.25525392956501491 +2637 5 5.23011732 0.2301173210144043 0.052953981430846397 +2638 6 6.48589325 0.48589324951171875 0.23609224992105737 +2639 6 6.26323843 0.26323843002319336 0.069294471041075667 +2640 6 6.02032232 0.020322322845458984 0.00041299680583506415 +2641 5 5.49053431 0.49053430557250977 0.24062390494350439 +2642 5 5.27835655 0.27835655212402344 0.077482370110374177 +2643 5 5.37544632 0.37544631958007813 0.14095993888622615 +2644 6 6.076317 0.07631683349609375 0.005824259074870497 +2645 7 6.539323 0.46067714691162109 0.21222343368663132 +2646 7 6.03048754 0.9695124626159668 0.93995441516767642 +2647 5 5.53373 0.53373003005981445 0.28486774498765044 +2648 6 6.06513739 0.065137386322021484 0.0042428790968642716 +2649 6 6.076317 0.07631683349609375 0.005824259074870497 +2650 5 5.42053 0.42052984237670898 0.1768453483293797 +2651 5 4.88292837 0.11707162857055664 0.013705766216162374 +2652 7 6.700081 0.29991912841796875 0.08995148359099403 +2653 5 5.334144 0.33414411544799805 0.11165228988852505 +2654 5 4.79802275 0.20197725296020508 0.040794810713350671 +2655 5 5.59066868 0.59066867828369141 0.34888948750540294 +2656 4 5.534751 1.5347509384155273 2.3554604429673418 +2657 7 6.749618 0.2503819465637207 0.06269111916503789 +2658 7 6.35202026 0.647979736328125 0.4198777386918664 +2659 6 6.192402 0.19240188598632813 0.037018485731096007 +2660 6 5.35101557 0.64898443222045898 0.42118079326451152 +2661 6 5.839745 0.16025495529174805 0.025681650695560165 +2662 6 6.10311651 0.10311651229858398 0.010633015108624022 +2663 8 6.417799 1.5822010040283203 2.5033600171482249 +2664 7 6.837831 0.16216897964477539 0.026298777959027575 +2665 5 5.13746262 0.13746261596679688 0.018895970788435079 +2666 7 7.010816 0.010816097259521484 0.00011698795992742816 +2667 7 6.62150049 0.37849950790405273 0.14326187748361008 +2668 6 5.76007128 0.2399287223815918 0.057565791823662948 +2669 5 5.45352936 0.45352935791015625 0.20568887848639861 +2670 7 7.010816 0.010816097259521484 0.00011698795992742816 +2671 7 6.98377371 0.016226291656494141 0.00026329254092161136 +2672 7 6.54092646 0.45907354354858398 0.21074851838625364 +2673 6 5.08340025 0.91659975051879883 0.84015510265112425 +2674 7 5.778003 1.2219967842102051 1.4932761406200825 +2675 7 5.7659874 1.2340126037597656 1.5227871062379563 +2676 6 6.296325 0.2963252067565918 0.087808628159336877 +2677 6 6.534412 0.53441190719604492 0.28559608655291413 +2678 5 5.132459 0.13245916366577148 0.017545430039035637 +2679 6 5.927195 0.072804927825927734 0.0053005575157385465 +2680 6 6.597612 0.59761190414428711 0.3571399879749606 +2681 6 6.1629777 0.16297769546508789 0.02656172921911093 +2682 6 6.14354 0.1435399055480957 0.020603704484756236 +2683 5 5.132459 0.13245916366577148 0.017545430039035637 +2684 6 6.346119 0.34611892700195313 0.11979831162898336 +2685 7 6.700144 0.29985618591308594 0.089913732230343157 +2686 6 6.597612 0.59761190414428711 0.3571399879749606 +2687 5 5.44237471 0.44237470626831055 0.19569538074597403 +2688 6 6.1629777 0.16297769546508789 0.02656172921911093 +2689 6 5.927195 0.072804927825927734 0.0053005575157385465 +2690 6 5.39308643 0.60691356658935547 0.36834407731021201 +2691 6 5.943039 0.0569610595703125 0.0032445623073726892 +2692 6 5.38779 0.61220979690551758 0.37480083542709508 +2693 6 6.273909 0.27390909194946289 0.075026190652579317 +2694 6 5.943039 0.0569610595703125 0.0032445623073726892 +2695 6 6.42099857 0.42099857330322266 0.17723979872334894 +2696 6 5.61446333 0.38553667068481445 0.14863852444273107 +2697 5 5.986452 0.98645210266113281 0.97308775084457011 +2698 6 5.38779 0.61220979690551758 0.37480083542709508 +2699 6 5.39308643 0.60691356658935547 0.36834407731021201 +2700 7 6.558984 0.44101619720458984 0.19449528619679768 +2701 5 5.53186131 0.53186130523681641 0.28287644800820999 +2702 5 5.53186131 0.53186130523681641 0.28287644800820999 +2703 5 5.53186131 0.53186130523681641 0.28287644800820999 +2704 6 5.49847364 0.5015263557434082 0.25152868550526364 +2705 6 5.547789 0.45221090316772461 0.2044947009437692 +2706 6 5.459655 0.54034519195556641 0.29197292646949791 +2707 5 5.53186131 0.53186130523681641 0.28287644800820999 +2708 6 5.71547937 0.28452062606811523 0.080951986658192254 +2709 5 5.3331356 0.33313560485839844 0.11097933122437098 +2710 5 5.3331356 0.33313560485839844 0.11097933122437098 +2711 5 5.54598951 0.5459895133972168 0.29810454873972958 +2712 5 5.57248545 0.57248544692993164 0.32773958694656358 +2713 6 5.71547937 0.28452062606811523 0.080951986658192254 +2714 6 5.520475 0.47952508926391602 0.22994431123356662 +2715 6 5.81573725 0.18426275253295898 0.033952761971022483 +2716 5 5.3331356 0.33313560485839844 0.11097933122437098 +2717 6 6.06022024 0.060220241546630859 0.0036264774919345655 +2718 6 5.60196733 0.39803266525268555 0.15843000260815643 +2719 6 6.12731934 0.1273193359375 0.016210213303565979 +2720 7 6.82676744 0.1732325553894043 0.030009518246743028 +2721 5 5.071255 0.071255207061767578 0.0050773045334153721 +2722 7 7.01948929 0.019489288330078125 0.00037983235961291939 +2723 6 6.68752337 0.68752336502075195 0.47268837744945813 +2724 6 6.12731934 0.1273193359375 0.016210213303565979 +2725 5 5.315857 0.31585693359375 0.099765602499246597 +2726 6 6.010409 0.010408878326416016 0.00010834474801413307 +2727 6 6.110698 0.11069822311401367 0.012254096600599951 +2728 6 5.59660959 0.40339040756225586 0.16272382091324289 +2729 7 6.35478163 0.6452183723449707 0.41630674801149326 +2730 5 5.104849 0.10484886169433594 0.010993283798597986 +2731 5 5.09944868 0.099448680877685547 0.009890040128311739 +2732 5 5.08644629 0.086446285247802734 0.0074729602331444767 +2733 7 6.35478163 0.6452183723449707 0.41630674801149326 +2734 6 5.840015 0.15998506546020508 0.025595221170306104 +2735 6 5.59660959 0.40339040756225586 0.16272382091324289 +2736 6 6.110698 0.11069822311401367 0.012254096600599951 +2737 7 6.31539965 0.6846003532409668 0.46867764365765652 +2738 5 4.859411 0.14058923721313477 0.019765333620171077 +2739 7 6.79711866 0.2028813362121582 0.041160836583230775 +2740 6 5.55758953 0.44241046905517578 0.19572702312962065 +2741 5 4.859411 0.14058923721313477 0.019765333620171077 +2742 6 5.90890455 0.091095447540283203 0.0082983805625644891 +2743 6 5.42445946 0.57554054260253906 0.33124691617922508 +2744 6 5.42445946 0.57554054260253906 0.33124691617922508 +2745 7 6.68684959 0.31315040588378906 0.098063176705181831 +2746 6 5.8635807 0.13641929626464844 0.018610224393341923 +2747 6 5.836842 0.16315793991088867 0.026620513355965159 +2748 8 7.59587 0.40412998199462891 0.16332104234697908 +2749 6 5.836842 0.16315793991088867 0.026620513355965159 +2750 8 7.59587 0.40412998199462891 0.16332104234697908 +2751 6 6.33598948 0.33598947525024414 0.11288892747893442 +2752 6 6.41576338 0.41576337814331055 0.17285918660513744 +2753 8 6.57070065 1.4292993545532227 2.0428966449262589 +2754 5 4.82796144 0.17203855514526367 0.029597264456469929 +2755 5 5.026161 0.02616119384765625 0.00068440806353464723 +2756 6 5.25135136 0.74864864349365234 0.56047479140488576 +2757 5 5.6517005 0.65170049667358398 0.42471353736459605 +2758 6 5.7463727 0.25362730026245117 0.064326807438419564 +2759 6 6.056962 0.056962013244628906 0.0032446709528812789 +2760 6 6.05584574 0.055845737457275391 0.0031187463921469316 +2761 5 5.12640953 0.12640953063964844 0.015979369436536217 +2762 5 4.967308 0.03269195556640625 0.0010687639587558806 +2763 6 5.50983524 0.49016475677490234 0.24026148878419917 +2764 6 5.886604 0.11339616775512695 0.012858690861548894 +2765 6 6.373077 0.3730769157409668 0.13918638505879244 +2766 6 6.392993 0.39299297332763672 0.15444347708489659 +2767 6 5.886604 0.11339616775512695 0.012858690861548894 +2768 6 5.50983524 0.49016475677490234 0.24026148878419917 +2769 5 4.967308 0.03269195556640625 0.0010687639587558806 +2770 7 5.96291351 1.0370864868164063 1.075548381137196 +2771 6 6.006506 0.0065059661865234375 4.232759602018632E-05 +2772 7 7.188282 0.18828201293945313 0.035450116396532394 +2773 7 6.637038 0.36296176910400391 0.13174124583110824 +2774 8 7.22622252 0.77377748489379883 0.59873159612857307 +2775 8 7.22622252 0.77377748489379883 0.59873159612857307 +2776 8 7.13183546 0.8681645393371582 0.75370966736250011 +2777 6 5.887922 0.11207818984985352 0.012561520640019808 +2778 7 6.637038 0.36296176910400391 0.13174124583110824 +2779 5 6.17867136 1.1786713600158691 1.3892661749216586 +2780 5 4.9449873 0.055012702941894531 0.0030263974849731312 +2781 6 5.315123 0.68487691879272461 0.4690563938950163 +2782 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2783 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2784 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2785 5 5.21472025 0.21472024917602539 0.046104785406214432 +2786 6 6.152581 0.15258121490478516 0.023281027141820232 +2787 5 5.21472025 0.21472024917602539 0.046104785406214432 +2788 5 5.23888636 0.23888635635375977 0.057066691251975499 +2789 5 5.228488 0.22848796844482422 0.052206751724042988 +2790 6 5.94589329 0.054106712341308594 0.0029275363203851157 +2791 5 5.31389856 0.31389856338500977 0.098532308095172993 +2792 5 5.398319 0.39831876754760742 0.15865784058064492 +2793 7 6.85435152 0.14564847946166992 0.021213479569496485 +2794 5 5.27362 0.2736201286315918 0.074867974792368841 +2795 8 6.51372147 1.4862785339355469 2.2090238804375986 +2796 7 6.85435152 0.14564847946166992 0.021213479569496485 +2797 5 5.27362 0.2736201286315918 0.074867974792368841 +2798 7 6.320331 0.67966890335083008 0.46194981818212 +2799 7 6.312358 0.68764209747314453 0.4728516542172656 +2800 5 5.31389856 0.31389856338500977 0.098532308095172993 +2801 5 5.398319 0.39831876754760742 0.15865784058064492 +2802 6 5.911348 0.088652133941650391 0.0078592008524083212 +2803 8 7.10538 0.89461994171142578 0.80034484010775486 +2804 8 6.51372147 1.4862785339355469 2.2090238804375986 +2805 6 6.125227 0.12522697448730469 0.015681795139244059 +2806 5 5.57819366 0.57819366455078125 0.33430791372666135 +2807 5 5.467038 0.46703815460205078 0.21812463785408909 +2808 6 5.449633 0.55036687850952148 0.30290370096031438 +2809 7 6.89858437 0.10141563415527344 0.010285130851116264 +2810 7 6.5463047 0.45369529724121094 0.20583942273879074 +2811 5 5.89086533 0.89086532592773438 0.7936410289403284 +2812 6 6.117913 0.11791276931762695 0.013903421168151908 +2813 7 6.89858437 0.10141563415527344 0.010285130851116264 +2814 7 6.761442 0.23855781555175781 0.056909831360826502 +2815 5 5.678755 0.67875480651855469 0.46070808737204061 +2816 5 5.93518972 0.93518972396850586 0.87457981981629018 +2817 7 6.761442 0.23855781555175781 0.056909831360826502 +2818 4 5.07461357 1.0746135711669922 1.1547943273362762 +2819 6 6.01559734 0.015597343444824219 0.00024327712253580103 +2820 5 5.33604956 0.33604955673217773 0.11292930457989314 +2821 5 5.366424 0.3664240837097168 0.13426660912250554 +2822 5 5.85116053 0.85116052627563477 0.72447424148981554 +2823 6 6.01015854 0.010158538818359375 0.00010319591092411429 +2824 6 5.59928751 0.40071249008178711 0.16057049970754633 +2825 6 5.800588 0.19941186904907227 0.039765093517644345 +2826 6 5.48602867 0.51397132873535156 0.26416652676198282 +2827 7 6.66664076 0.3333592414855957 0.11112838388385171 +2828 7 6.66664076 0.3333592414855957 0.11112838388385171 +2829 5 5.41582632 0.41582632064819336 0.17291152894381412 +2830 5 5.8822813 0.88228130340576172 0.77842029833936977 +2831 5 5.240319 0.24031877517700195 0.05775311370257441 +2832 6 6.208396 0.20839595794677734 0.043428875288554991 +2833 7 6.11395073 0.88604927062988281 0.78508330998374731 +2834 6 6.35579 0.35579013824462891 0.12658662247213215 +2835 6 5.800588 0.19941186904907227 0.039765093517644345 +2836 6 5.48602867 0.51397132873535156 0.26416652676198282 +2837 6 5.82906437 0.17093563079833984 0.029218989876426349 +2838 7 6.760046 0.23995399475097656 0.057577919596951688 +2839 7 6.032847 0.96715307235717773 0.93538506536992827 +2840 6 6.251306 0.25130605697631836 0.06315473427298457 +2841 6 5.576804 0.42319583892822266 0.17909471808616217 +2842 6 5.73872662 0.26127338409423828 0.068263781236055365 +2843 6 5.85552 0.14448022842407227 0.020874536405472099 +2844 5 5.89313745 0.89313745498657227 0.7976945134998914 +2845 7 6.34599352 0.6540064811706543 0.42772447741322139 +2846 7 6.760046 0.23995399475097656 0.057577919596951688 +2847 5 6.01179361 1.0117936134338379 1.0237263161855026 +2848 5 5.079327 0.079327106475830078 0.0062927898218276823 +2849 5 4.88416767 0.11583232879638672 0.01341712839439424 +2850 5 5.665823 0.66582298278808594 0.44332024440882378 +2851 5 5.54855633 0.54855632781982422 0.30091404479117045 +2852 5 5.910392 0.91039180755615234 0.82881324326535832 +2853 6 6.005491 0.0054907798767089844 3.014866365447233E-05 +2854 6 6.1430006 0.14300060272216797 0.020449172378903313 +2855 7 6.55762529 0.44237470626831055 0.19569538074597403 +2856 7 6.736136 0.26386404037475586 0.06962423180289079 +2857 8 6.942888 1.0571122169494629 1.1174862392238083 +2858 7 6.55762529 0.44237470626831055 0.19569538074597403 +2859 6 5.91818142 0.081818580627441406 0.0066942801358891302 +2860 6 5.965876 0.034123897552490234 0.001164440384172849 +2861 6 6.1430006 0.14300060272216797 0.020449172378903313 +2862 6 6.691774 0.69177389144897461 0.47855111689045771 +2863 6 6.34304333 0.34304332733154297 0.11767872442669614 +2864 6 6.005491 0.0054907798767089844 3.014866365447233E-05 +2865 6 5.929855 0.070145130157470703 0.0049203392848085059 +2866 7 6.736136 0.26386404037475586 0.06962423180289079 +2867 7 6.4575305 0.54246950149536133 0.29427316005262583 +2868 5 5.651781 0.65178108215332031 0.42481857905295328 +2869 6 6.55753326 0.55753326416015625 0.31084334064507857 +2870 7 6.4575305 0.54246950149536133 0.29427316005262583 +2871 6 6.16480064 0.16480064392089844 0.027159252236742759 +2872 7 7.28570557 0.28570556640625 0.081627670675516129 +2873 8 6.998543 1.0014572143554688 1.0029165521846153 +2874 7 7.19103336 0.19103336334228516 0.036493745909865538 +2875 6 6.16480064 0.16480064392089844 0.027159252236742759 +2876 5 5.69884062 0.69884061813354492 0.48837820955327516 +2877 5 5.146617 0.14661693572998047 0.021496525842849223 +2878 6 6.674345 0.67434501647949219 0.45474120125072659 +2879 6 5.830216 0.1697840690612793 0.028826630107005258 +2880 5 5.48119974 0.48119974136352539 0.23155319108832373 +2881 7 6.59828854 0.40171146392822266 0.16137210025135573 +2882 5 5.83155537 0.83155536651611328 0.69148432758174749 +2883 7 6.65674639 0.34325361251831055 0.11782304250687048 +2884 7 6.89670372 0.10329627990722656 0.010670121442672098 +2885 6 6.895076 0.89507579803466797 0.80116068422739772 +2886 5 5.568845 0.56884479522705078 0.32358440105690534 +2887 5 6.2788415 1.278841495513916 1.6354355706482693 +2888 4 4.97987 0.97986984252929688 0.96014490829838905 +2889 6 6.17137671 0.17137670516967773 0.029369975074814647 +2890 8 6.99665642 1.0033435821533203 1.0066983438482566 +2891 6 6.11748743 0.11748743057250977 0.013803296342530302 +2892 5 5.10433245 0.10433244705200195 0.010885259507858791 +2893 7 7.350198 0.35019779205322266 0.12263849355895218 +2894 7 6.62656164 0.37343835830688477 0.13945620745494125 +2895 5 4.986747 0.013253211975097656 0.00017564762765687192 +2896 5 5.465397 0.46539688110351563 0.21659425694087986 +2897 5 5.10433245 0.10433244705200195 0.010885259507858791 +2898 5 5.67653847 0.67653846740722656 0.45770429788171896 +2899 5 5.324881 0.32488107681274414 0.10554771407100816 +2900 6 6.486866 0.48686599731445313 0.23703849934099708 +2901 7 6.934615 0.065384864807128906 0.0042751805458465242 +2902 5 5.470778 0.47077798843383789 0.2216319143938108 +2903 6 6.162005 0.16200494766235352 0.026245603067081902 +2904 7 6.578451 0.42154884338378906 0.17770342735821032 +2905 5 5.169223 0.16922283172607422 0.028636366777391231 +2906 5 5.311511 0.31151103973388672 0.09703912787608715 +2907 6 6.162005 0.16200494766235352 0.026245603067081902 +2908 6 5.8543663 0.14563369750976563 0.021209173850365914 +2909 6 6.204579 0.20457887649536133 0.041852516708104304 +2910 5 5.372203 0.37220287322998047 0.13853497884065291 +2911 5 5.470778 0.47077798843383789 0.2216319143938108 +2912 7 6.934615 0.065384864807128906 0.0042751805458465242 +2913 5 5.73384953 0.73384952545166016 0.53853512600562681 +2914 6 6.185189 0.18518877029418945 0.034294880643074066 +2915 6 6.185189 0.18518877029418945 0.034294880643074066 +2916 6 6.42385769 0.42385768890380859 0.17965534044287779 +2917 7 6.77903557 0.22096443176269531 0.048825280104210833 +2918 6 6.22794437 0.22794437408447266 0.05195863767676201 +2919 5 6.22429657 1.2242965698242188 1.4989020908833481 +2920 4 5.41122055 1.4112205505371094 1.9915434422582621 +2921 6 5.38592863 0.61407136917114258 0.37708364643572168 +2922 8 7.34079075 0.65920925140380859 0.43455683713636972 +2923 6 6.241174 0.24117422103881836 0.058165004893680816 +2924 6 6.01887941 0.018879413604736328 0.00035643225805870316 +2925 5 5.801418 0.80141782760620117 0.64227053440504278 +2926 8 7.500604 0.49939584732055664 0.24939621232101672 +2927 7 6.77533054 0.22466945648193359 0.050476364675887453 +2928 7 6.77533054 0.22466945648193359 0.050476364675887453 +2929 6 6.01887941 0.018879413604736328 0.00035643225805870316 +2930 8 6.95274448 1.0472555160522461 1.0967441159018563 +2931 8 7.500604 0.49939584732055664 0.24939621232101672 +2932 6 5.81837845 0.18162155151367188 0.032986387974233367 +2933 6 6.241174 0.24117422103881836 0.058165004893680816 +2934 5 5.40555 0.40555000305175781 0.16447080497528077 +2935 4 4.575317 0.5753169059753418 0.33098954230104027 +2936 5 5.563707 0.56370687484741211 0.31776544075023594 +2937 5 5.801418 0.80141782760620117 0.64227053440504278 +2938 8 7.290619 0.709381103515625 0.50322155002504587 +2939 8 7.290619 0.709381103515625 0.50322155002504587 +2940 6 5.923137 0.076862812042236328 0.0059078918750401499 +2941 5 5.50564241 0.50564241409301758 0.25567425092981466 +2942 5 5.4280076 0.42800760269165039 0.18319050796185365 +2943 8 7.290619 0.709381103515625 0.50322155002504587 +2944 6 5.923137 0.076862812042236328 0.0059078918750401499 +2945 8 7.50769234 0.49230766296386719 0.24236683501294465 +2946 6 6.43216467 0.43216466903686523 0.18676630116374326 +2947 6 6.43216467 0.43216466903686523 0.18676630116374326 +2948 6 5.295068 0.70493221282958984 0.49692942468482215 +2949 6 5.52491 0.47509002685546875 0.22571053361753002 +2950 5 4.885021 0.11497879028320313 0.013220122214988805 +2951 5 5.36800766 0.36800765991210938 0.13542963775398675 +2952 5 5.084062 0.084062099456787109 0.0070664365650827676 +2953 5 4.885021 0.11497879028320313 0.013220122214988805 +2954 7 6.80840158 0.19159841537475586 0.036709952774117482 +2955 5 5.89870071 0.89870071411132813 0.80766297354421113 +2956 6 5.952585 0.047414779663085938 0.0022481613304989878 +2957 6 6.248593 0.24859285354614258 0.061798406834213893 +2958 5 5.36800766 0.36800765991210938 0.13542963775398675 +2959 7 6.886067 0.11393308639526367 0.012980748175550616 +2960 7 6.864493 0.13550710678100586 0.018362175988158924 +2961 6 6.36556625 0.36556625366210938 0.1336386858165497 +2962 5 5.118201 0.11820077896118164 0.01397142414703012 +2963 7 7.14948225 0.14948225021362305 0.022344943128928207 +2964 5 5.77492046 0.77492046356201172 0.60050172484716313 +2965 8 7.51538849 0.48461151123046875 0.23484831681707874 +2966 6 6.015978 0.015977859497070313 0.00025529199410811998 +2967 6 6.015978 0.015977859497070313 0.00025529199410811998 +2968 5 5.458155 0.45815515518188477 0.20990614621973691 +2969 6 6.22913742 0.22913742065429688 0.052503957544104196 +2970 5 5.458155 0.45815515518188477 0.20990614621973691 +2971 5 5.00773525 0.0077352523803710938 5.9834129388036672E-05 +2972 6 5.95129251 0.048707485198974609 0.0023724191144083306 +2973 6 6.015978 0.015977859497070313 0.00025529199410811998 +2974 6 5.932331 0.067668914794921875 0.0045790820295223966 +2975 6 6.144719 0.14471912384033203 0.020943624805113359 +2976 6 6.486239 0.48623895645141602 0.23642832277096204 +2977 6 5.59412336 0.40587663650512695 0.16473584406071495 +2978 6 5.59412336 0.40587663650512695 0.16473584406071495 +2979 7 6.9594326 0.040567398071289063 0.0016457137862744275 +2980 7 6.92361832 0.076381683349609375 0.005834161551319994 +2981 7 6.22655535 0.77344465255737305 0.59821663056959551 +2982 6 5.876878 0.12312221527099609 0.015159079893237504 +2983 6 6.50105 0.50104999542236328 0.25105109791275027 +2984 6 5.62402534 0.37597465515136719 0.14135694131618948 +2985 7 6.68020248 0.31979751586914063 0.10227045115607325 +2986 7 6.68020248 0.31979751586914063 0.10227045115607325 +2987 7 6.55058336 0.4494166374206543 0.20197531399048785 +2988 7 6.21850634 0.7814936637878418 0.61073234654054431 +2989 6 5.910959 0.089041233062744141 0.0079283411853339203 +2990 7 7.23028851 0.23028850555419922 0.053032795790386444 +2991 7 6.61063051 0.38936948776245117 0.15160859800039361 +2992 7 6.59718561 0.40281438827514648 0.16225943140148047 +2993 7 6.55058336 0.4494166374206543 0.20197531399048785 +2994 7 6.55058336 0.4494166374206543 0.20197531399048785 +2995 6 6.2750206 0.27502059936523438 0.075636330075212754 +2996 8 6.401823 1.5981769561767578 2.5541695832544065 +2997 6 6.18262243 0.18262243270874023 0.033350952928458355 +2998 7 6.541024 0.45897579193115234 0.21065877757882845 +2999 7 6.55058336 0.4494166374206543 0.20197531399048785 +3000 7 6.68020248 0.31979751586914063 0.10227045115607325 +3001 7 6.59718561 0.40281438827514648 0.16225943140148047 +3002 7 6.61063051 0.38936948776245117 0.15160859800039361 +3003 7 6.21850634 0.7814936637878418 0.61073234654054431 +3004 6 6.146488 0.14648818969726563 0.021458789720782079 +3005 6 6.42360735 0.42360734939575195 0.17944318646209467 +3006 6 5.910959 0.089041233062744141 0.0079283411853339203 +3007 7 7.23028851 0.23028850555419922 0.053032795790386444 +3008 7 7.15494442 0.15494441986083984 0.024007773246012221 +3009 6 5.6800313 0.31996870040893555 0.10237996924138315 +3010 5 5.513453 0.51345300674438477 0.26363399013484923 +3011 6 6.520062 0.52006196975708008 0.27046445238761407 +3012 6 6.48770046 0.48770046234130859 0.23785174096792616 +3013 6 6.24235773 0.24235773086547852 0.058737269710263718 +3014 6 5.79948 0.20052003860473633 0.040208285882044947 +3015 6 6.15257168 0.15257167816162109 0.023278116977053287 +3016 6 6.24235773 0.24235773086547852 0.058737269710263718 +3017 6 6.489136 0.4891362190246582 0.2392542407617384 +3018 8 6.62297249 1.3770275115966797 1.8962047676941438 +3019 6 6.15257168 0.15257167816162109 0.023278116977053287 +3020 6 5.213552 0.78644800186157227 0.61850045963205957 +3021 4 4.974067 0.97406721115112305 0.94880693183972653 +3022 5 4.710317 0.28968286514282227 0.083916162357354551 +3023 6 5.79948 0.20052003860473633 0.040208285882044947 +3024 6 6.24235773 0.24235773086547852 0.058737269710263718 +3025 7 6.508888 0.49111223220825195 0.24119122462457199 +3026 6 5.723984 0.2760162353515625 0.07618496217764914 +3027 5 5.5033226 0.50332260131835938 0.25333364099788014 +3028 6 5.96375751 0.036242485046386719 0.0013135177223375649 +3029 8 7.416451 0.58354902267456055 0.34052946186443478 +3030 8 7.416451 0.58354902267456055 0.34052946186443478 +3031 6 6.04504347 0.045043468475341797 0.0020289140522891103 +3032 5 5.87561035 0.8756103515625 0.76669348776340485 +3033 6 5.65504551 0.34495449066162109 0.11899360062761843 +3034 6 5.53221226 0.46778774261474609 0.21882537214059994 +3035 7 6.369083 0.63091707229614258 0.398056352114736 +3036 5 5.41204548 0.41204547882080078 0.16978147661666299 +3037 6 5.73057842 0.26942157745361328 0.07258798639759334 +3038 6 6.314134 0.31413412094116211 0.098680245939476663 +3039 6 5.26212549 0.73787450790405273 0.54445878941464798 +3040 5 5.86243534 0.86243534088134766 0.74379471720112633 +3041 6 5.70183754 0.29816246032714844 0.088900852748338366 +3042 6 5.73057842 0.26942157745361328 0.07258798639759334 +3043 6 5.6588273 0.34117269515991211 0.11639880792267832 +3044 6 5.51266575 0.48733425140380859 0.23749467259131052 +3045 6 5.94866943 0.05133056640625 0.002634827047586441 +3046 6 6.56467533 0.56467533111572266 0.31885822957065102 +3047 5 5.94285536 0.9428553581237793 0.88897622634272011 +3048 6 6.12261629 0.12261629104614258 0.015034754829912345 +3049 5 5.07569933 0.075699329376220703 0.0057303884680095507 +3050 4 3.875888 0.12411189079284668 0.0154037614361755 +3051 5 5.07569933 0.075699329376220703 0.0057303884680095507 +3052 7 6.43984032 0.56015968322753906 0.31377887071357691 +3053 5 5.956705 0.95670509338378906 0.91528463570648455 +3054 6 5.982073 0.017927169799804688 0.00032138341703102924 +3055 6 6.134855 0.13485479354858398 0.018185815343031209 +3056 5 5.5363574 0.53635740280151367 0.28767926353998519 +3057 5 6.647654 1.6476540565490723 2.7147638900626134 +3058 5 5.50795 0.5079498291015625 0.25801302888430655 +3059 6 5.59066057 0.40933942794799805 0.16755876727279428 +3060 5 5.509139 0.50913906097412109 0.2592225834096098 +3061 5 5.509139 0.50913906097412109 0.2592225834096098 +3062 8 7.033389 0.96661090850830078 0.93433664844724262 +3063 5 5.509139 0.50913906097412109 0.2592225834096098 +3064 5 5.22793436 0.22793436050415039 0.051954072698435994 +3065 6 6.23876572 0.23876571655273438 0.057009067400940694 +3066 5 5.22793436 0.22793436050415039 0.051954072698435994 +3067 4 5.505729 1.5057291984558105 2.2672204190823777 +3068 6 6.50907 0.50906991958618164 0.25915218302748144 +3069 8 6.38527441 1.6147255897521973 2.6073387302005813 +3070 8 7.033389 0.96661090850830078 0.93433664844724262 +3071 7 6.54769325 0.45230674743652344 0.204581393776607 +3072 6 6.571671 0.5716710090637207 0.32680774260393264 +3073 5 6.574811 1.5748109817504883 2.4800296282419367 +3074 5 6.086039 1.0860390663146973 1.1794808535616994 +3075 7 6.844268 0.15573215484619141 0.024252504053038137 +3076 5 5.242751 0.24275112152099609 0.058928106999701413 +3077 5 5.50795 0.5079498291015625 0.25801302888430655 +3078 5 6.399005 1.3990049362182617 1.9572148115630625 +3079 5 5.968719 0.9687190055847168 0.93841651178104257 +3080 6 5.59066057 0.40933942794799805 0.16755876727279428 +3081 5 5.509139 0.50913906097412109 0.2592225834096098 +3082 6 6.13533974 0.13533973693847656 0.018316844394576037 +3083 7 7.16997147 0.16997146606445313 0.02889029927609954 +3084 6 6.52068233 0.52068233489990234 0.27111009387681406 +3085 6 5.80988169 0.19011831283569336 0.036144972875490566 +3086 7 7.16997147 0.16997146606445313 0.02889029927609954 +3087 3 5.34159374 2.3415937423706055 5.4830612543091775 +3088 6 6.286271 0.28627109527587891 0.081951139990451338 +3089 7 7.03953838 0.039538383483886719 0.0015632837685188861 +3090 6 6.52068233 0.52068233489990234 0.27111009387681406 +3091 6 5.47072268 0.52927732467651367 0.28013448641672767 +3092 6 5.913515 0.086484909057617188 0.0074796394947043154 +3093 7 6.608788 0.39121198654174805 0.15304681841394085 +3094 6 5.412697 0.58730316162109375 0.34492500365013257 +3095 6 5.412697 0.58730316162109375 0.34492500365013257 +3096 7 6.48468733 0.51531267166137695 0.26554714957478609 +3097 5 5.1353054 0.13530540466308594 0.018307552531041438 +3098 7 6.575067 0.42493295669555664 0.18056801768602782 +3099 7 6.55274343 0.44725656509399414 0.20003843501967822 +3100 7 6.564502 0.43549823760986328 0.18965871496129694 +3101 6 6.057678 0.05767822265625 0.0033267773687839508 +3102 6 5.620618 0.37938213348388672 0.14393080320678564 +3103 7 6.608788 0.39121198654174805 0.15304681841394085 +3104 5 5.81254339 0.81254339218139648 0.66022676417765069 +3105 6 5.8328824 0.16711759567260742 0.027928290783393095 +3106 6 5.913515 0.086484909057617188 0.0074796394947043154 +3107 6 5.97155666 0.028443336486816406 0.00080902339050226146 +3108 5 5.34724665 0.34724664688110352 0.1205802337701698 +3109 4 5.416677 1.4166769981384277 2.0069737170545068 +3110 6 6.21659756 0.21659755706787109 0.046914501727769675 +3111 7 6.4117794 0.58822059631347656 0.34600346992738196 +3112 5 5.77784157 0.77784156799316406 0.60503750489806407 +3113 6 5.67790174 0.3220982551574707 0.1037472859754871 +3114 6 6.22823238 0.22823238372802734 0.052090020982177521 +3115 6 6.22823238 0.22823238372802734 0.052090020982177521 +3116 7 6.6314764 0.36852359771728516 0.13580964207449142 +3117 7 6.4117794 0.58822059631347656 0.34600346992738196 +3118 7 6.842666 0.1573338508605957 0.024753940626624171 +3119 5 4.480663 0.51933717727661133 0.26971110370163842 +3120 6 5.473927 0.52607297897338867 0.27675277920593544 +3121 5 5.77784157 0.77784156799316406 0.60503750489806407 +3122 6 6.684882 0.68488216400146484 0.46906357856732939 +3123 5 5.57188 0.57187986373901367 0.32704657855015284 +3124 6 5.67790174 0.3220982551574707 0.1037472859754871 +3125 5 5.86090946 0.86090946197509766 0.74116510171825212 +3126 7 6.18981934 0.8101806640625 0.65639270842075348 +3127 5 5.27245855 0.27245855331420898 0.07423366327407166 +3128 6 6.35644531 0.3564453125 0.12705326080322266 +3129 6 6.19748068 0.19748067855834961 0.038998618403866203 +3130 6 6.409672 0.40967178344726563 0.1678309701528633 +3131 5 5.323311 0.32331085205078125 0.10452990705380216 +3132 6 6.22823238 0.22823238372802734 0.052090020982177521 +3133 6 6.804864 0.80486392974853516 0.64780594541025494 +3134 6 6.25683546 0.2568354606628418 0.065964453853894156 +3135 6 5.50061226 0.49938774108886719 0.24938811594984145 +3136 5 5.691658 0.69165802001953125 0.47839081665733829 +3137 6 5.91075134 0.0892486572265625 0.0079653228167444468 +3138 6 6.17344761 0.17344760894775391 0.030084073049692961 +3139 6 5.802101 0.19789886474609375 0.039163960667792708 +3140 6 5.50061226 0.49938774108886719 0.24938811594984145 +3141 7 5.9250927 1.0749073028564453 1.1554257097341178 +3142 6 5.879329 0.12067079544067383 0.014561440872284948 +3143 5 5.691658 0.69165802001953125 0.47839081665733829 +3144 6 5.77687073 0.2231292724609375 0.049786672228947282 +3145 6 5.77687073 0.2231292724609375 0.049786672228947282 +3146 6 5.77687073 0.2231292724609375 0.049786672228947282 +3147 6 5.7887 0.21129989624023438 0.044647646151133813 +3148 6 5.77687073 0.2231292724609375 0.049786672228947282 +3149 6 5.7887 0.21129989624023438 0.044647646151133813 +3150 6 6.552973 0.55297279357910156 0.30577891043867567 +3151 6 5.77687073 0.2231292724609375 0.049786672228947282 +3152 6 6.29596758 0.29596757888793945 0.087596807752788663 +3153 6 6.57904625 0.57904624938964844 0.33529455893221893 +3154 6 6.63049746 0.63049745559692383 0.39752704151419493 +3155 7 6.82934952 0.17065048217773438 0.029121587067493238 +3156 5 5.67358 0.67358016967773438 0.45371024498308543 +3157 7 6.82934952 0.17065048217773438 0.029121587067493238 +3158 7 6.98705864 0.012941360473632813 0.00016747881090850569 +3159 6 6.197915 0.19791507720947266 0.039170377786831523 +3160 6 5.27915764 0.72084236145019531 0.51961371006109403 +3161 5 5.67358 0.67358016967773438 0.45371024498308543 +3162 7 6.82934952 0.17065048217773438 0.029121587067493238 +3163 7 6.98705864 0.012941360473632813 0.00016747881090850569 +3164 6 6.049068 0.049067974090576172 0.0024076660813534545 +3165 6 5.795661 0.20433902740478516 0.041754438120733539 +3166 6 6.68478 0.68478012084960938 0.46892381391080562 +3167 7 6.718583 0.28141689300537109 0.079195467668796482 +3168 6 6.54174137 0.54174137115478516 0.29348371322066669 +3169 6 5.92151976 0.078480243682861328 0.0061591486485212954 +3170 6 5.791986 0.20801401138305664 0.043269828931670418 +3171 6 6.27425241 0.27425241470336914 0.075214386970628766 +3172 8 6.91158056 1.0884194374084473 1.1846568717285209 +3173 8 6.943484 1.056516170501709 1.1162264185315962 +3174 8 7.140918 0.85908222198486328 0.73802226413044991 +3175 6 5.82636833 0.17363166809082031 0.030147956164000789 +3176 6 6.27425241 0.27425241470336914 0.075214386970628766 +3177 5 5.40304852 0.40304851531982422 0.16244810570151458 +3178 6 5.904733 0.095266819000244141 0.009075766802425278 +3179 4 5.34976625 1.3497662544250488 1.8218689415846256 +3180 6 6.09114075 0.0911407470703125 0.0083066357765346766 +3181 6 5.82293367 0.17706632614135742 0.031352483853197555 +3182 5 5.466745 0.46674489974975586 0.21785080144240965 +3183 6 6.09114075 0.0911407470703125 0.0083066357765346766 +3184 7 6.72175 0.27825021743774414 0.077423183504151893 +3185 6 6.193929 0.19392919540405273 0.037608532830063268 +3186 4 4.74268866 0.74268865585327148 0.55158643953313913 +3187 7 6.51981544 0.48018455505371094 0.23057720691213035 +3188 8 6.383476 1.6165242195129395 2.6131505522719181 +3189 5 6.088178 1.0881781578063965 1.1841317031269227 +3190 7 6.87083149 0.12916851043701172 0.016684504088516405 +3191 6 6.10227966 0.1022796630859375 0.010461129480972886 +3192 6 5.82293367 0.17706632614135742 0.031352483853197555 +3193 5 5.466745 0.46674489974975586 0.21785080144240965 +3194 5 5.14224625 0.14224624633789063 0.020233994597219862 +3195 6 6.35519457 0.3551945686340332 0.12616318158711692 +3196 7 6.662787 0.33721303939819336 0.11371263394016751 +3197 6 6.28416348 0.28416347503662109 0.08074888054488838 +3198 7 6.662787 0.33721303939819336 0.11371263394016751 +3199 7 6.551546 0.44845390319824219 0.20111090329373837 +3200 7 6.88238239 0.11761760711669922 0.013833901503858215 +3201 6 6.28416348 0.28416347503662109 0.08074888054488838 +3202 7 6.82695961 0.17304039001464844 0.029942976576421643 +3203 7 6.662787 0.33721303939819336 0.11371263394016751 +3204 5 5.4833374 0.48333740234375 0.23361504450440407 +3205 7 6.790349 0.20965099334716797 0.043953539011454268 +3206 7 6.6648407 0.3351593017578125 0.11233175755478442 +3207 6 5.90315056 0.096849441528320313 0.0093798143243475351 +3208 5 5.82796144 0.82796144485473633 0.68552015416594259 +3209 5 5.283647 0.28364706039428711 0.080455654870320359 +3210 5 5.10347 0.1034698486328125 0.010706009576097131 +3211 6 6.325734 0.32573413848876953 0.10610272897702089 +3212 5 5.89880943 0.89880943298339844 0.80785839681993821 +3213 6 6.095028 0.095027923583984375 0.0090303062606835738 +3214 6 6.032912 0.032911777496337891 0.0010831850979684532 +3215 6 6.215619 0.21561908721923828 0.046491590773257485 +3216 5 6.05285549 1.0528554916381836 1.1085046862726813 +3217 5 5.10347 0.1034698486328125 0.010706009576097131 +3218 4 4.99512243 0.99512243270874023 0.99026865608016124 +3219 7 7.1460166 0.14601659774780273 0.021320846817843631 +3220 5 5.281718 0.28171777725219727 0.079364906019918635 +3221 6 6.06428576 0.064285755157470703 0.0041326583161662711 +3222 6 6.43231153 0.4323115348815918 0.18689326319167776 +3223 6 6.325734 0.32573413848876953 0.10610272897702089 +3224 6 6.32958174 0.32958173751831055 0.10862412170558855 +3225 7 6.761118 0.23888206481933594 0.057064640892349416 +3226 6 5.82882 0.17117977142333984 0.029302514144546876 +3227 6 5.391242 0.60875797271728516 0.3705862693468589 +3228 6 5.322149 0.67785120010375977 0.45948224948210736 +3229 7 6.31338024 0.68661975860595703 0.4714466929081027 +3230 6 5.74693727 0.25306272506713867 0.064040742818406216 +3231 6 6.2914443 0.29144430160522461 0.084939780938157128 +3232 5 5.656669 0.65666913986206055 0.43121435924717844 +3233 6 6.092935 0.092935085296630859 0.0086369300790920533 +3234 6 5.68389225 0.31610774993896484 0.099924109571475128 +3235 6 6.32958174 0.32958173751831055 0.10862412170558855 +3236 6 6.649334 0.64933395385742188 0.42163458363211248 +3237 7 6.340934 0.65906620025634766 0.43436825632034015 +3238 5 5.51837444 0.51837444305419922 0.26871206321175123 +3239 7 6.528462 0.47153806686401367 0.22234814850185103 +3240 6 6.119747 0.11974716186523438 0.014339382774778642 +3241 7 6.288209 0.71179103851318359 0.50664648250767641 +3242 6 6.735002 0.73500204086303711 0.54022800007282967 +3243 7 6.528462 0.47153806686401367 0.22234814850185103 +3244 7 6.99367666 0.0063233375549316406 3.9984597833608859E-05 +3245 5 5.51837444 0.51837444305419922 0.26871206321175123 +3246 6 6.341593 0.34159278869628906 0.11668563328930759 +3247 6 6.160589 0.16058921813964844 0.025788896982703591 +3248 7 6.334379 0.66562080383300781 0.44305105449529947 +3249 7 6.340934 0.65906620025634766 0.43436825632034015 +3250 6 6.49080849 0.49080848693847656 0.24089297085083672 +3251 6 5.777203 0.22279691696166992 0.049638466207625243 +3252 8 7.08904171 0.91095829010009766 0.82984500630209368 +3253 8 6.85280943 1.1471905708312988 1.3160462058042413 +3254 5 5.71421432 0.71421432495117188 0.51010210196545813 +3255 6 6.17674065 0.17674064636230469 0.031237256076565245 +3256 6 6.17674065 0.17674064636230469 0.031237256076565245 +3257 6 6.17674065 0.17674064636230469 0.031237256076565245 +3258 6 6.17674065 0.17674064636230469 0.031237256076565245 +3259 6 6.17674065 0.17674064636230469 0.031237256076565245 +3260 6 6.17674065 0.17674064636230469 0.031237256076565245 +3261 5 6.501572 1.5015721321105957 2.2547188679311603 +3262 7 6.08501053 0.91498947143554688 0.83720573283790145 +3263 8 6.942888 1.0571122169494629 1.1174862392238083 +3264 6 5.505711 0.49428892135620117 0.24432153777547683 +3265 3 4.54897 1.5489702224731445 2.3993087501085029 +3266 6 6.58011961 0.58011960983276367 0.33653876171251795 +3267 6 5.685798 0.31420183181762695 0.098722791117552333 +3268 6 6.51728153 0.51728153228759766 0.26758018364580494 +3269 5 5.194649 0.19464921951293945 0.037888318656996489 +3270 5 5.62863445 0.62863445281982422 0.3951812752720798 +3271 7 6.91132069 0.088679313659667969 0.007864020671149774 +3272 7 6.28210831 0.71789169311523438 0.51536848304385785 +3273 7 6.65070963 0.34929037094116211 0.12200376323221462 +3274 5 6.301177 1.3011770248413086 1.6930616499748794 +3275 4 4.98606348 0.98606348037719727 0.9723211873335913 +3276 8 6.586558 1.4134421348571777 1.9978186685896162 +3277 7 6.193134 0.80686616897583008 0.65103301463773278 +3278 5 5.194649 0.19464921951293945 0.037888318656996489 +3279 6 6.136546 0.13654613494873047 0.018644846969436912 +3280 5 5.62863445 0.62863445281982422 0.3951812752720798 +3281 6 6.2605443 0.2605443000793457 0.067883332303836141 +3282 7 6.755175 0.24482488632202148 0.059939224962590743 +3283 6 5.89885426 0.10114574432373047 0.010230461594801454 +3284 6 6.46161127 0.46161127090454102 0.21308496542610555 +3285 7 6.49714661 0.5028533935546875 0.25286153540946543 +3286 7 6.49714661 0.5028533935546875 0.25286153540946543 +3287 7 6.49714661 0.5028533935546875 0.25286153540946543 +3288 6 5.89885426 0.10114574432373047 0.010230461594801454 +3289 5 5.394889 0.39488887786865234 0.15593722586436343 +3290 5 5.02319241 0.023192405700683594 0.00053788768218510086 +3291 8 7.547108 0.45289182662963867 0.20511100662793069 +3292 5 5.335712 0.33571195602416992 0.1127025174175742 +3293 7 6.790994 0.20900583267211914 0.043683438090965865 +3294 6 5.969035 0.030964851379394531 0.0009588220209479914 +3295 5 5.335712 0.33571195602416992 0.1127025174175742 +3296 5 5.394889 0.39488887786865234 0.15593722586436343 +3297 5 5.25800228 0.25800228118896484 0.066565177098709682 +3298 6 6.58663559 0.58663558959960938 0.34414131498488132 +3299 7 6.85647964 0.14352035522460938 0.02059809236379806 +3300 5 5.02319241 0.023192405700683594 0.00053788768218510086 +3301 8 7.547108 0.45289182662963867 0.20511100662793069 +3302 6 6.49868536 0.49868535995483398 0.24868708823328234 +3303 7 7.06750154 0.067501544952392578 0.0045564585709598759 +3304 7 6.8259 0.17409992218017578 0.030310782903143263 +3305 7 6.88384533 0.11615467071533203 0.013491907528987213 +3306 7 6.8259 0.17409992218017578 0.030310782903143263 +3307 3 4.26481676 1.2648167610168457 1.5997614389491446 +3308 6 5.821937 0.17806291580200195 0.031706401983910837 +3309 7 6.864188 0.13581180572509766 0.018444846574311669 +3310 7 6.63826466 0.36173534393310547 0.1308524590504021 +3311 7 6.64104462 0.35895538330078125 0.12884896720061079 +3312 7 6.83067465 0.16932535171508789 0.028671074733438218 +3313 7 6.495117 0.5048828125 0.25490665435791016 +3314 6 5.24939156 0.75060844421386719 0.56341303652516217 +3315 7 6.582058 0.41794204711914063 0.17467555475013796 +3316 6 6.150711 0.1507110595703125 0.022713823476806283 +3317 6 6.219473 0.21947288513183594 0.048168347308092052 +3318 7 6.88627434 0.11372566223144531 0.012933526249980787 +3319 5 5.747709 0.74770879745483398 0.55906844579135395 +3320 5 5.46364069 0.46364068984985352 0.21496268928444806 +3321 6 6.665048 0.66504812240600586 0.44228900511575375 +3322 7 6.532551 0.46744918823242188 0.21850874357915018 +3323 6 6.240052 0.24005222320556641 0.057625069865935075 +3324 6 6.08869743 0.088697433471679688 0.0078672347044630442 +3325 7 6.89654064 0.10345935821533203 0.010703838802328391 +3326 5 5.79227972 0.79227972030639648 0.62770715520878184 +3327 7 6.35024261 0.64975738525390625 0.42218465969199315 +3328 5 6.04183865 1.0418386459350586 1.0854277641637964 +3329 6 6.247655 0.24765491485595703 0.061332956852311327 +3330 6 5.831267 0.16873311996459961 0.028470865772987963 +3331 6 5.919561 0.080439090728759766 0.0064704473172696453 +3332 7 6.377422 0.62257814407348633 0.3876035454779867 +3333 6 5.8897295 0.11027050018310547 0.012159583210632263 +3334 6 6.143303 0.14330291748046875 0.020535726158414036 +3335 6 5.75408459 0.24591541290283203 0.060474390303170367 +3336 6 5.75408459 0.24591541290283203 0.060474390303170367 +3337 6 5.75408459 0.24591541290283203 0.060474390303170367 +3338 6 5.60831547 0.39168453216552734 0.15341677273772802 +3339 6 5.82486 0.1751399040222168 0.030673985980911311 +3340 6 6.15751743 0.15751743316650391 0.024811741751364025 +3341 6 5.82486 0.1751399040222168 0.030673985980911311 +3342 5 6.1723876 1.1723875999450684 1.3744926845049577 +3343 7 5.75408459 1.245915412902832 1.5523052161088344 +3344 6 5.75408459 0.24591541290283203 0.060474390303170367 +3345 6 5.966821 0.033178806304931641 0.0011008331878201716 +3346 6 6.03729343 0.037293434143066406 0.0013908002301832312 +3347 6 5.92844629 0.071553707122802734 0.0051199330030158308 +3348 6 5.60831547 0.39168453216552734 0.15341677273772802 +3349 6 5.91756773 0.082432270050048828 0.006795079145604177 +3350 6 6.548047 0.54804706573486328 0.30035558626059355 +3351 6 6.277173 0.27717304229736328 0.076824895376375935 +3352 6 6.47151852 0.47151851654052734 0.22232971144057956 +3353 6 6.58518934 0.5851893424987793 0.34244656657415362 +3354 7 6.602699 0.39730119705200195 0.15784824117895369 +3355 6 6.42606449 0.42606449127197266 0.18153095072284486 +3356 6 6.10781574 0.10781574249267578 0.011624234329246974 +3357 7 6.543994 0.45600605010986328 0.20794151773679914 +3358 6 6.47151852 0.47151851654052734 0.22232971144057956 +3359 6 6.58518934 0.5851893424987793 0.34244656657415362 +3360 7 6.2223 0.77769994735717773 0.60481720811935702 +3361 6 5.91756773 0.082432270050048828 0.006795079145604177 +3362 6 6.548047 0.54804706573486328 0.30035558626059355 +3363 6 6.277173 0.27717304229736328 0.076824895376375935 +3364 6 5.90372133 0.096278667449951172 0.0092695818059382873 +3365 7 6.63396263 0.36603736877441406 0.13398335533929639 +3366 6 5.96370554 0.036294460296630859 0.0013172878482237138 +3367 6 6.489716 0.4897160530090332 0.23982181257474622 +3368 6 6.01148844 0.011488437652587891 0.00013198419969739916 +3369 7 6.62011242 0.37988758087158203 0.14431457410046278 +3370 6 6.489716 0.4897160530090332 0.23982181257474622 +3371 6 5.96370554 0.036294460296630859 0.0013172878482237138 +3372 6 6.022456 0.022456169128417969 0.00050427953192411223 +3373 7 6.69619131 0.30380868911743164 0.092299719583252227 +3374 5 5.58121252 0.58121252059936523 0.33780799410146756 +3375 6 5.89713144 0.10286855697631836 0.010581940014390057 +3376 6 6.01148844 0.011488437652587891 0.00013198419969739916 +3377 6 5.62079573 0.37920427322387695 0.14379588083124872 +3378 8 6.87112474 1.1288752555847168 1.2743593426714597 +3379 5 5.21237 0.21236991882324219 0.045100982420990476 +3380 7 6.88039255 0.11960744857788086 0.014305941755310414 +3381 7 6.271736 0.72826385498046875 0.53036824247101322 +3382 7 6.88039255 0.11960744857788086 0.014305941755310414 +3383 6 6.329866 0.32986593246459961 0.10881153340073979 +3384 6 5.979552 0.020448207855224609 0.00041812920449046942 +3385 6 6.449695 0.44969511032104492 0.20222569224665676 +3386 8 6.87112474 1.1288752555847168 1.2743593426714597 +3387 5 5.21237 0.21236991882324219 0.045100982420990476 +3388 6 6.05053949 0.050539493560791016 0.0025542404093812365 +3389 7 6.30515575 0.69484424591064453 0.48280852607513225 +3390 6 6.66295433 0.66295433044433594 0.43950844425489777 +3391 8 6.74995852 1.2500414848327637 1.5626037138029005 +3392 6 6.621238 0.62123823165893555 0.38593694047472127 +3393 6 6.36947775 0.36947774887084961 0.13651380691067061 +3394 5 5.39704227 0.39704227447509766 0.15764256772035878 +3395 5 5.373434 0.37343406677246094 0.13945300222621881 +3396 6 6.138471 0.13847112655639648 0.019174252889797572 +3397 6 5.92073 0.079269886016845703 0.0062837148291237099 +3398 5 5.2734704 0.27347040176391602 0.07478606064091764 +3399 6 6.54232168 0.54232168197631836 0.29411280674162299 +3400 6 5.57562637 0.42437362670898438 0.18009297504613642 +3401 5 5.95026827 0.95026826858520508 0.90300978227992346 +3402 6 5.57562637 0.42437362670898438 0.18009297504613642 +3403 5 5.576545 0.57654476165771484 0.33240386219495122 +3404 6 5.64468765 0.35531234741210938 0.12624686422350351 +3405 6 5.69383144 0.30616855621337891 0.093739184813784959 +3406 6 6.54232168 0.54232168197631836 0.29411280674162299 +3407 5 5.2734704 0.27347040176391602 0.07478606064091764 +3408 6 5.49997 0.5000300407409668 0.25003004164341291 +3409 3 5.422972 2.4229722023010254 5.8707942931234811 +3410 7 6.42703629 0.57296371459960938 0.32828741824778263 +3411 6 6.082336 0.082335948944091797 0.0067792084885240911 +3412 6 5.93208647 0.067913532257080078 0.0046122478636334563 +3413 6 5.80584955 0.19415044784545898 0.037694396398592289 +3414 7 6.42703629 0.57296371459960938 0.32828741824778263 +3415 7 6.906441 0.093558788299560547 0.0087532468680819875 +3416 6 5.7981596 0.20184040069580078 0.040739547353041416 +3417 4 5.648217 1.6482172012329102 2.7166199424400475 +3418 6 5.7981596 0.20184040069580078 0.040739547353041416 +3419 7 6.906441 0.093558788299560547 0.0087532468680819875 +3420 5 5.076156 0.076156139373779297 0.0057997575643184973 +3421 8 6.9551363 1.0448637008666992 1.0917401533888551 +3422 8 7.30042028 0.69957971572875977 0.48941177865913232 +3423 5 6.032946 1.0329461097717285 1.0669776656925478 +3424 6 6.488739 0.488739013671875 0.23886582348495722 +3425 6 6.02926636 0.029266357421875 0.0008565196767449379 +3426 6 6.02926636 0.029266357421875 0.0008565196767449379 +3427 6 6.38952971 0.38952970504760742 0.15173339111447603 +3428 6 6.488739 0.488739013671875 0.23886582348495722 +3429 5 6.032946 1.0329461097717285 1.0669776656925478 +3430 6 6.02926636 0.029266357421875 0.0008565196767449379 +3431 6 5.95420551 0.045794486999511719 0.0020971350395484478 +3432 5 5.72369337 0.7236933708190918 0.52373209496749951 +3433 7 6.750839 0.2491607666015625 0.062081087613478303 +3434 6 5.810501 0.1894989013671875 0.035909833619371057 +3435 6 6.1824975 0.18249750137329102 0.033305338007494356 +3436 6 5.727087 0.27291297912597656 0.074481494175415719 +3437 5 5.06997871 0.069978713989257813 0.0048970204115903471 +3438 5 5.142187 0.14218711853027344 0.020217176675942028 +3439 5 5.06997871 0.069978713989257813 0.0048970204115903471 +3440 5 6.299023 1.2990231513977051 1.687461147867225 +3441 5 5.871353 0.8713531494140625 0.75925631099380553 +3442 7 6.475973 0.52402687072753906 0.27460416124449694 +3443 6 5.77484274 0.22515726089477539 0.050695792133637951 +3444 5 5.142187 0.14218711853027344 0.020217176675942028 +3445 8 7.56190634 0.43809366226196289 0.19192605691409881 +3446 6 5.56571674 0.43428325653076172 0.18860194690296339 +3447 6 5.97198 0.028019905090332031 0.00078511508127121488 +3448 7 7.236706 0.23670578002929688 0.056029626299277879 +3449 8 7.56190634 0.43809366226196289 0.19192605691409881 +3450 7 6.3905983 0.60940170288085938 0.37137043547409121 +3451 7 6.3905983 0.60940170288085938 0.37137043547409121 +3452 5 5.2537384 0.2537384033203125 0.064383177319541574 +3453 6 6.451767 0.4517669677734375 0.20409339317120612 +3454 5 5.83826256 0.83826255798339844 0.70268411611687043 +3455 6 6.087614 0.087614059448242188 0.0076762234130001161 +3456 5 5.18407774 0.18407773971557617 0.033884614258795409 +3457 7 6.77673864 0.22326135635375977 0.049845633240920506 +3458 7 6.964019 0.035981178283691406 0.0012946451906827861 +3459 6 5.74584675 0.25415325164794922 0.064593875323225802 +3460 6 6.082861 0.082860946655273438 0.0068659364806080703 +3461 8 6.961732 1.0382680892944336 1.0780006252471139 +3462 6 6.55186653 0.55186653137207031 0.30455666844864027 +3463 7 6.69814539 0.30185461044311523 0.091116205845764853 +3464 5 5.50059557 0.5005955696105957 0.25059592431375677 +3465 6 6.59844732 0.59844732284545898 0.35813919822089701 +3466 6 6.55186653 0.55186653137207031 0.30455666844864027 +3467 5 5.563209 0.56320905685424805 0.31720444172265161 +3468 8 6.88234329 1.1176567077636719 1.2491565164091298 +3469 6 5.74584675 0.25415325164794922 0.064593875323225802 +3470 8 6.961732 1.0382680892944336 1.0780006252471139 +3471 6 6.082861 0.082860946655273438 0.0068659364806080703 +3472 6 6.01162863 0.011628627777099609 0.0001352249839783326 +3473 8 7.18201542 0.81798458099365234 0.66909877474336099 +3474 6 5.63225842 0.36774158477783203 0.13523387317491142 +3475 6 5.40958738 0.59041261672973633 0.34858705799365453 +3476 8 7.50562334 0.49437665939331055 0.24440828135288939 +3477 7 6.33354568 0.66645431518554688 0.44416135422943626 +3478 6 5.40958738 0.59041261672973633 0.34858705799365453 +3479 7 7.05457735 0.054577350616455078 0.0029786872003114695 +3480 8 7.18201542 0.81798458099365234 0.66909877474336099 +3481 5 5.544877 0.54487705230712891 0.29689100213090569 +3482 8 7.38687229 0.61312770843505859 0.37592558685082622 +3483 7 6.93566942 0.064330577850341797 0.0041384232465588866 +3484 8 7.50562334 0.49437665939331055 0.24440828135288939 +3485 7 5.966811 1.0331888198852539 1.0674791375358836 +3486 6 5.97899151 0.021008491516113281 0.00044135671578260371 +3487 6 5.63225842 0.36774158477783203 0.13523387317491142 +3488 6 5.864976 0.13502407073974609 0.018231499679131957 +3489 8 5.93400049 2.0659995079040527 4.2683539666597881 +3490 7 6.33354568 0.66645431518554688 0.44416135422943626 +3491 6 5.643201 0.35679912567138672 0.12730561607986601 +3492 7 6.964281 0.035718917846679688 0.0012758410921378527 +3493 7 6.964281 0.035718917846679688 0.0012758410921378527 +3494 6 6.46383333 0.46383333206176758 0.21514135993152195 +3495 7 6.202251 0.79774904251098633 0.63640353482719547 +3496 7 6.71060753 0.28939247131347656 0.083748002452921355 +3497 6 6.189627 0.18962717056274414 0.035958463815632058 +3498 6 5.998056 0.0019440650939941406 3.7793890896864468E-06 +3499 7 6.951072 0.048927783966064453 0.0023939280438298738 +3500 7 6.964281 0.035718917846679688 0.0012758410921378527 +3501 6 6.46383333 0.46383333206176758 0.21514135993152195 +3502 5 5.359978 0.35997819900512695 0.12958430375897478 +3503 7 6.623074 0.37692594528198242 0.14207316822671601 +3504 7 6.968294 0.031705856323242188 0.0010052613251900766 +3505 7 6.662663 0.33733701705932617 0.11379626307848412 +3506 6 6.008993 0.0089931488037109375 8.0876725405687466E-05 +3507 7 6.8172183 0.18278169631958008 0.033409148509463193 +3508 5 5.359978 0.35997819900512695 0.12958430375897478 +3509 6 5.552432 0.44756793975830078 0.20031706069948996 +3510 6 6.08410835 0.084108352661132813 0.0070742149873694871 +3511 7 6.244049 0.755950927734375 0.57146180514246225 +3512 6 6.395756 0.39575576782226563 0.15662262776459102 +3513 6 6.185595 0.18559503555297852 0.034445517221911359 +3514 6 6.555742 0.55574178695678711 0.30884893376992295 +3515 7 6.56011248 0.43988752365112305 0.19350103346391734 +3516 7 6.702535 0.29746484756469727 0.088485335536688581 +3517 7 6.74328136 0.25671863555908203 0.065904457843316777 +3518 5 5.76964235 0.76964235305786133 0.59234935162044167 +3519 7 6.80649 0.19351005554199219 0.037446141595864901 +3520 5 5.17342043 0.17342042922973633 0.030074645274225986 +3521 7 6.38570261 0.61429738998413086 0.37736128334131536 +3522 5 5.27163553 0.27163553237915039 0.07378586245090446 +3523 5 5.17342043 0.17342042922973633 0.030074645274225986 +3524 6 6.421357 0.42135715484619141 0.17754185194007732 +3525 6 6.421357 0.42135715484619141 0.17754185194007732 +3526 6 5.650917 0.34908294677734375 0.12185890373075381 +3527 6 5.721257 0.27874279022216797 0.077697543100839539 +3528 4 4.36278439 0.36278438568115234 0.13161251049405109 +3529 7 6.8538866 0.14611339569091797 0.021349124400330766 +3530 5 5.328351 0.32835102081298828 0.10781439286893146 +3531 5 5.26288748 0.26288747787475586 0.069109826023350251 +3532 6 5.973373 0.026627063751220703 0.00070900052401157154 +3533 6 5.69047642 0.30952358245849609 0.095804848097941431 +3534 5 5.328351 0.32835102081298828 0.10781439286893146 +3535 5 5.26288748 0.26288747787475586 0.069109826023350251 +3536 6 6.31200361 0.31200361251831055 0.09734625422447607 +3537 5 5.415464 0.41546392440795898 0.17261027248446226 +3538 7 6.860719 0.13928079605102539 0.01939914014860733 +3539 6 6.250553 0.25055313110351563 0.062776871505775489 +3540 6 6.65458345 0.65458345413208008 0.42847949842348498 +3541 6 6.17114735 0.17114734649658203 0.02929141421282111 +3542 6 5.865911 0.13408899307250977 0.017979858063199572 +3543 6 6.16405964 0.16405963897705078 0.02691556514128024 +3544 6 6.16405964 0.16405963897705078 0.02691556514128024 +3545 6 6.40442944 0.40442943572998047 0.1635631684848704 +3546 6 5.865911 0.13408899307250977 0.017979858063199572 +3547 6 6.40442944 0.40442943572998047 0.1635631684848704 +3548 6 6.439151 0.43915081024169922 0.19285343413594092 +3549 6 6.16405964 0.16405963897705078 0.02691556514128024 +3550 6 6.221413 0.22141313552856445 0.049023776584590451 +3551 6 5.89747572 0.1025242805480957 0.010511228101904635 +3552 6 5.89747572 0.1025242805480957 0.010511228101904635 +3553 6 5.89747572 0.1025242805480957 0.010511228101904635 +3554 6 5.779677 0.22032308578491211 0.04854226212978574 +3555 6 5.95665646 0.043343544006347656 0.0018786628070301958 +3556 7 6.283507 0.71649312973022461 0.51336240495061247 +3557 6 5.779677 0.22032308578491211 0.04854226212978574 +3558 6 5.89747572 0.1025242805480957 0.010511228101904635 +3559 4 4.46924639 0.46924638748168945 0.22019217216461584 +3560 6 6.027207 0.027206897735595703 0.0007402152843951626 +3561 5 4.87542772 0.1245722770690918 0.015518252214178574 +3562 6 6.710927 0.71092700958251953 0.50541721295394382 +3563 5 4.87542772 0.1245722770690918 0.015518252214178574 +3564 6 6.027207 0.027206897735595703 0.0007402152843951626 +3565 6 5.886134 0.11386585235595703 0.012965432332748605 +3566 6 5.784216 0.21578407287597656 0.046562766106944764 +3567 6 6.24212027 0.24212026596069336 0.058622223188876887 +3568 7 6.412253 0.58774709701538086 0.34544665005000752 +3569 6 5.886134 0.11386585235595703 0.012965432332748605 +3570 6 6.24212027 0.24212026596069336 0.058622223188876887 +3571 4 4.17565727 0.17565727233886719 0.030855477325530956 +3572 6 5.784216 0.21578407287597656 0.046562766106944764 +3573 6 5.893206 0.10679388046264648 0.011404932904270026 +3574 6 5.71906376 0.28093624114990234 0.078925171591436083 +3575 7 6.310657 0.68934297561645508 0.47519373803174858 +3576 5 5.51320839 0.51320838928222656 0.2633828508296574 +3577 7 6.553375 0.4466252326965332 0.19947409848123243 +3578 4 4.48985052 0.48985052108764648 0.23995353300983879 +3579 7 6.35095358 0.64904642105102539 0.42126125667914494 +3580 5 5.59056139 0.5905613899230957 0.34876275526789868 +3581 7 6.5851016 0.41489839553833008 0.1721406786202806 +3582 6 6.40672 0.40672016143798828 0.16542128972014325 +3583 6 5.589996 0.4100041389465332 0.1681033939532881 +3584 7 6.35095358 0.64904642105102539 0.42126125667914494 +3585 7 6.038584 0.96141576766967773 0.92432027832387575 +3586 7 6.453697 0.54630279541015625 0.29844674427295104 +3587 6 5.888291 0.1117091178894043 0.012478927019628827 +3588 6 5.888291 0.1117091178894043 0.012478927019628827 +3589 6 5.888291 0.1117091178894043 0.012478927019628827 +3590 7 6.386294 0.61370611190795898 0.37663519179318428 +3591 5 5.373103 0.37310314178466797 0.13920595440959005 +3592 7 6.2784214 0.72157859802246094 0.52067567312406027 +3593 7 6.453697 0.54630279541015625 0.29844674427295104 +3594 7 6.25252342 0.74747657775878906 0.55872123429799103 +3595 7 6.293587 0.70641279220581055 0.49901903299200967 +3596 7 6.48933029 0.51066970825195313 0.26078355092613492 +3597 6 6.12615252 0.12615251541137695 0.0159144571446177 +3598 7 6.79546547 0.20453453063964844 0.041834374223981285 +3599 6 5.39613247 0.60386753082275391 0.36465599478196964 +3600 6 6.126243 0.12624311447143555 0.015937323951447979 +3601 7 6.5767746 0.42322540283203125 0.17911974160233513 +3602 6 6.2805624 0.28056240081787109 0.078715260752687755 +3603 7 6.97933 0.020669937133789063 0.000427246301114792 +3604 6 6.16348 0.16347980499267578 0.026725646640443301 +3605 5 5.215407 0.21540689468383789 0.046400130277334029 +3606 5 5.326845 0.32684516906738281 0.10682776454268605 +3607 6 6.120127 0.12012720108032227 0.014430544439392179 +3608 6 6.303937 0.30393695831298828 0.092377674628551176 +3609 6 6.303937 0.30393695831298828 0.092377674628551176 +3610 5 5.215407 0.21540689468383789 0.046400130277334029 +3611 6 6.120127 0.12012720108032227 0.014430544439392179 +3612 6 5.96534 0.034659862518310547 0.0012013060697881883 +3613 6 6.303937 0.30393695831298828 0.092377674628551176 +3614 5 5.326845 0.32684516906738281 0.10682776454268605 +3615 6 5.992802 0.0071978569030761719 5.18091439971613E-05 +3616 5 5.1797595 0.17975950241088867 0.03231347870701029 +3617 5 5.709625 0.7096247673034668 0.5035673103704994 +3618 7 5.93767166 1.0623283386230469 1.1285414990416029 +3619 6 5.93743849 0.062561511993408203 0.0039139427829013584 +3620 7 6.57639551 0.42360448837280273 0.17944076256958397 +3621 7 5.93767166 1.0623283386230469 1.1285414990416029 +3622 6 5.992802 0.0071978569030761719 5.18091439971613E-05 +3623 6 5.93743849 0.062561511993408203 0.0039139427829013584 +3624 7 6.70226431 0.29773569107055664 0.088646541737261941 +3625 5 5.1797595 0.17975950241088867 0.03231347870701029 +3626 5 5.709625 0.7096247673034668 0.5035673103704994 +3627 5 5.4083004 0.40830039978027344 0.16670921646073111 +3628 6 5.4083004 0.59169960021972656 0.35010841690018424 +3629 6 5.439508 0.56049203872680664 0.31415132547613211 +3630 6 5.9350605 0.064939498901367188 0.0042171385175606702 +3631 6 5.9350605 0.064939498901367188 0.0042171385175606702 +3632 6 6.000576 0.000576019287109375 3.3179821912199259E-07 +3633 6 5.9350605 0.064939498901367188 0.0042171385175606702 +3634 7 6.35045671 0.64954328536987305 0.42190647956908833 +3635 6 5.988852 0.011147975921630859 0.00012427736714926141 +3636 7 6.46329165 0.53670835494995117 0.28805585827308278 +3637 7 6.37344074 0.62655925750732422 0.39257650316812942 +3638 7 6.816023 0.18397712707519531 0.033847583286842564 +3639 6 6.42620373 0.42620372772216797 0.18164961752427189 +3640 6 6.23901272 0.23901271820068359 0.057127079461679386 +3641 6 5.96011972 0.039880275726318359 0.0015904363920071773 +3642 6 5.96011972 0.039880275726318359 0.0015904363920071773 +3643 6 6.23901272 0.23901271820068359 0.057127079461679386 +3644 7 5.85681343 1.1431865692138672 1.306875532030972 +3645 6 6.322827 0.32282686233520508 0.10421718304519345 +3646 7 5.682053 1.3179469108581543 1.7369840598405517 +3647 7 6.89193344 0.10806655883789063 0.011678381139063276 +3648 5 5.93311071 0.93311071395874023 0.87069560450458994 +3649 6 6.4393816 0.43938159942626953 0.19305618991438678 +3650 4 5.088321 1.0883212089538574 1.1844430538587858 +3651 6 5.47234964 0.52765035629272461 0.27841489849583922 +3652 6 5.75456667 0.24543333053588867 0.060237519737938783 +3653 6 5.47234964 0.52765035629272461 0.27841489849583922 +3654 6 6.005105 0.0051050186157226563 2.6061215066874865E-05 +3655 7 7.06382561 0.063825607299804688 0.0040737081471888814 +3656 7 6.57216263 0.42783737182617188 0.18304481673112605 +3657 8 6.74494457 1.2550554275512695 1.5751641262259 +3658 7 6.426601 0.57339906692504883 0.32878648995051662 +3659 8 7.28102732 0.71897268295288086 0.51692171883246374 +3660 8 7.43201637 0.56798362731933594 0.3226054009028303 +3661 6 5.87479973 0.12520027160644531 0.015675108010327676 +3662 4 4.444296 0.44429588317871094 0.19739883180955076 +3663 6 6.57355452 0.57355451583862305 0.3289647826388773 +3664 8 7.28719854 0.71280145645141602 0.50808591631925992 +3665 8 7.28102732 0.71897268295288086 0.51692171883246374 +3666 7 6.201429 0.79857110977172852 0.63771581736205007 +3667 8 7.43201637 0.56798362731933594 0.3226054009028303 +3668 5 5.08625174 0.086251735687255859 0.007439361909064246 +3669 7 7.070973 0.070972919464111328 0.0050371552972592326 +3670 6 5.50858164 0.49141836166381836 0.24149200618035138 +3671 7 6.98739767 0.012602329254150391 0.00015881870263001474 +3672 8 6.814751 1.185248851776123 1.4048148406366181 +3673 7 7.064693 0.064692974090576172 0.0041851808966839599 +3674 5 5.351553 0.35155296325683594 0.12358948597466224 +3675 6 5.79090071 0.20909929275512695 0.043722514230694287 +3676 7 7.064693 0.064692974090576172 0.0041851808966839599 +3677 6 6.661447 0.66144704818725586 0.43751219755563397 +3678 5 5.223467 0.22346687316894531 0.04993744340390549 +3679 7 6.295772 0.70422792434692383 0.49593696942997667 +3680 6 6.05833054 0.058330535888671875 0.0034024514170596376 +3681 8 6.96025133 1.0397486686706543 1.081077294002398 +3682 7 6.61870956 0.38129043579101563 0.14538239642570261 +3683 6 6.05833054 0.058330535888671875 0.0034024514170596376 +3684 7 6.939511 0.060489177703857422 0.0036589406192888418 +3685 6 6.05833054 0.058330535888671875 0.0034024514170596376 +3686 5 5.18703556 0.18703556060791016 0.034982300931915233 +3687 5 6.00566769 1.0056676864624023 1.0113674955946408 +3688 6 6.442951 0.44295120239257813 0.19620576770103071 +3689 8 6.96025133 1.0397486686706543 1.081077294002398 +3690 7 6.398886 0.60111379623413086 0.3613377960230082 +3691 6 6.19952154 0.19952154159545898 0.03980884556062847 +3692 7 6.295772 0.70422792434692383 0.49593696942997667 +3693 7 6.939511 0.060489177703857422 0.0036589406192888418 +3694 5 5.223467 0.22346687316894531 0.04993744340390549 +3695 6 6.562827 0.56282711029052734 0.31677435607798543 +3696 7 6.61870956 0.38129043579101563 0.14538239642570261 +3697 6 6.20227432 0.20227432250976563 0.040914901546784677 +3698 6 6.24476767 0.24476766586303711 0.059911210252039382 +3699 5 5.18703556 0.18703556060791016 0.034982300931915233 +3700 5 5.53890038 0.53890037536621094 0.29041361456984305 +3701 5 5.22507954 0.22507953643798828 0.050660797723139694 +3702 6 5.941513 0.0584869384765625 0.003420721972361207 +3703 6 5.941513 0.0584869384765625 0.003420721972361207 +3704 6 5.941513 0.0584869384765625 0.003420721972361207 +3705 6 5.941513 0.0584869384765625 0.003420721972361207 +3706 6 6.31908274 0.31908273696899414 0.1018137930316243 +3707 6 6.21938229 0.21938228607177734 0.048128587442079152 +3708 5 5.010412 0.010412216186523438 0.00010841424591490068 +3709 5 5.063287 0.063286781311035156 0.0040052166887107887 +3710 5 4.81725 0.18275022506713867 0.03339764476208984 +3711 6 5.941513 0.0584869384765625 0.003420721972361207 +3712 5 5.657181 0.6571807861328125 0.43188658566214144 +3713 5 5.03699732 0.036997318267822266 0.0013688015590105351 +3714 4 5.321164 1.3211641311645508 1.7454746614757823 +3715 6 5.612789 0.38721084594726563 0.14993223921919707 +3716 5 5.60599041 0.60599040985107422 0.36722437683147291 +3717 6 5.615464 0.38453578948974609 0.14786777339850232 +3718 5 5.22507954 0.22507953643798828 0.050660797723139694 +3719 5 5.412348 0.41234779357910156 0.17003070286955335 +3720 7 6.9458456 0.054154396057128906 0.0029326986123123788 +3721 5 5.20603 0.20602989196777344 0.042448316384252394 +3722 5 5.092179 0.092178821563720703 0.0084969351448762609 +3723 7 6.59399366 0.4060063362121582 0.16484114504442005 +3724 6 6.11295557 0.11295557022094727 0.012758960843939349 +3725 6 6.23914957 0.23914957046508789 0.057192517053636038 +3726 7 6.5052247 0.49477529525756836 0.24480259279721395 +3727 7 6.59399366 0.4060063362121582 0.16484114504442005 +3728 7 6.74835062 0.25164937973022461 0.06332741031860678 +3729 5 5.165275 0.16527509689331055 0.02731585765309319 +3730 6 5.69498062 0.30501937866210938 0.093036821359419264 +3731 6 6.02322769 0.023227691650390625 0.00053952565940562636 +3732 5 5.165275 0.16527509689331055 0.02731585765309319 +3733 6 6.547697 0.54769706726074219 0.29997207748601795 +3734 5 5.53902769 0.53902769088745117 0.29055085154345761 +3735 6 6.158505 0.15850496292114258 0.025123823270632784 +3736 4 6.12302828 2.1230282783508301 4.5072490706772896 +3737 5 5.46979046 0.46979045867919922 0.22070307506601239 +3738 6 5.572047 0.42795276641845703 0.18314357028521044 +3739 7 6.902693 0.097307205200195313 0.0094686921838729177 +3740 7 6.902693 0.097307205200195313 0.0094686921838729177 +3741 7 6.902693 0.097307205200195313 0.0094686921838729177 +3742 7 6.902693 0.097307205200195313 0.0094686921838729177 +3743 7 6.902693 0.097307205200195313 0.0094686921838729177 +3744 7 6.902693 0.097307205200195313 0.0094686921838729177 +3745 7 6.902693 0.097307205200195313 0.0094686921838729177 +3746 5 6.3074255 1.3074254989624023 1.7093614353370867 +3747 6 5.65592 0.34407997131347656 0.11839102665908285 +3748 5 5.44331 0.44330978393554688 0.19652356453298125 +3749 6 6.37409163 0.37409162521362305 0.13994454405496981 +3750 7 6.902693 0.097307205200195313 0.0094686921838729177 +3751 5 5.414906 0.41490602493286133 0.17214700952558815 +3752 5 5.4259696 0.42596960067749023 0.18145010070134049 +3753 5 5.418661 0.41866111755371094 0.17527713135132217 +3754 8 7.4993434 0.5006566047668457 0.25065703589666555 +3755 6 6.004721 0.0047211647033691406 2.2289396156338626E-05 +3756 5 5.414906 0.41490602493286133 0.17214700952558815 +3757 5 5.4259696 0.42596960067749023 0.18145010070134049 +3758 5 5.418661 0.41866111755371094 0.17527713135132217 +3759 6 6.004721 0.0047211647033691406 2.2289396156338626E-05 +3760 6 6.099519 0.099518775939941406 0.0099039867645842605 +3761 7 6.424038 0.57596206665039063 0.33173230222018901 +3762 5 5.39447737 0.39447736740112305 0.15561239339172062 +3763 5 6.23878574 1.2387857437133789 1.5345901188275093 +3764 8 7.4993434 0.5006566047668457 0.25065703589666555 +3765 5 5.23694038 0.23694038391113281 0.056140745527955005 +3766 5 5.23694038 0.23694038391113281 0.056140745527955005 +3767 5 5.23694038 0.23694038391113281 0.056140745527955005 +3768 6 6.041478 0.041478157043457031 0.0017204375117216841 +3769 5 5.23694038 0.23694038391113281 0.056140745527955005 +3770 4 5.936505 1.9365048408508301 3.7500509986386987 +3771 6 5.83699274 0.16300725936889648 0.026571366606958691 +3772 6 6.041478 0.041478157043457031 0.0017204375117216841 +3773 5 5.532972 0.53297185897827148 0.28405900246275451 +3774 5 5.341634 0.34163379669189453 0.11671365104211873 +3775 6 6.535575 0.53557491302490234 0.28684048746163171 +3776 5 6.542175 1.5421748161315918 2.378303163510509 +3777 6 6.535575 0.53557491302490234 0.28684048746163171 +3778 7 6.77695847 0.22304153442382813 0.049747526078135706 +3779 7 7.021159 0.021159172058105469 0.00044771056218451122 +3780 5 5.341634 0.34163379669189453 0.11671365104211873 +3781 6 6.22220469 0.22220468521118164 0.049374922129800325 +3782 6 6.19974375 0.19974374771118164 0.039897564749708181 +3783 5 5.29999733 0.29999732971191406 0.089998397834278876 +3784 6 5.83858252 0.16141748428344727 0.026055604232396945 +3785 7 6.682988 0.31701183319091797 0.1004965023830664 +3786 5 5.253827 0.25382709503173828 0.064428194172251096 +3787 5 5.3683567 0.36835670471191406 0.13568666190622025 +3788 5 5.49224758 0.49224758148193359 0.24230768147481285 +3789 6 5.41641331 0.58358669281005859 0.34057342802498169 +3790 5 5.29999733 0.29999732971191406 0.089998397834278876 +3791 5 5.318728 0.31872797012329102 0.10158751893891349 +3792 6 6.15546274 0.15546274185180664 0.024168664104081472 +3793 6 5.484121 0.51587915420532227 0.26613130174359867 +3794 5 5.630953 0.63095283508300781 0.39810148009928525 +3795 6 5.83858252 0.16141748428344727 0.026055604232396945 +3796 6 6.275716 0.27571582794189453 0.076019217777684389 +3797 5 4.949187 0.050813198089599609 0.0025819811000928894 +3798 5 5.619088 0.61908817291259766 0.38327016584025841 +3799 5 5.74249935 0.74249935150146484 0.55130528698009584 +3800 5 5.288076 0.28807592391967773 0.082987737942175954 +3801 6 6.12135649 0.12135648727416992 0.014727397003525766 +3802 5 5.619088 0.61908817291259766 0.38327016584025841 +3803 6 5.972367 0.027633190155029297 0.00076359319814400806 +3804 5 5.288076 0.28807592391967773 0.082987737942175954 +3805 6 6.12135649 0.12135648727416992 0.014727397003525766 +3806 5 4.949187 0.050813198089599609 0.0025819811000928894 +3807 5 5.49812555 0.49812555313110352 0.24812906668216783 +3808 6 5.46538258 0.53461742401123047 0.28581579005640378 +3809 6 5.972367 0.027633190155029297 0.00076359319814400806 +3810 3 5.01898527 2.0189852714538574 4.0763015263476063 +3811 5 5.67463636 0.6746363639831543 0.45513422360841105 +3812 5 5.619088 0.61908817291259766 0.38327016584025841 +3813 5 5.74249935 0.74249935150146484 0.55130528698009584 +3814 5 5.54712248 0.54712247848510742 0.29934300646368683 +3815 7 6.68376064 0.31623935699462891 0.10000733091237635 +3816 5 5.502157 0.50215721130371094 0.2521618648643198 +3817 6 6.224747 0.2247471809387207 0.050511295339902063 +3818 6 6.36671352 0.36671352386474609 0.1344788085852997 +3819 6 6.36671352 0.36671352386474609 0.1344788085852997 +3820 5 5.81098461 0.81098461151123047 0.65769604010802141 +3821 6 6.05161476 0.051614761352539063 0.00266408358947956 +3822 6 6.34748936 0.34748935699462891 0.12074885322454065 +3823 5 5.35581064 0.35581064224243164 0.12660121313297168 +3824 7 6.313596 0.68640422821044922 0.47115076450518245 +3825 6 6.502141 0.50214099884033203 0.25214558271636633 +3826 6 6.36671352 0.36671352386474609 0.1344788085852997 +3827 5 5.444129 0.44412899017333984 0.1972505599123906 +3828 6 6.224747 0.2247471809387207 0.050511295339902063 +3829 7 6.802661 0.19733905792236328 0.03894270378168585 +3830 7 6.51380157 0.48619842529296875 0.23638890875736251 +3831 5 5.103173 0.10317277908325195 0.010644622343761512 +3832 5 5.103173 0.10317277908325195 0.010644622343761512 +3833 6 6.3959136 0.39591360092163086 0.15674757939473238 +3834 5 5.180339 0.18033885955810547 0.032522104266718088 +3835 5 4.90732861 0.092671394348144531 0.0085879873304293142 +3836 6 6.09283924 0.092839241027832031 0.0086191246746238903 +3837 6 6.09283924 0.092839241027832031 0.0086191246746238903 +3838 5 5.180339 0.18033885955810547 0.032522104266718088 +3839 5 4.90732861 0.092671394348144531 0.0085879873304293142 +3840 6 6.257716 0.25771617889404297 0.066417628863746359 +3841 6 6.037991 0.037991046905517578 0.0014433196449772367 +3842 6 6.084455 0.084455013275146484 0.0071326492673051689 +3843 7 7.1089077 0.10890769958496094 0.011860887028888101 +3844 6 6.257716 0.25771617889404297 0.066417628863746359 +3845 5 5.053433 0.053432941436767578 0.0028550792305850337 +3846 6 6.37613249 0.37613248825073242 0.14147564871768736 +3847 5 5.053433 0.053432941436767578 0.0028550792305850337 +3848 6 5.7364707 0.26352930068969727 0.069447692322000876 +3849 5 5.233253 0.23325300216674805 0.054406963019800969 +3850 6 6.37613249 0.37613248825073242 0.14147564871768736 +3851 7 6.929842 0.070158004760742188 0.0049221456320083234 +3852 6 6.31295061 0.31295061111450195 0.097938084996940233 +3853 7 7.062208 0.062208175659179688 0.0038698571188433561 +3854 6 6.633592 0.63359212875366211 0.40143898561859714 +3855 6 6.38073063 0.38073062896728516 0.14495581183382455 +3856 6 6.31295061 0.31295061111450195 0.097938084996940233 +3857 6 6.104832 0.10483217239379883 0.010989784368803157 +3858 6 6.46388531 0.46388530731201172 0.21518957833995955 +3859 5 5.37704372 0.37704372406005859 0.14216196985307761 +3860 5 5.37704372 0.37704372406005859 0.14216196985307761 +3861 6 5.91738462 0.082615375518798828 0.0068253002721121447 +3862 6 5.55067539 0.44932460784912109 0.20189260321876645 +3863 6 5.55067539 0.44932460784912109 0.20189260321876645 +3864 7 6.45273542 0.54726457595825195 0.29949851609876532 +3865 6 6.76371431 0.76371431350708008 0.5832595526555906 +3866 6 6.109606 0.10960578918457031 0.01201342902277247 +3867 5 5.37704372 0.37704372406005859 0.14216196985307761 +3868 6 4.58308935 1.4169106483459473 2.0076357853961326 +3869 6 5.91738462 0.082615375518798828 0.0068253002721121447 +3870 6 5.722472 0.27752780914306641 0.077021684847750294 +3871 6 5.55067539 0.44932460784912109 0.20189260321876645 +3872 4 4.840269 0.84026908874511719 0.70605214150054962 +3873 5 5.002661 0.0026612281799316406 7.0821354256622726E-06 +3874 5 5.39184475 0.39184474945068359 0.153542307672069 +3875 7 6.180214 0.81978607177734375 0.6720492034801282 +3876 5 5.301948 0.30194807052612305 0.091172637294448577 +3877 5 5.831956 0.83195590972900391 0.6921506357330145 +3878 5 5.28575039 0.28575038909912109 0.081653284870299103 +3879 4 4.310555 0.31055498123168945 0.096444396367814988 +3880 6 5.79356766 0.20643234252929688 0.042614312042132951 +3881 6 5.79356766 0.20643234252929688 0.042614312042132951 +3882 5 5.91559362 0.91559362411499023 0.83831168452002203 +3883 6 6.63259 0.63258981704711914 0.40016987663170767 +3884 6 5.79356766 0.20643234252929688 0.042614312042132951 +3885 6 6.19061327 0.1906132698059082 0.036333418626099956 +3886 6 6.63259 0.63258981704711914 0.40016987663170767 +3887 6 6.19061327 0.1906132698059082 0.036333418626099956 +3888 6 5.79356766 0.20643234252929688 0.042614312042132951 +3889 6 6.067399 0.067399024963378906 0.004542628566014173 +3890 6 6.32966375 0.32966375350952148 0.10867819037798654 +3891 5 5.91559362 0.91559362411499023 0.83831168452002203 +3892 5 5.64307261 0.64307260513305664 0.41354237547261619 +3893 5 4.68508339 0.31491661071777344 0.099172471705969656 +3894 6 6.1910696 0.19106960296630859 0.036507593177702802 +3895 6 6.36921835 0.36921834945678711 0.13632218957559417 +3896 6 5.7608676 0.23913240432739258 0.057184306799399565 +3897 6 6.14779139 0.14779138565063477 0.021842293672534652 +3898 7 6.195396 0.80460405349731445 0.64738768290430926 +3899 5 5.64307261 0.64307260513305664 0.41354237547261619 +3900 5 4.68508339 0.31491661071777344 0.099172471705969656 +3901 4 4.17080164 0.17080163955688477 0.029173200075319983 +3902 6 5.770632 0.22936820983886719 0.05260977568468661 +3903 6 5.90663528 0.093364715576171875 0.0087169701146194711 +3904 7 7.11299229 0.11299228668212891 0.012767256849656405 +3905 7 6.885009 0.11499118804931641 0.013222973328993248 +3906 7 6.885009 0.11499118804931641 0.013222973328993248 +3907 7 6.712919 0.28708076477050781 0.08241536550121964 +3908 7 6.27674341 0.72325658798217773 0.5231000920596216 +3909 7 6.27674341 0.72325658798217773 0.5231000920596216 +3910 6 6.75025 0.75024986267089844 0.56287485643770196 +3911 6 5.52746964 0.47253036499023438 0.22328494583780412 +3912 7 6.885009 0.11499118804931641 0.013222973328993248 +3913 6 5.81515455 0.1848454475402832 0.03416783947636759 +3914 7 6.27674341 0.72325658798217773 0.5231000920596216 +3915 7 6.949869 0.050130844116210938 0.0025131015318038408 +3916 6 6.75025 0.75024986267089844 0.56287485643770196 +3917 5 5.268847 0.26884698867797852 0.072278703321217108 +3918 7 6.590874 0.40912580490112305 0.1673839242359918 +3919 6 6.449676 0.4496760368347168 0.20220853810337758 +3920 6 5.750168 0.2498321533203125 0.062416104832664132 +3921 5 5.21401262 0.21401262283325195 0.045801402731967755 +3922 7 6.712919 0.28708076477050781 0.08241536550121964 +3923 5 5.01745749 0.017457485198974609 0.00030476378947241756 +3924 5 5.01745749 0.017457485198974609 0.00030476378947241756 +3925 5 5.337299 0.33729887008666992 0.11377052776174423 +3926 6 6.01554155 0.015541553497314453 0.00024153988510988711 +3927 5 6.019873 1.0198731422424316 1.0401412262674512 +3928 5 5.003989 0.0039892196655273438 1.5913873539830092E-05 +3929 5 5.003989 0.0039892196655273438 1.5913873539830092E-05 +3930 6 6.21500063 0.21500062942504883 0.046225270653167172 +3931 6 6.49620342 0.49620342254638672 0.246217836546748 +3932 8 6.58245039 1.4175496101379395 2.0094468972022241 +3933 4 5.16961765 1.1696176528930664 1.3680054539590856 +3934 6 5.78646135 0.21353864669799805 0.045598753633612432 +3935 5 5.20276928 0.20276927947998047 0.041115380700830428 +3936 6 5.77042866 0.22957134246826172 0.052703001282679907 +3937 5 5.439976 0.43997621536254883 0.19357907008475195 +3938 6 5.80691767 0.19308233261108398 0.037280787166537266 +3939 6 6.347791 0.34779119491577148 0.12095871526094015 +3940 5 5.31281853 0.31281852722167969 0.097855430973140756 +3941 5 5.240841 0.24084091186523438 0.058004344828077592 +3942 6 5.859107 0.14089298248291016 0.019850832512929628 +3943 6 5.75497866 0.24502134323120117 0.060035458638822092 +3944 6 6.324921 0.3249211311340332 0.1055737414574196 +3945 6 6.347791 0.34779119491577148 0.12095871526094015 +3946 6 6.510848 0.51084804534912109 0.26096572543701768 +3947 7 6.556688 0.44331216812133789 0.19652567840444135 +3948 5 5.53018427 0.53018426895141602 0.28109535904354743 +3949 5 5.31281853 0.31281852722167969 0.097855430973140756 +3950 5 5.240841 0.24084091186523438 0.058004344828077592 +3951 5 5.341845 0.34184503555297852 0.11685802833221715 +3952 6 6.173548 0.17354822158813477 0.030118985216404326 +3953 7 6.220626 0.77937412261962891 0.60742402300911635 +3954 5 5.341845 0.34184503555297852 0.11685802833221715 +3955 6 6.173548 0.17354822158813477 0.030118985216404326 +3956 5 5.43610573 0.43610572814941406 0.19018820612473064 +3957 5 6.18706274 1.1870627403259277 1.4091179494701009 +3958 6 5.60434771 0.39565229415893555 0.15654073787322886 +3959 6 5.60434771 0.39565229415893555 0.15654073787322886 +3960 6 5.297151 0.70284891128540039 0.49399659209507263 +3961 5 5.06962442 0.069624423980712891 0.0048475604146460682 +3962 7 7.028598 0.028597831726074219 0.00081783597943285713 +3963 7 6.325783 0.67421722412109375 0.45456886530155316 +3964 5 4.965347 0.034653186798095703 0.0012008433552637143 +3965 4 5.681409 1.6814088821411133 2.8271358289430282 +3966 6 5.60434771 0.39565229415893555 0.15654073787322886 +3967 4 5.27433443 1.2743344306945801 1.6239282412536795 +3968 6 5.352264 0.6477360725402832 0.41956201966991102 +3969 6 6.230219 0.23021888732910156 0.05300073608304956 +3970 7 6.150303 0.84969711303710938 0.72198518390359823 +3971 6 6.230219 0.23021888732910156 0.05300073608304956 +3972 6 5.467714 0.53228616714477539 0.28332856373367576 +3973 4 5.27433443 1.2743344306945801 1.6239282412536795 +3974 6 5.352264 0.6477360725402832 0.41956201966991102 +3975 7 7.04335546 0.043355464935302734 0.0018796963397562649 +3976 7 6.96596 0.034039974212646484 0.0011587198443976376 +3977 6 6.59142256 0.59142255783081055 0.34978064191113845 +3978 7 5.87656736 1.1234326362609863 1.2621008882163096 +3979 6 6.093575 0.093575000762939453 0.0087562807677841192 +3980 5 5.85666466 0.85666465759277344 0.73387433556854376 +3981 7 6.5405407 0.45945930480957031 0.21110285277609364 +3982 7 7.04335546 0.043355464935302734 0.0018796963397562649 +3983 6 5.918784 0.081215858459472656 0.0065960156653090962 +3984 7 6.96596 0.034039974212646484 0.0011587198443976376 +3985 6 6.074771 0.074770927429199219 0.0055906915886225761 +3986 6 6.074771 0.074770927429199219 0.0055906915886225761 +3987 6 5.67436457 0.32563543319702148 0.10603843535341184 +3988 6 5.886932 0.1130681037902832 0.012784396094730255 +3989 6 6.074771 0.074770927429199219 0.0055906915886225761 +3990 6 5.67436457 0.32563543319702148 0.10603843535341184 +3991 5 5.804823 0.80482292175292969 0.64773993537892238 +3992 7 6.027041 0.97295904159545898 0.94664929662235409 +3993 7 6.51755476 0.48244524002075195 0.23275340961868096 +3994 7 6.51755476 0.48244524002075195 0.23275340961868096 +3995 5 5.24649429 0.24649429321289063 0.060759436586522497 +3996 7 6.51755476 0.48244524002075195 0.23275340961868096 +3997 7 6.50444174 0.49555826187133789 0.2455779909089415 +3998 6 5.828133 0.17186689376831055 0.029538229173567743 +3999 6 5.828133 0.17186689376831055 0.029538229173567743 +4000 6 5.828133 0.17186689376831055 0.029538229173567743 +4001 5 5.27771664 0.27771663665771484 0.077126530276473204 +4002 6 5.52785969 0.47214031219482422 0.22291647439942608 +4003 6 6.39396763 0.39396762847900391 0.15521049228937045 +4004 7 6.80423975 0.19576025009155273 0.038322075515907272 +4005 6 6.39396763 0.39396762847900391 0.15521049228937045 +4006 6 6.263591 0.26359081268310547 0.069480116530939995 +4007 5 5.27771664 0.27771663665771484 0.077126530276473204 +4008 6 5.52785969 0.47214031219482422 0.22291647439942608 +4009 6 6.05668068 0.056680679321289063 0.0032126994083228055 +4010 6 6.50581741 0.50581741333007813 0.2558512556279311 +4011 7 6.50444174 0.49555826187133789 0.2455779909089415 +4012 6 5.828133 0.17186689376831055 0.029538229173567743 +4013 6 5.30343056 0.69656944274902344 0.48520898857168504 +4014 6 6.02893639 0.028936386108398438 0.00083731444101431407 +4015 5 4.810185 0.18981504440307617 0.036029751081741779 +4016 5 5.26828766 0.26828765869140625 0.071978267806116492 +4017 6 6.23065472 0.23065471649169922 0.053201598239866144 +4018 6 6.02893639 0.028936386108398438 0.00083731444101431407 +4019 5 4.810185 0.18981504440307617 0.036029751081741779 +4020 4 4.564721 0.56472110748291016 0.31890992923672457 +4021 5 5.7971487 0.79714870452880859 0.63544605713195779 +4022 5 5.26828766 0.26828765869140625 0.071978267806116492 +4023 6 6.20194 0.20194005966186523 0.04077978769623769 +4024 6 6.412005 0.41200494766235352 0.16974807689825866 +4025 6 6.69098759 0.69098758697509766 0.47746384535366815 +4026 6 6.20194 0.20194005966186523 0.04077978769623769 +4027 5 5.12840748 0.12840747833251953 0.016488480491716473 +4028 6 6.43639851 0.43639850616455078 0.19044365618265147 +4029 6 6.277379 0.27737903594970703 0.076939129584388866 +4030 5 5.70900774 0.70900774002075195 0.50269197540933419 +4031 5 5.239645 0.23964500427246094 0.057429728072747821 +4032 5 5.288952 0.28895187377929688 0.083493185360566713 +4033 6 6.17503452 0.17503452301025391 0.030637084245427104 +4034 5 5.288952 0.28895187377929688 0.083493185360566713 +4035 6 6.004663 0.0046629905700683594 2.1743481056546443E-05 +4036 5 5.2976017 0.29760169982910156 0.088566771741170669 +4037 5 5.277965 0.27796506881713867 0.077264579482516638 +4038 5 5.239645 0.23964500427246094 0.057429728072747821 +4039 4 5.144952 1.1449518203735352 1.3109146709766719 +4040 5 5.53936768 0.53936767578125 0.29091748967766762 +4041 5 5.26961851 0.26961851119995117 0.072694141581678196 +4042 7 6.827147 0.17285299301147461 0.02987815719302489 +4043 7 6.827147 0.17285299301147461 0.02987815719302489 +4044 7 6.827147 0.17285299301147461 0.02987815719302489 +4045 7 6.827147 0.17285299301147461 0.02987815719302489 +4046 7 6.900583 0.099417209625244141 0.0098837815696697362 +4047 6 6.45626259 0.45626258850097656 0.20817554966561147 +4048 6 6.45626259 0.45626258850097656 0.20817554966561147 +4049 6 6.36476469 0.36476469039916992 0.13305327936200229 +4050 7 6.827147 0.17285299301147461 0.02987815719302489 +4051 6 6.154264 0.15426397323608398 0.023797373438583236 +4052 5 5.26961851 0.26961851119995117 0.072694141581678196 +4053 7 6.827147 0.17285299301147461 0.02987815719302489 +4054 7 6.900583 0.099417209625244141 0.0098837815696697362 +4055 6 6.154264 0.15426397323608398 0.023797373438583236 +4056 5 5.72192574 0.72192573547363281 0.52117676753914566 +4057 6 6.28457451 0.28457450866699219 0.080982650983060012 +4058 6 6.45626259 0.45626258850097656 0.20817554966561147 +4059 6 6.36476469 0.36476469039916992 0.13305327936200229 +4060 5 5.026752 0.026751995086669922 0.00071566924111721164 +4061 5 5.026752 0.026751995086669922 0.00071566924111721164 +4062 6 6.181349 0.18134880065917969 0.032887387500522891 +4063 5 5.542329 0.54232883453369141 0.29412056476667203 +4064 5 6.017733 1.017733097076416 1.0357806568847536 +4065 8 7.28579235 0.71420764923095703 0.51009256622000976 +4066 6 6.3217063 0.32170629501342773 0.1034949402512666 +4067 5 5.3749 0.37489986419677734 0.14054990817476209 +4068 6 6.3217063 0.32170629501342773 0.1034949402512666 +4069 6 6.01176167 0.011761665344238281 0.00013833677166985581 +4070 5 5.54320049 0.54320049285888672 0.29506677544213744 +4071 6 5.95156765 0.048432350158691406 0.0023456925418940955 +4072 7 6.375497 0.62450313568115234 0.39000416647559177 +4073 5 4.75059748 0.24940252304077148 0.062201618499102551 +4074 4 4.751452 0.75145196914672852 0.56468006193449582 +4075 6 5.54982948 0.45017051696777344 0.20265349434703239 +4076 5 5.47206354 0.47206354141235352 0.2228439871307728 +4077 6 6.145912 0.14591217041015625 0.021290361473802477 +4078 6 6.0084424 0.0084424018859863281 7.127414960450551E-05 +4079 6 5.85908842 0.14091157913208008 0.019856073133496466 +4080 6 5.70578527 0.29421472549438477 0.086562304697736181 +4081 6 5.54982948 0.45017051696777344 0.20265349434703239 +4082 6 5.970536 0.029463768005371094 0.00086811362507432932 +4083 5 5.298877 0.29887676239013672 0.089327319096810243 +4084 8 6.58710766 1.4128923416137695 1.9962647689908408 +4085 6 6.01709652 0.017096519470214844 0.00029229097799543524 +4086 6 5.86715746 0.1328425407409668 0.017647140630515423 +4087 6 5.782139 0.21786117553710938 0.047463491806411184 +4088 6 6.13932657 0.13932657241821289 0.019411893781807521 +4089 6 5.446138 0.55386209487915039 0.30676322014392099 +4090 6 5.61793041 0.38206958770751953 0.14597716985099396 +4091 6 5.91474152 0.08525848388671875 0.0072690090746618807 +4092 6 5.31591749 0.6840825080871582 0.46796887787081687 +4093 6 5.465329 0.53467082977294922 0.28587289621009404 +4094 7 7.123422 0.12342214584350586 0.015233026084615631 +4095 6 5.465329 0.53467082977294922 0.28587289621009404 +4096 5 5.018344 0.018343925476074219 0.00033649960187176475 +4097 6 5.91474152 0.08525848388671875 0.0072690090746618807 +4098 5 6.169531 1.1695308685302734 1.3678024524451757 +4099 6 5.31591749 0.6840825080871582 0.46796887787081687 +4100 6 5.939181 0.060819149017333984 0.0036989688871926774 +4101 5 5.16942263 0.16942262649536133 0.02870402636858671 +4102 5 5.16942263 0.16942262649536133 0.02870402636858671 +4103 7 6.51642942 0.48357057571411133 0.23384050169647708 +4104 7 6.36017942 0.63982057571411133 0.40937036910713687 +4105 7 6.237228 0.7627720832824707 0.58182125103508042 +4106 5 5.777478 0.77747821807861328 0.60447237958669575 +4107 6 6.35006475 0.35006475448608398 0.12254533233340226 +4108 6 6.460335 0.46033477783203125 0.21190810768166557 +4109 6 6.188783 0.18878316879272461 0.035639084819422351 +4110 5 5.25196362 0.25196361541748047 0.063485663494248001 +4111 6 5.82661 0.17338991165161133 0.030064061462553582 +4112 6 6.39617157 0.39617156982421875 0.15695191273698583 +4113 6 6.293958 0.29395818710327148 0.086411415765041966 +4114 6 6.1024003 0.10240030288696289 0.010485822031341741 +4115 6 6.111546 0.11154603958129883 0.012442518946272685 +4116 6 5.35386133 0.64613866806030273 0.41749517836274208 +4117 6 5.35386133 0.64613866806030273 0.41749517836274208 +4118 8 6.299891 1.7001090049743652 2.8903706287949262 +4119 7 6.55539131 0.44460868835449219 0.19767688576030196 +4120 5 5.399425 0.39942502975463867 0.15954035439449399 +4121 6 5.72290039 0.277099609375 0.076784193515777588 +4122 6 5.21427965 0.7857203483581543 0.61735646582405934 +4123 6 6.13230848 0.1323084831237793 0.017505534706515391 +4124 7 6.89120436 0.1087956428527832 0.011836491903750357 +4125 5 5.71330929 0.71330928802490234 0.50881014038259309 +4126 5 5.71330929 0.71330928802490234 0.50881014038259309 +4127 5 5.45007563 0.45007562637329102 0.20256806945531025 +4128 5 5.2206955 0.22069549560546875 0.048706501780543476 +4129 7 6.7309947 0.26900529861450195 0.072363850682677366 +4130 6 6.10853529 0.1085352897644043 0.011779909124243204 +4131 5 5.25512648 0.2551264762878418 0.065089518903050703 +4132 5 5.25512648 0.2551264762878418 0.065089518903050703 +4133 6 5.91269064 0.087309360504150391 0.0076229244316436962 +4134 6 6.46735764 0.46735763549804688 0.21842315945832524 +4135 5 6.234082 1.2340822219848633 1.5229589306190974 +4136 6 6.15041971 0.15041971206665039 0.022626089778214009 +4137 5 5.25512648 0.2551264762878418 0.065089518903050703 +4138 6 5.782483 0.21751689910888672 0.047313601397945604 +4139 7 6.259784 0.74021577835083008 0.5479193985195252 +4140 6 5.97505045 0.024949550628662109 0.00062248007657217386 +4141 6 5.97505045 0.024949550628662109 0.00062248007657217386 +4142 6 5.95528173 0.044718265533447266 0.0019997232723198977 +4143 6 5.9106245 0.089375495910644531 0.0079879792692736373 +4144 6 5.97505045 0.024949550628662109 0.00062248007657217386 +4145 6 5.852694 0.14730596542358398 0.02169904744937412 +4146 7 6.523179 0.47682094573974609 0.22735821429614589 +4147 7 6.259784 0.74021577835083008 0.5479193985195252 +4148 6 5.75195456 0.24804544448852539 0.061526542531510131 +4149 7 6.537818 0.46218204498291016 0.21361224270458479 +4150 5 4.77180052 0.22819948196411133 0.052075003568688771 +4151 6 6.32452536 0.32452535629272461 0.10531670687691985 +4152 6 5.75195456 0.24804544448852539 0.061526542531510131 +4153 5 5.170621 0.17062091827392578 0.029111497752637661 +4154 5 5.251261 0.25126123428344727 0.063132207853641376 +4155 5 5.170621 0.17062091827392578 0.029111497752637661 +4156 5 5.24522638 0.24522638320922852 0.060135979021879393 +4157 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4158 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4159 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4160 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4161 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4162 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4163 5 5.36412 0.3641200065612793 0.13258337917818608 +4164 5 5.45350027 0.45350027084350586 0.20566249565513317 +4165 7 6.24862051 0.75137948989868164 0.56457113784040303 +4166 7 6.608236 0.39176416397094727 0.15347916017185526 +4167 8 7.272698 0.72730207443237305 0.5289683074736331 +4168 6 6.20588732 0.2058873176574707 0.042389587572188248 +4169 7 6.45273829 0.54726171493530273 0.29949538463392855 +4170 7 7.005946 0.0059461593627929688 3.5356811167730484E-05 +4171 5 6.104036 1.1040358543395996 1.2188951676673696 +4172 6 6.12530661 0.12530660629272461 0.015701745580599891 +4173 5 5.36438942 0.36438941955566406 0.13277964908411377 +4174 6 5.650722 0.34927797317504883 0.12199510254527013 +4175 7 6.15029955 0.8497004508972168 0.72199085625493353 +4176 6 6.024892 0.024891853332519531 0.00061960436232766369 +4177 6 6.16297245 0.16297245025634766 0.026560019542557711 +4178 7 6.49049425 0.5095057487487793 0.25959610800805422 +4179 5 5.18898153 0.18898153305053711 0.03571401983413125 +4180 6 5.39173031 0.60826969146728516 0.36999201755770628 +4181 6 6.128771 0.12877082824707031 0.016581926207436481 +4182 6 5.00667524 0.99332475662231445 0.98669407211878024 +4183 7 6.849729 0.15027093887329102 0.022581355069860365 +4184 7 6.827616 0.17238378524780273 0.029716169416360572 +4185 5 5.18898153 0.18898153305053711 0.03571401983413125 +4186 5 5.53638172 0.53638172149658203 0.28770535115563689 +4187 6 6.540024 0.5400238037109375 0.29162570857442915 +4188 6 6.1729784 0.17297840118408203 0.029921527276201232 +4189 5 5.27973557 0.27973556518554688 0.078251986429677345 +4190 6 6.06486464 0.064864635467529297 0.0042074209343354596 +4191 5 5.72331667 0.72331666946411133 0.52318700432465448 +4192 6 6.09024668 0.090246677398681641 0.0081444627815017157 +4193 6 6.07189274 0.071892738342285156 0.0051685658263522782 +4194 6 6.09024668 0.090246677398681641 0.0081444627815017157 +4195 8 7.08787155 0.91212844848632813 0.83197830653807614 +4196 6 6.10373 0.10373020172119141 0.010759954749119061 +4197 5 5.4061327 0.40613269805908203 0.16494376843274949 +4198 5 5.31334829 0.31334829330444336 0.098187152916807463 +4199 6 6.07189274 0.071892738342285156 0.0051685658263522782 +4200 6 6.07644367 0.076443672180175781 0.0058436350163901807 +4201 6 6.212351 0.21235084533691406 0.045092881515301997 +4202 6 6.73774624 0.73774623870849609 0.5442695127285333 +4203 5 5.166097 0.16609716415405273 0.027588267940018341 +4204 6 5.9662466 0.033753395080566406 0.0011392916794648045 +4205 6 6.212351 0.21235084533691406 0.045092881515301997 +4206 6 5.40494728 0.59505271911621094 0.35408773852759623 +4207 7 6.56026649 0.43973350524902344 0.19336555563859292 +4208 6 6.45183754 0.45183753967285156 0.20415716225761571 +4209 6 6.54847145 0.54847145080566406 0.30082093234886997 +4210 6 5.76230145 0.23769855499267578 0.056500603045606113 +4211 6 5.6053896 0.39461040496826172 0.15571737170921551 +4212 4 4.70839453 0.70839452743530273 0.50182280650028588 +4213 4 4.801995 0.80199480056762695 0.64319566013750773 +4214 5 5.177825 0.17782497406005859 0.031621721399460512 +4215 5 5.177825 0.17782497406005859 0.031621721399460512 +4216 5 5.177825 0.17782497406005859 0.031621721399460512 +4217 4 4.757621 0.75762081146240234 0.573989293960949 +4218 6 6.213321 0.21332120895385742 0.0455059381895353 +4219 5 5.177825 0.17782497406005859 0.031621721399460512 +4220 6 5.96347 0.036530017852783203 0.0013344422043246595 +4221 6 6.60098 0.60097980499267578 0.36117672600903461 +4222 4 4.757621 0.75762081146240234 0.573989293960949 +4223 4 4.059132 0.059132099151611328 0.0034966051500759932 +4224 7 6.79212 0.20788002014160156 0.043214102774072671 +4225 5 5.432003 0.43200302124023438 0.18662661036069039 +4226 7 6.107426 0.89257383346557617 0.79668804818743411 +4227 7 5.97871161 1.0212883949279785 1.0430299856145666 +4228 6 5.510249 0.48975086212158203 0.23985590694883285 +4229 6 5.80424643 0.19575357437133789 0.038319461879154915 +4230 6 5.396756 0.60324382781982422 0.36390311580271373 +4231 6 6.1630497 0.16304969787597656 0.026585203977447236 +4232 6 6.13954067 0.13954067230224609 0.01947159922656283 +4233 6 5.72124863 0.27875137329101563 0.077702328111627139 +4234 6 5.7411046 0.2588953971862793 0.067026826684241314 +4235 5 5.14966774 0.14966773986816406 0.022400432357244426 +4236 5 5.14966774 0.14966773986816406 0.022400432357244426 +4237 5 5.848475 0.84847497940063477 0.71990979066890759 +4238 5 5.14966774 0.14966773986816406 0.022400432357244426 +4239 7 7.004218 0.0042181015014648438 1.7792380276659969E-05 +4240 6 5.67437744 0.32562255859375 0.10603005066514015 +4241 6 6.63750553 0.63750553131103516 0.40641330245216523 +4242 7 6.52567434 0.47432565689086914 0.22498482878495452 +4243 6 6.34608126 0.34608125686645508 0.11977223635426526 +4244 5 5.37140274 0.37140274047851563 0.13793999563495163 +4245 5 5.37140274 0.37140274047851563 0.13793999563495163 +4246 6 6.447334 0.44733381271362305 0.20010753999690678 +4247 6 5.344269 0.655731201171875 0.42998340819031 +4248 6 6.11358738 0.11358737945556641 0.012902092771582829 +4249 6 5.7725997 0.22740030288696289 0.051710897753082463 +4250 6 5.846038 0.15396213531494141 0.023704339110736328 +4251 6 5.97603559 0.023964405059814453 0.00057429270987086056 +4252 6 5.846038 0.15396213531494141 0.023704339110736328 +4253 4 5.0890975 1.0890974998474121 1.1861333641738838 +4254 5 5.86293364 0.86293363571166992 0.74465445964256105 +4255 5 5.16529655 0.16529655456542969 0.027322950951202074 +4256 5 5.16529655 0.16529655456542969 0.027322950951202074 +4257 5 5.908326 0.90832614898681641 0.8250563929332202 +4258 6 5.94830847 0.051691532135009766 0.0026720144944647473 +4259 6 6.22315025 0.22315025329589844 0.049796035546023631 +4260 6 6.07941341 0.079413414001464844 0.0063064903233680525 +4261 7 6.507631 0.49236917495727539 0.24242740444810806 +4262 6 6.53947639 0.53947639465332031 0.29103478038814501 +4263 6 5.886932 0.1130681037902832 0.012784396094730255 +4264 6 6.00057936 0.00057935714721679688 3.3565470403118525E-07 +4265 6 6.07941341 0.079413414001464844 0.0063064903233680525 +4266 7 6.507631 0.49236917495727539 0.24242740444810806 +4267 7 6.451244 0.54875612258911133 0.30113328207903578 +4268 6 6.318875 0.31887483596801758 0.10168116101363012 +4269 5 5.13934755 0.13934755325317383 0.019417740597646116 +4270 6 5.95621538 0.043784618377685547 0.0019170928064795589 +4271 5 5.09802628 0.098026275634765625 0.0096091507148230448 +4272 6 5.854124 0.14587593078613281 0.021279787182720611 +4273 6 5.854124 0.14587593078613281 0.021279787182720611 +4274 6 5.854124 0.14587593078613281 0.021279787182720611 +4275 6 5.854124 0.14587593078613281 0.021279787182720611 +4276 7 7.046975 0.046975135803222656 0.0022066633837312111 +4277 5 5.79051447 0.79051446914672852 0.62491312593033399 +4278 4 5.078443 1.0784430503845215 1.1630394129226715 +4279 6 5.880997 0.1190028190612793 0.014161670944531579 +4280 6 5.854124 0.14587593078613281 0.021279787182720611 +4281 5 5.25452375 0.25452375411987305 0.064782341411273592 +4282 5 5.25452375 0.25452375411987305 0.064782341411273592 +4283 6 6.114523 0.11452293395996094 0.013115502402797574 +4284 6 6.114523 0.11452293395996094 0.013115502402797574 +4285 6 6.114523 0.11452293395996094 0.013115502402797574 +4286 6 6.114523 0.11452293395996094 0.013115502402797574 +4287 5 5.39032745 0.39032745361328125 0.15235552104422823 +4288 6 6.004046 0.0040459632873535156 1.6369818922612467E-05 +4289 6 5.732962 0.26703786849975586 0.071309223212892903 +4290 5 5.25452375 0.25452375411987305 0.064782341411273592 +4291 5 5.467843 0.46784305572509766 0.21887712479019683 +4292 6 6.089267 0.089266777038574219 0.0079685574828545214 +4293 5 5.467843 0.46784305572509766 0.21887712479019683 +4294 5 5.730375 0.73037481307983398 0.53344736758140243 +4295 5 5.467843 0.46784305572509766 0.21887712479019683 +4296 6 6.089267 0.089266777038574219 0.0079685574828545214 +4297 6 6.27618456 0.2761845588684082 0.076277910557337236 +4298 6 6.14334249 0.14334249496459961 0.020547070862676264 +4299 6 5.49535656 0.50464344024658203 0.25466500178390561 +4300 5 5.36093473 0.36093473434448242 0.1302738824563221 +4301 5 4.92026329 0.079736709594726563 0.0063579428569937591 +4302 6 5.65997934 0.34002065658569336 0.11561404690496602 +4303 6 6.65942574 0.65942573547363281 0.43484230060494156 +4304 6 6.226901 0.22690105438232422 0.051484088479810453 +4305 6 5.85030174 0.14969825744628906 0.022409568282455439 +4306 6 5.848189 0.15181112289428711 0.023046617034424344 +4307 7 6.80309725 0.19690275192260742 0.038770693714695881 +4308 6 6.33258 0.3325800895690918 0.11060951597778512 +4309 6 6.47826147 0.47826147079467773 0.22873403444668838 +4310 6 5.765576 0.23442411422729492 0.054954665331251817 +4311 5 6.292986 1.2929859161376953 1.6718125793304353 +4312 6 6.65942574 0.65942573547363281 0.43484230060494156 +4313 6 6.360401 0.36040115356445313 0.12988899149058852 +4314 7 6.33959246 0.66040754318237305 0.43613812309217792 +4315 7 6.92102432 0.078975677490234375 0.0062371576350415125 +4316 5 5.01756859 0.017568588256835938 0.00030865529333823361 +4317 7 6.519351 0.48064899444580078 0.23102345586175943 +4318 7 6.33959246 0.66040754318237305 0.43613812309217792 +4319 7 6.92102432 0.078975677490234375 0.0062371576350415125 +4320 5 5.445865 0.44586515426635742 0.1987957357889627 +4321 6 5.78976154 0.21023845672607422 0.044200208686561382 +4322 7 6.291827 0.70817279815673828 0.50150871204914438 +4323 6 5.83348227 0.16651773452758789 0.027728155912200236 +4324 6 5.809565 0.19043493270874023 0.036265463595782421 +4325 5 5.299449 0.29944896697998047 0.089669683825377433 +4326 5 5.29262638 0.29262638092041016 0.085630198810576985 +4327 5 5.299449 0.29944896697998047 0.089669683825377433 +4328 5 5.946722 0.94672203063964844 0.89628260329845943 +4329 5 5.48733234 0.48733234405517578 0.23749281356231222 +4330 5 5.299449 0.29944896697998047 0.089669683825377433 +4331 5 5.29262638 0.29262638092041016 0.085630198810576985 +4332 8 7.71554661 0.28445339202880859 0.080913732236695068 +4333 8 7.71554661 0.28445339202880859 0.080913732236695068 +4334 8 7.71554661 0.28445339202880859 0.080913732236695068 +4335 8 7.71554661 0.28445339202880859 0.080913732236695068 +4336 8 7.71554661 0.28445339202880859 0.080913732236695068 +4337 8 7.71554661 0.28445339202880859 0.080913732236695068 +4338 8 7.71554661 0.28445339202880859 0.080913732236695068 +4339 8 6.04854059 1.9514594078063965 3.8081938203160917 +4340 8 7.71554661 0.28445339202880859 0.080913732236695068 +4341 6 5.575844 0.42415618896484375 0.17990847263718024 +4342 6 6.168419 0.16841888427734375 0.028364920581225306 +4343 6 6.13987732 0.1398773193359375 0.019565664464607835 +4344 6 5.505574 0.49442577362060547 0.24445684562033421 +4345 6 6.18214941 0.18214941024780273 0.033178407653622344 +4346 6 5.505574 0.49442577362060547 0.24445684562033421 +4347 7 6.39332151 0.60667848587036133 0.36805878521795421 +4348 6 5.3287344 0.67126560211181641 0.45059750857853942 +4349 5 5.195148 0.19514799118041992 0.038082738461753252 +4350 6 6.27555752 0.27555751800537109 0.075931945729280415 +4351 6 6.577435 0.57743501663208008 0.3334311984328906 +4352 5 5.55883074 0.55883073806762695 0.31229179380920868 +4353 6 6.081543 0.08154296875 0.0066492557525634766 +4354 6 6.198324 0.19832420349121094 0.039332489690423245 +4355 6 6.577435 0.57743501663208008 0.3334311984328906 +4356 5 5.71000528 0.71000528335571289 0.50410750239302615 +4357 6 6.10561037 0.10561037063598633 0.011153550385870403 +4358 5 5.32538462 0.32538461685180664 0.10587514888379701 +4359 6 5.172522 0.82747793197631836 0.68471972790780455 +4360 5 5.55883074 0.55883073806762695 0.31229179380920868 +4361 6 6.424677 0.42467689514160156 0.18035046526711085 +4362 6 6.7563 0.75629997253417969 0.57198964845520095 +4363 5 5.358533 0.35853290557861328 0.12854584438264283 +4364 6 5.98848152 0.011518478393554688 0.00013267534450278617 +4365 5 5.57603741 0.57603740692138672 0.33181909417271527 +4366 6 6.462703 0.46270322799682617 0.2140942771986829 +4367 5 5.358533 0.35853290557861328 0.12854584438264283 +4368 6 6.105439 0.10543918609619141 0.011117421964627283 +4369 6 5.98848152 0.011518478393554688 0.00013267534450278617 +4370 5 5.333513 0.33351278305053711 0.11123077645811463 +4371 5 5.492916 0.49291610717773438 0.24296628871525172 +4372 6 6.02280045 0.022800445556640625 0.00051986031758133322 +4373 6 6.335739 0.3357391357421875 0.112720767268911 +4374 5 5.087471 0.08747100830078125 0.0076511772931553423 +4375 6 6.00574255 0.0057425498962402344 3.2976879310808727E-05 +4376 5 5.154143 0.15414285659790039 0.023760020240160884 +4377 6 6.444363 0.44436311721801758 0.19745857994371363 +4378 5 4.961815 0.03818511962890625 0.0014581033610738814 +4379 5 5.154143 0.15414285659790039 0.023760020240160884 +4380 6 6.220297 0.22029685974121094 0.048530706411838764 +4381 6 6.53089428 0.53089427947998047 0.28184873598456761 +4382 6 6.150495 0.15049505233764648 0.022648760778110955 +4383 6 6.444363 0.44436311721801758 0.19745857994371363 +4384 5 5.165444 0.16544389724731445 0.027371683136379943 +4385 5 5.165444 0.16544389724731445 0.027371683136379943 +4386 6 6.21841431 0.218414306640625 0.047704809345304966 +4387 6 6.187394 0.18739414215087891 0.03511656451246381 +4388 6 5.922006 0.077993869781494141 0.0060830437234926649 +4389 4 5.714946 1.7149457931518555 2.9410390734492466 +4390 5 5.35680151 0.35680150985717773 0.1273073174363617 +4391 5 5.47833633 0.47833633422851563 0.22880564864317421 +4392 5 5.35680151 0.35680150985717773 0.1273073174363617 +4393 6 6.07811356 0.078113555908203125 0.0061017276166239753 +4394 6 6.04085064 0.040850639343261719 0.0016687747347532422 +4395 5 5.425962 0.42596197128295898 0.18144360097926437 +4396 5 5.30192947 0.30192947387695313 0.09116140719561372 +4397 5 5.30192947 0.30192947387695313 0.09116140719561372 +4398 5 5.30192947 0.30192947387695313 0.09116140719561372 +4399 5 5.425962 0.42596197128295898 0.18144360097926437 +4400 5 5.30192947 0.30192947387695313 0.09116140719561372 +4401 6 6.783476 0.78347587585449219 0.61383444804596365 +4402 6 6.418589 0.41858911514282227 0.17521684731605092 +4403 5 5.434056 0.43405580520629883 0.18840444203328843 +4404 5 5.20643759 0.20643758773803711 0.042616477631099769 +4405 5 5.20643759 0.20643758773803711 0.042616477631099769 +4406 7 6.76489973 0.23510026931762695 0.055272136633220725 +4407 6 6.146746 0.14674615859985352 0.021534435063813362 +4408 5 5.20643759 0.20643758773803711 0.042616477631099769 +4409 7 6.76489973 0.23510026931762695 0.055272136633220725 +4410 5 5.436403 0.43640279769897461 0.19044740183949216 +4411 7 6.83644533 0.16355466842651367 0.026750129564106828 +4412 7 6.42539024 0.57460975646972656 0.33017637223019847 +4413 7 6.83644533 0.16355466842651367 0.026750129564106828 +4414 7 6.42539024 0.57460975646972656 0.33017637223019847 +4415 5 5.271081 0.27108097076416016 0.073484892710439453 +4416 5 5.436403 0.43640279769897461 0.19044740183949216 +4417 6 5.89872456 0.10127544403076172 0.010256715563627949 +4418 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4419 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4420 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4421 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4422 6 5.89872456 0.10127544403076172 0.010256715563627949 +4423 6 5.89872456 0.10127544403076172 0.010256715563627949 +4424 6 5.96437168 0.035628318786621094 0.0012693770995610976 +4425 6 5.983991 0.016008853912353516 0.00025628340358707646 +4426 6 5.894488 0.10551214218139648 0.011132812147707227 +4427 5 5.35989761 0.35989761352539063 0.12952629222127143 +4428 6 6.60903931 0.609039306640625 0.37092887703329325 +4429 6 5.85716152 0.14283847808837891 0.020402830822604301 +4430 5 5.111895 0.11189508438110352 0.012520509908654276 +4431 6 6.36502934 0.36502933502197266 0.13324641542658355 +4432 6 6.47130966 0.47130966186523438 0.22213279736752156 +4433 5 4.872597 0.12740278244018555 0.016231468973501251 +4434 6 5.947105 0.052895069122314453 0.0027978883374544239 +4435 6 6.02649736 0.026497364044189453 0.00070211030129030405 +4436 6 6.37150526 0.3715052604675293 0.13801615855504679 +4437 6 6.098565 0.098565101623535156 0.0097150792580578127 +4438 5 5.40876055 0.40876054763793945 0.16708518530526817 +4439 5 5.16147566 0.16147565841674805 0.026074388261122294 +4440 5 5.21609259 0.21609258651733398 0.046696005947751473 +4441 6 6.1700573 0.17005729675292969 0.02891948417891399 +4442 5 5.21609259 0.21609258651733398 0.046696005947751473 +4443 5 5.16147566 0.16147565841674805 0.026074388261122294 +4444 6 6.320595 0.32059478759765625 0.10278101783478633 +4445 6 6.320595 0.32059478759765625 0.10278101783478633 +4446 6 6.645172 0.645172119140625 0.41624706331640482 +4447 6 6.36602974 0.36602973937988281 0.13397777011050493 +4448 5 5.847049 0.84704923629760742 0.71749240871235997 +4449 6 5.793397 0.20660305023193359 0.042684820365138876 +4450 6 5.833044 0.16695594787597656 0.027874288531165803 +4451 5 5.19033146 0.19033145904541016 0.036226064302354644 +4452 5 5.161993 0.16199302673339844 0.026241740710247541 +4453 6 6.36602974 0.36602973937988281 0.13397777011050493 +4454 6 6.1052494 0.10524940490722656 0.011077437233325327 +4455 5 5.200701 0.20070123672485352 0.04028098642288569 +4456 5 5.200701 0.20070123672485352 0.04028098642288569 +4457 5 5.200701 0.20070123672485352 0.04028098642288569 +4458 7 6.673865 0.32613515853881836 0.10636414163514019 +4459 5 5.821137 0.8211369514465332 0.67426589303090623 +4460 6 6.1052494 0.10524940490722656 0.011077437233325327 +4461 6 5.98693657 0.013063430786132813 0.00017065322390408255 +4462 6 6.67417669 0.67417669296264648 0.45451421333405051 +4463 6 6.33628 0.33627986907958984 0.11308415034818609 +4464 5 5.349133 0.34913301467895508 0.12189386193881546 +4465 5 5.349133 0.34913301467895508 0.12189386193881546 +4466 5 6.05041742 1.050417423248291 1.1033767630635793 +4467 5 5.78669357 0.78669357299804688 0.61888677779643331 +4468 6 5.97731924 0.022680759429931641 0.00051441684831843304 +4469 6 6.47565556 0.47565555572509766 0.22624820769215148 +4470 6 6.09460974 0.094609737396240234 0.0089510024101855379 +4471 6 6.26841545 0.26841545104980469 0.072046854362270096 +4472 5 5.9054985 0.90549850463867188 0.81992754190287087 +4473 5 4.971588 0.028411865234375 0.00080723408609628677 +4474 6 5.60179853 0.39820146560668945 0.15856440721131548 +4475 6 6.574111 0.57411098480224609 0.32960342287060485 +4476 6 6.48994637 0.48994636535644531 0.2400474409259914 +4477 5 5.15824556 0.15824556350708008 0.025041658369673314 +4478 5 5.15824556 0.15824556350708008 0.025041658369673314 +4479 5 4.929186 0.070814132690429688 0.0050146413886977825 +4480 5 5.79505539 0.79505538940429688 0.63211307222081814 +4481 5 5.15824556 0.15824556350708008 0.025041658369673314 +4482 6 6.54232645 0.54232645034790039 0.29411797874695367 +4483 4 4.647926 0.64792585372924805 0.41980791193077494 +4484 5 4.929186 0.070814132690429688 0.0050146413886977825 +4485 6 6.410453 0.41045284271240234 0.1684715360906921 +4486 6 5.825172 0.17482805252075195 0.030564847948198803 +4487 6 6.18555546 0.18555545806884766 0.034430828019139881 +4488 6 6.67726374 0.67726373672485352 0.4586861690825117 +4489 6 6.67726374 0.67726373672485352 0.4586861690825117 +4490 6 6.24990368 0.24990367889404297 0.062451848724776937 +4491 6 6.589973 0.58997297286987305 0.34806810871691596 +4492 6 6.4081974 0.40819740295410156 0.16662511977847316 +4493 6 5.683591 0.31640911102294922 0.100114725538333 +4494 6 5.80311632 0.1968836784362793 0.038763182834600229 +4495 6 5.7241993 0.27580070495605469 0.076066028854256729 +4496 6 5.80311632 0.1968836784362793 0.038763182834600229 +4497 5 5.33129835 0.3312983512878418 0.10975859756604223 +4498 5 5.844083 0.84408283233642578 0.71247582784508268 +4499 6 6.172046 0.17204618453979492 0.029599889614701169 +4500 6 5.94066572 0.059334278106689453 0.0035205565584419674 +4501 6 5.41101 0.58899021148681641 0.34690946922728472 +4502 6 5.978266 0.021734237670898438 0.00047237708713510074 +4503 7 6.416181 0.58381891250610352 0.34084452259980935 +4504 5 5.47851944 0.47851943969726563 0.22898085416818503 +4505 5 5.381122 0.38112211227416992 0.14525406446432498 +4506 6 6.166681 0.16668081283569336 0.02778249336756744 +4507 5 6.054818 1.0548181533813477 1.1126413367028363 +4508 4 6.027106 2.0271058082580566 4.1091579578735491 +4509 5 5.122678 0.12267780303955078 0.015049843358610815 +4510 6 6.68740225 0.68740224838256836 0.4725218510814102 +4511 6 6.36493731 0.36493730545043945 0.13317923690942735 +4512 6 6.36493731 0.36493730545043945 0.13317923690942735 +4513 6 6.164821 0.16482114791870117 0.027166010801238372 +4514 5 5.031131 0.031130790710449219 0.00096912613025779137 +4515 6 6.46412563 0.46412563323974609 0.2154126034301953 +4516 6 6.50871849 0.50871849060058594 0.25879450267893844 +4517 6 5.833926 0.16607379913330078 0.027580506758567935 +4518 6 5.402982 0.59701776504516602 0.35643021177952505 +4519 6 6.0442524 0.044252395629882813 0.0019582745189836714 +4520 5 5.30472231 0.30472230911254883 0.092855685670883759 +4521 5 5.121645 0.12164497375488281 0.014797499639826128 +4522 6 5.402982 0.59701776504516602 0.35643021177952505 +4523 5 5.842279 0.84227895736694336 0.70943384202314519 +4524 6 5.87058544 0.12941455841064453 0.016748127928622125 +4525 6 6.0442524 0.044252395629882813 0.0019582745189836714 +4526 6 6.299826 0.29982614517211914 0.089895717328772662 +4527 6 5.833926 0.16607379913330078 0.027580506758567935 +4528 6 5.237529 0.76247119903564453 0.58136232935885346 +4529 6 5.69664 0.3033599853515625 0.092027280712500215 +4530 6 5.64880562 0.35119438171386719 0.12333749374738545 +4531 6 5.64880562 0.35119438171386719 0.12333749374738545 +4532 6 6.077145 0.077145099639892578 0.005951366398448954 +4533 5 5.602151 0.60215091705322266 0.36258572690803703 +4534 6 6.231445 0.2314448356628418 0.053566711954999846 +4535 6 5.57208443 0.42791557312011719 0.18311173771871836 +4536 6 5.59737539 0.40262460708618164 0.16210657423130215 +4537 5 4.976461 0.023539066314697266 0.00055408764296771551 +4538 6 6.41039228 0.41039228439331055 0.16842182708955988 +4539 5 5.97664833 0.97664833068847656 0.95384196183658787 +4540 6 6.63202429 0.63202428817749023 0.39945470084626322 +4541 6 6.28159428 0.28159427642822266 0.079295336517134274 +4542 5 5.80930328 0.80930328369140625 0.65497180499369279 +4543 5 5.80930328 0.80930328369140625 0.65497180499369279 +4544 6 6.63202429 0.63202428817749023 0.39945470084626322 +4545 6 6.421122 0.42112207412719727 0.17734380131719263 +4546 6 6.49023533 0.49023532867431641 0.24033067748041503 +4547 6 6.170671 0.17067098617553711 0.029128585522130379 +4548 5 5.426098 0.42609786987304688 0.18155939471034799 +4549 5 5.80930328 0.80930328369140625 0.65497180499369279 +4550 6 5.9298563 0.070143699645996094 0.0049201386000277125 +4551 6 6.185342 0.18534183502197266 0.03435159580931213 +4552 6 6.360096 0.36009597778320313 0.12966911321564112 +4553 6 6.63202429 0.63202428817749023 0.39945470084626322 +4554 6 6.28159428 0.28159427642822266 0.079295336517134274 +4555 5 5.24526024 0.24526023864746094 0.060152584661409492 +4556 5 5.984321 0.98432111740112305 0.96888806216179546 +4557 6 5.4269495 0.57305049896240234 0.32838687436105829 +4558 6 6.144445 0.14444494247436523 0.020864341406422682 +4559 7 6.00908756 0.99091243743896484 0.98190745867123042 +4560 6 6.886959 0.88695907592773438 0.78669640237058047 +4561 6 5.88928938 0.11071062088012695 0.012256841575663202 +4562 7 6.39880657 0.60119342803955078 0.36143353791794652 +4563 7 6.4868784 0.51312160491943359 0.2632937814350953 +4564 7 6.37610674 0.62389326095581055 0.38924280106607512 +4565 5 5.434809 0.43480920791625977 0.18905904728876521 +4566 5 6.31403875 1.3140387535095215 1.726697845724857 +4567 5 5.434809 0.43480920791625977 0.18905904728876521 +4568 6 6.10477066 0.10477066040039063 0.01097689128073398 +4569 6 5.72730541 0.27269458770751953 0.074362338164974062 +4570 6 5.96737432 0.032625675201416016 0.001064434682348292 +4571 7 6.693068 0.30693197250366211 0.094207235744988793 +4572 7 6.583151 0.41684913635253906 0.1737632024778577 +4573 6 6.29685974 0.2968597412109375 0.088125705951824784 +4574 7 6.972795 0.027204990386962891 0.00074011150195474329 +4575 7 6.80273867 0.19726133346557617 0.038912033680617242 +4576 5 5.50844669 0.50844669342041016 0.25851804005014856 +4577 6 6.16599226 0.16599225997924805 0.027553430373018273 +4578 7 6.80359745 0.19640254974365234 0.038573961545807833 +4579 6 5.99077368 0.0092263221740722656 8.5125020859777578E-05 +4580 6 6.38746357 0.38746356964111328 0.15012801779903384 +4581 6 6.2404747 0.24047470092773438 0.057828081786283292 +4582 6 5.851914 0.1480860710144043 0.021929484428483192 +4583 6 5.7020545 0.29794549942016602 0.088771520624732148 +4584 6 5.8770256 0.12297439575195313 0.015122702010557987 +4585 6 6.630063 0.63006305694580078 0.3969794557278874 +4586 6 6.3478 0.34779977798461914 0.12096468556615037 +4587 6 6.250844 0.25084400177001953 0.062922713223997562 +4588 5 6.321037 1.3210368156433105 1.7451382682850181 +4589 6 6.3478 0.34779977798461914 0.12096468556615037 +4590 6 6.10267162 0.10267162322998047 0.010541462216679065 +4591 6 5.775976 0.22402381896972656 0.050186671465780819 +4592 6 6.61496735 0.61496734619140625 0.3781848368817009 +4593 6 6.114566 0.11456584930419922 0.013125333826792485 +4594 6 6.84284067 0.84284067153930664 0.71038039760082938 +4595 6 6.3083787 0.30837869644165039 0.095097420419051559 +4596 6 6.37121439 0.37121438980102539 0.13780012319534762 +4597 6 5.23584557 0.76415443420410156 0.58393199931379058 +4598 6 6.114566 0.11456584930419922 0.013125333826792485 +4599 7 6.487642 0.51235818862915039 0.26251091345534405 +4600 6 5.531089 0.46891117095947266 0.21987768625058379 +4601 6 6.02429676 0.024296760559082031 0.00059033257366536418 +4602 6 6.0132575 0.013257503509521484 0.00017576139930497447 +4603 6 6.24240875 0.24240875244140625 0.058762003260198981 +4604 6 6.490737 0.49073696136474609 0.2408227652495043 +4605 6 6.656058 0.65605783462524414 0.43041188237316419 +4606 5 6.035766 1.0357661247253418 1.0728114651285523 +4607 6 6.12503147 0.12503147125244141 0.015632868803550082 +4608 7 6.87997866 0.12002134323120117 0.014405122831021799 +4609 4 4.067561 0.067561149597167969 0.0045645089348909096 +4610 6 5.50612164 0.49387836456298828 0.24391583898341196 +4611 5 6.099027 1.099027156829834 1.2078606914494685 +4612 5 5.244759 0.24475908279418945 0.059907008610252888 +4613 5 5.484865 0.48486518859863281 0.23509425111478777 +4614 5 5.145983 0.14598321914672852 0.021311100272441763 +4615 7 6.84344435 0.1565556526184082 0.024509672366775703 +4616 5 5.49089861 0.49089860916137695 0.24098144447657432 +4617 7 7.312341 0.31234121322631836 0.097557033479688471 +4618 7 6.84344435 0.1565556526184082 0.024509672366775703 +4619 5 4.66447926 0.33552074432373047 0.11257416987155011 +4620 6 6.068257 0.068256855010986328 0.0046589982559908094 +4621 7 6.135589 0.8644108772277832 0.74720616466970569 +4622 7 7.02965355 0.029653549194335938 0.00087933297982090153 +4623 6 6.50581074 0.50581073760986328 0.25584450228143396 +4624 6 6.71426725 0.71426725387573242 0.51017770995917999 +4625 5 5.14590549 0.14590549468994141 0.02128841338071652 +4626 6 5.999968 3.1948089599609375E-05 1.0206804290646687E-09 +4627 6 6.156812 0.15681219100952148 0.024590063249206651 +4628 6 6.156812 0.15681219100952148 0.024590063249206651 +4629 7 6.295945 0.70405483245849609 0.495693207108161 +4630 7 6.22476864 0.77523136138916016 0.60098366368129064 +4631 7 6.39587164 0.60412836074829102 0.36497107626041725 +4632 6 5.999968 3.1948089599609375E-05 1.0206804290646687E-09 +4633 6 5.802772 0.19722795486450195 0.03889886618003402 +4634 6 6.481858 0.4818577766418457 0.23218691691022286 +4635 6 5.53023243 0.46976757049560547 0.22068157028934365 +4636 5 5.23276567 0.23276567459106445 0.054179859267833308 +4637 6 6.34772 0.34772014617919922 0.12090930005888367 +4638 5 5.23276567 0.23276567459106445 0.054179859267833308 +4639 6 5.48935652 0.51064348220825195 0.26075676592176933 +4640 6 6.34772 0.34772014617919922 0.12090930005888367 +4641 6 6.322356 0.32235622406005859 0.1039135351902587 +4642 7 6.412917 0.58708286285400391 0.34466628785685316 +4643 6 5.87477064 0.1252293586730957 0.01568239227367485 +4644 6 6.3486805 0.34868049621582031 0.12157808844131068 +4645 7 7.15717 0.15716981887817383 0.024702351966197966 +4646 7 6.150801 0.84919881820678711 0.72113863284380386 +4647 7 6.15693331 0.84306669235229492 0.71076144775383909 +4648 5 4.876851 0.12314891815185547 0.015165656041972397 +4649 5 4.79058552 0.20941448211669922 0.043854425320205337 +4650 5 4.79058552 0.20941448211669922 0.043854425320205337 +4651 7 7.01707125 0.017071247100830078 0.00029142747757759935 +4652 5 5.10504 0.10504007339477539 0.011033417018779801 +4653 7 6.820096 0.17990398406982422 0.032365443484195566 +4654 7 6.48909 0.5109100341796875 0.26102906302548945 +4655 7 6.48909 0.5109100341796875 0.26102906302548945 +4656 7 6.48909 0.5109100341796875 0.26102906302548945 +4657 7 6.48909 0.5109100341796875 0.26102906302548945 +4658 6 6.70158052 0.70158052444458008 0.49221523227993202 +4659 6 6.05639267 0.056392669677734375 0.003180133193382062 +4660 6 6.17747974 0.17747974395751953 0.031499059515226691 +4661 5 5.755897 0.75589704513549805 0.57138034284457717 +4662 6 6.5815897 0.58158969879150391 0.33824657774039224 +4663 7 6.41941929 0.58058071136474609 0.33707396240879461 +4664 7 6.31732941 0.68267059326171875 0.46603913890430704 +4665 6 6.5815897 0.58158969879150391 0.33824657774039224 +4666 5 5.17189026 0.1718902587890625 0.029546261066570878 +4667 7 6.31732941 0.68267059326171875 0.46603913890430704 +4668 7 6.41941929 0.58058071136474609 0.33707396240879461 +4669 5 5.65773964 0.65773963928222656 0.43262143308311352 +4670 6 5.511123 0.4888768196105957 0.23900054475257093 +4671 5 5.307423 0.30742311477661133 0.094508971498953542 +4672 5 5.307423 0.30742311477661133 0.094508971498953542 +4673 7 6.804415 0.19558477401733398 0.038253403827411603 +4674 7 6.674548 0.32545185089111328 0.10591890724845143 +4675 6 5.994039 0.0059609413146972656 3.5532821357264766E-05 +4676 6 5.834837 0.16516304016113281 0.02727882983526797 +4677 7 6.804415 0.19558477401733398 0.038253403827411603 +4678 6 5.511123 0.4888768196105957 0.23900054475257093 +4679 5 5.21835136 0.21835136413574219 0.04767731821993948 +4680 4 4.445275 0.44527482986450195 0.19826967411086116 +4681 6 6.520746 0.52074623107910156 0.27117663718308904 +4682 6 6.029323 0.029323101043701172 0.00085984425481910876 +4683 6 6.217881 0.21788120269775391 0.047472218489019724 +4684 6 5.87797546 0.1220245361328125 0.014889987418428063 +4685 5 5.614559 0.61455917358398438 0.37768297783622984 +4686 4 4.445275 0.44527482986450195 0.19826967411086116 +4687 6 5.873857 0.12614297866821289 0.015912051067289212 +4688 6 5.873857 0.12614297866821289 0.015912051067289212 +4689 6 5.873857 0.12614297866821289 0.015912051067289212 +4690 6 5.873857 0.12614297866821289 0.015912051067289212 +4691 7 6.21955347 0.78044652938842773 0.609096785234442 +4692 5 5.3218236 0.3218235969543457 0.10357042755663315 +4693 6 5.873857 0.12614297866821289 0.015912051067289212 +4694 7 6.21955347 0.78044652938842773 0.609096785234442 +4695 7 6.933452 0.066547870635986328 0.0044286190861839714 +4696 6 6.37950754 0.37950754165649414 0.14402597417415564 +4697 7 6.933452 0.066547870635986328 0.0044286190861839714 +4698 6 5.58320951 0.41679048538208008 0.17371430870502991 +4699 5 5.746622 0.74662208557128906 0.55744453866282129 +4700 5 5.746622 0.74662208557128906 0.55744453866282129 +4701 6 5.35992 0.64007997512817383 0.40970237456008363 +4702 6 5.35992 0.64007997512817383 0.40970237456008363 +4703 7 6.871542 0.12845802307128906 0.016501463691383833 +4704 6 5.208801 0.7911992073059082 0.6259961856414975 +4705 6 6.086628 0.086627960205078125 0.0075044034892925993 +4706 7 6.45238543 0.54761457443237305 0.29988172213074904 +4707 6 5.954611 0.045389175415039063 0.0020601772448571865 +4708 6 5.937922 0.062077999114990234 0.0038536779741207283 +4709 6 6.36317444 0.3631744384765625 0.13189567276276648 +4710 7 6.88844156 0.11155843734741211 0.012445284943396473 +4711 6 5.954611 0.045389175415039063 0.0020601772448571865 +4712 6 6.086628 0.086627960205078125 0.0075044034892925993 +4713 6 6.17846537 0.17846536636352539 0.03184988699126734 +4714 7 6.45238543 0.54761457443237305 0.29988172213074904 +4715 6 6.0296874 0.029687404632568359 0.00088134199381784128 +4716 6 5.500597 0.49940299987792969 0.24940335628707544 +4717 6 5.83446074 0.16553926467895508 0.027403248150449144 +4718 6 5.7104845 0.28951549530029297 0.08381922201897396 +4719 6 6.0296874 0.029687404632568359 0.00088134199381784128 +4720 5 6.018594 1.0185937881469727 1.0375333052515998 +4721 6 5.741637 0.25836277008056641 0.06675132096370362 +4722 6 5.74905825 0.25094175338745117 0.062971763593168362 +4723 6 5.188327 0.81167316436767578 0.65881332575463603 +4724 6 5.741637 0.25836277008056641 0.06675132096370362 +4725 6 5.933058 0.066942214965820313 0.004481260144530097 +4726 6 6.58313274 0.58313274383544922 0.34004379693305964 +4727 6 5.74905825 0.25094175338745117 0.062971763593168362 +4728 6 6.12326145 0.12326145172119141 0.0151933854804156 +4729 5 4.763585 0.23641490936279297 0.055892009369017615 +4730 5 5.75737047 0.7573704719543457 0.57361003178834835 +4731 6 6.438391 0.43839120864868164 0.19218685182045192 +4732 6 6.438391 0.43839120864868164 0.19218685182045192 +4733 6 5.58918953 0.41081047058105469 0.1687652427390276 +4734 6 6.27040625 0.27040624618530273 0.07311953797602655 +4735 6 6.182541 0.1825408935546875 0.033321177819743752 +4736 6 6.14279032 0.14279031753540039 0.020389074781860472 +4737 7 6.86660957 0.13339042663574219 0.017793005918065319 +4738 6 6.558869 0.5588688850402832 0.31233443066616928 +4739 6 6.27040625 0.27040624618530273 0.07311953797602655 +4740 5 5.17440128 0.17440128326416016 0.030415807604185829 +4741 6 6.253006 0.2530059814453125 0.064012026647105813 +4742 6 6.10954475 0.10954475402832031 0.012000053135125199 +4743 5 5.667788 0.66778802871704102 0.4459408512977916 +4744 5 5.227569 0.2275691032409668 0.051787696749897805 +4745 3 4.15831566 1.1583156585693359 1.3416951648869144 +4746 6 5.612184 0.38781595230102539 0.1504012128591512 +4747 6 6.03694153 0.0369415283203125 0.0013646765146404505 +4748 5 5.36980057 0.36980056762695313 0.13675245981721673 +4749 6 5.3687706 0.63122940063476563 0.39845055622572545 +4750 5 5.667788 0.66778802871704102 0.4459408512977916 +4751 6 5.72508335 0.27491664886474609 0.0755791638230221 +4752 7 6.44327545 0.55672454833984375 0.30994222272420302 +4753 6 6.50943756 0.50943756103515625 0.25952662859344855 +4754 6 6.04133129 0.041331291198730469 0.0017082756321542547 +4755 6 6.22371769 0.22371768951416016 0.050049604601554165 +4756 7 6.88606071 0.11393928527832031 0.01298216072973446 +4757 7 6.88606071 0.11393928527832031 0.01298216072973446 +4758 6 6.42606163 0.42606163024902344 0.18152851277045556 +4759 6 5.800061 0.19993877410888672 0.03997551339216443 +4760 6 5.800061 0.19993877410888672 0.03997551339216443 +4761 6 5.90801764 0.091982364654541016 0.0084607554074409563 +4762 7 6.444339 0.55566120147705078 0.30875937082691962 +4763 7 6.45304155 0.54695844650268555 0.29916354220063113 +4764 6 6.3152113 0.31521129608154297 0.099358161177406146 +4765 8 7.632688 0.36731195449829102 0.13491807191735461 +4766 8 6.674454 1.3255457878112793 1.7570716355842251 +4767 7 5.7801075 1.2198925018310547 1.4881377160236298 +4768 6 5.662743 0.33725690841674805 0.11374222227482278 +4769 6 5.662743 0.33725690841674805 0.11374222227482278 +4770 6 5.662743 0.33725690841674805 0.11374222227482278 +4771 6 5.662743 0.33725690841674805 0.11374222227482278 +4772 5 5.26093054 0.26093053817749023 0.068084745753594689 +4773 7 6.377726 0.62227392196655273 0.38722483395963536 +4774 4 4.799238 0.79923820495605469 0.63878170826137648 +4775 6 5.86095858 0.13904142379760742 0.019332517531665872 +4776 6 5.65545845 0.34454154968261719 0.11870887945769937 +4777 6 6.325419 0.32541894912719727 0.1058974924510494 +4778 6 5.73885965 0.26114034652709961 0.068194280584293665 +4779 4 4.23472452 0.23472452163696289 0.05509560105770106 +4780 5 5.33977365 0.33977365493774414 0.11544613658975322 +4781 5 5.29841661 0.2984166145324707 0.089052475829021205 +4782 6 5.57891226 0.42108774185180664 0.17731488633785375 +4783 6 5.57891226 0.42108774185180664 0.17731488633785375 +4784 5 5.45173359 0.45173358917236328 0.20406323558654549 +4785 7 6.26505136 0.73494863510131836 0.5401494962372908 +4786 8 7.59331274 0.40668725967407227 0.16539452718120629 +4787 8 7.5935235 0.40647649765014648 0.16522314314192954 +4788 5 5.45173359 0.45173358917236328 0.20406323558654549 +4789 6 6.32882261 0.32882261276245117 0.10812431066392492 +4790 6 6.273167 0.27316713333129883 0.074620282732439591 +4791 6 5.57891226 0.42108774185180664 0.17731488633785375 +4792 6 6.35385656 0.35385656356811523 0.12521446758023558 +4793 6 5.326376 0.67362403869628906 0.45376934550949954 +4794 5 5.326376 0.32637596130371094 0.10652126811692142 +4795 7 6.731957 0.26804304122924805 0.071847071951424368 +4796 7 6.731957 0.26804304122924805 0.071847071951424368 +4797 6 6.430296 0.43029594421386719 0.1851545996069035 +4798 5 5.443855 0.44385480880737305 0.19700709130142968 +4799 6 5.85747528 0.14252471923828125 0.020313295593950897 +4800 7 6.090511 0.90948915481567383 0.82717052272732872 +4801 7 6.731957 0.26804304122924805 0.071847071951424368 +4802 8 7.11547756 0.88452243804931641 0.78237994341270678 +4803 7 6.62180328 0.37819671630859375 0.14303275622660294 +4804 4 4.869589 0.86958885192871094 0.75618477139869356 +4805 6 5.678698 0.32130193710327148 0.10323493478631462 +4806 6 5.321511 0.67848920822143555 0.46034760567295052 +4807 6 6.257139 0.25713920593261719 0.06612057122765691 +4808 5 5.25239038 0.25239038467407227 0.063700906275926172 +4809 6 5.896619 0.10338115692138672 0.010687663606404385 +4810 5 5.50128031 0.50128030776977539 0.25128194695776074 +4811 6 6.553216 0.55321598052978516 0.30604792111353163 +4812 7 6.650127 0.34987306594848633 0.12241116227619386 +4813 5 5.011426 0.011425971984863281 0.00013055283579888055 +4814 6 6.38597345 0.38597345352172852 0.14897550682348992 +4815 7 6.08776045 0.91223955154418945 0.83218099940154389 +4816 6 5.67866659 0.32133340835571289 0.10325515932549933 +4817 6 6.323233 0.32323312759399414 0.1044796547741953 +4818 6 6.488521 0.48852109909057617 0.23865286425666454 +4819 6 6.38597345 0.38597345352172852 0.14897550682348992 +4820 5 5.011426 0.011425971984863281 0.00013055283579888055 +4821 6 5.849298 0.15070199966430664 0.022711092702820679 +4822 6 6.066161 0.066161155700683594 0.0043772985236500972 +4823 7 6.421701 0.57829904556274414 0.33442978609878082 +4824 5 5.58794451 0.58794450759887695 0.34567874401568588 +4825 6 6.2006855 0.20068550109863281 0.040274670351209352 +4826 6 6.2006855 0.20068550109863281 0.040274670351209352 +4827 6 6.222501 0.22250080108642578 0.049506606484101212 +4828 5 5.58794451 0.58794450759887695 0.34567874401568588 +4829 7 6.64049864 0.35950136184692383 0.12924122916979286 +4830 6 5.825965 0.17403507232666016 0.030288206399745832 +4831 6 5.265776 0.73422384262084961 0.53908465107292614 +4832 5 5.54404974 0.54404973983764648 0.29599011941741082 +4833 6 6.187524 0.18752384185791016 0.035165191265150497 +4834 7 6.51944542 0.48055458068847656 0.23093270502067753 +4835 6 6.157933 0.15793323516845703 0.024942906770775153 +4836 5 5.189078 0.18907785415649414 0.035750434932424469 +4837 6 6.775595 0.77559518814086914 0.6015478958672702 +4838 6 6.283699 0.28369903564453125 0.080485142825637013 +4839 4 4.806295 0.80629491806030273 0.6501114948898703 +4840 7 6.78762436 0.21237564086914063 0.045103412834578194 +4841 6 6.64768744 0.64768743515014648 0.41949901365137521 +4842 6 5.82111263 0.17888736724853516 0.032000690161112288 +4843 5 5.69835854 0.69835853576660156 0.48770464447807171 +4844 6 5.99322653 0.0067734718322753906 4.5879920662628138E-05 +4845 5 5.24329 0.24328994750976563 0.059189998559304513 +4846 6 6.49306726 0.49306726455688477 0.24311532737760899 +4847 7 6.83293533 0.16706466674804688 0.027910602875635959 +4848 6 6.14575 0.14575004577636719 0.021243075843813131 +4849 5 5.2928853 0.29288530349731445 0.085781801004713998 +4850 6 6.14575 0.14575004577636719 0.021243075843813131 +4851 5 5.2928853 0.29288530349731445 0.085781801004713998 +4852 5 5.812308 0.81230783462524414 0.65984401819355298 +4853 5 5.880716 0.88071584701538086 0.77566040318401974 +4854 6 6.773512 0.77351188659667969 0.59832063870635466 +4855 6 5.990097 0.0099029541015625 9.8068499937653542E-05 +4856 6 5.990097 0.0099029541015625 9.8068499937653542E-05 +4857 6 6.072716 0.072716236114501953 0.0052876509946599981 +4858 5 5.16453362 0.16453361511230469 0.027071310501924017 +4859 6 6.25013876 0.25013875961303711 0.062569399060748765 +4860 6 5.51640558 0.48359441757202148 0.23386356070682268 +4861 6 6.30488443 0.30488443374633789 0.092954517940825099 +4862 6 6.22345257 0.22345256805419922 0.049931050170016533 +4863 7 7.229968 0.22996807098388672 0.052885313672049961 +4864 5 5.21371746 0.21371746063232422 0.045675152979129052 +4865 6 6.7802043 0.78020429611206055 0.60871874367171586 +4866 6 6.162457 0.16245698928833008 0.026392273368628594 +4867 6 5.48054552 0.5194544792175293 0.26983295597915458 +4868 6 6.255599 0.25559902191162109 0.06533086000217736 +4869 6 5.276372 0.72362804412841797 0.52363754624911962 +4870 7 6.32495165 0.6750483512878418 0.45569027657643346 +4871 6 6.275876 0.27587604522705078 0.076107592330117768 +4872 5 5.51944447 0.51944446563720703 0.26982255288112356 +4873 6 6.36134958 0.36134958267211914 0.13057352089731467 +4874 6 5.839919 0.16008090972900391 0.025625897659665497 +4875 6 5.54447174 0.45552825927734375 0.20750599500024691 +4876 7 6.754775 0.24522495269775391 0.060135277425615641 +4877 5 4.56240654 0.43759346008300781 0.19148803630741895 +4878 4 4.348716 0.34871578216552734 0.12160269673131552 +4879 6 5.42275333 0.57724666595458984 0.33321371335568983 +4880 6 5.42275333 0.57724666595458984 0.33321371335568983 +4881 6 5.956958 0.043042182922363281 0.0018526295107221813 +4882 5 5.613491 0.61349105834960938 0.37637127867492381 +4883 6 5.962695 0.037304878234863281 0.0013916539401179762 +4884 5 5.39742565 0.39742565155029297 0.15794714851017488 +4885 6 5.42275333 0.57724666595458984 0.33321371335568983 +4886 7 7.14290667 0.14290666580200195 0.020422315130645075 +4887 7 6.002443 0.99755716323852539 0.99512029392849399 +4888 5 5.83609962 0.83609962463378906 0.69906258231276297 +4889 6 5.956958 0.043042182922363281 0.0018526295107221813 +4890 6 6.54341841 0.54341840744018555 0.29530356554482751 +4891 6 5.73423624 0.26576375961303711 0.070630375923656175 +4892 5 6.00746965 1.007469654083252 1.0149951038986273 +4893 6 6.28490925 0.28490924835205078 0.081173279796530551 +4894 5 5.443358 0.44335794448852539 0.19656626694109036 +4895 6 5.4413476 0.55865240097045898 0.31209250511005848 +4896 7 7.037857 0.0378570556640625 0.0014331566635519266 +4897 6 5.9355073 0.064492702484130859 0.0041593086737066187 diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE-out.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE-out.txt new file mode 100644 index 0000000000..0209b5a363 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.529227 +L2(avg): 0.479877 +RMS(avg): 0.692731 +Loss-fn(avg): 0.479877 +R Squared: 0.383532 +L1(avg): 0.519622 +L2(avg): 0.463327 +RMS(avg): 0.680681 +Loss-fn(avg): 0.463327 +R Squared: 0.413465 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.524425 (0.0048) +L2(avg): 0.471602 (0.0083) +RMS(avg): 0.686706 (0.0060) +Loss-fn(avg): 0.471602 (0.0083) +R Squared: 0.398499 (0.0150) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l1: 0.344282018934789 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] (%Time%) Iteration: 50 Training-l1: 0.345211959030736 +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE-rp.txt new file mode 100644 index 0000000000..e2cc16093d --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.524425 0.471602 0.686706 0.471602 0.398499 50 0.2 20 10 + 1 Mae LightGBMR %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Mae + diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE.txt new file mode 100644 index 0000000000..23cd505851 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-CV-wine.MAE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +5 6 5.80925941 0.19074058532714844 0.036381970890943194 +6 6 5.25261068 0.74738931655883789 0.55859079050628679 +8 6 5.54791927 0.45208072662353516 0.20437698338446353 +9 6 5.8812604 0.11873960494995117 0.014099093783670469 +10 5 5.785368 0.78536796569824219 0.61680284154499532 +11 5 5.39364529 0.39364528656005859 0.15495661163095065 +18 6 6.00869131 0.0086913108825683594 7.5538884857451194E-05 +20 8 7.3507967 0.64920330047607422 0.42146492534902791 +21 7 5.944835 1.0551648139953613 1.1133727846938655 +25 6 5.694817 0.30518293380737305 0.093136623087275439 +28 6 5.61064863 0.38935136795043945 0.15159448772487849 +31 6 5.437836 0.5621638298034668 0.31602817153930118 +32 6 5.90667772 0.093322277069091797 0.0087090473973603366 +35 5 6.36959553 1.3695955276489258 1.8757919093559394 +37 6 5.738825 0.26117515563964844 0.068212461923394585 +40 6 5.940867 0.059133052825927734 0.00349671793651396 +41 6 5.764175 0.2358250617980957 0.055613459772075657 +44 6 5.675231 0.32476902008056641 0.10547491640409135 +45 7 5.761184 1.2388157844543457 1.5346645478132359 +46 4 5.20731735 1.2073173522949219 1.4576151891524205 +48 6 5.509978 0.49002218246459961 0.24012173930736935 +50 6 6.087853 0.087852954864501953 0.0077181416784242174 +51 7 6.269763 0.73023700714111328 0.53324608659841033 +52 7 5.902807 1.0971927642822266 1.2038319619932736 +54 6 5.920922 0.079078197479248047 0.0062533613165669522 +56 6 6.12345076 0.12345075607299805 0.015240089174994864 +60 6 5.55601835 0.44398164749145508 0.19711970330922668 +63 6 5.4165206 0.58347940444946289 0.3404482154166999 +64 6 5.797542 0.20245790481567383 0.040989203222352444 +66 7 6.7072444 0.2927556037902832 0.085705843550613281 +68 8 6.16529369 1.8347063064575195 3.3661472309549936 +69 5 5.56024361 0.56024360656738281 0.31387289869962842 +70 6 5.368725 0.63127517700195313 0.39850834909884725 +71 5 5.117893 0.11789321899414063 0.0138988110848004 +72 5 4.764992 0.23500776290893555 0.055228648627462462 +73 6 4.900103 1.0998969078063965 1.2097732078020726 +74 8 6.16529369 1.8347063064575195 3.3661472309549936 +76 7 6.41728163 0.5827183723449707 0.33956070146837192 +77 7 6.43876266 0.56123733520507813 0.31498734642809723 +79 5 5.14644241 0.14644241333007813 0.021445380421937443 +82 5 5.25564528 0.2556452751159668 0.065354506689118352 +88 5 5.28622627 0.28622627258300781 0.08192547911676229 +90 6 5.28622627 0.71377372741699219 0.50947293395074666 +91 5 5.319233 0.31923294067382813 0.10190967041125987 +92 7 6.542394 0.45760583877563477 0.20940310368155224 +93 7 6.542394 0.45760583877563477 0.20940310368155224 +95 6 5.60025549 0.39974451065063477 0.15979567379531545 +96 6 5.275809 0.72419118881225586 0.52445287795330842 +97 7 5.49176 1.5082402229309082 2.2747885700666757 +98 4 4.39247751 0.39247751235961914 0.154038597707995 +99 6 5.275809 0.72419118881225586 0.52445287795330842 +100 5 5.7011075 0.70110750198364258 0.49155172933774338 +102 5 5.43836355 0.43836355209350586 0.19216260380403583 +104 5 5.7011075 0.70110750198364258 0.49155172933774338 +105 6 6.030436 0.030436038970947266 0.00092635246824102069 +106 5 5.72359943 0.72359943389892578 0.52359614073884586 +108 6 5.951213 0.048787117004394531 0.002380182785600482 +109 5 5.5798564 0.57985639572143555 0.33623343965905406 +111 5 5.28739548 0.28739547729492188 0.082596160369575955 +112 5 5.051069 0.051068782806396484 0.0026080205773268972 +113 5 5.307395 0.30739498138427734 0.094491674580240215 +115 4 4.551975 0.55197477340698242 0.30467615047768959 +117 6 6.53130627 0.53130626678466797 0.28228634912466077 +120 5 5.270566 0.27056598663330078 0.073205953122851497 +121 5 5.90539455 0.90539455413818359 0.81973929866308026 +122 5 5.915443 0.91544294357299805 0.83803578293759529 +123 6 5.816056 0.1839442253112793 0.033835478025366683 +125 6 6.380141 0.38014078140258789 0.14450701368537011 +128 7 5.995385 1.0046148300170898 1.0092509566902663 +129 6 5.84000444 0.15999555587768555 0.025598577900609598 +131 7 6.206945 0.79305505752563477 0.62893632426698787 +132 5 5.42901468 0.42901468276977539 0.18405359803205101 +133 5 5.59301567 0.59301567077636719 0.35166758578634472 +137 5 5.48119164 0.48119163513183594 0.23154538972084993 +138 7 6.38292551 0.61707448959350586 0.38078092570708577 +141 5 5.48119164 0.48119163513183594 0.23154538972084993 +144 6 5.967776 0.032224178314208984 0.0010383976680259366 +145 6 5.676757 0.32324314117431641 0.10448612831623905 +147 4 5.13458252 1.13458251953125 1.2872774936258793 +150 7 6.13511133 0.86488866806030273 0.74803240813912453 +151 6 6.027541 0.027541160583496094 0.0007585155262859189 +152 6 5.62424946 0.37575054168701172 0.14118846957808273 +154 6 5.33823538 0.66176462173461914 0.43793241457956356 +156 6 5.97231054 0.027689456939697266 0.00076670602561534906 +161 5 5.71372271 0.71372270584106445 0.50940010083309062 +164 5 5.853947 0.85394716262817383 0.72922575656070876 +167 7 6.47956038 0.52043962478637695 0.27085740304778483 +169 5 4.20788145 0.79211854934692383 0.627451796219475 +171 6 6.20117569 0.20117568969726563 0.040471658125170507 +173 7 6.575046 0.42495393753051758 0.18058584902269104 +174 5 5.22949076 0.22949075698852539 0.052666007543166415 +176 4 6.469169 2.4691691398620605 6.0967962412471479 +177 5 5.554319 0.55431890487670898 0.30726944830371394 +179 6 5.21643 0.7835698127746582 0.61398165149171291 +180 6 5.23204136 0.76795864105224609 0.58976047436681256 +181 5 5.114332 0.11433219909667969 0.013071851750282804 +183 6 5.728629 0.27137088775634766 0.073642158721668238 +187 5 6.144768 1.144768238067627 1.310494318888459 +188 8 6.912892 1.0871081352233887 1.1818040976688735 +189 4 5.552815 1.5528149604797363 2.4112343014896851 +191 5 5.36272526 0.36272525787353516 0.13156961269942258 +192 6 6.28948736 0.28948736190795898 0.083802932704429622 +196 5 5.54256725 0.54256725311279297 0.29437922415036155 +198 5 5.42950869 0.42950868606567383 0.18447771140586156 +199 5 5.22549 0.22549009323120117 0.050845782145415797 +201 5 5.42950869 0.42950868606567383 0.18447771140586156 +202 5 4.930763 0.069237232208251953 0.0047937943238594016 +204 4 5.89362049 1.893620491027832 3.5857985640404877 +205 5 5.62215757 0.62215757369995117 0.38708004651221017 +206 5 6.09528875 1.0952887535095215 1.1996574535644413 +207 4 4.813859 0.81385898590087891 0.66236644893160701 +209 6 5.444507 0.55549287796020508 0.30857233746451129 +210 5 5.19806051 0.19806051254272461 0.039227966628686772 +211 7 6.47038841 0.52961158752441406 0.2804884336401301 +212 5 6.09528875 1.0952887535095215 1.1996574535644413 +216 5 5.82277775 0.82277774810791016 0.67696322278152365 +218 5 5.279291 0.27929115295410156 0.078003548118431354 +219 5 6.20777273 1.2077727317810059 1.4587149716337535 +223 6 5.773505 0.22649478912353516 0.051299889500114659 +226 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +228 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +233 6 5.95629835 0.043701648712158203 0.0019098341001608787 +237 6 5.319764 0.68023586273193359 0.462720828946658 +239 6 5.79168749 0.2083125114440918 0.043394102424144876 +240 5 5.103008 0.10300779342651367 0.010610605506599313 +241 5 5.67736959 0.67736959457397461 0.45882956765331073 +242 7 6.24281359 0.7571864128112793 0.57333126374601306 +244 5 5.46525669 0.46525669097900391 0.21646378850073233 +246 7 6.98627472 0.01372528076171875 0.00018838333198800683 +247 7 5.997908 1.0020918846130371 1.0041881452073085 +248 7 6.137768 0.86223220825195313 0.74344438094703946 +249 5 5.48982763 0.48982763290405273 0.23993110995638744 +250 4 5.08111 1.0811100006103516 1.1687988334197144 +252 5 5.46525669 0.46525669097900391 0.21646378850073233 +254 6 5.661961 0.33803892135620117 0.11427031235166396 +257 7 5.922548 1.0774521827697754 1.1609032061553535 +258 6 6.399062 0.39906215667724609 0.15925060489189491 +259 4 4.36215544 0.36215543746948242 0.13115656088871219 +260 6 6.13484335 0.13484334945678711 0.018182728892725208 +262 5 5.512335 0.51233482360839844 0.26248697148184874 +267 5 5.598096 0.59809589385986328 0.35771869825202884 +268 6 5.598096 0.40190410614013672 0.16152691053230228 +269 6 5.598096 0.40190410614013672 0.16152691053230228 +271 5 5.62772274 0.62772274017333984 0.39403583853072632 +272 5 5.44098473 0.44098472595214844 0.19446752852309146 +275 6 5.79458046 0.20541954040527344 0.042197187580313766 +276 6 5.819891 0.18010902404785156 0.032439260543469572 +277 5 4.75812 0.24187994003295898 0.058505905390347834 +278 4 5.19088364 1.1908836364746094 1.4182038356229896 +279 7 6.35347462 0.64652538299560547 0.41799507085761434 +280 8 6.60628176 1.3937182426452637 1.9424505398822021 +283 5 5.44280434 0.44280433654785156 0.19607568046558299 +284 5 5.440112 0.44011211395263672 0.19369867284785869 +285 5 5.241145 0.24114513397216797 0.058150975638454838 +288 7 6.387907 0.61209297180175781 0.37465780612910748 +290 7 6.387907 0.61209297180175781 0.37465780612910748 +291 6 6.120554 0.12055397033691406 0.014533259763993556 +293 7 6.009457 0.99054288864135742 0.98117521423796461 +296 5 4.96861649 0.031383514404296875 0.00098492497636470944 +297 7 6.430575 0.56942510604858398 0.32424495139844112 +299 6 6.040891 0.040891170501708984 0.001672087824999835 +300 6 5.68149137 0.31850862503051758 0.10144774421883085 +301 6 5.41270971 0.58729028701782227 0.34490988122547606 +303 6 5.678506 0.32149410247802734 0.10335845792815235 +304 6 5.49561548 0.50438451766967773 0.25440374166487345 +308 7 5.756687 1.2433128356933594 1.5458268073998624 +309 6 5.778518 0.2214818000793457 0.049054187766387258 +311 8 5.75409937 2.2459006309509277 5.0440696441057753 +312 6 6.003036 0.0030360221862792969 9.2174307155801216E-06 +314 5 5.69624 0.69623994827270508 0.48475006557077904 +316 6 6.010912 0.010911941528320313 0.00011907046791748144 +317 5 6.118836 1.1188359260559082 1.2517938294333817 +319 6 5.91781473 0.082185268402099609 0.0067544183423251525 +321 5 6.118836 1.1188359260559082 1.2517938294333817 +323 6 5.817978 0.1820220947265625 0.033132042968645692 +327 6 5.612565 0.38743495941162109 0.15010584777428448 +328 6 5.507632 0.49236822128295898 0.24242646532934486 +329 5 5.871286 0.87128591537475586 0.75913914633042623 +331 5 6.08688164 1.0868816375732422 1.1813116940938926 +332 6 6.02704 0.027040004730224609 0.00073116185581056925 +333 5 5.85901356 0.85901355743408203 0.73790429185555695 +336 6 6.04825258 0.048252582550048828 0.0023283117227492767 +338 5 5.77029 0.77028989791870117 0.59334652683560307 +343 5 6.06355762 1.0635576248168945 1.1311548213061542 +344 6 6.182091 0.18209123611450195 0.0331572182697073 +346 7 5.75412464 1.245875358581543 1.5522054091206883 +347 6 6.342347 0.34234714508056641 0.11720156774481438 +348 6 5.79792 0.20207977294921875 0.040836234635207802 +349 5 6.08598661 1.0859866142272949 1.1793669262808635 +350 7 6.854967 0.14503288269042969 0.021034537061495939 +352 6 5.489034 0.51096582412719727 0.26108607342598589 +353 7 6.611001 0.38899898529052734 0.15132021055705991 +354 6 5.52786064 0.47213935852050781 0.22291557386415661 +355 6 6.276119 0.27611923217773438 0.076241830378421582 +358 6 5.28521156 0.71478843688964844 0.51092250951114693 +360 6 5.749971 0.25002908706665039 0.062514544379382642 +361 5 5.09363651 0.093636512756347656 0.0087677965211696574 +366 6 5.87889862 0.12110137939453125 0.014665544091258198 +368 6 5.62576056 0.37423944473266602 0.14005516199381418 +370 6 5.31511259 0.68488740921020508 0.4690707632946669 +371 6 5.62576056 0.37423944473266602 0.14005516199381418 +373 6 5.85963631 0.14036369323730469 0.019701966379216174 +376 7 5.57551432 1.4244856834411621 2.0291594623288347 +377 7 5.73623 1.2637701034545898 1.5971148743856247 +378 6 5.619952 0.38004779815673828 0.14443632888378488 +379 7 5.57551432 1.4244856834411621 2.0291594623288347 +381 6 5.39476871 0.60523128509521484 0.36630490845800523 +383 6 5.85963631 0.14036369323730469 0.019701966379216174 +384 7 6.641092 0.35890817642211914 0.128815079102651 +387 5 5.16575956 0.16575956344604492 0.027476232873823392 +388 6 5.79469872 0.20530128479003906 0.042148617536440725 +389 7 5.889894 1.1101059913635254 1.2323353120611955 +391 5 5.161842 0.16184186935424805 0.026192790676077493 +392 6 4.993642 1.0063581466674805 1.0127567193640061 +395 5 5.118578 0.11857795715332031 0.014060731922654668 +396 5 6.19858265 1.198582649230957 1.4366003670374994 +398 5 5.2838583 0.28385829925537109 0.08057553405615181 +399 6 6.63788939 0.63788938522338867 0.40690286778067275 +404 6 6.922693 0.92269277572631836 0.85136195837753803 +406 7 7.06596661 0.065966606140136719 0.0043515931256479234 +409 5 6.19858265 1.198582649230957 1.4366003670374994 +413 5 6.020768 1.0207681655883789 1.0419676478786641 +414 6 5.695077 0.30492305755615234 0.092978071029392595 +415 6 6.16900349 0.16900348663330078 0.028562178494212276 +416 6 5.963897 0.036102771759033203 0.0013034101286848454 +418 6 5.963897 0.036102771759033203 0.0013034101286848454 +419 6 5.949179 0.050820827484130859 0.0025827565061717905 +422 6 6.07098675 0.070986747741699219 0.0050391183549436391 +423 6 6.07098675 0.070986747741699219 0.0050391183549436391 +428 5 5.7041 0.70410013198852539 0.49575699586625888 +429 5 5.346765 0.34676504135131836 0.12024599390338153 +430 5 5.213252 0.21325206756591797 0.045476444321138842 +434 8 6.47353649 1.526463508605957 2.3300908431056087 +436 5 5.53445244 0.53445243835449219 0.28563940886306227 +439 5 5.28787327 0.28787326812744141 0.082871018502373772 +440 7 6.07598972 0.92401027679443359 0.85379499162172579 +441 6 5.75848246 0.24151754379272461 0.058330723959670649 +442 8 7.165652 0.83434820175170898 0.69613692176631048 +449 7 6.35148335 0.64851665496826172 0.42057385177122342 +450 5 5.120258 0.12025785446166992 0.014461951559724184 +451 5 5.365356 0.3653559684753418 0.13348498370055495 +452 7 5.664081 1.3359189033508301 1.7846793163300845 +453 7 6.27505159 0.72494840621948242 0.5255501916801677 +454 7 6.35148335 0.64851665496826172 0.42057385177122342 +455 6 6.007873 0.0078730583190917969 6.198504729582055E-05 +456 7 6.707905 0.29209518432617188 0.085319596706540324 +457 5 5.548654 0.54865407943725586 0.30102129888314266 +464 5 4.955248 0.044752120971679688 0.0020027523314638529 +465 5 5.86635351 0.86635351181030273 0.75056840742604436 +466 6 6.02778864 0.027788639068603516 0.00077220846128511766 +467 6 5.234385 0.76561498641967773 0.58616630743040332 +474 6 5.60722351 0.3927764892578125 0.1542733705136925 +480 5 5.260892 0.26089191436767578 0.068064590982430673 +482 5 5.68141937 0.68141937255859375 0.46433236129814759 +483 5 5.260892 0.26089191436767578 0.068064590982430673 +484 5 5.635592 0.63559198379516602 0.40397716986467458 +487 6 5.75940228 0.24059772491455078 0.05788726523405785 +489 6 5.510854 0.48914623260498047 0.23926403687164566 +492 6 5.79296 0.20703983306884766 0.042865492477176304 +493 6 6.572476 0.57247591018676758 0.32772866774416798 +495 6 6.27768564 0.27768564224243164 0.077109315907591736 +497 6 6.73239136 0.732391357421875 0.53639710042625666 +501 6 6.09444 0.094439983367919922 0.0089189104585329915 +502 6 4.93793154 1.0620684623718262 1.1279894187648551 +504 6 6.10658 0.10657978057861328 0.011359249628185353 +507 7 6.01234531 0.98765468597412109 0.97546177872663975 +510 6 5.070314 0.92968606948852539 0.86431618780102326 +513 6 5.1853447 0.81465530395507813 0.66366326426214073 +514 7 5.73061 1.2693901062011719 1.6113512417214224 +517 6 6.6399765 0.63997650146484375 0.40956992242718115 +519 5 5.082864 0.082863807678222656 0.006866410622933472 +520 5 5.31589842 0.31589841842651367 0.099791810764372713 +521 5 5.31589842 0.31589841842651367 0.099791810764372713 +522 6 6.029837 0.029837131500244141 0.00089025441616286116 +523 6 6.27957726 0.27957725524902344 0.078163441652577603 +527 6 6.60642529 0.60642528533935547 0.3677516266989187 +528 6 6.449012 0.44901180267333984 0.20161159893996228 +529 6 6.22961235 0.22961235046386719 0.05272183148554177 +531 5 5.883754 0.88375377655029297 0.78102073756690515 +532 6 5.89077663 0.10922336578369141 0.011929743633118051 +533 6 5.89077663 0.10922336578369141 0.011929743633118051 +534 6 5.89077663 0.10922336578369141 0.011929743633118051 +535 5 5.346645 0.34664487838745117 0.12016267171225081 +538 5 5.79111242 0.79111242294311523 0.62585886573492644 +539 6 4.73198748 1.268012523651123 1.6078557601360899 +540 4 5.58705235 1.5870523452758789 2.5187351466456676 +541 5 4.98033667 0.019663333892822266 0.00038664669978061283 +544 6 5.297719 0.70228099822998047 0.49319860047489783 +546 6 5.97325468 0.026745319366455078 0.00071531210801367706 +547 6 5.00359249 0.99640750885009766 0.99282792369285744 +548 7 6.20132637 0.79867362976074219 0.63787956687519909 +549 5 4.98033667 0.019663333892822266 0.00038664669978061283 +557 6 5.614946 0.38505411148071289 0.14826666876820127 +558 5 5.63443756 0.63443756103515625 0.40251101885223761 +559 6 7.161683 1.1616830825805664 1.3495075843538871 +560 7 5.784691 1.2153091430664063 1.4769763132208027 +561 5 5.333059 0.33305883407592773 0.11092818695601636 +563 7 5.43116951 1.5688304901123047 2.4612291067060141 +565 6 5.93264961 0.067350387573242188 0.0045360747062659357 +566 6 4.46060658 1.539393424987793 2.3697321168956478 +569 6 5.11153841 0.88846158981323242 0.78936399657345646 +577 7 6.873437 0.12656307220458984 0.016018211245864222 +578 7 6.35843754 0.64156246185302734 0.41160239245891717 +581 5 5.36346531 0.36346530914306641 0.13210703095046483 +582 6 5.353838 0.64616203308105469 0.41752537299544201 +584 7 6.347109 0.65289115905761719 0.42626686557559879 +586 6 5.49523 0.50476980209350586 0.25479255310551707 +590 5 5.23018074 0.23018074035644531 0.052983173231041292 +593 5 5.085209 0.085208892822265625 0.0072605554159963503 +594 5 4.95861244 0.041387557983398438 0.0017129299558291677 +600 6 5.57480049 0.42519950866699219 0.18079462217065156 +602 5 5.085209 0.085208892822265625 0.0072605554159963503 +604 6 5.64044237 0.3595576286315918 0.12928168830717368 +606 5 5.693975 0.69397497177124023 0.48160126144489368 +607 5 5.693975 0.69397497177124023 0.48160126144489368 +609 6 5.524192 0.47580814361572266 0.22639338953104016 +612 5 5.31914854 0.31914854049682617 0.1018557909012543 +613 5 5.47212744 0.47212743759155273 0.22290431732676552 +614 5 5.47212744 0.47212743759155273 0.22290431732676552 +617 6 5.64316273 0.35683727264404297 0.12733283914803906 +618 6 5.71493149 0.28506851196289063 0.081264056512736715 +619 6 5.982226 0.017774105072021484 0.00031591881111125986 +621 5 5.498616 0.49861621856689453 0.24861813341794914 +622 6 5.97288942 0.027110576629638672 0.00073498336519151053 +624 5 5.18843842 0.18843841552734375 0.035509036446455866 +627 6 5.47441864 0.52558135986328125 0.27623576583573595 +629 6 5.612334 0.38766622543334961 0.15028510234174064 +633 5 5.130599 0.13059902191162109 0.017056104524272087 +634 6 6.27952433 0.27952432632446289 0.078133849007144818 +638 5 5.46523762 0.46523761749267578 0.2164460407302613 +639 5 5.31655645 0.31655645370483398 0.1002079883821807 +641 4 5.31725073 1.3172507286071777 1.7351494820161406 +642 6 5.8524847 0.14751529693603516 0.021760762830126623 +644 5 5.4044795 0.4044795036315918 0.16360366885805888 +645 5 5.498191 0.49819087982177734 0.2481941527375966 +649 7 6.201396 0.79860401153564453 0.63776836724082386 +652 7 6.201396 0.79860401153564453 0.63776836724082386 +653 6 5.41541433 0.58458566665649414 0.34174040166021769 +654 7 7.25669 0.25669002532958984 0.065889769103705476 +656 6 6.05820942 0.058209419250488281 0.0033883364894791157 +657 5 5.41170025 0.41170024871826172 0.16949709479467856 +660 5 5.218737 0.21873712539672852 0.047845930026824135 +661 7 7.051301 0.051301002502441406 0.0026317928577554994 +665 5 5.25191 0.25191020965576172 0.063458753728809825 +668 6 5.54373264 0.45626735687255859 0.20817990094747074 +670 6 5.238275 0.76172494888305664 0.58022489775089525 +678 7 6.917017 0.082983016967773438 0.0068861811050737742 +679 7 6.917017 0.082983016967773438 0.0068861811050737742 +680 5 5.33085632 0.3308563232421875 0.10946590662933886 +681 5 4.892623 0.10737705230712891 0.011529831362167897 +682 6 5.313394 0.68660593032836914 0.4714277035620853 +683 5 5.51385975 0.51385974884033203 0.26405184147824912 +685 5 5.8867135 0.88671350479125977 0.78626083957919946 +688 6 5.619183 0.38081693649291992 0.1450215391198526 +689 7 6.298906 0.70109415054321289 0.49153300792590926 +691 6 5.242263 0.75773715972900391 0.57416560323417798 +692 5 5.242263 0.24226284027099609 0.058691283776170167 +693 5 5.38634968 0.38634967803955078 0.14926607372126455 +694 6 5.18373251 0.81626749038696289 0.66629261586263056 +696 6 6.368618 0.36861801147460938 0.13587923838349525 +697 5 5.601098 0.60109806060791016 0.36131887846659083 +698 5 5.601098 0.60109806060791016 0.36131887846659083 +700 5 4.656213 0.34378719329833984 0.11818963427595008 +702 4 5.09696865 1.0969686508178711 1.2033402208771804 +704 6 6.340482 0.34048223495483398 0.11592815231983877 +705 5 4.518304 0.48169612884521484 0.23203116054446582 +706 5 5.316164 0.31616401672363281 0.099959685470821569 +707 6 6.184279 0.18427896499633789 0.033958736940121526 +711 6 6.457628 0.45762777328491211 0.20942317888170692 +712 6 6.457628 0.45762777328491211 0.20942317888170692 +714 6 6.295977 0.29597711563110352 0.087602452977307621 +718 7 6.52073431 0.47926568984985352 0.22969560146725598 +719 7 6.42389059 0.57610940933227539 0.33190205152118324 +720 5 5.19151926 0.19151926040649414 0.036679627106650514 +721 5 5.675269 0.67526912689208984 0.45598839373360534 +722 6 6.34894657 0.34894657135009766 0.12176370965698879 +723 8 6.46900225 1.5309977531433105 2.3439541201298653 +724 7 5.61504459 1.3849554061889648 1.9181014771320406 +725 5 5.293491 0.29349088668823242 0.086136900569044883 +726 7 6.81589365 0.18410634994506836 0.033895148090095972 +727 5 5.53785133 0.53785133361816406 0.28928405707483762 +728 5 6.199583 1.1995830535888672 1.438999502457591 +729 5 5.00468874 0.0046887397766113281 2.1984280692777247E-05 +732 7 4.63813353 2.3618664741516113 5.5784132417213641 +735 6 5.423086 0.57691383361816406 0.33282957142000669 +738 7 6.386245 0.61375522613525391 0.37669547760833666 +749 6 6.437719 0.43771886825561523 0.19159780762697665 +752 6 5.85753632 0.14246368408203125 0.020295901282224804 +757 6 5.437741 0.56225919723510742 0.31613540487546743 +758 7 6.76649237 0.23350763320922852 0.0545258147669756 +760 6 5.98200846 0.017991542816162109 0.00032369561290579441 +761 6 5.923116 0.076883792877197266 0.005911117607183769 +764 6 5.51022 0.48977994918823242 0.23988439862682753 +765 6 5.8884306 0.11156940460205078 0.01244773204325611 +770 7 6.357949 0.64205121994018555 0.41222976902668051 +773 5 5.643422 0.64342212677001953 0.41399203321725508 +774 9 5.385422 3.6145777702331543 13.065172457063682 +778 7 5.48641634 1.5135836601257324 2.2909354961996087 +779 8 6.92966747 1.0703325271606445 1.1456117186980919 +780 4 4.419568 0.41956806182861328 0.17603735850661906 +781 6 5.43529367 0.56470632553100586 0.31889323409473036 +782 7 5.48641634 1.5135836601257324 2.2909354961996087 +783 8 6.92966747 1.0703325271606445 1.1456117186980919 +784 5 5.181534 0.1815338134765625 0.032954525435343385 +785 6 5.83593655 0.16406345367431641 0.026916816831544566 +786 6 5.83314848 0.16685152053833008 0.027839429905952784 +788 7 5.66685 1.3331499099731445 1.7772886824614034 +792 5 5.650315 0.6503148078918457 0.42290934936340818 +794 5 5.241264 0.24126386642456055 0.058208253242128194 +795 5 5.309075 0.30907487869262695 0.095527280638862067 +799 8 6.387804 1.6121959686279297 2.5991758412601484 +802 5 5.40781832 0.40781831741333008 0.16631578001783964 +806 5 5.720001 0.720001220703125 0.51840175781399012 +810 5 5.14145136 0.14145135879516602 0.02000848690499879 +816 5 4.93575239 0.064247608184814453 0.0041277551574694371 +817 5 4.872991 0.12700891494750977 0.01613126447614377 +819 5 4.872991 0.12700891494750977 0.01613126447614377 +821 6 5.016827 0.98317289352416992 0.96662893856068877 +826 6 5.95949173 0.040508270263671875 0.0016409199597546831 +827 9 6.604491 2.3955087661743164 5.7384622488179957 +829 7 5.97121668 1.0287833213806152 1.0583951223509303 +836 8 6.864734 1.1352658271789551 1.2888284983603171 +838 8 6.864734 1.1352658271789551 1.2888284983603171 +840 7 6.47057533 0.52942466735839844 0.28029047840755084 +841 7 6.015294 0.98470592498779297 0.96964575870606495 +845 8 6.51863337 1.4813666343688965 2.1944471054214318 +848 7 6.015294 0.98470592498779297 0.96964575870606495 +850 7 6.28177261 0.71822738647460938 0.5158505786821479 +851 5 5.376349 0.37634897232055664 0.14163854896673911 +854 7 6.6217103 0.37828969955444336 0.14310309678899102 +855 7 6.141239 0.85876083374023438 0.73747016956622247 +856 5 5.376349 0.37634897232055664 0.14163854896673911 +858 7 5.7223134 1.277686595916748 1.6324830373853274 +859 5 5.4418416 0.44184160232543945 0.19522400154551178 +860 8 5.917643 2.0823569297790527 4.3362103829988428 +861 7 5.812392 1.1876077651977539 1.4104122039580034 +862 6 5.99450731 0.0054926872253417969 3.0169612955432967E-05 +863 6 6.19006824 0.19006824493408203 0.0361259377323222 +864 5 5.983109 0.9831089973449707 0.96650330066063361 +870 5 5.25949574 0.25949573516845703 0.067338036570617987 +871 5 5.097201 0.097200870513916016 0.0094480092286630679 +872 6 5.8650465 0.13495349884033203 0.018212446849247499 +874 5 5.70609665 0.70609664916992188 0.49857247796899173 +876 9 6.585497 2.4145030975341797 5.8298252080021484 +881 6 4.8947916 1.1052083969116211 1.2214856006039554 +885 7 6.47537041 0.52462959289550781 0.27523620974170626 +887 7 6.98054171 0.019458293914794922 0.00037862520207454509 +888 6 5.94279051 0.057209491729736328 0.0032729259439747693 +890 6 5.56031656 0.43968343734741211 0.19332152507763567 +895 6 5.81204939 0.18795061111450195 0.035325432218314745 +896 6 5.99438763 0.0056123733520507813 3.1498734642809723E-05 +898 6 5.335319 0.66468095779418945 0.44180077565420106 +900 7 6.235049 0.76495122909545898 0.58515038289465338 +902 5 5.44993544 0.4499354362487793 0.20244189679237934 +904 8 5.86388254 2.1361174583435059 4.5629977958399195 +906 4 4.79390144 0.79390144348144531 0.63027950196192251 +908 4 5.38352728 1.3835272789001465 1.9141477314608437 +910 5 5.037945 0.037944793701171875 0.0014398073690244928 +912 5 5.076084 0.076084136962890625 0.0057887958973878995 +914 4 5.011776 1.0117759704589844 1.0236906143982196 +918 6 6.556393 0.55639314651489258 0.30957333348874272 +919 7 5.32240725 1.6775927543640137 2.8143174494946379 +920 7 5.549413 1.4505867958068848 2.1042020521692848 +921 6 5.48633146 0.51366853713989258 0.2638553660474372 +924 8 6.586571 1.413428783416748 1.9977809257909485 +925 5 5.22027159 0.22027158737182617 0.048519572203304051 +926 5 4.644633 0.35536718368530273 0.12628583524042369 +927 7 5.53496361 1.4650363922119141 2.1463316305053013 +930 7 6.20272636 0.79727363586425781 0.63564525044421316 +934 5 5.356482 0.35648202896118164 0.12707943697228075 +935 5 5.21572351 0.21572351455688477 0.046536634732774473 +936 5 5.39356565 0.39356565475463867 0.15489392460244744 +937 5 5.48697138 0.48697137832641602 0.2371411233091294 +938 6 5.733418 0.26658201217651367 0.071065969216078884 +940 5 5.48649 0.48648977279663086 0.23667229903571751 +944 7 5.61722565 1.3827743530273438 1.9120649113901891 +950 5 5.26733351 0.2673335075378418 0.071467204252485317 +953 5 5.79355431 0.79355430603027344 0.62972843661918887 +955 5 5.26733351 0.2673335075378418 0.071467204252485317 +956 5 4.970438 0.029561996459960938 0.000873911634698743 +958 7 5.838447 1.161552906036377 1.3492051535215523 +959 6 5.76039362 0.23960638046264648 0.057411217558410499 +960 6 5.76039362 0.23960638046264648 0.057411217558410499 +964 6 5.433831 0.56616878509521484 0.32054709321619157 +965 5 5.850355 0.85035514831542969 0.72310387826655642 +968 7 6.966538 0.033462047576904297 0.0011197086280390067 +969 7 5.98017645 1.0198235511779785 1.040040075537263 +970 7 6.274452 0.72554779052734375 0.52641959633911029 +971 7 6.336352 0.66364812850952148 0.44042883847419034 +972 6 5.526252 0.47374820709228516 0.2244373637231547 +974 6 7.051524 1.0515241622924805 1.1057030638849028 +976 6 6.41369772 0.41369771957397461 0.17114580318070693 +980 6 5.652429 0.34757089614868164 0.12080552784959764 +982 6 6.40746641 0.40746641159057617 0.16602887657450083 +983 6 6.51755238 0.51755237579345703 0.26786046168945177 +985 6 6.25447845 0.25447845458984375 0.064759283850435168 +986 6 5.613062 0.38693809509277344 0.14972108943402418 +989 7 5.79079962 1.209200382232666 1.4621655643916256 +992 5 5.663801 0.66380119323730469 0.44063202414326952 +994 6 5.55731869 0.44268131256103516 0.1959667444907609 +995 6 5.59174728 0.40825271606445313 0.16667028017400298 +997 6 5.473357 0.52664279937744141 0.277352638136108 +998 6 5.78107262 0.21892738342285156 0.047929199212376261 +999 7 5.74751568 1.2524843215942383 1.5687169758393793 +1002 6 5.24164534 0.75835466384887695 0.57510179618134316 +1004 6 6.97149324 0.97149324417114258 0.94379912347017125 +1006 6 6.97149324 0.97149324417114258 0.94379912347017125 +1007 5 4.93337536 0.066624641418457031 0.0044388428441379801 +1015 5 5.16026 0.16026020050048828 0.025683331864456704 +1016 5 5.38627958 0.38627958297729492 0.14921191622511287 +1017 6 5.939317 0.060682773590087891 0.0036823990105858684 +1018 6 5.7577734 0.24222660064697266 0.058673726060987974 +1021 7 6.02436972 0.97563028335571289 0.95185444980074863 +1025 6 6.155214 0.15521383285522461 0.024091333909609602 +1026 6 6.420076 0.42007589340209961 0.17646375621757215 +1027 4 4.320953 0.3209528923034668 0.10301075907796076 +1030 6 6.197439 0.19743919372558594 0.038982235219009453 +1032 6 5.37426758 0.625732421875 0.39154106378555298 +1033 6 5.37426758 0.625732421875 0.39154106378555298 +1034 3 4.92883873 1.9288387298583984 3.7204188458017597 +1037 5 4.7021246 0.29787540435791016 0.088729756521388481 +1039 5 5.92955065 0.9295506477355957 0.86406440670566553 +1040 4 5.261669 1.2616691589355469 1.5918090666091302 +1044 7 5.83602762 1.1639723777770996 1.3548316962280751 +1045 5 6.239166 1.2391657829284668 1.5355318375807201 +1047 5 3.99405575 1.0059442520141602 1.0119238381603282 +1049 6 7.25993538 1.2599353790283203 1.5874371593272372 +1051 6 5.60375547 0.39624452590942383 0.15700972431318405 +1052 5 5.979352 0.97935199737548828 0.95913033476335841 +1053 4 5.19417763 1.1941776275634766 1.4260602061731333 +1054 5 3.99405575 1.0059442520141602 1.0119238381603282 +1058 6 5.740259 0.25974082946777344 0.067465298492606962 +1059 4 5.367808 1.3678078651428223 1.8708983559465651 +1060 7 6.01093769 0.98906230926513672 0.97824425160888495 +1061 5 5.697409 0.69740915298461914 0.4863795266667239 +1064 6 5.840905 0.15909481048583984 0.025311158723525295 +1065 5 5.58919859 0.58919858932495117 0.34715497766251247 +1068 7 4.898771 2.101229190826416 4.415164112381035 +1069 6 6.51569176 0.51569175720214844 0.26593798844623961 +1071 5 5.58919859 0.58919858932495117 0.34715497766251247 +1072 7 5.658098 1.3419017791748047 1.8007003849525063 +1074 6 4.78750324 1.2124967575073242 1.470148386965775 +1075 7 6.55795527 0.44204473495483398 0.19540354770128943 +1076 6 5.85578537 0.14421463012695313 0.020797859542653896 +1077 5 5.646455 0.64645481109619141 0.41790382278941252 +1079 6 5.67320061 0.32679939270019531 0.10679784306921647 +1080 7 5.97999525 1.0200047492980957 1.0404096885906711 +1082 6 5.49658728 0.50341272354125977 0.25342437022322883 +1083 6 6.262478 0.26247787475585938 0.0688946347363526 +1084 7 5.99038124 1.0096187591552734 1.019330038838234 +1085 5 4.72637224 0.27362775802612305 0.074872149962402545 +1086 8 6.815828 1.1841721534729004 1.4022636890606464 +1088 6 6.262478 0.26247787475585938 0.0688946347363526 +1090 6 5.95233536 0.047664642333984375 0.0022719181288266554 +1091 6 6.284743 0.28474283218383789 0.081078480480073267 +1092 6 6.023808 0.023808002471923828 0.00056682098170313111 +1094 5 5.72295761 0.72295761108398438 0.52266770742426161 +1095 8 6.37091827 1.6290817260742188 2.6539072702289559 +1098 6 5.96830368 0.031696319580078125 0.0010046566749224439 +1099 7 6.86467171 0.13532829284667969 0.018313746844796697 +1100 6 5.49658728 0.50341272354125977 0.25342437022322883 +1101 6 6.43475533 0.43475532531738281 0.18901219289182336 +1103 5 4.511087 0.48891305923461914 0.2390359794901542 +1112 6 5.26224566 0.73775434494018555 0.54428147347812228 +1119 5 4.98052025 0.019479751586914063 0.00037946072188788094 +1122 7 6.588348 0.4116520881652832 0.1694574416908381 +1125 6 4.712504 1.2874960899353027 1.6576461815986931 +1126 7 7.344084 0.34408378601074219 0.11839365179548622 +1129 7 6.40953732 0.59046268463134766 0.34864618194205832 +1130 6 5.62957954 0.37042045593261719 0.13721131417332799 +1133 5 5.253349 0.25334882736206055 0.064185628325731159 +1134 5 5.680931 0.68093109130859375 0.46366715111071244 +1135 6 5.65637636 0.34362363815307617 0.11807720469755623 +1136 8 6.62064457 1.3793554306030273 1.902621403934063 +1137 8 6.2427845 1.7572154998779297 3.0878063130112423 +1138 5 5.055894 0.055893898010253906 0.0031241278347806656 +1140 6 5.753335 0.24666500091552734 0.060843622676657105 +1141 5 4.90070629 0.099293708801269531 0.0098592406075113104 +1143 5 5.72487831 0.72487831115722656 0.52544856598615297 +1144 5 5.61719847 0.61719846725463867 0.38093394798147528 +1146 5 5.02811861 0.028118610382080078 0.00079065624981922156 +1147 5 5.056607 0.056606769561767578 0.0032043263602190564 +1148 6 6.078053 0.078052997589111328 0.0060922704326458188 +1151 5 5.05896759 0.05896759033203125 0.0034771767095662653 +1153 6 5.77633762 0.22366237640380859 0.050024858618598955 +1155 4 6.221552 2.2215518951416016 4.9352928228072415 +1158 6 5.825183 0.17481708526611328 0.030561013300939521 +1159 6 5.808246 0.19175386428833008 0.036769544469507309 +1164 6 5.17904854 0.82095146179199219 0.67396130261840881 +1165 5 6.273182 1.2731819152832031 1.6209921894042054 +1166 5 4.81632471 0.18367528915405273 0.033736611845824882 +1168 5 5.876407 0.87640714645385742 0.76808948635539309 +1169 6 6.071286 0.071286201477050781 0.005081722521026677 +1170 6 5.34411 0.65588998794555664 0.43019167628722244 +1174 6 5.6522193 0.34778070449829102 0.12095141842132762 +1175 5 5.39869833 0.39869832992553711 0.15896035828541244 +1177 6 5.67815351 0.32184648513793945 0.10358515999564588 +1181 6 5.36447144 0.635528564453125 0.40389655623584986 +1182 5 6.27437162 1.2743716239929199 1.6240230360383521 +1184 7 6.60242748 0.39757251739501953 0.15806390658781311 +1186 5 5.32623339 0.3262333869934082 0.10642822278919084 +1187 8 6.35104036 1.6489596366882324 2.7190678834269875 +1191 7 6.0864296 0.91357040405273438 0.83461088316107634 +1195 6 5.57003355 0.42996644973754883 0.1848711478999121 +1198 6 5.755423 0.24457693099975586 0.059817875177259339 +1199 7 5.731105 1.268895149230957 1.6100948997418527 +1200 6 6.085916 0.085916042327880859 0.0073815663292862155 +1201 7 5.94414234 1.0558576583862305 1.1148353947728538 +1202 5 5.404809 0.40480899810791016 0.16387032494913001 +1204 6 5.518382 0.48161792755126953 0.23195582813877991 +1206 6 5.445193 0.55480718612670898 0.30781101377783671 +1207 5 5.404809 0.40480899810791016 0.16387032494913001 +1208 6 6.66462374 0.66462373733520508 0.44172471222941567 +1210 6 4.54080772 1.4591922760009766 2.1292420983409102 +1212 6 6.115354 0.11535406112670898 0.013306559418424513 +1213 6 5.518382 0.48161792755126953 0.23195582813877991 +1214 6 4.642589 1.3574109077453613 1.8425643724660858 +1216 8 6.710257 1.2897429466247559 1.6634368683683078 +1218 8 6.31677532 1.6832246780395508 2.8332453167613494 +1220 6 5.611329 0.38867092132568359 0.15106508508415573 +1221 7 7.4408474 0.44084739685058594 0.19434642730993801 +1229 3 6.484815 3.4848151206970215 12.143936425438596 +1231 7 6.67793751 0.32206249237060547 0.10372424899196631 +1232 7 6.457521 0.54247903823852539 0.29428350692819549 +1233 6 6.70588541 0.70588541030883789 0.49827421248687642 +1234 6 6.234978 0.23497819900512695 0.055214754007693045 +1238 7 6.59822941 0.40177059173583984 0.1614196083837669 +1240 6 5.63298655 0.36701345443725586 0.13469887573796768 +1243 7 6.59822941 0.40177059173583984 0.1614196083837669 +1246 7 5.8469286 1.153071403503418 1.3295736615773421 +1248 7 5.684961 1.3150391578674316 1.7293279867246838 +1249 5 4.7347455 0.26525449752807617 0.070359948458872168 +1251 5 5.594396 0.59439611434936523 0.35330674075362367 +1253 7 6.62163353 0.37836647033691406 0.14316118587521487 +1254 5 5.51827049 0.51827049255371094 0.26860430345186614 +1255 6 5.69098949 0.30901050567626953 0.095487492618303804 +1257 6 5.76259565 0.23740434646606445 0.05636082372097917 +1259 6 5.48381853 0.51618146896362305 0.26644330890144374 +1260 6 5.49859047 0.50140953063964844 0.25141151741627255 +1261 6 5.657525 0.34247493743896484 0.11728908277382288 +1263 6 4.709868 1.2901320457458496 1.664440695460371 +1265 7 6.08131742 0.91868257522583008 0.84397767402356294 +1266 8 6.710818 1.289182186126709 1.6619907090264405 +1268 5 5.2311573 0.23115730285644531 0.05343369866386638 +1269 6 5.478538 0.52146196365356445 0.27192257953743137 +1274 6 5.478538 0.52146196365356445 0.27192257953743137 +1277 5 5.2311573 0.23115730285644531 0.05343369866386638 +1280 6 6.807374 0.80737400054931641 0.65185277676300757 +1281 7 6.404438 0.59556198120117188 0.354694073452265 +1282 5 4.99746656 0.0025334358215332031 6.4182970618276158E-06 +1285 6 6.807374 0.80737400054931641 0.65185277676300757 +1290 6 5.89834833 0.10165166854858398 0.010333061718711178 +1291 6 5.971956 0.028044223785400391 0.00078647848772561701 +1293 4 5.190955 1.1909551620483398 1.4183741980095874 +1296 6 6.45353 0.45352983474731445 0.20568931100592636 +1297 7 6.804424 0.19557619094848633 0.038250046465918786 +1300 6 5.398065 0.60193490982055664 0.36232563566068166 +1301 5 6.25851965 1.2585196495056152 1.5838717081917366 +1302 6 5.77307749 0.22692251205444336 0.051493826477098992 +1306 8 6.853728 1.1462721824645996 1.3139399162921563 +1308 6 5.370329 0.62967109680175781 0.39648569014752866 +1313 5 4.95963049 0.040369510650634766 0.0016296973901717138 +1314 6 5.40624571 0.59375429153442383 0.35254415871554556 +1320 6 5.42479229 0.57520771026611328 0.33086390994958492 +1323 5 6.09546757 1.0954675674438477 1.2000491913213409 +1324 6 5.879797 0.12020301818847656 0.014448765581619227 +1325 7 6.58349276 0.41650724411010742 0.17347828439619661 +1327 6 5.74115562 0.25884437561035156 0.067000410785112763 +1328 6 6.5878973 0.58789730072021484 0.34562323619411472 +1330 5 5.31433058 0.3143305778503418 0.098803712171729785 +1331 6 5.859345 0.1406550407409668 0.019783840485843029 +1334 6 5.78381538 0.21618461608886719 0.046735788233490894 +1336 8 5.991396 2.0086040496826172 4.0344902284014097 +1337 5 5.665654 0.66565418243408203 0.44309549059198616 +1338 5 5.665654 0.66565418243408203 0.44309549059198616 +1340 6 5.678114 0.32188606262207031 0.10361063731033937 +1341 5 4.881372 0.11862802505493164 0.014072608328433489 +1344 8 6.458304 1.5416960716247559 2.3768267772632043 +1345 8 7.06284952 0.93715047836303711 0.87825101909606929 +1346 7 6.51082373 0.48917627334594727 0.23929342640462892 +1348 8 5.991396 2.0086040496826172 4.0344902284014097 +1350 7 6.269445 0.73055505752563477 0.53371069207628352 +1354 5 6.408069 1.4080691337585449 1.9826586854435391 +1355 5 5.80267048 0.80267047882080078 0.6442798975704136 +1356 6 5.897979 0.10202121734619141 0.010408328788798826 +1361 7 6.297319 0.70268106460571289 0.49376067855541805 +1363 4 5.39580774 1.3958077430725098 1.9482792556211734 +1365 7 6.33742571 0.66257429122924805 0.43900469139794041 +1366 6 5.644856 0.35514402389526367 0.12612727770851961 +1367 5 5.3965373 0.39653730392456055 0.1572418334037593 +1370 6 5.53704166 0.46295833587646484 0.21433042075750564 +1372 6 4.98262644 1.0173735618591309 1.0350489643699348 +1373 6 4.98262644 1.0173735618591309 1.0350489643699348 +1375 7 6.539049 0.46095085144042969 0.21247568744365708 +1379 6 4.545688 1.4543118476867676 2.1150229503220999 +1380 7 6.878299 0.12170076370239258 0.014811075885745595 +1381 7 6.69022655 0.30977344512939453 0.095959587307334004 +1382 6 4.617643 1.382357120513916 1.9109112086355253 +1383 6 5.60604048 0.39395952224731445 0.15520410516933225 +1384 6 4.96960258 1.0303974151611328 1.0617188331707439 +1386 7 6.814375 0.18562507629394531 0.034456668949133018 +1388 7 6.14732 0.85268020629882813 0.72706353421381209 +1389 6 5.456267 0.54373311996459961 0.29564570574643767 +1393 6 5.9041357 0.095864295959472656 0.0091899632398053654 +1394 7 6.814375 0.18562507629394531 0.034456668949133018 +1395 7 6.31325054 0.68674945831298828 0.47162481849318283 +1398 7 6.0729084 0.92709159851074219 0.85949883202920319 +1400 7 6.0729084 0.92709159851074219 0.85949883202920319 +1403 8 6.553515 1.4464850425720215 2.0923189783845828 +1404 5 4.51477766 0.48522233963012695 0.23544071887613427 +1406 8 5.84692955 2.1530704498291016 4.6357123619272897 +1407 6 6.19066143 0.19066143035888672 0.03635178102649661 +1408 7 6.0729084 0.92709159851074219 0.85949883202920319 +1409 6 5.880574 0.11942577362060547 0.014262515404880105 +1411 6 6.30539227 0.30539226531982422 0.09326443571717391 +1413 6 5.36225033 0.63774967193603516 0.40672464405452047 +1416 6 5.817216 0.18278408050537109 0.033410020086193981 +1419 7 5.729145 1.2708549499511719 1.6150723038153956 +1420 4 5.15809631 1.1580963134765625 1.3411870712880045 +1421 6 6.552526 0.55252599716186523 0.30528497753971351 +1424 6 5.36225033 0.63774967193603516 0.40672464405452047 +1425 6 5.522351 0.47764921188354492 0.22814876961297159 +1426 6 6.43497562 0.43497562408447266 0.18920379354767647 +1427 5 6.09880924 1.0988092422485352 1.2073817508508 +1431 5 5.47524738 0.47524738311767578 0.2258600751601989 +1434 5 6.09880924 1.0988092422485352 1.2073817508508 +1436 5 4.29367065 0.706329345703125 0.49890114460140467 +1437 7 6.381414 0.61858606338500977 0.38264871781416332 +1438 5 5.76378441 0.76378440856933594 0.58336662277361029 +1439 5 5.28301859 0.28301858901977539 0.080099521730744527 +1440 5 5.32609844 0.32609844207763672 0.10634019392546179 +1442 5 5.15215874 0.15215873718261719 0.02315228130100877 +1443 6 6.60022068 0.60022068023681641 0.36026486498394661 +1447 6 5.92240143 0.07759857177734375 0.00602153834188357 +1456 6 6.18065453 0.18065452575683594 0.032636057676427299 +1457 6 6.200436 0.20043611526489258 0.040174636302481304 +1458 6 6.735425 0.73542499542236328 0.54084992389198305 +1459 6 6.14485168 0.1448516845703125 0.020982010522857308 +1460 6 6.245408 0.24540805816650391 0.060225115013054165 +1461 6 6.01023769 0.010237693786621094 0.00010481037406862015 +1462 6 5.92240143 0.07759857177734375 0.00602153834188357 +1463 6 5.547709 0.45229101181030273 0.20456715936438741 +1464 8 6.88174152 1.1182584762573242 1.2505020197213526 +1465 5 5.582034 0.58203411102294922 0.33876370639427478 +1470 7 6.841235 0.15876483917236328 0.025206274157426378 +1471 6 6.24523163 0.24523162841796875 0.060138551576528698 +1474 4 4.629509 0.62950897216796875 0.39628154603997245 +1478 6 5.93162775 0.068372249603271484 0.0046747645158120577 +1480 6 6.046388 0.046388149261474609 0.0021518603919048473 +1482 6 5.490122 0.50987815856933594 0.25997573658605688 +1484 3 4.92298555 1.9229855537414551 3.6978734398983306 +1485 6 5.54977131 0.45022869110107422 0.20270587429058651 +1486 6 5.915575 0.084424972534179688 0.0071275759873969946 +1488 6 5.247855 0.75214481353759766 0.56572182053150755 +1489 5 5.878215 0.87821483612060547 0.77126129838234192 +1492 5 5.32583046 0.32583045959472656 0.10616548839971074 +1494 8 6.80715847 1.1928415298461914 1.4228709153258023 +1495 7 6.69690275 0.30309724807739258 0.091867941792088459 +1498 6 5.70931149 0.29068851470947266 0.084499812583999301 +1502 5 5.34187937 0.34187936782836914 0.11688150214672532 +1503 7 6.465032 0.53496789932250977 0.28619065330553894 +1505 7 5.42042446 1.5795755386352539 2.4950588822548525 +1506 6 6.12831974 0.12831974029541016 0.016465955749481509 +1508 6 5.17407465 0.82592535018920898 0.68215268408516749 +1509 5 5.704465 0.70446491241455078 0.4962708128232407 +1510 5 5.57555246 0.57555246353149414 0.33126063827717189 +1511 6 5.37051249 0.62948751449584961 0.39625453090616247 +1514 7 6.654268 0.34573221206665039 0.11953076246049932 +1518 6 6.37047958 0.37047958374023438 0.13725512196833733 +1519 5 5.5685 0.56850004196166992 0.32319229771042046 +1521 5 5.34187937 0.34187936782836914 0.11688150214672532 +1522 5 6.161465 1.1614651679992676 1.3490013364755669 +1523 6 5.701397 0.29860305786132813 0.089163786164135672 +1524 6 5.57626057 0.42373943328857422 0.17955510732372204 +1525 5 5.21797943 0.21797943115234375 0.047515032405499369 +1528 6 6.10163975 0.10163974761962891 0.01033063829618186 +1529 6 5.57626057 0.42373943328857422 0.17955510732372204 +1531 7 5.82842255 1.1715774536132813 1.3725937298149802 +1534 6 5.86905527 0.13094472885131836 0.017146522013945287 +1535 6 6.004974 0.0049738883972167969 2.4739565787967877E-05 +1536 5 5.1332283 0.13322830200195313 0.017749780454323627 +1537 6 5.380709 0.61929082870483398 0.38352113051792003 +1539 6 6.15297651 0.15297651290893555 0.023401813501777724 +1541 4 4.89264536 0.89264535903930664 0.79681573701441266 +1544 5 5.1332283 0.13322830200195313 0.017749780454323627 +1545 6 6.029986 0.029985904693603516 0.00089915448029387335 +1546 6 5.563477 0.4365229606628418 0.19055229518585293 +1547 6 5.563477 0.4365229606628418 0.19055229518585293 +1548 6 7.126276 1.1262760162353516 1.2684976647469739 +1550 6 5.78761339 0.2123866081237793 0.045108071310323794 +1553 7 6.29732943 0.70267057418823242 0.49374593583002024 +1555 7 6.534805 0.4651951789855957 0.21640655455144042 +1556 6 5.79464149 0.20535850524902344 0.042172115678113187 +1557 6 5.78761339 0.2123866081237793 0.045108071310323794 +1558 4 5.60473728 1.6047372817993164 2.5751817435966586 +1563 6 6.508431 0.50843095779418945 0.25850203884351686 +1565 6 5.905046 0.094954013824462891 0.0090162647413762897 +1566 5 5.85104227 0.85104227066040039 0.7242729464508102 +1568 6 5.8718257 0.1281743049621582 0.016428652452532333 +1570 5 5.52583742 0.52583742141723633 0.27650499376272819 +1574 4 6.22960234 2.2296023368835449 4.9711265806365645 +1575 6 5.44509125 0.55490875244140625 0.30792372353607789 +1577 4 5.4131093 1.413109302520752 1.9968779008706861 +1579 4 5.4505353 1.4505352973937988 2.1040526489853164 +1582 7 6.07192755 0.92807245254516602 0.86131847717319943 +1583 5 5.42974424 0.42974424362182617 0.18468011492609548 +1584 6 5.56638336 0.43361663818359375 0.18802338890964165 +1586 5 5.02551937 0.025519371032714844 0.00065123829790536547 +1590 6 6.50889826 0.50889825820922852 0.25897743720838662 +1591 6 6.791677 0.79167699813842773 0.62675246938147211 +1593 6 5.138271 0.86172914505004883 0.74257711942868809 +1594 6 5.59737825 0.40262174606323242 0.16210427040300601 +1595 6 5.506587 0.49341297149658203 0.24345636044108687 +1601 6 5.445505 0.55449485778808594 0.30746454731342965 +1602 5 6.579205 1.5792050361633301 2.4938885462436247 +1604 5 5.067999 0.067998886108398438 0.004623848511982942 +1605 9 6.921087 2.0789132118225098 4.3218801422901834 +1606 6 6.41273069 0.41273069381713867 0.17034662561877667 +1608 5 5.352296 0.35229587554931641 0.12411238392905943 +1611 6 5.439003 0.56099700927734375 0.31471764441812411 +1612 7 5.95403051 1.0459694862365723 1.0940521661379989 +1614 5 5.99248362 0.99248361587524414 0.98502372778079916 +1615 6 6.17295 0.17294979095458984 0.029911630191236327 +1618 6 5.036212 0.96378803253173828 0.92888737165139901 +1620 7 5.95403051 1.0459694862365723 1.0940521661379989 +1622 6 5.21739149 0.7826085090637207 0.61247607845893981 +1624 7 5.79714 1.2028598785400391 1.4468718874013575 +1625 6 6.154775 0.15477514266967773 0.023955344788419097 +1627 5 4.874259 0.12574100494384766 0.015810800324288721 +1630 5 5.171584 0.17158412933349609 0.029441113439133915 +1631 6 5.820287 0.17971277236938477 0.032296680552690304 +1635 6 5.85868073 0.14131927490234375 0.019971137458924204 +1637 6 6.16494942 0.16494941711425781 0.027208310206333408 +1638 5 5.0219636 0.021963596343994141 0.00048239956436191278 +1640 5 5.314522 0.31452178955078125 0.098923956102225929 +1643 7 6.005394 0.99460601806640625 0.98924113117391244 +1645 7 6.072939 0.92706108093261719 0.8594422477799526 +1648 5 6.300005 1.3000049591064453 1.6900128937013505 +1649 4 5.1877737 1.1877737045288086 1.4108063731700895 +1650 7 6.635081 0.36491918563842773 0.13316601204701328 +1652 4 5.59403658 1.5940365791320801 2.5409526156111042 +1661 6 5.57137442 0.42862558364868164 0.18371989095817298 +1662 7 5.93672 1.0632801055908203 1.130564582945226 +1666 5 5.0802207 0.080220699310302734 0.0064353605978340056 +1670 6 5.47703 0.52297019958496094 0.27349782965393388 +1671 7 6.782234 0.21776580810546875 0.047421947179827839 +1672 5 5.58361244 0.58361244201660156 0.34060348247658112 +1675 5 5.515949 0.51594877243041992 0.26620313577245724 +1676 7 6.782234 0.21776580810546875 0.047421947179827839 +1678 6 5.84444141 0.15555858612060547 0.024198473715841828 +1682 7 6.28926134 0.7107386589050293 0.50514944126211958 +1683 7 6.28926134 0.7107386589050293 0.50514944126211958 +1686 5 6.27901173 1.2790117263793945 1.6358709962159992 +1687 7 6.0611124 0.93888759613037109 0.88150991816746682 +1689 6 6.20967627 0.20967626571655273 0.043964136404838428 +1691 7 6.28926134 0.7107386589050293 0.50514944126211958 +1692 6 6.29506445 0.29506444931030273 0.087063029246792212 +1693 5 5.413152 0.41315221786499023 0.17069475512676036 +1694 6 5.864325 0.13567495346069336 0.018407692996561309 +1695 6 6.37711525 0.37711524963378906 0.14221591150635504 +1696 6 5.542532 0.45746803283691406 0.20927700106767588 +1698 6 6.29506445 0.29506444931030273 0.087063029246792212 +1700 6 6.019749 0.019749164581298828 0.00039002950165922812 +1703 5 5.314096 0.31409597396850586 0.09865628086322431 +1705 6 6.80662727 0.80662727355957031 0.65064755845014588 +1708 4 5.587132 1.5871319770812988 2.5189879126739925 +1710 5 5.041333 0.041333198547363281 0.0017084333021557541 +1712 6 5.72083235 0.27916765213012695 0.077934577995847576 +1717 6 5.54116535 0.45883464813232422 0.21052923432671378 +1718 4 5.17026567 1.1702656745910645 1.3695217491260792 +1722 6 6.35374975 0.35374975204467773 0.12513888707167098 +1726 6 6.738525 0.7385249137878418 0.54541904828533916 +1727 6 5.399927 0.60007286071777344 0.36008743817001232 +1729 6 6.474758 0.47475814819335938 0.22539529927598778 +1730 6 5.602798 0.3972020149230957 0.15776944065896714 +1732 5 5.432952 0.43295192718505859 0.18744737125325628 +1733 6 5.758369 0.24163103103637695 0.058385555159702562 +1737 6 5.744494 0.25550603866577148 0.065283335794674713 +1738 5 5.71241426 0.71241426467895508 0.50753408451805626 +1741 6 6.7084403 0.70844030380249023 0.50188766405176466 +1742 6 5.48805237 0.5119476318359375 0.26209037774242461 +1745 5 5.133648 0.13364791870117188 0.017861766173155047 +1750 6 6.308025 0.30802488327026367 0.094879328713659561 +1751 7 6.39781 0.60219001770019531 0.36263281741776154 +1752 6 5.633576 0.3664240837097168 0.13426660912250554 +1757 5 5.08499527 0.084995269775390625 0.0072241958841914311 +1759 5 4.57264137 0.42735862731933594 0.18263539634426706 +1760 6 5.35816765 0.64183235168457031 0.41194876766894595 +1761 6 5.830978 0.1690220832824707 0.028568464637146462 +1762 7 6.204322 0.79567813873291016 0.63310370045746822 +1763 6 6.088181 0.088181018829345703 0.0077758920817814214 +1764 5 5.18299437 0.18299436569213867 0.033486937875068179 +1766 5 5.059079 0.059079170227050781 0.0034903483547168435 +1769 7 6.512047 0.48795318603515625 0.2380983117618598 +1770 6 5.67229652 0.32770347595214844 0.10738956815112033 +1771 6 5.850691 0.14930915832519531 0.022293224759778241 +1777 6 5.850691 0.14930915832519531 0.022293224759778241 +1778 8 7.38504457 0.61495542526245117 0.37817017505972217 +1780 5 5.904208 0.90420818328857422 0.81759243872602383 +1781 4 5.6435194 1.643519401550293 2.7011560232722331 +1782 6 6.042781 0.042780876159667969 0.0018302033649888472 +1786 7 6.63890934 0.36109066009521484 0.13038646480799798 +1787 7 6.88856936 0.11143064498901367 0.012416788642667598 +1790 5 5.07970238 0.079702377319335938 0.0063524689503537957 +1791 5 5.499499 0.49949884414672852 0.24949909530391778 +1792 6 5.63644028 0.36355972290039063 0.13217567211540882 +1793 5 5.090697 0.090696811676025391 0.0082259116481964156 +1796 5 6.436928 1.4369277954101563 2.0647614892222919 +1797 8 6.802576 1.1974239349365234 1.4338240799588675 +1798 6 5.83613729 0.16386270523071289 0.026850986165527502 +1799 6 5.91608953 0.083910465240478516 0.0070409661768735532 +1804 6 5.375231 0.62476921081542969 0.39033656678293482 +1806 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1807 6 5.644393 0.35560703277587891 0.12645636175966501 +1808 5 5.25200033 0.25200033187866211 0.063504167266955847 +1809 6 5.644393 0.35560703277587891 0.12645636175966501 +1811 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1813 6 6.00334644 0.0033464431762695313 1.1198681932000909E-05 +1815 6 5.752005 0.24799489974975586 0.061501470301891459 +1819 6 6.7389946 0.73899459838867188 0.54611301644763444 +1820 6 5.752005 0.24799489974975586 0.061501470301891459 +1822 7 6.971259 0.028740882873535156 0.00082603834835026646 +1833 7 6.58283949 0.4171605110168457 0.17402289195183585 +1834 6 5.627404 0.37259578704833984 0.13882762052617181 +1837 7 6.70057869 0.29942131042480469 0.089653121136507252 +1838 6 5.41108942 0.58891057968139648 0.34681567086067844 +1839 6 5.501237 0.49876308441162109 0.24876461437179387 +1840 5 6.12066841 1.1206684112548828 1.2558976879845432 +1842 6 6.20005941 0.20005941390991211 0.040023769093977535 +1846 5 5.35677 0.35677003860473633 0.12728486044602505 +1848 5 4.703982 0.29601812362670898 0.087626729515477564 +1849 6 5.983951 0.016048908233642578 0.00025756745549188054 +1850 7 5.676928 1.3230719566345215 1.7505194024327011 +1851 6 6.48563433 0.48563432693481445 0.23584069949743025 +1852 7 6.038734 0.96126604080200195 0.92403240119915608 +1853 5 5.17571163 0.17571163177490234 0.030874577540998871 +1855 6 6.008804 0.0088038444519042969 7.7507677133326069E-05 +1856 4 4.440154 0.44015407562255859 0.19373561028714903 +1857 5 5.032861 0.032861232757568359 0.0010798606183470838 +1860 6 5.77942848 0.22057151794433594 0.04865179452826851 +1864 6 6.325848 0.32584810256958008 0.10617698594819558 +1865 6 5.458929 0.54107093811035156 0.29275776006761589 +1869 7 6.116072 0.88392782211303711 0.78132839470549698 +1870 6 5.875573 0.12442684173583984 0.015482038944355736 +1872 5 4.96669054 0.033309459686279297 0.0011095201045918657 +1875 5 5.0912385 0.091238498687744141 0.0083244636427934893 +1880 5 5.175462 0.17546176910400391 0.03078683241710678 +1881 6 5.950545 0.049455165863037109 0.002445813430540511 +1882 5 5.175462 0.17546176910400391 0.03078683241710678 +1886 5 4.60353565 0.39646434783935547 0.15718397910768545 +1891 5 5.446395 0.44639492034912109 0.19926842491349817 +1893 5 5.2195406 0.21954059600830078 0.048198073295679933 +1895 6 5.80891371 0.1910862922668457 0.036513971092290376 +1896 6 5.608869 0.39113092422485352 0.1529833998849881 +1897 6 5.608869 0.39113092422485352 0.1529833998849881 +1898 6 5.20592976 0.79407024383544922 0.63054755214488978 +1904 6 5.80891371 0.1910862922668457 0.036513971092290376 +1907 7 6.76484728 0.2351527214050293 0.055296802384191324 +1908 7 6.8543663 0.14563369750976563 0.021209173850365914 +1909 5 5.87015438 0.87015438079833984 0.75716864642254222 +1910 5 5.54551744 0.5455174446105957 0.29758928237447435 +1911 6 5.793866 0.20613384246826172 0.042491161010730139 +1912 6 5.967311 0.032689094543457031 0.0010685769020710723 +1913 6 5.73380566 0.26619434356689453 0.070859428547009884 +1914 6 6.51671028 0.51671028137207031 0.26698951487560407 +1915 7 6.8543663 0.14563369750976563 0.021209173850365914 +1916 5 5.54551744 0.5455174446105957 0.29758928237447435 +1918 6 5.754359 0.24564123153686523 0.060339614630947835 +1920 7 5.34622431 1.653775691986084 2.7349740394040509 +1922 5 5.769138 0.76913785934448242 0.59157304667701283 +1923 5 4.63728237 0.36271762847900391 0.13156407800943271 +1925 6 5.87001657 0.12998342514038086 0.016895690811224995 +1926 6 5.80602169 0.19397830963134766 0.037627584607434983 +1927 5 5.79432964 0.79432964324951172 0.63095958214489656 +1929 5 5.39010525 0.39010524749755859 0.15218210412513145 +1930 6 5.574939 0.42506122589111328 0.18067704575605603 +1931 3 5.49573374 2.4957337379455566 6.2286868907197004 +1933 5 4.799954 0.20004606246948242 0.040018427109544064 +1938 5 5.91960573 0.91960573196411133 0.84567470226124897 +1940 5 4.84486437 0.1551356315612793 0.024067064179916997 +1941 5 5.34108162 0.34108161926269531 0.11633667099886225 +1943 5 5.51694345 0.51694345474243164 0.26723053540104047 +1944 5 5.21851873 0.21851873397827148 0.047750437099466581 +1946 6 4.722785 1.2772150039672852 1.6312781663591522 +1948 7 6.280798 0.71920204162597656 0.51725157667897292 +1949 5 5.261702 0.26170206069946289 0.068487968574345359 +1950 5 5.22447157 0.2244715690612793 0.050387485316832681 +1951 4 4.855174 0.85517406463623047 0.73132268082645169 +1952 7 6.520986 0.47901391983032227 0.22945433539121041 +1953 6 6.01531935 0.015319347381591797 0.00023468240419788344 +1955 5 5.68653727 0.68653726577758789 0.47133341730136635 +1959 5 5.41501045 0.41501045227050781 0.17223367549377144 +1960 5 5.41501045 0.41501045227050781 0.17223367549377144 +1966 6 5.78424644 0.21575355529785156 0.046549596623663092 +1969 7 6.70432138 0.29567861557006836 0.087425843705432271 +1970 6 5.3136754 0.6863245964050293 0.47104145163052635 +1972 5 5.7198534 0.71985340118408203 0.51818891919629095 +1974 5 5.129496 0.12949609756469727 0.016769239284485593 +1975 6 5.346977 0.65302276611328125 0.42643873306224123 +1977 6 5.750509 0.24949121475219727 0.062245866238527015 +1978 6 5.46808672 0.53191328048706055 0.28293173795850635 +1979 6 5.278212 0.72178792953491211 0.52097781522229525 +1980 8 7.46080828 0.53919172286987305 0.29072771401138198 +1982 8 7.46080828 0.53919172286987305 0.29072771401138198 +1984 8 7.46080828 0.53919172286987305 0.29072771401138198 +1985 6 6.078637 0.078637123107910156 0.0061837971306886175 +1986 6 5.89531374 0.10468626022338867 0.010959213079559049 +1989 7 6.54342365 0.45657634735107422 0.20846196096044878 +1990 4 5.04370642 1.0437064170837402 1.0893230850617783 +1992 5 5.810789 0.81078910827636719 0.65737897809958667 +1993 6 5.87721062 0.12278938293457031 0.015077232561452547 +1996 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +1997 6 6.140746 0.14074611663818359 0.019809469348729181 +1998 6 6.140746 0.14074611663818359 0.019809469348729181 +2001 5 4.93630362 0.063696384429931641 0.0040572293894456379 +2002 6 6.542301 0.54230117797851563 0.29409056763688568 +2003 6 5.87721062 0.12278938293457031 0.015077232561452547 +2004 6 5.55052233 0.4494776725769043 0.20203017814515078 +2005 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +2007 6 5.74052048 0.25947952270507813 0.067329622703255154 +2008 5 6.02844238 1.0284423828125 1.0576937347650528 +2011 5 6.02844238 1.0284423828125 1.0576937347650528 +2019 6 5.84197569 0.15802431106567383 0.024971682887780844 +2022 6 5.573394 0.42660617828369141 0.1819928313498167 +2024 5 4.792466 0.20753383636474609 0.043070293236269208 +2025 5 5.124267 0.1242671012878418 0.015442312462482732 +2027 5 5.156991 0.15699100494384766 0.024646175633279199 +2028 6 5.789144 0.21085596084594727 0.044460236224267646 +2029 6 5.573394 0.42660617828369141 0.1819928313498167 +2031 5 5.7133007 0.71330070495605469 0.50879789569080458 +2032 6 5.85084 0.14915990829467773 0.022248678242476672 +2034 5 5.98954344 0.98954343795776367 0.97919621560527048 +2035 5 5.27746 0.27746009826660156 0.076984106130112195 +2037 5 5.7133007 0.71330070495605469 0.50879789569080458 +2038 5 5.343353 0.3433527946472168 0.11789114159205383 +2039 5 5.00838852 0.008388519287109375 7.0367255830205977E-05 +2043 6 6.453859 0.45385885238647461 0.20598785788956775 +2048 5 5.30091667 0.30091667175292969 0.090550843338860432 +2050 3 5.17047644 2.1704764366149902 4.7109679619009057 +2051 5 5.27376 0.27375984191894531 0.074944451047485927 +2052 5 5.27376 0.27375984191894531 0.074944451047485927 +2057 7 6.840732 0.15926790237426758 0.025366264726699228 +2058 5 5.52679253 0.52679252624511719 0.27751036570771248 +2060 5 5.52702427 0.52702426910400391 0.27775458022460953 +2061 6 6.108241 0.10824108123779297 0.011716131667526497 +2062 5 6.280643 1.2806429862976074 1.6400464583532539 +2063 5 5.4906826 0.49068260192871094 0.2407694158355298 +2064 6 5.73145771 0.26854228973388672 0.07211496137551876 +2065 5 5.608661 0.60866117477416992 0.37046842567747262 +2066 5 5.57306 0.57306003570556641 0.32839780452286504 +2067 5 5.59425449 0.59425449371337891 0.35313840329854429 +2069 7 6.59054 0.40946006774902344 0.16765754708103486 +2070 6 5.66930771 0.33069229125976563 0.10935739149863366 +2071 6 5.56511641 0.43488359451293945 0.18912374077649474 +2073 5 5.19534159 0.19534158706665039 0.038158335637717755 +2074 6 5.73145771 0.26854228973388672 0.07211496137551876 +2076 5 5.3422966 0.34229660034179688 0.11716696260555182 +2078 6 6.25093269 0.25093269348144531 0.062967216657852987 +2079 4 5.891479 1.8914790153503418 3.5776928655106985 +2080 5 5.3422966 0.34229660034179688 0.11716696260555182 +2082 6 5.71104145 0.28895854949951172 0.083497043328861764 +2084 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2085 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2086 5 5.576943 0.57694292068481445 0.3328631337283241 +2087 6 6.12987661 0.12987661361694336 0.016867934764604797 +2089 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2090 5 5.118404 0.11840391159057617 0.014019486279948978 +2091 5 5.15253925 0.15253925323486328 0.023268223777449748 +2094 5 5.23734331 0.23734331130981445 0.056331847423507497 +2096 5 5.091876 0.091876029968261719 0.0084412048827289254 +2097 5 5.54533148 0.54533147811889648 0.29738642102734048 +2099 5 5.692176 0.69217586517333984 0.47910742832846154 +2102 5 5.36260748 0.36260747909545898 0.13148418389596372 +2103 5 5.19033051 0.19033050537109375 0.036225701274815947 +2104 5 5.692176 0.69217586517333984 0.47910742832846154 +2106 5 5.2858057 0.28580570220947266 0.081684899415449763 +2110 5 5.56804276 0.56804275512695313 0.32267257165221963 +2111 5 5.56804276 0.56804275512695313 0.32267257165221963 +2112 5 5.56804276 0.56804275512695313 0.32267257165221963 +2113 5 5.44544268 0.44544267654418945 0.19841917808685139 +2114 6 5.8123064 0.18769359588623047 0.035228885936703591 +2115 5 5.56804276 0.56804275512695313 0.32267257165221963 +2116 4 6.282538 2.2825379371643066 5.2099794345942883 +2118 6 6.26503849 0.26503849029541016 0.070245401338070224 +2120 5 5.75094 0.75093984603881836 0.56391065236880422 +2121 7 6.83608341 0.16391658782958984 0.026868647765695641 +2122 5 5.36746025 0.36746025085449219 0.13502703595804633 +2123 5 5.75094 0.75093984603881836 0.56391065236880422 +2124 7 6.83608341 0.16391658782958984 0.026868647765695641 +2125 5 5.64372635 0.64372634887695313 0.41438361223845277 +2128 6 4.90525 1.094749927520752 1.1984774038066917 +2129 5 5.9750185 0.97501850128173828 0.95066107784168707 +2131 6 5.445048 0.55495214462280273 0.30797188282144816 +2132 6 5.445048 0.55495214462280273 0.30797188282144816 +2134 6 6.177456 0.17745590209960938 0.031490597189986147 +2136 6 5.946258 0.053741931915283203 0.0028881952459869353 +2137 5 5.778809 0.7788090705871582 0.60654356842883317 +2139 5 5.538669 0.53866910934448242 0.29016440936197796 +2142 5 5.330624 0.33062410354614258 0.10931229784569041 +2143 7 6.23745155 0.76254844665527344 0.5814801334963704 +2146 6 5.73914528 0.26085472106933594 0.068045185504161054 +2147 5 5.35492229 0.35492229461669922 0.12596983521598304 +2148 5 5.538669 0.53866910934448242 0.29016440936197796 +2150 6 6.503435 0.50343513488769531 0.25344693503939197 +2152 6 5.99008369 0.0099163055419921875 9.8333115602144971E-05 +2157 6 6.22612 0.2261199951171875 0.051130252191796899 +2158 6 5.796968 0.20303201675415039 0.041221999827257605 +2161 7 6.53926039 0.4607396125793457 0.21228099059976557 +2162 6 4.85092163 1.149078369140625 1.3203810984268785 +2166 5 5.25865555 0.25865554809570313 0.066902692560688592 +2167 7 6.79769468 0.20230531692504883 0.040927441256144448 +2168 7 6.79769468 0.20230531692504883 0.040927441256144448 +2171 7 6.79769468 0.20230531692504883 0.040927441256144448 +2172 5 4.813034 0.1869659423828125 0.034956263611093163 +2173 5 5.442636 0.44263601303100586 0.19592664003198479 +2174 7 6.79769468 0.20230531692504883 0.040927441256144448 +2176 5 4.813034 0.1869659423828125 0.034956263611093163 +2179 6 5.76867342 0.23132658004760742 0.053511986636522124 +2182 5 5.577924 0.57792377471923828 0.33399588938573288 +2184 6 5.91915846 0.080841541290283203 0.006535354798188564 +2186 5 4.922956 0.077044010162353516 0.0059357795018968318 +2189 6 6.28398132 0.2839813232421875 0.080645391950383782 +2192 6 5.59625 0.40374994277954102 0.16301401629448264 +2197 6 6.48611832 0.48611831665039063 0.23631101778300945 +2198 5 4.96211147 0.037888526916503906 0.001435540471902641 +2201 6 5.58790541 0.4120945930480957 0.16982195361947561 +2202 5 4.96211147 0.037888526916503906 0.001435540471902641 +2203 5 5.48719835 0.4871983528137207 0.23736223498440268 +2204 5 5.430422 0.43042182922363281 0.18526295107221813 +2205 5 5.39430428 0.39430427551269531 0.15547586168759153 +2206 6 5.69371843 0.30628156661987305 0.093808398051123731 +2209 6 6.150735 0.15073490142822266 0.022721010508576001 +2210 7 5.605151 1.3948488235473633 1.9456032405514634 +2211 6 5.680932 0.31906795501708984 0.10180435991878767 +2215 6 5.54389143 0.45610857009887695 0.20803502771764215 +2216 5 5.73479843 0.73479843139648438 0.53992873478273395 +2219 7 6.477956 0.52204418182373047 0.27253012777600816 +2222 7 6.15957642 0.840423583984375 0.70631180051714182 +2224 7 6.15957642 0.840423583984375 0.70631180051714182 +2226 5 5.15487766 0.15487766265869141 0.023987090390619414 +2227 5 5.184053 0.18405294418334961 0.033875486262559207 +2232 6 5.49912739 0.50087261199951172 0.25087337345121341 +2233 5 5.451901 0.45190095901489258 0.20421447675857962 +2235 6 5.78070831 0.21929168701171875 0.048088843992445618 +2238 6 5.69238758 0.30761241912841797 0.094625400402037485 +2239 6 5.78070831 0.21929168701171875 0.048088843992445618 +2240 5 5.031944 0.031943798065185547 0.0010204062348293519 +2241 5 5.031944 0.031943798065185547 0.0010204062348293519 +2245 7 5.60611153 1.3938884735107422 1.942925076586107 +2247 6 5.69238758 0.30761241912841797 0.094625400402037485 +2252 5 5.115737 0.11573696136474609 0.01339504422594473 +2253 5 5.045958 0.045958042144775391 0.002112141637780951 +2254 6 5.71639729 0.28360271453857422 0.080430499693648017 +2255 6 5.658473 0.34152698516845703 0.11664068159825547 +2258 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2259 6 5.492666 0.50733423233032227 0.25738802329419741 +2260 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2266 5 5.407028 0.4070281982421875 0.16567195416428149 +2267 6 6.3755393 0.37553930282592773 0.14102976796698385 +2270 7 6.147446 0.8525538444519043 0.72684805768972183 +2271 6 5.66193 0.33806991577148438 0.11429126794973854 +2272 6 6.210824 0.21082401275634766 0.044446764354688639 +2273 5 5.395995 0.39599514007568359 0.15681215096356027 +2274 7 6.147446 0.8525538444519043 0.72684805768972183 +2275 4 5.2996974 1.2996973991394043 1.689213329329732 +2276 6 4.88525772 1.1147422790527344 1.2426503487076843 +2278 6 4.88525772 1.1147422790527344 1.2426503487076843 +2280 6 5.89824867 0.10175132751464844 0.010353332650993252 +2282 5 5.15755272 0.15755271911621094 0.024822859300911659 +2283 5 5.15755272 0.15755271911621094 0.024822859300911659 +2284 5 5.15755272 0.15755271911621094 0.024822859300911659 +2285 5 5.15755272 0.15755271911621094 0.024822859300911659 +2287 5 5.05347538 0.053475379943847656 0.0028596162601388642 +2289 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2290 7 5.835172 1.164827823638916 1.3568238587233736 +2291 6 5.959846 0.040153980255126953 0.0016123421303291252 +2292 6 5.248393 0.75160694122314453 0.56491299409481144 +2293 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2295 6 5.12605143 0.87394857406616211 0.76378611011227804 +2296 7 6.03202057 0.96797943115234375 0.93698417913401499 +2297 6 5.631292 0.36870813369750977 0.13594568785470074 +2298 8 6.72130346 1.2786965370178223 1.6350648337813709 +2299 7 7.42436934 0.42436933517456055 0.18008933263649851 +2300 7 6.75962543 0.24037456512451172 0.057779931558798125 +2304 6 4.80764866 1.1923513412475586 1.4217017209748519 +2306 5 5.49572039 0.49572038650512695 0.24573870159679245 +2310 5 5.3208 0.32079982757568359 0.10291252937258832 +2311 7 6.820328 0.1796717643737793 0.032281942913186867 +2314 6 6.682396 0.68239593505859375 0.4656642121844925 +2315 6 6.07943535 0.079435348510742188 0.0063099745930230711 +2317 5 5.659352 0.65935182571411133 0.43474483007253184 +2318 4 5.559793 1.5597929954528809 2.4329541886638708 +2319 7 6.76099253 0.23900747299194336 0.057124572145994534 +2321 5 5.34529972 0.34529972076416016 0.11923189715980698 +2324 5 5.15271664 0.15271663665771484 0.023322371112044493 +2327 6 5.214839 0.78516101837158203 0.61647782477029978 +2328 5 5.454279 0.45427894592285156 0.20636936070877709 +2329 5 5.28656 0.28656005859375 0.082116667181253433 +2331 5 5.65846634 0.65846633911132813 0.43357791974267457 +2332 6 5.549059 0.45094108581542969 0.20334786287639872 +2333 8 7.05028725 0.94971275329589844 0.90195431377287605 +2334 5 5.55771875 0.55771875381469727 0.3110502083566189 +2335 5 5.80538654 0.80538654327392578 0.64864748408672313 +2336 5 4.931768 0.068232059478759766 0.0046556139407130104 +2337 4 5.43987751 1.4398775100708008 2.073247244007689 +2338 5 5.62999249 0.62999248504638672 0.39689053121492179 +2339 6 5.726933 0.27306699752807617 0.074565585138998358 +2340 6 5.72369 0.27630996704101563 0.076347197886207141 +2342 8 6.948141 1.0518589019775391 1.1064071496693941 +2344 6 5.726933 0.27306699752807617 0.074565585138998358 +2345 6 5.7398963 0.26010370254516602 0.067653936077704202 +2347 6 6.165467 0.1654667854309082 0.027379257080838215 +2349 5 5.23369 0.23368978500366211 0.05461091561505782 +2350 5 5.568386 0.56838607788085938 0.32306273352878634 +2351 6 5.85764074 0.14235925674438477 0.020266157980813659 +2355 7 6.288256 0.71174383163452148 0.50657928186979007 +2358 5 5.388339 0.38833904266357422 0.15080721205686132 +2359 5 5.16930962 0.16930961608886719 0.028665746100159595 +2365 5 5.35451746 0.35451745986938477 0.12568262935224084 +2366 5 5.35875034 0.35875034332275391 0.1287018088341938 +2367 6 5.4548583 0.54514169692993164 0.29717946973164544 +2370 7 6.466535 0.53346490859985352 0.28458480870745007 +2374 6 6.31197357 0.31197357177734375 0.097327509487513453 +2375 6 6.86937952 0.86937952041625977 0.75582075051920583 +2376 6 6.31197357 0.31197357177734375 0.097327509487513453 +2379 4 5.02809525 1.0280952453613281 1.0569798335345695 +2380 4 4.7932725 0.79327249526977539 0.62928125175153582 +2381 6 6.17565966 0.1756596565246582 0.030856314930360895 +2383 6 6.298069 0.29806900024414063 0.088845128906541504 +2386 4 5.639759 1.6397590637207031 2.6888097870541969 +2387 4 5.656129 1.6561288833618164 2.7427628783052569 +2389 8 6.87059641 1.1294035911560059 1.2755524717160824 +2391 6 5.81390524 0.18609476089477539 0.034631260032483624 +2392 7 5.867315 1.1326851844787598 1.282975727137682 +2393 6 5.867315 0.13268518447875977 0.017605358180162511 +2396 5 4.986103 0.013896942138671875 0.00019312500080559403 +2401 4 5.2634654 1.263465404510498 1.5963448283948765 +2403 6 5.8889246 0.11107540130615234 0.01233774477532279 +2406 6 6.67324924 0.67324924468994141 0.4532645454755766 +2415 5 5.575652 0.57565212249755859 0.3313753661359442 +2419 5 5.29736567 0.29736566543579102 0.088426338980070796 +2420 7 6.390013 0.60998678207397461 0.37208387430496259 +2422 5 4.129732 0.87026786804199219 0.75736616214635433 +2423 6 5.695272 0.30472803115844727 0.092859172973703608 +2424 5 4.129732 0.87026786804199219 0.75736616214635433 +2426 6 6.139751 0.13975095748901367 0.019530330119096107 +2427 6 5.70700836 0.29299163818359375 0.085844100045505911 +2428 6 6.139751 0.13975095748901367 0.019530330119096107 +2429 6 5.70700836 0.29299163818359375 0.085844100045505911 +2430 5 5.071437 0.071436882019042969 0.0051032281126026646 +2431 5 5.05151 0.051509857177734375 0.0026532653864705935 +2433 6 5.243469 0.75653076171875 0.57233879342675209 +2435 4 5.316507 1.3165068626403809 1.7331903193792186 +2436 5 5.155265 0.15526485443115234 0.024107175021526928 +2437 6 5.73321342 0.26678657531738281 0.071175076769577572 +2439 6 6.48072529 0.48072528839111328 0.23109680289871903 +2440 5 5.442191 0.44219112396240234 0.19553299011113268 +2441 6 6.501268 0.50126791000366211 0.2512695175994395 +2443 5 5.342942 0.34294223785400391 0.11760937850431219 +2444 5 5.51007938 0.51007938385009766 0.26018097782889527 +2450 5 4.93648863 0.063511371612548828 0.0040336943241072731 +2452 7 6.282725 0.71727514266967773 0.51448363029180655 +2453 6 6.289039 0.28903913497924805 0.083543621549551972 +2455 6 5.800432 0.19956779479980469 0.039827304721256951 +2456 6 5.58649731 0.41350269317626953 0.1709844772640281 +2459 5 5.312827 0.31282711029052734 0.097860800932721759 +2461 5 4.82629 0.17370986938476563 0.030175118721672334 +2464 5 5.128059 0.12805891036987305 0.016399084525119179 +2465 5 5.15147066 0.15147066116333008 0.022943361193256351 +2466 5 5.25195169 0.25195169448852539 0.063479656355639236 +2467 6 5.73090935 0.26909065246582031 0.072409779244480887 +2470 5 5.555554 0.55555391311645508 0.30864015037900572 +2472 6 5.55089235 0.44910764694213867 0.20169767854190468 +2475 5 4.549733 0.45026683807373047 0.20274022546891501 +2477 7 6.442016 0.5579838752746582 0.31134600506652532 +2478 6 5.4986105 0.50138950347900391 0.25139143419892207 +2483 6 5.4986105 0.50138950347900391 0.25139143419892207 +2486 5 5.90252447 0.90252447128295898 0.81455042126458466 +2488 6 6.14779329 0.14779329299926758 0.021842857455567355 +2495 5 5.80160046 0.80160045623779297 0.64256329144063784 +2496 5 5.507049 0.5070490837097168 0.25709877329086339 +2499 6 6.47504044 0.47504043579101563 0.22566341563651804 +2502 4 5.087182 1.0871820449829102 1.1819647989332225 +2503 4 5.087182 1.0871820449829102 1.1819647989332225 +2504 6 5.14028358 0.85971641540527344 0.73911231491729268 +2505 6 4.786265 1.2137351036071777 1.4731529017283265 +2511 6 5.52970362 0.47029638290405273 0.22117868777263539 +2512 6 5.368275 0.63172483444213867 0.39907626645094751 +2513 5 5.0458374 0.04583740234375 0.002101067453622818 +2514 7 7.08240938 0.082409381866455078 0.0067913062196112151 +2517 6 5.202719 0.79728078842163086 0.63565665558621731 +2518 7 6.73800659 0.261993408203125 0.068640545941889286 +2519 5 5.57040739 0.57040739059448242 0.32536459124480643 +2522 8 5.97161341 2.0283865928649902 4.1143521701144437 +2523 5 6.07080841 1.0708084106445313 1.1466306523070671 +2525 8 5.97161341 2.0283865928649902 4.1143521701144437 +2526 7 6.761754 0.23824596405029297 0.05676113938625349 +2531 4 4.59851 0.59850978851318359 0.35821396694609575 +2532 4 4.59851 0.59850978851318359 0.35821396694609575 +2534 7 5.81611061 1.1838893890380859 1.4015940854769724 +2536 6 5.57678366 0.42321634292602539 0.17911207291967912 +2537 6 5.19452047 0.80547952651977539 0.64879726764252155 +2538 6 5.19452047 0.80547952651977539 0.64879726764252155 +2541 6 5.609927 0.39007282257080078 0.15215680690835143 +2545 6 5.838851 0.16114902496337891 0.025969008246647718 +2546 5 5.32331467 0.32331466674804688 0.10453237373440061 +2547 5 4.96645546 0.033544540405273438 0.0011252361910010222 +2548 6 5.4387145 0.56128549575805664 0.31504140774836742 +2551 6 5.4387145 0.56128549575805664 0.31504140774836742 +2552 5 5.353321 0.35332107543945313 0.12483578234969173 +2554 7 6.789461 0.21053886413574219 0.044326613311568508 +2555 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2556 5 5.757903 0.75790309906005859 0.57441710756484099 +2557 7 6.789461 0.21053886413574219 0.044326613311568508 +2558 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2560 6 5.797521 0.20247888565063477 0.040997699134322829 +2562 6 5.797521 0.20247888565063477 0.040997699134322829 +2563 5 5.38012266 0.38012266159057617 0.14449323785470369 +2564 6 5.353371 0.64662885665893555 0.41812887826404221 +2566 7 6.133521 0.86647891998291016 0.75078571877475042 +2567 5 6.320251 1.3202509880065918 1.7430626713323818 +2568 6 5.507352 0.49264812469482422 0.24270217476532707 +2569 6 6.26709557 0.26709556579589844 0.071340041267831111 +2571 6 6.63272762 0.63272762298583984 0.40034424488931108 +2574 5 5.683056 0.68305587768554688 0.46656533204077277 +2575 6 5.839933 0.16006708145141602 0.025621470564374249 +2579 6 5.78327656 0.21672344207763672 0.046969050345978758 +2581 7 6.762539 0.23746109008789063 0.056387769305729307 +2583 7 6.762539 0.23746109008789063 0.056387769305729307 +2584 7 6.762539 0.23746109008789063 0.056387769305729307 +2586 7 6.762539 0.23746109008789063 0.056387769305729307 +2592 5 5.72321844 0.72321844100952148 0.52304491341624271 +2593 5 5.95471859 0.95471858978271484 0.91148758567669574 +2595 5 4.99312162 0.0068783760070800781 4.7312056494774879E-05 +2596 5 5.190575 0.19057512283325195 0.03631887744290907 +2599 6 5.51631451 0.48368549346923828 0.23395165659258055 +2600 7 7.0145216 0.014521598815917969 0.00021087683217047015 +2602 6 6.44506168 0.44506168365478516 0.19807990225763206 +2607 6 5.741097 0.25890302658081055 0.067030777172703893 +2609 6 5.34973574 0.65026426315307617 0.4228436119340131 +2610 5 5.306729 0.30672883987426758 0.09408258121061408 +2611 5 5.490591 0.49059104919433594 0.24067957754959934 +2612 7 6.794416 0.20558404922485352 0.042264801295686993 +2617 7 6.7212 0.27880001068115234 0.077729445955810661 +2618 7 6.34141541 0.6585845947265625 0.43373366841115057 +2619 6 5.4213624 0.57863759994506836 0.33482147207018897 +2621 5 5.406546 0.40654611587524414 0.16527974433324744 +2623 7 6.7212 0.27880001068115234 0.077729445955810661 +2626 7 6.210718 0.78928184509277344 0.6229658309930528 +2628 6 6.039976 0.039976119995117188 0.0015980901698640082 +2633 5 5.61942339 0.61942338943481445 0.38368533537891381 +2635 6 6.508563 0.50856304168701172 0.25863636736994522 +2638 6 6.643812 0.64381217956542969 0.41449412255678908 +2639 6 5.83244467 0.16755533218383789 0.028074789343236262 +2641 5 5.974963 0.97496318817138672 0.95055321828931483 +2644 6 5.97672844 0.023271560668945313 0.0005415655359684024 +2648 6 5.681986 0.31801414489746094 0.10113299635486328 +2650 5 5.43078232 0.43078231811523438 0.18557340560073499 +2652 7 6.80547237 0.19452762603759766 0.037840997291823442 +2653 5 5.53509569 0.5350956916809082 0.28632739925546957 +2654 5 4.69185925 0.30814075469970703 0.094950724706905021 +2658 7 6.433773 0.56622695922851563 0.3206129693571711 +2660 6 5.36555243 0.63444757461547852 0.40252372493546318 +2661 6 5.99006748 0.0099325180053710938 9.8654913927020971E-05 +2664 7 6.39382029 0.60617971420288086 0.36745384591108632 +2665 5 5.5541 0.55410003662109375 0.30702685058349743 +2666 7 7.24123526 0.24123525619506836 0.058194448831500267 +2668 6 6.05001354 0.050013542175292969 0.0025013544009198085 +2669 5 5.359341 0.35934114456176758 0.12912605817496114 +2670 7 7.24123526 0.24123525619506836 0.058194448831500267 +2674 7 5.814148 1.18585205078125 1.4062450863420963 +2679 6 5.801769 0.19823122024536133 0.039295616679964951 +2680 6 6.4041853 0.40418529510498047 0.16336575277910015 +2681 6 6.436047 0.43604707717895508 0.19013705351630961 +2683 5 5.13188839 0.13188838958740234 0.017394547307958419 +2694 6 6.096805 0.096805095672607422 0.0093712265481826762 +2697 5 5.839328 0.83932781219482422 0.70447117632375011 +2698 6 5.567016 0.4329838752746582 0.18747503624786077 +2699 6 5.349456 0.65054416656494141 0.42320771265167423 +2700 7 6.18181944 0.81818056106567383 0.66941943050574082 +2703 5 5.502043 0.50204277038574219 0.25204694329659105 +2706 6 5.34128857 0.65871143341064453 0.43390075250590598 +2707 5 5.502043 0.50204277038574219 0.25204694329659105 +2709 5 6.00174236 1.0017423629760742 1.0034877617808888 +2710 5 6.00174236 1.0017423629760742 1.0034877617808888 +2711 5 5.634198 0.63419818878173828 0.40220734265403735 +2712 5 5.598766 0.59876585006713867 0.35852054320662319 +2716 5 6.00174236 1.0017423629760742 1.0034877617808888 +2717 6 6.102189 0.10218906402587891 0.010442604806485178 +2718 6 5.481989 0.51801109313964844 0.26833549261573353 +2721 5 5.2267313 0.22673130035400391 0.051407082560217532 +2722 7 6.82906866 0.17093133926391602 0.029217522742555957 +2723 6 6.35023165 0.35023164749145508 0.12266220690457885 +2724 6 6.0606904 0.060690402984619141 0.0036833250144354679 +2727 6 6.046403 0.046402931213378906 0.0021532320251935744 +2728 6 5.72376347 0.27623653411865234 0.07630662278188538 +2729 7 6.391809 0.60819101333618164 0.36989630870289147 +2730 5 4.92892742 0.071072578430175781 0.0050513114047134877 +2731 5 4.87044954 0.12955045700073242 0.01678332090909862 +2732 5 5.122189 0.12218904495239258 0.014930162706377814 +2733 7 6.391809 0.60819101333618164 0.36989630870289147 +2739 7 6.561662 0.43833780288696289 0.19214002943976993 +2740 6 5.54297924 0.45702075958251953 0.20886797468938312 +2743 6 5.184127 0.81587314605712891 0.6656489904571572 +2744 6 5.184127 0.81587314605712891 0.6656489904571572 +2745 7 6.623061 0.37693881988525391 0.14208287393648789 +2749 6 5.746345 0.25365495681762695 0.064340837118152194 +2752 6 6.251609 0.25160884857177734 0.063307012679615582 +2753 8 6.050957 1.949042797088623 3.7987678248830434 +2754 5 4.81832361 0.18167638778686523 0.033006309879283435 +2755 5 4.869156 0.1308441162109375 0.017120182747021317 +2756 6 4.98410654 1.0158934593200684 1.0320395206892954 +2757 5 6.02096272 1.0209627151489258 1.0423648657242666 +2758 6 5.85482025 0.14517974853515625 0.021077159384731203 +2759 6 5.76916265 0.23083734512329102 0.053285879903569366 +2760 6 5.790269 0.20973110198974609 0.043987135141833278 +2761 5 5.21827745 0.2182774543762207 0.047645047088963111 +2762 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2764 6 6.01250744 0.012507438659667969 0.00015643602182535687 +2768 6 5.40108156 0.59891843795776367 0.35870329532576761 +2769 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2770 7 5.56935453 1.4306454658508301 2.0467464489595386 +2771 6 5.949611 0.050388813018798828 0.0025390324774434703 +2773 7 6.69609451 0.30390548706054688 0.092358545065508224 +2776 8 6.39705944 1.602940559387207 2.5694184369285722 +2778 7 6.69609451 0.30390548706054688 0.092358545065508224 +2779 5 6.23984575 1.2398457527160645 1.5372174905280644 +2780 5 4.92480946 0.075190544128417969 0.0056536179263275699 +2781 6 4.922699 1.077301025390625 1.1605774993076921 +2782 6 5.967141 0.032858848571777344 0.001079703929462994 +2784 6 5.967141 0.032858848571777344 0.001079703929462994 +2787 5 5.24805164 0.24805164337158203 0.061529617779342516 +2789 5 5.13498068 0.13498067855834961 0.018219783584072502 +2792 5 5.36231041 0.36231040954589844 0.13126883286531665 +2793 7 7.17724466 0.17724466323852539 0.031415670646538274 +2795 8 6.13639641 1.8636035919189453 3.4730183478131949 +2797 5 5.25386858 0.25386857986450195 0.064449255842419007 +2800 5 5.43601561 0.43601560592651367 0.19010960861146486 +2804 8 6.13639641 1.8636035919189453 3.4730183478131949 +2808 6 5.34821272 0.65178728103637695 0.42482665972079303 +2809 7 6.775078 0.22492218017578125 0.050589987135026604 +2810 7 6.34518576 0.65481424331665039 0.42878169325035742 +2811 5 5.64365244 0.64365243911743164 0.41428846238181904 +2813 7 6.775078 0.22492218017578125 0.050589987135026604 +2814 7 6.75550842 0.2444915771484375 0.059776131296530366 +2818 4 6.14127731 2.1412773132324219 4.5850685321638593 +2823 6 6.314358 0.31435823440551758 0.098821099538554336 +2830 5 5.750116 0.75011587142944336 0.5626738205703532 +2831 5 5.03467941 0.034679412841796875 0.001202661675051786 +2833 7 6.039263 0.96073722839355469 0.92301602202132926 +2836 6 5.626615 0.37338495254516602 0.13941632278715588 +2837 6 5.79493475 0.20506525039672852 0.042051756920272965 +2839 7 5.811762 1.1882381439208984 1.4119098866685817 +2840 6 6.206232 0.20623207092285156 0.042531667077128077 +2842 6 5.49120951 0.50879049301147461 0.25886776577885939 +2844 5 5.98960352 0.98960351943969727 0.97931512568743528 +2846 7 7.02146339 0.021463394165039063 0.00046067728908383287 +2847 5 6.279372 1.2793722152709961 1.636793265207416 +2848 5 4.989665 0.010334968566894531 0.000106811575278698 +2850 5 5.96404171 0.96404170989990234 0.92937641842672747 +2852 5 6.11551476 1.1155147552490234 1.2443731691782887 +2854 6 6.2158227 0.21582269668579102 0.046579436404726948 +2856 7 6.999945 5.4836273193359375E-05 3.007016857736744E-09 +2860 6 5.620766 0.37923383712768555 0.14381830322258793 +2861 6 6.2158227 0.21582269668579102 0.046579436404726948 +2863 6 6.51361275 0.51361274719238281 0.26379805407850654 +2865 6 6.3260293 0.32602930068969727 0.10629510490821303 +2868 5 5.85081 0.85081005096435547 0.72387774282196915 +2869 6 6.71658325 0.716583251953125 0.51349155697971582 +2870 7 6.785292 0.21470785140991211 0.046099461457060897 +2871 6 6.188884 0.18888378143310547 0.035677082888469158 +2872 7 7.21496725 0.21496725082397461 0.046210918926817612 +2873 8 6.90970373 1.0902962684631348 1.188745953024636 +2879 6 6.59125471 0.59125471115112305 0.34958213345839795 +2881 7 6.59642029 0.4035797119140625 0.16287658386863768 +2890 8 6.60879755 1.391202449798584 1.9354442563255816 +2891 6 5.983416 0.016583919525146484 0.0002750263868165348 +2893 7 8.001547 1.0015468597412109 1.0030961122574809 +2895 5 5.61847734 0.61847734451293945 0.3825142256757772 +2896 5 5.420413 0.42041301727294922 0.1767471050925451 +2898 5 5.98123741 0.98123741149902344 0.96282685772530385 +2902 5 5.24436 0.24435997009277344 0.059711794983741129 +2903 6 6.211409 0.21140909194946289 0.044693804158896455 +2904 7 5.93855953 1.0614404678344727 1.1266558667566642 +2905 5 5.624597 0.62459707260131836 0.39012150310213656 +2906 5 5.20248127 0.20248126983642578 0.040998664634571469 +2910 5 5.051263 0.051262855529785156 0.0026278803570676246 +2911 5 5.24436 0.24435997009277344 0.059711794983741129 +2913 5 5.6902194 0.69021940231323242 0.47640282332963579 +2919 5 6.3524003 1.3524003028869629 1.828986579248749 +2920 4 5.501398 1.5013980865478516 2.25419621428955 +2923 6 6.342757 0.34275722503662109 0.11748251531480491 +2924 6 6.131525 0.13152503967285156 0.017298836060945177 +2927 7 6.7712183 0.22878170013427734 0.052341066316330398 +2929 6 6.131525 0.13152503967285156 0.017298836060945177 +2933 6 6.342757 0.34275722503662109 0.11748251531480491 +2934 5 5.17446136 0.17446136474609375 0.030436767789069563 +2937 5 5.629732 0.62973213195800781 0.39656255802037776 +2940 6 5.882038 0.11796188354492188 0.01391500596946571 +2941 5 5.606404 0.60640382766723633 0.36772560220947526 +2943 8 7.503963 0.49603700637817383 0.24605271169662046 +2944 6 5.882038 0.11796188354492188 0.01391500596946571 +2947 6 6.19522524 0.19522523880004883 0.03811289386453609 +2948 6 5.376883 0.62311697006225586 0.38827475837956626 +2949 6 5.449442 0.55055809020996094 0.30311421069563949 +2950 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2953 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2955 5 6.26787 1.2678699493408203 1.6074942084414943 +2956 6 6.107019 0.10701894760131836 0.011453055145693725 +2959 7 6.84598875 0.15401124954223633 0.02371946498556099 +2961 6 6.47835541 0.47835540771484375 0.2288238960900344 +2962 5 5.656493 0.65649318695068359 0.4309833045126652 +2964 5 6.28570461 1.2857046127319336 1.6530363512001713 +2965 8 7.26401472 0.73598527908325195 0.54167433102725226 +2967 6 6.001534 0.0015339851379394531 2.353110403419123E-06 +2968 5 6.08952665 1.0895266532897949 1.187068328228861 +2970 5 6.08952665 1.0895266532897949 1.187068328228861 +2971 5 5.307669 0.30766916275024414 0.094660313707436217 +2975 6 5.86485529 0.13514471054077148 0.018264092787148911 +2981 7 6.371684 0.62831592559814453 0.39478090236025309 +2984 6 4.61855555 1.3814444541931152 1.9083887800209141 +2985 7 6.5449214 0.4550786018371582 0.20709653385006277 +2987 7 6.43420458 0.5657954216003418 0.32012445910390852 +2989 6 6.208233 0.20823287963867188 0.043360932162613608 +2991 7 6.8057766 0.19422340393066406 0.037722730634413892 +2994 7 6.43420458 0.5657954216003418 0.32012445910390852 +2996 8 5.816692 2.1833081245422363 4.7668343666921373 +2997 6 6.396095 0.39609479904174805 0.15689108982792277 +2999 7 6.43420458 0.5657954216003418 0.32012445910390852 +3000 7 6.5449214 0.4550786018371582 0.20709653385006277 +3001 7 6.53180838 0.46819162368774414 0.21920339649136622 +3002 7 6.8057766 0.19422340393066406 0.037722730634413892 +3004 6 6.315313 0.31531286239624023 0.099422201192510329 +3005 6 6.09739447 0.097394466400146484 0.0094856820853692625 +3006 6 6.208233 0.20823287963867188 0.043360932162613608 +3013 6 6.648943 0.64894294738769531 0.42112694896422909 +3014 6 5.18606234 0.81393766403198242 0.66249452092984029 +3016 6 6.648943 0.64894294738769531 0.42112694896422909 +3020 6 3.73379683 2.2662031650543213 5.1356767853022234 +3022 5 5.03272629 0.032726287841796875 0.001071009915904142 +3023 6 5.18606234 0.81393766403198242 0.66249452092984029 +3026 6 5.998491 0.0015091896057128906 2.2776532659918303E-06 +3027 5 5.75025034 0.75025033950805664 0.56287557193195425 +3028 6 5.90629435 0.093705654144287109 0.0087807496186087519 +3029 8 7.02977467 0.97022533416748047 0.94133719906039914 +3031 6 6.082838 0.082838058471679688 0.0068621439313574228 +3033 6 5.665061 0.33493900299072266 0.11218413572441932 +3034 6 5.48654842 0.51345157623291016 0.26363252113605995 +3037 6 5.750472 0.24952793121337891 0.062264188455628755 +3038 6 6.538831 0.53883123397827148 0.29033909871054675 +3039 6 5.39716959 0.60283041000366211 0.36340450322518336 +3040 5 6.07817554 1.0781755447387695 1.1624625052727424 +3043 6 5.391435 0.60856485366821289 0.37035118112021337 +3044 6 5.65663147 0.3433685302734375 0.11790194758214056 +3045 6 6.14122248 0.14122247695922852 0.019943787998499829 +3046 6 6.496725 0.49672508239746094 0.24673580748276436 +3049 5 5.29757261 0.29757261276245117 0.088549459866271718 +3050 4 4.71068048 0.71068048477172852 0.50506675143537905 +3053 5 5.75403357 0.75403356552124023 0.56856661793267449 +3055 6 6.435923 0.43592309951782227 0.19002894869322517 +3056 5 5.76071835 0.76071834564208984 0.57869240139643807 +3058 5 5.476526 0.47652578353881836 0.22707682237728477 +3059 6 5.52979374 0.47020626068115234 0.22109392758375179 +3062 8 6.831621 1.1683788299560547 1.3651090902894794 +3064 5 5.3336153 0.33361530303955078 0.1112991704221713 +3065 6 6.481476 0.481475830078125 0.2318189749494195 +3066 5 5.3336153 0.33361530303955078 0.1112991704221713 +3069 8 4.845862 3.1541380882263184 9.9485870795999745 +3070 8 6.831621 1.1683788299560547 1.3651090902894794 +3072 6 6.86424732 0.86424732208251953 0.74692343372680625 +3073 5 6.54508257 1.5450825691223145 2.3872801454056116 +3074 5 6.22429562 1.2242956161499023 1.498899755723869 +3075 7 6.37249041 0.62750959396362305 0.39376829051639106 +3076 5 5.2231307 0.22313070297241211 0.049787310608962798 +3077 5 5.476526 0.47652578353881836 0.22707682237728477 +3078 5 6.578264 1.5782642364501953 2.490918000057718 +3079 5 5.94544172 0.94544172286987305 0.89386005134315383 +3080 6 5.52979374 0.47020626068115234 0.22109392758375179 +3084 6 6.806603 0.80660295486450195 0.65060832679614578 +3086 7 6.88708639 0.11291360855102539 0.012749482996014194 +3088 6 6.47210026 0.47210025787353516 0.22287865348425839 +3090 6 6.806603 0.80660295486450195 0.65060832679614578 +3091 6 5.508926 0.4910740852355957 0.24115375718997711 +3094 6 3.811624 2.1883759498596191 4.7889892979239903 +3095 6 3.811624 2.1883759498596191 4.7889892979239903 +3097 5 6.40035963 1.4003596305847168 1.9610070949713645 +3099 7 6.603572 0.39642810821533203 0.157155244983187 +3101 6 5.885584 0.11441612243652344 0.013091049073409522 +3102 6 5.330082 0.66991806030273438 0.44879020751977805 +3104 5 5.992548 0.99254798889160156 0.98515151025276282 +3105 6 5.881699 0.1183009147644043 0.013995106434094851 +3106 6 6.09651566 0.096515655517578125 0.0093152717599878088 +3108 5 5.790182 0.79018211364746094 0.62438777272836887 +3111 7 6.55089045 0.44910955429077148 0.20169939175525542 +3112 5 5.66179132 0.66179132461547852 0.43796775733630966 +3113 6 5.53946257 0.46053743362426758 0.21209472776922667 +3114 6 6.314805 0.31480503082275391 0.099102207431315037 +3115 6 6.314805 0.31480503082275391 0.099102207431315037 +3116 7 6.43430138 0.56569862365722656 0.32001493280768045 +3117 7 6.55089045 0.44910955429077148 0.20169939175525542 +3119 5 4.536246 0.46375417709350586 0.21506793677167479 +3120 6 5.40785 0.59215021133422852 0.35064187278317149 +3122 6 7.08013153 1.0801315307617188 1.1666841237456538 +3124 6 5.53946257 0.46053743362426758 0.21209472776922667 +3125 5 5.7089 0.70889997482299805 0.50253917430404726 +3126 7 6.19258261 0.80741739273071289 0.65192284608406226 +3128 6 6.53799 0.53799009323120117 0.28943334041491653 +3131 5 5.507035 0.5070347785949707 0.25708426670485096 +3133 6 6.68867445 0.6886744499206543 0.47427249797351578 +3135 6 5.426291 0.57370901107788086 0.32914202939196002 +3138 6 6.12315273 0.12315273284912109 0.01516659560820699 +3140 6 5.426291 0.57370901107788086 0.32914202939196002 +3141 7 5.541848 1.4581518173217773 2.1262067223588019 +3143 5 5.435146 0.43514585494995117 0.18935191508012394 +3144 6 5.710051 0.28994894027709961 0.084070387967813076 +3145 6 5.710051 0.28994894027709961 0.084070387967813076 +3146 6 5.710051 0.28994894027709961 0.084070387967813076 +3147 6 5.56390429 0.4360957145690918 0.19017947226552678 +3151 6 5.710051 0.28994894027709961 0.084070387967813076 +3154 6 6.867949 0.86794900894165039 0.75333548212279311 +3157 7 6.779997 0.22000312805175781 0.048401376352558145 +3158 7 6.926802 0.073197841644287109 0.0053579240213821322 +3159 6 6.36980534 0.36980533599853516 0.13675598653298948 +3162 7 6.779997 0.22000312805175781 0.048401376352558145 +3164 6 6.23988962 0.23988962173461914 0.057547030615978656 +3166 6 6.897838 0.89783811569213867 0.80611328198961019 +3167 7 6.39587927 0.60412073135375977 0.36496185805140158 +3168 6 6.723877 0.723876953125 0.52399784326553345 +3172 8 6.64314556 1.3568544387817383 1.841053968041706 +3173 8 6.6659255 1.3340744972229004 1.7797547641405345 +3174 8 6.88348532 1.1165146827697754 1.2466050368404922 +3175 6 5.76850462 0.23149538040161133 0.053590111147286734 +3176 6 6.294718 0.29471778869628906 0.086858574974030489 +3177 5 5.992035 0.992034912109375 0.98413326684385538 +3178 6 6.112884 0.1128840446472168 0.012742807535914835 +3179 4 5.79313755 1.7931375503540039 3.2153422744895579 +3181 6 6.601753 0.60175323486328125 0.36210695566842332 +3182 5 6.2163825 1.2163825035095215 1.479586394844091 +3183 6 6.049875 0.049874782562255859 0.0024874939356323011 +3189 5 6.140699 1.1406989097595215 1.3011940027265609 +3190 7 7.06220675 0.062206745147705078 0.0038696791418715293 +3192 6 6.601753 0.60175323486328125 0.36210695566842332 +3193 5 6.2163825 1.2163825035095215 1.479586394844091 +3195 6 6.242802 0.24280214309692383 0.058952880692459075 +3197 6 6.737725 0.73772478103637695 0.54423785255517032 +3199 7 6.66018629 0.3398137092590332 0.11547335700038275 +3200 7 6.8083353 0.19166469573974609 0.036735355593009444 +3201 6 6.737725 0.73772478103637695 0.54423785255517032 +3204 5 5.61776447 0.61776447296142578 0.38163294405330817 +3206 7 6.68098974 0.31901025772094727 0.10176754453118519 +3208 5 6.008159 1.0081591606140137 1.0163848931299526 +3209 5 5.57621145 0.57621145248413086 0.3320196379738718 +3211 6 6.456321 0.45632076263427734 0.20822863841112849 +3212 5 6.188125 1.1881251335144043 1.411641332888621 +3215 6 6.065724 0.065723896026611328 0.0043196305089168163 +3216 5 6.28508568 1.2850856781005859 1.6514452000592428 +3217 5 5.11301851 0.11301851272583008 0.012773184218758615 +3218 4 5.18631649 1.1863164901733398 1.4073468148571919 +3220 5 6.04402351 1.0440235137939453 1.0899850973546563 +3224 6 6.42197561 0.42197561264038086 0.17806341766322475 +3225 7 6.61993027 0.38006973266601563 0.14445300168881658 +3228 6 5.33879328 0.66120672225952148 0.43719432956117998 +3229 7 6.44850826 0.55149173736572266 0.30414313638266322 +3230 6 5.59285069 0.40714931488037109 0.16577056460755557 +3231 6 6.36423445 0.36423444747924805 0.1326667327305131 +3233 6 6.892843 0.89284276962280273 0.7971682112677172 +3234 6 5.69793034 0.30206966400146484 0.091246081909957866 +3235 6 6.42197561 0.42197561264038086 0.17806341766322475 +3237 7 6.369823 0.63017702102661133 0.39712307782997414 +3238 5 5.682729 0.68272876739501953 0.46611856982872268 +3243 7 6.61330032 0.38669967651367188 0.14953663981577847 +3245 5 5.682729 0.68272876739501953 0.46611856982872268 +3249 7 6.369823 0.63017702102661133 0.39712307782997414 +3250 6 6.864999 0.86499881744384766 0.74822295417925488 +3254 5 6.04639673 1.0463967323303223 1.0949461214315761 +3257 6 6.379424 0.37942409515380859 0.1439626439832864 +3259 6 6.379424 0.37942409515380859 0.1439626439832864 +3260 6 6.379424 0.37942409515380859 0.1439626439832864 +3261 5 6.71544456 1.7154445648193359 2.9427500549682009 +3262 7 5.91904974 1.0809502601623535 1.1684534649450597 +3265 3 5.408037 2.4080371856689453 5.7986430875644146 +3268 6 6.56899548 0.56899547576904297 0.32375585144563956 +3270 5 5.907564 0.90756416320800781 0.82367271033945144 +3276 8 6.294619 1.705380916595459 2.9083240706879678 +3279 6 6.2112565 0.21125650405883789 0.04462931050716179 +3280 5 5.907564 0.90756416320800781 0.82367271033945144 +3285 7 6.21512938 0.78487062454223633 0.61602189726932011 +3286 7 6.21512938 0.78487062454223633 0.61602189726932011 +3289 5 5.373417 0.37341690063476563 0.13944018167967442 +3291 8 7.06327868 0.9367213249206543 0.877446840561106 +3292 5 5.3677 0.36770009994506836 0.13520336349961326 +3294 6 5.762234 0.23776578903198242 0.056532570434001173 +3301 8 7.06327868 0.9367213249206543 0.877446840561106 +3304 7 7.03957 0.039569854736328125 0.0015657734038541093 +3307 3 5.551138 2.5511379241943359 6.5083047082625853 +3312 7 6.90318632 0.096813678741455078 0.0093728883914536709 +3315 7 6.349025 0.65097522735595703 0.42376874663113995 +3320 5 5.555195 0.55519485473632813 0.30824132672569249 +3322 7 6.713857 0.28614282608032227 0.081877716917233556 +3324 6 6.09259033 0.09259033203125 0.0085729695856571198 +3325 7 6.805244 0.19475603103637695 0.037929911625042223 +3327 7 6.30779028 0.69220972061157227 0.47915429730915093 +3329 6 6.29850864 0.29850864410400391 0.089107410604810866 +3331 6 5.92293072 0.077069282531738281 0.0059396743099568994 +3334 6 6.29176331 0.2917633056640625 0.085125826532021165 +3338 6 4.452654 1.5473461151123047 2.3942799999531417 +3339 6 5.92551756 0.074482440948486328 0.005547634009644753 +3340 6 6.308332 0.30833196640014648 0.095068601504181061 +3341 6 5.92551756 0.074482440948486328 0.005547634009644753 +3345 6 5.78186 0.2181401252746582 0.047585114254843575 +3348 6 4.452654 1.5473461151123047 2.3942799999531417 +3349 6 5.860938 0.13906192779541016 0.019338219762175868 +3350 6 6.46421 0.46421003341674805 0.21549095512477834 +3352 6 6.52834654 0.52834653854370117 0.27915006479111071 +3353 6 6.487485 0.48748493194580078 0.23764155887420202 +3354 7 6.862117 0.13788318634033203 0.019011773075362726 +3358 6 6.52834654 0.52834653854370117 0.27915006479111071 +3360 7 5.929071 1.0709290504455566 1.1468890310882216 +3362 6 6.46421 0.46421003341674805 0.21549095512477834 +3364 6 6.19586229 0.1958622932434082 0.038362037914566827 +3367 6 6.58196354 0.58196353912353516 0.33868156086919043 +3368 6 5.94375134 0.056248664855957031 0.0031639122980777756 +3373 7 6.703072 0.29692792892456055 0.08816619497542888 +3374 5 5.55829239 0.55829238891601563 0.31169039152155165 +3375 6 5.945457 0.054543018341064453 0.0029749408497536933 +3377 6 6.07918072 0.079180717468261719 0.0062695860187886865 +3378 8 6.5126605 1.4873394966125488 2.2121787781836701 +3379 5 5.142003 0.14200305938720703 0.020164868875326647 +3380 7 6.76761866 0.23238134384155273 0.054001088965605959 +3381 7 6.304437 0.69556283950805664 0.48380766370451056 +3385 6 6.483192 0.48319196701049805 0.23347447698347423 +3386 8 6.5126605 1.4873394966125488 2.2121787781836701 +3388 6 6.310103 0.31010293960571289 0.096163833152104417 +3391 8 6.59127235 1.4087276458740234 1.984513580249768 +3392 6 6.58681345 0.58681344985961914 0.34435002493614775 +3393 6 6.242813 0.2428131103515625 0.058958206558600068 +3394 5 5.517561 0.51756095886230469 0.26786934613846825 +3395 5 5.42729425 0.42729425430297852 0.18258037976033847 +3396 6 6.080851 0.080851078033447266 0.006536896819170579 +3398 5 5.633409 0.63340902328491211 0.40120699077874633 +3402 6 5.25966454 0.74033546447753906 0.5480965999631735 +3403 5 6.20717239 1.2071723937988281 1.457265188349993 +3404 6 5.354333 0.64566707611083984 0.41688597317352105 +3407 5 5.633409 0.63340902328491211 0.40120699077874633 +3410 7 6.016722 0.98327779769897461 0.96683522744774564 +3412 6 5.838692 0.16130781173706055 0.026020210127398968 +3413 6 5.566281 0.43371915817260742 0.18811230816595526 +3415 7 6.75017834 0.24982166290283203 0.062410863255536242 +3417 4 6.68368769 2.683687686920166 7.202179600926911 +3418 6 5.59492636 0.40507364273071289 0.16408465603512923 +3419 7 6.75017834 0.24982166290283203 0.062410863255536242 +3420 5 5.18478537 0.18478536605834961 0.034145631509318264 +3421 8 6.518584 1.4814162254333496 2.1945940329771929 +3424 6 6.5416193 0.54161930084228516 0.29335146704488579 +3426 6 6.227545 0.22754478454589844 0.05177662897403934 +3427 6 6.292055 0.29205513000488281 0.085296198962169001 +3428 6 6.5416193 0.54161930084228516 0.29335146704488579 +3429 5 5.917385 0.91738510131835938 0.8415954241208965 +3430 6 6.227545 0.22754478454589844 0.05177662897403934 +3432 5 5.899042 0.89904212951660156 0.80827675064574578 +3433 7 7.028948 0.028947830200195313 0.00083797687329933979 +3434 6 5.98812 0.011879920959472656 0.00014113252200331772 +3436 6 6.27996063 0.27996063232421875 0.078377955651376396 +3438 5 5.35919762 0.35919761657714844 0.12902292775470414 +3440 5 6.570556 1.5705561637878418 2.4666466636119821 +3441 5 6.18622065 1.186220645904541 1.4071194207701865 +3443 6 6.24534845 0.24534845352172852 0.060195863645503778 +3444 5 5.35919762 0.35919761657714844 0.12902292775470414 +3445 8 7.20836258 0.79163742065429688 0.62668980578018818 +3446 6 5.34057474 0.65942525863647461 0.43484167172778143 +3447 6 6.26559734 0.26559734344482422 0.07054194884494791 +3448 7 6.77392 0.22607994079589844 0.051112139630276943 +3449 8 7.20836258 0.79163742065429688 0.62668980578018818 +3453 6 5.924129 0.075870990753173828 0.0057564072378681885 +3460 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3462 6 6.51762867 0.51762866973876953 0.26793943973552814 +3464 5 5.63632774 0.63632774353027344 0.40491299718632945 +3466 6 6.51762867 0.51762866973876953 0.26793943973552814 +3468 8 6.82865238 1.1713476181030273 1.3720552424356356 +3469 6 5.73325253 0.26674747467041016 0.071154215243041108 +3471 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3474 6 5.795674 0.20432615280151367 0.041749176718667513 +3476 8 7.431058 0.56894207000732422 0.32369507902421901 +3479 7 7.04171276 0.041712760925292969 0.0017399544240106479 +3485 7 5.834083 1.165916919708252 1.3593622636619784 +3486 6 6.16977739 0.16977739334106445 0.028824363289686517 +3489 8 4.801781 3.198218822479248 10.228603636460548 +3492 7 6.888686 0.11131381988525391 0.012390766497446748 +3495 7 6.191298 0.80870199203491211 0.65399891192123505 +3496 7 6.308696 0.69130420684814453 0.4779015064059422 +3498 6 5.77528572 0.22471427917480469 0.05049650726505206 +3499 7 7.09658337 0.096583366394042969 0.0093283466640059487 +3501 6 6.357981 0.35798120498657227 0.12815054312363827 +3505 7 6.31529951 0.68470048904418945 0.4688147596973522 +3508 5 5.14080048 0.14080047607421875 0.019824774062726647 +3509 6 5.64398 0.35601997375488281 0.12675022171242745 +3510 6 6.093127 0.093126773834228516 0.0086725960047715489 +3512 6 6.499861 0.49986076354980469 0.24986078293659375 +3514 6 6.82486 0.8248600959777832 0.68039417793647772 +3515 7 6.633162 0.36683797836303711 0.13457010236948008 +3521 7 6.103966 0.89603376388549805 0.80287650602281246 +3524 6 7.059881 1.0598812103271484 1.1233481800045411 +3525 6 7.059881 1.0598812103271484 1.1233481800045411 +3530 5 5.521842 0.52184200286865234 0.27231907595796656 +3534 5 5.521842 0.52184200286865234 0.27231907595796656 +3535 5 5.33379745 0.33379745483398438 0.11142074085364584 +3538 7 6.42016 0.57984018325805664 0.33621463812073671 +3539 6 6.67678165 0.67678165435791016 0.45803340767542977 +3540 6 6.71353674 0.71353673934936523 0.50913467840132398 +3545 6 6.0961237 0.096123695373535156 0.009239764812264184 +3548 6 6.183013 0.18301296234130859 0.033493744384941238 +3549 6 6.090422 0.090422153472900391 0.0081761658386767522 +3550 6 6.07437038 0.074370384216308594 0.0055309540484813624 +3552 6 5.76073647 0.23926353454589844 0.057247038963396335 +3553 6 5.76073647 0.23926353454589844 0.057247038963396335 +3554 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3556 7 6.27572966 0.72427034378051758 0.52456753087994912 +3557 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3558 6 5.76073647 0.23926353454589844 0.057247038963396335 +3559 4 4.07595253 0.075952529907226563 0.0057687867993081454 +3561 5 4.905119 0.094881057739257813 0.0090024151177203748 +3562 6 6.55745363 0.55745363235473633 0.31075455222548953 +3563 5 4.905119 0.094881057739257813 0.0090024151177203748 +3565 6 6.04586554 0.045865535736083984 0.002103647368357997 +3569 6 6.04586554 0.045865535736083984 0.002103647368357997 +3570 6 6.00234652 0.0023465156555175781 5.5061357215890894E-06 +3571 4 4.425938 0.42593812942504883 0.18142329009810965 +3575 7 6.21730042 0.7826995849609375 0.61261864029802382 +3583 6 5.68802 0.31197977066040039 0.097331377301316024 +3584 7 6.31275463 0.68724536895751953 0.47230619715355715 +3586 7 6.36759567 0.63240432739257813 0.39993523330485914 +3587 6 5.788671 0.21132898330688477 0.04465993918552158 +3592 7 6.515574 0.48442602157592773 0.2346685703798812 +3598 7 6.75961447 0.24038553237915039 0.057785204177207561 +3599 6 5.357542 0.64245796203613281 0.41275223298362107 +3600 6 6.2097683 0.20976829528808594 0.044002737708069617 +3605 5 5.239256 0.23925590515136719 0.057243388149800012 +3607 6 6.00548553 0.00548553466796875 3.0091090593487024E-05 +3613 6 6.04967546 0.049675464630126953 0.0024676517862189939 +3614 5 5.464339 0.46433877944946289 0.21561050210061694 +3615 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3616 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3620 7 6.543914 0.45608615875244141 0.20801458420555718 +3622 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3625 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3627 5 5.06645775 0.066457748413085938 0.0044166323241370264 +3628 6 4.948763 1.0512371063232422 1.1050994537108636 +3629 6 5.165518 0.83448219299316406 0.69636053042268031 +3631 6 5.855898 0.14410209655761719 0.020765414232300827 +3635 6 5.803308 0.19669198989868164 0.038687738890303081 +3637 7 5.53476954 1.4652304649353027 2.1469003153745234 +3638 7 6.54559469 0.45440530776977539 0.20648418372934429 +3639 6 6.441782 0.44178199768066406 0.19517133347471827 +3640 6 6.44922447 0.44922447204589844 0.20180262628491619 +3643 6 6.44922447 0.44922447204589844 0.20180262628491619 +3645 6 6.42862368 0.42862367630004883 0.18371825588496904 +3646 7 5.662194 1.337806224822998 1.789725495175162 +3647 7 6.61878443 0.38121557235717773 0.14532531260761061 +3650 4 4.981792 0.98179197311401367 0.96391547847110814 +3652 6 6.1309557 0.13095569610595703 0.01714939434259577 +3653 6 5.460203 0.53979682922363281 0.29138061683988781 +3655 7 6.627825 0.37217521667480469 0.13851439190693782 +3656 7 6.350513 0.64948701858520508 0.42183338731069853 +3658 7 6.351104 0.64889621734619141 0.42106630088619568 +3660 8 7.266342 0.7336578369140625 0.53825382166542113 +3661 6 5.73333931 0.26666069030761719 0.071107923755334923 +3668 5 4.298321 0.70167922973632813 0.49235374144336674 +3677 6 6.48859262 0.48859262466430664 0.23872275287635603 +3679 7 6.182809 0.81719112396240234 0.66780133308293443 +3680 6 6.29749 0.29749011993408203 0.088500371458394511 +3681 8 6.875233 1.1247668266296387 1.2651004142865077 +3684 7 6.99874163 0.0012583732604980469 1.5835032627364853E-06 +3687 5 6.75047874 1.7504787445068359 3.0641758349702286 +3688 6 6.5764 0.57639980316162109 0.33223673308475554 +3697 6 6.29749 0.29749011993408203 0.088500371458394511 +3698 6 6.28198338 0.28198337554931641 0.079514624086186814 +3699 5 5.228925 0.22892522811889648 0.052406760069288794 +3702 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3703 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3704 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3706 6 6.62652731 0.62652730941772461 0.39253646944621323 +3714 4 6.085308 2.0853080749511719 4.3485097674565623 +3716 5 6.05689526 1.0568952560424805 1.1170275822451003 +3718 5 5.2608223 0.26082229614257813 0.068028270165086724 +3720 7 7.306124 0.30612421035766602 0.093712032167104553 +3721 5 5.29979467 0.29979467391967773 0.089876846510605901 +3723 7 6.609133 0.39086723327636719 0.15277719404912204 +3724 6 6.398474 0.39847421646118164 0.15878170118435264 +3728 7 6.39105129 0.60894870758056641 0.37081852846404217 +3730 6 5.40976429 0.59023571014404297 0.34837819352924271 +3731 6 6.323588 0.32358789443969727 0.10470912542791666 +3733 6 6.918565 0.91856479644775391 0.84376128527310357 +3734 5 5.592469 0.59246921539306641 0.35101977118847572 +3735 6 6.6319313 0.63193130493164063 0.39933717415260617 +3738 6 5.686131 0.31386899948120117 0.098513748835330261 +3739 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3741 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3744 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3745 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3748 5 5.54170942 0.54170942306518555 0.29344909903761618 +3749 6 6.36270332 0.36270332336425781 0.13155370077947737 +3750 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3753 5 5.294697 0.29469680786132813 0.086846208563656546 +3757 5 5.228405 0.22840499877929688 0.052168843467370607 +3759 6 6.1390934 0.13909339904785156 0.019346973658684874 +3762 5 5.38635254 0.3863525390625 0.14926828444004059 +3764 8 7.7105546 0.28944540023803711 0.083778639718957493 +3766 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3767 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3769 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3771 6 5.881416 0.11858415603637695 0.014062202062859797 +3772 6 6.194134 0.19413423538208008 0.037688101347384872 +3776 5 6.84388638 1.8438863754272461 3.3999169654862271 +3778 7 6.78043842 0.21956157684326172 0.048207286025899521 +3779 7 7.006796 0.0067958831787109375 4.6184028178686276E-05 +3782 6 6.213825 0.21382522583007813 0.045721227201283909 +3785 7 6.614752 0.38524818420410156 0.14841616343255737 +3786 5 5.138664 0.13866376876831055 0.019227640769031495 +3790 5 5.36643553 0.36643552780151367 0.1342749960351739 +3794 5 5.73072529 0.73072528839111328 0.53395944709427567 +3795 6 5.587233 0.41276693344116211 0.17037654134242075 +3796 6 6.35663176 0.35663175582885742 0.12718620926557378 +3797 5 5.010817 0.010817050933837891 0.00011700859090524318 +3799 5 6.00536442 1.0053644180297852 1.0107576130403686 +3802 5 5.56199741 0.56199741363525391 0.31584109293271467 +3803 6 6.127415 0.12741518020629883 0.016234628147003605 +3804 5 5.23174334 0.23174333572387695 0.053704973652429544 +3806 5 5.010817 0.010817050933837891 0.00011700859090524318 +3807 5 5.76871 0.76871013641357422 0.59091527382497588 +3810 3 5.63473034 2.634730339050293 6.9418039595120717 +3811 5 5.71404 0.71403980255126953 0.50985283962745598 +3812 5 5.56199741 0.56199741363525391 0.31584109293271467 +3813 5 6.00536442 1.0053644180297852 1.0107576130403686 +3814 5 5.584843 0.58484315872192383 0.34204152030383739 +3816 5 5.614201 0.61420106887817383 0.37724295301109123 +3817 6 6.45202875 0.45202875137329102 0.20432999206809654 +3818 6 6.95391655 0.95391654968261719 0.90995678375838907 +3819 6 6.95391655 0.95391654968261719 0.90995678375838907 +3822 6 6.508243 0.50824308395385742 0.25831103238692776 +3825 6 6.22035742 0.22035741806030273 0.048557391694203034 +3826 6 6.95391655 0.95391654968261719 0.90995678375838907 +3827 5 5.79172754 0.79172754287719727 0.62683250215036423 +3828 6 6.45202875 0.45202875137329102 0.20432999206809654 +3829 7 6.896923 0.10307693481445313 0.010624854490743019 +3831 5 5.33792543 0.33792543411254883 0.11419359902015458 +3832 5 5.33792543 0.33792543411254883 0.11419359902015458 +3835 5 4.95905542 0.040944576263427734 0.0016764583253916499 +3836 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3837 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3840 6 6.563122 0.56312179565429688 0.31710615674091969 +3842 6 6.269664 0.26966381072998047 0.072718570817414729 +3844 6 6.563122 0.56312179565429688 0.31710615674091969 +3845 5 5.040678 0.040678024291992188 0.0016547016602999065 +3846 6 6.333541 0.33354091644287109 0.11124954294155032 +3847 5 5.040678 0.040678024291992188 0.0016547016602999065 +3849 5 5.18588829 0.18588829040527344 0.034554456509795273 +3851 7 7.063238 0.063238143920898438 0.003999062846560264 +3852 6 6.40936041 0.40936040878295898 0.16757594427895128 +3856 6 6.40936041 0.40936040878295898 0.16757594427895128 +3857 6 6.131547 0.13154697418212891 0.017304606416473689 +3858 6 6.55600739 0.55600738525390625 0.30914421245688573 +3859 5 5.479981 0.4799809455871582 0.23038170812674252 +3861 6 5.770308 0.22969198226928711 0.052758406718794504 +3864 7 6.434293 0.56570720672607422 0.32002464374181727 +3865 6 7.211348 1.2113480567932129 1.4673641146966929 +3867 5 5.479981 0.4799809455871582 0.23038170812674252 +3868 6 5.64784956 0.35215044021606445 0.12400993254436798 +3871 6 5.47240543 0.52759456634521484 0.27835602643699531 +3873 5 5.128382 0.12838220596313477 0.016481990807960756 +3874 5 5.36483431 0.36483430862426758 0.13310407274934732 +3877 5 5.846487 0.84648704528808594 0.71654031784055405 +3878 5 5.39803934 0.39803934097290039 0.15843531696214086 +3879 4 5.068995 1.0689949989318848 1.1427503077413803 +3880 6 5.62090158 0.37909841537475586 0.14371560853965093 +3881 6 5.62090158 0.37909841537475586 0.14371560853965093 +3882 5 5.83923769 0.83923768997192383 0.70431990026941094 +3883 6 6.642903 0.64290285110473633 0.41332407595859877 +3884 6 5.62090158 0.37909841537475586 0.14371560853965093 +3885 6 6.30556154 0.30556154251098633 0.093367856261693305 +3887 6 6.30556154 0.30556154251098633 0.093367856261693305 +3890 6 6.616883 0.6168828010559082 0.38054439023858322 +3892 5 6.207933 1.2079329490661621 1.4591020094396754 +3895 6 5.99532557 0.0046744346618652344 2.1850339408047148E-05 +3896 6 5.653739 0.34626102447509766 0.11989669707054418 +3898 7 6.063343 0.93665695190429688 0.87732624555064831 +3899 5 6.207933 1.2079329490661621 1.4591020094396754 +3901 4 4.564142 0.56414222717285156 0.31825645247954526 +3902 6 5.68136072 0.31863927841186523 0.10153098974683417 +3905 7 7.138951 0.13895082473754883 0.019307331695245011 +3906 7 7.138951 0.13895082473754883 0.019307331695245011 +3908 7 6.148028 0.85197210311889648 0.72585646449283558 +3909 7 6.148028 0.85197210311889648 0.72585646449283558 +3910 6 6.63435841 0.63435840606689453 0.40241058734773105 +3911 6 5.38463831 0.61536169052124023 0.37867001016115864 +3913 6 5.75083733 0.24916267395019531 0.062082038090011338 +3914 7 6.148028 0.85197210311889648 0.72585646449283558 +3915 7 7.09318256 0.093182563781738281 0.0086829901929377229 +3917 5 5.26391649 0.2639164924621582 0.069651914993528408 +3920 6 5.7849946 0.21500539779663086 0.046227321081687478 +3922 7 6.80864763 0.19135236740112305 0.036615728510014378 +3923 5 5.02166033 0.021660327911376953 0.00046916980522837548 +3925 5 5.87787962 0.87787961959838867 0.7706726265062116 +3926 6 5.86510658 0.13489341735839844 0.018196234046627069 +3927 5 6.15729952 1.1572995185852051 1.3393421757175474 +3928 5 5.181213 0.1812129020690918 0.032838115876302254 +3930 6 6.24382734 0.24382734298706055 0.059451773188129664 +3931 6 6.76949167 0.76949167251586914 0.5921174340712696 +3932 8 6.814661 1.1853389739990234 1.4050284832810576 +3933 4 5.36573 1.365729808807373 1.8652179106650237 +3936 6 5.942126 0.057874202728271484 0.0033494233414330665 +3937 5 5.47661352 0.47661352157592773 0.22716044894900733 +3940 5 5.20407343 0.20407342910766602 0.041645964467761587 +3941 5 5.28040171 0.28040170669555664 0.078625117117780974 +3942 6 5.689291 0.31070899963378906 0.096540082453429932 +3943 6 5.534346 0.46565389633178711 0.21683355116897474 +3944 6 6.19307756 0.19307756423950195 0.037278945812659003 +3945 6 6.19931555 0.19931554794311523 0.039726687651864268 +3946 6 6.649443 0.64944314956665039 0.42177640451905063 +3947 7 6.5232563 0.47674369812011719 0.22728455369724543 +3949 5 5.20407343 0.20407342910766602 0.041645964467761587 +3950 5 5.28040171 0.28040170669555664 0.078625117117780974 +3951 5 5.33914328 0.33914327621459961 0.11501816180157221 +3952 6 6.17257738 0.1725773811340332 0.029782952479081359 +3953 7 6.01015 0.98985004425048828 0.97980311010269361 +3954 5 5.33914328 0.33914327621459961 0.11501816180157221 +3956 5 5.874935 0.87493515014648438 0.76551151696185116 +3959 6 5.762868 0.23713207244873047 0.056231619783829956 +3960 6 5.484553 0.51544713973999023 0.26568575386613702 +3962 7 6.894317 0.1056828498840332 0.011168864759611097 +3963 7 6.40009546 0.59990453720092773 0.35988545375425929 +3965 4 5.771997 1.7719969749450684 3.1399732792144732 +3967 4 5.61956 1.6195597648620605 2.6229738319600528 +3970 7 6.26989174 0.73010826110839844 0.53305807293872931 +3973 4 5.61956 1.6195597648620605 2.6229738319600528 +3978 7 5.6615057 1.3384943008422852 1.7915669933872778 +3982 7 7.10843658 0.10843658447265625 0.011758492852095515 +3985 6 6.1268425 0.12684249877929688 0.016089019496575929 +3990 6 5.793903 0.20609712600708008 0.042476025348378244 +3993 7 6.273067 0.72693300247192383 0.52843159008284601 +3994 7 6.273067 0.72693300247192383 0.52843159008284601 +3995 5 4.49924231 0.50075769424438477 0.25075826834495274 +3996 7 6.273067 0.72693300247192383 0.52843159008284601 +3997 7 6.61189747 0.38810253143310547 0.15062357490478462 +4002 6 5.52411652 0.47588348388671875 0.2264650902361609 +4003 6 6.44395447 0.4439544677734375 0.19709556945599616 +4004 7 6.93372965 0.066270351409912109 0.0043917594759932399 +4006 6 6.54262829 0.54262828826904297 0.2944454592297916 +4009 6 6.030793 0.030793190002441406 0.00094822055052645737 +4010 6 6.702753 0.70275306701660156 0.49386187320124009 +4011 7 6.61189747 0.38810253143310547 0.15062357490478462 +4014 6 6.416903 0.41690301895141602 0.17380812721080474 +4015 5 4.63322 0.36677980422973633 0.13452742479080371 +4017 6 6.302566 0.3025660514831543 0.091546215510106776 +4018 6 6.416903 0.41690301895141602 0.17380812721080474 +4019 5 4.63322 0.36677980422973633 0.13452742479080371 +4021 5 5.672981 0.67298078536987305 0.45290313747705113 +4022 5 5.24404049 0.24404048919677734 0.059555760367402399 +4024 6 6.498086 0.49808597564697266 0.24808963913619664 +4025 6 7.268845 1.2688450813293457 1.6099678404136739 +4027 5 5.43563271 0.43563270568847656 0.18977585426546284 +4029 6 6.150405 0.15040493011474609 0.022621643002821656 +4031 5 5.149139 0.1491389274597168 0.022242419683834669 +4032 5 5.507375 0.50737476348876953 0.25742915062528482 +4033 6 5.997153 0.0028471946716308594 8.1065174981631571E-06 +4034 5 5.507375 0.50737476348876953 0.25742915062528482 +4035 6 6.290976 0.29097604751586914 0.084667060227957336 +4037 5 5.21681929 0.21681928634643555 0.047010602931777612 +4039 4 5.56902456 1.5690245628356934 2.4618380787817387 +4043 7 6.615785 0.38421487808227539 0.14762107253977774 +4044 7 6.615785 0.38421487808227539 0.14762107253977774 +4047 6 6.399214 0.39921379089355469 0.15937165083960281 +4049 6 6.340012 0.3400120735168457 0.11560821013722489 +4050 7 6.615785 0.38421487808227539 0.14762107253977774 +4051 6 6.762627 0.76262712478637695 0.58160013145993616 +4052 5 5.392097 0.39209699630737305 0.15374005451326411 +4053 7 6.615785 0.38421487808227539 0.14762107253977774 +4054 7 6.69855261 0.30144739151000977 0.090870529848189108 +4055 6 6.762627 0.76262712478637695 0.58160013145993616 +4056 5 5.68365574 0.68365573883056641 0.46738516923596762 +4059 6 6.340012 0.3400120735168457 0.11560821013722489 +4064 5 6.0256834 1.0256834030151367 1.0520264432207114 +4066 6 6.278558 0.27855777740478516 0.077594435352693836 +4070 5 5.71400928 0.71400928497314453 0.50980925902786112 +4071 6 6.35261631 0.35261631011962891 0.12433826216238231 +4075 6 5.782519 0.21748113632202148 0.047298044655917693 +4078 6 5.879521 0.12047910690307617 0.014515215200162856 +4082 6 5.96297741 0.037022590637207031 0.0013706722174902097 +4085 6 5.42402267 0.57597732543945313 0.3317498794203857 +4086 6 5.6922617 0.30773830413818359 0.094702863833845186 +4087 6 5.65787649 0.34212350845336914 0.11704849503644255 +4088 6 5.93835 0.061649799346923828 0.0038006977595159697 +4091 6 5.59978676 0.40021324157714844 0.16017063873368897 +4094 7 7.09430265 0.094302654266357422 0.0088929906016801397 +4096 5 5.004691 0.0046911239624023438 2.2006644030625466E-05 +4097 6 5.59978676 0.40021324157714844 0.16017063873368897 +4099 6 5.251464 0.74853610992431641 0.56030630786062829 +4100 6 6.169235 0.1692352294921875 0.02864056290127337 +4101 5 5.35461 0.35460996627807617 0.12574822818373832 +4102 5 5.35461 0.35460996627807617 0.12574822818373832 +4103 7 6.459716 0.54028415679931641 0.29190697008834832 +4105 7 6.1171217 0.88287830352783203 0.77947409884018271 +4107 6 6.4520607 0.45206069946289063 0.20435887599887792 +4108 6 6.504417 0.50441694259643555 0.25443645197833575 +4109 6 6.58853436 0.58853435516357422 0.34637268720780412 +4111 6 5.88097429 0.11902570724487305 0.014167118985142224 +4112 6 6.374791 0.37479114532470703 0.14046840261380567 +4119 7 6.504891 0.49510908126831055 0.24513300235435054 +4120 5 5.821947 0.82194709777832031 0.67559703154620365 +4122 6 5.31796741 0.68203258514404297 0.46516844719826622 +4125 5 5.840767 0.84076690673828125 0.70688899146625772 +4126 5 5.781769 0.781768798828125 0.61116245482116938 +4128 5 5.52519 0.52518987655639648 0.27582440643732298 +4131 5 5.383935 0.38393497467041016 0.14740606477516849 +4132 5 5.383935 0.38393497467041016 0.14740606477516849 +4133 6 6.15966272 0.15966272354125977 0.025492185288612745 +4134 6 6.03338528 0.033385276794433594 0.0011145767066409462 +4136 6 6.40281725 0.4028172492980957 0.16226173633208418 +4137 5 5.383935 0.38393497467041016 0.14740606477516849 +4138 6 5.73121643 0.2687835693359375 0.072244607144966722 +4139 7 6.34555149 0.65444850921630859 0.42830285121544875 +4140 6 5.88961172 0.11038827896118164 0.012185572132011657 +4141 6 5.88961172 0.11038827896118164 0.012185572132011657 +4143 6 5.593262 0.4067378044128418 0.16543564153857915 +4147 7 6.34555149 0.65444850921630859 0.42830285121544875 +4149 7 6.661175 0.33882522583007813 0.11480253365880344 +4150 5 5.02091932 0.020919322967529297 0.00043761807341979875 +4151 6 6.47969961 0.47969961166381836 0.23011171743041814 +4152 6 5.66785336 0.33214664459228516 0.11032139351391379 +4154 5 5.15050268 0.15050268173217773 0.022651057208577186 +4155 5 5.12121248 0.12121248245239258 0.014692465902271579 +4159 7 7.171123 0.17112302780151367 0.029283090643957621 +4160 7 7.171123 0.17112302780151367 0.029283090643957621 +4162 7 7.171123 0.17112302780151367 0.029283090643957621 +4163 5 5.196028 0.19602823257446289 0.038427067966267714 +4165 7 6.1403017 0.85969829559326172 0.7390811594459592 +4166 7 6.264687 0.73531293869018555 0.54068511780519657 +4168 6 6.413434 0.41343402862548828 0.17092769602550106 +4169 7 6.41145468 0.58854532241821289 0.34638559654035816 +4170 7 7.171123 0.17112302780151367 0.029283090643957621 +4171 5 6.396712 1.3967118263244629 1.9508039257946166 +4174 6 5.622606 0.37739419937133789 0.14242638171913313 +4177 6 6.333195 0.33319520950317383 0.1110190476358639 +4178 7 6.451308 0.54869222640991211 0.30106315932266625 +4179 5 5.080747 0.080747127532958984 0.0065200986048239429 +4180 6 5.17860174 0.82139825820922852 0.67469509858915444 +4181 6 5.97988 0.020120143890380859 0.00040482019016963022 +4184 7 6.664118 0.33588218688964844 0.11281684346977272 +4186 5 5.63166 0.63165998458862305 0.39899433613049951 +4187 6 6.629633 0.62963294982910156 0.39643765151049593 +4188 6 6.45284367 0.45284366607666016 0.20506738590574969 +4189 5 5.431086 0.43108606338500977 0.18583519404478466 +4195 8 6.864855 1.1351451873779297 1.2885545964272751 +4196 6 6.342234 0.34223413467407227 0.11712420293611103 +4199 6 6.092705 0.09270477294921875 0.0085941749275662005 +4203 5 5.11989164 0.11989164352416992 0.014374006186926636 +4205 6 6.4625473 0.46254730224609375 0.2139500068151392 +4206 6 5.41587734 0.58412265777587891 0.34119927932715655 +4207 7 6.66556644 0.33443355560302734 0.11184580311328318 +4208 6 6.23236465 0.23236465454101563 0.053993332679965533 +4210 6 5.624344 0.3756561279296875 0.14111752645112574 +4211 6 5.50366735 0.49633264541625977 0.24634609490590265 +4212 4 5.101606 1.1016058921813965 1.2135355416887705 +4213 4 4.66811943 0.66811943054199219 0.44638357346775592 +4215 5 5.144476 0.14447593688964844 0.020873296340141678 +4218 6 6.2664175 0.26641750335693359 0.070978286094941723 +4221 6 6.68571949 0.68571949005126953 0.47021121903617313 +4222 4 4.72174644 0.72174644470214844 0.52091793044019141 +4223 4 4.507802 0.50780200958251953 0.25786288093604526 +4225 5 5.66852236 0.66852235794067383 0.44692214306655842 +4227 7 5.712353 1.2876467704772949 1.6580342055206074 +4228 6 5.54079962 0.45920038223266602 0.21086499104262657 +4229 6 5.635159 0.36484098434448242 0.13310894385745087 +4230 6 5.206867 0.79313278198242188 0.62905960985517595 +4231 6 6.206823 0.20682287216186523 0.042775700449283249 +4233 6 5.66782 0.33218002319335938 0.11034356780874077 +4235 5 5.115067 0.1150670051574707 0.013240415675909389 +4236 5 5.115067 0.1150670051574707 0.013240415675909389 +4237 5 6.068968 1.0689678192138672 1.142692198514851 +4240 6 5.92421675 0.075783252716064453 0.0057431013922268903 +4241 6 6.78847551 0.78847551345825195 0.62169363532325406 +4244 5 5.40309143 0.4030914306640625 0.16248270147480071 +4249 6 5.87049532 0.12950468063354492 0.016771462305996465 +4251 6 5.72442341 0.27557659149169922 0.07594245777818287 +4253 4 5.871702 1.8717021942138672 3.503269103825005 +4254 5 5.62651348 0.62651348114013672 0.39251914205033245 +4256 5 5.298669 0.29866886138916016 0.089203088763497362 +4257 5 6.2595787 1.2595787048339844 1.5865385136712575 +4260 6 6.039149 0.039148807525634766 0.0015326291306791973 +4261 7 6.67396927 0.32603073120117188 0.10629603768757079 +4262 6 6.53447533 0.53447532653808594 0.28566387467799359 +4263 6 5.570907 0.4290928840637207 0.18412070315412166 +4266 7 6.67396927 0.32603073120117188 0.10629603768757079 +4268 6 6.223932 0.22393178939819336 0.050145446303076824 +4271 5 4.947084 0.052916049957275391 0.0028001083430808649 +4272 6 5.83227158 0.16772842407226563 0.028132824241765775 +4274 6 5.83227158 0.16772842407226563 0.028132824241765775 +4275 6 5.83227158 0.16772842407226563 0.028132824241765775 +4278 4 4.781235 0.7812352180480957 0.61032846591865564 +4279 6 6.009532 0.0095319747924804688 9.0858543444483075E-05 +4281 5 5.3883934 0.38839340209960938 0.15084943479450885 +4288 6 6.39963055 0.39963054656982422 0.15970457375169644 +4291 5 5.64141655 0.64141654968261719 0.41141519020675332 +4292 6 6.14931154 0.14931154251098633 0.022293936727010077 +4295 5 5.64141655 0.64141654968261719 0.41141519020675332 +4297 6 6.430081 0.43008089065551758 0.18496957250704327 +4300 5 5.76332045 0.7633204460144043 0.5826581033036291 +4301 5 5.09951735 0.099517345428466797 0.0099037020411287813 +4304 6 6.01407433 0.014074325561523438 0.00019808664001175202 +4306 6 6.01468229 0.014682292938232422 0.00021556972592406964 +4307 7 6.38643 0.61357021331787109 0.37646840667093784 +4308 6 6.37244368 0.37244367599487305 0.13871429178857397 +4310 6 5.634999 0.36500120162963867 0.13322587719108014 +4311 5 6.35202742 1.352027416229248 1.8279781342355363 +4314 7 6.330645 0.66935491561889648 0.44803600306318003 +4315 7 6.70243 0.29757022857666016 0.088548040935165773 +4318 7 6.330645 0.66935491561889648 0.44803600306318003 +4319 7 6.70243 0.29757022857666016 0.088548040935165773 +4322 7 6.258191 0.74180889129638672 0.55028043120637449 +4323 6 6.030255 0.030254840850830078 0.00091535539490905649 +4324 6 6.287142 0.28714179992675781 0.082450413265178213 +4325 5 5.33152676 0.33152675628662109 0.10990999013392866 +4327 5 5.33152676 0.33152675628662109 0.10990999013392866 +4331 5 5.30460739 0.30460739135742188 0.092785662869573571 +4336 8 7.803421 0.1965789794921875 0.038643295178189874 +4338 8 7.803421 0.1965789794921875 0.038643295178189874 +4339 8 5.894702 2.1052980422973633 4.4322798469011104 +4342 6 6.53088236 0.53088235855102539 0.28183607862069948 +4344 6 5.308004 0.69199609756469727 0.47885859904477002 +4345 6 6.16504431 0.16504430770874023 0.027239623507057331 +4346 6 5.308004 0.69199609756469727 0.47885859904477002 +4347 7 6.508878 0.49112176895141602 0.24120059193796806 +4348 6 5.203784 0.79621601104736328 0.63395993624817493 +4350 6 6.67189741 0.67189741134643555 0.45144613137404122 +4356 5 5.61585426 0.61585426330566406 0.3792764736317622 +4357 6 6.30698061 0.30698060989379883 0.094237094850768699 +4359 6 5.048261 0.95173883438110352 0.90580680886910159 +4360 5 5.47202253 0.47202253341674805 0.22280527205316503 +4364 6 6.12464428 0.12464427947998047 0.01553619640708348 +4367 5 5.313826 0.31382608413696289 0.098486811084740111 +4368 6 6.25579929 0.25579929351806641 0.06543327856434189 +4371 5 5.73987532 0.73987531661987305 0.54741548414335739 +4373 6 6.28148031 0.28148031234741211 0.079231166239196682 +4374 5 5.319378 0.31937789916992188 0.10200224247819278 +4377 6 7.22142553 1.2214255332946777 1.4918803333841879 +4379 5 5.134177 0.13417720794677734 0.018003523132392729 +4381 6 6.37373829 0.37373828887939453 0.13968030857449776 +4383 6 7.22142553 1.2214255332946777 1.4918803333841879 +4384 5 5.17954 0.17954015731811523 0.032234668089813567 +4385 5 5.17954 0.17954015731811523 0.032234668089813567 +4387 6 6.33638859 0.33638858795166016 0.1131572821041118 +4389 4 5.846869 1.8468689918518066 3.4109250730637086 +4390 5 5.244622 0.24462223052978516 0.059840035669367353 +4391 5 5.60372734 0.60372734069824219 0.3644867019065714 +4392 5 5.244622 0.24462223052978516 0.059840035669367353 +4394 6 5.95294666 0.047053337097167969 0.0022140165319797234 +4395 5 5.325285 0.32528495788574219 0.10581030382672907 +4396 5 5.33716774 0.33716773986816406 0.11368208480780595 +4401 6 7.114057 1.1140570640563965 1.2411231419739579 +4402 6 6.401035 0.40103483200073242 0.16082893647785568 +4404 5 5.16598129 0.16598129272460938 0.027549789534532465 +4405 5 5.16598129 0.16598129272460938 0.027549789534532465 +4407 6 6.38966656 0.38966655731201172 0.15184002588739531 +4409 7 6.784521 0.21547889709472656 0.046431155093159759 +4412 7 6.24230337 0.75769662857055664 0.57410418094718807 +4416 5 5.28144741 0.28144741058349609 0.079212644924155029 +4420 6 5.910447 0.089552879333496094 0.0080197181969197118 +4423 6 5.82727575 0.17272424697875977 0.029833665494379602 +4424 6 5.910447 0.089552879333496094 0.0080197181969197118 +4425 6 5.76691437 0.23308563232421875 0.054328911995980889 +4427 5 5.505483 0.50548315048217773 0.25551321542138794 +4429 6 5.82788134 0.1721186637878418 0.029624834424112123 +4430 5 5.208692 0.20869207382202148 0.043552381676136065 +4432 6 6.75506926 0.75506925582885742 0.57012958109794454 +4433 5 4.73662949 0.26337051391601563 0.06936402760038618 +4434 6 5.983093 0.016907215118408203 0.00028585392306013091 +4435 6 5.998494 0.0015058517456054688 2.2675894797430374E-06 +4438 5 5.61417246 0.61417245864868164 0.37720780896256656 +4441 6 6.13689232 0.13689231872558594 0.018739506926067406 +4444 6 6.323481 0.32348108291625977 0.10464001100467613 +4450 6 5.931922 0.068078041076660156 0.0046346196768354275 +4451 5 5.0867095 0.086709499359130859 0.0075185372791111149 +4452 5 5.28290367 0.28290367126464844 0.08003448721501627 +4454 6 5.866116 0.13388395309448242 0.017924912896205569 +4458 7 6.727507 0.27249288558959961 0.074252372696946622 +4463 6 6.66014862 0.66014862060546875 0.43579620128730312 +4464 5 5.33912659 0.3391265869140625 0.11500684195198119 +4467 5 5.814492 0.81449222564697266 0.66339758563935902 +4468 6 6.148203 0.14820289611816406 0.021964098417811329 +4469 6 6.15595961 0.1559596061706543 0.02432339875690559 +4471 6 6.1687336 0.16873359680175781 0.028471026689658174 +4474 6 5.58603525 0.41396474838256836 0.17136681290344313 +4476 6 6.43061924 0.43061923980712891 0.18543292969206959 +4477 5 5.274904 0.27490377426147461 0.07557208510320379 +4479 5 4.76414776 0.23585224151611328 0.055626279828175029 +4480 5 6.48533058 1.4853305816650391 2.2062069368294033 +4483 4 5.231788 1.231788158416748 1.5173020672157236 +4484 5 4.76414776 0.23585224151611328 0.055626279828175029 +4485 6 6.311954 0.31195402145385742 0.097315311501233737 +4487 6 6.056974 0.056973934173583984 0.003246029175215881 +4488 6 6.68880939 0.68880939483642578 0.47445838241492311 +4490 6 6.510393 0.51039314270019531 0.26050116011538194 +4492 6 5.89441824 0.10558176040649414 0.011147508130534334 +4495 6 5.144858 0.85514211654663086 0.7312680394918516 +4500 6 5.839706 0.1602940559387207 0.025694184369285722 +4501 6 4.62486744 1.3751325607299805 1.8909895595797934 +4502 6 6.01956224 0.019562244415283203 0.00038268140656327887 +4505 5 5.376757 0.37675714492797852 0.14194594625428181 +4506 6 6.49714661 0.4971466064453125 0.24715474830009043 +4508 4 6.290004 2.290003776550293 5.2441172966146041 +4510 6 7.13127375 1.1312737464904785 1.2797802894986035 +4513 6 6.11181831 0.11181831359863281 0.012503335256042192 +4515 6 6.48865747 0.48865747451782227 0.23878612740213612 +4518 6 5.303486 0.69651412963867188 0.48513193278631661 +4519 6 6.31545067 0.31545066833496094 0.099509124152973527 +4523 5 5.89000559 0.89000558853149414 0.79210994761729125 +4524 6 5.74650574 0.2534942626953125 0.064259341219440103 +4525 6 6.31545067 0.31545066833496094 0.099509124152973527 +4529 6 5.78503227 0.21496772766113281 0.046211123935790965 +4537 5 5.41821861 0.41821861267089844 0.17490680798437097 +4538 6 7.013766 1.013765811920166 1.0277211214181534 +4539 5 6.30204439 1.3020443916320801 1.6953195977805535 +4540 6 6.81689167 0.81689167022705078 0.66731200088634068 +4541 6 6.21650553 0.21650552749633789 0.046874643436467522 +4545 6 6.73921871 0.73921871185302734 0.54644430395364907 +4546 6 6.66135359 0.66135358810424805 0.43738856849836338 +4547 6 6.231135 0.23113489151000977 0.053423338073343984 +4548 5 5.619266 0.61926603317260742 0.38349041984133692 +4550 6 6.00123453 0.0012345314025878906 1.5240677839756245E-06 +4553 6 6.81689167 0.81689167022705078 0.66731200088634068 +4555 5 5.438729 0.43872880935668945 0.19248296815953836 +4559 7 5.820478 1.1795220375061035 1.3912722369625499 +4560 6 7.43508 1.4350800514221191 2.0594547539897121 +4562 7 6.60676956 0.39323043823242188 0.15463017755246256 +4563 7 6.51218367 0.48781633377075195 0.23796477549353767 +4569 6 5.791381 0.20861911773681641 0.043521936285287666 +4571 7 6.183002 0.81699800491333008 0.66748574003236172 +4574 7 7.28964 0.28963994979858398 0.083891300519326251 +4575 7 6.81097269 0.18902730941772461 0.035731323705704199 +4576 5 6.063239 1.0632390975952148 1.1304773786550868 +4578 7 6.65358162 0.34641838073730469 0.12000569451265619 +4581 6 6.3172965 0.31729650497436523 0.10067707206894738 +4582 6 5.9126215 0.087378501892089844 0.0076350025929059484 +4588 5 6.453704 1.4537038803100586 2.1132549716285212 +4589 6 6.48201656 0.48201656341552734 0.23233996740691509 +4591 6 5.233967 0.76603317260742188 0.5868068215349922 +4592 6 6.46258 0.46258020401000977 0.21398044514194225 +4594 6 7.097535 1.0975351333618164 1.2045833689635401 +4595 6 6.03428125 0.034281253814697266 0.0011752043631076958 +4601 6 6.55298138 0.55298137664794922 0.30578840291946108 +4603 6 6.15366173 0.15366172790527344 0.023611926622834289 +4604 6 6.37432575 0.37432575225830078 0.14011976880374277 +4610 6 5.418315 0.58168506622314453 0.33835751626702404 +4611 5 5.78711462 0.78711462020874023 0.61954942534634938 +4612 5 5.5359993 0.53599929809570313 0.28729524755908642 +4614 5 4.7773695 0.22263050079345703 0.049564339883545472 +4616 5 5.515364 0.51536417007446289 0.26560022779653991 +4618 7 6.754185 0.24581480026245117 0.060424916028068765 +4620 6 5.92583847 0.074161529541015625 0.0054999324638629332 +4622 7 7.02194071 0.021940708160400391 0.00048139467457986029 +4626 6 6.392011 0.39201116561889648 0.15367275396988589 +4627 6 5.879169 0.12083101272583008 0.01460013363634971 +4628 6 5.879169 0.12083101272583008 0.01460013363634971 +4629 7 6.207745 0.79225492477416992 0.62766786582892564 +4631 7 6.29134655 0.70865345001220703 0.50218971221420361 +4633 6 5.58980465 0.41019535064697266 0.16826022569239285 +4634 6 6.5506444 0.5506443977355957 0.30320925275759691 +4637 6 6.52179 0.5217900276184082 0.2722648329220192 +4638 5 5.39053345 0.390533447265625 0.1525163734331727 +4640 6 6.52179 0.5217900276184082 0.2722648329220192 +4643 6 5.714403 0.28559684753417969 0.081565559321461478 +4646 7 6.041397 0.9586029052734375 0.91891952999867499 +4649 5 4.65491056 0.34508943557739258 0.11908671854712338 +4651 7 7.295845 0.29584503173828125 0.08752428280422464 +4652 5 5.108062 0.10806179046630859 0.011677350558784383 +4656 7 6.557833 0.44216680526733398 0.19551148368032045 +4657 7 6.557833 0.44216680526733398 0.19551148368032045 +4661 5 6.112563 1.1125631332397461 1.237796725444241 +4664 7 6.18966246 0.81033754348754883 0.65664693438543509 +4667 7 6.18966246 0.81033754348754883 0.65664693438543509 +4668 7 6.281588 0.71841192245483398 0.5161156903252504 +4669 5 6.191474 1.1914739608764648 1.4196101994466517 +4673 7 6.867097 0.13290309906005859 0.017663233739767747 +4674 7 7.240729 0.24072885513305664 0.057950381693672171 +4678 6 5.62289524 0.37710475921630859 0.14220799942359008 +4679 5 5.20689535 0.20689535140991211 0.042805686435031021 +4682 6 5.69725657 0.30274343490600586 0.091653587378687007 +4684 6 6.23112869 0.23112869262695313 0.053420472555444576 +4685 5 5.61776447 0.61776447296142578 0.38163294405330817 +4686 4 4.58701658 0.58701658248901367 0.34458846811708099 +4688 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4692 5 5.97440958 0.97440958023071289 0.9494740300453941 +4693 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4694 7 6.101005 0.89899492263793945 0.80819187092879474 +4695 7 7.00340128 0.0034012794494628906 1.1568701893338584E-05 +4698 6 5.45968676 0.5403132438659668 0.29193840149696371 +4699 5 5.73117447 0.73117446899414063 0.53461610410886351 +4700 5 5.73117447 0.73117446899414063 0.53461610410886351 +4702 6 5.335329 0.66467094421386719 0.44178746408215375 +4703 7 6.74484062 0.25515937805175781 0.065106308207759866 +4704 6 5.266865 0.73313522338867188 0.53748725577315781 +4705 6 5.828863 0.17113685607910156 0.029287823508639121 +4709 6 6.635482 0.63548183441162109 0.40383716186715901 +4710 7 6.614615 0.38538503646850586 0.14852162633383159 +4711 6 6.165267 0.16526699066162109 0.027313178202348354 +4714 7 6.478859 0.52114105224609375 0.27158799633616582 +4717 6 5.71084 0.28915977478027344 0.083613375350978458 +4720 5 6.142657 1.1426568031311035 1.3056645697417935 +4721 6 6.462371 0.46237087249755859 0.21378682373415359 +4724 6 6.462371 0.46237087249755859 0.21378682373415359 +4726 6 7.20805073 1.2080507278442383 1.4593865610449939 +4728 6 6.28587675 0.28587675094604492 0.081725516731466996 +4731 6 7.07015753 1.070157527923584 1.1452371345715164 +4732 6 7.07015753 1.070157527923584 1.1452371345715164 +4736 6 5.969431 0.030569076538085938 0.00093446844039135613 +4739 6 6.319568 0.31956815719604492 0.10212380709367608 +4740 5 5.16463041 0.16463041305541992 0.027103172902798178 +4741 6 6.012568 0.012567996978759766 0.0001579545480581146 +4742 6 6.012427 0.012426853179931641 0.00015442667995557713 +4744 5 5.40579844 0.40579843521118164 0.16467237001984358 +4745 3 5.750404 2.750403881072998 7.5647215090214104 +4747 6 6.406887 0.40688705444335938 0.1655570750735933 +4749 6 4.94821072 1.0517892837524414 1.1062606974164737 +4750 5 5.616849 0.61684894561767578 0.38050262170963833 +4751 6 5.60638952 0.39361047744750977 0.15492920795645659 +4753 6 6.76105976 0.76105976104736328 0.5792119598854697 +4755 6 6.18791866 0.18791866302490234 0.035313423913066799 +4760 6 5.879002 0.12099790573120117 0.014640493191336645 +4761 6 6.61741972 0.61741971969604492 0.38120711026954268 +4763 7 7.51052475 0.51052474975585938 0.26063552011328284 +4765 8 6.80642462 1.193575382232666 1.4246221930718548 +4767 7 5.490513 1.5094871520996094 2.2785514623537892 +4768 6 5.81628227 0.18371772766113281 0.033752203456970165 +4769 6 5.81628227 0.18371772766113281 0.033752203456970165 +4777 6 6.61448669 0.6144866943359375 0.37759389751590788 +4778 6 5.598406 0.40159416198730469 0.16127787094228552 +4779 4 4.22890425 0.22890424728393555 0.052397154424625114 +4780 5 5.38402939 0.38402938842773438 0.14747857117617968 +4781 5 5.58836842 0.58836841583251953 0.34617739274926862 +4782 6 5.827879 0.17212104797363281 0.029625655155541608 +4786 8 7.105712 0.89428806304931641 0.79975113971249812 +4787 8 6.78330564 1.2166943550109863 1.4803451535156 +4788 5 5.76242447 0.76242446899414063 0.5812910709209973 +4790 6 6.38086653 0.38086652755737305 0.1450593118136112 +4792 6 6.63710833 0.63710832595825195 0.40590701900532622 +4795 7 6.71729469 0.28270530700683594 0.079922290609829361 +4798 5 5.69227552 0.6922755241394043 0.47924540132248694 +4799 6 5.45217276 0.54782724380493164 0.30011468905490801 +4805 6 5.90260267 0.097397327423095703 0.0094862393891617103 +4806 6 5.250485 0.74951505661010742 0.56177282008525253 +4809 6 6.050518 0.050518035888671875 0.0025520719500491396 +4810 5 5.885007 0.88500690460205078 0.78323722119330341 +4814 6 6.350416 0.35041618347167969 0.12279150163885788 +4818 6 6.8706255 0.87062549591064453 0.75798875412965572 +4819 6 6.350416 0.35041618347167969 0.12279150163885788 +4820 5 5.317319 0.31731891632080078 0.10069129465500737 +4821 6 5.720231 0.27976894378662109 0.078270661907481553 +4823 7 6.112958 0.88704204559326172 0.7868435906502782 +4824 5 5.68046 0.68045997619628906 0.46302577920505428 +4825 6 5.996681 0.00331878662109375 1.101434463635087E-05 +4827 6 6.57971 0.57971000671386719 0.33606369188419194 +4831 6 5.615018 0.38498210906982422 0.14821122430385003 +4833 6 6.23332357 0.23332357406616211 0.054439890215007836 +4838 6 6.469409 0.46940898895263672 0.22034479890953662 +4840 7 6.805491 0.19450902938842773 0.037833762513628244 +4842 6 6.237228 0.2372279167175293 0.056277084470139016 +4843 5 6.383863 1.3838629722595215 1.9150767259909571 +4847 7 6.12764263 0.87235736846923828 0.76100737832257437 +4848 6 6.16121864 0.16121864318847656 0.02599145091153332 +4855 6 5.96981859 0.030181407928466797 0.00091091738454451843 +4857 6 5.92357826 0.076421737670898438 0.0058402819886396173 +4858 5 5.098244 0.098244190216064453 0.0096519209112102544 +4861 6 6.082398 0.082397937774658203 0.0067894201495164452 +4863 7 7.10627174 0.10627174377441406 0.011293683524854714 +4864 5 5.585732 0.58573198318481445 0.34308195612561576 +4865 6 6.84959269 0.84959268569946289 0.72180773159402634 +4868 6 6.06707 0.06707000732421875 0.0044983858824707568 +4870 7 6.40111876 0.59888124465942383 0.35865874520482066 +4873 6 6.464158 0.46415805816650391 0.21544270296089962 +4874 6 5.7968936 0.20310640335083008 0.04125221108211008 +4875 6 5.778002 0.22199821472167969 0.049283207339613 +4877 5 4.3623414 0.63765859603881836 0.40660848510219694 +4884 5 5.72053432 0.72053432464599609 0.51916971299306169 +4885 6 5.674971 0.32502889633178711 0.10564378345065961 +4890 6 6.390395 0.39039516448974609 0.15240838445697591 +4891 6 5.462591 0.53740882873535156 0.28880824920270243 +4892 5 6.01234436 1.0123443603515625 1.0248411039356142 +4893 6 6.095607 0.095606803894042969 0.0091406609508339898 +4895 6 5.20881939 0.79118061065673828 0.62596675867916929 +4897 6 5.75556135 0.24443864822387695 0.059750252745516264 +0 6 5.58289576 0.41710424423217773 0.17397595055649617 +1 6 5.33015347 0.66984653472900391 0.44869438008845464 +2 6 5.70412 0.29587984085083008 0.087544880221912535 +3 6 5.96136 0.038640022277832031 0.0014930513216313557 +4 6 5.96136 0.038640022277832031 0.0014930513216313557 +7 6 5.58289576 0.41710424423217773 0.17397595055649617 +12 5 6.31212759 1.3121275901794434 1.7216788129101133 +13 7 6.37878036 0.62121963500976563 0.38591383492166642 +14 5 5.109386 0.10938596725463867 0.011965289832232884 +15 7 6.31677771 0.68322229385375977 0.46679270281879326 +16 6 5.103471 0.89652919769287109 0.80376460231582314 +17 8 6.87536 1.1246399879455566 1.2648151024861818 +19 5 5.5723834 0.57238340377807617 0.32762276092057618 +22 8 6.29127455 1.7087254524230957 2.9197426717585131 +23 5 5.02370834 0.023708343505859375 0.0005620855517918244 +24 6 5.29549646 0.70450353622436523 0.4963252325526355 +26 6 6.15262365 0.15262365341186523 0.023293979580785162 +27 6 5.88923931 0.11076068878173828 0.012267930179405084 +29 7 6.59755468 0.40244531631469727 0.16196223262363674 +30 6 5.72036743 0.279632568359375 0.078194373287260532 +33 6 6.059624 0.059624195098876953 0.0035550446411889425 +34 5 5.379803 0.37980318069458008 0.14425045606571985 +36 5 5.22603941 0.22603940963745117 0.051093814709247454 +38 5 5.35056067 0.35056066513061523 0.12289277993681935 +39 5 5.35056067 0.35056066513061523 0.12289277993681935 +42 6 5.401128 0.59887218475341797 0.35864789367133199 +43 6 5.739065 0.26093482971191406 0.06808698535678559 +47 5 4.90973663 0.09026336669921875 0.0081474753678776324 +49 5 6.105748 1.105748176574707 1.2226790299982895 +53 6 6.438474 0.43847417831420898 0.19225960504832074 +55 6 5.841298 0.15870189666748047 0.025186292005855648 +57 6 5.543428 0.45657205581665039 0.20845804215264252 +58 6 5.454844 0.54515600204467773 0.29719506656533667 +59 6 6.401974 0.40197420120239258 0.16158325843230159 +61 6 5.543428 0.45657205581665039 0.20845804215264252 +62 5 5.132821 0.13282108306884766 0.01764144010758173 +65 5 5.030684 0.030683994293212891 0.00094150750578592124 +67 5 5.35860634 0.35860633850097656 0.12859850601307699 +75 5 5.270853 0.27085304260253906 0.07336137068705284 +78 5 5.718807 0.71880722045898438 0.51668382018397097 +80 6 6.57747 0.57746982574462891 0.33347139964553207 +81 6 6.31010628 0.31010627746582031 0.096165903323708335 +83 6 5.57204151 0.42795848846435547 0.18314846784869587 +84 5 5.23093128 0.23093128204345703 0.0533292570262347 +85 6 5.24266 0.7573399543762207 0.57356380649457606 +86 6 5.35685825 0.64314174652099609 0.41363130611807719 +87 6 5.65553427 0.34446573257446289 0.11865664091806138 +89 6 5.24266 0.7573399543762207 0.57356380649457606 +94 7 5.96693134 1.0330686569213867 1.0672308499133578 +101 5 5.630641 0.63064098358154297 0.39770805017269595 +103 5 5.20167637 0.20167636871337891 0.040673357697414758 +107 6 6.142988 0.14298820495605469 0.020445626756554702 +110 6 5.58482647 0.41517353057861328 0.17236906049311074 +114 5 5.187309 0.18730878829956055 0.03508458217424959 +116 6 6.17693758 0.17693758010864258 0.03130690725470231 +118 5 5.14454842 0.14454841613769531 0.020894244607916335 +119 5 5.04438543 0.044385433197021484 0.0019700666800872568 +124 6 5.616926 0.38307380676269531 0.14674554142766283 +126 5 5.909863 0.90986299514770508 0.82785066993915279 +127 7 6.253766 0.74623394012451172 0.55686509339375334 +130 5 4.510829 0.48917102813720703 0.23928829476881219 +134 5 5.024521 0.0245208740234375 0.00060127326287329197 +135 5 5.717012 0.71701192855834961 0.51410610569496384 +136 6 5.90298939 0.097010612487792969 0.0094110589352567331 +139 6 5.826573 0.17342710494995117 0.030076960731321378 +140 5 5.57194567 0.5719456672668457 0.32712184630531738 +142 6 6.106359 0.10635900497436523 0.011312237939137049 +143 6 5.740864 0.25913619995117188 0.06715157012513373 +146 6 5.35438347 0.64561653137207031 0.41682070558090345 +148 7 6.588247 0.41175317764282227 0.16954067929896155 +149 6 5.54737234 0.45262765884399414 0.20487179755059515 +153 5 6.004873 1.0048727989196777 1.0097693420086671 +155 6 6.044978 0.044978141784667969 0.0020230332384016947 +157 7 6.268512 0.73148822784423828 0.53507502747470426 +158 8 6.197546 1.8024539947509766 3.2488404031937534 +159 8 6.197546 1.8024539947509766 3.2488404031937534 +160 7 6.268512 0.73148822784423828 0.53507502747470426 +162 5 5.403021 0.40302085876464844 0.1624258125993947 +163 6 6.044978 0.044978141784667969 0.0020230332384016947 +165 5 5.61569548 0.61569547653198242 0.37908091982194492 +166 6 5.592527 0.40747308731079102 0.16603431688258752 +168 5 5.02263451 0.022634506225585938 0.00051232087207608856 +170 6 6.00712061 0.0071206092834472656 5.0703076567515382E-05 +172 4 4.794153 0.79415321350097656 0.63067932651392766 +175 6 6.07389736 0.073897361755371094 0.0054608200744041824 +178 4 4.40795135 0.40795135498046875 0.16642430803040043 +182 5 5.4483614 0.44836139678955078 0.201027942131077 +184 5 5.538105 0.53810501098632813 0.28955700284859631 +185 5 5.6508255 0.65082550048828125 0.42357383208582178 +186 6 5.94136524 0.058634757995605469 0.0034380348452032194 +190 6 5.13912439 0.86087560653686523 0.7411068099302156 +193 5 6.05295324 1.0529532432556152 1.1087105324825188 +194 5 5.24736834 0.24736833572387695 0.061191093518800699 +195 6 5.170604 0.82939577102661133 0.68789734499682709 +197 5 5.028246 0.028245925903320313 0.00079783233013586141 +200 5 5.404038 0.4040379524230957 0.16324666699824775 +203 6 6.53488255 0.53488254547119141 0.28609933744974114 +208 5 5.381865 0.38186502456665039 0.14582089698728851 +213 6 5.96111059 0.038889408111572266 0.0015123860632684227 +214 7 6.242515 0.75748491287231445 0.57378339322917782 +215 5 5.28750134 0.28750133514404297 0.082657017709607317 +217 5 5.28750134 0.28750133514404297 0.082657017709607317 +220 5 5.716736 0.71673583984375 0.51371026411652565 +221 6 5.08587837 0.91412162780761719 0.8356183504256478 +222 7 6.242515 0.75748491287231445 0.57378339322917782 +224 6 5.92879 0.071209907531738281 0.0050708509306787164 +225 5 5.738681 0.73868083953857422 0.54564938270141283 +227 6 5.37215567 0.62784433364868164 0.39418850729475707 +229 5 5.738681 0.73868083953857422 0.54564938270141283 +230 4 4.821786 0.82178592681884766 0.67533210951751244 +231 6 5.877407 0.12259292602539063 0.015029025511466898 +232 6 5.765742 0.23425817489624023 0.054876892505717478 +234 6 6.02762 0.027619838714599609 0.0007628554906204954 +235 6 6.02762 0.027619838714599609 0.0007628554906204954 +236 6 6.02762 0.027619838714599609 0.0007628554906204954 +238 7 6.67725468 0.32274532318115234 0.10416454363530647 +243 6 5.970998 0.029002189636230469 0.00084112700369587401 +245 6 5.6585145 0.34148550033569336 0.11661234693951883 +251 3 5.30328751 2.3032875061035156 5.3051333357725525 +253 3 5.191571 2.1915712356567383 4.8029844809580027 +255 8 5.873038 2.1269621849060059 4.5239681360201303 +256 7 6.39684772 0.60315227508544922 0.36379266694075341 +261 5 5.67542458 0.67542457580566406 0.45619835760226124 +263 6 5.66006374 0.33993625640869141 0.11555665842115559 +264 6 5.546553 0.45344686508178711 0.20561405945250044 +265 5 5.67542458 0.67542457580566406 0.45619835760226124 +266 6 5.002925 0.99707508087158203 0.99415871689507185 +270 6 5.002925 0.99707508087158203 0.99415871689507185 +273 5 5.215361 0.21536111831665039 0.046380411282598288 +274 5 5.734063 0.73406314849853516 0.53884870598358248 +281 8 6.663667 1.3363327980041504 1.7857853470216014 +282 4 5.0554595 1.0554594993591309 1.1139947547874272 +286 6 5.21452475 0.78547525405883789 0.61697137473879593 +287 7 6.53254032 0.46745967864990234 0.21851855116346997 +289 7 6.53254032 0.46745967864990234 0.21851855116346997 +292 5 5.402362 0.40236186981201172 0.16189507427861827 +294 3 4.562488 1.5624880790710449 2.4413689972391239 +295 6 5.045992 0.95400810241699219 0.91013145947727025 +298 6 5.77189255 0.22810745239257813 0.052033009837032296 +302 6 6.09933758 0.099337577819824219 0.0098679543671096326 +305 6 5.46788454 0.53211545944213867 0.28314686217731833 +306 5 5.295121 0.29512119293212891 0.087096518517682853 +307 6 5.46788454 0.53211545944213867 0.28314686217731833 +310 7 6.4347477 0.56525230407714844 0.31951016726452508 +313 6 5.421862 0.57813787460327148 0.33424340205078806 +315 6 5.478924 0.52107620239257813 0.27152040869987104 +318 7 6.748587 0.25141286849975586 0.063208430447275532 +320 7 5.75241947 1.2475805282592773 1.5564571744916975 +322 6 6.058367 0.058366775512695313 0.0034066804837493692 +324 5 4.546028 0.45397186279296875 0.20609045220771804 +325 5 4.917919 0.082080841064453125 0.0067372644698480144 +326 6 5.749149 0.25085115432739258 0.062926301627385328 +330 8 6.98020029 1.0197997093200684 1.0399914471292959 +334 5 6.214921 1.2149209976196289 1.4760330304570743 +335 6 6.24653053 0.24653053283691406 0.060777303620852763 +337 6 5.20219231 0.79780769348144531 0.6364971157781838 +339 7 6.743009 0.25699090957641602 0.066044327604913633 +340 7 5.70599937 1.2940006256103516 1.6744376190799812 +341 6 5.213163 0.78683710098266602 0.61911262348280616 +342 6 5.38700151 0.61299848556518555 0.37576714330521099 +345 6 5.97763968 0.022360324859619141 0.00049998412782770174 +351 7 6.794541 0.2054591178894043 0.042213449123892133 +356 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +357 6 5.097309 0.90269088745117188 0.81485083828738425 +359 6 5.955685 0.044314861297607422 0.0019638069318261842 +362 6 6.04658127 0.046581268310546875 0.0021698145574191585 +363 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +364 7 6.6094327 0.39056730270385742 0.15254281794136659 +365 7 6.87111664 0.12888336181640625 0.016610920953098685 +367 6 5.37173843 0.62826156616210938 0.39471259551646654 +369 5 5.892208 0.89220809936523438 0.79603529257292394 +372 5 4.765526 0.23447418212890625 0.054978142085019499 +374 7 6.53566933 0.46433067321777344 0.2156029740908707 +375 7 6.53566933 0.46433067321777344 0.2156029740908707 +380 7 5.85971642 1.1402835845947266 1.3002466532961989 +382 6 5.252193 0.74780702590942383 0.55921534799949768 +385 7 6.53566933 0.46433067321777344 0.2156029740908707 +386 7 6.42074728 0.57925271987915039 0.33553371348739347 +390 7 5.82244158 1.177558422088623 1.3866438374318477 +393 6 6.1026063 0.10260629653930664 0.01052805208951213 +394 5 5.14353275 0.14353275299072266 0.020601651181095804 +397 6 6.52884865 0.52884864807128906 0.27968089256683015 +400 6 6.52884865 0.52884864807128906 0.27968089256683015 +401 5 5.14353275 0.14353275299072266 0.020601651181095804 +402 5 4.94096375 0.0590362548828125 0.0034852793905884027 +403 5 5.666886 0.6668858528137207 0.44473674068308355 +405 5 5.10803747 0.10803747177124023 0.011672095306721531 +407 5 5.069229 0.0692291259765625 0.0047926718834787607 +408 6 6.01091671 0.010916709899902344 0.00011917455503862584 +410 6 5.872228 0.12777185440063477 0.01632564677697701 +411 6 5.823905 0.17609500885009766 0.031009452141915972 +412 5 5.69728041 0.6972804069519043 0.48619996591901327 +417 5 5.06454945 0.064549446105957031 0.0041666309925858513 +420 7 6.685552 0.31444787979125977 0.098877469105218552 +421 6 5.986877 0.013123035430908203 0.00017221405892087205 +424 7 5.922215 1.0777850151062012 1.1616205387874743 +425 6 5.986877 0.013123035430908203 0.00017221405892087205 +426 6 5.986877 0.013123035430908203 0.00017221405892087205 +427 5 5.250166 0.25016593933105469 0.062582997201388935 +431 5 4.95284557 0.047154426574707031 0.0022235399455894367 +432 7 6.270196 0.72980403900146484 0.53261393534285162 +433 4 5.13603973 1.1360397338867188 1.2905862769694068 +435 7 6.93598032 0.064019680023193359 0.0040985194302720629 +437 8 6.529011 1.4709892272949219 2.1638093068177113 +438 7 6.270196 0.72980403900146484 0.53261393534285162 +443 6 5.58504343 0.41495656967163086 0.17218895471364704 +444 6 5.70104074 0.29895925521850586 0.089376636280803723 +445 3 5.536319 2.5363187789916992 6.432912948665944 +446 5 6.67247 1.6724700927734375 2.7971562112215906 +447 6 5.70106936 0.29893064498901367 0.089359530513547725 +448 6 5.70106936 0.29893064498901367 0.089359530513547725 +458 6 5.050184 0.94981622695922852 0.90215086499506469 +459 5 4.837731 0.16226911544799805 0.026331265828275718 +460 5 5.73105049 0.73105049133300781 0.53443482087823213 +461 5 5.95119953 0.95119953155517578 0.90478054883078585 +462 5 5.154207 0.15420722961425781 0.023779869665304432 +463 6 5.12796068 0.8720393180847168 0.76045257228565788 +468 5 5.164256 0.16425609588623047 0.026980065035786538 +469 5 5.38181925 0.38181924819946289 0.14578593829560305 +470 6 5.00187445 0.99812555313110352 0.99625461981327135 +471 5 5.26753426 0.26753425598144531 0.071574578123545507 +472 6 6.08648539 0.086485385894775391 0.0074797219733682141 +473 7 6.078559 0.92144107818603516 0.84905366056864295 +475 5 6.01866531 1.0186653137207031 1.0376790213776985 +476 7 6.40013742 0.59986257553100586 0.35983510952269171 +477 6 6.20083 0.20082998275756836 0.040332681974405205 +478 6 5.15129375 0.84870624542236328 0.72030229101892473 +479 6 6.16166544 0.16166543960571289 0.026135714362908402 +481 6 6.04767036 0.047670364379882813 0.0022724636401108 +485 6 6.47117424 0.47117424011230469 0.22200516454540775 +486 6 5.911162 0.088838100433349609 0.0078922080886059121 +488 6 5.887391 0.11260890960693359 0.012680766522862541 +490 6 6.33496237 0.33496236801147461 0.11219978798385455 +491 7 6.21005774 0.78994226455688477 0.62400878133325932 +494 6 6.653475 0.65347480773925781 0.42702932434985996 +496 4 5.23894358 1.2389435768127441 1.534981186525556 +498 5 5.103715 0.10371494293212891 0.010756789387414756 +499 4 5.23894358 1.2389435768127441 1.534981186525556 +500 6 5.311577 0.68842315673828125 0.47392644273350015 +503 5 5.137176 0.1371760368347168 0.018817265081679579 +505 6 6.13015556 0.13015556335449219 0.01694047067212523 +506 5 4.47576427 0.52423572540283203 0.27482309578863351 +508 6 6.28651571 0.28651571273803711 0.0820912536457854 +509 7 5.931798 1.068202018737793 1.1410555528354962 +511 6 5.925795 0.074204921722412109 0.0055063704078293085 +512 6 6.149516 0.14951610565185547 0.022355065849296807 +515 6 5.6218214 0.37817859649658203 0.14301905084812461 +516 5 6.00719738 1.007197380065918 1.0144465624116492 +518 6 6.805467 0.80546712875366211 0.64877729550266849 +524 5 4.9252224 0.074777603149414063 0.0055916899327712599 +525 6 5.24856 0.75144004821777344 0.56466214606552967 +526 4 6.14279747 2.1427974700927734 4.5915809978359903 +530 6 6.371907 0.37190723419189453 0.13831499084426468 +536 5 5.10018253 0.10018253326416016 0.010036539971224556 +537 6 5.88101053 0.11898946762084961 0.014158493404693218 +542 6 4.932093 1.0679068565368652 1.1404250542384489 +543 6 6.03408527 0.034085273742675781 0.0011618058861131431 +545 6 6.42284536 0.42284536361694336 0.17879820153234505 +550 7 5.2345643 1.7654356956481934 3.1167631954688204 +551 7 5.86865425 1.1313457489013672 1.2799432035571954 +552 7 6.50745964 0.49254035949707031 0.24259600573350326 +553 7 5.2345643 1.7654356956481934 3.1167631954688204 +554 7 6.50745964 0.49254035949707031 0.24259600573350326 +555 7 5.86865425 1.1313457489013672 1.2799432035571954 +556 5 4.872683 0.12731695175170898 0.016209606203346993 +562 6 5.048077 0.95192289352416992 0.90615719521542815 +564 5 5.479501 0.47950077056884766 0.22992098897611868 +567 5 5.58539 0.58539009094238281 0.34268155857353122 +568 6 5.553329 0.4466710090637207 0.19951499033800246 +570 5 5.11044836 0.11044836044311523 0.012198840324572302 +571 7 6.777907 0.22209310531616211 0.049325347428975874 +572 5 5.358643 0.3586430549621582 0.12862484087258963 +573 7 6.902201 0.097798824310302734 0.0095646100364774611 +574 7 6.177025 0.82297515869140625 0.6772881118231453 +575 6 5.791957 0.20804309844970703 0.043281930812554492 +576 6 5.791957 0.20804309844970703 0.043281930812554492 +579 7 6.542046 0.45795392990112305 0.20972180191188272 +580 5 5.11044836 0.11044836044311523 0.012198840324572302 +583 6 5.35542774 0.64457225799560547 0.41547339577755338 +585 6 5.35542774 0.64457225799560547 0.41547339577755338 +587 7 6.5687685 0.43123149871826172 0.18596060548679816 +588 7 7.028516 0.028515815734863281 0.0008131517470246763 +589 6 5.828428 0.17157220840454102 0.029437022696811255 +591 6 6.46318531 0.46318531036376953 0.21454063173678151 +592 5 5.396524 0.39652395248413086 0.15723124489363727 +595 7 5.208214 1.7917861938476563 3.2104977644630708 +596 5 5.396524 0.39652395248413086 0.15723124489363727 +597 6 6.225943 0.22594308853149414 0.051050279255150599 +598 8 6.305187 1.6948127746582031 2.8723903411446372 +599 7 5.93457365 1.0654263496398926 1.1351333065069866 +601 6 6.00369453 0.0036945343017578125 1.3649583706865087E-05 +603 5 4.94606066 0.053939342498779297 0.0029094526692006184 +605 6 5.596465 0.40353488922119141 0.16284040681875922 +608 5 5.19934368 0.19934368133544922 0.039737903288369125 +610 8 7.12691069 0.87308931350708008 0.76228494936026436 +611 6 5.7924037 0.2075963020324707 0.0430962246175568 +615 5 5.39173031 0.39173030853271484 0.15345263462313596 +616 7 6.271933 0.72806692123413086 0.53008144179534611 +620 5 5.06031942 0.060319423675537109 0.0036384328725489468 +623 5 5.17006063 0.17006063461303711 0.028920619444988915 +625 8 6.47763872 1.5223612785339355 2.3175838623794789 +626 4 4.67777538 0.67777538299560547 0.45937946979483968 +628 6 5.57972527 0.42027473449707031 0.17663085245658294 +630 5 6.085581 1.0855808258056641 1.1784857293569075 +631 5 6.085581 1.0855808258056641 1.1784857293569075 +632 6 6.34318829 0.34318828582763672 0.11777819952931168 +635 6 5.886408 0.11359214782714844 0.012903176047984743 +636 7 6.597964 0.40203619003295898 0.16163309809621751 +637 5 5.137594 0.13759422302246094 0.018932170209154719 +640 7 6.2694006 0.73059940338134766 0.53377548822118115 +643 5 5.46275139 0.46275138854980469 0.21413884760477231 +646 4 4.810526 0.81052589416503906 0.6569522251120361 +647 6 5.254026 0.74597406387329102 0.55647730397163286 +648 5 5.21467161 0.21467161178588867 0.046083900906751296 +650 7 6.55360842 0.44639158248901367 0.1992654449170459 +651 7 6.55360842 0.44639158248901367 0.1992654449170459 +655 6 6.979067 0.97906684875488281 0.95857189433081658 +658 5 5.783849 0.78384876251220703 0.61441888249191834 +659 4 4.837211 0.83721113204956055 0.70092247962770671 +662 4 4.75797558 0.75797557830810547 0.57452697731150693 +663 5 5.03337 0.033370018005371094 0.001113558101678791 +664 6 5.933576 0.066423892974853516 0.0044121335579347942 +666 6 6.59370661 0.59370660781860352 0.35248753616747308 +667 6 5.933576 0.066423892974853516 0.0044121335579347942 +669 5 5.512285 0.51228523254394531 0.26243615948260413 +671 6 6.38181257 0.38181257247924805 0.14578084050322104 +672 8 6.718115 1.2818851470947266 1.6432295303420688 +673 6 6.24267769 0.24267768859863281 0.058892460543574998 +674 5 5.43839359 0.43839359283447266 0.1921889422383174 +675 6 4.94588137 1.0541186332702637 1.1111660930075686 +676 6 4.91327667 1.0867233276367188 1.1809675908298232 +677 7 6.845388 0.15461206436157227 0.023904890446146965 +684 5 5.50572443 0.50572443008422852 0.25575719918401774 +686 7 6.338226 0.6617741584777832 0.43794503682897812 +687 4 4.83409 0.83409023284912109 0.69570651653430104 +690 4 6.03202963 2.0320296287536621 4.1291444121327459 +695 5 5.266163 0.26616287231445313 0.070842674598679878 +699 5 5.75083971 0.7508397102355957 0.56376027046667332 +701 7 7.302115 0.30211496353149414 0.091273451189636035 +703 6 5.64697838 0.35302162170410156 0.12462426539059379 +708 6 6.142319 0.1423192024230957 0.02025475537834609 +709 5 5.07981443 0.079814434051513672 0.0063703438829634251 +710 5 5.186609 0.18660879135131836 0.03482284100959987 +713 5 5.75211859 0.75211858749389648 0.56568236965381402 +715 7 6.74210548 0.25789451599121094 0.066509581378340954 +716 6 5.201803 0.79819679260253906 0.63711811972098076 +717 5 5.72647953 0.72647953033447266 0.52777250799499598 +730 6 6.32876348 0.32876348495483398 0.10808542903964735 +731 6 5.886897 0.11310291290283203 0.012792268907105608 +733 6 5.84083 0.15917015075683594 0.02533513689195388 +734 5 5.29676867 0.2967686653137207 0.088071640712087174 +736 6 5.84083 0.15917015075683594 0.02533513689195388 +737 5 5.29676867 0.2967686653137207 0.088071640712087174 +739 6 5.71197033 0.28802967071533203 0.082961091212382598 +740 3 5.478546 2.478546142578125 6.1431909808889031 +741 6 6.318698 0.31869792938232422 0.10156837019258091 +742 6 6.342546 0.34254598617553711 0.11733775264497126 +743 5 5.46122837 0.46122837066650391 0.21273160990767792 +744 5 5.2266674 0.22666740417480469 0.051378112115344265 +745 6 7.068423 1.068422794342041 1.1415272674696553 +746 6 5.776893 0.22310686111450195 0.049776671476365664 +747 6 6.22603226 0.22603225708007813 0.051090581240714528 +748 6 6.02232647 0.022326469421386719 0.0004984712368241162 +750 6 6.22603226 0.22603225708007813 0.051090581240714528 +751 6 5.94263268 0.057367324829101563 0.0032910099580476526 +753 6 5.776893 0.22310686111450195 0.049776671476365664 +754 5 4.951338 0.048662185668945313 0.0023680083140789066 +755 7 6.66953325 0.33046674728393555 0.10920827106042452 +756 5 5.26670647 0.26670646667480469 0.071132339366158703 +759 7 6.447287 0.55271291732788086 0.30549156898109686 +762 5 5.25446272 0.25446271896362305 0.064751275342359804 +763 6 5.75677967 0.24322032928466797 0.059156128577342315 +766 5 5.064814 0.064814090728759766 0.0042008663569959026 +767 6 5.377497 0.62250280380249023 0.38750974074196165 +768 7 5.636545 1.3634548187255859 1.8590090427060204 +769 7 5.636545 1.3634548187255859 1.8590090427060204 +771 7 5.73526955 1.2647304534912109 1.5995431199880841 +772 7 5.55488348 1.4451165199279785 2.0883617561687515 +775 6 6.36388731 0.36388731002807617 0.13241397439946923 +776 6 5.966575 0.033424854278564453 0.0011172208835432684 +777 5 5.746976 0.74697589874267578 0.55797299330242822 +787 6 5.64129162 0.35870838165283203 0.1286717030679938 +789 6 5.627616 0.37238407135009766 0.13866989659527462 +790 6 5.64129162 0.35870838165283203 0.1286717030679938 +791 7 6.673766 0.32623386383056641 0.10642853390982054 +793 7 6.673766 0.32623386383056641 0.10642853390982054 +796 6 5.34205 0.65794992446899414 0.43289810310875509 +797 6 5.96610975 0.033890247344970703 0.0011485488651032938 +798 6 5.429145 0.57085514068603516 0.32587559164767299 +800 6 5.14655 0.85344982147216797 0.72837659777087538 +801 5 5.268791 0.26879119873046875 0.072248708514962345 +803 7 5.87979031 1.1202096939086914 1.2548697583270041 +804 6 5.493222 0.50677776336669922 0.25682370144295419 +805 6 5.14655 0.85344982147216797 0.72837659777087538 +807 6 5.285724 0.71427583694458008 0.51018997124288035 +808 6 5.1317997 0.86820030212402344 0.75377176460824558 +809 6 5.285931 0.71406888961791992 0.50989437912016911 +811 6 5.13246775 0.86753225326538086 0.75261221045570892 +812 7 4.98973751 2.0102624893188477 4.0411552759624101 +813 6 5.52920055 0.47079944610595703 0.22165211845367594 +814 6 4.9766 1.023399829864502 1.0473472117666915 +815 5 5.0497756 0.049775600433349609 0.0024776103985004738 +818 5 5.0497756 0.049775600433349609 0.0024776103985004738 +820 9 6.84990168 2.1500983238220215 4.6229228021022664 +822 5 6.04735231 1.0473523139953613 1.0969468696314379 +823 6 6.01296329 0.012963294982910156 0.00016804701681394363 +824 5 5.36770439 0.36770439147949219 0.13520651951330365 +825 6 5.936046 0.063953876495361328 0.0040900983187839302 +828 7 6.322937 0.67706298828125 0.45841429010033607 +830 6 5.498639 0.50136089324951172 0.25136274527994829 +831 4 6.24087048 2.240870475769043 5.021500489173377 +832 8 7.105262 0.89473819732666016 0.80055644175536145 +833 6 6.312468 0.31246805191040039 0.097636283464680673 +834 6 5.498639 0.50136089324951172 0.25136274527994829 +835 8 6.844221 1.1557788848876953 1.3358248307522445 +837 8 7.18123341 0.81876659393310547 0.67037873534081882 +839 7 6.57121944 0.42878055572509766 0.18385276496792358 +842 7 6.47577953 0.52422046661376953 0.27480709761675826 +843 7 6.238966 0.76103401184082031 0.57917276717853383 +844 8 6.69551563 1.3044843673706055 1.7016794647142888 +846 5 5.71414852 0.71414852142333984 0.51000811065114249 +847 5 5.787212 0.78721189498901367 0.61970256761219389 +849 6 6.185082 0.18508195877075195 0.034255331462418326 +852 7 6.56788826 0.43211174011230469 0.18672055594288395 +853 5 5.15344524 0.15344524383544922 0.023545442855720466 +857 5 5.152636 0.15263605117797852 0.023297764119206477 +865 6 6.67667437 0.67667436599731445 0.45788819759786747 +866 7 6.56788826 0.43211174011230469 0.18672055594288395 +867 8 6.099201 1.9007987976074219 3.6130360689858207 +868 7 5.922011 1.0779891014099121 1.1620605027585498 +869 6 6.14752531 0.14752531051635742 0.021763717242947678 +873 3 5.358975 2.3589749336242676 5.5647627374676176 +875 7 5.889844 1.1101560592651367 1.2324464759230978 +877 6 5.43060732 0.56939268112182617 0.32420802531510162 +878 6 5.736863 0.26313686370849609 0.069241009042343649 +879 8 6.83100033 1.1689996719360352 1.3665602329865578 +880 7 5.889844 1.1101560592651367 1.2324464759230978 +882 6 6.42099428 0.42099428176879883 0.17723618528202678 +883 6 6.42099428 0.42099428176879883 0.17723618528202678 +884 6 6.170308 0.17030811309814453 0.029004853387050389 +886 6 5.88422441 0.11577558517456055 0.013403986122511924 +889 7 7.024262 0.024261951446533203 0.00058864228799393459 +891 7 6.097072 0.90292787551879883 0.81527874838889147 +892 5 6.012046 1.0120458602905273 1.0242368233311936 +893 7 6.14825344 0.85174655914306641 0.72547220101205312 +894 7 6.097072 0.90292787551879883 0.81527874838889147 +897 6 5.666549 0.3334507942199707 0.11118943216592925 +899 6 6.04876375 0.048763751983642578 0.0023779035075222055 +901 6 5.33798742 0.66201257705688477 0.43826065218149779 +903 6 5.26283264 0.7371673583984375 0.5434157142881304 +905 4 5.24363136 1.2436313629150391 1.5466189668259176 +907 8 6.86781025 1.1321897506713867 1.2818536315253368 +909 5 6.248672 1.2486720085144043 1.5591817848473966 +911 5 5.25836658 0.25836658477783203 0.066753292129760666 +913 5 4.977968 0.022031784057617188 0.00048539950876147486 +915 5 4.99300337 0.0069966316223144531 4.8952854058370576E-05 +916 7 6.15890551 0.8410944938659668 0.70743994761164686 +917 6 5.846199 0.15380096435546875 0.023654736636672169 +922 6 5.560354 0.43964576721191406 0.19328840062735253 +923 6 5.761621 0.23837900161743164 0.056824548412123477 +928 5 5.72981834 0.72981834411621094 0.53263481540852808 +929 5 5.295482 0.29548215866088867 0.087309706086898586 +931 5 5.389781 0.38978099822998047 0.15192922658116004 +932 6 5.69497633 0.3050236701965332 0.093039439380163458 +933 5 5.538747 0.53874683380126953 0.29024815093089273 +939 7 5.803188 1.1968121528625488 1.4323593292394889 +941 6 5.732951 0.26704883575439453 0.071315080677777587 +942 7 5.749693 1.2503070831298828 1.5632678021247557 +943 7 6.44949245 0.55050754547119141 0.30305855762071587 +945 7 6.4388504 0.56114959716796875 0.3148888704017736 +946 5 5.1143384 0.11433839797973633 0.013073269252572572 +947 5 5.71162844 0.71162843704223633 0.50641503240717611 +948 4 4.53004 0.53003978729248047 0.28094217611305794 +949 5 5.905949 0.90594911575317383 0.82074380033395755 +951 6 5.823733 0.17626714706420898 0.031070107134155478 +952 6 6.14641857 0.14641857147216797 0.02143839807195036 +954 6 5.823733 0.17626714706420898 0.031070107134155478 +957 7 6.496833 0.50316715240478516 0.25317718325914029 +961 7 7.02436543 0.024365425109863281 0.00059367394078435609 +962 6 5.981644 0.018355846405029297 0.00033693709724502696 +963 6 6.624413 0.62441301345825195 0.38989161137601513 +966 6 5.28590059 0.71409940719604492 0.50993796335774277 +967 6 5.76070356 0.23929643630981445 0.057262784430577085 +973 7 6.95576334 0.044236660003662109 0.001956882088279599 +975 5 5.028304 0.028304100036621094 0.0008011220788830542 +977 5 6.259195 1.2591948509216309 1.5855716725875482 +978 7 6.75888824 0.24111175537109375 0.058134878578130156 +979 5 5.79845238 0.79845237731933594 0.63752619884689921 +981 7 6.75888824 0.24111175537109375 0.058134878578130156 +984 5 6.57471 1.5747098922729492 2.4797112448222833 +987 6 5.45699358 0.54300642013549805 0.29485597230836902 +988 5 6.57471 1.5747098922729492 2.4797112448222833 +990 6 5.941643 0.058356761932373047 0.003405511663231664 +991 4 4.65947 0.6594700813293457 0.43490078816853384 +993 4 5.050729 1.0507287979125977 1.1040310067628525 +996 5 4.98931551 0.010684490203857422 0.00011415833091632521 +1000 7 5.531526 1.4684739112854004 2.156415628125842 +1001 5 5.625949 0.62594890594482422 0.3918120328535224 +1003 7 5.821002 1.1789979934692383 1.39003626860449 +1005 6 6.94355631 0.94355630874633789 0.89029850777501451 +1008 7 5.755313 1.2446870803833008 1.5492459280731055 +1009 6 5.539026 0.46097421646118164 0.21249722824200035 +1010 6 5.8711915 0.12880849838256836 0.016591629255572116 +1011 7 6.22115 0.77885007858276367 0.60660744490837715 +1012 6 5.37709761 0.62290239334106445 0.38800739163002618 +1013 5 5.706299 0.706298828125 0.49885803461074829 +1014 5 6.018917 1.0189170837402344 1.0381920235377038 +1019 6 5.86288 0.13711977005004883 0.018801831338578268 +1020 7 6.04661751 0.95338249206542969 0.9089381761768891 +1022 8 6.47417259 1.5258274078369141 2.3281492785063165 +1023 6 5.778368 0.22163200378417969 0.049120745101390639 +1024 6 6.23468876 0.23468875885009766 0.055078813530599291 +1028 7 6.22779942 0.77220058441162109 0.59629374256564915 +1029 4 5.16414261 1.1641426086425781 1.3552280132571468 +1031 6 5.641769 0.3582310676574707 0.12832949783501135 +1035 6 6.0397377 0.039737701416015625 0.0015790849138284102 +1036 5 6.4997263 1.4997262954711914 2.2491789613277433 +1038 7 6.298605 0.70139503479003906 0.49195499482812011 +1041 5 5.75377655 0.75377655029296875 0.56817908777156845 +1042 4 5.44314528 1.4431452751159668 2.0826682850895395 +1043 5 5.344182 0.34418201446533203 0.11846125908141403 +1046 5 5.74131536 0.74131536483764648 0.54954847014437291 +1048 5 4.73738956 0.26261043548583984 0.068964240826062451 +1050 5 5.55853367 0.55853366851806641 0.31195985886824928 +1055 5 5.41344547 0.41344547271728516 0.17093715891041938 +1056 6 6.15539265 0.15539264678955078 0.024146874676262087 +1057 5 5.06872654 0.068726539611816406 0.0047233372470145696 +1062 5 5.54800034 0.54800033569335938 0.30030436792003457 +1063 5 5.465916 0.46591615676879883 0.21707786513820793 +1066 6 5.303662 0.69633817672729492 0.48488685636789342 +1067 7 6.23767567 0.76232433319091797 0.58113838897497772 +1070 7 5.98001146 1.0199885368347168 1.0403766152742264 +1073 5 5.61771059 0.61771059036254883 0.3815663734460486 +1078 5 5.622996 0.62299585342407227 0.38812383338358813 +1081 6 5.522897 0.47710323333740234 0.22762749526100379 +1087 8 6.06489849 1.9351015090942383 3.7446178504987984 +1089 7 5.919071 1.0809288024902344 1.1684070760529721 +1093 7 5.85336637 1.1466336250305176 1.3147686700506256 +1096 6 6.022913 0.022912979125976563 0.00052500461242743768 +1097 7 6.048806 0.95119380950927734 0.90476966324877139 +1102 5 6.4617486 1.4617486000061035 2.1367089696198036 +1104 5 5.21519136 0.21519136428833008 0.046307323264272782 +1105 7 6.68964672 0.31035327911376953 0.096319157856669335 +1106 8 7.11303139 0.88696861267089844 0.78671331986333826 +1107 7 6.73190355 0.2680964469909668 0.07187570488918027 +1108 7 6.457533 0.54246711730957031 0.29427057336215512 +1109 4 5.380625 1.3806247711181641 1.9061247586250829 +1110 7 6.73190355 0.2680964469909668 0.07187570488918027 +1111 6 6.65884066 0.65884065628051758 0.43407101036814311 +1113 5 6.05984068 1.0598406791687012 1.1232622652207738 +1114 4 4.139369 0.13936901092529297 0.019423721206294431 +1115 8 5.95124435 2.0487556457519531 4.1973996960005024 +1116 5 4.5486455 0.4513545036315918 0.20372088794852061 +1117 5 5.65911961 0.65911960601806641 0.43443865503741108 +1118 5 4.5486455 0.4513545036315918 0.20372088794852061 +1120 6 6.233022 0.23302221298217773 0.054299351743111401 +1121 6 5.3402257 0.6597743034362793 0.43530213147482755 +1123 5 5.054469 0.054469108581542969 0.0029668837896679179 +1124 5 5.44738436 0.44738435745239258 0.20015276329309017 +1127 7 6.207802 0.79219818115234375 0.62757795822108164 +1128 5 5.9157033 0.91570329666137695 0.83851252751651373 +1131 6 5.68809128 0.31190872192382813 0.09728705081215594 +1132 5 5.68820238 0.6882023811340332 0.4736225173985531 +1139 5 6.475313 1.4753131866455078 2.176548998690123 +1142 5 5.302902 0.3029022216796875 0.091749755898490548 +1145 5 5.27104568 0.27104568481445313 0.073465763256535865 +1149 5 5.626558 0.62655782699584961 0.39257471056976101 +1150 5 5.44962835 0.44962835311889648 0.20216565592841107 +1152 4 4.617794 0.61779403686523438 0.38166947198624257 +1154 4 5.561507 1.5615072250366211 2.4383048138415688 +1156 6 5.28412676 0.71587324142456055 0.51247449778770715 +1157 6 5.28412676 0.71587324142456055 0.51247449778770715 +1160 6 6.12439537 0.12439537048339844 0.015474208197701955 +1161 6 5.28412676 0.71587324142456055 0.51247449778770715 +1162 7 5.895931 1.1040692329406738 1.2189688711262079 +1163 6 5.38675928 0.61324071884155273 0.37606417924530433 +1167 6 5.6267643 0.37323570251464844 0.13930488963160315 +1171 5 4.62260342 0.37739658355712891 0.14242818128059298 +1172 6 6.08686447 0.086864471435546875 0.007545436397776939 +1173 5 6.14243841 1.1424384117126465 1.3051655245565144 +1176 7 5.70132732 1.2986726760864258 1.6865507196134786 +1178 5 4.72919655 0.27080345153808594 0.073334509364940459 +1179 5 5.89185 0.89184999465942383 0.79539641297401431 +1180 5 4.62260342 0.37739658355712891 0.14242818128059298 +1183 6 6.31216526 0.31216526031494141 0.097447149747495132 +1185 5 5.091198 0.091197967529296875 0.0083170692814746872 +1188 6 5.85175133 0.14824867248535156 0.021977668893669033 +1189 5 4.64966965 0.35033035278320313 0.12273135608120356 +1190 6 6.08686447 0.086864471435546875 0.007545436397776939 +1192 6 5.676918 0.32308197021484375 0.10438195947790518 +1193 7 5.63304329 1.3669567108154297 1.8685706492433383 +1194 6 5.49325037 0.50674962997436523 0.25679518747915608 +1196 7 6.384342 0.61565780639648438 0.37903453457693104 +1197 7 5.63304329 1.3669567108154297 1.8685706492433383 +1203 6 5.79636669 0.20363330841064453 0.041466524294264673 +1205 5 4.809882 0.19011783599853516 0.03614479156476591 +1209 6 6.37570572 0.37570571899414063 0.14115478728490416 +1211 5 5.21409225 0.21409225463867188 0.045835493496269919 +1215 5 5.92623568 0.92623567581176758 0.85791252714648181 +1217 5 4.785647 0.21435308456420898 0.045947244862190928 +1219 8 6.444028 1.5559720993041992 2.4210491738131168 +1222 6 5.445072 0.55492782592773438 0.30794489198888186 +1223 5 5.92623568 0.92623567581176758 0.85791252714648181 +1224 7 6.926713 0.073287010192871094 0.0053709858630099916 +1225 6 6.43942976 0.43942975997924805 0.19309851395541955 +1226 7 6.926713 0.073287010192871094 0.0053709858630099916 +1227 5 5.9939723 0.9939723014831543 0.98798093611571858 +1228 6 5.81761837 0.18238162994384766 0.033263058940974588 +1230 6 5.57155275 0.42844724655151367 0.18356704307757354 +1235 5 5.28322 0.28321981430053711 0.080213463212430725 +1236 6 6.43942976 0.43942975997924805 0.19309851395541955 +1237 5 6.46537447 1.4653744697570801 2.1473223366158436 +1239 5 4.89298248 0.10701751708984375 0.011452748964074999 +1241 7 6.052218 0.94778203964233398 0.89829079466858275 +1242 7 6.815272 0.18472814559936523 0.034124487776580281 +1244 5 5.30364943 0.3036494255065918 0.092202973610483241 +1245 4 4.78280544 0.78280544281005859 0.61278436129305192 +1247 6 6.118482 0.11848211288452148 0.014038011073580492 +1250 7 5.700158 1.2998418807983398 1.6895889150773655 +1252 6 5.364317 0.63568305969238281 0.40409295237986953 +1256 6 5.792476 0.20752382278442383 0.043066137023060946 +1258 6 5.448007 0.55199289321899414 0.30469615416427587 +1262 6 5.792476 0.20752382278442383 0.043066137023060946 +1264 5 5.94851971 0.94851970672607422 0.89968963404771785 +1267 7 5.84828329 1.1517167091369629 1.3264513781052756 +1270 7 5.84828329 1.1517167091369629 1.3264513781052756 +1271 5 5.750962 0.7509617805480957 0.56394359584396625 +1272 5 5.325394 0.3253941535949707 0.10588135519378739 +1273 5 5.750962 0.7509617805480957 0.56394359584396625 +1275 6 5.57314968 0.42685031890869141 0.18220119475245156 +1276 7 5.84828329 1.1517167091369629 1.3264513781052756 +1278 6 5.582913 0.41708707809448242 0.17396163071339288 +1279 6 5.870985 0.12901496887207031 0.016644862193061272 +1283 8 7.097483 0.90251684188842773 0.81453664989226127 +1284 7 6.70399857 0.29600143432617188 0.087616849123151042 +1286 7 5.92860174 1.0713982582092285 1.1478942276937687 +1287 7 6.18289757 0.81710243225097656 0.66765638479046174 +1288 7 6.390159 0.60984086990356445 0.37190588660473622 +1289 6 6.822798 0.82279777526855469 0.67699617898688302 +1292 6 6.85950375 0.85950374603271484 0.73874668944426958 +1294 4 5.04547739 1.0454773902893066 1.0930229736061392 +1295 6 5.91815662 0.081843376159667969 0.0066983382212129072 +1298 6 6.40000439 0.40000438690185547 0.16000350954072928 +1299 5 5.940148 0.94014787673950195 0.88387803013779376 +1303 6 5.843109 0.156890869140625 0.024614744819700718 +1304 5 5.16638374 0.16638374328613281 0.027683550029905746 +1305 7 5.97077465 1.0292253494262695 1.0593048199016266 +1307 5 5.20232058 0.20232057571411133 0.040933615357289455 +1309 6 5.4209795 0.57902050018310547 0.33526473963229364 +1310 6 5.561529 0.43847084045410156 0.19225667792852619 +1311 6 5.60187 0.39812994003295898 0.15850744915064752 +1312 5 5.23645258 0.23645257949829102 0.055909822351395633 +1315 6 5.977113 0.022887229919433594 0.00052382529338501627 +1316 6 5.794509 0.20549106597900391 0.042226578197187337 +1317 5 6.033325 1.0333251953125 1.0677609592676163 +1318 6 6.41278648 0.41278648376464844 0.17039268117878237 +1319 5 5.517551 0.51755094528198242 0.26785898096227356 +1321 6 6.57573557 0.57573556900024414 0.33147144541203488 +1322 6 6.117485 0.11748504638671875 0.013802736124489456 +1326 6 5.27129364 0.72870635986328125 0.53101295890519395 +1329 5 5.212231 0.21223115921020508 0.045042064939707416 +1332 7 5.65819645 1.3418035507202148 1.8004367687253762 +1333 8 7.320398 0.67960214614868164 0.46185907704989404 +1335 6 5.220176 0.77982378005981445 0.60812512794677787 +1339 6 5.988458 0.011541843414306641 0.00013321414940037357 +1342 6 5.988458 0.011541843414306641 0.00013321414940037357 +1343 6 6.080612 0.0806121826171875 0.0064983239863067865 +1347 7 6.320307 0.67969322204589844 0.461982876095135 +1349 4 5.433452 1.4334521293640137 2.054785007178225 +1351 7 6.73481274 0.26518726348876953 0.070324284716662078 +1352 6 5.220176 0.77982378005981445 0.60812512794677787 +1353 5 5.60115767 0.60115766525268555 0.36139053849205993 +1357 6 5.43090153 0.56909847259521484 0.3238730715102065 +1358 8 6.70303535 1.2969646453857422 1.682117291380564 +1359 7 6.42182732 0.57817268371582031 0.33428365219515399 +1360 6 5.811853 0.18814706802368164 0.035399319205907886 +1362 7 6.01781368 0.98218631744384766 0.96468996217390668 +1364 5 5.5021925 0.50219249725341797 0.25219730429762421 +1368 6 6.07387352 0.073873519897460938 0.005457296942040557 +1369 5 5.11232948 0.11232948303222656 0.012617912758287275 +1371 7 6.37426662 0.62573337554931641 0.39154225727634184 +1374 7 6.685261 0.31473922729492188 0.099060781198204495 +1376 6 5.576482 0.42351818084716797 0.17936764950809447 +1377 6 5.5179 0.48210000991821289 0.23242041956314097 +1378 7 6.305254 0.69474601745605469 0.48267202877104864 +1385 5 5.41952467 0.4195246696472168 0.17600094844260639 +1387 6 6.671762 0.67176198959350586 0.45126417066262547 +1390 6 6.13112974 0.13112974166870117 0.017195009150100304 +1391 6 6.25453854 0.25453853607177734 0.064789866345563496 +1392 6 6.671762 0.67176198959350586 0.45126417066262547 +1396 7 6.07236338 0.92763662338256836 0.86050970504061297 +1397 7 6.44414234 0.55585765838623047 0.30897773638662329 +1399 6 6.28654957 0.28654956817626953 0.08211065502200654 +1401 6 4.96816349 1.0318365097045898 1.0646865827593501 +1402 8 6.401021 1.5989789962768555 2.5567338305345402 +1405 4 4.93992 0.93991994857788086 0.8834495097346462 +1410 6 6.77783632 0.77783632278442383 0.60502934504279438 +1412 8 6.74131536 1.2586846351623535 1.584287010793787 +1414 6 6.098223 0.098223209381103516 0.0096477988611241017 +1415 5 4.419557 0.58044290542602539 0.33691396645940586 +1417 3 5.175881 2.1758809089660645 4.7344577300029869 +1418 5 5.22850561 0.22850561141967773 0.052214814450280755 +1422 5 5.371983 0.37198305130004883 0.13837139045449476 +1423 4 5.391678 1.3916778564453125 1.9367672561202198 +1428 7 6.444281 0.55571889877319336 0.30882349445369073 +1429 5 5.612692 0.61269187927246094 0.37539133892641985 +1430 4 4.96963263 0.96963262557983398 0.94018742858884252 +1432 7 6.47275925 0.52724075317382813 0.27798281180730555 +1433 6 6.397414 0.39741420745849609 0.15793805228986457 +1435 5 6.0038023 1.0038022994995117 1.0076190564805074 +1441 5 5.365135 0.36513519287109375 0.13332370907301083 +1444 6 6.2645 0.26450014114379883 0.069960324665089502 +1445 6 5.902387 0.097612857818603516 0.0095282700115149055 +1446 6 6.31714964 0.31714963912963867 0.10058389360006004 +1448 6 5.80783939 0.19216060638427734 0.036925698645973171 +1449 6 6.078127 0.078126907348632813 0.0061038136518618558 +1450 6 6.2645 0.26450014114379883 0.069960324665089502 +1451 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1452 6 6.2645 0.26450014114379883 0.069960324665089502 +1453 7 6.87757158 0.12242841720581055 0.014988717339520008 +1454 5 5.756866 0.7568659782409668 0.57284610901865562 +1455 5 5.01117373 0.011173725128173828 0.00012485213323998323 +1466 6 6.078127 0.078126907348632813 0.0061038136518618558 +1467 7 6.7072196 0.29278039932250977 0.085720362227448277 +1468 5 5.14014864 0.14014863967895508 0.019641641203861582 +1469 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1472 5 5.114336 0.11433601379394531 0.013072724050289253 +1473 6 6.27588654 0.27588653564453125 0.076113380549941212 +1475 6 5.69343758 0.30656242370605469 0.093980519628530601 +1476 5 5.377952 0.37795209884643555 0.14284778902242579 +1477 6 5.12870932 0.87129068374633789 0.75914745558316099 +1479 6 5.97060442 0.029395580291748047 0.00086410014068860619 +1481 6 5.87255526 0.12744474411010742 0.01624216280129076 +1483 4 5.11274862 1.1127486228942871 1.2382094977531324 +1487 6 5.67100143 0.32899856567382813 0.1082400562154362 +1490 6 6.281177 0.28117704391479492 0.079060530024662512 +1491 5 5.67186 0.6718602180480957 0.4513961525956347 +1493 8 7.152326 0.84767389297485352 0.71855102883114341 +1496 5 3.60124254 1.3987574577331543 1.9565224255641169 +1497 7 6.07676363 0.92323637008666992 0.85236539505081055 +1499 6 6.293631 0.29363107681274414 0.08621920927021165 +1500 7 6.680092 0.31990814208984375 0.10234121937537566 +1501 5 5.673793 0.67379283905029297 0.45399678995545401 +1504 8 6.313339 1.6866607666015625 2.8448245415929705 +1507 6 5.803581 0.19641876220703125 0.038580330146942288 +1512 7 6.51168633 0.48831367492675781 0.2384502451204753 +1513 6 6.43545341 0.43545341491699219 0.18961967656287015 +1515 6 6.255807 0.25580692291259766 0.06543718181001168 +1516 6 5.870338 0.12966203689575195 0.016812243811955341 +1517 6 5.82861662 0.17138338088989258 0.029372263245249997 +1520 6 5.817548 0.18245220184326172 0.033288805957454315 +1526 6 5.99440527 0.0055947303771972656 3.1301007993533858E-05 +1527 6 6.2122364 0.21223640441894531 0.045044291360682109 +1530 5 5.113673 0.11367321014404297 0.012921598704451753 +1532 7 5.49979448 1.5002055168151855 2.250616592682718 +1533 6 6.35571957 0.35571956634521484 0.1265364098808277 +1538 6 5.86379766 0.13620233535766602 0.018551076156882118 +1540 6 6.057325 0.057324886322021484 0.0032861425918326859 +1542 6 6.2134366 0.21343660354614258 0.045555183733313243 +1543 6 6.21323347 0.21323347091674805 0.045468513119203635 +1549 6 5.80053139 0.19946861267089844 0.039787727440852905 +1551 6 5.668514 0.33148622512817383 0.10988311744972634 +1552 7 6.59583855 0.40416145324707031 0.1633464802907838 +1554 7 6.49526739 0.50473260879516602 0.2547550063811741 +1559 4 5.70196152 1.7019615173339844 2.8966730064857984 +1560 6 6.42826653 0.42826652526855469 0.18341221666560159 +1561 5 4.75953627 0.2404637336730957 0.0578228072120055 +1562 7 6.818427 0.18157291412353516 0.032968723143312673 +1564 5 4.75953627 0.2404637336730957 0.0578228072120055 +1567 5 5.400646 0.40064620971679688 0.16051738536043558 +1569 5 5.62976 0.62975978851318359 0.39659739122816973 +1571 6 5.641856 0.35814380645751953 0.12826698610388121 +1572 6 5.927081 0.072918891906738281 0.0053171647969065816 +1573 5 5.42326546 0.42326545715332031 0.17915364721920923 +1576 6 5.35206366 0.64793634414672852 0.41982150606622781 +1578 5 5.85142469 0.8514246940612793 0.72492400965734305 +1580 5 4.616376 0.38362407684326172 0.14716743233384477 +1581 6 6.01939154 0.019391536712646484 0.00037603169607791642 +1585 5 5.148195 0.14819478988647461 0.021961695749496357 +1587 6 5.495188 0.50481176376342773 0.25483491683394277 +1588 5 5.148195 0.14819478988647461 0.021961695749496357 +1589 6 6.458008 0.4580078125 0.20977115631103516 +1592 6 6.190008 0.19000816345214844 0.036103102178458357 +1596 5 6.11365128 1.1136512756347656 1.2402191637229407 +1597 6 5.53800058 0.46199941635131836 0.21344346070895881 +1598 6 5.62568235 0.37431764602661133 0.1401137001269035 +1599 6 5.89610243 0.1038975715637207 0.010794705376838465 +1600 6 5.408455 0.59154510498046875 0.34992561122635379 +1603 7 5.886322 1.113677978515625 1.2402786398306489 +1607 7 5.848945 1.151054859161377 1.3249272887990173 +1609 7 6.117519 0.88248109817504883 0.77877288863624017 +1610 6 6.04807568 0.048075675964355469 0.0023112706194297061 +1613 7 6.5623827 0.43761730194091797 0.19150890295804857 +1616 6 5.323467 0.67653322219848633 0.45769720073826647 +1617 6 5.734267 0.26573276519775391 0.07061390249964461 +1619 8 6.94580841 1.0541915893554688 1.1113199070678093 +1621 5 4.691925 0.308074951171875 0.094910175539553165 +1623 6 5.742188 0.2578120231628418 0.066467039287317675 +1626 6 5.93749475 0.062505245208740234 0.003906905678604744 +1628 6 5.542873 0.45712709426879883 0.20896518031463529 +1629 6 5.527357 0.47264289855957031 0.22339130955879227 +1632 8 7.01878834 0.98121166229248047 0.96277632621877274 +1633 7 6.146297 0.85370302200317383 0.7288088497773515 +1634 6 5.76403952 0.23596048355102539 0.055677349797633724 +1636 5 5.08614254 0.086142539978027344 0.0074205371938660392 +1639 5 5.69386959 0.69386959075927734 0.48145500898044702 +1641 6 5.7167654 0.28323459625244141 0.080221836514283495 +1642 7 5.635858 1.3641419410705566 1.860883235387746 +1644 7 5.635858 1.3641419410705566 1.860883235387746 +1646 6 5.7167654 0.28323459625244141 0.080221836514283495 +1647 7 6.595718 0.4042820930480957 0.16344401075934911 +1651 6 5.04891062 0.95108938217163086 0.9045710128796145 +1653 6 5.019502 0.98049783706665039 0.9613760084923797 +1654 5 4.9331913 0.066808700561523438 0.0044634024707193021 +1655 5 5.45447063 0.45447063446044922 0.20654355758688325 +1656 5 5.669732 0.66973209381103516 0.4485410774805132 +1657 6 6.788385 0.78838491439819336 0.62155077325064667 +1658 5 5.26004457 0.26004457473754883 0.067623180850432618 +1659 5 5.377065 0.37706518173217773 0.14217815127472022 +1660 6 5.44472837 0.55527162551879883 0.30832657810628916 +1663 6 5.019502 0.98049783706665039 0.9613760084923797 +1664 4 5.48985672 1.4898567199707031 2.2196730460418621 +1665 8 6.362209 1.6377911567687988 2.6823598731900802 +1667 6 5.853944 0.14605617523193359 0.021332406323381292 +1668 7 5.82933331 1.1706666946411133 1.3704605099419496 +1669 6 5.130034 0.86996603012084961 0.75684089356423101 +1673 5 5.570712 0.57071208953857422 0.32571228914548556 +1674 6 5.60828924 0.39171075820922852 0.15343731809684868 +1677 6 6.09377146 0.093771457672119141 0.0087930862739540316 +1679 5 5.491922 0.49192190170288086 0.24198715737497878 +1680 5 5.252373 0.25237321853637695 0.06369224143440988 +1681 6 6.32914257 0.32914257049560547 0.10833483171245462 +1684 7 6.160416 0.8395838737487793 0.70490108105900617 +1685 7 6.60589075 0.39410924911499023 0.15532210023798143 +1688 3 5.280151 2.2801508903503418 5.1990880827654564 +1690 4 4.54363966 0.5436396598815918 0.29554407979617281 +1697 6 6.475748 0.47574806213378906 0.22633621862405562 +1699 6 6.27966833 0.27966833114624023 0.078214375446123086 +1701 5 5.80198145 0.80198144912719727 0.6431742447441593 +1702 4 4.358819 0.35881900787353516 0.12875108041134808 +1704 5 5.21234035 0.21234035491943359 0.045088426327311026 +1706 6 5.9945097 0.0054903030395507813 3.0143427466100547E-05 +1707 5 5.331367 0.33136701583862305 0.10980409918579426 +1709 5 5.9493103 0.949310302734375 0.90119005087763071 +1711 5 6.35904932 1.3590493202209473 1.8470150547930189 +1713 6 5.38475227 0.61524772644042969 0.3785297648901178 +1714 5 5.44625664 0.44625663757324219 0.19914498657817603 +1715 8 6.32466841 1.6753315925598145 2.8067359450290041 +1716 6 6.47190332 0.47190332412719727 0.2226927473222986 +1719 6 5.64309549 0.35690450668334961 0.12738082689088515 +1720 7 6.133768 0.86623191833496094 0.75035773634226643 +1721 7 5.710882 1.2891178131103516 1.6618247360784153 +1723 8 6.32466841 1.6753315925598145 2.8067359450290041 +1724 6 6.21978569 0.21978569030761719 0.048305749663995812 +1725 6 5.76422739 0.23577260971069336 0.055588723489790937 +1728 5 5.44625664 0.44625663757324219 0.19914498657817603 +1731 6 5.48901033 0.51098966598510742 0.26111043874357165 +1734 6 5.853075 0.14692497253417969 0.021586947554169456 +1735 6 6.83932734 0.83932733535766602 0.70447037587859995 +1736 5 5.51393652 0.51393651962280273 0.2641307462019995 +1739 4 4.88872051 0.88872051239013672 0.78982414914298715 +1740 6 5.182924 0.81707620620727539 0.66761352675007402 +1743 6 5.31297255 0.6870274543762207 0.47200672306667002 +1744 5 5.49808359 0.49808359146118164 0.2480872640828693 +1746 5 5.721136 0.72113609313964844 0.52003726482871571 +1747 6 5.31297255 0.6870274543762207 0.47200672306667002 +1748 5 5.6907835 0.69078350067138672 0.47718184479981574 +1749 6 6.03195 0.031949996948242188 0.0010208023049926851 +1753 7 6.0383625 0.96163749694824219 0.9247466755368805 +1754 6 6.89634943 0.89634943008422852 0.80344230081232126 +1755 6 5.46218824 0.5378117561340332 0.2892414850359728 +1756 5 4.970864 0.029136180877685547 0.00084891703613720892 +1758 5 5.600766 0.60076618194580078 0.36092000536973501 +1765 5 5.022516 0.022515773773193359 0.00050696006860562193 +1767 5 5.19753265 0.19753265380859375 0.039019149320665747 +1768 5 5.18421936 0.1842193603515625 0.033936772728338838 +1772 6 5.92966461 0.07033538818359375 0.0049470668309368193 +1773 6 6.00829 0.0082898139953613281 6.8721016077688546E-05 +1774 6 6.18911743 0.189117431640625 0.03576540295034647 +1775 6 6.62580347 0.62580347061157227 0.39162998382948899 +1776 5 6.09891748 1.0989174842834473 1.2076196372638606 +1779 8 6.89703655 1.1029634475708008 1.2165283666772666 +1783 6 4.682983 1.3170170783996582 1.7345339847963714 +1784 7 6.949775 0.050224781036376953 0.00252252863015201 +1785 6 6.21301842 0.21301841735839844 0.045376846133876825 +1788 5 6.638938 1.6389379501342773 2.686117604390347 +1789 7 6.133875 0.86612510681152344 0.75017270064927288 +1794 5 5.16400242 0.16400241851806641 0.026896793279775011 +1795 6 5.117132 0.88286781311035156 0.77945557542625465 +1800 6 5.411709 0.58829116821289063 0.34608649859728757 +1801 5 5.03533125 0.035331249237060547 0.0012482971726512915 +1802 6 6.0186944 0.018694400787353516 0.00034948062079820374 +1803 6 5.90830851 0.091691493988037109 0.0084073300697582454 +1805 5 5.02972 0.029719829559326172 0.00088326826903539768 +1810 6 5.339474 0.66052579879760742 0.43629433087721736 +1812 6 6.510603 0.51060295104980469 0.26071537362076924 +1814 7 6.66430044 0.33569955825805664 0.11269419341465436 +1816 7 6.76522 0.23477983474731445 0.055121570803976283 +1817 4 4.97468042 0.97468042373657227 0.95000192841530406 +1818 6 6.40402842 0.40402841567993164 0.16323896067683563 +1821 5 5.90967035 0.90967035293579102 0.82750015101032659 +1823 6 5.56408072 0.43591928482055664 0.19002562287846558 +1824 5 5.042905 0.042904853820800781 0.0018408264813842834 +1825 5 5.518146 0.51814603805541992 0.26847531675252867 +1826 5 5.042905 0.042904853820800781 0.0018408264813842834 +1827 6 5.56408072 0.43591928482055664 0.19002562287846558 +1828 6 5.545804 0.45419597625732422 0.20629398484834383 +1829 7 6.212104 0.78789615631103516 0.62078035312970314 +1830 7 6.212104 0.78789615631103516 0.62078035312970314 +1831 7 6.59027052 0.4097294807434082 0.16787824739026291 +1832 7 6.212104 0.78789615631103516 0.62078035312970314 +1835 5 5.389878 0.3898777961730957 0.15200469594878996 +1836 6 6.027217 0.027216911315917969 0.00074076026157854358 +1841 7 6.989911 0.010088920593261719 0.00010178631873714039 +1843 6 6.90099573 0.90099573135375977 0.81179330791769644 +1844 6 6.373012 0.37301206588745117 0.13913800129762421 +1845 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1847 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1854 7 5.83561754 1.1643824577331543 1.3557865078767009 +1858 5 4.889405 0.1105952262878418 0.012231304077658933 +1859 6 5.98256636 0.017433643341064453 0.00030393192014344095 +1861 6 5.883474 0.11652612686157227 0.013578338241359234 +1862 7 6.15355825 0.84644174575805664 0.7164636289619466 +1863 5 5.2479043 0.24790430068969727 0.061456542300447836 +1866 6 5.2747364 0.72526359558105469 0.52600728307515965 +1867 6 6.31448936 0.31448936462402344 0.098903560461621964 +1868 7 6.509657 0.49034309387207031 0.24043634970803396 +1871 6 6.063482 0.063481807708740234 0.004029939909969471 +1873 5 5.26915 0.2691497802734375 0.072441604221239686 +1874 5 6.16405 1.1640501022338867 1.3550126405107221 +1876 6 6.09814024 0.098140239715576172 0.0096315066514307546 +1877 6 5.8294735 0.17052650451660156 0.029079288742650533 +1878 6 5.96899843 0.031001567840576172 0.00096109720857384673 +1879 6 5.671555 0.3284449577331543 0.10787609026033351 +1883 5 5.34378052 0.343780517578125 0.11818504426628351 +1884 5 6.07482862 1.0748286247253418 1.1552565725289696 +1885 6 5.671555 0.3284449577331543 0.10787609026033351 +1887 5 6.237499 1.2374992370605469 1.5314043617254356 +1888 5 6.03254032 1.0325403213500977 1.0661395152137629 +1889 5 5.779849 0.77984905242919922 0.60816454457471991 +1890 5 5.34378052 0.343780517578125 0.11818504426628351 +1892 5 5.42887926 0.4288792610168457 0.18393742053035567 +1894 5 5.260407 0.2604069709777832 0.067811790533824023 +1899 7 6.92687559 0.073124408721923828 0.0053471791509309696 +1900 6 5.50394869 0.49605131149291992 0.24606690363384587 +1901 5 5.78969 0.78969001770019531 0.62361032405533479 +1902 6 5.770987 0.22901296615600586 0.052446938667571885 +1903 5 5.426101 0.4261012077331543 0.18156223923165271 +1905 6 5.591873 0.4081268310546875 0.16656751022674143 +1906 5 5.753492 0.75349187850952148 0.56775001097980748 +1917 6 5.890733 0.10926723480224609 0.01193932860132918 +1919 6 5.31168365 0.68831634521484375 0.47377939108991995 +1921 5 5.53998232 0.53998231887817383 0.2915809047010498 +1924 4 5.33742476 1.3374247550964355 1.7887049755447606 +1928 6 5.972093 0.027906894683837891 0.00077879477089481952 +1932 6 4.882628 1.1173720359802246 1.2485202667905924 +1934 6 5.90029144 0.09970855712890625 0.0099417963647283614 +1935 5 5.31565857 0.3156585693359375 0.099640332395210862 +1936 6 5.893681 0.10631895065307617 0.011303719267971246 +1937 7 5.95812225 1.0418777465820313 1.0855092388228513 +1939 5 5.204067 0.20406723022460938 0.041643434451543726 +1942 5 4.610965 0.38903522491455078 0.15134840622431511 +1945 6 5.78697824 0.21302175521850586 0.045378268196373028 +1947 5 5.06945372 0.069453716278076172 0.004823818704835503 +1954 5 5.205833 0.20583295822143555 0.042367206690187231 +1956 5 5.56439972 0.56439971923828125 0.3185470430762507 +1957 6 5.642328 0.35767221450805664 0.12792941303109728 +1958 6 5.27635431 0.72364568710327148 0.5236630804631659 +1961 5 5.182421 0.18242120742797852 0.033277496919481564 +1962 5 5.22548151 0.22548151016235352 0.050841911425095532 +1963 6 5.27635431 0.72364568710327148 0.5236630804631659 +1964 5 5.29695 0.29694986343383789 0.088179221393374974 +1965 6 5.109696 0.8903040885925293 0.79264137016457425 +1967 7 5.887322 1.112678050994873 1.2380524451657493 +1968 6 6.275273 0.27527284622192383 0.075775139867118924 +1971 7 6.79392147 0.20607852935791016 0.042468360262319038 +1973 5 5.14016438 0.14016437530517578 0.01964605210469017 +1976 5 5.727278 0.72727823257446289 0.52893362757663454 +1981 8 7.917678 0.082322120666503906 0.0067769315510304295 +1983 8 7.917678 0.082322120666503906 0.0067769315510304295 +1987 5 6.051807 1.0518069267272949 1.1062978111115171 +1988 6 5.8307457 0.16925430297851563 0.028647019076743163 +1991 8 7.917678 0.082322120666503906 0.0067769315510304295 +1994 6 5.769981 0.23001909255981445 0.052908782942040489 +1995 6 5.94961 0.050389766693115234 0.0025391285873865854 +1999 6 6.65559149 0.65559148788452148 0.42980019898664068 +2000 5 5.357441 0.35744094848632813 0.12776403165480588 +2006 6 5.94961 0.050389766693115234 0.0025391285873865854 +2009 7 6.79772854 0.20227146148681641 0.040913744132012653 +2010 6 6.05053043 0.050530433654785156 0.0025533247253406444 +2012 5 6.21455526 1.2145552635192871 1.475144488142405 +2013 6 5.76146269 0.23853731155395508 0.056900049003388631 +2014 5 6.133267 1.1332669258117676 1.2842939251388543 +2015 6 6.11094332 0.11094331741333008 0.012308419678674909 +2016 7 6.91747046 0.082529544830322266 0.0068111257699001726 +2017 5 6.133267 1.1332669258117676 1.2842939251388543 +2018 7 5.97948074 1.0205192565917969 1.0414595530746737 +2020 6 6.263805 0.26380491256713867 0.069593031894555679 +2021 6 5.830813 0.16918706893920898 0.028624264296240653 +2023 6 5.830813 0.16918706893920898 0.028624264296240653 +2026 5 4.90337944 0.096620559692382813 0.0093355325552693103 +2030 6 5.54503059 0.45496940612792969 0.20699716051240102 +2033 5 6.1886487 1.1886487007141113 1.412885733709345 +2036 6 5.323167 0.67683315277099609 0.45810311668992654 +2040 6 5.88102674 0.1189732551574707 0.014154635442764629 +2041 5 5.21115 0.21115016937255859 0.044584394026060181 +2042 6 5.5706563 0.42934370040893555 0.1843360130808378 +2044 6 5.277161 0.7228388786315918 0.5224960444613771 +2045 5 5.605945 0.60594511032104492 0.3671694767219833 +2046 5 5.02834129 0.028341293334960938 0.00080322890789830126 +2047 5 5.283352 0.28335189819335938 0.080288298209779896 +2049 7 5.77500868 1.2249913215637207 1.500603737906431 +2053 5 6.44825459 1.4482545852661133 2.0974413437443218 +2054 5 6.44825459 1.4482545852661133 2.0974413437443218 +2055 6 5.996897 0.0031027793884277344 9.6272399332519853E-06 +2056 5 5.142752 0.14275217056274414 0.020378182200374795 +2059 5 5.23273373 0.23273372650146484 0.054164987451258639 +2068 6 6.51137161 0.51137161254882813 0.26150092612078879 +2072 5 5.86525726 0.86525726318359375 0.74867013149196282 +2075 5 5.43223667 0.43223667144775391 0.18682854014423356 +2077 6 5.75369072 0.24630928039550781 0.060668261608952889 +2081 5 5.72838259 0.72838258743286133 0.53054119367538988 +2083 5 4.76489258 0.235107421875 0.055275499820709229 +2088 6 5.42661333 0.57338666915893555 0.32877227236917861 +2092 5 4.94481134 0.055188655853271484 0.0030457877348908369 +2093 5 5.41896248 0.41896247863769531 0.1755295585062413 +2095 5 5.394303 0.3943028450012207 0.15547473357605668 +2098 6 5.387457 0.61254310607910156 0.37520905680503347 +2100 5 5.62809563 0.62809562683105469 0.39450411644429551 +2101 6 6.321963 0.32196283340454102 0.10366006609388023 +2105 5 4.7825017 0.2174983024597168 0.04730551157285845 +2107 6 6.202732 0.20273208618164063 0.041100298767560162 +2108 6 5.387457 0.61254310607910156 0.37520905680503347 +2109 6 5.90480042 0.0951995849609375 0.0090629609767347574 +2117 5 5.76381731 0.76381731033325195 0.58341688356472332 +2119 4 5.78921556 1.7892155647277832 3.2012923370641602 +2126 5 4.936701 0.063299179077148438 0.0040067860718409065 +2127 5 4.90092373 0.099076271057128906 0.009816107486585679 +2130 5 6.140603 1.1406030654907227 1.3009753530068338 +2133 6 6.445718 0.44571781158447266 0.19866436756365147 +2135 5 5.743049 0.74304914474487305 0.5521220315060873 +2138 5 5.635716 0.63571596145629883 0.40413478365030642 +2140 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2141 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2144 6 6.080732 0.080731868743896484 0.0065176346308817301 +2145 6 5.74060965 0.25939035415649414 0.067283355829431457 +2149 6 6.53114653 0.53114652633666992 0.28211663243951079 +2151 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2153 6 5.755437 0.24456310272216797 0.059811111213093682 +2154 4 4.18521452 0.18521451950073242 0.034304418233887191 +2155 5 6.15803671 1.1580367088317871 1.3410490190019573 +2156 4 6.28683329 2.2868332862854004 5.229606479262884 +2159 4 5.38970137 1.3897013664245605 1.9312698878422907 +2160 6 6.376475 0.37647485733032227 0.1417333182018865 +2163 6 6.237965 0.23796510696411133 0.056627392132440946 +2164 5 5.71715 0.71715021133422852 0.51430442561672862 +2165 5 5.130902 0.13090181350708008 0.017135284779442372 +2169 7 6.87379265 0.12620735168457031 0.015928295619232813 +2170 7 6.87379265 0.12620735168457031 0.015928295619232813 +2175 7 6.838287 0.1617131233215332 0.026151134254405406 +2177 7 4.953657 2.0463428497314453 4.1875190586470126 +2178 5 5.037093 0.037093162536621094 0.0013759027069681906 +2180 6 5.44559526 0.55440473556518555 0.30736461081710331 +2181 6 5.98071527 0.019284725189208984 0.0003719006256233115 +2183 5 5.60916948 0.60916948318481445 0.37108745924365394 +2185 7 5.64677954 1.3532204627990723 1.8312056209381353 +2187 5 5.58004 0.58003997802734375 0.33644637610996142 +2188 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2190 6 6.555541 0.55554103851318359 0.30862584547230654 +2191 5 5.58781052 0.58781051635742188 0.34552120314037893 +2193 6 5.92142963 0.078570365905761719 0.0061733023985652835 +2194 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2195 5 5.58004 0.58003997802734375 0.33644637610996142 +2196 6 5.494919 0.5050811767578125 0.25510699511505663 +2199 6 5.91814041 0.081859588623046875 0.0067009922495344654 +2200 5 5.42772627 0.42772626876831055 0.18294976099446103 +2207 7 6.20115471 0.79884529113769531 0.63815379917286918 +2208 5 6.01227665 1.0122766494750977 1.0247040150725297 +2212 6 6.209624 0.20962381362915039 0.043942143240428777 +2213 6 6.27866745 0.27866744995117188 0.077655547662288882 +2214 5 6.01227665 1.0122766494750977 1.0247040150725297 +2217 6 5.81703329 0.18296670913696289 0.03347681665240998 +2218 6 5.859478 0.14052200317382813 0.019746433375985362 +2220 6 5.89436436 0.10563564300537109 0.011158889073158207 +2221 6 5.753357 0.24664306640625 0.060832802206277847 +2223 6 5.88092756 0.11907243728637695 0.014178245321318173 +2225 4 5.87550926 1.8755092620849609 3.5175349921664747 +2228 7 6.017545 0.98245477676391602 0.96521738838623605 +2229 6 6.303792 0.30379199981689453 0.092289579152748047 +2230 7 6.017545 0.98245477676391602 0.96521738838623605 +2231 6 6.303792 0.30379199981689453 0.092289579152748047 +2234 5 5.575778 0.57577800750732422 0.3315203139291043 +2236 5 5.2704854 0.27048540115356445 0.073162352237204686 +2237 4 5.158827 1.1588268280029297 1.3428796172993316 +2242 5 5.53293753 0.53293752670288086 0.28402240736818385 +2243 5 6.28247452 1.2824745178222656 1.6447408888634527 +2244 5 5.33255053 0.3325505256652832 0.11058985212025618 +2246 4 5.158827 1.1588268280029297 1.3428796172993316 +2248 6 5.680154 0.31984615325927734 0.10230156175475713 +2249 5 5.066627 0.066627025604248047 0.0044391605408691248 +2250 6 4.959182 1.0408182144165039 1.0833025554611595 +2251 7 6.41361332 0.58638668060302734 0.3438493391886368 +2256 5 5.84614134 0.84614133834838867 0.71595516446200236 +2257 6 5.53059244 0.46940755844116211 0.22034345592169302 +2261 6 5.198945 0.80105495452880859 0.6416890401751516 +2262 6 5.498481 0.50151920318603516 0.25152151116435562 +2263 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2264 6 6.58286762 0.58286762237548828 0.33973466521365481 +2265 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2268 6 5.49432945 0.50567054748535156 0.25570270259413519 +2269 6 5.713871 0.28612899780273438 0.081869803383597173 +2277 6 6.468116 0.46811580657958984 0.21913240836965997 +2279 5 5.187639 0.18763923645019531 0.035208483055612305 +2281 6 5.578538 0.42146205902099609 0.17763026719421759 +2286 5 5.24503756 0.24503755569458008 0.060043403700774434 +2288 5 5.06648064 0.066480636596679688 0.0044196750422997866 +2294 7 7.13601 0.13601016998291016 0.018498766338780115 +2301 5 5.900166 0.90016603469848633 0.81029889002479649 +2302 5 5.0114007 0.011400699615478516 0.00012997595172237197 +2303 5 5.16666365 0.16666364669799805 0.027776771130675115 +2305 7 6.700686 0.29931402206420898 0.089588883804253783 +2307 5 5.45757151 0.45757150650024414 0.20937168356090297 +2308 5 5.029569 0.029569149017333984 0.00087433457360930333 +2309 6 5.427362 0.57263803482055664 0.32791431892314904 +2312 5 5.029569 0.029569149017333984 0.00087433457360930333 +2313 7 6.80353832 0.19646167755126953 0.038597190746259002 +2316 7 6.64999628 0.35000371932983398 0.1225026035447172 +2320 6 6.219693 0.21969318389892578 0.048265095051647222 +2322 6 5.3386817 0.66131830215454102 0.43734189676456481 +2323 6 6.07975531 0.079755306243896484 0.0063609088740577135 +2325 6 5.010644 0.98935604095458984 0.97882537577334006 +2326 5 5.27927828 0.27927827835083008 0.077996356758603724 +2330 6 5.41974068 0.58025932312011719 0.33670088206781656 +2341 5 5.20041227 0.20041227340698242 0.040165079332155074 +2343 5 6.428549 1.4285488128662109 2.0407517107414606 +2346 4 5.21786 1.217860221862793 1.4831835199956913 +2348 6 5.806993 0.19300699234008789 0.037251699092166746 +2352 6 5.25599861 0.74400138854980469 0.55353806616403745 +2353 7 6.67731333 0.32268667221069336 0.10412668842241146 +2354 6 6.64218235 0.64218235015869141 0.41239817085534014 +2356 6 5.86749458 0.13250541687011719 0.017557685499923537 +2357 5 5.94600058 0.94600057601928711 0.89491708982882301 +2360 6 6.17621469 0.17621469497680664 0.031051618725769004 +2361 5 5.13946867 0.13946866989135742 0.019451509881264428 +2362 6 6.729167 0.72916698455810547 0.53168449136956042 +2363 5 5.514287 0.51428699493408203 0.26449111315832852 +2364 5 5.378189 0.3781890869140625 0.14302698546089232 +2368 6 5.58730936 0.41269063949584961 0.17031356392749331 +2369 6 6.56191969 0.5619196891784668 0.31575373708642474 +2371 5 4.946381 0.053618907928466797 0.0028749872874413995 +2372 4 5.022731 1.022730827331543 1.0459783451742624 +2373 3 4.65867138 1.6586713790893555 2.7511907438101844 +2377 6 5.68505859 0.31494140625 0.099188089370727539 +2378 5 5.365645 0.36564493179321289 0.13369621614606331 +2382 8 5.980098 2.019902229309082 4.0800050159677994 +2384 8 5.980098 2.019902229309082 4.0800050159677994 +2385 5 6.06373739 1.0637373924255371 1.1315372400442811 +2388 4 5.438252 1.4382519721984863 2.0685687355328355 +2390 8 6.577091 1.4229087829589844 2.0246694046218181 +2394 5 4.748077 0.2519230842590332 0.063465240382583943 +2395 5 5.46794844 0.46794843673706055 0.21897573944465876 +2397 6 6.152169 0.15216922760009766 0.023155473828410322 +2398 6 6.355004 0.35500383377075195 0.12602772199193168 +2399 6 5.84902763 0.15097236633300781 0.022792655396187911 +2400 4 5.51223755 1.512237548828125 2.2868624040856957 +2402 6 5.63959646 0.36040353775024414 0.12989071002289165 +2404 5 5.11211967 0.11211967468261719 0.01257082145093591 +2405 5 5.799807 0.79980707168579102 0.63969135191860005 +2407 6 6.790098 0.79009819030761719 0.62425515032737167 +2408 5 4.92498446 0.075015544891357422 0.0056273319753472606 +2409 4 6.467688 2.4676880836486816 6.0894844781817028 +2410 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2411 6 5.02752256 0.97247743606567383 0.94571236365686673 +2412 4 4.89793873 0.89793872833251953 0.80629395983942231 +2413 4 6.467688 2.4676880836486816 6.0894844781817028 +2414 4 4.812013 0.81201314926147461 0.65936535457353784 +2416 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2417 5 4.905179 0.094820976257324219 0.0089910175383920432 +2418 5 5.212003 0.21200323104858398 0.044945369975039284 +2421 5 5.728902 0.72890186309814453 0.53129792602794623 +2425 6 5.87789345 0.12210655212402344 0.014910010071616853 +2432 5 5.243106 0.24310588836669922 0.059100472958562023 +2434 6 5.20914364 0.79085636138916016 0.62545378434970189 +2438 5 4.97508335 0.024916648864746094 0.0006208393906490528 +2442 5 5.124124 0.12412405014038086 0.015406779823251782 +2445 5 5.283511 0.28351116180419922 0.08037857886756683 +2446 5 5.283511 0.28351116180419922 0.08037857886756683 +2447 6 5.54187 0.4581298828125 0.20988298952579498 +2448 6 6.25477743 0.25477743148803711 0.064911539595641443 +2449 6 6.04059029 0.040590286254882813 0.0016475713382533286 +2451 5 5.102657 0.10265684127807617 0.010538427061192124 +2454 5 5.52015066 0.52015066146850586 0.27055671062612419 +2457 6 6.17909145 0.17909145355224609 0.03207374873545632 +2458 6 5.62500525 0.37499475479125977 0.14062106612095704 +2460 5 5.3468256 0.34682559967041016 0.12028799658673961 +2462 5 5.26428 0.26427984237670898 0.069843835086658146 +2463 7 5.87194967 1.1280503273010254 1.2724975409239505 +2468 6 5.542082 0.45791816711425781 0.20968904777328135 +2469 5 5.144967 0.14496707916259766 0.021015454040934856 +2471 7 7.0686183 0.068618297576904297 0.0047084707623525901 +2473 6 5.332778 0.66722202301025391 0.44518522798989579 +2474 7 6.526948 0.47305202484130859 0.22377821820646204 +2476 6 5.40006 0.59993982315063477 0.35992779140201492 +2479 6 5.451382 0.54861783981323242 0.30098153416133755 +2480 5 5.305516 0.30551576614379883 0.093339883362432374 +2481 6 5.63753748 0.36246252059936523 0.13137907883924527 +2482 6 5.44933271 0.55066728591918945 0.30323445978160635 +2484 5 5.035196 0.035195827484130859 0.0012387462722927012 +2485 6 5.351825 0.64817476272583008 0.42013052303468612 +2487 6 6.216436 0.21643590927124023 0.046844502822068534 +2489 6 5.25572443 0.74427556991577148 0.55394612397344645 +2490 6 5.24163437 0.75836563110351563 0.57511843043903355 +2491 5 5.23166561 0.23166561126708984 0.053668955443754385 +2492 6 5.25572443 0.74427556991577148 0.55394612397344645 +2493 4 5.047504 1.0475039482116699 1.0972645215190369 +2494 4 5.047504 1.0475039482116699 1.0972645215190369 +2497 5 5.789101 0.78910112380981445 0.62268058359791212 +2498 5 5.789101 0.78910112380981445 0.62268058359791212 +2500 5 5.789101 0.78910112380981445 0.62268058359791212 +2501 5 5.42734766 0.42734766006469727 0.18262602256277205 +2506 6 5.75300074 0.24699926376342773 0.061008636299675345 +2507 7 6.718815 0.28118515014648438 0.079065088662900962 +2508 6 5.369476 0.6305241584777832 0.39756071442411667 +2509 5 5.12915134 0.12915134429931641 0.016680069734320568 +2510 6 5.33514929 0.66485071182250977 0.44202646901089793 +2515 7 6.553418 0.44658184051513672 0.19943534027788701 +2516 6 5.71722269 0.28277730941772461 0.079963006721527563 +2520 5 5.229541 0.22954082489013672 0.052688990291244409 +2521 7 6.4475956 0.55240440368652344 0.30515062521226355 +2524 5 5.229541 0.22954082489013672 0.052688990291244409 +2527 6 6.322875 0.32287502288818359 0.10424828040504508 +2528 6 6.20776 0.20775985717773438 0.043164158254512586 +2529 5 5.05015 0.050149917602539063 0.0025150142355414573 +2530 6 5.70940733 0.29059267044067383 0.084444100113842069 +2533 5 6.127435 1.1274352073669434 1.2711101468105426 +2535 6 5.85946 0.14054012298583984 0.019751526168874989 +2539 5 5.761463 0.76146316528320313 0.57982615208311472 +2540 5 6.34781027 1.3478102684020996 1.8165925196101398 +2542 5 6.003742 1.0037422180175781 1.0074984402308473 +2543 6 5.67026138 0.32973861694335938 0.10872755550371949 +2544 6 5.91505241 0.084947586059570313 0.0072160923773481045 +2549 5 5.905257 0.90525722503662109 0.81949064348100364 +2550 5 5.18551636 0.185516357421875 0.034416318871080875 +2553 7 6.659942 0.3400578498840332 0.11563934126775166 +2559 5 5.171946 0.17194604873657227 0.029565443676119685 +2561 5 5.419591 0.41959095001220703 0.17605656533214642 +2565 5 5.66264248 0.66264247894287109 0.43909505489955336 +2570 5 6.09423256 1.0942325592041016 1.1973448936223576 +2572 5 5.85262251 0.85262250900268555 0.7269651428580346 +2573 5 5.33394337 0.33394336700439453 0.11151817236623174 +2576 5 5.82261133 0.82261133193969727 0.6766894034356028 +2577 5 5.780506 0.78050613403320313 0.60918982526345644 +2578 7 6.720284 0.27971601486206055 0.078241048970312477 +2580 5 5.43206549 0.43206548690795898 0.18668058497701168 +2582 7 6.81294441 0.18705558776855469 0.034989792915439466 +2585 7 6.81294441 0.18705558776855469 0.034989792915439466 +2587 6 5.354246 0.64575386047363281 0.41699804831660003 +2588 7 6.81294441 0.18705558776855469 0.034989792915439466 +2589 4 4.78625631 0.78625631332397461 0.61819899024180813 +2590 6 6.1274457 0.12744569778442383 0.016242405883758693 +2591 7 6.415467 0.5845332145690918 0.34167907893447591 +2594 7 6.423638 0.57636213302612305 0.33219330838642236 +2597 6 6.22214746 0.22214746475219727 0.049349496095828727 +2598 5 5.194394 0.19439411163330078 0.037789070637700206 +2601 5 5.68621063 0.68621063232421875 0.47088503191480413 +2603 7 6.966857 0.033143043518066406 0.0010984613336404436 +2604 7 6.966857 0.033143043518066406 0.0010984613336404436 +2605 6 5.794412 0.20558786392211914 0.042266369792059777 +2606 6 6.468554 0.46855401992797852 0.21954286959066849 +2608 6 6.152119 0.15211915969848633 0.023140238747373587 +2613 5 5.2531476 0.25314760208129883 0.064083708439511611 +2614 5 6.55887175 1.5588717460632324 2.430081120674231 +2615 7 6.630824 0.36917591094970703 0.13629085322554602 +2616 7 6.630824 0.36917591094970703 0.13629085322554602 +2620 5 5.45543861 0.45543861389160156 0.20742433102350333 +2622 7 6.30767059 0.69232940673828125 0.47932000743458048 +2624 5 6.55887175 1.5588717460632324 2.430081120674231 +2625 5 4.713512 0.28648805618286133 0.082075406335434309 +2627 7 6.145278 0.85472202301025391 0.73054973661874101 +2629 5 4.998917 0.0010828971862792969 1.1726663160516182E-06 +2630 6 5.7854867 0.21451330184936523 0.046015956670316882 +2631 7 7.168283 0.16828298568725586 0.02831916327181716 +2632 5 5.06333447 0.063334465026855469 0.0040112544602379785 +2634 5 5.30502844 0.30502843856811523 0.093042348335302449 +2636 5 5.49951124 0.4995112419128418 0.24951148079730956 +2637 5 5.30502844 0.30502843856811523 0.093042348335302449 +2640 6 6.370355 0.37035512924194336 0.13716292175581657 +2642 5 5.604046 0.60404586791992188 0.3648714105511317 +2643 5 5.61569834 0.61569833755493164 0.37908444286790655 +2645 7 6.34942675 0.6505732536315918 0.42324555834079547 +2646 7 6.021215 0.97878503799438477 0.95802015060166923 +2647 5 5.82385874 0.82385873794555664 0.67874322008924537 +2649 6 5.82408476 0.17591524124145508 0.030946172101039338 +2651 5 4.96879244 0.031207561492919922 0.0009739118943343783 +2655 5 5.67757463 0.67757463455200195 0.459107385388279 +2656 4 5.873171 1.8731708526611328 3.5087690432592353 +2657 7 6.70312071 0.29687929153442383 0.088137313741981416 +2659 6 6.201171 0.20117092132568359 0.040469739587024378 +2662 6 6.45812464 0.45812463760375977 0.20987818357957622 +2663 8 5.65337 2.3466300964355469 5.506672809497104 +2667 7 6.00120831 0.99879169464111328 0.99758484928406688 +2671 7 6.983855 0.016145229339599609 0.00026066843042826804 +2672 7 5.72459126 1.2754087448120117 1.6266674663429512 +2673 6 5.512653 0.48734712600708008 0.23750722122736079 +2675 7 5.69395638 1.3060436248779297 1.7057499500842823 +2676 6 6.307566 0.30756616592407227 0.094596946421233952 +2677 6 6.443829 0.44382905960083008 0.19698423414615718 +2678 5 5.273363 0.27336311340332031 0.074727391769556561 +2682 6 6.5731144 0.57311439514160156 0.32846010991852381 +2684 6 6.47421932 0.47421932220458984 0.2248839655521806 +2685 7 6.35321856 0.64678144454956055 0.41832623701361626 +2686 6 6.623215 0.6232151985168457 0.3883971836623914 +2687 5 5.35341358 0.35341358184814453 0.12490115983473515 +2688 6 5.92039251 0.079607486724853516 0.0063373519426477287 +2689 6 5.86066055 0.13933944702148438 0.019415481496253051 +2690 6 5.578879 0.42112112045288086 0.17734299809148979 +2691 6 6.09161 0.091609954833984375 0.0083923838246846572 +2692 6 5.729569 0.2704310417175293 0.073132948324428071 +2693 6 6.20171928 0.20171928405761719 0.040690669560717652 +2695 6 6.645086 0.64508581161499023 0.41613570434697067 +2696 6 5.84798431 0.15201568603515625 0.023108768800739199 +2701 5 5.37176561 0.3717656135559082 0.13820967142260088 +2702 5 5.37176561 0.3717656135559082 0.13820967142260088 +2704 6 5.31003237 0.68996763229370117 0.47605533361297603 +2705 6 5.31003237 0.68996763229370117 0.47605533361297603 +2708 6 5.497318 0.50268220901489258 0.25268940326009215 +2713 6 5.497318 0.50268220901489258 0.25268940326009215 +2714 6 5.59170675 0.40829324722290039 0.16670337572782046 +2715 6 6.01414633 0.014146327972412109 0.0002001185951030493 +2719 6 6.004554 0.0045537948608398438 2.0737047634611372E-05 +2720 7 6.80529833 0.1947016716003418 0.037908740923967343 +2725 5 5.448 0.44799995422363281 0.2007039589843771 +2726 6 5.924554 0.075446128845214844 0.0056921183577287593 +2734 6 5.794034 0.20596599578857422 0.042421991421178973 +2735 6 5.434296 0.5657038688659668 0.32002086724992296 +2736 6 6.01298857 0.012988567352294922 0.00016870288186510152 +2737 7 6.007834 0.99216604232788086 0.98439345554857027 +2738 5 4.610934 0.38906621932983398 0.15137252302361048 +2741 5 4.610934 0.38906621932983398 0.15137252302361048 +2742 6 6.00884151 0.0088415145874023438 7.8172380199248437E-05 +2746 6 5.95755863 0.042441368103027344 0.0018012697264566668 +2747 6 5.59035969 0.40964031219482422 0.16780518537507305 +2748 8 6.45529556 1.5447044372558594 2.3861117984779412 +2750 8 6.45529556 1.5447044372558594 2.3861117984779412 +2751 6 6.10585451 0.10585451126098633 0.011205177554302281 +2763 6 5.63824034 0.36175966262817383 0.13087005350485015 +2765 6 6.276466 0.27646589279174805 0.076433389877138325 +2766 6 6.528149 0.52814912796020508 0.27894150136512508 +2767 6 5.705548 0.29445219039916992 0.086702092430869016 +2772 7 6.990375 0.0096249580383300781 9.2639817239614786E-05 +2774 8 6.647418 1.3525819778442383 1.8294780067890315 +2775 8 6.647418 1.3525819778442383 1.8294780067890315 +2777 6 6.116481 0.11648082733154297 0.013567783135840727 +2783 6 6.070306 0.070305824279785156 0.004942908927660028 +2785 5 5.43653631 0.43653631210327148 0.19056395178472485 +2786 6 6.944194 0.94419384002685547 0.89150200754465914 +2788 5 5.14618063 0.14618062973022461 0.021368776508325027 +2790 6 5.996413 0.0035867691040039063 1.2864912605436984E-05 +2791 5 5.06431532 0.064315319061279297 0.0041364602659541561 +2794 5 5.196513 0.19651317596435547 0.038617428327597736 +2796 7 6.7877326 0.21226739883422852 0.045057448607849437 +2798 7 5.97907734 1.0209226608276367 1.0422830793913818 +2799 7 6.517823 0.48217678070068359 0.23249444784687512 +2801 5 5.36617851 0.36617851257324219 0.13408670307035209 +2802 6 5.80672932 0.19327068328857422 0.037353557018832362 +2803 8 6.202484 1.797515869140625 3.2310632998123765 +2805 6 6.34842634 0.34842634201049805 0.12140091580681656 +2806 5 5.6479187 0.647918701171875 0.41979864332824945 +2807 5 5.6928525 0.69285249710083008 0.48004458273885575 +2812 6 6.332061 0.33206081390380859 0.1102643841304598 +2815 5 5.5959425 0.59594249725341797 0.35514746003264008 +2816 5 5.84147549 0.84147548675537109 0.70808099481018871 +2817 7 7.080033 0.080032825469970703 0.0064052531527067913 +2819 6 6.2077837 0.20778369903564453 0.043174065584935306 +2820 5 5.42021656 0.42021656036376953 0.17658195760395756 +2821 5 5.69374561 0.69374561309814453 0.48128297569292044 +2822 5 5.76683855 0.76683855056762695 0.58804136263665896 +2824 6 5.575345 0.42465496063232422 0.18033183558964083 +2825 6 5.79173851 0.20826148986816406 0.043372848162107402 +2826 6 5.548999 0.45100116729736328 0.20340205290358426 +2827 7 6.41423273 0.58576726913452148 0.34312329358931493 +2828 7 6.41423273 0.58576726913452148 0.34312329358931493 +2829 5 5.660426 0.66042613983154297 0.43616268617279275 +2832 6 6.22251129 0.22251129150390625 0.049511274846736342 +2834 6 6.2342124 0.23421239852905273 0.054855447624731823 +2835 6 5.79173851 0.20826148986816406 0.043372848162107402 +2838 7 6.53514433 0.46485567092895508 0.21609079479480897 +2841 6 5.84660959 0.15339040756225586 0.02352861713211496 +2843 6 5.64633465 0.35366535186767578 0.12507918111168692 +2845 7 6.833482 0.16651821136474609 0.027728314716114255 +2849 5 5.037817 0.037817001342773438 0.001430125590559328 +2851 5 5.75162268 0.75162267684936523 0.56493664835420532 +2853 6 6.388475 0.38847494125366211 0.15091277998203623 +2855 7 6.26280069 0.73719930648803711 0.54346281748644287 +2857 8 6.98407269 1.0159273147583008 1.0321083088720115 +2858 7 6.26280069 0.73719930648803711 0.54346281748644287 +2859 6 6.298114 0.29811382293701172 0.088871851426119974 +2862 6 6.979329 0.97932910919189453 0.95908550411058968 +2864 6 6.388475 0.38847494125366211 0.15091277998203623 +2866 7 6.742437 0.25756311416625977 0.066338757779021762 +2867 7 6.51812935 0.48187065124511719 0.23219932453139336 +2874 7 6.914118 0.085882186889648438 0.007375750024948502 +2875 6 6.06492567 0.064925670623779297 0.004215342705947478 +2876 5 6.01396847 1.0139684677124023 1.0281320535150371 +2877 5 5.71460772 0.71460771560668945 0.51066418720461115 +2878 6 7.44846964 1.4484696388244629 2.09806429459627 +2880 5 5.61933041 0.61933040618896484 0.38357015203018818 +2882 5 5.98323154 0.98323154449462891 0.96674427008929342 +2883 7 6.836774 0.16322612762451172 0.026642768739293388 +2884 7 6.89757824 0.10242176055908203 0.010490217036021932 +2885 6 6.65348339 0.65348339080810547 0.4270405420620591 +2886 5 5.506567 0.50656700134277344 0.25661012684940943 +2887 5 6.570382 1.5703821182250977 2.4660999972411446 +2888 4 5.380556 1.3805561065673828 1.9059351633804908 +2889 6 6.397633 0.39763307571411133 0.15811206290186419 +2892 5 5.364448 0.36444807052612305 0.13282239611021396 +2894 7 6.20067549 0.79932451248168945 0.63891967625409052 +2897 5 5.364448 0.36444807052612305 0.13282239611021396 +2899 5 5.146842 0.14684200286865234 0.021562573806477303 +2900 6 6.481261 0.48126077651977539 0.23161193501641719 +2901 7 6.732033 0.26796722412109375 0.071806433203164488 +2907 6 5.935697 0.064302921295166016 0.0041348656870923151 +2908 6 6.063202 0.063201904296875 0.0039944807067513466 +2909 6 6.188701 0.18870115280151367 0.035608125068620211 +2912 7 6.732033 0.26796722412109375 0.071806433203164488 +2914 6 6.351888 0.35188817977905273 0.12382529106821494 +2915 6 6.351888 0.35188817977905273 0.12382529106821494 +2916 6 7.193787 1.1937870979309082 1.4251276351862998 +2917 7 6.77892828 0.22107172012329102 0.048872705438270714 +2918 6 6.00741529 0.0074152946472167969 5.498659470504208E-05 +2921 6 5.207289 0.79271078109741211 0.62839038246806922 +2922 8 6.728791 1.2712087631225586 1.6159717194395853 +2925 5 5.5744133 0.57441329956054688 0.32995063871203456 +2926 8 6.433487 1.5665130615234375 2.4539631719235331 +2928 7 6.725618 0.27438211441040039 0.07528554470832205 +2930 8 6.32433462 1.6756653785705566 2.8078544609400069 +2931 8 6.433487 1.5665130615234375 2.4539631719235331 +2932 6 6.040474 0.04047393798828125 0.0016381396562792361 +2935 4 5.525333 1.5253329277038574 2.3266405403376211 +2936 5 5.521468 0.52146816253662109 0.27192904453931988 +2938 8 6.206464 1.7935361862182617 3.2167720512743472 +2939 8 6.206464 1.7935361862182617 3.2167720512743472 +2942 5 5.47682953 0.47682952880859375 0.22736639954382554 +2945 8 6.9402957 1.0597043037414551 1.1229732113681621 +2946 6 6.150122 0.15012216567993164 0.022536664628432845 +2951 5 5.433133 0.43313312530517578 0.1876043042366291 +2952 5 5.218945 0.21894502639770508 0.047936924584291773 +2954 7 6.82631826 0.17368173599243164 0.030165345417344724 +2957 6 6.40513372 0.40513372421264648 0.1641333344944087 +2958 5 5.433133 0.43313312530517578 0.1876043042366291 +2960 7 6.320663 0.6793370246887207 0.46149879311292352 +2963 7 6.758505 0.24149513244628906 0.058319898995250696 +2966 6 6.074806 0.07480621337890625 0.0055959695600904524 +2969 6 6.37035227 0.37035226821899414 0.13716080257495378 +2972 6 5.967377 0.032622814178466797 0.0010642480049227743 +2973 6 6.074806 0.07480621337890625 0.0055959695600904524 +2974 6 6.11917543 0.11917543411254883 0.014202784095914467 +2976 6 6.85677767 0.85677766799926758 0.73406797238226318 +2977 6 5.64738846 0.35261154174804688 0.1243348993739346 +2978 6 5.64738846 0.35261154174804688 0.1243348993739346 +2979 7 7.00416327 0.0041632652282714844 1.7332777360934415E-05 +2980 7 6.459112 0.54088783264160156 0.29255964749972918 +2982 6 6.08631945 0.086319446563720703 0.0074510468550670339 +2983 6 6.486003 0.48600292205810547 0.23619884024901694 +2986 7 6.642583 0.35741710662841797 0.1277469881106299 +2988 7 6.099473 0.90052700042724609 0.81094887849849329 +2990 7 7.303502 0.30350208282470703 0.092113514278935327 +2992 7 6.31785631 0.6821436882019043 0.46532001135369683 +2993 7 6.642583 0.35741710662841797 0.1277469881106299 +2995 6 6.261716 0.26171588897705078 0.068495206543047971 +2998 7 6.02018 0.97981977462768555 0.9600467907514485 +3003 7 6.099473 0.90052700042724609 0.81094887849849329 +3007 7 7.303502 0.30350208282470703 0.092113514278935327 +3008 7 7.05388927 0.053889274597167969 0.0029040539166089729 +3009 6 5.962095 0.037905216217041016 0.0014368054164606292 +3010 5 5.75205231 0.75205230712890625 0.56558267265791073 +3011 6 6.4816947 0.48169469833374023 0.23202978240283301 +3012 6 6.84173775 0.84173774719238281 0.70852243504850776 +3015 6 6.66586542 0.66586542129516602 0.44337675927658893 +3017 6 7.075902 1.075901985168457 1.1575650816894267 +3018 8 7.011235 0.98876476287841797 0.97765575631001411 +3019 6 6.66586542 0.66586542129516602 0.44337675927658893 +3021 4 5.329598 1.3295979499816895 1.7678307085955112 +3024 6 6.08960772 0.089607715606689453 0.0080295426962493366 +3025 7 5.93795824 1.0620417594909668 1.1279326989026686 +3030 8 7.151422 0.84857797622680664 0.72008458173718282 +3032 5 6.76317167 1.7631716728210449 3.1087743478385619 +3035 7 6.09332848 0.90667152404785156 0.82205325251925387 +3036 5 5.510598 0.51059818267822266 0.26071050415430364 +3041 6 5.37881136 0.62118864059448242 0.38587532720362105 +3042 6 5.661942 0.3380579948425293 0.11428320787695156 +3047 5 5.774637 0.77463722229003906 0.60006282615722739 +3048 6 6.35629272 0.356292724609375 0.12694450560957193 +3051 5 4.92406559 0.075934410095214844 0.005766034636508266 +3052 7 5.75310135 1.2468986511230469 1.5547562461724738 +3054 6 6.408374 0.40837383270263672 0.16676918723624112 +3057 5 6.842451 1.8424510955810547 3.3946260396078287 +3060 5 5.91603136 0.9160313606262207 0.83911345365072521 +3061 5 5.91603136 0.9160313606262207 0.83911345365072521 +3063 5 5.91603136 0.9160313606262207 0.83911345365072521 +3067 4 5.671678 1.6716780662536621 2.7945075571935831 +3068 6 6.87566 0.87565994262695313 0.76678033512143884 +3071 7 6.60551071 0.39448928833007813 0.15562179860717151 +3081 5 5.91603136 0.9160313606262207 0.83911345365072521 +3082 6 5.680128 0.31987190246582031 0.10231803398710326 +3083 7 6.60002565 0.39997434616088867 0.1599794775868304 +3085 6 6.02571249 0.025712490081787109 0.00066113214620600047 +3087 3 5.521938 2.5219378471374512 6.360170504824282 +3089 7 6.60497332 0.39502668380737305 0.15604608091985028 +3092 6 5.875346 0.12465381622314453 0.015538573898993491 +3093 7 6.42221928 0.57778072357177734 0.33383056453112658 +3096 7 6.04160261 0.95839738845825195 0.91852555420359749 +3098 7 6.134868 0.86513185501098633 0.74845312655475027 +3100 7 6.25054932 0.74945068359375 0.56167632713913918 +3103 7 6.42221928 0.57778072357177734 0.33383056453112658 +3107 6 5.812541 0.18745899200439453 0.035140873683303653 +3109 4 5.29554653 1.2955465316772461 1.6784408157409416 +3110 6 6.20626926 0.20626926422119141 0.042547009362351673 +3118 7 6.6532855 0.34671449661254883 0.12021094216129313 +3121 5 5.4326396 0.43263959884643555 0.18717702249000467 +3123 5 6.173872 1.1738719940185547 1.3779754583410977 +3127 5 5.83897829 0.83897829055786133 0.70388457202739119 +3129 6 6.11212063 0.11212062835693359 0.012571035303153621 +3130 6 6.62801 0.62800979614257813 0.39439630405104253 +3132 6 6.119272 0.11927223205566406 0.014225865339540178 +3134 6 6.2366147 0.23661470413208008 0.055986518211511793 +3136 5 5.514752 0.51475191116333008 0.26496953004630086 +3137 6 5.9501214 0.049878597259521484 0.0024878744645775441 +3139 6 5.58149433 0.41850566864013672 0.17514699468392791 +3142 6 5.798257 0.20174312591552734 0.040700288854168321 +3148 6 5.95302 0.046979904174804688 0.0022071113962738309 +3149 6 6.175666 0.17566585540771484 0.030858492756124178 +3150 6 6.9550066 0.95500659942626953 0.91203760494772723 +3152 6 6.06551075 0.065510749816894531 0.0042916583415717469 +3153 6 6.341843 0.3418431282043457 0.11685672430053273 +3155 7 7.05393267 0.053932666778564453 0.0029087325458476698 +3156 5 5.629764 0.62976408004760742 0.39660279651820929 +3160 6 5.82131863 0.17868137359619141 0.031927033270221727 +3161 5 5.629764 0.62976408004760742 0.39660279651820929 +3163 7 7.06213474 0.062134742736816406 0.0038607262549703592 +3165 6 5.43980265 0.56019735336303711 0.31382107471495146 +3169 6 6.016192 0.016191959381103516 0.00026217954859930614 +3170 6 6.274177 0.27417707443237305 0.07517306814429503 +3171 6 6.243532 0.24353218078613281 0.059307923078449676 +3180 6 6.34757662 0.34757661819458008 0.1208095055155809 +3184 7 6.41739655 0.58260345458984375 0.33942678530002013 +3185 6 6.49914455 0.49914455413818359 0.24914528592580609 +3186 4 5.41402626 1.4140262603759766 1.9994702650328691 +3187 7 6.36057663 0.63942337036132813 0.40886224656424019 +3188 8 6.252697 1.7473030090332031 3.0530678053764859 +3191 6 6.047302 0.047301769256591797 0.0022374573748038529 +3194 5 5.340684 0.34068393707275391 0.11606554497939214 +3196 7 6.3920126 0.60798740386962891 0.36964868326413125 +3198 7 6.3920126 0.60798740386962891 0.36964868326413125 +3202 7 6.708888 0.29111194610595703 0.084746165165597631 +3203 7 6.3920126 0.60798740386962891 0.36964868326413125 +3205 7 6.96342325 0.036576747894287109 0.0013378584865222365 +3207 6 6.063226 0.063226222991943359 0.0039975552738269471 +3210 5 5.12971735 0.12971735000610352 0.016826590892605964 +3213 6 5.94969034 0.050309658050537109 0.0025310616931619734 +3214 6 6.1900773 0.19007730484008789 0.036129381815271699 +3219 7 6.91940975 0.080590248107910156 0.0064947880900945165 +3221 6 6.66447926 0.66447925567626953 0.44153268122408917 +3222 6 6.301735 0.30173492431640625 0.091043964552227408 +3223 6 6.180912 0.18091201782226563 0.032729158192523755 +3226 6 6.033703 0.033702850341796875 0.0011358821211615577 +3227 6 5.27611446 0.72388553619384766 0.52401026951065433 +3232 5 6.434669 1.434669017791748 2.0582751906115391 +3236 6 6.92699432 0.92699432373046875 0.8593184762285091 +3239 7 6.684847 0.31515312194824219 0.099321490273723612 +3240 6 6.14441633 0.14441633224487305 0.020856077019061559 +3241 7 6.31036854 0.68963146209716797 0.47559155351427762 +3242 6 6.469078 0.46907806396484375 0.22003423009300604 +3244 7 6.741383 0.25861692428588867 0.066882713527093074 +3246 6 6.53103065 0.53103065490722656 0.28199355645119795 +3247 6 6.181634 0.18163394927978516 0.032990891530971567 +3248 7 6.287761 0.71223878860473633 0.50728409199314228 +3251 6 5.55754375 0.44245624542236328 0.19576752911325457 +3252 8 6.597662 1.4023380279541016 1.9665519446461985 +3253 8 6.34131336 1.658686637878418 2.7512413626764101 +3255 6 6.1782856 0.17828559875488281 0.031785754723387072 +3256 6 6.1782856 0.17828559875488281 0.031785754723387072 +3258 6 6.1782856 0.17828559875488281 0.031785754723387072 +3263 8 6.55796432 1.4420356750488281 2.0794668881135294 +3264 6 4.65063143 1.3493685722351074 1.8207955437358123 +3266 6 6.52961636 0.52961635589599609 0.2804934844325544 +3267 6 5.60741472 0.39258527755737305 0.15412320015479963 +3269 5 5.20599842 0.20599842071533203 0.042435349337210937 +3271 7 6.82550669 0.17449331283569336 0.030447916224375149 +3272 7 5.845716 1.1542840003967285 1.3323715535718748 +3273 7 6.585916 0.41408395767211914 0.17146552400140536 +3274 5 6.55339956 1.5533995628356934 2.4130502018181232 +3275 4 5.209161 1.2091608047485352 1.4620698517401252 +3277 7 5.775679 1.2243208885192871 1.4989616380646567 +3278 5 5.20599842 0.20599842071533203 0.042435349337210937 +3281 6 6.54781961 0.54781961441040039 0.30010632993275976 +3282 7 6.30941963 0.69058036804199219 0.47690124472501338 +3283 6 6.47506571 0.47506570816040039 0.22568742706994271 +3284 6 6.076994 0.076993942260742188 0.0059280671448505018 +3287 7 6.56880236 0.4311976432800293 0.18593140757025139 +3288 6 6.47506571 0.47506570816040039 0.22568742706994271 +3290 5 5.51041555 0.51041555404663086 0.26052403781272915 +3293 7 6.16678238 0.83321762084960938 0.6942516036942834 +3295 5 5.39381552 0.39381551742553711 0.15509066176514352 +3296 5 5.47942972 0.47942972183227539 0.22985285817617296 +3297 5 5.28573465 0.28573465347290039 0.081644292195278467 +3298 6 6.50759029 0.50759029388427734 0.25764790644552704 +3299 7 6.7499404 0.25005960464477539 0.062529805875101374 +3300 5 5.51041555 0.51041555404663086 0.26052403781272915 +3302 6 6.70693874 0.70693874359130859 0.49976238719045796 +3303 7 6.506652 0.49334812164306641 0.24339236912874185 +3305 7 6.431296 0.56870412826538086 0.32342438550608676 +3306 7 6.60756159 0.39243841171264648 0.15400790698754463 +3308 6 5.94220924 0.057790756225585938 0.0033397715051250998 +3309 7 7.01701355 0.0170135498046875 0.00028946087695658207 +3310 7 6.482798 0.51720190048217773 0.26749780586237648 +3311 7 6.162655 0.83734512329101563 0.70114685549924616 +3313 7 5.716633 1.2833671569824219 1.6470312596211443 +3314 6 4.96552658 1.0344734191894531 1.070135255009518 +3316 6 6.66608953 0.66608953475952148 0.44367526831615578 +3317 6 6.324064 0.32406377792358398 0.10501733216210596 +3318 7 6.45378256 0.54621744155883789 0.29835349346308249 +3319 5 6.07571745 1.0757174491882324 1.1571680304880374 +3321 6 7.0864 1.086400032043457 1.1802650296240245 +3323 6 6.006462 0.00646209716796875 4.1758699808269739E-05 +3326 5 5.880373 0.88037300109863281 0.77505662106341333 +3328 5 6.10443 1.1044301986694336 1.2197660637330046 +3330 6 5.89951468 0.10048532485961914 0.010097300512143192 +3332 7 6.57549572 0.42450428009033203 0.18020388381501107 +3333 6 5.77693367 0.22306632995605469 0.049758587560063461 +3335 6 5.480915 0.51908493041992188 0.26944916498905513 +3336 6 5.480915 0.51908493041992188 0.26944916498905513 +3337 6 5.480915 0.51908493041992188 0.26944916498905513 +3342 5 6.37601328 1.3760132789611816 1.8934125438775027 +3343 7 5.399277 1.6007227897644043 2.5623134496711373 +3344 6 5.480915 0.51908493041992188 0.26944916498905513 +3346 6 6.18561268 0.18561267852783203 0.034452066430276318 +3347 6 5.61463 0.38536977767944336 0.1485098655487036 +3351 6 6.587807 0.58780717849731445 0.34551727909297369 +3355 6 6.764193 0.76419305801391602 0.58399102991666041 +3356 6 5.75061131 0.24938869476318359 0.062194721075684356 +3357 7 6.187659 0.81234121322631836 0.65989824670600683 +3359 6 6.55126047 0.55126047134399414 0.30388810726640259 +3361 6 6.112465 0.11246490478515625 0.012648354808334261 +3363 6 6.587807 0.58780717849731445 0.34551727909297369 +3365 7 6.378836 0.62116384506225586 0.3858445224125262 +3366 6 6.07021 0.070209980010986328 0.0049294412931430998 +3369 7 6.64197254 0.35802745819091797 0.12818366081864951 +3370 6 6.12879467 0.12879467010498047 0.01658806704745075 +3371 6 6.07021 0.070209980010986328 0.0049294412931430998 +3372 6 5.995269 0.0047311782836914063 2.2384047952073161E-05 +3376 6 5.968429 0.031570911407470703 0.00099672244709836377 +3382 7 6.80490828 0.19509172439575195 0.038060780927708038 +3383 6 6.54890728 0.54890727996826172 0.30129920200215565 +3384 6 5.939944 0.060056209564208984 0.0036067483072201867 +3387 5 5.34240532 0.34240531921386719 0.11724140262595029 +3389 7 6.63416529 0.36583471298217773 0.13383503722275236 +3390 6 6.90913439 0.9091343879699707 0.82652533538953321 +3397 6 5.771987 0.22801303863525391 0.051989945787681791 +3399 6 6.254692 0.25469207763671875 0.064868054410908371 +3400 6 5.488096 0.51190376281738281 0.26204546238659532 +3401 5 6.17827 1.1782698631286621 1.3883198703572361 +3405 6 5.978143 0.021856784820556641 0.00047771904269211518 +3406 6 6.254692 0.25469207763671875 0.064868054410908371 +3408 6 5.355218 0.64478206634521484 0.41574391308040504 +3409 3 6.249504 3.2495040893554688 10.559276826737914 +3411 6 6.2559967 0.2559967041015625 0.065534312510862947 +3414 7 6.424868 0.57513189315795898 0.33077669452745795 +3416 6 5.658931 0.34106922149658203 0.11632821385228453 +3422 8 6.920657 1.0793428421020508 1.1649809707969325 +3423 5 5.87612247 0.87612247467041016 0.76759059062260349 +3425 6 5.945171 0.054829120635986328 0.0030062324697155418 +3431 6 5.9485817 0.051418304443359375 0.0026438420318299904 +3435 6 6.27855062 0.27855062484741211 0.07759045060288372 +3437 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3439 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3442 7 6.433718 0.56628179550170898 0.32067507191663935 +3450 7 6.13693428 0.86306571960449219 0.74488243635641993 +3451 7 6.13693428 0.86306571960449219 0.74488243635641993 +3452 5 5.50814629 0.50814628601074219 0.258212647986511 +3454 5 5.78949451 0.78949451446533203 0.62330158837085037 +3455 6 6.10091829 0.10091829299926758 0.010184501861886019 +3456 5 5.165694 0.16569423675537109 0.027454580093944969 +3457 7 6.41468048 0.58531951904296875 0.34259893937269226 +3458 7 7.00273228 0.0027322769165039063 7.4653371484600939E-06 +3459 6 5.586149 0.41385078430175781 0.17127247166718007 +3461 8 5.846415 2.1535849571228027 4.6379281675456241 +3463 7 6.44663429 0.55336570739746094 0.30621360612349235 +3465 6 6.514682 0.51468181610107422 0.26489737182509998 +3467 5 5.617366 0.61736583709716797 0.38114057681468694 +3470 8 5.846415 2.1535849571228027 4.6379281675456241 +3472 6 6.150368 0.15036821365356445 0.022610599677364007 +3473 8 7.01380634 0.98619365692138672 0.97257792895197781 +3475 6 5.450064 0.54993581771850586 0.3024294036097217 +3477 7 5.99216938 1.0078306198120117 1.0157225582306637 +3478 6 5.450064 0.54993581771850586 0.3024294036097217 +3480 8 7.01380634 0.98619365692138672 0.97257792895197781 +3481 5 5.58673239 0.58673238754272461 0.34425489459158598 +3482 8 7.08236551 0.91763448715209961 0.84205305201089686 +3483 7 6.701889 0.2981109619140625 0.088870145613327622 +3484 8 7.058996 0.94100379943847656 0.88548815055764862 +3487 6 5.8508 0.1491999626159668 0.02226062884460589 +3488 6 5.71093845 0.28906154632568359 0.083556577564195322 +3490 7 5.99216938 1.0078306198120117 1.0157225582306637 +3491 6 5.7541585 0.24584150314331055 0.060438044667762369 +3493 7 6.74980736 0.25019264221191406 0.062596358216978842 +3494 6 6.46438169 0.46438169479370117 0.21565035845947023 +3497 6 6.36502266 0.36502265930175781 0.13324154180372716 +3500 7 6.74980736 0.25019264221191406 0.062596358216978842 +3502 5 5.36248827 0.3624882698059082 0.1313977457468809 +3503 7 6.881829 0.11817121505737305 0.01396443606813591 +3504 7 6.456562 0.54343795776367188 0.29532481393835042 +3506 6 6.33520365 0.33520364761352539 0.11236148537341251 +3507 7 7.048058 0.048058032989501953 0.002309574534820058 +3511 7 6.360972 0.63902807235717773 0.40835687726053038 +3513 6 6.1044445 0.10444450378417969 0.010908654370723525 +3516 7 7.216322 0.21632194519042969 0.046795183970971266 +3517 7 6.28893232 0.71106767654418945 0.50561724062595204 +3518 5 5.6771 0.67710018157958984 0.45846465589511354 +3519 7 6.63483524 0.36516475677490234 0.13334529959047359 +3520 5 4.63872862 0.36127138137817383 0.13051701100289392 +3522 5 5.43848848 0.43848848342895508 0.19227215009982501 +3523 5 4.63872862 0.36127138137817383 0.13051701100289392 +3526 6 5.771936 0.22806406021118164 0.052013215560009485 +3527 6 5.60652447 0.39347553253173828 0.15482299470113503 +3528 4 4.22449064 0.22449064254760742 0.050396048591437648 +3529 7 6.925511 0.074489116668701172 0.0055486285020833748 +3531 5 5.419897 0.41989707946777344 0.17631355734556564 +3532 6 6.31524754 0.31524753570556641 0.099381008768432366 +3533 6 5.39744234 0.60255765914916992 0.36307573259932724 +3536 6 6.21340227 0.21340227127075195 0.045540529383515604 +3537 5 5.512594 0.51259422302246094 0.26275283747600042 +3541 6 6.600255 0.60025501251220703 0.36030608004602982 +3542 6 5.77705956 0.22294044494628906 0.049702441992849344 +3543 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3544 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3546 6 5.77705956 0.22294044494628906 0.049702441992849344 +3547 6 6.06106949 0.061069488525390625 0.0037294824287528172 +3551 6 5.96327829 0.036721706390380859 0.0013484837202213384 +3555 6 5.940423 0.059576988220214844 0.0035494175253916183 +3560 6 5.945829 0.054171085357666016 0.0029345064888275374 +3564 6 5.945829 0.054171085357666016 0.0029345064888275374 +3566 6 5.766171 0.23382902145385742 0.054676011274068514 +3567 6 6.155753 0.15575313568115234 0.024259039274511451 +3568 7 6.18249464 0.8175053596496582 0.66831501305591701 +3572 6 5.766171 0.23382902145385742 0.054676011274068514 +3573 6 6.43890572 0.43890571594238281 0.19263822748689563 +3574 6 5.84190035 0.15809965133666992 0.024995499752776595 +3576 5 5.53407145 0.53407144546508789 0.28523230886116835 +3577 7 6.537883 0.46211719512939453 0.2135523020342589 +3578 4 5.00972128 1.0097212791442871 1.0195370615567754 +3579 7 6.75660372 0.24339628219604492 0.059241750186856734 +3580 5 5.873912 0.87391185760498047 0.76372193486258766 +3581 7 6.92469168 0.075308322906494141 0.0056713434989887901 +3582 6 6.65167 0.65166997909545898 0.42467376165427595 +3585 7 5.9642787 1.0357213020324707 1.0727186154838364 +3588 6 5.67989063 0.32010936737060547 0.10247000707840925 +3589 6 5.67989063 0.32010936737060547 0.10247000707840925 +3590 7 6.14944029 0.85055971145629883 0.72345182275262232 +3591 5 5.725536 0.72553586959838867 0.52640229807389005 +3593 7 6.46629429 0.53370571136474609 0.28484178634334967 +3594 7 6.41927671 0.58072328567504883 0.33723953452522437 +3595 7 6.160583 0.8394169807434082 0.70462086756037934 +3596 7 6.45985126 0.54014873504638672 0.29176065597221168 +3597 6 5.80583334 0.19416666030883789 0.037700691975487644 +3601 7 6.27083 0.72916984558105469 0.53168866370469914 +3602 6 6.525956 0.52595615386962891 0.27662987579333276 +3603 7 7.042205 0.042204856872558594 0.0017812499436331564 +3604 6 6.36735773 0.36735773086547852 0.13495170242663335 +3606 5 5.287236 0.28723621368408203 0.082504642451567634 +3608 6 6.211688 0.21168804168701172 0.044811826993282011 +3609 6 6.211688 0.21168804168701172 0.044811826993282011 +3610 5 5.13587236 0.13587236404418945 0.018461299310956747 +3611 6 6.12487125 0.12487125396728516 0.015592830067362229 +3612 6 6.04896259 0.048962593078613281 0.0023973355209818692 +3617 5 5.854528 0.85452795028686523 0.73021801782147122 +3618 7 5.47124434 1.5287556648254395 2.3370938827358714 +3619 6 5.60418129 0.39581871032714844 0.15667245144504705 +3621 7 5.47124434 1.5287556648254395 2.3370938827358714 +3623 6 5.60418129 0.39581871032714844 0.15667245144504705 +3624 7 6.501575 0.49842500686645508 0.24842748746982579 +3626 5 5.854528 0.85452795028686523 0.73021801782147122 +3630 6 5.904811 0.095189094543457031 0.0090609637200032012 +3632 6 5.92054844 0.079451560974121094 0.006312550541224482 +3633 6 5.904811 0.095189094543457031 0.0090609637200032012 +3634 7 6.57682848 0.4231715202331543 0.17907413553643892 +3636 7 5.96985435 1.0301456451416016 1.0612000502042065 +3641 6 5.971013 0.028986930847167969 0.00084024215993849793 +3642 6 5.971013 0.028986930847167969 0.00084024215993849793 +3644 7 5.678783 1.3212170600891113 1.7456145198705144 +3648 5 5.74037838 0.74037837982177734 0.54816014530752 +3649 6 6.519111 0.51911115646362305 0.26947639276500013 +3651 6 5.12625 0.87375020980834961 0.76343942914013496 +3654 6 6.135282 0.13528203964233398 0.018301230249790024 +3657 8 5.38427353 2.6157264709472656 6.8420249708142364 +3659 8 6.844641 1.1553587913513184 1.3348539367527792 +3662 4 4.4436326 0.44363260269165039 0.19680988617096773 +3663 6 6.863979 0.86397886276245117 0.74645947530029844 +3664 8 6.80742931 1.192570686340332 1.4222248419182506 +3665 8 6.844641 1.1553587913513184 1.3348539367527792 +3666 7 5.95530224 1.0446977615356445 1.0913934129575864 +3667 8 7.26183653 0.73816347122192383 0.54488531024639997 +3669 7 6.904336 0.095664024353027344 0.0091516055554166087 +3670 6 5.6326046 0.36739540100097656 0.13497938067666837 +3671 7 6.716537 0.2834630012512207 0.08035127307834955 +3672 8 6.25013828 1.7498617172241211 3.0620160294065499 +3673 7 6.419122 0.58087778091430664 0.33741899635992922 +3674 5 5.183054 0.18305397033691406 0.033508756056107813 +3675 6 5.74832344 0.25167655944824219 0.063341090575704584 +3676 7 6.419122 0.58087778091430664 0.33741899635992922 +3678 5 5.605777 0.60577678680419922 0.36696551543082023 +3682 7 6.35266447 0.64733552932739258 0.41904328752957554 +3683 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3685 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3686 5 4.976153 0.023847103118896484 0.00056868432716328243 +3689 8 7.283064 0.71693611145019531 0.51399738790132687 +3690 7 6.09959555 0.90040445327758789 0.81072817948211195 +3691 6 6.28709745 0.28709745407104492 0.082424948134075748 +3692 7 6.131696 0.86830377578735352 0.75395144704657469 +3693 7 7.00987864 0.0098786354064941406 9.7587437494439655E-05 +3694 5 5.605777 0.60577678680419922 0.36696551543082023 +3695 6 6.348696 0.34869623184204102 0.12158906210083842 +3696 7 6.35266447 0.64733552932739258 0.41904328752957554 +3700 5 5.18188858 0.18188858032226563 0.033083455651649274 +3701 5 5.09758472 0.097584724426269531 0.0095227784413509653 +3705 6 5.87677574 0.12322425842285156 0.015184217863861704 +3707 6 6.29291725 0.29291725158691406 0.085800516277231509 +3708 5 4.619965 0.3800349235534668 0.14442654312028935 +3709 5 5.35854626 0.35854625701904297 0.12855541842236562 +3710 5 4.773655 0.22634506225585938 0.051232087207608856 +3711 6 5.87677574 0.12322425842285156 0.015184217863861704 +3712 5 5.613295 0.61329507827758789 0.37613085303951266 +3713 5 4.951788 0.048212051391601563 0.0023244018993864302 +3715 6 5.41483 0.58516979217529297 0.34242368567447556 +3717 6 5.635741 0.36425876617431641 0.13268444873483531 +3719 5 5.69777346 0.69777345657348633 0.48688779669851101 +3722 5 5.10440445 0.10440444946289063 0.010900289067649283 +3725 6 6.60588837 0.60588836669921875 0.36710071290144697 +3726 7 6.394304 0.60569620132446289 0.36686788829888428 +3727 7 6.48175955 0.51824045181274414 0.26857316589507718 +3729 5 5.45680952 0.45680952072143555 0.20867493822174765 +3732 5 5.45680952 0.45680952072143555 0.20867493822174765 +3736 4 6.64277124 2.6427712440490723 6.9842398483726811 +3737 5 5.82993937 0.82993936538696289 0.6887993502189147 +3740 7 6.85790253 0.14209747314453125 0.02019169187406078 +3742 7 6.85790253 0.14209747314453125 0.02019169187406078 +3743 7 6.85790253 0.14209747314453125 0.02019169187406078 +3746 5 6.410911 1.4109110832214355 1.9906700847570846 +3747 6 5.903495 0.096505165100097656 0.0093132468909971067 +3751 5 5.30141163 0.30141162872314453 0.090848969929538725 +3752 5 5.49193048 0.49193048477172852 0.24199560184774782 +3754 8 7.51627445 0.48372554779052734 0.23399040558524575 +3755 6 6.62061739 0.62061738967895508 0.38516594437191998 +3756 5 5.30141163 0.30141162872314453 0.090848969929538725 +3758 5 5.33939171 0.33939170837402344 0.11518673171303817 +3760 6 6.52007627 0.52007627487182617 0.27047933168455529 +3761 7 6.4862113 0.51378870010375977 0.26397882835431119 +3763 5 6.282187 1.2821869850158691 1.6440034645440846 +3765 5 5.128152 0.12815189361572266 0.016422907837295497 +3768 6 5.7956624 0.20433759689331055 0.041753853504133076 +3770 4 6.34593534 2.3459353446960449 5.5034126414941511 +3773 5 5.937312 0.93731212615966797 0.87855402184595732 +3774 5 5.42767525 0.42767524719238281 0.18290611706106574 +3775 6 6.66805124 0.66805124282836914 0.44629246304452863 +3777 6 6.66805124 0.66805124282836914 0.44629246304452863 +3780 5 5.42767525 0.42767524719238281 0.18290611706106574 +3781 6 6.38605833 0.38605833053588867 0.14904103457615747 +3783 5 5.32522774 0.32522773742675781 0.10577308119172812 +3784 6 5.75775862 0.24224138259887695 0.058680887443415486 +3787 5 5.47676039 0.4767603874206543 0.22730046701349238 +3788 5 5.52795649 0.52795648574829102 0.27873805084368541 +3789 6 5.364557 0.63544321060180664 0.40378807389993199 +3791 5 5.39469528 0.39469528198242188 0.15578436561918352 +3792 6 5.909566 0.090434074401855469 0.0081783218129203306 +3793 6 5.29336739 0.70663261413574219 0.49932965136031271 +3798 5 5.59243059 0.59243059158325195 0.35097400584368188 +3800 5 5.20580673 0.20580673217773438 0.042356411009677686 +3801 6 5.628341 0.3716588020324707 0.13813026512821125 +3805 6 5.628341 0.3716588020324707 0.13813026512821125 +3808 6 5.647771 0.35222911834716797 0.12406535181162326 +3809 6 5.84592 0.15407991409301758 0.023740619926911677 +3815 7 6.376214 0.62378597259521484 0.38910893960655812 +3820 5 5.81555 0.81554985046386719 0.66512155859163613 +3821 6 6.02812147 0.028121471405029297 0.00079081715398388042 +3823 5 5.43096447 0.43096446990966797 0.18573037432452111 +3824 7 6.106088 0.89391183853149414 0.79907837506675605 +3830 7 5.819285 1.1807150840759277 1.3940881097644251 +3833 6 5.623856 0.3761439323425293 0.14148425783810126 +3834 5 5.299482 0.29948186874389648 0.089689389706336442 +3838 5 5.299482 0.29948186874389648 0.089689389706336442 +3839 5 5.062541 0.062541007995605469 0.0039113776811063872 +3841 6 6.151886 0.151885986328125 0.023069352842867374 +3843 7 6.883123 0.11687707901000977 0.013660251597912065 +3848 6 5.52939653 0.47060346603393555 0.22146762224315353 +3850 6 6.316198 0.31619787216186523 0.099981094359691269 +3853 7 7.27425861 0.27425861358642578 0.075217787126348412 +3854 6 7.09188 1.0918798446655273 1.1922015951868161 +3855 6 6.427566 0.4275660514831543 0.18281272838089535 +3860 5 5.274571 0.27457094192504883 0.075389202149608536 +3862 6 5.437691 0.56230878829956055 0.31619117339892 +3863 6 5.437691 0.56230878829956055 0.31619117339892 +3866 6 5.87392473 0.12607526779174805 0.015894973148760982 +3869 6 5.405648 0.59435176849365234 0.35325402471153211 +3870 6 5.75473547 0.24526453018188477 0.060154689765340663 +3872 4 5.027593 1.0275931358337402 1.0559476528126197 +3875 7 6.12440825 0.87559175491333008 0.76666092127220509 +3876 5 5.308399 0.30839920043945313 0.095110066831693985 +3886 6 6.642862 0.64286184310913086 0.41327134932566878 +3888 6 5.67370367 0.32629632949829102 0.1064692946440573 +3889 6 5.64668274 0.3533172607421875 0.12483308673836291 +3891 5 5.865996 0.86599588394165039 0.74994887100388041 +3893 5 4.624341 0.37565898895263672 0.14111967598091724 +3894 6 6.324618 0.32461786270141602 0.10537675678483538 +3897 6 6.015486 0.015485763549804688 0.00023980887272045948 +3900 5 4.624341 0.37565898895263672 0.14111967598091724 +3903 6 6.194684 0.19468402862548828 0.037901871001849941 +3904 7 6.61869669 0.38130331039428711 0.14539221451764206 +3907 7 6.946438 0.053562164306640625 0.002868905445211567 +3912 7 7.01307535 0.013075351715087891 0.00017096482247325184 +3916 6 6.58867741 0.58867740631103516 0.34654108870108757 +3918 7 6.268551 0.73144912719726563 0.53501782567764167 +3919 6 6.237363 0.23736286163330078 0.056341128082749492 +3921 5 5.30553961 0.30553960800170898 0.093354452057837989 +3924 5 4.881786 0.11821413040161133 0.013974580626609168 +3929 5 5.26826143 0.26826143264770508 0.071964196246199208 +3934 6 6.38188839 0.38188838958740234 0.14583874210165959 +3935 5 5.359629 0.35962915420532227 0.12933312855443546 +3938 6 6.10134935 0.1013493537902832 0.010271691513707992 +3939 6 6.249502 0.24950218200683594 0.062251338826172287 +3948 5 5.736434 0.73643398284912109 0.54233501109501958 +3955 6 5.976232 0.023767948150634766 0.00056491535929126258 +3957 5 6.780936 1.7809357643127441 3.1717321966082181 +3958 6 5.82819653 0.17180347442626953 0.029516433824937849 +3961 5 4.857042 0.14295816421508789 0.020437036715748036 +3964 5 5.03904772 0.039047718048095703 0.0015247242847635789 +3966 6 5.764548 0.23545217514038086 0.055437726778336582 +3968 6 5.10690451 0.89309549331665039 0.79761956018251112 +3969 6 6.148906 0.14890623092651367 0.022173065608740217 +3971 6 6.148906 0.14890623092651367 0.022173065608740217 +3972 6 5.454913 0.54508686065673828 0.29711968566061842 +3974 6 5.10690451 0.89309549331665039 0.79761956018251112 +3975 7 6.77839375 0.22160625457763672 0.049109332067928335 +3976 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3977 6 6.793038 0.79303789138793945 0.62890909717702925 +3979 6 6.155224 0.15522384643554688 0.024094442502246238 +3980 5 5.886582 0.8865818977355957 0.78602746139245028 +3981 7 6.80097628 0.19902372360229492 0.039610442556522685 +3983 6 5.608051 0.39194917678833008 0.15362415718504963 +3984 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3986 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3987 6 5.70724154 0.29275846481323242 0.085707518719800646 +3988 6 5.9042244 0.095775604248046875 0.0091729663690784946 +3989 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3991 5 5.926727 0.9267268180847168 0.85882259535742378 +3992 7 6.098081 0.90191888809204102 0.8134576806971836 +3998 6 5.93369 0.066309928894042969 0.0043970066699330346 +3999 6 5.93369 0.066309928894042969 0.0043970066699330346 +4000 6 5.93369 0.066309928894042969 0.0043970066699330346 +4001 5 5.49348354 0.49348354339599609 0.24352600760266796 +4005 6 6.2540493 0.25404930114746094 0.064541047413513297 +4007 5 5.49348354 0.49348354339599609 0.24352600760266796 +4008 6 5.61225367 0.38774633407592773 0.15034721958932096 +4012 6 5.93369 0.066309928894042969 0.0043970066699330346 +4013 6 5.200166 0.79983377456665039 0.63973406693753532 +4016 5 5.1244154 0.12441539764404297 0.015479191170925333 +4020 4 4.586666 0.58666610717773438 0.34417712131107692 +4023 6 6.271843 0.27184295654296875 0.073898593022022396 +4026 6 6.271843 0.27184295654296875 0.073898593022022396 +4028 6 6.18963432 0.18963432312011719 0.035961176505225012 +4030 5 6.190148 1.190147876739502 1.4164519685075447 +4036 5 5.464335 0.46433496475219727 0.21560695949142428 +4038 5 5.17922926 0.1792292594909668 0.032123127457680312 +4040 5 5.52691 0.52690982818603516 0.27763396703903709 +4041 5 5.26324558 0.26324558258056641 0.069298236748181807 +4042 7 6.8913846 0.10861539840698242 0.01179730477110752 +4045 7 6.8913846 0.10861539840698242 0.01179730477110752 +4046 7 6.91408825 0.085911750793457031 0.0073808289243970648 +4048 6 6.34028769 0.34028768539428711 0.11579570883100132 +4057 6 6.27755642 0.27755641937255859 0.077037565934915619 +4058 6 6.34028769 0.34028768539428711 0.11579570883100132 +4060 5 5.11373043 0.11373043060302734 0.012934610845150019 +4061 5 5.11373043 0.11373043060302734 0.012934610845150019 +4062 6 6.122509 0.12250900268554688 0.015008455739007331 +4063 5 5.579146 0.57914590835571289 0.33540998316516379 +4065 8 7.120815 0.87918519973754883 0.77296661543755363 +4067 5 5.2989316 0.29893159866333008 0.089360100679414245 +4068 6 6.5147295 0.51472949981689453 0.26494645798175043 +4069 6 5.64842272 0.3515772819519043 0.12360658518468881 +4072 7 6.107794 0.89220619201660156 0.7960318890727649 +4073 5 4.71371031 0.28628969192504883 0.081961787702539368 +4074 4 5.083258 1.0832581520080566 1.1734482238919099 +4076 5 5.92422056 0.92422056198120117 0.85418364718884732 +4077 6 6.005199 0.0051989555358886719 2.7029138664147467E-05 +4079 6 5.716552 0.28344821929931641 0.080342893023953366 +4080 6 5.704811 0.29518890380859375 0.087136488931719214 +4081 6 5.569051 0.43094921112060547 0.18571722256547218 +4083 5 4.93252039 0.067479610443115234 0.0045534978255545866 +4084 8 5.853612 2.146388053894043 4.6069816778990571 +4089 6 5.53380537 0.46619462966918945 0.2173374327323927 +4090 6 5.56470728 0.43529272079467773 0.18947975277683327 +4092 6 5.215562 0.78443813323974609 0.61534318488065765 +4093 6 5.03059769 0.96940231323242188 0.93974084490037058 +4095 6 5.03059769 0.96940231323242188 0.93974084490037058 +4098 5 6.015106 1.015106201171875 1.0304405996575952 +4104 7 6.56624937 0.43375062942504883 0.18813960852662603 +4106 5 6.116082 1.1160821914672852 1.2456394581104178 +4110 5 5.31600857 0.31600856781005859 0.0998614149293644 +4113 6 6.51928663 0.5192866325378418 0.26965860673249153 +4114 6 5.713825 0.28617477416992188 0.081896001371205784 +4115 6 5.93225 0.067749977111816406 0.0045900593986516469 +4116 6 5.14707851 0.85292148590087891 0.72747506111136317 +4117 6 5.14707851 0.85292148590087891 0.72747506111136317 +4118 8 6.23626661 1.7637333869934082 3.1107554603952394 +4121 6 5.7118 0.28819990158081055 0.083059183271188886 +4123 6 6.95849562 0.9584956169128418 0.91871384764112918 +4124 7 6.216066 0.78393411636352539 0.61455269879866137 +4127 5 5.599305 0.59930515289306641 0.3591666662841817 +4129 7 5.934724 1.0652761459350586 1.1348132670982523 +4130 6 5.946668 0.053331851959228516 0.0028442864334010665 +4135 5 6.103442 1.1034421920776367 1.2175846712571001 +4142 6 6.252783 0.25278282165527344 0.063899154924001778 +4144 6 5.86206245 0.13793754577636719 0.019026766534807393 +4145 6 5.94314146 0.056858539581298828 0.0032328935233181255 +4146 7 5.79053 1.2094697952270508 1.4628171855665641 +4148 6 5.52015257 0.47984743118286133 0.23025355721279084 +4153 5 5.20253658 0.20253658294677734 0.041021067431756819 +4156 5 5.38787365 0.38787364959716797 0.15044596805182664 +4157 7 6.977525 0.022474765777587891 0.00050511509675743582 +4158 7 6.977525 0.022474765777587891 0.00050511509675743582 +4161 7 6.977525 0.022474765777587891 0.00050511509675743582 +4164 5 5.730478 0.73047780990600586 0.53359783076507483 +4167 8 6.453016 1.5469841957092285 2.3931601017741286 +4172 6 6.139005 0.13900518417358398 0.019322441227132003 +4173 5 5.60594034 0.60594034194946289 0.36716369800183202 +4175 7 6.018053 0.98194694519042969 0.96421980316881672 +4176 6 6.32258368 0.32258367538452148 0.10406022762458633 +4182 6 5.23854876 0.76145124435424805 0.57980799752863277 +4183 7 6.72853756 0.27146244049072266 0.073691856597179139 +4185 5 5.278079 0.27807903289794922 0.077327948537458724 +4190 6 5.69684839 0.30315160751342773 0.091900897137975335 +4191 5 5.73005342 0.73005342483520508 0.53297800311361243 +4192 6 5.830771 0.16922903060913086 0.028638464800906149 +4193 6 6.13968849 0.13968849182128906 0.019512874747306341 +4194 6 5.830771 0.16922903060913086 0.028638464800906149 +4197 5 5.29363 0.29363012313842773 0.086218649214288234 +4198 5 5.067099 0.067099094390869141 0.0045022884680747666 +4200 6 6.08601665 0.086016654968261719 0.0073988649319289834 +4201 6 6.131825 0.13182497024536133 0.017377822780190399 +4202 6 6.68126154 0.68126153945922852 0.46411728514635797 +4204 6 5.799505 0.20049476623535156 0.040198151287768269 +4209 6 6.531081 0.53108119964599609 0.28204724061743036 +4214 5 5.212247 0.21224689483642578 0.045048744367704785 +4216 5 5.212247 0.21224689483642578 0.045048744367704785 +4217 4 5.07387161 1.0738716125488281 1.1532002402382204 +4219 5 5.212247 0.21224689483642578 0.045048744367704785 +4220 6 6.067357 0.067357063293457031 0.0045369739755187766 +4224 7 6.365413 0.63458681106567383 0.40270042077850121 +4226 7 5.527336 1.4726638793945313 2.1687389016733505 +4232 6 6.64348555 0.64348554611206055 0.4140736480551368 +4234 6 5.63266134 0.36733865737915039 0.13493768920511684 +4238 5 5.22960567 0.22960567474365234 0.052718765874487872 +4239 7 6.749726 0.2502741813659668 0.062637165858404842 +4242 7 6.697168 0.30283212661743164 0.091707296911636149 +4243 6 6.37470675 0.37470674514770508 0.1404051448591872 +4245 5 5.29424858 0.29424858093261719 0.086582227380858967 +4246 6 6.760518 0.76051807403564453 0.5783877409348861 +4247 6 5.40436745 0.59563255310058594 0.35477813831312233 +4248 6 5.580484 0.41951608657836914 0.17599374689802971 +4250 6 5.488685 0.51131486892700195 0.26144289518583719 +4252 6 5.488685 0.51131486892700195 0.26144289518583719 +4255 5 5.07407 0.074069976806640625 0.0054863614641362801 +4258 6 5.98729753 0.012702465057373047 0.00016135261853378324 +4259 6 6.60455 0.60454988479614258 0.36548056320702926 +4264 6 6.177701 0.17770099639892578 0.031577644121171033 +4265 6 5.908764 0.091236114501953125 0.0083240285894135013 +4267 7 6.820651 0.17934894561767578 0.032166044294172025 +4269 5 5.326494 0.32649421691894531 0.10659847368151532 +4270 6 5.813092 0.18690776824951172 0.034934513832013181 +4273 6 5.918317 0.081683158874511719 0.0066721384437187226 +4276 7 7.633585 0.63358497619628906 0.40142992206165218 +4277 5 5.82106733 0.82106733322143555 0.67415156568335988 +4280 6 5.918317 0.081683158874511719 0.0066721384437187226 +4282 5 5.33614159 0.33614158630371094 0.11299116604277515 +4283 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4284 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4285 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4286 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4287 5 5.39428425 0.39428424835205078 0.15546006849854166 +4289 6 5.64777946 0.35222053527832031 0.12405930547174648 +4290 5 5.33614159 0.33614158630371094 0.11299116604277515 +4293 5 5.299876 0.29987621307373047 0.089925743167441397 +4294 5 6.0532794 1.0532793998718262 1.1093974941943543 +4296 6 6.14942265 0.14942264556884766 0.022327127008793468 +4298 6 6.638621 0.63862085342407227 0.40783659442809039 +4299 6 5.2250433 0.77495670318603516 0.60055789181296859 +4302 6 5.51465559 0.48534440994262695 0.23555919626255672 +4303 6 6.4400897 0.44008970260620117 0.19367894634001459 +4305 6 5.619583 0.3804168701171875 0.1447169950697571 +4309 6 6.74624825 0.74624824523925781 0.55688644352267147 +4312 6 6.4400897 0.44008970260620117 0.19367894634001459 +4313 6 6.62467575 0.62467575073242188 0.39021979355311487 +4316 5 4.71171951 0.28828048706054688 0.083105639219866134 +4317 7 7.19724035 0.19724035263061523 0.038903756705849446 +4320 5 5.338316 0.33831596374511719 0.11445769132478745 +4321 6 5.84775972 0.15224027633666992 0.02317710173906562 +4326 5 5.14266634 0.14266633987426758 0.020353684533120031 +4328 5 5.84332 0.84331989288330078 0.7111884417327019 +4329 5 5.784898 0.78489780426025391 0.61606456313256786 +4330 5 5.43720341 0.43720340728759766 0.191146819343885 +4332 8 7.57545471 0.4245452880859375 0.18023870163597167 +4333 8 7.57545471 0.4245452880859375 0.18023870163597167 +4334 8 7.57545471 0.4245452880859375 0.18023870163597167 +4335 8 7.57545471 0.4245452880859375 0.18023870163597167 +4337 8 7.57545471 0.4245452880859375 0.18023870163597167 +4340 8 7.57545471 0.4245452880859375 0.18023870163597167 +4341 6 5.22670174 0.77329826354980469 0.59799020440914319 +4343 6 6.110325 0.11032485961914063 0.012171574649983086 +4349 5 4.938276 0.061724185943603516 0.0038098751304005418 +4351 6 6.868826 0.86882591247558594 0.75485846618903452 +4352 5 5.5040555 0.50405550003051758 0.25407194711101511 +4353 6 5.86647367 0.13352632522583008 0.017829279528314146 +4354 6 6.25179052 0.25179052352905273 0.063398467739034459 +4355 6 6.868826 0.86882591247558594 0.75485846618903452 +4358 5 5.730952 0.73095178604125977 0.53429051351690759 +4361 6 6.518792 0.51879215240478516 0.26914529739678983 +4362 6 6.90053844 0.90053844451904297 0.81096949005677743 +4363 5 5.40533924 0.40533924102783203 0.16429990031701891 +4365 5 5.36372948 0.36372947692871094 0.13229913238683366 +4366 6 6.705825 0.70582485198974609 0.49818872168634698 +4369 6 6.32576561 0.32576560974121094 0.10612323249006295 +4370 5 5.68760538 0.68760538101196289 0.47280115999660666 +4372 6 6.074046 0.074046134948730469 0.0054828301008456037 +4375 6 5.893817 0.10618305206298828 0.01127484054541128 +4376 5 5.17443466 0.17443466186523438 0.030427451260038652 +4378 5 5.038073 0.038073062896728516 0.0014495581183382455 +4380 6 6.3993845 0.39938449859619141 0.15950797771893122 +4382 6 5.917463 0.082537174224853516 0.0068123851290238235 +4386 6 6.25856447 0.25856447219848633 0.066855586283281809 +4388 6 5.614622 0.38537788391113281 0.14851611340782256 +4393 6 5.164492 0.83550786972045898 0.69807340036481946 +4397 5 5.397777 0.39777708053588867 0.15822660579965486 +4398 5 5.397777 0.39777708053588867 0.15822660579965486 +4399 5 5.684684 0.68468379974365234 0.46879190563140583 +4400 5 5.397777 0.39777708053588867 0.15822660579965486 +4403 5 5.706885 0.70688486099243164 0.4996862067002894 +4406 7 6.86297035 0.13702964782714844 0.018777124383632326 +4408 5 5.08429337 0.084293365478515625 0.0071053714636946097 +4410 5 5.277465 0.27746486663818359 0.076986752218545007 +4411 7 6.745393 0.25460720062255859 0.064824826608855801 +4413 7 6.745393 0.25460720062255859 0.064824826608855801 +4414 7 6.442507 0.55749320983886719 0.3107986790164432 +4415 5 4.99544764 0.0045523643493652344 2.0724021169371554E-05 +4417 6 5.8144083 0.18559169769287109 0.034444278252522054 +4418 6 5.931572 0.06842803955078125 0.004682396596763283 +4419 6 5.931572 0.06842803955078125 0.004682396596763283 +4421 6 5.931572 0.06842803955078125 0.004682396596763283 +4422 6 5.8144083 0.18559169769287109 0.034444278252522054 +4426 6 5.705164 0.29483604431152344 0.086928293025266612 +4428 6 6.468404 0.46840381622314453 0.21940213505240536 +4431 6 6.39723539 0.39723539352416992 0.15779595786830214 +4436 6 6.40647268 0.40647268295288086 0.1652200419869132 +4437 6 5.883115 0.11688518524169922 0.013662146528986341 +4439 5 5.15067148 0.15067148208618164 0.022701895514046555 +4440 5 5.1135397 0.11353969573974609 0.012891262508674117 +4442 5 5.1135397 0.11353969573974609 0.012891262508674117 +4443 5 5.15067148 0.15067148208618164 0.022701895514046555 +4445 6 6.049947 0.049946784973144531 0.0024946813291535364 +4446 6 7.41717434 1.4171743392944336 2.0083831079546144 +4447 6 6.83694124 0.83694124221801758 0.70047064292543837 +4448 5 5.7396884 0.73968839645385742 0.54713892384847895 +4449 6 5.59850836 0.40149164199829102 0.16119553859448388 +4453 6 6.83694124 0.83694124221801758 0.70047064292543837 +4455 5 5.36782932 0.36782932281494141 0.13529841072249837 +4456 5 5.36782932 0.36782932281494141 0.13529841072249837 +4457 5 5.36782932 0.36782932281494141 0.13529841072249837 +4459 5 5.74466658 0.74466657638549805 0.5545283099856988 +4460 6 6.03332043 0.033320426940917969 0.001110250851525052 +4461 6 6.06109 0.061089992523193359 0.0037319871864838206 +4462 6 6.87517548 0.87517547607421875 0.76593211392173544 +4465 5 5.08348751 0.083487510681152344 0.0069701644397355267 +4466 5 6.087393 1.0873928070068359 1.1824231167302059 +4470 6 6.019186 0.019186019897460938 0.000368103359505767 +4472 5 6.441713 1.4417128562927246 2.0785359599997264 +4473 5 5.164528 0.16452789306640625 0.02706942759687081 +4475 6 6.676889 0.67688894271850586 0.45817864077457671 +4478 5 5.13800049 0.13800048828125 0.019044134765863419 +4481 5 5.13800049 0.13800048828125 0.019044134765863419 +4482 6 6.622241 0.62224102020263672 0.38718388722281816 +4486 6 5.631071 0.36892890930175781 0.13610854011858464 +4489 6 6.71970654 0.71970653533935547 0.51797749701017892 +4491 6 6.941034 0.94103384017944336 0.88554468836287015 +4493 6 5.62146044 0.3785395622253418 0.14329220016975341 +4494 6 5.2161746 0.78382539749145508 0.61438225375263755 +4496 6 5.2161746 0.78382539749145508 0.61438225375263755 +4497 5 5.11741972 0.11741971969604492 0.01378739057349776 +4498 5 5.85148859 0.85148859024047852 0.72503281930971752 +4499 6 6.16708231 0.16708230972290039 0.027916498222339214 +4503 7 5.85099649 1.1490035057067871 1.3202090561264868 +4504 5 5.362151 0.36215114593505859 0.13115345250207611 +4507 5 6.42801046 1.4280104637145996 2.0392138844783858 +4509 5 5.371576 0.37157583236694336 0.13806859919918679 +4511 6 6.220184 0.2201838493347168 0.048480927507853266 +4512 6 6.220184 0.2201838493347168 0.048480927507853266 +4514 5 4.845057 0.15494298934936523 0.024007329948517508 +4516 6 6.39635229 0.39635229110717773 0.15709513866590896 +4517 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4520 5 5.155404 0.15540409088134766 0.024150431462658162 +4521 5 5.37260532 0.37260532379150391 0.13883472731777147 +4522 6 5.769117 0.23088312149047852 0.053307015789187062 +4526 6 5.97513342 0.024866580963134766 0.00061834684879613633 +4527 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4528 6 4.818622 1.1813778877258301 1.395653713607544 +4530 6 5.28060865 0.7193913459777832 0.51752390866772657 +4531 6 5.28060865 0.7193913459777832 0.51752390866772657 +4532 6 6.008641 0.0086407661437988281 7.466283955182007E-05 +4533 5 5.92288446 0.92288446426391602 0.85171573437969528 +4534 6 6.12120628 0.12120628356933594 0.014690963176690275 +4535 6 5.525482 0.474517822265625 0.22516716364771128 +4536 6 5.28060865 0.7193913459777832 0.51752390866772657 +4542 5 6.20716143 1.2071614265441895 1.4572387097362025 +4543 5 6.20716143 1.2071614265441895 1.4572387097362025 +4544 6 6.543812 0.54381179809570313 0.29573127174808178 +4549 5 6.20716143 1.2071614265441895 1.4572387097362025 +4551 6 5.996477 0.0035228729248046875 1.2410633644321933E-05 +4552 6 6.598306 0.59830617904663086 0.3579702838853791 +4554 6 6.31430149 0.31430149078369141 0.098785427108850854 +4556 5 6.612007 1.6120071411132813 2.5985670230002142 +4557 6 5.471904 0.52809619903564453 0.27888559543589508 +4558 6 6.156162 0.15616178512573242 0.024386503133655424 +4561 6 6.82648325 0.82648324966430664 0.68307456197567262 +4564 7 6.24290752 0.75709247589111328 0.57318901705093595 +4565 5 6.27208471 1.2720847129821777 1.6181995170029495 +4566 5 6.538882 1.538881778717041 2.368157128867324 +4567 5 6.27208471 1.2720847129821777 1.6181995170029495 +4568 6 6.33394957 0.33394956588745117 0.11152231255641709 +4570 6 6.37727451 0.37727451324462891 0.14233605834397167 +4572 7 6.25381851 0.74618148803710938 0.5567868130892748 +4573 6 6.933242 0.93324184417724609 0.87094033972334728 +4577 6 5.9036355 0.096364498138427734 0.0092861165014710423 +4579 6 6.24599648 0.24599647521972656 0.060514265820529545 +4580 6 6.653771 0.65377092361450195 0.42741642056375895 +4583 6 5.49828339 0.50171661376953125 0.25171956053236499 +4584 6 5.967186 0.03281402587890625 0.0010767602943815291 +4585 6 6.15143728 0.15143728256225586 0.022933250549840523 +4586 6 6.189822 0.18982219696044922 0.036032466458891577 +4587 6 6.33160353 0.3316035270690918 0.1099608991646619 +4590 6 6.05400848 0.05400848388671875 0.0029169163317419589 +4593 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4596 6 6.55546 0.55545997619628906 0.30853578515598201 +4597 6 4.86262274 1.1373772621154785 1.2936270363773019 +4598 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4599 7 6.113054 0.88694620132446289 0.78667356404389466 +4600 6 5.383654 0.61634588241577148 0.37988224677087601 +4602 6 5.796041 0.20395898818969727 0.041599268863365069 +4605 6 6.691703 0.69170284271240234 0.47845282261641842 +4606 5 5.867839 0.86783885955810547 0.75314428615911311 +4607 6 6.22378063 0.22378063201904297 0.050077771266842319 +4608 7 6.26591825 0.73408174514770508 0.53887600855910023 +4609 4 3.5493567 0.45064330101013184 0.20307938474530829 +4613 5 5.46949959 0.46949958801269531 0.22042986314409063 +4615 7 6.76983929 0.23016071319580078 0.052973953898799664 +4617 7 6.599219 0.40078115463256836 0.16062553390861467 +4619 5 4.840745 0.15925502777099609 0.025362163870340737 +4621 7 5.61909 1.3809099197387695 1.9069122064329349 +4623 6 6.6815424 0.68154239654541016 0.46450003828886111 +4624 6 6.745368 0.74536800384521484 0.55557346115620021 +4625 5 5.35424328 0.35424327850341797 0.12548830036485015 +4630 7 6.001225 0.99877500534057617 0.99755151129306796 +4632 6 6.16925764 0.16925764083862305 0.028648148982256316 +4635 6 5.69187737 0.30812263488769531 0.094939558130135993 +4636 5 5.49239874 0.49239873886108398 0.24245651803198598 +4639 6 5.240025 0.75997495651245117 0.57756193452610205 +4641 6 6.17320633 0.17320632934570313 0.03000043252541218 +4642 7 6.39035463 0.60964536666870117 0.3716674731006151 +4644 6 6.755946 0.75594615936279297 0.57145459585535718 +4645 7 6.61975336 0.38024663925170898 0.14458750666221931 +4647 7 6.0159874 0.98401260375976563 0.96828080435807351 +4648 5 4.8469286 0.15307140350341797 0.023430854570506199 +4650 5 4.755362 0.24463796615600586 0.059847734484947068 +4653 7 6.709774 0.29022598266601563 0.084231121014454402 +4654 7 6.45592451 0.54407548904418945 0.29601813777867392 +4655 7 6.45592451 0.54407548904418945 0.29601813777867392 +4658 6 6.760667 0.76066684722900391 0.57861405247331277 +4659 6 5.703014 0.29698610305786133 0.08820074540949463 +4660 6 6.24925375 0.24925374984741211 0.062127431812996292 +4662 6 6.67323542 0.67323541641235352 0.45324592591191504 +4663 7 6.38869667 0.61130332946777344 0.37369176061838516 +4665 6 6.67323542 0.67323541641235352 0.45324592591191504 +4666 5 5.14793062 0.14793062210083008 0.021883468955138596 +4670 6 5.702476 0.29752397537231445 0.088520515921345577 +4671 5 5.34669828 0.34669828414916992 0.12019970023197857 +4672 5 5.34669828 0.34669828414916992 0.12019970023197857 +4675 6 5.8778615 0.12213850021362305 0.014917813234433197 +4676 6 5.78406429 0.21593570709228516 0.04662822959744517 +4677 7 6.76541662 0.23458337783813477 0.055029361157949097 +4680 4 4.34068155 0.34068155288696289 0.11606392047747249 +4681 6 6.104238 0.10423803329467773 0.010865567585142344 +4683 6 5.93819046 0.061809539794921875 0.0038204192096600309 +4687 6 5.817554 0.18244600296020508 0.03328654399615516 +4689 6 5.817554 0.18244600296020508 0.03328654399615516 +4690 6 5.817554 0.18244600296020508 0.03328654399615516 +4691 7 6.33023167 0.66976833343505859 0.44858962047237583 +4696 6 6.19866753 0.19866752624511719 0.039468785984354327 +4697 7 6.837097 0.16290283203125 0.026537332683801651 +4701 6 5.201102 0.79889822006225586 0.63823836601864059 +4706 7 6.528003 0.47199678421020508 0.2227809643047749 +4707 6 5.96410131 0.035898685455322266 0.0012887156174201664 +4708 6 6.331786 0.33178615570068359 0.11008205311463826 +4712 6 6.04505348 0.045053482055664063 0.0020298162453400437 +4713 6 6.10136843 0.10136842727661133 0.01027555804853364 +4715 6 5.3946147 0.60538530349731445 0.36649136569053553 +4716 6 5.74300957 0.25699043273925781 0.066044082519510994 +4718 6 5.63362646 0.36637353897094727 0.13422957005809621 +4719 6 5.3946147 0.60538530349731445 0.36649136569053553 +4722 6 5.84657 0.15342998504638672 0.023540760311334452 +4723 6 5.28928041 0.71071958541870117 0.50512232909773047 +4725 6 6.00947142 0.0094714164733886719 8.9707730012378306E-05 +4727 6 5.84657 0.15342998504638672 0.023540760311334452 +4729 5 5.473 0.47300004959106445 0.22372904691314943 +4730 5 5.29477644 0.29477643966674805 0.086893149382603951 +4733 6 5.96345949 0.036540508270263672 0.0013352087446492078 +4734 6 6.066205 0.066205024719238281 0.0043831052980749519 +4735 6 5.78232241 0.21767759323120117 0.047383534594928278 +4737 7 6.585888 0.41411209106445313 0.17148882396577392 +4738 6 6.43513536 0.4351353645324707 0.18934278546680616 +4743 5 5.96722364 0.9672236442565918 0.93552157800900204 +4746 6 5.36194372 0.63805627822875977 0.40711581418713649 +4748 5 5.523394 0.52339410781860352 0.27394139209923196 +4752 7 6.93892431 0.061075687408447266 0.0037302395924143639 +4754 6 5.938266 0.061734199523925781 0.0038111113908598782 +4756 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4757 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4758 6 6.21085 0.21084976196289063 0.044457622119807638 +4759 6 5.674312 0.32568788528442383 0.10607259862104002 +4762 7 6.27820635 0.72179365158081055 0.52098607546236053 +4764 6 6.137934 0.13793420791625977 0.019025845713485978 +4766 8 6.511512 1.4884881973266602 2.2155971135807704 +4770 6 5.603624 0.39637613296508789 0.15711403878435704 +4771 6 5.603624 0.39637613296508789 0.15711403878435704 +4772 5 5.26272154 0.26272153854370117 0.06902260681476946 +4773 7 5.97403574 1.0259642601013184 1.0526026630052456 +4774 4 5.354617 1.3546171188354492 1.8349875386420536 +4775 6 5.57587957 0.42412042617797852 0.17987813590139012 +4776 6 5.650073 0.34992694854736328 0.12244886931966903 +4783 6 5.35315752 0.64684247970581055 0.41840519355196193 +4784 5 5.531172 0.53117179870605469 0.28214347974062548 +4785 7 6.33343124 0.66656875610351563 0.4443139066133881 +4789 6 5.343524 0.65647602081298828 0.43096076590245502 +4791 6 5.35315752 0.64684247970581055 0.41840519355196193 +4793 6 5.07362556 0.92637443542480469 0.85816959460862563 +4794 5 5.07362556 0.073625564575195313 0.0054207237590162549 +4796 7 6.493846 0.50615406036376953 0.25619193282273045 +4797 6 6.459453 0.45945310592651367 0.21109715654552019 +4800 7 6.00343752 0.99656248092651367 0.99313677839040793 +4801 7 6.493846 0.50615406036376953 0.25619193282273045 +4802 8 6.794405 1.2055950164794922 1.453459343760187 +4803 7 6.66979647 0.33020353317260742 0.10903437331967325 +4804 4 5.978493 1.9784932136535645 3.914435396473209 +4807 6 6.04026556 0.040265560150146484 0.0016213153342050646 +4808 5 5.662127 0.66212701797485352 0.43841218793227199 +4811 6 6.34599733 0.34599733352661133 0.11971415480752512 +4812 7 6.139992 0.86000776290893555 0.7396133522636319 +4813 5 5.13426828 0.13426828384399414 0.018027972046411378 +4815 7 5.8541317 1.1458683013916016 1.3130141641340742 +4816 6 5.439974 0.56002616882324219 0.31362930976683856 +4817 6 6.275693 0.27569293975830078 0.076006597032574064 +4822 6 6.09246 0.092460155487060547 0.0085488803526914126 +4826 6 6.226658 0.22665786743164063 0.051373788868659176 +4828 5 5.32722235 0.32722234725952148 0.10707446454603087 +4829 7 6.61797571 0.38202428817749023 0.1459425567575181 +4830 6 5.84604 0.15396022796630859 0.023703751795437711 +4832 5 5.717937 0.71793699264526367 0.51543352540852538 +4834 7 6.58480167 0.41519832611083984 0.17238965000524331 +4835 6 6.32257843 0.32257843017578125 0.10405684361467138 +4836 5 5.107541 0.10754108428955078 0.011565084810172266 +4837 6 6.83404541 0.83404541015625 0.69563174620270729 +4839 4 4.61754942 0.61754941940307617 0.38136728540507647 +4841 6 5.934297 0.065702915191650391 0.0043168730646812037 +4844 6 5.908849 0.091151237487792969 0.0083085480955560342 +4845 5 5.235182 0.23518180847167969 0.055310483036009828 +4846 6 6.62231541 0.62231540679931641 0.38727646553979866 +4849 5 5.278072 0.27807188034057617 0.077323970636143713 +4850 6 6.022924 0.022923946380615234 0.0005255073176613223 +4851 5 5.278072 0.27807188034057617 0.077323970636143713 +4852 5 6.418775 1.4187750816345215 2.0129227322670431 +4853 5 5.904184 0.90418386459350586 0.81754846099124734 +4854 6 7.04106474 1.0410647392272949 1.0838157912623956 +4856 6 5.81926346 0.18073654174804688 0.032665697523043491 +4859 6 6.03407764 0.034077644348144531 0.0011612858443186269 +4860 6 6.10150051 0.10150051116943359 0.010302353767656314 +4862 6 6.09098768 0.090987682342529297 0.0082787583380650176 +4866 6 5.99347734 0.0065226554870605469 4.254503460288106E-05 +4867 6 4.705145 1.2948551177978516 1.676649776087288 +4869 6 5.51711273 0.48288726806640625 0.23318011366063729 +4871 6 6.68095255 0.68095254898071289 0.46369637396333019 +4872 5 5.705171 0.70517110824584961 0.49726629190467975 +4876 7 6.81956148 0.18043851852416992 0.032558058967197212 +4878 4 4.51450825 0.51450824737548828 0.26471873661739664 +4879 6 5.44779968 0.5522003173828125 0.30492519051767886 +4880 6 5.44779968 0.5522003173828125 0.30492519051767886 +4881 6 5.75216627 0.2478337287902832 0.061421557126095649 +4882 5 5.97157431 0.97157430648803711 0.94395663302771027 +4883 6 6.152341 0.15234088897705078 0.023207746454318112 +4886 7 6.863344 0.13665580749511719 0.018674809722142527 +4887 7 4.93395472 2.0660452842712402 4.2685431166594299 +4888 5 6.00417376 1.004173755645752 1.0083649315276944 +4889 6 5.75216627 0.2478337287902832 0.061421557126095649 +4894 5 5.44779968 0.4477996826171875 0.20052455575205386 +4896 7 6.65991926 0.34008073806762695 0.11565490840462189 diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-out.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-out.txt new file mode 100644 index 0000000000..4792a52b30 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-out.txt @@ -0,0 +1,32 @@ +maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.407028 +L2(avg): 0.274963 +RMS(avg): 0.524369 +Loss-fn(avg): 0.274963 +R Squared: 0.649369 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.407028 (0.0000) +L2(avg): 0.274963 (0.0000) +RMS(avg): 0.524369 (0.0000) +Loss-fn(avg): 0.274963 (0.0000) +R Squared: 0.649369 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-l1: 0.407028426136092 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-rp.txt new file mode 100644 index 0000000000..cf5f4d432b --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.407028 0.274963 0.524369 0.274963 0.649369 50 0.2 20 10 + 1 Mae LightGBMR %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Mae + diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE.txt new file mode 100644 index 0000000000..c0618c3738 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegMae-TrainTest-wine.MAE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +0 6 5.680711 0.31928920745849609 0.10194559799947456 +1 6 5.534508 0.46549177169799805 0.21668258951854114 +2 6 5.711945 0.2880549430847168 0.082975650235539433 +3 6 5.78378773 0.21621227264404297 0.046747746841901971 +4 6 5.78378773 0.21621227264404297 0.046747746841901971 +5 6 5.711945 0.2880549430847168 0.082975650235539433 +6 6 5.29387236 0.70612764358520508 0.49861624903519441 +7 6 5.680711 0.31928920745849609 0.10194559799947456 +8 6 5.534508 0.46549177169799805 0.21668258951854114 +9 6 5.93140268 0.068597316741943359 0.0047055918641945027 +10 5 5.76748276 0.76748275756835938 0.58902978316473309 +11 5 5.426882 0.42688179016113281 0.18222806277117343 +12 5 5.87265 0.872650146484375 0.76151827815920115 +13 7 6.908373 0.091627120971679688 0.0083955292975588236 +14 5 5.333195 0.33319520950317383 0.1110190476358639 +15 7 6.38952065 0.61047935485839844 0.37268504270832636 +16 6 4.975053 1.0249471664428711 1.0505166939992705 +17 8 7.327068 0.67293214797973633 0.45283767578462175 +18 6 5.770521 0.22947883605957031 0.052660536199255148 +19 5 5.274254 0.27425384521484375 0.075215171615127474 +20 8 7.327068 0.67293214797973633 0.45283767578462175 +21 7 6.28790045 0.71209955215454102 0.50708577217869788 +22 8 6.739554 1.2604460716247559 1.5887242994742792 +23 5 4.72103071 0.27896928787231445 0.077823863575986252 +24 6 5.4655714 0.53442859649658203 0.28561392475330649 +25 6 5.91425276 0.085747241973876953 0.0073525895061266056 +26 6 5.993135 0.0068650245666503906 4.7128562300713384E-05 +27 6 6.12550831 0.12550830841064453 0.015752335480101465 +28 6 5.638529 0.36147117614746094 0.13066141118542873 +29 7 6.716088 0.28391218185424805 0.080606127005239614 +30 6 5.67022943 0.32977056503295898 0.10874862556215703 +31 6 5.82089472 0.17910528182983398 0.03207870197934426 +32 6 5.84701443 0.15298557281494141 0.023404585489515739 +33 6 6.165793 0.16579294204711914 0.027487299632639406 +34 5 5.41362047 0.4136204719543457 0.17108189481973568 +35 5 5.8876605 0.88766050338745117 0.78794116927406321 +36 5 5.140776 0.14077615737915039 0.019817926486439319 +37 6 5.909733 0.090267181396484375 0.0081481640372658148 +38 5 5.090864 0.090864181518554688 0.0082562994830368552 +39 5 5.090864 0.090864181518554688 0.0082562994830368552 +40 6 6.039511 0.039511203765869141 0.0015611352230280318 +41 6 5.72844 0.2715601921081543 0.073744937937817667 +42 6 5.414184 0.5858159065246582 0.34318027633730708 +43 6 5.830394 0.16960620880126953 0.028766266063939838 +44 6 5.829722 0.17027807235717773 0.028994621925676256 +45 7 5.971135 1.028864860534668 1.0585629012430218 +46 4 4.886475 0.8864750862121582 0.78583807847485332 +47 5 4.886475 0.1135249137878418 0.012887906050536913 +48 6 5.414184 0.5858159065246582 0.34318027633730708 +49 5 6.006579 1.0065789222717285 1.0132011267617145 +50 6 5.98721075 0.012789249420166016 0.00016356490073121677 +51 7 6.01847124 0.98152875900268555 0.96339870474935196 +52 7 6.326056 0.67394399642944336 0.45420051032328956 +53 6 6.149549 0.14954900741577148 0.022364905619042474 +54 6 5.874616 0.12538385391235352 0.015721110821914408 +55 6 6.26666641 0.26666641235351563 0.071110975477495231 +56 6 5.986947 0.013052940368652344 0.00017037925226759398 +57 6 5.81298637 0.18701362609863281 0.034974096346559236 +58 6 5.459394 0.54060602188110352 0.29225487089411217 +59 6 5.94256067 0.057439327239990234 0.0032992763137826842 +60 6 5.57885647 0.42114353179931641 0.17736187437640183 +61 6 5.81298637 0.18701362609863281 0.034974096346559236 +62 5 5.00168037 0.0016803741455078125 2.823657268891111E-06 +63 6 5.459394 0.54060602188110352 0.29225487089411217 +64 6 5.89929 0.10070991516113281 0.010142487011762569 +65 5 5.041315 0.041315078735351563 0.0017069357309082989 +66 7 6.70074558 0.29925441741943359 0.0895532063450446 +67 5 4.98183537 0.018164634704589844 0.00032995395395118976 +68 8 6.812332 1.1876678466796875 1.4105549140367657 +69 5 5.2840085 0.28400850296020508 0.080660829753696817 +70 6 5.4217205 0.57827949523925781 0.3344071746141708 +71 5 5.10868025 0.10868024826049805 0.011811396361963489 +72 5 4.84936762 0.15063238143920898 0.022690114338047351 +73 6 5.2388835 0.76111650466918945 0.57929833367984429 +74 8 6.812332 1.1876678466796875 1.4105549140367657 +75 5 5.2840085 0.28400850296020508 0.080660829753696817 +76 7 6.727201 0.27279901504516602 0.074419302609612714 +77 7 6.238829 0.76117086410522461 0.57938108436269431 +78 5 5.73537064 0.73537063598632813 0.54076997227093671 +79 5 5.206772 0.2067718505859375 0.042754598194733262 +80 6 6.218928 0.21892786026000977 0.047929407998026363 +81 6 5.88246059 0.11753940582275391 0.013815511921166035 +82 5 5.21755552 0.21755552291870117 0.047330405552429511 +83 6 5.64936066 0.35063934326171875 0.12294794904300943 +84 5 5.252364 0.25236415863037109 0.063687668561215105 +85 6 5.436144 0.56385612487792969 0.31793372956235544 +86 6 5.301076 0.69892406463623047 0.48849484812762967 +87 6 5.4996624 0.50033760070800781 0.25033771468224586 +88 5 5.252364 0.25236415863037109 0.063687668561215105 +89 6 5.436144 0.56385612487792969 0.31793372956235544 +90 6 5.301076 0.69892406463623047 0.48849484812762967 +91 5 5.332184 0.332183837890625 0.11034610215574503 +92 7 6.585561 0.41443920135498047 0.17175985161975404 +93 7 6.735927 0.26407289505004883 0.069734493900114103 +94 7 5.97698069 1.0230193138122559 1.0465685164328988 +95 6 5.79194736 0.20805263519287109 0.043285899010697904 +96 6 5.435262 0.56473779678344727 0.31892877911582218 +97 7 5.901606 1.0983939170837402 1.2064691970865624 +98 4 4.174137 0.17413711547851563 0.030323734987177886 +99 6 5.435262 0.56473779678344727 0.31892877911582218 +100 5 5.56997252 0.56997251510620117 0.32486866797648872 +101 5 5.66165352 0.66165351867675781 0.4377853787773347 +102 5 5.32760572 0.3276057243347168 0.10732551061687445 +103 5 5.209554 0.20955419540405273 0.043912960811439916 +104 5 5.56997252 0.56997251510620117 0.32486866797648872 +105 6 5.946871 0.053129196166992188 0.0028227114853507373 +106 5 5.66165352 0.66165351867675781 0.4377853787773347 +107 6 5.82830763 0.1716923713684082 0.029478270386107397 +108 6 5.82830763 0.1716923713684082 0.029478270386107397 +109 5 5.289993 0.2899928092956543 0.084095829443185721 +110 6 5.77061224 0.22938776016235352 0.052618744512301419 +111 5 5.123654 0.12365388870239258 0.015290284191223691 +112 5 5.275713 0.27571296691894531 0.076017640127247432 +113 5 5.38431644 0.38431644439697266 0.14769912943393138 +114 5 5.38431644 0.38431644439697266 0.14769912943393138 +115 4 4.31654739 0.31654739379882813 0.10020225252083037 +116 6 6.187931 0.18793106079101563 0.03531808361003641 +117 6 6.22085571 0.220855712890625 0.048777245916426182 +118 5 5.275713 0.27571296691894531 0.076017640127247432 +119 5 5.423021 0.42302083969116211 0.17894663081301587 +120 5 5.28126144 0.28126144409179688 0.079107999932602979 +121 5 5.637559 0.63755893707275391 0.40648139824133978 +122 5 5.77775145 0.77775144577026367 0.60489731139773539 +123 6 5.84558964 0.15441036224365234 0.023842559968215937 +124 6 5.741732 0.25826787948608398 0.066702297574238401 +125 6 6.478015 0.47801494598388672 0.22849828858397814 +126 5 5.651976 0.65197610855102539 0.42507284612133844 +127 7 6.109841 0.89015913009643555 0.79238327689404287 +128 7 6.330519 0.66948080062866211 0.44820454241039442 +129 6 6.17036 0.17036008834838867 0.029022559702070794 +130 5 5.10576 0.10576009750366211 0.011185198223984116 +131 7 6.109841 0.89015913009643555 0.79238327689404287 +132 5 5.40527 0.40527009963989258 0.16424385366212846 +133 5 5.542647 0.54264688491821289 0.29446564171144018 +134 5 5.281421 0.28142118453979492 0.079197883107781308 +135 5 5.44356537 0.44356536865234375 0.19675023626768962 +136 6 6.00983572 0.0098357200622558594 9.6741389143062406E-05 +137 5 5.241497 0.24149703979492188 0.05832082022971008 +138 7 6.315238 0.68476200103759766 0.46889899806501489 +139 6 5.888501 0.11149883270263672 0.012431989694050571 +140 5 5.400142 0.40014219284057617 0.16011377449126485 +141 5 5.241497 0.24149703979492188 0.05832082022971008 +142 6 5.877977 0.12202310562133789 0.014889638305476183 +143 6 5.74312925 0.25687074661254883 0.065982580465288265 +144 6 5.827976 0.17202377319335938 0.029592178543680348 +145 6 5.97833 0.021669864654541016 0.00046958303414612601 +146 6 5.659865 0.34013509750366211 0.11569188455382573 +147 4 4.66095638 0.66095638275146484 0.43686333989990089 +148 7 6.526716 0.47328376770019531 0.22399752476849244 +149 6 5.537257 0.46274280548095703 0.21413090402438684 +150 7 6.371533 0.62846708297729492 0.3949708743859901 +151 6 5.87430143 0.12569856643676758 0.015800129604258473 +152 6 5.537257 0.46274280548095703 0.21413090402438684 +153 5 5.83971643 0.83971643447875977 0.70512369033372124 +154 6 5.504298 0.49570178985595703 0.24572026446639939 +155 6 5.923597 0.076403141021728516 0.0058374399579861347 +156 6 5.923597 0.076403141021728516 0.0058374399579861347 +157 7 6.4670825 0.53291749954223633 0.28400106131834946 +158 8 7.183791 0.81620883941650391 0.66619686954163626 +159 8 7.183791 0.81620883941650391 0.66619686954163626 +160 7 6.4670825 0.53291749954223633 0.28400106131834946 +161 5 5.491083 0.49108314514160156 0.24116265544216731 +162 5 5.358941 0.35894107818603516 0.1288386976093534 +163 6 5.923597 0.076403141021728516 0.0058374399579861347 +164 5 5.557883 0.55788278579711914 0.31123320268875432 +165 5 5.80627 0.80627012252807617 0.65007151048143896 +166 6 5.4762373 0.52376270294189453 0.27432736899299925 +167 7 6.891704 0.10829591751098633 0.011728005749546355 +168 5 5.28792524 0.28792524337768555 0.082900945774099455 +169 5 4.44647264 0.5535273551940918 0.30639253294816626 +170 6 6.20261526 0.20261526107788086 0.041052944021657822 +171 6 5.813782 0.1862177848815918 0.034677063406206798 +172 4 4.291095 0.29109477996826172 0.084736170924770704 +173 7 6.75989151 0.24010848999023438 0.057652086965390481 +174 5 5.5592947 0.55929470062255859 0.31281056214447744 +175 6 6.190523 0.19052314758300781 0.036299069764936576 +176 4 5.546434 1.5464339256286621 2.3914578863352745 +177 5 5.45982838 0.45982837677001953 0.21144213608295104 +178 4 4.225169 0.22516918182373047 0.050701160443168192 +179 6 5.508888 0.49111223220825195 0.24119122462457199 +180 6 5.42470741 0.57529258728027344 0.33096156097963103 +181 5 5.16715574 0.16715574264526367 0.02794104229928962 +182 5 5.24366856 0.24366855621337891 0.059374365287112596 +183 6 5.64808273 0.35191726684570313 0.12384576270414982 +184 5 5.23220968 0.23220968246459961 0.053921336630310179 +185 5 5.196457 0.1964569091796875 0.038595317164435983 +186 6 5.80372334 0.19627666473388672 0.03852452911905857 +187 5 5.99319839 0.99319839477539063 0.98644305138441268 +188 8 7.04508162 0.95491838455200195 0.91186912115540508 +189 4 5.48485327 1.4848532676696777 2.2047892265093196 +190 6 5.43693161 0.56306838989257813 0.31704601169622038 +191 5 5.24366856 0.24366855621337891 0.059374365287112596 +192 6 6.261883 0.26188278198242188 0.068582591498852707 +193 5 6.014933 1.0149331092834473 1.0300892163197659 +194 5 5.24624968 0.24624967575073242 0.060638902807340855 +195 6 5.24624968 0.75375032424926758 0.56813955130587601 +196 5 5.24624968 0.24624967575073242 0.060638902807340855 +197 5 5.250086 0.25008583068847656 0.062542922711145366 +198 5 5.28796864 0.28796863555908203 0.082925935065759404 +199 5 5.250086 0.25008583068847656 0.062542922711145366 +200 5 5.24837 0.24837017059326172 0.061687741640525928 +201 5 5.28796864 0.28796863555908203 0.082925935065759404 +202 5 5.249635 0.24963521957397461 0.062317742851746516 +203 6 6.88108873 0.8810887336730957 0.77631735660565937 +204 4 5.611186 1.6111860275268555 2.5959204152977691 +205 5 5.433936 0.43393611907958984 0.18830055544185598 +206 5 5.67375565 0.67375564575195313 0.45394667018263135 +207 4 4.45758867 0.45758867263793945 0.20938739332655132 +208 5 5.070417 0.070416927337646484 0.0049585436556753848 +209 6 5.637781 0.36221885681152344 0.13120250022984692 +210 5 5.36824369 0.36824369430541992 0.13560341839570356 +211 7 6.63713264 0.36286735534667969 0.13167271757629351 +212 5 5.67375565 0.67375564575195313 0.45394667018263135 +213 6 6.07086134 0.070861339569091797 0.0050213294455261348 +214 7 6.495806 0.50419378280639648 0.25421137062062371 +215 5 5.224705 0.22470521926879883 0.05049243556663896 +216 5 5.80051565 0.80051565170288086 0.64082530862128806 +217 5 5.224705 0.22470521926879883 0.05049243556663896 +218 5 5.27940559 0.27940559387207031 0.078067485887004295 +219 5 5.922441 0.92244100570678711 0.85089740900934885 +220 5 5.80051565 0.80051565170288086 0.64082530862128806 +221 6 5.132604 0.86739587783813477 0.75237560889058841 +222 7 6.495806 0.50419378280639648 0.25421137062062371 +223 6 5.823209 0.17679119110107422 0.031255125250936544 +224 6 5.77888727 0.22111272811889648 0.048890838536181036 +225 5 5.44676161 0.4467616081237793 0.19959593449334534 +226 6 5.878103 0.12189722061157227 0.014858932392826318 +227 6 5.50031567 0.49968433380126953 0.24968443344641855 +228 6 5.878103 0.12189722061157227 0.014858932392826318 +229 5 5.44676161 0.4467616081237793 0.19959593449334534 +230 4 4.546661 0.5466609001159668 0.29883813971559903 +231 6 5.757604 0.24239587783813477 0.058755761592919953 +232 6 5.72927952 0.27072048187255859 0.073289579305310326 +233 6 6.163166 0.16316604614257813 0.026623158613801934 +234 6 6.163166 0.16316604614257813 0.026623158613801934 +235 6 6.163166 0.16316604614257813 0.026623158613801934 +236 6 6.163166 0.16316604614257813 0.026623158613801934 +237 6 5.487222 0.51277780532836914 0.26294107763737884 +238 7 6.68565941 0.31434059143066406 0.098810007420979673 +239 6 5.802817 0.19718313217163086 0.038881187613014845 +240 5 5.11719465 0.11719465255737305 0.013734586588043385 +241 5 5.726284 0.72628402709960938 0.52748848802002613 +242 7 6.105395 0.89460515975952148 0.80031839186835896 +243 6 5.960915 0.039084911346435547 0.0015276302949587262 +244 5 5.216609 0.21660900115966797 0.046919459383389039 +245 6 6.00468969 0.0046896934509277344 2.1993224663674482E-05 +246 7 6.8084445 0.19155550003051758 0.03669350959194162 +247 7 6.10422945 0.89577054977416992 0.80240487784271863 +248 7 6.269913 0.7300868034362793 0.53302674055180432 +249 5 5.307523 0.30752277374267578 0.094570256370388961 +250 4 5.00461149 1.0046114921569824 1.0092442501738788 +251 3 4.74934769 1.7493476867675781 3.0602173291990766 +252 5 5.216609 0.21660900115966797 0.046919459383389039 +253 3 4.21514 1.2151398658752441 1.4765648936393063 +254 6 5.52048063 0.47951936721801758 0.22993882353716799 +255 8 6.49816942 1.5018305778503418 2.2554950845662916 +256 7 5.884387 1.1156129837036133 1.2445923294080785 +257 7 5.884387 1.1156129837036133 1.2445923294080785 +258 6 6.539793 0.53979301452636719 0.29137649853146286 +259 4 4.220551 0.2205510139465332 0.048642749752843883 +260 6 6.21442842 0.21442842483520508 0.045979549377307194 +261 5 5.38486671 0.38486671447753906 0.14812238791273558 +262 5 5.504349 0.5043492317199707 0.2543681475365247 +263 6 5.68215 0.31785011291503906 0.10102869428010308 +264 6 5.6343627 0.36563730239868164 0.13369063690538496 +265 5 5.38486671 0.38486671447753906 0.14812238791273558 +266 6 5.274923 0.72507715225219727 0.52573687671815605 +267 5 5.280154 0.28015422821044922 0.078486391584192461 +268 6 5.36846256 0.63153743743896484 0.39883953488697443 +269 6 5.36846256 0.63153743743896484 0.39883953488697443 +270 6 5.274923 0.72507715225219727 0.52573687671815605 +271 5 5.087133 0.087132930755615234 0.0075921476220628392 +272 5 5.316086 0.3160858154296875 0.099910242715850472 +273 5 4.99754 0.0024600028991699219 6.0516142639244208E-06 +274 5 5.4562726 0.45627260208129883 0.20818468741003926 +275 6 5.997397 0.0026030540466308594 6.7758903696812922E-06 +276 6 5.95126629 0.048733711242675781 0.0023749746114845038 +277 5 5.10343027 0.10343027114868164 0.010697820989889806 +278 4 4.91050863 0.91050863265991211 0.82902597014822277 +279 7 6.508873 0.49112701416015625 0.24120574403787032 +280 8 6.665929 1.334071159362793 1.7797458582435866 +281 8 7.08416 0.91584014892578125 0.83876317838439718 +282 4 4.9356513 0.93565130233764648 0.87544335956613395 +283 5 5.27014065 0.27014064788818359 0.072975969641447591 +284 5 5.23520041 0.23520040512084961 0.055319230569011779 +285 5 5.231636 0.23163604736328125 0.053655258438084275 +286 6 5.39945173 0.60054826736450195 0.36065822143450532 +287 7 6.163166 0.83683395385742188 0.70029106632864568 +288 7 6.163166 0.83683395385742188 0.70029106632864568 +289 7 6.163166 0.83683395385742188 0.70029106632864568 +290 7 6.163166 0.83683395385742188 0.70029106632864568 +291 6 5.971399 0.028601169586181641 0.00081802690169752168 +292 5 5.279406 0.27940607070922852 0.078067752349170405 +293 7 5.74141073 1.2585892677307129 1.5840469448469321 +294 3 3.64403057 0.64403057098388672 0.41477537636183115 +295 6 5.698216 0.30178403854370117 0.091073605919746115 +296 5 5.033449 0.033449172973632813 0.0011188471726200078 +297 7 6.434052 0.5659480094909668 0.32029714944678744 +298 6 5.95223331 0.047766685485839844 0.0022816562423031428 +299 6 5.994336 0.0056638717651367188 3.207944337191293E-05 +300 6 5.8504715 0.14952850341796875 0.022358773334417492 +301 6 5.46959 0.53040981292724609 0.2813345696495162 +302 6 5.8504715 0.14952850341796875 0.022358773334417492 +303 6 5.84660339 0.1533966064453125 0.023530518868938088 +304 6 5.49118376 0.50881624221801758 0.25889396834486433 +305 6 5.49118376 0.50881624221801758 0.25889396834486433 +306 5 5.209182 0.20918178558349609 0.043757019419899734 +307 6 5.46011972 0.53988027572631836 0.29147071211832554 +308 7 6.02967453 0.97032546997070313 0.94153151767386589 +309 6 5.84821558 0.15178442001342773 0.023038510158812642 +310 7 6.60169029 0.39830970764160156 0.15865062320153811 +311 8 7.12271929 0.87728071212768555 0.76962144787125908 +312 6 6.070884 0.070884227752685547 0.0050245737440945959 +313 6 5.46675158 0.5332484245300293 0.28435388226375835 +314 5 5.307043 0.30704307556152344 0.094275450250279391 +315 6 5.632986 0.36701393127441406 0.13469922574950033 +316 6 6.04914 0.049139976501464844 0.002414737290564517 +317 5 6.03052044 1.0305204391479492 1.0619723755016821 +318 7 6.39483166 0.60516834259033203 0.36622872287352948 +319 6 6.043684 0.043684005737304688 0.0019082923572568689 +320 7 6.36964655 0.63035345077514648 0.39734547290413502 +321 5 6.03052044 1.0305204391479492 1.0619723755016821 +322 6 6.04914 0.049139976501464844 0.002414737290564517 +323 6 5.951385 0.048614978790283203 0.0023634161627796857 +324 5 5.121614 0.12161397933959961 0.014789959970812561 +325 5 4.52251625 0.47748374938964844 0.22799073093119659 +326 6 5.72818375 0.27181625366210938 0.073884075754904188 +327 6 5.414321 0.58567905426025391 0.34301995459918544 +328 6 5.475126 0.52487421035766602 0.27549293669858343 +329 5 5.86220741 0.86220741271972656 0.7434016225488449 +330 8 7.05833244 0.94166755676269531 0.886737787459424 +331 5 6.04914 1.0491399765014648 1.1006946902934942 +332 6 6.296459 0.29645919799804688 0.08788805607764516 +333 5 5.67379332 0.67379331588745117 0.45399743253460656 +334 5 5.57425976 0.57425975799560547 0.32977426965317136 +335 6 6.296459 0.29645919799804688 0.08788805607764516 +336 6 6.168834 0.16883420944213867 0.028504990277951947 +337 6 5.571726 0.42827415466308594 0.18341875155238085 +338 5 5.1820116 0.18201160430908203 0.033128224103165849 +339 7 6.845515 0.15448522567749023 0.023865684952625088 +340 7 5.794984 1.2050161361694336 1.4520638884287109 +341 6 5.49368334 0.5063166618347168 0.25635656205145096 +342 6 5.494451 0.50554895401000977 0.25557974490061497 +343 5 5.40403748 0.4040374755859375 0.16324628167785704 +344 6 5.93613958 0.063860416412353516 0.0040781527843591903 +345 6 5.949069 0.050930976867675781 0.0025939644046957255 +346 7 6.168058 0.83194208145141602 0.69212762688971452 +347 6 6.40999 0.40998983383178711 0.16809166384541641 +348 6 5.99639034 0.0036096572875976563 1.3029625733906869E-05 +349 5 5.87430143 0.87430143356323242 0.76440299673072332 +350 7 6.90420866 0.095791339874267578 0.0091759807949074457 +351 7 6.78889275 0.21110725402832031 0.044566272703377763 +352 6 5.511934 0.48806619644165039 0.23820861210901967 +353 7 6.78889275 0.21110725402832031 0.044566272703377763 +354 6 5.65645266 0.34354734420776367 0.11802477771220765 +355 6 6.17624664 0.17624664306640625 0.031062879192177206 +356 6 6.17624664 0.17624664306640625 0.031062879192177206 +357 6 5.61167145 0.38832855224609375 0.15079906448954716 +358 6 5.29756641 0.70243358612060547 0.49341294291025406 +359 6 5.91268969 0.087310314178466797 0.0076230909619425802 +360 6 5.86551237 0.13448762893676758 0.018086922337033684 +361 5 5.08086443 0.080864429473876953 0.0065390559541356197 +362 6 6.06830931 0.068309307098388672 0.004666161436261973 +363 6 6.17624664 0.17624664306640625 0.031062879192177206 +364 7 6.6356883 0.36431169509887695 0.13272301118581709 +365 7 6.97618628 0.023813724517822266 0.0005670934754107293 +366 6 5.7951417 0.20485830307006836 0.041966924336747979 +367 6 5.22309 0.77690982818603516 0.60358888113205467 +368 6 5.72964668 0.27035331726074219 0.07309091615388752 +369 5 5.901571 0.90157079696655273 0.81282990194290505 +370 6 5.22309 0.77690982818603516 0.60358888113205467 +371 6 5.72964668 0.27035331726074219 0.07309091615388752 +372 5 4.81994867 0.18005132675170898 0.032418480265050675 +373 6 5.73458433 0.26541566848754883 0.07044547707869242 +374 7 6.622659 0.37734079360961914 0.14238607452193719 +375 7 6.622659 0.37734079360961914 0.14238607452193719 +376 7 5.72573566 1.2742643356323242 1.6237495970644886 +377 7 5.80524874 1.1947512626647949 1.4274305796391218 +378 6 5.56888628 0.43111371994018555 0.18585903952066474 +379 7 5.72573566 1.2742643356323242 1.6237495970644886 +380 7 5.80524874 1.1947512626647949 1.4274305796391218 +381 6 5.465357 0.53464317321777344 0.28584332266837009 +382 6 5.3793335 0.62066650390625 0.38522690907120705 +383 6 5.73458433 0.26541566848754883 0.07044547707869242 +384 7 6.5848403 0.41515970230102539 0.17235757841467603 +385 7 6.622659 0.37734079360961914 0.14238607452193719 +386 7 6.736278 0.26372194290161133 0.069549263167800746 +387 5 5.15757132 0.15757131576538086 0.024828719552033363 +388 6 5.866982 0.13301801681518555 0.017693792797444985 +389 7 5.79346561 1.2065343856811523 1.4557252238309957 +390 7 5.79346561 1.2065343856811523 1.4557252238309957 +391 5 4.9216423 0.078357696533203125 0.006139928605989553 +392 6 5.582333 0.41766691207885742 0.17444564944548802 +393 6 6.033824 0.033823966979980469 0.0011440607422628091 +394 5 5.2088747 0.20887470245361328 0.043628641325085482 +395 5 5.09981632 0.099816322326660156 0.0099632982028197148 +396 5 6.02121162 1.0212116241455078 1.0428731812899059 +397 6 6.29722261 0.29722261428833008 0.088341282444389435 +398 5 5.280024 0.28002405166625977 0.078413469511588119 +399 6 6.517963 0.51796293258666992 0.26828559953378317 +400 6 6.29722261 0.29722261428833008 0.088341282444389435 +401 5 5.2088747 0.20887470245361328 0.043628641325085482 +402 5 5.03644276 0.036442756652832031 0.0013280745124575333 +403 5 5.31974745 0.3197474479675293 0.10223843048174786 +404 6 6.64804 0.64803981781005859 0.41995560546729394 +405 5 5.09981632 0.099816322326660156 0.0099632982028197148 +406 7 7.076631 0.076631069183349609 0.0058723207641833142 +407 5 5.05094671 0.050946712493896484 0.0025955675139357481 +408 6 5.99687767 0.0031223297119140625 9.7489428299013525E-06 +409 5 6.02121162 1.0212116241455078 1.0428731812899059 +410 6 5.5693655 0.43063449859619141 0.18544607138119318 +411 6 5.84123039 0.15876960754394531 0.025207788279658416 +412 5 5.79458427 0.79458427429199219 0.63136416895213188 +413 5 5.79458427 0.79458427429199219 0.63136416895213188 +414 6 5.5693655 0.43063449859619141 0.18544607138119318 +415 6 5.84123039 0.15876960754394531 0.025207788279658416 +416 6 5.82386971 0.17613029479980469 0.031021880746266106 +417 5 5.18994951 0.18994951248168945 0.036080817292031497 +418 6 5.82386971 0.17613029479980469 0.031021880746266106 +419 6 5.795103 0.20489692687988281 0.041982750644820044 +420 7 6.7393136 0.26068639755249023 0.067957397868894986 +421 6 6.021837 0.021837234497070313 0.0004768648104800377 +422 6 6.021837 0.021837234497070313 0.0004768648104800377 +423 6 6.021837 0.021837234497070313 0.0004768648104800377 +424 7 5.91769934 1.0823006629943848 1.1713747251180848 +425 6 6.021837 0.021837234497070313 0.0004768648104800377 +426 6 6.021837 0.021837234497070313 0.0004768648104800377 +427 5 5.31993246 0.31993246078491211 0.10235677946388932 +428 5 5.541713 0.54171323776245117 0.29345323196707795 +429 5 5.29234028 0.29234027862548828 0.08546283850682812 +430 5 5.31993246 0.31993246078491211 0.10235677946388932 +431 5 4.993221 0.0067791938781738281 4.5957469637869508E-05 +432 7 6.71159029 0.28840970993041992 0.08318016078214896 +433 4 4.595131 0.59513092041015625 0.35418081242823973 +434 8 6.86301756 1.1369824409484863 1.2927290710251782 +435 7 6.96430874 0.035691261291503906 0.0012738661325784051 +436 5 5.21484661 0.21484661102294922 0.046159066268046445 +437 8 7.18364525 0.81635475158691406 0.66643508043853217 +438 7 6.71159029 0.28840970993041992 0.08318016078214896 +439 5 4.960922 0.039078235626220703 0.001527108499658425 +440 7 6.418142 0.58185815811157227 0.33855891616099143 +441 6 5.929764 0.0702362060546875 0.004933124640956521 +442 8 7.54107952 0.45892047882080078 0.21060800588111306 +443 6 5.76989126 0.23010873794555664 0.052950031278896859 +444 6 5.795 0.20499992370605469 0.042024968719488243 +445 3 5.248956 2.2489562034606934 5.0578040050843356 +446 5 6.340478 1.3404779434204102 1.7968811167966123 +447 6 5.84383631 0.15616369247436523 0.024387098847228117 +448 6 5.84383631 0.15616369247436523 0.024387098847228117 +449 7 6.47833157 0.52166843414306641 0.27213795518127881 +450 5 4.94290733 0.057092666625976563 0.003259572582464898 +451 5 5.55804157 0.55804157257080078 0.31141039671729231 +452 7 6.32008076 0.67991924285888672 0.46229017680980178 +453 7 6.45778561 0.54221439361572266 0.29399644864406582 +454 7 6.47833157 0.52166843414306641 0.27213795518127881 +455 6 5.84383631 0.15616369247436523 0.024387098847228117 +456 7 6.69056559 0.30943441390991211 0.095749656511770809 +457 5 5.666873 0.66687297821044922 0.44471956906727428 +458 6 5.436703 0.56329679489135742 0.31730327913487599 +459 5 4.90243149 0.097568511962890625 0.009519614526652731 +460 5 5.666873 0.66687297821044922 0.44471956906727428 +461 5 5.6149745 0.6149744987487793 0.37819363411131235 +462 5 5.289179 0.28917884826660156 0.08362440628479817 +463 6 5.08662176 0.91337823867797852 0.83425980689048629 +464 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +465 5 5.33792353 0.33792352676391602 0.11419230994056306 +466 6 6.279598 0.27959823608398438 0.078175173621275462 +467 6 5.08662176 0.91337823867797852 0.83425980689048629 +468 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +469 5 5.35536432 0.35536432266235352 0.1262838018212733 +470 6 5.00434446 0.99565553665161133 0.99132994766500815 +471 5 5.415714 0.41571378707885742 0.1728179527674456 +472 6 6.255002 0.25500202178955078 0.065026031116758531 +473 7 6.1227684 0.87723159790039063 0.76953527635487262 +474 6 5.61289 0.38711023330688477 0.14985433273091076 +475 5 5.6727953 0.67279529571533203 0.45265350993668108 +476 7 6.37792349 0.62207651138305664 0.3869791860145142 +477 6 6.137163 0.13716316223144531 0.018813733073329786 +478 6 5.165093 0.83490705490112305 0.69706979032366689 +479 6 6.256819 0.25681877136230469 0.06595588132404373 +480 5 5.14719439 0.14719438552856445 0.021666187131131665 +481 6 6.024329 0.024329185485839844 0.00059190926640440011 +482 5 5.55854845 0.5585484504699707 0.31197637152240532 +483 5 5.14719439 0.14719438552856445 0.021666187131131665 +484 5 4.807844 0.19215583801269531 0.036923866082361201 +485 6 6.0983386 0.098338603973388672 0.0096704810314349743 +486 6 5.87475061 0.12524938583374023 0.015687408651729129 +487 6 6.023153 0.023152828216552734 0.00053605345442520047 +488 6 6.29130173 0.29130172729492188 0.084856696325005032 +489 6 5.48021841 0.51978158950805664 0.2701729007915219 +490 6 5.77609539 0.22390460968017578 0.050133274236031866 +491 7 6.43585968 0.56414031982421875 0.31825430045137182 +492 6 5.79112244 0.2088775634765625 0.043629836523905396 +493 6 6.26251125 0.26251125335693359 0.068912158139028179 +494 6 6.30851841 0.30851840972900391 0.095183609141713532 +495 6 6.354451 0.35445117950439453 0.12563563865205651 +496 4 4.753712 0.75371217727661133 0.56808204617504998 +497 6 6.817308 0.81730794906616211 0.66799228360673624 +498 5 5.29211855 0.29211854934692383 0.085333246872551172 +499 4 4.753712 0.75371217727661133 0.56808204617504998 +500 6 5.484865 0.51513481140136719 0.26536387391752214 +501 6 6.044801 0.044801235198974609 0.0020071506753538415 +502 6 5.19564533 0.80435466766357422 0.64698643139217893 +503 5 5.20786428 0.20786428451538086 0.043207560777091203 +504 6 6.26455355 0.26455354690551758 0.069988579180289889 +505 6 6.26455355 0.26455354690551758 0.069988579180289889 +506 5 4.85467 0.14532995223999023 0.021120795018077843 +507 7 6.225348 0.77465200424194336 0.60008572767605983 +508 6 5.982076 0.017923831939697266 0.00032126375140251184 +509 7 6.225348 0.77465200424194336 0.60008572767605983 +510 6 5.31798172 0.68201828002929688 0.46514893429412041 +511 6 5.64203167 0.35796833038330078 0.12814132555740798 +512 6 6.37156963 0.37156963348388672 0.13806399252734991 +513 6 5.88133144 0.11866855621337891 0.014082226233767869 +514 7 6.026742 0.97325801849365234 0.94723117056219053 +515 6 5.47360754 0.52639245986938477 0.27708902180734185 +516 5 6.01606941 1.0160694122314453 1.0323970504723547 +517 6 5.994919 0.0050811767578125 2.5818357244133949E-05 +518 6 6.21694946 0.216949462890625 0.047067069448530674 +519 5 5.25397635 0.25397634506225586 0.064503983851182056 +520 5 5.16614771 0.16614770889282227 0.027605061170334011 +521 5 5.16614771 0.16614770889282227 0.027605061170334011 +522 6 6.029863 0.029862880706787109 0.00089179164410779777 +523 6 6.17634344 0.17634344100952148 0.031097009187078584 +524 5 4.46065855 0.53934144973754883 0.29088919940500091 +525 6 5.49068642 0.50931358337402344 0.25940032620928832 +526 4 4.83760929 0.83760929107666016 0.7015893244979452 +527 6 6.53003359 0.53003358840942383 0.28093560484217051 +528 6 6.38529253 0.38529253005981445 0.14845033371989302 +529 6 6.527589 0.52758884429931641 0.27834998862908833 +530 6 6.089735 0.089735031127929688 0.00805237581153051 +531 5 5.81951237 0.81951236724853516 0.67160052007329796 +532 6 5.66872072 0.33127927780151367 0.10974595990069247 +533 6 5.66872072 0.33127927780151367 0.10974595990069247 +534 6 5.66872072 0.33127927780151367 0.10974595990069247 +535 5 5.35391045 0.35391044616699219 0.12525260390611948 +536 5 5.35391045 0.35391044616699219 0.12525260390611948 +537 6 5.66872072 0.33127927780151367 0.10974595990069247 +538 5 5.69457865 0.69457864761352539 0.48243949772063388 +539 6 5.44028759 0.55971240997314453 0.31327798187794542 +540 4 5.25917149 1.2591714859008789 1.5855128309058273 +541 5 5.079481 0.079481124877929688 0.0063172492118610535 +542 6 5.75632048 0.24367952346801758 0.05937971015760013 +543 6 5.91034174 0.089658260345458984 0.008038603648174103 +544 6 5.429198 0.57080221176147461 0.3258151649517913 +545 6 6.05427027 0.054270267486572266 0.0029452619330641028 +546 6 5.790551 0.20944881439208984 0.043868805850252102 +547 6 5.43407631 0.56592369079589844 0.32026962380405166 +548 7 6.30033445 0.69966554641723633 0.48953187684332988 +549 5 5.079481 0.079481124877929688 0.0063172492118610535 +550 7 5.43548965 1.5645103454589844 2.4476926210481906 +551 7 6.03222 0.96778011322021484 0.93659834754453186 +552 7 6.296845 0.7031550407409668 0.49442701131943068 +553 7 5.43548965 1.5645103454589844 2.4476926210481906 +554 7 6.296845 0.7031550407409668 0.49442701131943068 +555 7 6.03222 0.96778011322021484 0.93659834754453186 +556 5 5.032953 0.032952785491943359 0.0010858860716780327 +557 6 5.60137033 0.39862966537475586 0.15890561011678983 +558 5 5.41377 0.41377019882202148 0.17120577743321519 +559 6 6.48004532 0.48004531860351563 0.23044350791315082 +560 7 6.00349665 0.99650335311889648 0.9930189327772041 +561 5 5.24001074 0.24001073837280273 0.057605154534257963 +562 6 5.28676558 0.71323442459106445 0.50870334442174681 +563 7 5.429729 1.5702710151672363 2.4657510610743429 +564 5 5.3263216 0.32632160186767578 0.1064857878454859 +565 6 5.754887 0.24511289596557617 0.060080331768631368 +566 6 5.328569 0.67143106460571289 0.450819674517561 +567 5 5.592988 0.59298801422119141 0.3516347850099919 +568 6 5.67043066 0.32956933975219727 0.10861594970469923 +569 6 5.49481869 0.50518131256103516 0.2552081585608903 +570 5 5.04753637 0.047536373138427734 0.0022597067711558338 +571 7 6.6258 0.37419986724853516 0.14002554064882133 +572 5 5.35135746 0.35135746002197266 0.12345206471309211 +573 7 6.7393136 0.26068639755249023 0.067957397868894986 +574 7 6.16289759 0.83710241317749023 0.70074045014757758 +575 6 5.978729 0.021271228790283203 0.00045246517424857302 +576 6 5.980228 0.019772052764892578 0.00039093407053769624 +577 7 6.7393136 0.26068639755249023 0.067957397868894986 +578 7 6.6258 0.37419986724853516 0.14002554064882133 +579 7 6.59008455 0.40991544723510742 0.16803067388195814 +580 5 5.04753637 0.047536373138427734 0.0022597067711558338 +581 5 5.48165464 0.48165464401245117 0.23199119609876107 +582 6 5.431743 0.56825685501098633 0.32291585326697714 +583 6 5.640394 0.35960578918457031 0.12931632361505763 +584 7 6.35053444 0.64946556091308594 0.42180551481214934 +585 6 5.640394 0.35960578918457031 0.12931632361505763 +586 6 5.52043533 0.47956466674804688 0.22998226959316526 +587 7 6.54887772 0.45112228393554688 0.20351131506322417 +588 7 6.77563524 0.2243647575378418 0.050339544425014537 +589 6 5.89532852 0.10467147827148438 0.010956118363537826 +590 5 4.98952246 0.010477542877197266 0.00010977890474350716 +591 6 6.436891 0.43689107894897461 0.19087381486519917 +592 5 5.309803 0.30980300903320313 0.095977904406026937 +593 5 5.04597664 0.045976638793945313 0.0021138513147889171 +594 5 4.88176441 0.11823558807373047 0.013979654287140875 +595 7 5.559344 1.4406561851501465 2.0754902438113731 +596 5 5.309803 0.30980300903320313 0.095977904406026937 +597 6 6.028057 0.028057098388671875 0.00078720076999161392 +598 8 6.58157253 1.4184274673461914 2.0119364801221309 +599 7 6.23756 0.76244020462036133 0.58131506562153845 +600 6 5.6493926 0.35060739517211914 0.12292554554937851 +601 6 5.82520628 0.17479372024536133 0.030552844637213639 +602 5 5.04597664 0.045976638793945313 0.0021138513147889171 +603 5 4.88176441 0.11823558807373047 0.013979654287140875 +604 6 5.64465666 0.35534334182739258 0.12626889058105917 +605 6 5.64465666 0.35534334182739258 0.12626889058105917 +606 5 5.487342 0.48734188079833984 0.23750210878006328 +607 5 5.487342 0.48734188079833984 0.23750210878006328 +608 5 5.295503 0.29550313949584961 0.087322105451903553 +609 6 5.45708036 0.54291963577270508 0.29476173090756674 +610 8 7.10623741 0.89376258850097656 0.79881156460396596 +611 6 5.615421 0.38457918167114258 0.14790114697484569 +612 5 5.25086737 0.25086736679077148 0.062934435720535475 +613 5 5.33452845 0.33452844619750977 0.11190928131532019 +614 5 5.33452845 0.33452844619750977 0.11190928131532019 +615 5 5.25086737 0.25086736679077148 0.062934435720535475 +616 7 6.00642872 0.99357128143310547 0.98718389128862327 +617 6 5.77096748 0.22903251647949219 0.05245589360492886 +618 6 5.84212971 0.15787029266357422 0.024923029305682576 +619 6 5.984556 0.015443801879882813 0.00023851101650507189 +620 5 5.22900248 0.22900247573852539 0.05244213389437391 +621 5 5.36206055 0.362060546875 0.13108783960342407 +622 6 5.93520927 0.064790725708007813 0.0041978381377703045 +623 5 4.71454334 0.28545665740966797 0.081485503259500547 +624 5 5.071442 0.071442127227783203 0.0051039775428307621 +625 8 6.65726042 1.3427395820617676 1.8029495852354103 +626 4 4.52697849 0.52697849273681641 0.27770633180716686 +627 6 5.39603329 0.60396671295166016 0.36477579035363306 +628 6 5.39603329 0.60396671295166016 0.36477579035363306 +629 6 5.55218744 0.44781255722045898 0.20053608640432685 +630 5 5.42956257 0.42956256866455078 0.1845240003976869 +631 5 5.42956257 0.42956256866455078 0.1845240003976869 +632 6 5.772721 0.2272791862487793 0.051655828501907308 +633 5 5.31113052 0.31113052368164063 0.096802202766411938 +634 6 6.38461 0.38461017608642578 0.14792498754923145 +635 6 6.17356 0.17356014251708984 0.030123123070552538 +636 7 6.31279945 0.68720054626464844 0.47224459078643122 +637 5 5.275313 0.27531290054321289 0.075797193205517033 +638 5 5.26560354 0.26560354232788086 0.070545241697118399 +639 5 5.257151 0.25715112686157227 0.066126702046176433 +640 7 6.23770428 0.76229572296142578 0.58109476924528281 +641 4 5.22752 1.2275199890136719 1.5068053234281251 +642 6 5.822799 0.1772007942199707 0.031400121472188403 +643 5 5.47019768 0.47019767761230469 0.22108585603200481 +644 5 5.47785473 0.47785472869873047 0.2283451417397373 +645 5 5.157337 0.15733718872070313 0.024754990954534151 +646 4 4.80251074 0.80251073837280273 0.64402348520366104 +647 6 6.12228966 0.12228965759277344 0.01495476035415777 +648 5 5.202234 0.20223379135131836 0.040898506364328568 +649 7 6.353786 0.64621400833129883 0.41759254456360395 +650 7 6.353786 0.64621400833129883 0.41759254456360395 +651 7 6.353786 0.64621400833129883 0.41759254456360395 +652 7 6.353786 0.64621400833129883 0.41759254456360395 +653 6 5.529214 0.47078609466552734 0.22163954693041887 +654 7 6.675183 0.32481718063354492 0.10550620083472495 +655 6 6.66171551 0.66171550750732422 0.43786741287567565 +656 6 6.07065535 0.070655345916748047 0.0049921779066153249 +657 5 4.939713 0.060286998748779297 0.0036345222181353165 +658 5 5.754849 0.75484895706176758 0.56979694797723823 +659 4 4.11328363 0.11328363418579102 0.012833181774340119 +660 5 5.09369659 0.09369659423828125 0.0087790517718531191 +661 7 7.069395 0.069395065307617188 0.0048156750890484545 +662 4 4.37782669 0.37782669067382813 0.1427530081855366 +663 5 5.09369659 0.09369659423828125 0.0087790517718531191 +664 6 5.83840847 0.16159152984619141 0.026111822518032568 +665 5 5.153395 0.15339517593383789 0.023530079999773079 +666 6 6.53245831 0.53245830535888672 0.28351184694565745 +667 6 5.83840847 0.16159152984619141 0.026111822518032568 +668 6 5.71215439 0.28784561157226563 0.082855096101411618 +669 5 5.498241 0.49824094772338867 0.24824404198830052 +670 6 5.217243 0.78275680541992188 0.61270821643120144 +671 6 6.30048275 0.30048274993896484 0.090289883010882477 +672 8 7.20319748 0.79680252075195313 0.63489425707666669 +673 6 6.011775 0.011775016784667969 0.00013865102027921239 +674 5 5.35568476 0.35568475723266602 0.12651164652766056 +675 6 5.22133827 0.77866172790527344 0.60631408650442609 +676 6 5.413211 0.58678913116455078 0.34432148445284838 +677 7 6.71524572 0.28475427627563477 0.081084997857260532 +678 7 6.71524572 0.28475427627563477 0.081084997857260532 +679 7 6.71524572 0.28475427627563477 0.081084997857260532 +680 5 5.32334 0.32333993911743164 0.1045487162284644 +681 5 4.97009945 0.029900550842285156 0.00089404294067207957 +682 6 5.39260864 0.607391357421875 0.36892426107078791 +683 5 5.29420948 0.29420948028564453 0.086559218289949058 +684 5 5.5085063 0.50850629806518555 0.25857865517195933 +685 5 5.22983646 0.22983646392822266 0.052824800151029194 +686 7 5.97222853 1.0277714729309082 1.0563142005705686 +687 4 4.579601 0.57960081100463867 0.33593710011723488 +688 6 5.6276 0.37239980697631836 0.13868161623599917 +689 7 6.439974 0.56002616882324219 0.31362930976683856 +690 4 5.59999561 1.5999956130981445 2.5599859619333074 +691 6 5.26191568 0.73808431625366211 0.54476845789963591 +692 5 5.24829674 0.24829673767089844 0.061651269938010955 +693 5 5.16820669 0.16820669174194336 0.028293491146769156 +694 6 5.43879366 0.56120634078979492 0.31495255694267144 +695 5 5.37247038 0.37247037887573242 0.13873418313983166 +696 6 6.118032 0.11803197860717773 0.013931547973925262 +697 5 5.424995 0.42499494552612305 0.1806207037227523 +698 5 5.424995 0.42499494552612305 0.1806207037227523 +699 5 5.522417 0.52241706848144531 0.27291959344074712 +700 5 5.177611 0.17761087417602539 0.031545622625571923 +701 7 7.084567 0.084567070007324219 0.0071515893296236754 +702 4 4.96964169 0.96964168548583984 0.94020499823182035 +703 6 5.691428 0.30857181549072266 0.095216565315240587 +704 6 6.480943 0.48094320297241211 0.23130636448536279 +705 5 5.20250845 0.20250844955444336 0.041009672140944531 +706 5 5.320039 0.32003879547119141 0.10242483060665108 +707 6 6.23916864 0.23916864395141602 0.057201640249559205 +708 6 6.148995 0.14899492263793945 0.022199486971885563 +709 5 4.75704765 0.24295234680175781 0.0590258428164816 +710 5 5.37451839 0.37451839447021484 0.14026402779654745 +711 6 6.10724831 0.10724830627441406 0.011502199198730523 +712 6 6.10724831 0.10724830627441406 0.011502199198730523 +713 5 5.6087265 0.60872650146484375 0.37054795358562842 +714 6 6.025354 0.025353908538818359 0.00064282067819476651 +715 7 6.566482 0.4335179328918457 0.18793779813881883 +716 6 5.37237167 0.62762832641601563 0.39391731611976866 +717 5 5.390794 0.39079380035400391 0.15271979439512506 +718 7 6.566482 0.4335179328918457 0.18793779813881883 +719 7 6.615624 0.38437604904174805 0.1477449470769443 +720 5 5.196617 0.19661712646484375 0.038658294419292361 +721 5 5.14307642 0.14307641983032227 0.020470861911462634 +722 6 6.191565 0.19156503677368164 0.036697163314101999 +723 8 6.70217752 1.2978224754333496 1.6843431777399474 +724 7 5.99594545 1.0040545463562012 1.0081255320585569 +725 5 5.34394455 0.34394454956054688 0.11829785317240749 +726 7 6.90710545 0.092894554138183594 0.0086293981885319226 +727 5 5.340127 0.34012699127197266 0.11568637019172456 +728 5 6.005658 1.0056581497192383 1.0113483140967219 +729 5 5.0085516 0.0085515975952148438 7.3129821430484299E-05 +730 6 6.216481 0.21648120880126953 0.046864113764058857 +731 6 5.50056076 0.49943923950195313 0.24943955395428929 +732 7 6.1538806 0.84611940383911133 0.71591804555305316 +733 6 5.917358 0.082642078399658203 0.006829713122215253 +734 5 5.30464649 0.30464649200439453 0.092809485090583621 +735 6 5.54713726 0.45286273956298828 0.20508466088449495 +736 6 5.917358 0.082642078399658203 0.006829713122215253 +737 5 5.30464649 0.30464649200439453 0.092809485090583621 +738 7 6.35726547 0.64273452758789063 0.41310767295362893 +739 6 5.54713726 0.45286273956298828 0.20508466088449495 +740 3 3.93911076 0.93911075592041016 0.88192901188540418 +741 6 6.073226 0.073225975036621094 0.0053620434200638556 +742 6 6.25418758 0.25418758392333984 0.064611327820784936 +743 5 5.543552 0.54355192184448242 0.29544869174083033 +744 5 5.537819 0.53781890869140625 0.28924917854601517 +745 6 6.385117 0.3851170539855957 0.14831514527054424 +746 6 5.829892 0.17010784149169922 0.028936677736965066 +747 6 6.05567837 0.055678367614746094 0.0031000806202428066 +748 6 5.95539427 0.044605731964111328 0.001989671324054143 +749 6 6.11404753 0.11404752731323242 0.013006838486262495 +750 6 6.05567837 0.055678367614746094 0.0031000806202428066 +751 6 6.03684855 0.036848545074462891 0.0013578152741047234 +752 6 6.08775139 0.087751388549804688 0.0077003061924187932 +753 6 5.829892 0.17010784149169922 0.028936677736965066 +754 5 5.335464 0.3354640007019043 0.11253609576692725 +755 7 6.634498 0.36550188064575195 0.13359162475558151 +756 5 5.459274 0.4592738151550293 0.21093243728705602 +757 6 5.965418 0.034582138061523438 0.001195924272906268 +758 7 6.82623148 0.17376852035522461 0.030195498666444109 +759 7 6.87592745 0.12407255172729492 0.015393998092122274 +760 6 5.95539427 0.044605731964111328 0.001989671324054143 +761 6 5.779576 0.22042417526245117 0.048586817040131791 +762 5 5.325914 0.32591390609741211 0.10621987418767276 +763 6 5.965965 0.034035205841064453 0.0011583952366436279 +764 6 5.52306747 0.47693252563476563 0.22746463400835637 +765 6 5.928421 0.0715789794921875 0.0051235503051429987 +766 5 5.19307232 0.19307231903076172 0.037276920375916234 +767 6 5.473008 0.52699184417724609 0.27772040382933483 +768 7 6.3073473 0.69265270233154297 0.47976776604718907 +769 7 6.3073473 0.69265270233154297 0.47976776604718907 +770 7 6.366083 0.63391685485839844 0.40185057887356379 +771 7 6.00737333 0.99262666702270508 0.98530770008460422 +772 7 5.81501532 1.1849846839904785 1.4041887012920142 +773 5 5.39121532 0.39121532440185547 0.15304943004684901 +774 9 6.090269 2.9097309112548828 8.4665339759121707 +775 6 6.3398385 0.33983850479125977 0.11549020933875909 +776 6 6.049326 0.049325942993164063 0.0024330486521648709 +777 5 5.56175232 0.5617523193359375 0.3155656682793051 +778 7 6.200076 0.79992389678955078 0.63987824065497989 +779 8 7.166649 0.83335113525390625 0.69447411462897435 +780 4 4.306471 0.30647087097167969 0.093924394754139939 +781 6 5.39670324 0.60329675674438477 0.36396697669829337 +782 7 6.200076 0.79992389678955078 0.63987824065497989 +783 8 7.166649 0.83335113525390625 0.69447411462897435 +784 5 5.56175232 0.5617523193359375 0.3155656682793051 +785 6 5.8870883 0.11291170120239258 0.012749052268418382 +786 6 5.62655067 0.37344932556152344 0.13946439876235672 +787 6 5.62655067 0.37344932556152344 0.13946439876235672 +788 7 5.87119961 1.1288003921508789 1.274190325319978 +789 6 5.8870883 0.11291170120239258 0.012749052268418382 +790 6 5.62655067 0.37344932556152344 0.13946439876235672 +791 7 6.791107 0.208892822265625 0.043636211194097996 +792 5 5.34000731 0.34000730514526367 0.11560496755214444 +793 7 6.791107 0.208892822265625 0.043636211194097996 +794 5 5.328908 0.32890796661376953 0.10818045050200453 +795 5 5.189716 0.18971586227416992 0.03599210839843181 +796 6 5.31731224 0.68268775939941406 0.46606257683379226 +797 6 5.86112165 0.13887834548950195 0.019287194845901467 +798 6 5.7783494 0.22165060043334961 0.049128988672464402 +799 8 6.69024658 1.30975341796875 1.7154540158808231 +800 6 5.462918 0.53708219528198242 0.2884572844889135 +801 5 5.281977 0.28197717666625977 0.079511128160675071 +802 5 5.42389345 0.42389345169067383 0.17968565838623363 +803 7 5.8122654 1.1877346038818359 1.4107134892583417 +804 6 5.451923 0.54807710647583008 0.30038851464291838 +805 6 5.462918 0.53708219528198242 0.2884572844889135 +806 5 5.32510662 0.32510662078857422 0.1056943148805658 +807 6 5.34558773 0.65441226959228516 0.42825541859292571 +808 6 5.27500248 0.72499752044677734 0.52562140465397533 +809 6 5.34558773 0.65441226959228516 0.42825541859292571 +810 5 5.281977 0.28197717666625977 0.079511128160675071 +811 6 5.31018972 0.68981027603149414 0.47583821691864614 +812 7 5.168549 1.8314509391784668 3.3542125426176881 +813 6 5.58469772 0.41530227661132813 0.1724759809585521 +814 6 5.335502 0.66449785232543945 0.44155739574512154 +815 5 5.2698555 0.26985549926757813 0.072821990484953858 +816 5 5.22790766 0.22790765762329102 0.051941900403335239 +817 5 5.063816 0.063816070556640625 0.0040724908612901345 +818 5 5.2698555 0.26985549926757813 0.072821990484953858 +819 5 5.063816 0.063816070556640625 0.0040724908612901345 +820 9 7.47892332 1.5210766792297363 2.3136742640965622 +821 6 5.18003941 0.81996059417724609 0.67233537600350246 +822 5 5.799497 0.79949712753295898 0.63919565693345248 +823 6 5.812003 0.18799686431884766 0.035342820993719215 +824 5 5.22790766 0.22790765762329102 0.051941900403335239 +825 6 5.97561169 0.024388313293457031 0.00059478982529981295 +826 6 5.901674 0.098326206207275391 0.0096680428271156416 +827 9 6.82888842 2.1711115837097168 4.7137255089185146 +828 7 6.37836266 0.62163734436035156 0.38643298790339031 +829 7 6.119482 0.88051795959472656 0.77531187716886052 +830 6 5.980976 0.019023895263671875 0.0003619085910031572 +831 4 5.924944 1.9249439239501953 3.7054091103527753 +832 8 7.287973 0.71202707290649414 0.50698255255178992 +833 6 6.375841 0.37584114074707031 0.14125656307805912 +834 6 5.980976 0.019023895263671875 0.0003619085910031572 +835 8 6.824942 1.1750578880310059 1.3807610402238879 +836 8 6.996419 1.0035810470581055 1.0071749180142433 +837 8 6.996419 1.0035810470581055 1.0071749180142433 +838 8 6.996419 1.0035810470581055 1.0071749180142433 +839 7 6.26726866 0.73273134231567383 0.53689522001172918 +840 7 6.27416039 0.72583961486816406 0.52684314651196473 +841 7 6.315333 0.68466711044311523 0.46876905212252495 +842 7 6.315333 0.68466711044311523 0.46876905212252495 +843 7 6.216423 0.78357696533203125 0.6139928605989553 +844 8 6.64945936 1.3505406379699707 1.8239600148083355 +845 8 6.64945936 1.3505406379699707 1.8239600148083355 +846 5 5.850869 0.85086917877197266 0.72397835938409116 +847 5 5.22373867 0.22373867034912109 0.050058992609592678 +848 7 6.315333 0.68466711044311523 0.46876905212252495 +849 6 6.091377 0.091376781463623047 0.0083497161906507245 +850 7 6.216423 0.78357696533203125 0.6139928605989553 +851 5 5.26563931 0.26563930511474609 0.07056424042184517 +852 7 6.802008 0.19799184799194336 0.039200771871264806 +853 5 5.06763172 0.067631721496582031 0.004574049752591236 +854 7 6.802008 0.19799184799194336 0.039200771871264806 +855 7 6.67673635 0.32326364517211914 0.10449938428996575 +856 5 5.26563931 0.26563930511474609 0.07056424042184517 +857 5 5.278694 0.27869415283203125 0.077670430822763592 +858 7 6.01344061 0.98655939102172852 0.97329943201316382 +859 5 5.39770174 0.39770174026489258 0.15816667420972408 +860 8 6.41191339 1.5880866050720215 2.5220190652091787 +861 7 6.09758043 0.9024195671081543 0.8143610750996686 +862 6 5.68773556 0.31226444244384766 0.097509082014767046 +863 6 6.32151937 0.32151937484741211 0.1033747084022707 +864 5 5.586795 0.58679485321044922 0.34432819975427265 +865 6 6.401601 0.40160083770751953 0.16128323284738144 +866 7 6.802008 0.19799184799194336 0.039200771871264806 +867 8 6.85899353 1.1410064697265625 1.301895763957873 +868 7 6.32456255 0.67543745040893555 0.45621574941492327 +869 6 6.04672527 0.046725273132324219 0.0021832511492902995 +870 5 5.081021 0.081020832061767578 0.0065643752279811451 +871 5 5.06763172 0.067631721496582031 0.004574049752591236 +872 6 5.7612443 0.23875570297241211 0.057004285701850677 +873 3 4.103586 1.1035861968994141 1.2179024939869123 +874 5 5.22211456 0.22211456298828125 0.049334879091475159 +875 7 6.17575169 0.82424831390380859 0.67938528297327139 +876 9 7.38359642 1.6164035797119141 2.6127605325054901 +877 6 5.57609 0.42391014099121094 0.17969980763518834 +878 6 5.83978128 0.16021871566772461 0.025670036850215183 +879 8 7.260392 0.73960781097412109 0.54701971405393124 +880 7 6.17575169 0.82424831390380859 0.67938528297327139 +881 6 5.044123 0.95587682723999023 0.91370050885439014 +882 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +883 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +884 6 5.8775425 0.12245750427246094 0.014995840352639789 +885 7 6.52155638 0.47844362258911133 0.228908299996192 +886 6 5.89761448 0.10238552093505859 0.010482794897143322 +887 7 6.7517786 0.24822139739990234 0.061613862127160246 +888 6 5.89761448 0.10238552093505859 0.010482794897143322 +889 7 6.7517786 0.24822139739990234 0.061613862127160246 +890 6 5.35475159 0.6452484130859375 0.41634551458992064 +891 7 6.24612236 0.75387763977050781 0.56833149574595154 +892 5 5.746893 0.74689292907714844 0.55784904750544229 +893 7 6.4414587 0.55854129791259766 0.31196838147388917 +894 7 6.24612236 0.75387763977050781 0.56833149574595154 +895 6 6.04552126 0.045521259307861328 0.0020721850489735516 +896 6 6.043535 0.043535232543945313 0.001895316472655395 +897 6 5.37033558 0.62966442108154297 0.39647728317595465 +898 6 5.89646244 0.10353755950927734 0.010720026229137147 +899 6 6.043535 0.043535232543945313 0.001895316472655395 +900 7 6.437248 0.56275177001953125 0.31668955466011539 +901 6 5.793899 0.2061009407043457 0.042477597759216223 +902 5 5.28579044 0.28579044342041016 0.081676177550434659 +903 6 5.409873 0.59012699127197266 0.34824986582771089 +904 8 5.79865074 2.2013492584228516 4.8459385575588385 +905 4 4.89676857 0.89676856994628906 0.80419386804351234 +906 4 4.57636929 0.57636928558349609 0.33220155336402968 +907 8 6.83107567 1.1689243316650391 1.3663840931585582 +908 4 5.50111961 1.5011196136474609 2.2533600944771024 +909 5 5.838393 0.83839321136474609 0.70290317686249182 +910 5 5.26750469 0.26750469207763672 0.071558760283551237 +911 5 5.197639 0.19763898849487305 0.039061169773276561 +912 5 5.24751234 0.2475123405456543 0.061262358722387944 +913 5 4.95306063 0.046939373016357422 0.0022033047391687433 +914 4 4.5945096 0.59450960159301758 0.35344166638628849 +915 5 4.95306063 0.046939373016357422 0.0022033047391687433 +916 7 6.440396 0.55960416793823242 0.31315682477384144 +917 6 5.95007324 0.0499267578125 0.0024926811456680298 +918 6 6.325206 0.32520580291748047 0.10575881425120315 +919 7 5.990829 1.0091710090637207 1.0184261255346883 +920 7 6.069497 0.93050289154052734 0.86583563116528239 +921 6 5.535707 0.46429300308227539 0.21556799271115779 +922 6 5.535707 0.46429300308227539 0.21556799271115779 +923 6 5.70260572 0.2973942756652832 0.088443355198478457 +924 8 6.935463 1.0645370483398438 1.1332391272881068 +925 5 5.005663 0.0056629180908203125 3.2068641303339973E-05 +926 5 5.006425 0.0064249038696289063 4.1279389733972494E-05 +927 7 5.692542 1.3074579238891602 1.7094462227405529 +928 5 5.34776735 0.34776735305786133 0.12094213185287117 +929 5 5.56059361 0.56059360504150391 0.31426519001342967 +930 7 6.387425 0.61257505416870117 0.37524819698978717 +931 5 5.51956034 0.51956033706665039 0.26994294385281137 +932 6 5.69498348 0.30501651763916016 0.093035076032720099 +933 5 5.52175 0.52174997329711914 0.27222303463554454 +934 5 5.398334 0.39833402633666992 0.15866999653758285 +935 5 5.399966 0.39996576309204102 0.15997261164579868 +936 5 5.148321 0.14832115173339844 0.021999164051521802 +937 5 5.56059361 0.56059360504150391 0.31426519001342967 +938 6 5.893504 0.10649585723876953 0.011341367609020381 +939 7 5.759181 1.240818977355957 1.539631734566683 +940 5 5.41476154 0.41476154327392578 0.17202713777896861 +941 6 5.678872 0.32112789154052734 0.10312312272526469 +942 7 5.951344 1.0486559867858887 1.0996793786218859 +943 7 6.59410334 0.40589666366577148 0.16475210157500442 +944 7 5.97247076 1.027529239654541 1.0558163383450392 +945 7 6.28033543 0.71966457366943359 0.51791709859480761 +946 5 4.995405 0.0045948028564453125 2.1112213289598003E-05 +947 5 5.556999 0.55699920654296875 0.31024811608949676 +948 4 4.46932173 0.46932172775268555 0.22026288414076589 +949 5 5.3680234 0.36802339553833008 0.13544121966356215 +950 5 5.094201 0.094201087951660156 0.0088738449712764123 +951 6 5.8765893 0.12341070175170898 0.015230201306849267 +952 6 5.794643 0.20535707473754883 0.042171528144763215 +953 5 5.681073 0.68107318878173828 0.46386068847732531 +954 6 5.8765893 0.12341070175170898 0.015230201306849267 +955 5 5.094201 0.094201087951660156 0.0088738449712764123 +956 5 4.910827 0.089172840118408203 0.0079517954147831915 +957 7 6.410335 0.58966493606567383 0.3477047368253352 +958 7 6.40000057 0.59999942779541016 0.35999931335481961 +959 6 5.77616739 0.22383260726928711 0.050101036076966921 +960 6 5.77616739 0.22383260726928711 0.050101036076966921 +961 7 6.829785 0.17021512985229492 0.028973190430633622 +962 6 5.77616739 0.22383260726928711 0.050101036076966921 +963 6 6.27916765 0.27916765213012695 0.077934577995847576 +964 6 5.445577 0.55442285537719727 0.30738470256460459 +965 5 5.65728569 0.65728569030761719 0.43202447868316085 +966 6 5.425735 0.5742650032043457 0.32978029390528718 +967 6 5.847084 0.15291595458984375 0.023383289168123156 +968 7 6.935579 0.064421176910400391 0.0041500880345211044 +969 7 6.58235359 0.41764640808105469 0.17442852218300686 +970 7 6.57454634 0.42545366287231445 0.181010819251469 +971 7 6.667626 0.33237409591674805 0.11047253963647563 +972 6 5.847084 0.15291595458984375 0.023383289168123156 +973 7 6.935579 0.064421176910400391 0.0041500880345211044 +974 6 6.34301424 0.34301424026489258 0.11765876902450145 +975 5 5.274759 0.27475881576538086 0.075492406840794501 +976 6 6.03319836 0.033198356628417969 0.0011021308828276233 +977 5 5.74932528 0.74932527542114258 0.56148836838497118 +978 7 6.81341648 0.18658351898193359 0.034813409555681574 +979 5 5.48856926 0.48856925964355469 0.23869992146865116 +980 6 5.61005259 0.38994741439819336 0.15205898599583634 +981 7 6.81341648 0.18658351898193359 0.034813409555681574 +982 6 6.38202953 0.38202953338623047 0.14594656437930098 +983 6 6.28082752 0.28082752227783203 0.078864097268706246 +984 5 6.16001749 1.1600174903869629 1.3456405780036675 +985 6 5.89866829 0.10133171081542969 0.01026811561678187 +986 6 5.61840868 0.3815913200378418 0.1456119355282226 +987 6 5.59948635 0.40051364898681641 0.16041118302473478 +988 5 6.16001749 1.1600174903869629 1.3456405780036675 +989 7 6.30157232 0.69842767715454102 0.48780122021548777 +990 6 5.96048832 0.039511680603027344 0.0015611729040756472 +991 4 4.604853 0.60485315322875977 0.36584733697077354 +992 5 5.62472773 0.62472772598266602 0.39028473161147303 +993 4 4.80034733 0.80034732818603516 0.64055584573452506 +994 6 5.684209 0.31579113006591797 0.09972403782830952 +995 6 5.80417538 0.19582462310791016 0.03834728301535506 +996 5 4.886474 0.1135258674621582 0.012888122583035511 +997 6 5.55949831 0.44050168991088867 0.19404173881434872 +998 6 5.67601442 0.32398557662963867 0.10496665386403947 +999 7 6.07843542 0.92156457901000977 0.84928127328589653 +1000 7 5.663046 1.3369541168212891 1.787446310485393 +1001 5 5.360303 0.36030292510986328 0.12981819784272375 +1002 6 5.364488 0.63551187515258789 0.40387534345995846 +1003 7 5.83212233 1.1678776741027832 1.3639382616677267 +1004 6 6.53543663 0.53543663024902344 0.28669238501242944 +1005 6 6.39813471 0.39813470840454102 0.1585112460363689 +1006 6 6.53543663 0.53543663024902344 0.28669238501242944 +1007 5 5.15309 0.15309000015258789 0.02343654814671936 +1008 7 6.193991 0.80600881576538086 0.64965021109151166 +1009 6 5.99658966 0.00341033935546875 1.1630414519459009E-05 +1010 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1011 7 6.34206772 0.65793228149414063 0.4328748870320851 +1012 6 5.97693157 0.023068428039550781 0.0005321523722159327 +1013 5 5.46526432 0.46526432037353516 0.21647088781264756 +1014 5 5.52939034 0.52939033508300781 0.28025412687929929 +1015 5 5.2178936 0.21789360046386719 0.047477621123107383 +1016 5 5.223675 0.22367477416992188 0.05003040459996555 +1017 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1018 6 6.049116 0.049116134643554688 0.0024123946823237929 +1019 6 5.821385 0.17861509323120117 0.031903351529990687 +1020 7 6.07170248 0.92829751968383789 0.8617362850511654 +1021 7 6.07170248 0.92829751968383789 0.8617362850511654 +1022 8 7.050686 0.94931411743164063 0.90119729355501477 +1023 6 5.75873566 0.24126434326171875 0.058208483329508454 +1024 6 5.8799963 0.12000370025634766 0.014400888075215335 +1025 6 5.94306231 0.056937694549560547 0.0032419010606190568 +1026 6 6.319114 0.31911420822143555 0.10183387788879372 +1027 4 4.486199 0.48619890213012695 0.23638937243254077 +1028 7 6.42486572 0.57513427734375 0.33077943697571754 +1029 4 4.84544 0.84543991088867188 0.71476864292344544 +1030 6 5.735335 0.26466512680053711 0.070047629344344386 +1031 6 5.634032 0.36596822738647461 0.13393274345639838 +1032 6 5.66100645 0.33899354934692383 0.11491662649882528 +1033 6 5.66100645 0.33899354934692383 0.11491662649882528 +1034 3 4.125488 1.1254878044128418 1.2667227978820392 +1035 6 6.138177 0.13817691802978516 0.019092860676209966 +1036 5 5.83896446 0.83896446228027344 0.70386136896922835 +1037 5 4.90821743 0.091782569885253906 0.0084240401347415172 +1038 7 6.129409 0.87059116363525391 0.75792897419978544 +1039 5 5.80689764 0.80689764022827148 0.65108380180595304 +1040 4 4.708788 0.70878791809082031 0.5023803128315194 +1041 5 5.35757828 0.35757827758789063 0.12786222460272256 +1042 4 5.14486027 1.1448602676391602 1.3107050324188094 +1043 5 5.193105 0.19310522079467773 0.037289626298161238 +1044 7 5.90646 1.0935401916503906 1.1958301507547731 +1045 5 5.8116107 0.81161069869995117 0.65871192624422292 +1046 5 5.47202826 0.47202825546264648 0.22281067395510945 +1047 5 4.55644464 0.44355535507202148 0.19674135301306706 +1048 5 5.14154768 0.14154767990112305 0.020035745685390793 +1049 6 6.93397 0.93396997451782227 0.87229991330082157 +1050 5 5.74641466 0.7464146614074707 0.55713484676402913 +1051 6 5.719286 0.28071403503417969 0.078800369465170661 +1052 5 5.93918657 0.93918657302856445 0.88207141895713903 +1053 4 4.582541 0.58254098892211914 0.33935400377436054 +1054 5 4.55644464 0.44355535507202148 0.19674135301306706 +1055 5 5.63114262 0.63114261627197266 0.39834100207463052 +1056 6 5.77064943 0.22935056686401367 0.052601682520844406 +1057 5 5.126986 0.12698602676391602 0.016125450993285995 +1058 6 5.77064943 0.22935056686401367 0.052601682520844406 +1059 4 4.764793 0.76479291915893555 0.58490820919564612 +1060 7 6.389546 0.61045408248901367 0.37265418682750351 +1061 5 5.530722 0.53072214126586914 0.28166599122982916 +1062 5 4.86435127 0.13564872741699219 0.018400577249849448 +1063 5 5.185606 0.18560600280761719 0.034449588278221199 +1064 6 5.9687047 0.031295299530029297 0.00097939577267425193 +1065 5 5.57840729 0.57840728759765625 0.33455499034607783 +1066 6 5.432509 0.56749105453491211 0.32204609697714659 +1067 7 6.191147 0.8088531494140625 0.65424341731704772 +1068 7 6.02748346 0.97251653671264648 0.94578841417956028 +1069 6 6.485815 0.48581504821777344 0.23601626107483753 +1070 7 5.874095 1.1259050369262695 1.2676621521759444 +1071 5 5.57840729 0.57840728759765625 0.33455499034607783 +1072 7 6.143502 0.85649776458740234 0.73358842074321728 +1073 5 5.889502 0.88950204849243164 0.79121389427223221 +1074 6 5.229453 0.77054691314697266 0.59374254536032822 +1075 7 6.860558 0.13944196701049805 0.019444062163756826 +1076 6 5.789614 0.21038579940795898 0.044262184592525955 +1077 5 5.7062 0.70620012283325195 0.49871861348970015 +1078 5 5.34196043 0.34196043014526367 0.11693693578513376 +1079 6 5.595201 0.40479898452758789 0.16386221787456634 +1080 7 6.304265 0.69573497772216797 0.48404715922606556 +1081 6 5.60046434 0.3995356559753418 0.15962874039564667 +1082 6 5.60046434 0.3995356559753418 0.15962874039564667 +1083 6 6.12530851 0.12530851364135742 0.015702223591006259 +1084 7 6.0881176 0.91188240051269531 0.83152951236479566 +1085 5 4.941861 0.058138847351074219 0.0033801255713115097 +1086 8 7.36834431 0.63165569305419922 0.39898891456778074 +1087 8 6.271207 1.7287931442260742 2.9887257355230759 +1088 6 6.12530851 0.12530851364135742 0.015702223591006259 +1089 7 6.3522625 0.64773750305175781 0.41956387285972596 +1090 6 5.683116 0.31688404083251953 0.10041549533434591 +1091 6 6.12395525 0.12395524978637695 0.015364903949603104 +1092 6 5.620014 0.37998580932617188 0.14438921528926585 +1093 7 6.19363451 0.8063654899597168 0.65022530339797413 +1094 5 5.29982042 0.2998204231262207 0.089892286123586018 +1095 8 6.90607738 1.0939226150512695 1.196666687720608 +1096 6 5.973055 0.026945114135742188 0.00072603917578817345 +1097 7 6.0881176 0.91188240051269531 0.83152951236479566 +1098 6 6.02920532 0.029205322265625 0.00085295084863901138 +1099 7 7.05420256 0.054202556610107422 0.0029379171430718998 +1100 6 5.60046434 0.3995356559753418 0.15962874039564667 +1101 6 6.717598 0.71759796142578125 0.51494683424243703 +1102 5 6.292189 1.2921891212463379 1.6697527250673829 +1103 5 5.21190643 0.21190643310546875 0.044904336391482502 +1104 5 4.941861 0.058138847351074219 0.0033801255713115097 +1105 7 6.66590166 0.33409833908081055 0.11162170017655626 +1106 8 7.36834431 0.63165569305419922 0.39898891456778074 +1107 7 6.877219 0.12278079986572266 0.015075124815666641 +1108 7 6.55390263 0.44609737396240234 0.19900286705615144 +1109 4 4.86790562 0.86790561676025391 0.75326015960399673 +1110 7 6.877219 0.12278079986572266 0.015075124815666641 +1111 6 6.00191641 0.0019164085388183594 3.6726216876559192E-06 +1112 6 5.69383526 0.30616474151611328 0.093736848947628459 +1113 5 5.76925039 0.76925039291381836 0.59174616699806393 +1114 4 4.30118465 0.30118465423583984 0.0907121959471624 +1115 8 6.56404 1.4359598159790039 2.0619805931064548 +1116 5 4.86854839 0.13145160675048828 0.017279524917285016 +1117 5 5.349912 0.34991216659545898 0.12243852433152824 +1118 5 4.86854839 0.13145160675048828 0.017279524917285016 +1119 5 5.1008563 0.10085630416870117 0.010171994090569569 +1120 6 6.10804558 0.10804557800292969 0.011673846925987164 +1121 6 5.57668161 0.42331838607788086 0.1791984559915818 +1122 7 6.76281452 0.23718547821044922 0.056256951073919481 +1123 5 5.12697363 0.12697362899780273 0.016122302460871651 +1124 5 5.59565544 0.59565544128417969 0.35480540473145084 +1125 6 5.312439 0.68756103515625 0.47274017706513405 +1126 7 7.215483 0.21548318862915039 0.046433004581786008 +1127 7 6.62216425 0.37783575057983398 0.14275985441622652 +1128 5 5.652318 0.65231800079345703 0.42551877415917261 +1129 7 6.32973528 0.67026472091674805 0.44925479610560615 +1130 6 6.008838 0.0088381767272949219 7.8113367862897576E-05 +1131 6 5.69190931 0.3080906867980957 0.094919871291722302 +1132 5 5.54256248 0.54256248474121094 0.29437404984855675 +1133 5 5.666878 0.66687822341918945 0.44472656487073436 +1134 5 5.67285061 0.67285060882568359 0.45272794179709308 +1135 6 5.64160347 0.35839653015136719 0.12844807282453985 +1136 8 7.27833652 0.72166347503662109 0.52079817120193184 +1137 8 6.927531 1.0724692344665527 1.1501902588772737 +1138 5 5.07826948 0.078269481658935547 0.006126111759158448 +1139 5 5.83621359 0.83621358871459961 0.69925316595094955 +1140 6 5.928343 0.071657180786132813 0.0051347515582165215 +1141 5 4.850951 0.14904880523681641 0.02221554634252243 +1142 5 5.07826948 0.078269481658935547 0.006126111759158448 +1143 5 5.90772963 0.9077296257019043 0.82397307337691927 +1144 5 5.90772963 0.9077296257019043 0.82397307337691927 +1145 5 5.13637543 0.13637542724609375 0.01859825715655461 +1146 5 5.33813667 0.33813667297363281 0.1143364096096775 +1147 5 4.88847 0.11152982711791992 0.012438902336953106 +1148 6 6.21973848 0.21973848342895508 0.048285001099657165 +1149 5 5.244409 0.24440908432006836 0.059735800498174285 +1150 5 5.07894039 0.078940391540527344 0.006231585416571761 +1151 5 5.13637543 0.13637542724609375 0.01859825715655461 +1152 4 4.63385725 0.63385725021362305 0.40177501364837553 +1153 6 5.98369 0.016310214996337891 0.00026602311322676542 +1154 4 5.617376 1.6173758506774902 2.6159046423547352 +1155 4 5.803424 1.8034238815307617 3.2523376964754789 +1156 6 5.578991 0.42100906372070313 0.17724863173498306 +1157 6 5.578991 0.42100906372070313 0.17724863173498306 +1158 6 5.70412 0.29587984085083008 0.087544880221912535 +1159 6 5.578991 0.42100906372070313 0.17724863173498306 +1160 6 6.017941 0.017940998077392578 0.00032187941201300418 +1161 6 5.578991 0.42100906372070313 0.17724863173498306 +1162 7 6.018001 0.98199892044067383 0.96432187974664885 +1163 6 5.70412 0.29587984085083008 0.087544880221912535 +1164 6 5.45376539 0.5462346076965332 0.29837224664538553 +1165 5 6.16789961 1.1678996086120605 1.3639894957962042 +1166 5 4.949173 0.0508270263671875 0.0025833866093307734 +1167 6 5.63779 0.36220979690551758 0.13119593697433629 +1168 5 5.710626 0.71062612533569336 0.50498949000962057 +1169 6 6.017941 0.017940998077392578 0.00032187941201300418 +1170 6 5.43487358 0.56512641906738281 0.31936786952792318 +1171 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1172 6 5.81844044 0.18155956268310547 0.032963874801680504 +1173 5 6.03744555 1.0374455451965332 1.076293259248132 +1174 6 6.07708836 0.077088356018066406 0.0059426146335681551 +1175 5 5.48079157 0.48079156875610352 0.23116053258695501 +1176 7 5.870003 1.1299967765808105 1.2768927150830223 +1177 6 5.4681325 0.53186750411987305 0.28288304193870317 +1178 5 4.922261 0.077738761901855469 0.0060433151020333753 +1179 5 5.81053 0.81053018569946289 0.6569591819300058 +1180 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1181 6 5.45621252 0.54378747940063477 0.29570482275289578 +1182 5 6.03744555 1.0374455451965332 1.076293259248132 +1183 6 6.10228348 0.10228347778320313 0.010461909827427007 +1184 7 6.92237663 0.077623367309570313 0.0060253871524764691 +1185 5 5.2008605 0.20086050033569336 0.040344940595105072 +1186 5 5.0423584 0.0423583984375 0.0017942339181900024 +1187 8 6.55680561 1.4431943893432617 2.0828100454318701 +1188 6 5.83443451 0.16556549072265625 0.027411931718233973 +1189 5 4.74727535 0.25272464752197266 0.06386974746510532 +1190 6 5.81844044 0.18155956268310547 0.032963874801680504 +1191 7 6.47237968 0.52762031555175781 0.27838319738293649 +1192 6 5.84241 0.15758991241455078 0.024834580494825786 +1193 7 6.388489 0.61151123046875 0.37394598498940468 +1194 6 5.450869 0.54913091659545898 0.30154476356096893 +1195 6 5.95843744 0.041562557220458984 0.0017274461627039273 +1196 7 6.47237968 0.52762031555175781 0.27838319738293649 +1197 7 6.388489 0.61151123046875 0.37394598498940468 +1198 6 5.84241 0.15758991241455078 0.024834580494825786 +1199 7 6.247097 0.75290298461914063 0.5668629042484099 +1200 6 6.368082 0.36808204650878906 0.13548439296209835 +1201 7 6.383849 0.61615085601806641 0.379641877371796 +1202 5 5.37665272 0.37665271759033203 0.14186726966818242 +1203 6 5.49147367 0.50852632522583008 0.2585990234476867 +1204 6 5.49147367 0.50852632522583008 0.2585990234476867 +1205 5 4.820721 0.17927885055541992 0.03214090625647259 +1206 6 5.5144763 0.48552370071411133 0.23573326395512595 +1207 5 5.37665272 0.37665271759033203 0.14186726966818242 +1208 6 6.214216 0.21421623229980469 0.045888594180723885 +1209 6 6.27291727 0.27291727066040039 0.074483836624722244 +1210 6 5.206366 0.79363393783569336 0.62985482728458919 +1211 5 5.30671549 0.30671548843383789 0.094074390845207745 +1212 6 5.91659546 0.083404541015625 0.0069563174620270729 +1213 6 5.49147367 0.50852632522583008 0.2585990234476867 +1214 6 5.434932 0.56506776809692383 0.31930158254203889 +1215 5 5.5278945 0.52789449691772461 0.27867259987601756 +1216 8 6.689088 1.3109121322631836 1.7184906185148066 +1217 5 4.755091 0.24490880966186523 0.059980325049991734 +1218 8 6.63341141 1.3665885925292969 1.8675643812312046 +1219 8 6.689088 1.3109121322631836 1.7184906185148066 +1220 6 5.60927534 0.39072465896606445 0.15266575912414737 +1221 7 6.98346758 0.016532421112060547 0.00027332094782650529 +1222 6 5.45542 0.54457998275756836 0.29656735762023345 +1223 5 5.5278945 0.52789449691772461 0.27867259987601756 +1224 7 6.87969351 0.12030649185180664 0.014473651981688818 +1225 6 6.18620157 0.18620157241821289 0.03467102557101498 +1226 7 6.87969351 0.12030649185180664 0.014473651981688818 +1227 5 6.072542 1.0725421905517578 1.1503467505135632 +1228 6 5.84670973 0.1532902717590332 0.023497907415958252 +1229 3 5.12617159 2.1261715888977051 4.5206056254357918 +1230 6 5.860294 0.13970613479614258 0.01951780409967796 +1231 7 6.78599644 0.21400356292724609 0.045797524945555779 +1232 7 6.88765144 0.11234855651855469 0.012622198151802877 +1233 6 6.57666636 0.57666635513305664 0.3325440851424446 +1234 6 6.01195574 0.011955738067626953 0.00014293967274170427 +1235 5 5.51621962 0.5162196159362793 0.2664826918773997 +1236 6 6.18620157 0.18620157241821289 0.03467102557101498 +1237 5 6.120411 1.1204109191894531 1.2553206278389553 +1238 7 6.923103 0.076897144317626953 0.0059131708042059472 +1239 5 5.1333437 0.13334369659423828 0.017780541421416274 +1240 6 5.67478561 0.32521438598632813 0.10576439685246442 +1241 7 6.386693 0.61330699920654297 0.3761454752757345 +1242 7 6.761541 0.23845911026000977 0.056862747265995495 +1243 7 6.923103 0.076897144317626953 0.0059131708042059472 +1244 5 5.49561262 0.49561262130737305 0.24563187039916556 +1245 4 4.910776 0.91077613830566406 0.82951317410697811 +1246 7 5.8812623 1.1187376976013184 1.2515740360342988 +1247 6 5.924655 0.075345039367675781 0.0056768749573166133 +1248 7 6.13088036 0.86911964416503906 0.75536895587356412 +1249 5 5.003289 0.0032892227172851563 1.0818986083904747E-05 +1250 7 6.48895645 0.51104354858398438 0.2611655085493112 +1251 5 5.63452435 0.63452434539794922 0.40262114490269596 +1252 6 5.67069244 0.32930755615234375 0.10844346653902903 +1253 7 6.81721258 0.18278741836547852 0.033411240312716473 +1254 5 5.828939 0.82893896102905273 0.68713980111192541 +1255 6 5.722976 0.2770237922668457 0.076742181481904481 +1256 6 5.81828737 0.18171262741088867 0.033019478960568449 +1257 6 5.969221 0.030778884887695313 0.00094733975492999889 +1258 6 5.33740044 0.66259956359863281 0.43903818168109865 +1259 6 5.84787655 0.15212345123291016 0.023141544415011595 +1260 6 5.859397 0.14060306549072266 0.019769222025388444 +1261 6 5.74161673 0.25838327407836914 0.066761916323457626 +1262 6 5.81828737 0.18171262741088867 0.033019478960568449 +1263 6 5.32097244 0.67902755737304688 0.46107842367200647 +1264 5 5.465101 0.46510076522827148 0.21631872181592371 +1265 7 6.204722 0.79527807235717773 0.63246721237214842 +1266 8 6.60801363 1.3919863700866699 1.9376260545070636 +1267 7 6.50023127 0.49976873397827148 0.24976878746224429 +1268 5 5.397177 0.39717721939086914 0.1577497436030626 +1269 6 5.59714651 0.40285348892211914 0.16229093353672397 +1270 7 6.50023127 0.49976873397827148 0.24976878746224429 +1271 5 5.15302753 0.15302753448486328 0.023417426310516021 +1272 5 5.176312 0.17631196975708008 0.03108591067962152 +1273 5 5.15302753 0.15302753448486328 0.023417426310516021 +1274 6 5.59714651 0.40285348892211914 0.16229093353672397 +1275 6 5.59203053 0.40796947479248047 0.16643909236245236 +1276 7 6.50023127 0.49976873397827148 0.24976878746224429 +1277 5 5.397177 0.39717721939086914 0.1577497436030626 +1278 6 5.566156 0.43384408950805664 0.18822069400107466 +1279 6 5.934077 0.065923213958740234 0.0043458701386498433 +1280 6 6.38662767 0.3866276741027832 0.14948095838212794 +1281 7 6.501193 0.49880695343017578 0.24880837679029355 +1282 5 4.947265 0.052734851837158203 0.0027809645982870279 +1283 8 7.58158 0.41841983795166016 0.17507516079149354 +1284 7 6.501193 0.49880695343017578 0.24880837679029355 +1285 6 6.38662767 0.3866276741027832 0.14948095838212794 +1286 7 6.139841 0.86015892028808594 0.73987336815116578 +1287 7 6.50392437 0.49607563018798828 0.24609103086640971 +1288 7 6.72525024 0.274749755859375 0.075487428344786167 +1289 6 6.28108 0.28107976913452148 0.079005836616715897 +1290 6 5.80168343 0.19831657409667969 0.039329463561443845 +1291 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1292 6 6.130666 0.13066577911376953 0.01707354583140841 +1293 4 4.788151 0.78815078735351563 0.62118166360596661 +1294 4 4.788151 0.78815078735351563 0.62118166360596661 +1295 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1296 6 6.36224365 0.36224365234375 0.13122046366333961 +1297 7 6.582107 0.4178929328918457 0.17463450336094866 +1298 6 6.55059576 0.55059576034545898 0.3031556913103941 +1299 5 5.97331524 0.97331523895263672 0.94734255437742831 +1300 6 5.93681765 0.063182353973388672 0.0039920098536185833 +1301 5 5.99956369 0.99956369400024414 0.9991275783634137 +1302 6 5.753585 0.24641513824462891 0.060720420356119575 +1303 6 6.10364437 0.10364437103271484 0.01074215564676706 +1304 5 4.612831 0.38716888427734375 0.1498997449525632 +1305 7 5.955537 1.0444631576538086 1.0909032876961646 +1306 8 6.829604 1.1703958511352539 1.3698264483546154 +1307 5 4.941627 0.058372974395751953 0.0034074041398071131 +1308 6 5.64012241 0.35987758636474609 0.12951187716771528 +1309 6 5.221883 0.77811717987060547 0.60546634560978418 +1310 6 5.45807457 0.54192543029785156 0.29368317200351157 +1311 6 5.909332 0.090668201446533203 0.0082207227535491256 +1312 5 5.35318565 0.35318565368652344 0.12474010596997687 +1313 5 4.43518734 0.56481266021728516 0.31901334114172641 +1314 6 5.36058331 0.63941669464111328 0.40885370938576671 +1315 6 5.82610559 0.17389440536499023 0.030239264217243544 +1316 6 5.933774 0.066226005554199219 0.0043858838116648258 +1317 5 5.721077 0.72107696533203125 0.5199519899324514 +1318 6 6.0769105 0.076910495758056641 0.0059152243577500485 +1319 5 5.427906 0.42790603637695313 0.18310357596783433 +1320 6 5.612823 0.3871769905090332 0.14990602197963199 +1321 6 6.429845 0.42984485626220703 0.18476660045507742 +1322 6 5.86295748 0.13704252243041992 0.018780652954092147 +1323 5 5.48062134 0.480621337890625 0.23099687043577433 +1324 6 5.85815763 0.14184236526489258 0.020119256583939205 +1325 7 6.76510859 0.23489141464233398 0.055173976672676872 +1326 6 5.478635 0.52136516571044922 0.27182163601628417 +1327 6 5.77933025 0.22066974639892578 0.048695136975766218 +1328 6 6.24729967 0.2472996711730957 0.061157127362321262 +1329 5 5.54726648 0.54726648330688477 0.29950060375108478 +1330 5 5.39347935 0.39347934722900391 0.15482599669576302 +1331 6 6.08679676 0.086796760559082031 0.0075336776435506181 +1332 7 6.21610069 0.78389930725097656 0.61449812390856096 +1333 8 7.01025534 0.98974466323852539 0.97959449840914203 +1334 6 5.852407 0.14759302139282227 0.021783699963862091 +1335 6 5.72382832 0.27617168426513672 0.076270799189842364 +1336 8 6.596054 1.4039459228515625 1.9710641542915255 +1337 5 5.49725866 0.49725866317749023 0.24726617810506468 +1338 5 5.49725866 0.49725866317749023 0.24726617810506468 +1339 6 5.488146 0.51185417175292969 0.26199469314087764 +1340 6 5.59975767 0.40024232864379883 0.16019392163821067 +1341 5 5.11727953 0.1172795295715332 0.013754488056520131 +1342 6 5.488146 0.51185417175292969 0.26199469314087764 +1343 6 5.54852057 0.45147943496704102 0.20383368019815862 +1344 8 6.80502939 1.1949706077575684 1.4279547534044923 +1345 8 7.36150551 0.63849449157714844 0.40767521577436128 +1346 7 6.67498064 0.32501935958862305 0.10563758410739865 +1347 7 6.64853954 0.35146045684814453 0.12352445272790646 +1348 8 6.596054 1.4039459228515625 1.9710641542915255 +1349 4 4.20987129 0.20987129211425781 0.044045959253708133 +1350 7 6.88175058 0.11824941635131836 0.013982924467427438 +1351 7 6.931576 0.068424224853515625 0.0046818745468044654 +1352 6 5.72382832 0.27617168426513672 0.076270799189842364 +1353 5 5.49725866 0.49725866317749023 0.24726617810506468 +1354 5 5.646412 0.64641189575195313 0.41784833896963391 +1355 5 5.556504 0.5565037727355957 0.30969644906895155 +1356 6 5.781893 0.21810722351074219 0.04757076094756485 +1357 6 5.502844 0.49715614318847656 0.24716423071004101 +1358 8 6.61071873 1.3892812728881836 1.9301024551978117 +1359 7 6.328941 0.67105913162231445 0.45032035813369475 +1360 6 6.152078 0.15207815170288086 0.023127764225364444 +1361 7 6.2568655 0.74313449859619141 0.55224888300381281 +1362 7 6.257044 0.74295616149902344 0.551983857909363 +1363 4 5.13123131 1.1312313079833984 1.2796842721618304 +1364 5 5.556504 0.5565037727355957 0.30969644906895155 +1365 7 6.42597771 0.57402229309082031 0.32950159296524362 +1366 6 6.17942142 0.17942142486572266 0.03219204770084616 +1367 5 5.251204 0.25120401382446289 0.063103456561520943 +1368 6 5.781893 0.21810722351074219 0.04757076094756485 +1369 5 4.914902 0.085097789764404297 0.0072416338227867527 +1370 6 5.61482573 0.38517427444458008 0.14835922169390869 +1371 7 6.18855333 0.8114466667175293 0.65844569292698907 +1372 6 5.690512 0.30948781967163086 0.095782710525099901 +1373 6 5.690512 0.30948781967163086 0.095782710525099901 +1374 7 6.57598352 0.42401647567749023 0.17978997164595967 +1375 7 6.474106 0.5258941650390625 0.27656467282213271 +1376 6 5.44045067 0.55954933166503906 0.31309545456679189 +1377 6 5.42730761 0.5726923942565918 0.32797657843934758 +1378 7 6.15234852 0.84765148162841797 0.71851303430685221 +1379 6 4.94880867 1.0511913299560547 1.105003212174779 +1380 7 6.84760427 0.15239572525024414 0.0232244570745479 +1381 7 7.003771 0.0037708282470703125 1.4219145668903366E-05 +1382 6 5.2290206 0.77097940444946289 0.59440924208524848 +1383 6 5.473995 0.52600479125976563 0.27668104042822961 +1384 6 5.33457041 0.66542959213256836 0.44279654208571628 +1385 5 5.29342842 0.29342842102050781 0.086100238262588391 +1386 7 6.966072 0.03392791748046875 0.001151103584561497 +1387 6 6.410287 0.41028690338134766 0.16833534308625531 +1388 7 6.245387 0.75461292266845703 0.56944066305823071 +1389 6 5.70716763 0.29283237457275391 0.085750799597917648 +1390 6 5.880706 0.11929416656494141 0.014231098176423984 +1391 6 6.2913146 0.29131460189819336 0.084864197279102882 +1392 6 6.410287 0.41028690338134766 0.16833534308625531 +1393 6 5.585095 0.41490507125854492 0.17214621815605824 +1394 7 6.966072 0.03392791748046875 0.001151103584561497 +1395 7 6.48753452 0.51246547698974609 0.26262086510632798 +1396 7 6.245387 0.75461292266845703 0.56944066305823071 +1397 7 6.31858444 0.68141555786132813 0.46432716249546502 +1398 7 6.31858444 0.68141555786132813 0.46432716249546502 +1399 6 6.270913 0.27091312408447266 0.073393920801208878 +1400 7 6.31858444 0.68141555786132813 0.46432716249546502 +1401 6 5.119604 0.88039588928222656 0.77509692186504253 +1402 8 6.57125139 1.428748607635498 2.0413225838203743 +1403 8 6.820425 1.1795749664306641 1.3913971014299022 +1404 5 5.219756 0.21975612640380859 0.048292755092006701 +1405 4 4.77159548 0.77159547805786133 0.59535958175933956 +1406 8 6.147219 1.852780818939209 3.4327967630290459 +1407 6 6.19692135 0.19692134857177734 0.038778017523327435 +1408 7 6.31858444 0.68141555786132813 0.46432716249546502 +1409 6 6.006806 0.0068058967590332031 4.6320230694618658E-05 +1410 6 6.78585 0.78585004806518555 0.61756029804405443 +1411 6 6.270913 0.27091312408447266 0.073393920801208878 +1412 8 6.838521 1.1614789962768555 1.3490334587922916 +1413 6 5.712056 0.28794384002685547 0.082911655009411334 +1414 6 6.27111959 0.27111959457397461 0.073505834561956362 +1415 5 4.7982645 0.20173549652099609 0.040697210556572827 +1416 6 5.83465528 0.1653447151184082 0.027338874817587566 +1417 3 3.94480681 0.94480681419372559 0.8926599161468971 +1418 5 5.14915037 0.14915037155151367 0.022245833333954579 +1419 7 5.99877644 1.0012235641479492 1.0024486254051226 +1420 4 4.949227 0.94922685623168945 0.90103162459149644 +1421 6 6.25533533 0.25533533096313477 0.065196131238053567 +1422 5 5.661264 0.66126394271850586 0.4372700019396234 +1423 4 4.768664 0.76866388320922852 0.5908441653502905 +1424 6 5.712056 0.28794384002685547 0.082911655009411334 +1425 6 5.82935858 0.17064142227172852 0.029118494994918365 +1426 6 6.34480238 0.3448023796081543 0.11888868098344574 +1427 5 5.729822 0.72982215881347656 0.53264038349516341 +1428 7 6.32088757 0.67911243438720703 0.46119369853931858 +1429 5 5.381057 0.38105678558349609 0.14520427383922652 +1430 4 4.68381166 0.68381166458129883 0.46759839261744673 +1431 5 5.381057 0.38105678558349609 0.14520427383922652 +1432 7 6.46803951 0.53196048736572266 0.28298196011837717 +1433 6 6.136118 0.13611793518066406 0.018528092277847463 +1434 5 5.729822 0.72982215881347656 0.53264038349516341 +1435 5 5.611653 0.61165285110473633 0.37411921026455275 +1436 5 4.68876076 0.31123924255371094 0.096869866105407709 +1437 7 6.32088757 0.67911243438720703 0.46119369853931858 +1438 5 5.26315546 0.26315546035766602 0.06925079631605513 +1439 5 5.47552 0.47552013397216797 0.22611939781290857 +1440 5 5.3382206 0.33822059631347656 0.11439317177064368 +1441 5 5.190989 0.19098901748657227 0.036476804800486207 +1442 5 5.26568127 0.26568126678466797 0.070586535520305915 +1443 6 6.41662264 0.41662263870239258 0.17357442307934434 +1444 6 6.25118971 0.2511897087097168 0.063096269761672374 +1445 6 6.20891047 0.20891046524047852 0.043643582486993182 +1446 6 6.29368258 0.29368257522583008 0.086249454991275343 +1447 6 5.892337 0.10766315460205078 0.011591354858865088 +1448 6 5.892337 0.10766315460205078 0.011591354858865088 +1449 6 6.1661396 0.16613960266113281 0.027602367572399089 +1450 6 6.25118971 0.2511897087097168 0.063096269761672374 +1451 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1452 6 6.25118971 0.2511897087097168 0.063096269761672374 +1453 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1454 5 5.479026 0.47902584075927734 0.22946575611513254 +1455 5 5.074789 0.074789047241210938 0.0055934015872480813 +1456 6 6.29368258 0.29368257522583008 0.086249454991275343 +1457 6 6.20891047 0.20891046524047852 0.043643582486993182 +1458 6 6.450489 0.45048904418945313 0.20294037893472705 +1459 6 6.16096926 0.16096925735473633 0.025911101813335335 +1460 6 6.26689243 0.26689243316650391 0.071231570881536754 +1461 6 6.07949543 0.079495429992675781 0.0063195233897204162 +1462 6 5.892337 0.10766315460205078 0.011591354858865088 +1463 6 5.363495 0.636505126953125 0.40513877663761377 +1464 8 7.07665825 0.92334175109863281 0.85255998932188959 +1465 5 5.519054 0.51905393600463867 0.26941698848190754 +1466 6 6.1661396 0.16613960266113281 0.027602367572399089 +1467 7 6.628117 0.37188291549682617 0.13829690283841956 +1468 5 5.396044 0.39604377746582031 0.1568506736693962 +1469 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1470 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1471 6 6.25118971 0.2511897087097168 0.063096269761672374 +1472 5 4.971684 0.028316020965576172 0.00080179704332294932 +1473 6 6.13895845 0.13895845413208008 0.019309451974777403 +1474 4 4.94047976 0.94047975540161133 0.88450217032027467 +1475 6 5.83468962 0.16531038284301758 0.02732752267570504 +1476 5 5.194277 0.19427680969238281 0.037743478784250328 +1477 6 4.945969 1.0540308952331543 1.1109811281060047 +1478 6 5.97336531 0.026634693145751953 0.00070940687896836607 +1479 6 5.95833 0.041669845581054688 0.0017363760307489429 +1480 6 5.83468962 0.16531038284301758 0.02732752267570504 +1481 6 5.83350468 0.16649532318115234 0.027720692641196365 +1482 6 5.766513 0.23348712921142578 0.054516239507393038 +1483 4 4.94047976 0.94047975540161133 0.88450217032027467 +1484 3 4.470957 1.4709568023681641 2.1637139144331741 +1485 6 5.71909666 0.28090333938598633 0.078906686078198618 +1486 6 5.822368 0.17763185501098633 0.031553075914644069 +1487 6 5.281767 0.71823310852050781 0.51585879817503155 +1488 6 5.49806166 0.5019383430480957 0.2519421002218678 +1489 5 5.55353355 0.55353355407714844 0.30639939548927941 +1490 6 6.164951 0.16495084762573242 0.027208782132447595 +1491 5 5.153073 0.15307283401489258 0.023431292513350854 +1492 5 5.51080036 0.51080036163330078 0.26091700944471086 +1493 8 7.14790726 0.85209274291992188 0.72606204253679607 +1494 8 6.94167757 1.0583224296569824 1.1200463651150585 +1495 7 6.684428 0.31557178497314453 0.099585551471136569 +1496 5 4.59208965 0.40791034698486328 0.16639085117731156 +1497 7 6.43388653 0.56611347198486328 0.32048446316275658 +1498 6 6.206013 0.20601320266723633 0.042441439673211789 +1499 6 6.377341 0.37734079360961914 0.14238607452193719 +1500 7 6.473521 0.52647876739501953 0.27717989251777908 +1501 5 5.64289665 0.64289665222167969 0.41331610543784336 +1502 5 5.318365 0.31836509704589844 0.10135633501704433 +1503 7 6.770466 0.22953414916992188 0.052685925635159947 +1504 8 6.64272928 1.3572707176208496 1.8421838009110161 +1505 7 6.01323271 0.98676729202270508 0.97370968860582252 +1506 6 5.81762934 0.18237066268920898 0.033259058609701242 +1507 6 5.59561062 0.40438938140869141 0.16353077179610409 +1508 6 5.72143364 0.27856636047363281 0.077599217187525937 +1509 5 5.64345741 0.64345741271972656 0.41403744198396453 +1510 5 5.424362 0.4243621826171875 0.18008326203562319 +1511 6 5.81927538 0.1807246208190918 0.032661388570204508 +1512 7 6.42719269 0.57280731201171875 0.32810821669409052 +1513 6 6.5397687 0.53976869583129883 0.29135024499942119 +1514 7 6.473521 0.52647876739501953 0.27717989251777908 +1515 6 6.226191 0.22619104385375977 0.051162388319653473 +1516 6 6.13849163 0.13849163055419922 0.019179931733560807 +1517 6 5.995002 0.0049982070922851563 2.4982074137369636E-05 +1518 6 6.13184547 0.13184547424316406 0.017383229078404838 +1519 5 5.64289665 0.64289665222167969 0.41331610543784336 +1520 6 5.77483654 0.22516345977783203 0.050698583619123383 +1521 5 5.318365 0.31836509704589844 0.10135633501704433 +1522 5 5.813046 0.81304597854614258 0.66104376323005454 +1523 6 5.70439 0.29560995101928711 0.087385243141625324 +1524 6 5.45256138 0.54743862152099609 0.29968904433280841 +1525 5 5.168963 0.16896295547485352 0.028548480322797332 +1526 6 6.030308 0.030307769775390625 0.0009185609087580815 +1527 6 6.06596 0.065959930419921875 0.0043507124210009351 +1528 6 5.98619127 0.013808727264404297 0.00019068094866270258 +1529 6 5.45256138 0.54743862152099609 0.29968904433280841 +1530 5 5.168963 0.16896295547485352 0.028548480322797332 +1531 7 6.09255266 0.90744733810424805 0.82346067143248547 +1532 7 6.17497635 0.82502365112304688 0.68066402491240297 +1533 6 6.188314 0.18831396102905273 0.035462147918451592 +1534 6 5.93772459 0.062275409698486328 0.003878226653114325 +1535 6 5.900267 0.099732875823974609 0.0099466465201203391 +1536 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1537 6 5.703288 0.29671192169189453 0.088037964474096952 +1538 6 5.74273157 0.25726842880249023 0.066187044458501987 +1539 6 6.188314 0.18831396102905273 0.035462147918451592 +1540 6 5.93772459 0.062275409698486328 0.003878226653114325 +1541 4 4.76091242 0.76091241836547852 0.57898770842280101 +1542 6 6.11882639 0.11882638931274414 0.014119710797103835 +1543 6 6.29636 0.29636001586914063 0.087829259005957283 +1544 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1545 6 6.044429 0.044428825378417969 0.0019739205245059566 +1546 6 5.64528561 0.35471439361572266 0.12582230103816983 +1547 6 5.64528561 0.35471439361572266 0.12582230103816983 +1548 6 6.87292671 0.87292671203613281 0.76200104458621354 +1549 6 5.900267 0.099732875823974609 0.0099466465201203391 +1550 6 6.021991 0.021990776062011719 0.00048359423180954764 +1551 6 6.07919264 0.079192638397216797 0.0062714739763123362 +1552 7 7.06551027 0.065510272979736328 0.0042915958658795716 +1553 7 6.482196 0.51780414581298828 0.26812113342111843 +1554 7 6.27147055 0.72852945327758789 0.53075516429294112 +1555 7 6.7877593 0.21224069595336914 0.045046113018770484 +1556 6 5.75313663 0.24686336517333984 0.060941521064705739 +1557 6 6.021991 0.021990776062011719 0.00048359423180954764 +1558 4 4.91349363 0.91349363327026367 0.83447061802530698 +1559 4 4.4660306 0.46603059768676758 0.21718451798028582 +1560 6 6.359429 0.35942888259887695 0.12918912164627727 +1561 5 4.71328 0.28671979904174805 0.082208243162540384 +1562 7 6.898671 0.10132884979248047 0.010267535800267069 +1563 6 6.359429 0.35942888259887695 0.12918912164627727 +1564 5 4.71328 0.28671979904174805 0.082208243162540384 +1565 6 5.96442747 0.035572528839111328 0.0012654048080094071 +1566 5 5.83771753 0.83771753311157227 0.70177066528253818 +1567 5 5.50233173 0.50233173370361328 0.25233717068567785 +1568 6 5.516011 0.48398876190185547 0.23424512164729094 +1569 5 5.306023 0.30602312088012695 0.093650150513212793 +1570 5 5.480161 0.48016119003295898 0.23055476841386735 +1571 6 5.516011 0.48398876190185547 0.23424512164729094 +1572 6 5.753487 0.24651288986206055 0.060768604868144394 +1573 5 5.619523 0.61952304840087891 0.38380880749991775 +1574 4 5.28259468 1.2825946807861328 1.6450491151808819 +1575 6 5.87912941 0.12087059020996094 0.014609699577704305 +1576 6 5.57926 0.42074012756347656 0.17702225494213053 +1577 4 4.433939 0.43393898010253906 0.18830303845243179 +1578 5 5.368031 0.36803102493286133 0.1354468353131324 +1579 4 5.156767 1.1567668914794922 1.3381096412231273 +1580 5 4.508023 0.49197721481323242 0.24204157989538544 +1581 6 5.6025157 0.39748430252075195 0.15799377075040866 +1582 7 6.667178 0.33282184600830078 0.11077038118037308 +1583 5 5.368031 0.36803102493286133 0.1354468353131324 +1584 6 5.357087 0.64291286468505859 0.41333695157754846 +1585 5 5.135726 0.13572597503662109 0.018421540299641492 +1586 5 4.884364 0.11563587188720703 0.013371654867114557 +1587 6 5.357087 0.64291286468505859 0.41333695157754846 +1588 5 5.135726 0.13572597503662109 0.018421540299641492 +1589 6 6.05095768 0.050957679748535156 0.00259668512535427 +1590 6 6.273106 0.27310609817504883 0.074586940860399409 +1591 6 6.14363956 0.14363956451416016 0.020632324493817578 +1592 6 5.825356 0.17464399337768555 0.030500524422905073 +1593 6 5.8224 0.17759990692138672 0.031541726938485226 +1594 6 5.46713 0.53286981582641602 0.28395024061887852 +1595 6 5.4586587 0.54134130477905273 0.29305040825988726 +1596 5 5.47208929 0.47208929061889648 0.2228682983170529 +1597 6 5.4586587 0.54134130477905273 0.29305040825988726 +1598 6 5.762172 0.23782777786254883 0.05656205192303787 +1599 6 5.875584 0.12441587448120117 0.015479309822922005 +1600 6 5.46713 0.53286981582641602 0.28395024061887852 +1601 6 5.634498 0.36550188064575195 0.13359162475558151 +1602 5 6.442401 1.4424009323120117 2.0805204495345606 +1603 7 6.492261 0.50773906707763672 0.25779896023686888 +1604 5 5.0516305 0.051630496978759766 0.0026657082182737213 +1605 9 7.458617 1.5413827896118164 2.3758609041115051 +1606 6 6.246019 0.24601888656616211 0.060525292547254139 +1607 7 6.15459061 0.84540939331054688 0.71471704229770694 +1608 5 5.464145 0.46414518356323242 0.21543075142494672 +1609 7 6.011046 0.98895406723022461 0.97803014709120362 +1610 6 6.246019 0.24601888656616211 0.060525292547254139 +1611 6 5.587227 0.41277313232421875 0.170381658768747 +1612 7 6.48129845 0.51870155334472656 0.26905130144223222 +1613 7 6.61206961 0.38793039321899414 0.15048998998304342 +1614 5 5.850582 0.85058212280273438 0.7234899476316059 +1615 6 6.102702 0.10270214080810547 0.010547729726567923 +1616 6 5.51687765 0.48312234878540039 0.23340720389592207 +1617 6 5.571805 0.42819499969482422 0.18335095776365051 +1618 6 5.28217125 0.71782875061035156 0.5152781152028183 +1619 8 7.13240433 0.86759567260742188 0.75272225112712476 +1620 7 6.48129845 0.51870155334472656 0.26905130144223222 +1621 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1622 6 5.239296 0.76070404052734375 0.57867063727462664 +1623 6 5.86622047 0.13377952575683594 0.01789696151172393 +1624 7 6.18613243 0.81386756896972656 0.66238041982069262 +1625 6 5.87100458 0.12899541854858398 0.016639818006524365 +1626 6 5.90693 0.093070030212402344 0.0086620305237374851 +1627 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1628 6 5.890122 0.1098780632019043 0.012073188773001675 +1629 6 5.977284 0.022716045379638672 0.00051601871768980345 +1630 5 5.31199455 0.31199455261230469 0.097340600859752158 +1631 6 5.890122 0.1098780632019043 0.012073188773001675 +1632 8 7.1502 0.84980010986328125 0.72216022672364488 +1633 7 6.04704762 0.95295238494873047 0.90811824797947338 +1634 6 5.547635 0.45236492156982422 0.20463402226687322 +1635 6 5.52456141 0.47543859481811523 0.22604185744262395 +1636 5 5.148717 0.14871692657470703 0.022116724249826802 +1637 6 6.15984631 0.15984630584716797 0.025550841492986365 +1638 5 5.09744549 0.097445487976074219 0.0094956231268952251 +1639 5 5.942503 0.94250297546386719 0.88831185875824303 +1640 5 5.148717 0.14871692657470703 0.022116724249826802 +1641 6 5.82682943 0.17317056655883789 0.029988045122308904 +1642 7 6.504058 0.49594211578369141 0.24595858220800437 +1643 7 5.77661276 1.2233872413635254 1.4966763423310567 +1644 7 6.504058 0.49594211578369141 0.24595858220800437 +1645 7 6.223316 0.77668380737304688 0.60323773663549218 +1646 6 5.82682943 0.17317056655883789 0.029988045122308904 +1647 7 6.27178574 0.72821426391601563 0.53029601417074446 +1648 5 5.7562747 0.75627470016479492 0.57195142210935046 +1649 4 4.85746956 0.85746955871582031 0.73525404412430362 +1650 7 6.80729961 0.19270038604736328 0.037133438782802841 +1651 6 5.34201 0.6579899787902832 0.43295081218843734 +1652 4 5.75338364 1.7533836364746094 3.0743541766569251 +1653 6 5.71115732 0.28884267807006836 0.083430092674689149 +1654 5 5.11912 0.11912012100219727 0.014189603227578118 +1655 5 5.338051 0.33805084228515625 0.11427837196970358 +1656 5 5.51299047 0.51299047470092773 0.26315922713388318 +1657 6 6.112662 0.11266183853149414 0.012692689861296458 +1658 5 5.144843 0.14484310150146484 0.020979524052563647 +1659 5 5.225776 0.22577619552612305 0.050974890466250145 +1660 6 5.27949429 0.72050571441650391 0.51912848450683668 +1661 6 5.528939 0.47106122970581055 0.22189868213195041 +1662 7 6.071942 0.92805814743041992 0.86129192501198304 +1663 6 5.71115732 0.28884267807006836 0.083430092674689149 +1664 4 5.10081768 1.1008176803588867 1.2117995653907201 +1665 8 7.05892038 0.94107961654663086 0.88563084467955377 +1666 5 4.735589 0.26441097259521484 0.069913162428747455 +1667 6 5.98559475 0.014405250549316406 0.00020751124338858062 +1668 7 6.120982 0.87901782989501953 0.77267234527334949 +1669 6 5.108951 0.89104890823364258 0.79396815686436639 +1670 6 5.488634 0.51136589050292969 0.26149507396985427 +1671 7 6.510288 0.48971223831176758 0.23981807635232144 +1672 5 5.421067 0.42106723785400391 0.1772976187940003 +1673 5 5.347374 0.34737396240234375 0.12066866975510493 +1674 6 5.980884 0.019115924835205078 0.00036541858230521029 +1675 5 5.338103 0.33810281753540039 0.11431351522537625 +1676 7 6.510288 0.48971223831176758 0.23981807635232144 +1677 6 5.90175 0.098249912261962891 0.009653045259483406 +1678 6 5.911432 0.088568210601806641 0.0078443279292059742 +1679 5 5.21312141 0.21312141418457031 0.045420737184031168 +1680 5 5.163654 0.16365385055541992 0.026782582801615717 +1681 6 5.914402 0.085597991943359375 0.0073270162247354165 +1682 7 6.543379 0.45662117004394531 0.20850289293230162 +1683 7 6.543379 0.45662117004394531 0.20850289293230162 +1684 7 6.06433344 0.93566656112670898 0.87547191361068144 +1685 7 6.543379 0.45662117004394531 0.20850289293230162 +1686 5 5.931283 0.93128299713134766 0.86728802074594569 +1687 7 6.06433344 0.93566656112670898 0.87547191361068144 +1688 3 3.90431213 0.9043121337890625 0.81778043531812727 +1689 6 6.370762 0.37076187133789063 0.13746436523797456 +1690 4 4.496808 0.49680805206298828 0.24681824059462087 +1691 7 6.543379 0.45662117004394531 0.20850289293230162 +1692 6 6.363645 0.36364507675170898 0.13223774184575632 +1693 5 5.39188766 0.39188766479492188 0.15357594181841705 +1694 6 5.71193361 0.28806638717651367 0.08298224342092908 +1695 6 6.55674648 0.55674648284912109 0.30996664616486669 +1696 6 5.720357 0.27964305877685547 0.078200240322075842 +1697 6 6.25116253 0.25116252899169922 0.063082615969506151 +1698 6 6.363645 0.36364507675170898 0.13223774184575632 +1699 6 6.13921261 0.13921260833740234 0.019380150320102985 +1700 6 5.93687057 0.063129425048828125 0.0039853243069956079 +1701 5 5.58175659 0.581756591796875 0.33844073209911585 +1702 4 4.31816 0.31816005706787109 0.10122582191343099 +1703 5 5.335852 0.33585214614868164 0.11279666407267541 +1704 5 5.335852 0.33585214614868164 0.11279666407267541 +1705 6 6.527788 0.52778816223144531 0.27856034419164644 +1706 6 5.994899 0.0051012039184570313 2.602228141768137E-05 +1707 5 5.3597784 0.35977840423583984 0.12944050015448738 +1708 4 4.58082151 0.58082151412963867 0.33735363127584606 +1709 5 5.794777 0.79477691650390625 0.63167034700745717 +1710 5 5.04373169 0.043731689453125 0.0019124606624245644 +1711 5 6.12955952 1.1295595169067383 1.275904702234584 +1712 6 5.66090155 0.33909845352172852 0.11498776118082787 +1713 6 5.46919 0.53080987930297852 0.28175912796564262 +1714 5 5.35511971 0.35511970520019531 0.12611000502147363 +1715 8 7.17331171 0.82668828964233398 0.68341352823176749 +1716 6 6.184057 0.18405723571777344 0.033877066020068014 +1717 6 5.552837 0.44716310501098633 0.19995484248306639 +1718 4 5.24975443 1.2497544288635254 1.5618861324639965 +1719 6 5.822894 0.17710590362548828 0.031366501099000743 +1720 7 6.265804 0.73419618606567383 0.53904403963338154 +1721 7 6.404914 0.59508609771728516 0.35412746369638626 +1722 6 6.21475172 0.2147517204284668 0.046118301426986363 +1723 8 7.17331171 0.82668828964233398 0.68341352823176749 +1724 6 6.31798267 0.31798267364501953 0.101112980738435 +1725 6 5.670131 0.32986879348754883 0.10881342091693114 +1726 6 6.60087347 0.60087347030639648 0.36104892731805194 +1727 6 6.0132947 0.013294696807861328 0.00017674896321295819 +1728 5 5.35511971 0.35511970520019531 0.12611000502147363 +1729 6 6.34329748 0.34329748153686523 0.11785316082955433 +1730 6 5.882648 0.11735200881958008 0.0137714939739908 +1731 6 5.65552044 0.34447956085205078 0.11866616784482176 +1732 5 5.520096 0.5200958251953125 0.27049966738559306 +1733 6 5.768575 0.23142480850219727 0.053557441990278676 +1734 6 5.80637026 0.19362974166870117 0.037492476858687951 +1735 6 6.50981569 0.50981569290161133 0.25991204072875007 +1736 5 5.328799 0.32879877090454102 0.10810863174833685 +1737 6 5.80637026 0.19362974166870117 0.037492476858687951 +1738 5 5.449398 0.44939804077148438 0.20195859904924873 +1739 4 4.25049448 0.25049448013305664 0.062747484577130308 +1740 6 5.324389 0.67561101913452148 0.45645024917598676 +1741 6 6.68758 0.68758010864257813 0.47276640580093954 +1742 6 5.503512 0.49648809432983398 0.24650042781127013 +1743 6 5.656073 0.34392690658569336 0.11828571707360425 +1744 5 5.665838 0.66583776473999023 0.44333992895394658 +1745 5 5.11254168 0.11254167556762695 0.012665628739569001 +1746 5 5.823897 0.82389688491821289 0.67880607697793494 +1747 6 5.656073 0.34392690658569336 0.11828571707360425 +1748 5 5.62416 0.62415981292724609 0.38957547207337484 +1749 6 5.776405 0.22359514236450195 0.049994787689001896 +1750 6 6.177006 0.17700576782226563 0.031331041842349805 +1751 7 6.46401453 0.53598546981811523 0.28728042385614572 +1752 6 5.49817276 0.50182723999023438 0.25183057879621629 +1753 7 6.345841 0.6541590690612793 0.42792408763511958 +1754 6 6.470667 0.47066688537597656 0.22152731698952266 +1755 6 5.503512 0.49648809432983398 0.24650042781127013 +1756 5 5.198939 0.19893884658813477 0.039576664681817419 +1757 5 5.099308 0.099308013916015625 0.009862081627943553 +1758 5 5.145771 0.14577102661132813 0.021249192199320532 +1759 5 4.837293 0.16270685195922852 0.026473519674482304 +1760 6 5.61023664 0.38976335525512695 0.1519154730997343 +1761 6 5.76614141 0.23385858535766602 0.054689837945488762 +1762 7 6.44400644 0.55599355697631836 0.30912883539917857 +1763 6 5.63683 0.36317014694213867 0.13189255562997459 +1764 5 5.198939 0.19893884658813477 0.039576664681817419 +1765 5 5.099308 0.099308013916015625 0.009862081627943553 +1766 5 5.14904 0.14904022216796875 0.022212987823877484 +1767 5 5.0502 0.050199985504150391 0.0025200385446169093 +1768 5 5.199506 0.19950580596923828 0.039802566615435353 +1769 7 6.637015 0.36298513412475586 0.131758207595567 +1770 6 5.911365 0.088634967803955078 0.0078561575176081533 +1771 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1772 6 5.90241241 0.09758758544921875 0.0095233368338085711 +1773 6 5.911365 0.088634967803955078 0.0078561575176081533 +1774 6 6.102439 0.10243892669677734 0.010493733702787722 +1775 6 6.09364557 0.093645572662353516 0.0087694932792601321 +1776 5 5.3519 0.35190010070800781 0.12383368087830604 +1777 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1778 8 7.2947197 0.70528030395507813 0.49742030714696739 +1779 8 7.2947197 0.70528030395507813 0.49742030714696739 +1780 5 5.846626 0.84662580490112305 0.71677525352447446 +1781 4 4.88433266 0.88433265686035156 0.7820442479896883 +1782 6 6.15452433 0.15452432632446289 0.023877767426029095 +1783 6 5.11111975 0.88888025283813477 0.79010810388558639 +1784 7 6.66374445 0.33625555038452148 0.11306779516439747 +1785 6 6.15452433 0.15452432632446289 0.023877767426029095 +1786 7 6.39855957 0.6014404296875 0.36173059046268463 +1787 7 6.86035776 0.13964223861694336 0.019499954805951347 +1788 5 6.093183 1.0931830406188965 1.1950491602967759 +1789 7 6.359563 0.64043712615966797 0.41015971256365447 +1790 5 5.47426462 0.47426462173461914 0.22492693142908138 +1791 5 5.364561 0.36456108093261719 0.13290478173075826 +1792 6 5.68573856 0.31426143646240234 0.098760250447412545 +1793 5 5.028987 0.028986930847167969 0.00084024215993849793 +1794 5 5.18260241 0.1826024055480957 0.033343638511951212 +1795 6 5.328547 0.67145299911499023 0.45084913002051508 +1796 5 6.180702 1.1807022094726563 1.3940577074536122 +1797 8 6.97266769 1.0273323059082031 1.0554116667626658 +1798 6 5.629581 0.37041902542114258 0.13721025439394907 +1799 6 5.702408 0.2975921630859375 0.088561095530167222 +1800 6 5.259844 0.74015617370605469 0.5478311614751874 +1801 5 5.11915636 0.1191563606262207 0.014198238277685959 +1802 6 5.629581 0.37041902542114258 0.13721025439394907 +1803 6 5.702408 0.2975921630859375 0.088561095530167222 +1804 6 5.259844 0.74015617370605469 0.5478311614751874 +1805 5 5.27370834 0.27370834350585938 0.074916257304721512 +1806 5 4.864911 0.13508892059326172 0.01824901646705257 +1807 6 6.16377926 0.16377925872802734 0.026823645589502121 +1808 5 5.27370834 0.27370834350585938 0.074916257304721512 +1809 6 6.16377926 0.16377925872802734 0.026823645589502121 +1810 6 5.287707 0.71229314804077148 0.5073615287458324 +1811 5 4.864911 0.13508892059326172 0.01824901646705257 +1812 6 6.20445538 0.20445537567138672 0.041802000640927872 +1813 6 5.9327035 0.067296504974365234 0.0045288195817647647 +1814 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1815 6 5.82937336 0.17062664031982422 0.029113450386830664 +1816 7 6.872754 0.12724590301513672 0.01619151983413758 +1817 4 4.45179462 0.45179462432861328 0.2041183825722328 +1818 6 6.37151432 0.37151432037353516 0.13802289024260972 +1819 6 6.391697 0.39169692993164063 0.15342648491787259 +1820 6 5.82937336 0.17062664031982422 0.029113450386830664 +1821 5 5.9026103 0.90261030197143555 0.81470535722496606 +1822 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1823 6 5.900709 0.099290847778320313 0.0098586724525375757 +1824 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1825 5 5.258325 0.25832509994506836 0.066731857261629557 +1826 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1827 6 5.900709 0.099290847778320313 0.0098586724525375757 +1828 6 5.753486 0.24651384353637695 0.060769075055077337 +1829 7 6.53176165 0.46823835372924805 0.21924715590307642 +1830 7 6.53176165 0.46823835372924805 0.21924715590307642 +1831 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1832 7 6.53176165 0.46823835372924805 0.21924715590307642 +1833 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1834 6 5.84620237 0.15379762649536133 0.023653709915606669 +1835 5 4.988597 0.011403083801269531 0.00013003032017877558 +1836 6 5.77450943 0.22549057006835938 0.050845997189753689 +1837 7 6.83298 0.16701984405517578 0.027895628308215237 +1838 6 5.66736031 0.33263969421386719 0.11064916616669507 +1839 6 5.77450943 0.22549057006835938 0.050845997189753689 +1840 5 6.134337 1.1343369483947754 1.2867203124935713 +1841 7 6.83298 0.16701984405517578 0.027895628308215237 +1842 6 5.98937035 0.010629653930664063 0.00011298954268568195 +1843 6 6.24796629 0.24796628952026367 0.061487280738447225 +1844 6 6.495384 0.49538421630859375 0.2454055217676796 +1845 5 5.18946362 0.18946361541748047 0.035896461567062943 +1846 5 5.40275526 0.4027552604675293 0.16221179983426737 +1847 5 5.18946362 0.18946361541748047 0.035896461567062943 +1848 5 5.044584 0.044583797454833984 0.0019877149954936613 +1849 6 5.91228 0.087719917297363281 0.0076947838906562538 +1850 7 5.84083033 1.1591696739196777 1.343674332935052 +1851 6 6.495384 0.49538421630859375 0.2454055217676796 +1852 7 6.6136837 0.38631629943847656 0.14924028321183869 +1853 5 5.151337 0.1513371467590332 0.022902931989165154 +1854 7 6.0943203 0.90567970275878906 0.82025572398924851 +1855 6 6.14251947 0.14251947402954102 0.020311800477657016 +1856 4 4.103467 0.10346698760986328 0.010705417525059602 +1857 5 4.735547 0.26445293426513672 0.069935354441440722 +1858 5 5.031725 0.031724929809570313 0.001006471171422163 +1859 6 6.14251947 0.14251947402954102 0.020311800477657016 +1860 6 6.02827644 0.028276443481445313 0.0007995572559593711 +1861 6 6.257553 0.2575531005859375 0.066333599621430039 +1862 7 6.827227 0.17277288436889648 0.029850469573148075 +1863 5 5.36154 0.36153984069824219 0.13071105641211034 +1864 6 6.25475264 0.25475263595581055 0.064898905526433737 +1865 6 5.23789167 0.76210832595825195 0.58080910049488921 +1866 6 5.73634434 0.26365566253662109 0.069514308387624624 +1867 6 6.45096254 0.45096254348754883 0.20336721562875937 +1868 7 6.6029706 0.39702939987182617 0.15763234436258244 +1869 7 5.99931145 1.0006885528564453 1.0013775798179267 +1870 6 6.02254629 0.022546291351318359 0.00050833525369853305 +1871 6 5.893417 0.1065831184387207 0.011359961136122365 +1872 5 5.104985 0.10498523712158203 0.011021900013474806 +1873 5 5.104985 0.10498523712158203 0.011021900013474806 +1874 5 5.75805473 0.75805473327636719 0.5746469786427042 +1875 5 5.14179373 0.14179372787475586 0.020105461264620317 +1876 6 5.905395 0.094604969024658203 0.0089501001641565381 +1877 6 5.79698658 0.20301342010498047 0.041214448742721288 +1878 6 5.723346 0.27665376663208008 0.076537306591717424 +1879 6 5.858292 0.1417078971862793 0.020081128124957104 +1880 5 5.428381 0.42838096618652344 0.18351025219089934 +1881 6 5.858292 0.1417078971862793 0.020081128124957104 +1882 5 5.428381 0.42838096618652344 0.18351025219089934 +1883 5 5.428381 0.42838096618652344 0.18351025219089934 +1884 5 6.015564 1.01556396484375 1.0313701666891575 +1885 6 5.858292 0.1417078971862793 0.020081128124957104 +1886 5 4.56712961 0.43287038803100586 0.18737677283411358 +1887 5 5.531196 0.53119611740112305 0.2821693151420277 +1888 5 5.54939 0.54938983917236328 0.30182919538583519 +1889 5 5.69010973 0.6901097297668457 0.4762514391188688 +1890 5 5.428381 0.42838096618652344 0.18351025219089934 +1891 5 5.475229 0.47522878646850586 0.22584239948832874 +1892 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1893 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1894 5 5.24567556 0.24567556381225586 0.060356482654469801 +1895 6 5.76433468 0.23566532135009766 0.055538143687044794 +1896 6 5.19419336 0.80580663681030273 0.64932433592753114 +1897 6 5.19419336 0.80580663681030273 0.64932433592753114 +1898 6 5.39263535 0.60736465454101563 0.36889182358572725 +1899 7 6.988717 0.011282920837402344 0.00012730430262308801 +1900 6 5.82769728 0.1723027229309082 0.02968822832940532 +1901 5 5.609328 0.60932779312133789 0.37128035947011995 +1902 6 5.70890331 0.29109668731689453 0.084737281366869865 +1903 5 5.44353 0.44353008270263672 0.19671893426220777 +1904 6 5.76433468 0.23566532135009766 0.055538143687044794 +1905 6 5.19419336 0.80580663681030273 0.64932433592753114 +1906 5 5.531166 0.53116607666015625 0.28213740099454299 +1907 7 6.67684364 0.32315635681152344 0.10443003094769665 +1908 7 6.82135153 0.17864847183227539 0.031915276488007294 +1909 5 5.497734 0.49773406982421875 0.24773920426378027 +1910 5 5.55095959 0.55095958709716797 0.30355646661428182 +1911 6 5.8620677 0.13793230056762695 0.019025319539878183 +1912 6 5.89195061 0.10804939270019531 0.01167467126288102 +1913 6 5.496035 0.50396490097045898 0.25398062141016453 +1914 6 6.51767254 0.51767253875732422 0.26798485738345335 +1915 7 6.82135153 0.17864847183227539 0.031915276488007294 +1916 5 5.55095959 0.55095958709716797 0.30355646661428182 +1917 6 5.8620677 0.13793230056762695 0.019025319539878183 +1918 6 5.76833 0.23166990280151367 0.053670943864062792 +1919 6 5.7990675 0.20093250274658203 0.040373870660005196 +1920 7 5.64435625 1.3556437492370605 1.8377699748455143 +1921 5 5.497734 0.49773406982421875 0.24773920426378027 +1922 5 5.60842752 0.60842752456665039 0.37018405265030196 +1923 5 4.886931 0.11306905746459961 0.012784611755932929 +1924 4 4.732981 0.73298120498657227 0.53726144686356747 +1925 6 5.821547 0.17845296859741211 0.031845462001228952 +1926 6 5.763718 0.2362818717956543 0.055829122939258014 +1927 5 5.778531 0.77853107452392578 0.60611063399937848 +1928 6 5.96423244 0.035767555236816406 0.0012793180076187127 +1929 5 5.5253 0.52530002593994141 0.27594011725250311 +1930 6 5.64313173 0.35686826705932617 0.12735496003392655 +1931 3 3.42147088 0.42147088050842285 0.17763770311654525 +1932 6 5.02350473 0.97649526596069336 0.95354300444364526 +1933 5 5.01699162 0.016991615295410156 0.00028871499034721637 +1934 6 5.91134 0.088659763336181641 0.0078605536348277383 +1935 5 5.5253 0.52530002593994141 0.27594011725250311 +1936 6 5.64313173 0.35686826705932617 0.12735496003392655 +1937 7 6.497361 0.50263881683349609 0.25264578018777684 +1938 5 5.77335072 0.77335071563720703 0.59807132937658025 +1939 5 5.323697 0.32369709014892578 0.10477980617088178 +1940 5 4.944163 0.055837154388427734 0.0031177878101971146 +1941 5 5.323697 0.32369709014892578 0.10477980617088178 +1942 5 4.944163 0.055837154388427734 0.0031177878101971146 +1943 5 5.497555 0.49755477905273438 0.24756075815821532 +1944 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1945 6 5.75811338 0.24188661575317383 0.058509134880523561 +1946 6 5.32988358 0.67011642456054688 0.44905602246581111 +1947 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1948 7 6.17266 0.82734012603759766 0.68449168415190798 +1949 5 5.2683053 0.26830530166625977 0.071987734902222655 +1950 5 5.237333 0.23733282089233398 0.056326867872712683 +1951 4 4.32389355 0.32389354705810547 0.10490702982588118 +1952 7 6.74338341 0.25661659240722656 0.065852075498696649 +1953 6 6.021135 0.021134853363037109 0.00044668202667708101 +1954 5 5.237333 0.23733282089233398 0.056326867872712683 +1955 5 5.424599 0.42459917068481445 0.1802844557462322 +1956 5 5.31968 0.31968021392822266 0.1021954391771942 +1957 6 5.79171038 0.20828962326049805 0.043384567158000209 +1958 6 5.584745 0.41525506973266602 0.17243677293868132 +1959 5 5.1785655 0.17856550216674805 0.031885638564062901 +1960 5 5.1785655 0.17856550216674805 0.031885638564062901 +1961 5 4.79571152 0.20428848266601563 0.041733784149982966 +1962 5 5.284309 0.28430891036987305 0.080831556515704506 +1963 6 5.584745 0.41525506973266602 0.17243677293868132 +1964 5 5.307627 0.30762720108032227 0.094634494844513029 +1965 6 5.294085 0.70591497421264648 0.49831595081764135 +1966 6 5.606551 0.39344882965087891 0.15480198155364633 +1967 7 5.817037 1.1829628944396973 1.3994012096211463 +1968 6 6.12541676 0.12541675567626953 0.015729362604361086 +1969 7 6.792339 0.20766115188598633 0.043123154002614683 +1970 6 5.87826252 0.12173748016357422 0.014820014076576626 +1971 7 6.792339 0.20766115188598633 0.043123154002614683 +1972 5 5.54269075 0.54269075393676758 0.29451325440845721 +1973 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1974 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1975 6 5.394777 0.60522317886352539 0.36629509623367085 +1976 5 5.1809783 0.18097829818725586 0.032753144414755297 +1977 6 5.852116 0.14788389205932617 0.021869645530614434 +1978 6 5.504246 0.49575376510620117 0.24577179561697449 +1979 6 5.38840532 0.61159467697143555 0.37404804889979459 +1980 8 7.70184755 0.29815244674682617 0.088894881501119016 +1981 8 7.70184755 0.29815244674682617 0.088894881501119016 +1982 8 7.70184755 0.29815244674682617 0.088894881501119016 +1983 8 7.70184755 0.29815244674682617 0.088894881501119016 +1984 8 7.70184755 0.29815244674682617 0.088894881501119016 +1985 6 5.962447 0.037552833557128906 0.0014102153081694269 +1986 6 5.814902 0.18509817123413086 0.034261332994219629 +1987 5 5.80614376 0.80614376068115234 0.64986776288515102 +1988 6 5.95589161 0.044108390808105469 0.001945550139680563 +1989 7 6.713367 0.28663301467895508 0.082158485103946077 +1990 4 4.43185854 0.43185853958129883 0.18650179820929225 +1991 8 7.70184755 0.29815244674682617 0.088894881501119016 +1992 5 5.683112 0.68311214447021484 0.46664220192269568 +1993 6 5.74645329 0.25354671478271484 0.06428593657710735 +1994 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1995 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1996 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1997 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1998 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1999 6 6.65917635 0.65917634963989258 0.43451345992457391 +2000 5 5.15526772 0.15526771545410156 0.024108063462335849 +2001 5 5.116252 0.11625194549560547 0.013514514831513225 +2002 6 6.24034739 0.24034738540649414 0.057766865671737833 +2003 6 5.74645329 0.25354671478271484 0.06428593657710735 +2004 6 5.97547865 0.024521350860595703 0.00060129664802843763 +2005 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +2006 6 6.05903625 0.0590362548828125 0.0034852793905884027 +2007 6 6.035142 0.035141944885253906 0.0012349562903182232 +2008 5 5.388008 0.38800811767578125 0.15055029938230291 +2009 7 6.72901726 0.27098274230957031 0.073431646629614988 +2010 6 6.07737875 0.077378749847412109 0.0059874709279483795 +2011 5 5.388008 0.38800811767578125 0.15055029938230291 +2012 5 5.91862154 0.91862154006958008 0.84386553387980712 +2013 6 5.776343 0.22365713119506836 0.05002251233440802 +2014 5 5.092607 0.092607021331787109 0.0085760603999460727 +2015 6 6.126408 0.12640810012817383 0.01597900777801442 +2016 7 6.912972 0.087028026580810547 0.0075738774105502671 +2017 5 5.092607 0.092607021331787109 0.0085760603999460727 +2018 7 6.232492 0.76750802993774414 0.58906857601891716 +2019 6 5.776343 0.22365713119506836 0.05002251233440802 +2020 6 6.10125542 0.10125541687011719 0.010252659445541212 +2021 6 5.754315 0.24568510055541992 0.060361168634926798 +2022 6 5.4808135 0.51918649673461914 0.26955461839156669 +2023 6 5.754315 0.24568510055541992 0.060361168634926798 +2024 5 4.96590948 0.034090518951416016 0.0011621634823768545 +2025 5 5.17452765 0.17452764511108398 0.030459898908020477 +2026 5 5.023958 0.023958206176757813 0.0005739956432080362 +2027 5 5.157997 0.15799713134765625 0.024963093514088541 +2028 6 5.89450932 0.10549068450927734 0.011128284518235887 +2029 6 5.4808135 0.51918649673461914 0.26955461839156669 +2030 6 5.95882463 0.041175365447998047 0.0016954107197761914 +2031 5 5.872901 0.87290096282958984 0.76195609090882499 +2032 6 5.861079 0.13892078399658203 0.019298984226225002 +2033 5 5.812295 0.81229496002197266 0.65982310207709816 +2034 5 5.461388 0.46138811111450195 0.212878989077808 +2035 5 5.35088253 0.35088253021240234 0.12311855000825744 +2036 6 5.8191 0.18090009689331055 0.032724845056009144 +2037 5 5.872901 0.87290096282958984 0.76195609090882499 +2038 5 5.41155052 0.41155052185058594 0.16937383203548961 +2039 5 4.945262 0.054738044738769531 0.0029962535418235348 +2040 6 5.609648 0.39035177230834961 0.15237450614426962 +2041 5 5.41155052 0.41155052185058594 0.16937383203548961 +2042 6 5.48308659 0.51691341400146484 0.26719947757464979 +2043 6 6.14729 0.14729022979736328 0.021694411793760082 +2044 6 5.79861736 0.20138263702392578 0.040554966494710243 +2045 5 4.945262 0.054738044738769531 0.0029962535418235348 +2046 5 5.277068 0.27706813812255859 0.076766753162701207 +2047 5 5.24007225 0.24007225036621094 0.057634685395896668 +2048 5 5.30321026 0.30321025848388672 0.091936460849865398 +2049 7 5.9215703 1.0784296989440918 1.1630106155646445 +2050 3 4.432997 1.4329972267150879 2.053481051773133 +2051 5 5.28876 0.28876018524169922 0.083382444580820447 +2052 5 5.28876 0.28876018524169922 0.083382444580820447 +2053 5 5.65129566 0.65129566192626953 0.42418603924397758 +2054 5 5.65129566 0.65129566192626953 0.42418603924397758 +2055 6 5.98419333 0.015806674957275391 0.00024985097320495697 +2056 5 5.28876 0.28876018524169922 0.083382444580820447 +2057 7 6.820425 0.17957496643066406 0.032247168568574125 +2058 5 5.500557 0.50055694580078125 0.25055725598940626 +2059 5 5.399121 0.39912080764770508 0.1592974190973564 +2060 5 5.51282835 0.51282835006713867 0.26299291663258373 +2061 6 5.91880846 0.081191539764404297 0.0065920661293148441 +2062 5 6.137123 1.1371231079101563 1.2930489625432529 +2063 5 5.53835773 0.53835773468017578 0.28982905048997054 +2064 6 5.8279 0.17210006713867188 0.029618433109135367 +2065 5 5.457421 0.45742082595825195 0.20923381202032942 +2066 5 5.50936365 0.50936365127563477 0.25945132924084646 +2067 5 5.50936365 0.50936365127563477 0.25945132924084646 +2068 6 6.24757767 0.24757766723632813 0.061294701314182021 +2069 7 6.39426327 0.60573673248291016 0.36691698907907266 +2070 6 5.37203646 0.62796354293823242 0.39433821125953727 +2071 6 6.07056141 0.070561408996582031 0.0049789124395829276 +2072 5 5.673299 0.67329883575439453 0.45333132222822314 +2073 5 5.340492 0.34049177169799805 0.11593464659404162 +2074 6 5.8279 0.17210006713867188 0.029618433109135367 +2075 5 5.53835773 0.53835773468017578 0.28982905048997054 +2076 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2077 6 5.62602234 0.3739776611328125 0.13985929102636874 +2078 6 6.08607531 0.086075305938720703 0.0074089582924443675 +2079 4 5.137181 1.1371808052062988 1.2931801837296462 +2080 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2081 5 5.31921959 0.31921958923339844 0.10190114615033963 +2082 6 5.793145 0.20685482025146484 0.04278891666126583 +2083 5 5.237396 0.2373957633972168 0.056356748478947338 +2084 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2085 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2086 5 5.515484 0.51548385620117188 0.26572360600403044 +2087 6 5.955682 0.044318199157714844 0.0019641027765828767 +2088 6 5.975536 0.024464130401611328 0.00059849367630704364 +2089 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2090 5 5.20975637 0.20975637435913086 0.04399773658428785 +2091 5 5.30951 0.30951023101806641 0.095796583104856836 +2092 5 5.085698 0.085698127746582031 0.007344169099269493 +2093 5 5.254017 0.25401687622070313 0.064524573404924013 +2094 5 5.254017 0.25401687622070313 0.064524573404924013 +2095 5 5.39610338 0.3961033821105957 0.15689788931945259 +2096 5 4.758813 0.24118709564208984 0.058171215104266594 +2097 5 5.65508652 0.65508651733398438 0.42913834519276861 +2098 6 6.13854647 0.13854646682739258 0.019195123470353792 +2099 5 5.38220358 0.38220357894897461 0.14607957576140507 +2100 5 5.65508652 0.65508651733398438 0.42913834519276861 +2101 6 6.26671 0.26670980453491211 0.071134119835051024 +2102 5 5.41741562 0.41741561889648438 0.17423579889873508 +2103 5 5.247345 0.247344970703125 0.061179534532129765 +2104 5 5.38220358 0.38220357894897461 0.14607957576140507 +2105 5 4.758813 0.24118709564208984 0.058171215104266594 +2106 5 5.057006 0.057005882263183594 0.0032496706126039498 +2107 6 5.77749348 0.22250652313232422 0.049509152836435533 +2108 6 6.13854647 0.13854646682739258 0.019195123470353792 +2109 6 5.957272 0.042727947235107422 0.001825677474926124 +2110 5 5.11222172 0.11222171783447266 0.012593713953719998 +2111 5 5.11222172 0.11222171783447266 0.012593713953719998 +2112 5 5.11222172 0.11222171783447266 0.012593713953719998 +2113 5 5.136051 0.13605117797851563 0.018509923029341735 +2114 6 5.957272 0.042727947235107422 0.001825677474926124 +2115 5 5.11222172 0.11222171783447266 0.012593713953719998 +2116 4 5.84926033 1.8492603302001953 3.4197637688521354 +2117 5 5.63614273 0.63614273071289063 0.40467757383885328 +2118 6 6.353011 0.35301113128662109 0.12461685881226003 +2119 4 5.739438 1.7394380569458008 3.0256447539513829 +2120 5 5.592541 0.59254121780395508 0.35110509479659413 +2121 7 6.842314 0.15768623352050781 0.024864948241884122 +2122 5 5.53295135 0.53295135498046875 0.28403714677551761 +2123 5 5.592541 0.59254121780395508 0.35110509479659413 +2124 7 6.842314 0.15768623352050781 0.024864948241884122 +2125 5 5.52707672 0.52707672119140625 0.2778098700218834 +2126 5 5.25731373 0.25731372833251953 0.066210354788381665 +2127 5 4.86935139 0.13064861297607422 0.017069060072572029 +2128 6 5.41065741 0.58934259414672852 0.34732469327559556 +2129 5 6.337489 1.337489128112793 1.7888771678199191 +2130 5 5.82943773 0.8294377326965332 0.68796695242076567 +2131 6 5.59359074 0.40640926361083984 0.16516848954870511 +2132 6 5.59359074 0.40640926361083984 0.16516848954870511 +2133 6 5.91878843 0.081211566925048828 0.0065953186024216848 +2134 6 6.26523066 0.26523065567016602 0.070347300707226168 +2135 5 5.80142641 0.80142641067504883 0.64228429172749202 +2136 6 6.29388428 0.29388427734375 0.08636796846985817 +2137 5 5.80142641 0.80142641067504883 0.64228429172749202 +2138 5 5.58149242 0.58149242401123047 0.33813343918245664 +2139 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2140 5 5.238538 0.23853778839111328 0.056900276490523538 +2141 5 5.238538 0.23853778839111328 0.056900276490523538 +2142 5 5.346484 0.34648418426513672 0.12005128994587722 +2143 7 6.779074 0.22092580795288086 0.048808212619633196 +2144 6 5.85388136 0.1461186408996582 0.021350657218363267 +2145 6 5.790298 0.2097020149230957 0.043974935062806253 +2146 6 5.929391 0.070609092712402344 0.0049856439736686298 +2147 5 5.50856447 0.50856447219848633 0.25863782238252497 +2148 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2149 6 6.505095 0.50509500503540039 0.25512096411171115 +2150 6 6.639851 0.63985109329223633 0.40940942158727012 +2151 5 5.238538 0.23853778839111328 0.056900276490523538 +2152 6 5.64773 0.35227012634277344 0.12409424191355356 +2153 6 5.92296648 0.077033519744873047 0.0059341631642837456 +2154 4 4.198002 0.19800186157226563 0.039204737186082639 +2155 5 5.715006 0.71500587463378906 0.51123340076082968 +2156 4 5.04174948 1.0417494773864746 1.085241973634993 +2157 6 6.246933 0.2469329833984375 0.06097589829005301 +2158 6 6.27462959 0.27462959289550781 0.075421413293952355 +2159 4 5.01505 1.015049934387207 1.0303263692994733 +2160 6 6.67232943 0.67232942581176758 0.45202685681238108 +2161 7 6.62193441 0.37806558609008789 0.14293358738564166 +2162 6 5.09313726 0.90686273574829102 0.8224000214888747 +2163 6 6.246933 0.2469329833984375 0.06097589829005301 +2164 5 5.51115274 0.51115274429321289 0.26127712799848268 +2165 5 5.17895126 0.17895126342773438 0.032023554682382382 +2166 5 5.17895126 0.17895126342773438 0.032023554682382382 +2167 7 6.7765646 0.22343540191650391 0.049923378829589637 +2168 7 6.7765646 0.22343540191650391 0.049923378829589637 +2169 7 6.7765646 0.22343540191650391 0.049923378829589637 +2170 7 6.7765646 0.22343540191650391 0.049923378829589637 +2171 7 6.7765646 0.22343540191650391 0.049923378829589637 +2172 5 4.84022141 0.15977859497070313 0.025529199410811998 +2173 5 5.25834274 0.25834274291992188 0.066740972819388844 +2174 7 6.7765646 0.22343540191650391 0.049923378829589637 +2175 7 6.770401 0.2295989990234375 0.052715700352564454 +2176 5 4.84022141 0.15977859497070313 0.025529199410811998 +2177 7 5.39672947 1.6032705307006836 2.5704763946132516 +2178 5 5.25834274 0.25834274291992188 0.066740972819388844 +2179 6 5.89384937 0.10615062713623047 0.011267955641415028 +2180 6 5.356053 0.64394712448120117 0.4146678991276076 +2181 6 6.08375168 0.083751678466796875 0.0070143436460057274 +2182 5 5.390071 0.39007091522216797 0.15215531890225975 +2183 5 5.441367 0.44136714935302734 0.19480496052801755 +2184 6 5.66160774 0.33839225769042969 0.11450932006482617 +2185 7 6.191624 0.80837583541870117 0.65347149128888304 +2186 5 5.19513273 0.19513273239135742 0.03807678325051711 +2187 5 5.130219 0.1302189826965332 0.016956983454520014 +2188 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2189 6 6.26448154 0.26448154449462891 0.06995048737826437 +2190 6 6.82654762 0.82654762268066406 0.68318097255905741 +2191 5 5.425485 0.42548513412475586 0.18103759936116148 +2192 6 5.45986128 0.54013872146606445 0.29174983842699476 +2193 6 6.26448154 0.26448154449462891 0.06995048737826437 +2194 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2195 5 5.130219 0.1302189826965332 0.016956983454520014 +2196 6 5.875051 0.12494897842407227 0.015612247209219277 +2197 6 6.14725447 0.14725446701049805 0.021683878054545858 +2198 5 5.17893553 0.17893552780151367 0.032017923109606272 +2199 6 5.539782 0.46021795272827148 0.21180056401340153 +2200 5 5.37913132 0.37913131713867188 0.14374055563530419 +2201 6 5.54702854 0.45297145843505859 0.20518314215678402 +2202 5 5.17893553 0.17893552780151367 0.032017923109606272 +2203 5 5.33585262 0.33585262298583984 0.11279698436646868 +2204 5 4.981754 0.018246173858642578 0.00033292286047981179 +2205 5 5.47519064 0.47519063949584961 0.22580614386447451 +2206 6 5.697418 0.302581787109375 0.091555737890303135 +2207 7 6.363133 0.63686704635620117 0.40559963473447169 +2208 5 5.92743444 0.92743444442749023 0.86013464871052747 +2209 6 6.38974 0.389739990234375 0.15189725998789072 +2210 7 5.881483 1.1185169219970703 1.2510801047938003 +2211 6 6.051986 0.051986217498779297 0.0027025668098303868 +2212 6 6.38974 0.389739990234375 0.15189725998789072 +2213 6 6.225851 0.22585105895996094 0.051008700833335752 +2214 5 5.92743444 0.92743444442749023 0.86013464871052747 +2215 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2216 5 5.22257233 0.22257232666015625 0.049538440594915301 +2217 6 5.75656176 0.2434382438659668 0.059262178576545921 +2218 6 6.004971 0.0049710273742675781 2.4711113155717612E-05 +2219 7 6.9423914 0.057608604431152344 0.0033187513045049855 +2220 6 5.98822832 0.011771678924560547 0.00013857242470294295 +2221 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2222 7 6.238345 0.76165485382080078 0.58011811634878541 +2223 6 5.76465273 0.23534727096557617 0.055388337950944333 +2224 7 6.238345 0.76165485382080078 0.58011811634878541 +2225 4 5.334978 1.3349781036376953 1.7821665371920972 +2226 5 5.42304373 0.42304372787475586 0.17896599569417049 +2227 5 5.3450017 0.3450016975402832 0.11902617130567705 +2228 7 6.38641167 0.61358833312988281 0.37649064255310805 +2229 6 6.327121 0.32712078094482422 0.10700800532595167 +2230 7 6.38641167 0.61358833312988281 0.37649064255310805 +2231 6 6.327121 0.32712078094482422 0.10700800532595167 +2232 6 5.600168 0.39983177185058594 0.15986544578117901 +2233 5 5.111535 0.11153507232666016 0.012440072358913312 +2234 5 5.26435328 0.26435327529907227 0.069882654161347091 +2235 6 5.37941647 0.62058353424072266 0.38512392297070619 +2236 5 5.251844 0.25184392929077148 0.063425364720615107 +2237 4 5.0567894 1.0567893981933594 1.1168038321338827 +2238 6 6.033932 0.033932209014892578 0.0011513948086303571 +2239 6 5.37941647 0.62058353424072266 0.38512392297070619 +2240 5 5.248432 0.24843215942382813 0.061718537835986353 +2241 5 5.251844 0.25184392929077148 0.063425364720615107 +2242 5 5.399409 0.39940881729125977 0.15952740333000293 +2243 5 5.80063057 0.80063056945800781 0.64100930875065387 +2244 5 5.151465 0.15146493911743164 0.022941627781847274 +2245 7 5.89144135 1.1085586547851563 1.2289022910990752 +2246 4 5.0567894 1.0567893981933594 1.1168038321338827 +2247 6 6.033932 0.033932209014892578 0.0011513948086303571 +2248 6 5.807818 0.19218206405639648 0.036933945744976882 +2249 5 5.127346 0.12734603881835938 0.016217013602727093 +2250 6 5.35683775 0.64316225051879883 0.41365768049240614 +2251 7 6.476783 0.52321720123291016 0.2737562396659996 +2252 5 5.24472237 0.24472236633300781 0.059889036583626876 +2253 5 5.127346 0.12734603881835938 0.016217013602727093 +2254 6 5.68012667 0.31987333297729492 0.10231894915000339 +2255 6 5.649487 0.35051298141479492 0.12285935014028837 +2256 5 5.77087641 0.77087640762329102 0.59425043583019033 +2257 6 5.534438 0.46556186676025391 0.21674785178129241 +2258 5 5.237371 0.23737096786499023 0.056344976385162227 +2259 6 5.534438 0.46556186676025391 0.21674785178129241 +2260 5 5.237371 0.23737096786499023 0.056344976385162227 +2261 6 5.32792854 0.67207145690917969 0.45168004319202737 +2262 6 5.51419926 0.48580074310302734 0.23600236199945357 +2263 5 5.17338371 0.17338371276855469 0.030061911853408674 +2264 6 6.11459446 0.11459445953369141 0.013131890155818837 +2265 5 5.17338371 0.17338371276855469 0.030061911853408674 +2266 5 5.259477 0.25947713851928711 0.06732838541415731 +2267 6 6.11459446 0.11459445953369141 0.013131890155818837 +2268 6 5.62352276 0.37647724151611328 0.14173511337958189 +2269 6 5.99339151 0.0066084861755371094 4.367208953226509E-05 +2270 7 6.46453953 0.53546047210693359 0.28671791718898021 +2271 6 5.59352732 0.40647268295288086 0.1652200419869132 +2272 6 6.096581 0.096580982208251953 0.0093278861243106803 +2273 5 4.882008 0.11799192428588867 0.013922094196686885 +2274 7 6.46453953 0.53546047210693359 0.28671791718898021 +2275 4 5.08899927 1.0889992713928223 1.1859194130940978 +2276 6 5.319647 0.68035316467285156 0.46288042868036428 +2277 6 6.20249128 0.20249128341674805 0.041002719859761783 +2278 6 5.319647 0.68035316467285156 0.46288042868036428 +2279 5 5.251488 0.25148820877075195 0.06324631915072132 +2280 6 6.21316671 0.21316671371459961 0.045440047835882069 +2281 6 6.06043863 0.060438632965087891 0.0036528283546886087 +2282 5 5.13450336 0.13450336456298828 0.018091155078764132 +2283 5 5.13450336 0.13450336456298828 0.018091155078764132 +2284 5 5.13450336 0.13450336456298828 0.018091155078764132 +2285 5 5.13450336 0.13450336456298828 0.018091155078764132 +2286 5 5.239092 0.23909187316894531 0.057164923815435031 +2287 5 5.03401 0.034009933471679688 0.0011566755747480784 +2288 5 5.13450336 0.13450336456298828 0.018091155078764132 +2289 7 7.010147 0.0101470947265625 0.0001029635313898325 +2290 7 6.22187948 0.77812051773071289 0.60547154011351267 +2291 6 6.003072 0.0030717849731445313 9.4358629212365486E-06 +2292 6 5.163496 0.83650398254394531 0.69973891281188116 +2293 7 7.010147 0.0101470947265625 0.0001029635313898325 +2294 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2295 6 5.405581 0.59441900253295898 0.3533339505722779 +2296 7 6.178634 0.8213658332824707 0.67464183208380746 +2297 6 5.51448441 0.48551559448242188 0.23572539248561952 +2298 8 7.070608 0.92939186096191406 0.8637692312222498 +2299 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2300 7 6.941374 0.058626174926757813 0.0034370283865428064 +2301 5 5.82642746 0.82642745971679688 0.68298234617395792 +2302 5 5.069897 0.069897174835205078 0.004885615049943226 +2303 5 5.160475 0.16047477722167969 0.025752154124347726 +2304 6 5.08372641 0.91627359390258789 0.83955729888316455 +2305 7 6.6948843 0.30511569976806641 0.093095590244956838 +2306 5 5.255328 0.25532817840576172 0.065192478688004485 +2307 5 5.56966 0.56966018676757813 0.32451272838807199 +2308 5 4.917936 0.082064151763916016 0.0067345250047310401 +2309 6 5.15906954 0.84093046188354492 0.7071640417236722 +2310 5 5.56966 0.56966018676757813 0.32451272838807199 +2311 7 6.76234055 0.23765945434570313 0.056482016239897348 +2312 5 4.917936 0.082064151763916016 0.0067345250047310401 +2313 7 6.685575 0.31442499160766602 0.098863075347480844 +2314 6 6.73747158 0.73747158050537109 0.54386433205309004 +2315 6 6.32627153 0.32627153396606445 0.10645311387656875 +2316 7 6.55684757 0.44315242767333984 0.1963840741527747 +2317 5 5.376687 0.37668704986572266 0.14189313353654143 +2318 4 5.363103 1.363102912902832 1.8580495511641857 +2319 7 7.1930356 0.19303560256958008 0.037262743859400871 +2320 6 6.450675 0.45067501068115234 0.20310796525245678 +2321 5 4.742714 0.25728607177734375 0.06619612273061648 +2322 6 5.43903542 0.56096458435058594 0.31468126489562565 +2323 6 6.52697325 0.52697324752807617 0.27770080361028704 +2324 5 5.214914 0.21491384506225586 0.046187960799443317 +2325 6 4.96547174 1.0345282554626465 1.0702487113505867 +2326 5 5.26503468 0.26503467559814453 0.070243379269413708 +2327 6 4.96547174 1.0345282554626465 1.0702487113505867 +2328 5 5.26503468 0.26503467559814453 0.070243379269413708 +2329 5 5.334872 0.33487176895141602 0.11213910164065055 +2330 6 5.69431925 0.30568075180053711 0.093440722021341571 +2331 5 5.632817 0.63281679153442383 0.40045709164792243 +2332 6 5.70019341 0.29980659484863281 0.089883994314732263 +2333 8 7.38234949 0.61765050888061523 0.38149215112048296 +2334 5 4.905586 0.094414234161376953 0.0089140476122793189 +2335 5 5.82466841 0.82466840744018555 0.68007798222993188 +2336 5 4.577453 0.4225468635559082 0.1785458519009353 +2337 4 5.1711154 1.1711153984069824 1.3715112763859452 +2338 5 5.36899 0.36898994445800781 0.13615357911112369 +2339 6 5.740299 0.25970077514648438 0.067444492611684836 +2340 6 5.75540924 0.24459075927734375 0.059824639523867518 +2341 5 5.36899 0.36898994445800781 0.13615357911112369 +2342 8 6.87260151 1.1273984909057617 1.2710273572965889 +2343 5 6.3333354 1.3333353996276855 1.7777832879003199 +2344 6 5.740299 0.25970077514648438 0.067444492611684836 +2345 6 5.8191905 0.18080949783325195 0.032692074506712743 +2346 4 5.19108963 1.1910896301269531 1.418694506995962 +2347 6 6.069222 0.069221973419189453 0.0047916816040469712 +2348 6 5.79119158 0.20880842208862305 0.043600957135140561 +2349 5 5.02437 0.024370193481445313 0.0005939063303230796 +2350 5 5.51743269 0.51743268966674805 0.26773658833576519 +2351 6 5.81947565 0.18052434921264648 0.032589040658649537 +2352 6 5.35855627 0.64144372940063477 0.41145005798739476 +2353 7 6.329165 0.67083501815795898 0.45001962158698916 +2354 6 6.09388351 0.093883514404296875 0.0088141142769018188 +2355 7 6.501256 0.49874401092529297 0.24874558843384875 +2356 6 5.91373 0.086269855499267578 0.0074424879678645084 +2357 5 5.588777 0.58877706527709961 0.34665843259631401 +2358 5 5.56147957 0.56147956848144531 0.31525930582211004 +2359 5 5.16718626 0.16718626022338867 0.027951245607482633 +2360 6 5.79588366 0.2041163444519043 0.041663482072408442 +2361 5 5.330882 0.33088207244873047 0.10948294586796692 +2362 6 6.38512039 0.38512039184570313 0.14831771621538792 +2363 5 5.396926 0.39692592620849609 0.15755019089647249 +2364 5 5.1075263 0.10752630233764648 0.01156190569440696 +2365 5 5.29107666 0.29107666015625 0.084725622087717056 +2366 5 5.311592 0.31159210205078125 0.097089638060424477 +2367 6 5.39217 0.60783004760742188 0.36945736677444074 +2368 6 5.97187042 0.02812957763671875 0.00079127313802018762 +2369 6 6.071237 0.071237087249755859 0.0050747225998293288 +2370 7 6.65556 0.34443998336791992 0.11863890214249295 +2371 5 5.03869963 0.038699626922607422 0.0014976611239490012 +2372 4 4.18628931 0.18628931045532227 0.034703707189919442 +2373 3 3.84731722 0.84731721878051758 0.71794646924195149 +2374 6 6.297287 0.2972869873046875 0.088379552820697427 +2375 6 6.81347132 0.81347131729125977 0.66173558405557742 +2376 6 6.297287 0.2972869873046875 0.088379552820697427 +2377 6 5.87790442 0.12209558486938477 0.014907331844597138 +2378 5 5.080402 0.080401897430419922 0.0064644651104117656 +2379 4 4.55011559 0.55011558532714844 0.30262715721983113 +2380 4 4.447009 0.44700908660888672 0.19981712351091119 +2381 6 6.23594141 0.23594141006469727 0.055668348983317628 +2382 8 7.02860928 0.97139072418212891 0.94359993902708084 +2383 6 6.467941 0.4679408073425293 0.21896859917637812 +2384 8 7.02860928 0.97139072418212891 0.94359993902708084 +2385 5 5.768393 0.76839303970336914 0.59042786346458342 +2386 4 4.982087 0.98208713531494141 0.96449514135110803 +2387 4 4.92572927 0.92572927474975586 0.85697469012870897 +2388 4 4.838168 0.83816814422607422 0.70252583799538115 +2389 8 7.15358829 0.84641170501708984 0.71641277438993711 +2390 8 6.68599939 1.3140006065368652 1.7265975939792497 +2391 6 5.951952 0.048048019409179688 0.002308612169144908 +2392 7 6.037923 0.96207714080810547 0.9255924248654992 +2393 6 6.037923 0.037922859191894531 0.0014381432492882595 +2394 5 5.070125 0.070125102996826172 0.004917530070315479 +2395 5 5.324506 0.32450580596923828 0.10530401810774492 +2396 5 4.995414 0.0045862197875976563 2.1033411940152291E-05 +2397 6 6.378008 0.37800788879394531 0.14288996399045573 +2398 6 6.13482952 0.13482952117919922 0.018178999781412131 +2399 6 6.16249466 0.16249465942382813 0.026404514341265894 +2400 4 4.94752169 0.94752168655395508 0.8977973464900515 +2401 4 5.241969 1.241969108581543 1.5424872666708325 +2402 6 5.76762533 0.23237466812133789 0.053997986384501928 +2403 6 5.933714 0.066286087036132813 0.0043938453345617745 +2404 5 5.02169943 0.021699428558349609 0.00047086519975891861 +2405 5 5.430184 0.43018388748168945 0.18505817704885885 +2406 6 6.83018541 0.8301854133605957 0.68920782055670315 +2407 6 6.28223658 0.28223657608032227 0.079657484877543538 +2408 5 5.383545 0.383544921875 0.14710670709609985 +2409 4 5.90790749 1.9079074859619141 3.6401109749895113 +2410 6 5.853688 0.14631223678588867 0.021407270633289954 +2411 6 5.365198 0.63480186462402344 0.40297340733013698 +2412 4 4.653695 0.65369510650634766 0.42731729227034521 +2413 4 5.90790749 1.9079074859619141 3.6401109749895113 +2414 4 4.4736166 0.47361660003662109 0.22431268383024872 +2415 5 5.58259344 0.58259344100952148 0.33941511750731479 +2416 6 5.853688 0.14631223678588867 0.021407270633289954 +2417 5 5.08736038 0.087360382080078125 0.0076318363571772352 +2418 5 5.1927886 0.19278860092163086 0.037167444645319847 +2419 5 5.01314974 0.013149738311767578 0.00017291561766796804 +2420 7 6.78615475 0.21384525299072266 0.045729792226666177 +2421 5 5.62462759 0.62462759017944336 0.39015962641337865 +2422 5 4.834279 0.16572093963623047 0.027463429833915143 +2423 6 5.79968929 0.20031070709228516 0.040124379375811259 +2424 5 4.834279 0.16572093963623047 0.027463429833915143 +2425 6 5.79968929 0.20031070709228516 0.040124379375811259 +2426 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2427 6 5.67294264 0.3270573616027832 0.10696651777857369 +2428 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2429 6 5.67294264 0.3270573616027832 0.10696651777857369 +2430 5 5.191099 0.19109916687011719 0.036518891578452894 +2431 5 5.090718 0.090717792510986328 0.0082297178780663671 +2432 5 5.212568 0.21256780624389648 0.045185072251342717 +2433 6 5.457381 0.54261922836303711 0.29443562698929782 +2434 6 5.55754471 0.44245529174804688 0.19576668519584928 +2435 4 5.018812 1.0188121795654297 1.0379782572308613 +2436 5 5.1477704 0.14777040481567383 0.021836092539388119 +2437 6 5.767265 0.23273515701293945 0.05416565330983758 +2438 5 5.1477704 0.14777040481567383 0.021836092539388119 +2439 6 5.80857754 0.19142246246337891 0.036642559135543706 +2440 5 5.177423 0.17742300033569336 0.031478921048119446 +2441 6 6.0388093 0.038809299468994141 0.0015061617252740689 +2442 5 5.33315 0.33314990997314453 0.11098886251511431 +2443 5 5.356635 0.35663509368896484 0.12718859005053673 +2444 5 5.33315 0.33314990997314453 0.11098886251511431 +2445 5 5.36508751 0.36508750915527344 0.13328888934120187 +2446 5 5.356635 0.35663509368896484 0.12718859005053673 +2447 6 5.930377 0.069622993469238281 0.0048473612196175964 +2448 6 6.02893972 0.028939723968505859 0.00083750762337331253 +2449 6 6.112941 0.11294078826904297 0.012755621654832794 +2450 5 5.138178 0.13817787170410156 0.019093124228675151 +2451 5 5.138178 0.13817787170410156 0.019093124228675151 +2452 7 6.46374655 0.53625345230102539 0.28756776510476811 +2453 6 6.33004045 0.33004045486450195 0.10892670184716735 +2454 5 5.5165844 0.51658439636230469 0.26685943856500671 +2455 6 5.63751173 0.3624882698059082 0.1313977457468809 +2456 6 5.84722948 0.1527705192565918 0.023338831553928685 +2457 6 5.84722948 0.1527705192565918 0.023338831553928685 +2458 6 5.63751173 0.3624882698059082 0.1313977457468809 +2459 5 5.22885036 0.22885036468505859 0.052372489416484314 +2460 5 5.22885036 0.22885036468505859 0.052372489416484314 +2461 5 4.82563972 0.17436027526855469 0.030401505591726163 +2462 5 4.90771 0.092289924621582031 0.0085174301866572932 +2463 7 6.190032 0.80996799468994141 0.65604815242204495 +2464 5 5.229953 0.22995281219482422 0.052878295836308098 +2465 5 5.131188 0.13118791580200195 0.017210269252473154 +2466 5 5.164425 0.16442489624023438 0.02703554650361184 +2467 6 5.66543436 0.33456563949584961 0.1119341671312668 +2468 6 5.811642 0.18835783004760742 0.035478672140243361 +2469 5 5.10665464 0.10665464401245117 0.011375213089422687 +2470 5 5.55674934 0.55674934387207031 0.3099698319019808 +2471 7 6.85693 0.14307022094726563 0.020469088121899404 +2472 6 5.627016 0.37298393249511719 0.13911701389952214 +2473 6 5.3198247 0.6801753044128418 0.46263844473310201 +2474 7 6.27704525 0.72295475006103516 0.52266357063581381 +2475 5 4.89538431 0.10461568832397461 0.010944442243498997 +2476 6 5.59821844 0.40178155899047852 0.16142842114481937 +2477 7 6.27704525 0.72295475006103516 0.52266357063581381 +2478 6 5.4796133 0.52038669586181641 0.27080231322997861 +2479 6 5.65785551 0.34214448928833008 0.11706285155037222 +2480 5 5.200323 0.20032310485839844 0.040129346340108896 +2481 6 5.394372 0.60562801361083984 0.36678529087021161 +2482 6 5.52501059 0.47498941421508789 0.22561494361639234 +2483 6 5.4796133 0.52038669586181641 0.27080231322997861 +2484 5 5.12939167 0.12939167022705078 0.01674220432414586 +2485 6 5.59504271 0.40495729446411133 0.16399041033969297 +2486 5 5.50079441 0.50079441070556641 0.25079504179393552 +2487 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2488 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2489 6 5.56793261 0.4320673942565918 0.18668223317968113 +2490 6 5.73469973 0.26530027389526367 0.070384235328901923 +2491 5 5.48845625 0.48845624923706055 0.23858950741873741 +2492 6 5.56793261 0.4320673942565918 0.18668223317968113 +2493 4 5.123062 1.1230621337890625 1.2612685563508421 +2494 4 5.123062 1.1230621337890625 1.2612685563508421 +2495 5 5.651345 0.65134477615356445 0.42425001742253698 +2496 5 5.6806283 0.68062829971313477 0.46325488237039281 +2497 5 5.313193 0.31319284439086914 0.098089757777643172 +2498 5 5.313193 0.31319284439086914 0.098089757777643172 +2499 6 6.38280439 0.38280439376831055 0.14653920388832375 +2500 5 5.313193 0.31319284439086914 0.098089757777643172 +2501 5 5.424 0.42399978637695313 0.17977581884770188 +2502 4 4.899974 0.89997386932373047 0.80995296546552709 +2503 4 4.899974 0.89997386932373047 0.80995296546552709 +2504 6 5.45203543 0.54796457290649414 0.30026517316059653 +2505 6 5.481323 0.5186772346496582 0.2690260737438166 +2506 6 5.456469 0.54353094100952148 0.29542588383469592 +2507 7 6.86489058 0.13510942459106445 0.018254556613328532 +2508 6 5.3075223 0.69247770309448242 0.47952536928301015 +2509 5 5.15516758 0.15516757965087891 0.02407697777471185 +2510 6 5.557624 0.44237613677978516 0.19569664639220719 +2511 6 5.422771 0.57722902297973633 0.33319334497014097 +2512 6 5.622964 0.37703609466552734 0.1421562166806325 +2513 5 5.087558 0.087557792663574219 0.0076663670561174513 +2514 7 6.945491 0.054509162902832031 0.0029712488403674797 +2515 7 6.896848 0.10315179824829102 0.010640293481856133 +2516 6 5.80096245 0.19903755187988281 0.039615947058337042 +2517 6 5.541327 0.45867300033569336 0.21038092123694696 +2518 7 6.896848 0.10315179824829102 0.010640293481856133 +2519 5 5.26988125 0.26988124847412109 0.072835888277950289 +2520 5 5.06689453 0.06689453125 0.0044748783111572266 +2521 7 6.889004 0.11099576950073242 0.012320060847059722 +2522 8 6.341771 1.658228874206543 2.7497229992522989 +2523 5 5.927134 0.92713403701782227 0.85957752259696463 +2524 5 5.06689453 0.06689453125 0.0044748783111572266 +2525 8 6.341771 1.658228874206543 2.7497229992522989 +2526 7 6.889004 0.11099576950073242 0.012320060847059722 +2527 6 6.22118 0.22117996215820313 0.048920575660304166 +2528 6 6.05786 0.057859897613525391 0.0033477677518476412 +2529 5 5.17878962 0.17878961563110352 0.031965726657517735 +2530 6 6.09709454 0.097094535827636719 0.0094273488875842304 +2531 4 4.63009644 0.630096435546875 0.3970215180888772 +2532 4 4.63009644 0.630096435546875 0.3970215180888772 +2533 5 5.742318 0.74231815338134766 0.55103624083949398 +2534 7 5.86696339 1.1330366134643555 1.2837719674507753 +2535 6 5.663614 0.33638620376586914 0.11315567808401283 +2536 6 5.621967 0.37803316116333008 0.14290907093914029 +2537 6 5.53835869 0.46164131164550781 0.21311270061778487 +2538 6 5.53835869 0.46164131164550781 0.21311270061778487 +2539 5 5.52992725 0.52992725372314453 0.280822894238554 +2540 5 5.604961 0.60496091842651367 0.36597771282345093 +2541 6 5.663614 0.33638620376586914 0.11315567808401283 +2542 5 5.57032871 0.57032871246337891 0.32527484026013553 +2543 6 5.621967 0.37803316116333008 0.14290907093914029 +2544 6 6.133279 0.13327884674072266 0.017763250988537038 +2545 6 5.878759 0.12124109268188477 0.014699402554697372 +2546 5 5.218156 0.21815586090087891 0.047591979645403626 +2547 5 5.08556461 0.085564613342285156 0.007321303056414763 +2548 6 5.635065 0.36493492126464844 0.13317749675843515 +2549 5 5.86682272 0.86682271957397461 0.75138162716962142 +2550 5 5.08556461 0.085564613342285156 0.007321303056414763 +2551 6 5.635065 0.36493492126464844 0.13317749675843515 +2552 5 4.91085434 0.089145660400390625 0.0079469487682217732 +2553 7 6.82945776 0.17054224014282227 0.029084655672932058 +2554 7 6.783399 0.21660089492797852 0.046915947683601189 +2555 7 6.82945776 0.17054224014282227 0.029084655672932058 +2556 5 5.36953926 0.36953926086425781 0.13655926532010199 +2557 7 6.783399 0.21660089492797852 0.046915947683601189 +2558 7 6.82945776 0.17054224014282227 0.029084655672932058 +2559 5 5.189397 0.18939685821533203 0.035871169901838584 +2560 6 5.70537949 0.29462051391601563 0.086801247220137157 +2561 5 5.28348732 0.28348731994628906 0.080365060570329661 +2562 6 5.70537949 0.29462051391601563 0.086801247220137157 +2563 5 5.189397 0.18939685821533203 0.035871169901838584 +2564 6 5.399755 0.60024499893188477 0.36029405874273834 +2565 5 5.337183 0.33718299865722656 0.11369237458347925 +2566 7 6.48339272 0.51660728454589844 0.26688308644588687 +2567 5 6.3172555 1.3172554969787598 1.7351620443207594 +2568 6 5.472037 0.52796316146850586 0.27874509986781959 +2569 6 6.171783 0.1717829704284668 0.029509388929227498 +2570 5 6.3172555 1.3172554969787598 1.7351620443207594 +2571 6 6.25385761 0.25385761260986328 0.064443687479979417 +2572 5 5.263467 0.26346683502197266 0.069414773156495357 +2573 5 5.41449165 0.41449165344238281 0.17180333077340038 +2574 5 5.74912739 0.74912738800048828 0.56119184345243411 +2575 6 6.094214 0.094213962554931641 0.0088762707403020613 +2576 5 5.55226135 0.5522613525390625 0.30499260150827467 +2577 5 5.6303606 0.63036060333251953 0.39735449023373803 +2578 7 6.90196466 0.098035335540771484 0.0096109270145916526 +2579 6 5.492593 0.50740718841552734 0.25746205485575047 +2580 5 5.378673 0.37867307662963867 0.1433932989641562 +2581 7 6.623414 0.37658596038818359 0.14181698556149058 +2582 7 6.623414 0.37658596038818359 0.14181698556149058 +2583 7 6.623414 0.37658596038818359 0.14181698556149058 +2584 7 6.623414 0.37658596038818359 0.14181698556149058 +2585 7 6.623414 0.37658596038818359 0.14181698556149058 +2586 7 6.623414 0.37658596038818359 0.14181698556149058 +2587 6 5.450896 0.54910421371459961 0.30151543751912868 +2588 7 6.623414 0.37658596038818359 0.14181698556149058 +2589 4 4.47188 0.47187995910644531 0.2226706958063005 +2590 6 6.29141 0.29140996932983398 0.084919770224814783 +2591 7 6.413187 0.58681297302246094 0.34434946530745947 +2592 5 5.89621 0.8962101936340332 0.80319271117355129 +2593 5 5.977096 0.9770960807800293 0.95471675107569354 +2594 7 6.802061 0.19793891906738281 0.039179815681563923 +2595 5 4.78572226 0.21427774429321289 0.04591495169938753 +2596 5 5.26803637 0.2680363655090332 0.071843493235292044 +2597 6 6.40936327 0.4093632698059082 0.16757828666618479 +2598 5 5.26803637 0.2680363655090332 0.071843493235292044 +2599 6 5.64444828 0.35555171966552734 0.12641702535711374 +2600 7 6.711269 0.28873109817504883 0.083365647053369685 +2601 5 5.516984 0.51698398590087891 0.26727244167796016 +2602 6 6.40936327 0.4093632698059082 0.16757828666618479 +2603 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2604 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2605 6 5.749763 0.25023698806762695 0.062618550197157674 +2606 6 6.066723 0.066722869873046875 0.0044519413640955463 +2607 6 6.004938 0.0049381256103515625 2.4385084543609992E-05 +2608 6 6.19136524 0.19136524200439453 0.036620655847400485 +2609 6 5.749763 0.25023698806762695 0.062618550197157674 +2610 5 5.21728945 0.21728944778442383 0.047214704118459849 +2611 5 5.43802834 0.43802833557128906 0.19186882276335382 +2612 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2613 5 5.316313 0.31631278991699219 0.10005378106507123 +2614 5 6.02755356 1.0275535583496094 1.0558663152769441 +2615 7 6.71482038 0.28517961502075195 0.081327412823384293 +2616 7 6.71482038 0.28517961502075195 0.081327412823384293 +2617 7 6.71482038 0.28517961502075195 0.081327412823384293 +2618 7 6.17836475 0.82163524627685547 0.67508447792442894 +2619 6 5.447172 0.55282783508300781 0.30561861524256528 +2620 5 5.23616838 0.23616838455200195 0.055775505861902275 +2621 5 5.316313 0.31631278991699219 0.10005378106507123 +2622 7 6.17836475 0.82163524627685547 0.67508447792442894 +2623 7 6.71482038 0.28517961502075195 0.081327412823384293 +2624 5 6.02755356 1.0275535583496094 1.0558663152769441 +2625 5 4.932907 0.0670928955078125 0.0045014566276222467 +2626 7 6.67024565 0.32975435256958008 0.10873793303858292 +2627 7 6.191726 0.8082737922668457 0.65330652326542804 +2628 6 6.10126448 0.10126447677612305 0.010254494256741964 +2629 5 4.569814 0.43018579483032227 0.18505981807379612 +2630 6 5.93529558 0.064704418182373047 0.0041866617323194077 +2631 7 6.506482 0.49351787567138672 0.24355989360719832 +2632 5 4.742157 0.257843017578125 0.066483021713793278 +2633 5 5.672364 0.67236423492431641 0.45207366440536134 +2634 5 5.179316 0.17931604385375977 0.032154243583363495 +2635 6 6.10950756 0.10950756072998047 0.01199190585703036 +2636 5 5.672364 0.67236423492431641 0.45207366440536134 +2637 5 5.179316 0.17931604385375977 0.032154243583363495 +2638 6 6.36789942 0.36789941787719727 0.13534998167438062 +2639 6 5.970108 0.0298919677734375 0.00089352973736822605 +2640 6 6.01226473 0.012264728546142578 0.00015042356631056464 +2641 5 5.388603 0.38860321044921875 0.1510124551714398 +2642 5 5.089852 0.089851856231689453 0.0080733560682801908 +2643 5 5.421518 0.42151784896850586 0.17767729699903612 +2644 6 5.965845 0.034154891967773438 0.0011665566453302745 +2645 7 6.45913172 0.54086828231811523 0.2925384988177484 +2646 7 5.962606 1.0373940467834473 1.0761864083017372 +2647 5 5.531743 0.53174304962158203 0.28275067082086025 +2648 6 6.055601 0.055601119995117188 0.0030914845447114203 +2649 6 5.965845 0.034154891967773438 0.0011665566453302745 +2650 5 5.375029 0.37502908706665039 0.14064681614604524 +2651 5 5.00735 0.0073499679565429688 5.4022028962208424E-05 +2652 7 6.862701 0.1372990608215332 0.018851032102475074 +2653 5 5.389191 0.3891911506652832 0.15146975175616717 +2654 5 4.99643946 0.0035605430603027344 1.2677466884269961E-05 +2655 5 5.479881 0.47988080978393555 0.23028559159888573 +2656 4 5.36642933 1.366429328918457 1.8671291109285448 +2657 7 6.66357 0.33643007278442383 0.11318519387373271 +2658 7 6.43240547 0.56759452819824219 0.32216354844058515 +2659 6 6.25220728 0.25220727920532227 0.063608511684151381 +2660 6 5.396139 0.60386085510253906 0.36464793232516968 +2661 6 5.94709873 0.052901268005371094 0.0027985441565760993 +2662 6 6.15312243 0.1531224250793457 0.023446477062179838 +2663 8 6.468452 1.531548023223877 2.3456393474409651 +2664 7 6.755112 0.2448878288269043 0.059970048707555179 +2665 5 5.26342249 0.26342248916625977 0.069391407798548244 +2666 7 6.840258 0.15974187850952148 0.025517467749750722 +2667 7 6.64892 0.35107994079589844 0.12325712482925155 +2668 6 5.510326 0.48967409133911133 0.23978071572878434 +2669 5 5.402378 0.40237808227539063 0.16190812109562103 +2670 7 6.840258 0.15974187850952148 0.025517467749750722 +2671 7 6.964588 0.035411834716796875 0.0012539980380097404 +2672 7 6.438929 0.56107091903686523 0.31480057618887258 +2673 6 5.11319351 0.88680648803710938 0.78642574722471181 +2674 7 5.93575 1.0642499923706055 1.1326280462608338 +2675 7 5.96326256 1.0367374420166016 1.0748245236791263 +2676 6 6.27718973 0.27718973159790039 0.076834147303316058 +2677 6 6.43075943 0.43075942993164063 0.18555368647503201 +2678 5 5.22192669 0.22192668914794922 0.049251455356170482 +2679 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2680 6 6.6857276 0.68572759628295898 0.47022233630400478 +2681 6 6.17682171 0.17682170867919922 0.031265916660231596 +2682 6 6.14539433 0.14539432525634766 0.021139509816748614 +2683 5 5.22192669 0.22192668914794922 0.049251455356170482 +2684 6 6.398973 0.39897298812866211 0.15917944525631356 +2685 7 6.462977 0.53702306747436523 0.28839377499957664 +2686 6 6.6857276 0.68572759628295898 0.47022233630400478 +2687 5 5.45965528 0.4596552848815918 0.21128298091957731 +2688 6 6.17682171 0.17682170867919922 0.031265916660231596 +2689 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2690 6 5.39443636 0.60556364059448242 0.36670732281004348 +2691 6 6.075588 0.075588226318359375 0.0057135799579555169 +2692 6 5.428855 0.57114505767822266 0.32620667691026028 +2693 6 6.246358 0.24635791778564453 0.06069222365567839 +2694 6 6.075588 0.075588226318359375 0.0057135799579555169 +2695 6 6.371832 0.37183189392089844 0.13825895733680227 +2696 6 5.633613 0.36638689041137695 0.13423935346531835 +2697 5 5.98760462 0.98760461807250977 0.97536288163814788 +2698 6 5.428855 0.57114505767822266 0.32620667691026028 +2699 6 5.39443636 0.60556364059448242 0.36670732281004348 +2700 7 6.802134 0.19786596298217773 0.039150939306864529 +2701 5 5.51507568 0.51507568359375 0.26530295982956886 +2702 5 5.51507568 0.51507568359375 0.26530295982956886 +2703 5 5.51507568 0.51507568359375 0.26530295982956886 +2704 6 5.557806 0.44219398498535156 0.19553552035722532 +2705 6 5.60688972 0.39311027526855469 0.15453568852171884 +2706 6 5.79417 0.20583009719848633 0.042366028912738329 +2707 5 5.51507568 0.51507568359375 0.26530295982956886 +2708 6 5.668365 0.3316349983215332 0.10998177211172333 +2709 5 5.385527 0.38552713394165039 0.14863117100526324 +2710 5 5.385527 0.38552713394165039 0.14863117100526324 +2711 5 5.449205 0.44920492172241211 0.20178506169963839 +2712 5 5.503833 0.50383281707763672 0.25384750756438734 +2713 6 5.668365 0.3316349983215332 0.10998177211172333 +2714 6 5.45965528 0.5403447151184082 0.29197241115639372 +2715 6 5.87323952 0.12676048278808594 0.016068219996668631 +2716 5 5.385527 0.38552713394165039 0.14863117100526324 +2717 6 6.10622644 0.10622644424438477 0.011284057456805385 +2718 6 5.66719341 0.33280658721923828 0.11076022449651646 +2719 6 6.14106846 0.14106845855712891 0.019900309999684396 +2720 7 6.80913448 0.19086551666259766 0.036429645450880344 +2721 5 5.197515 0.19751501083374023 0.039012179504652522 +2722 7 6.88614845 0.11385154724121094 0.012962174809217686 +2723 6 6.593465 0.59346485137939453 0.35220052982276684 +2724 6 6.14106846 0.14106845855712891 0.019900309999684396 +2725 5 5.453957 0.45395708084106445 0.20607703124574073 +2726 6 5.930292 0.069707870483398438 0.0048591872073302511 +2727 6 5.986483 0.013516902923583984 0.00018270666464559326 +2728 6 5.44713926 0.55286073684692383 0.30565499434692356 +2729 7 6.42816162 0.57183837890625 0.32699913159012794 +2730 5 5.11883736 0.11883735656738281 0.014122317315923283 +2731 5 5.159798 0.15979814529418945 0.025535447239462883 +2732 5 5.14337635 0.14337635040283203 0.020556777854835673 +2733 7 6.42816162 0.57183837890625 0.32699913159012794 +2734 6 5.868908 0.13109207153320313 0.017185131218866445 +2735 6 5.44713926 0.55286073684692383 0.30565499434692356 +2736 6 5.986483 0.013516902923583984 0.00018270666464559326 +2737 7 6.00914955 0.99085044860839844 0.98178461150746443 +2738 5 4.7449894 0.25501060485839844 0.065030408590246225 +2739 7 6.73053 0.26947021484375 0.072614196687936783 +2740 6 5.63796473 0.36203527450561523 0.13106953998635618 +2741 5 4.7449894 0.25501060485839844 0.065030408590246225 +2742 6 5.878949 0.12105083465576172 0.014653304570856562 +2743 6 5.44707775 0.55292224884033203 0.30572301326265006 +2744 6 5.44707775 0.55292224884033203 0.30572301326265006 +2745 7 6.68483162 0.31516838073730469 0.099331108216574648 +2746 6 5.846201 0.15379905700683594 0.02365414993619197 +2747 6 5.86011 0.13989019393920898 0.019569266360349502 +2748 8 7.558382 0.44161796569824219 0.19502642762745381 +2749 6 5.86011 0.13989019393920898 0.019569266360349502 +2750 8 7.558382 0.44161796569824219 0.19502642762745381 +2751 6 6.354132 0.35413217544555664 0.12540959768580251 +2752 6 6.444844 0.44484376907348633 0.19788597888350523 +2753 8 6.60379028 1.396209716796875 1.9494015732780099 +2754 5 5.163789 0.16378879547119141 0.026826769521903771 +2755 5 4.94988251 0.05011749267578125 0.0025117630721069872 +2756 6 5.5096693 0.49033069610595703 0.24042419154375239 +2757 5 5.64830256 0.64830255508422852 0.42029620292873915 +2758 6 5.50835371 0.49164628982543945 0.24171607429912001 +2759 6 5.96230745 0.037692546844482422 0.0014207280876235018 +2760 6 6.071012 0.071012020111083984 0.0050427070002569963 +2761 5 5.126366 0.12636613845825195 0.015968400948850103 +2762 5 4.961535 0.038465023040771484 0.0014795579975270812 +2763 6 5.63605547 0.36394453048706055 0.13245562127144694 +2764 6 5.87988043 0.12011957168579102 0.014428711501977887 +2765 6 6.52317953 0.52317953109741211 0.273716821759308 +2766 6 6.2780447 0.27804470062255859 0.077308855544288235 +2767 6 5.87988043 0.12011957168579102 0.014428711501977887 +2768 6 5.63605547 0.36394453048706055 0.13245562127144694 +2769 5 4.961535 0.038465023040771484 0.0014795579975270812 +2770 7 6.230737 0.76926279067993164 0.59176524112467632 +2771 6 5.9890213 0.01097869873046875 0.00012053182581439614 +2772 7 7.19588566 0.19588565826416016 0.038371191113583336 +2773 7 6.701176 0.29882383346557617 0.089295683447062402 +2774 8 7.11208963 0.88791036605834961 0.7883848181538724 +2775 8 7.11208963 0.88791036605834961 0.7883848181538724 +2776 8 7.11208963 0.88791036605834961 0.7883848181538724 +2777 6 5.92017651 0.079823493957519531 0.0063717901875861571 +2778 7 6.701176 0.29882383346557617 0.089295683447062402 +2779 5 6.13225031 1.1322503089904785 1.2819907622090341 +2780 5 4.9076457 0.092354297637939453 0.0085293162921971089 +2781 6 5.63751364 0.36248636245727539 0.13139636296750723 +2782 6 5.910954 0.089046001434326172 0.0079291903714420187 +2783 6 5.910954 0.089046001434326172 0.0079291903714420187 +2784 6 5.910954 0.089046001434326172 0.0079291903714420187 +2785 5 5.312507 0.31250715255737305 0.097660720399517231 +2786 6 6.226491 0.22649097442626953 0.051298161496561079 +2787 5 5.312507 0.31250715255737305 0.097660720399517231 +2788 5 5.288817 0.28881692886352539 0.083415218398158686 +2789 5 5.239505 0.23950481414794922 0.057362556000043696 +2790 6 5.910954 0.089046001434326172 0.0079291903714420187 +2791 5 5.335238 0.33523797988891602 0.11238450316000126 +2792 5 5.333069 0.33306884765625 0.11093485727906227 +2793 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2794 5 5.25789976 0.25789976119995117 0.06651228682699184 +2795 8 6.859369 1.1406311988830566 1.3010395318653991 +2796 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2797 5 5.25789976 0.25789976119995117 0.06651228682699184 +2798 7 6.24827337 0.75172662734985352 0.56509292226678554 +2799 7 6.445542 0.5544581413269043 0.30742383048368538 +2800 5 5.335238 0.33523797988891602 0.11238450316000126 +2801 5 5.333069 0.33306884765625 0.11093485727906227 +2802 6 5.92864656 0.071353435516357422 0.0050913127599869767 +2803 8 7.02032 0.97968006134033203 0.95977302258779673 +2804 8 6.859369 1.1406311988830566 1.3010395318653991 +2805 6 6.18910837 0.18910837173461914 0.0357619762601189 +2806 5 5.57462358 0.57462358474731445 0.33019226414785408 +2807 5 5.46513 0.46512985229492188 0.21634577949589584 +2808 6 5.404429 0.59557104110717773 0.35470486500548759 +2809 7 6.74964428 0.25035572052001953 0.062677986797098129 +2810 7 6.45263243 0.54736757278442383 0.29961125973591152 +2811 5 5.919209 0.91920900344848633 0.84494519202075935 +2812 6 6.11701441 0.11701440811157227 0.013692371705701589 +2813 7 6.74964428 0.25035572052001953 0.062677986797098129 +2814 7 6.791037 0.20896291732788086 0.043665500818178771 +2815 5 5.735541 0.73554086685180664 0.54102036680910714 +2816 5 5.957191 0.95719099044799805 0.91621459219481949 +2817 7 6.791037 0.20896291732788086 0.043665500818178771 +2818 4 4.92936659 0.9293665885925293 0.86372225599211561 +2819 6 6.16221571 0.1622157096862793 0.026313936469023247 +2820 5 5.37689543 0.37689542770385742 0.14205016342407362 +2821 5 5.44312143 0.44312143325805664 0.19635660461267435 +2822 5 5.83623457 0.83623456954956055 0.69928825530973882 +2823 6 5.95306063 0.046939373016357422 0.0022033047391687433 +2824 6 5.68058062 0.31941938400268555 0.10202874287665509 +2825 6 5.857073 0.14292716979980469 0.020428175866982201 +2826 6 5.466382 0.53361797332763672 0.28474814145829441 +2827 7 6.83924961 0.16075038909912109 0.02584068759551883 +2828 7 6.83924961 0.16075038909912109 0.02584068759551883 +2829 5 5.557639 0.55763912200927734 0.3109613903952777 +2830 5 5.962908 0.96290779113769531 0.92719141423367546 +2831 5 5.24277925 0.24277925491333008 0.058941766616271707 +2832 6 6.0280633 0.028063297271728516 0.00078754865376140515 +2833 7 6.12555552 0.87444448471069336 0.76465315684095003 +2834 6 6.29048538 0.29048538208007813 0.084381757202208973 +2835 6 5.857073 0.14292716979980469 0.020428175866982201 +2836 6 5.466382 0.53361797332763672 0.28474814145829441 +2837 6 5.772782 0.2272181510925293 0.051628088185907473 +2838 7 6.708939 0.2910609245300293 0.08471646178827541 +2839 7 6.07187033 0.92812967300415039 0.86142468991079113 +2840 6 6.175222 0.17522192001342773 0.030702721253192067 +2841 6 5.65299845 0.34700155258178711 0.12041007749417076 +2842 6 5.60486126 0.39513874053955078 0.15613462427518243 +2843 6 5.718894 0.28110599517822266 0.079020580525138939 +2844 5 6.00124359 1.0012435913085938 1.0024887291365303 +2845 7 6.4817934 0.51820659637451172 0.2685380765260561 +2846 7 6.708939 0.2910609245300293 0.08471646178827541 +2847 5 5.987009 0.98700904846191406 0.97418686174569302 +2848 5 5.18150425 0.18150424957275391 0.032943792612968537 +2849 5 5.016559 0.016559123992919922 0.00027420458741289622 +2850 5 5.75738764 0.75738763809204102 0.5736360343346405 +2851 5 5.504389 0.50438880920410156 0.25440807085033157 +2852 5 5.83271551 0.83271551132202148 0.69341512279629569 +2853 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2854 6 6.241845 0.24184513092041016 0.058489067349910329 +2855 7 6.551627 0.44837284088134766 0.2010382044400103 +2856 7 6.816518 0.18348217010498047 0.033665706746432988 +2857 8 7.0720315 0.92796850204467773 0.86112554078704306 +2858 7 6.551627 0.44837284088134766 0.2010382044400103 +2859 6 5.95013046 0.049869537353515625 0.0024869707558536902 +2860 6 6.036433 0.036433219909667969 0.0013273795129862265 +2861 6 6.241845 0.24184513092041016 0.058489067349910329 +2862 6 6.55694532 0.5569453239440918 0.31018809386318935 +2863 6 6.42587757 0.42587757110595703 0.18137170557110949 +2864 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2865 6 5.90828276 0.091717243194580078 0.0084120526992137457 +2866 7 6.816518 0.18348217010498047 0.033665706746432988 +2867 7 6.6592536 0.34074640274047852 0.11610811098057638 +2868 5 5.46810532 0.46810531616210938 0.21912258701922838 +2869 6 6.41052437 0.41052436828613281 0.16853025695672841 +2870 7 6.6592536 0.34074640274047852 0.11610811098057638 +2871 6 6.21243954 0.21243953704833984 0.045130556901312957 +2872 7 7.25975037 0.2597503662109375 0.067470252746716142 +2873 8 7.001045 0.99895477294921875 0.99791063839802518 +2874 7 7.061138 0.061138153076171875 0.0037378737615654245 +2875 6 6.21243954 0.21243953704833984 0.045130556901312957 +2876 5 5.88438272 0.88438272476196289 0.78213280385739381 +2877 5 5.50844669 0.50844669342041016 0.25851804005014856 +2878 6 6.67545128 0.67545127868652344 0.45623442987925955 +2879 6 6.11065865 0.11065864562988281 0.012245335852639982 +2880 5 5.591242 0.59124183654785156 0.34956690928447642 +2881 7 6.55750942 0.44249057769775391 0.19579791135129199 +2882 5 5.81471968 0.81471967697143555 0.66376815204444028 +2883 7 6.662797 0.33720302581787109 0.11370588062072784 +2884 7 7.0597086 0.059708595275878906 0.0035651163498187088 +2885 6 6.686732 0.68673181533813477 0.47160058619761003 +2886 5 5.475714 0.47571420669555664 0.22630400645198279 +2887 5 6.349974 1.3499741554260254 1.8224302203182106 +2888 4 4.76470327 0.76470327377319336 0.58477109691943951 +2889 6 6.016396 0.016396045684814453 0.00026883031409852265 +2890 8 7.01523542 0.98476457595825195 0.96976127006223578 +2891 6 6.067511 0.067511081695556641 0.0045577461517041229 +2892 5 5.22424173 0.22424173355102539 0.050284355065969066 +2893 7 7.046794 0.046793937683105469 0.002189672603890358 +2894 7 6.419709 0.58029079437255859 0.33673740603353508 +2895 5 4.983767 0.016232967376708984 0.00026350922985329817 +2896 5 5.330299 0.33029890060424805 0.10909736374037493 +2897 5 5.22424173 0.22424173355102539 0.050284355065969066 +2898 5 5.48931837 0.4893183708190918 0.23943246802105023 +2899 5 5.496111 0.49611091613769531 0.24612604111098335 +2900 6 6.3282485 0.32824850082397461 0.10774707829318686 +2901 7 6.920011 0.079988956451416016 0.0063982331541865278 +2902 5 5.336474 0.33647394180297852 0.11321471351243417 +2903 6 6.15183258 0.15183258056640625 0.023053132521454245 +2904 7 6.646972 0.3530278205871582 0.12462864210851876 +2905 5 5.2062397 0.20623970031738281 0.042534813987003872 +2906 5 5.24921036 0.24921035766601563 0.062105802368023433 +2907 6 6.15183258 0.15183258056640625 0.023053132521454245 +2908 6 5.733736 0.26626396179199219 0.070896497349167475 +2909 6 6.14865255 0.14865255355834961 0.022097581679417999 +2910 5 5.23128128 0.23128128051757813 0.053491030717850663 +2911 5 5.336474 0.33647394180297852 0.11321471351243417 +2912 7 6.920011 0.079988956451416016 0.0063982331541865278 +2913 5 5.80159569 0.80159568786621094 0.64255564680570387 +2914 6 6.119406 0.11940622329711914 0.014257846162081478 +2915 6 6.119406 0.11940622329711914 0.014257846162081478 +2916 6 6.460953 0.4609532356262207 0.21247788543428214 +2917 7 6.76917076 0.23082923889160156 0.053282137527276063 +2918 6 6.048738 0.048738002777099609 0.0023753929147005692 +2919 5 6.120949 1.1209487915039063 1.2565261931740679 +2920 4 5.38337946 1.3833794593811035 1.9137387286375542 +2921 6 5.487146 0.51285409927368164 0.2630193271418193 +2922 8 7.27026224 0.72973775863647461 0.53251719637978567 +2923 6 6.23462057 0.23462057113647461 0.055046812400405543 +2924 6 6.256033 0.25603294372558594 0.065552868272789055 +2925 5 5.70803 0.70803022384643555 0.50130679788003363 +2926 8 7.411671 0.58832883834838867 0.34613082203236445 +2927 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2928 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2929 6 6.256033 0.25603294372558594 0.065552868272789055 +2930 8 7.243917 0.75608301162719727 0.57166152047125252 +2931 8 7.411671 0.58832883834838867 0.34613082203236445 +2932 6 5.79003048 0.20996952056884766 0.044087199567911739 +2933 6 6.23462057 0.23462057113647461 0.055046812400405543 +2934 5 5.283217 0.28321695327758789 0.080211842623839402 +2935 4 4.40132046 0.40132045745849609 0.16105810957469657 +2936 5 5.679378 0.67937803268432617 0.46155451129402536 +2937 5 5.70803 0.70803022384643555 0.50130679788003363 +2938 8 7.24698639 0.75301361083984375 0.56702949811005965 +2939 8 7.24698639 0.75301361083984375 0.56702949811005965 +2940 6 6.015029 0.015028953552246094 0.00022586944487557048 +2941 5 5.612932 0.61293220520019531 0.37568588817157433 +2942 5 5.347385 0.34738492965698242 0.12067628935278663 +2943 8 7.24698639 0.75301361083984375 0.56702949811005965 +2944 6 6.015029 0.015028953552246094 0.00022586944487557048 +2945 8 7.686467 0.31353282928466797 0.098302835039248748 +2946 6 6.27776 0.27776002883911133 0.077150633620703957 +2947 6 6.27776 0.27776002883911133 0.077150633620703957 +2948 6 5.29857063 0.70142936706542969 0.4920031569818093 +2949 6 5.494495 0.50550508499145508 0.25553539095221822 +2950 5 4.77643776 0.22356224060058594 0.049980075422354275 +2951 5 5.552394 0.55239391326904297 0.30513903541668697 +2952 5 4.928295 0.071704864501953125 0.0051415875932434574 +2953 5 4.77643776 0.22356224060058594 0.049980075422354275 +2954 7 6.866023 0.13397693634033203 0.017949819471141382 +2955 5 6.01920748 1.0192074775695801 1.0387838823337461 +2956 6 5.89857435 0.1014256477355957 0.01028716201858515 +2957 6 6.41994429 0.41994428634643555 0.17635320363501705 +2958 5 5.552394 0.55239391326904297 0.30513903541668697 +2959 7 6.62191057 0.37808942794799805 0.14295161552604441 +2960 7 6.618574 0.38142585754394531 0.14548568480313406 +2961 6 6.2394104 0.239410400390625 0.057317339815199375 +2962 5 5.42872238 0.42872238159179688 0.18380288047774229 +2963 7 6.95440626 0.045593738555908203 0.0020787889955045102 +2964 5 5.79420662 0.79420661926269531 0.63076415408067987 +2965 8 7.7110405 0.28895950317382813 0.083497594474465586 +2966 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2967 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2968 5 5.54127026 0.54127025604248047 0.29297349007629236 +2969 6 6.31686449 0.3168644905090332 0.10040310534554919 +2970 5 5.54127026 0.54127025604248047 0.29297349007629236 +2971 5 5.045367 0.045366764068603516 0.002058143282056335 +2972 6 5.917624 0.082376003265380859 0.006785805913978038 +2973 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2974 6 5.935218 0.064782142639160156 0.0041967260049204924 +2975 6 5.877206 0.12279415130615234 0.015078403594998235 +2976 6 6.488263 0.48826313018798828 0.23840088430097239 +2977 6 5.50998831 0.49001169204711914 0.24011145834288072 +2978 6 5.50998831 0.49001169204711914 0.24011145834288072 +2979 7 6.82792854 0.17207145690917969 0.029608586282847682 +2980 7 6.935555 0.064445018768310547 0.0041531604440478986 +2981 7 6.40632153 0.59367847442626953 0.35245413099710277 +2982 6 5.90127659 0.098723411560058594 0.0097463119900567108 +2983 6 6.29355 0.29355001449584961 0.086171611010513516 +2984 6 5.86181259 0.13818740844726563 0.019095759853371419 +2985 7 6.436311 0.56368923187255859 0.31774555012907513 +2986 7 6.436311 0.56368923187255859 0.31774555012907513 +2987 7 6.436311 0.56368923187255859 0.31774555012907513 +2988 7 6.269313 0.73068714141845703 0.53390369863427622 +2989 6 6.10555744 0.10555744171142578 0.011142373500661051 +2990 7 7.20846272 0.20846271514892578 0.04345670360726217 +2991 7 6.710715 0.28928518295288086 0.083685917076081751 +2992 7 6.5014677 0.49853229522705078 0.24853444938435132 +2993 7 6.436311 0.56368923187255859 0.31774555012907513 +2994 7 6.436311 0.56368923187255859 0.31774555012907513 +2995 6 6.129989 0.1299891471862793 0.016897178386216183 +2996 8 6.42057562 1.5794243812561035 2.4945813761062254 +2997 6 6.217876 0.21787595748901367 0.047469932851754493 +2998 7 6.66316128 0.33683872222900391 0.11346032479286805 +2999 7 6.436311 0.56368923187255859 0.31774555012907513 +3000 7 6.436311 0.56368923187255859 0.31774555012907513 +3001 7 6.5014677 0.49853229522705078 0.24853444938435132 +3002 7 6.710715 0.28928518295288086 0.083685917076081751 +3003 7 6.269313 0.73068714141845703 0.53390369863427622 +3004 6 6.32833624 0.32833623886108398 0.1078046857494428 +3005 6 6.53760242 0.53760242462158203 0.28901636695900379 +3006 6 6.10555744 0.10555744171142578 0.011142373500661051 +3007 7 7.20846272 0.20846271514892578 0.04345670360726217 +3008 7 7.2333436 0.23334360122680664 0.054449236233494958 +3009 6 5.714875 0.28512477874755859 0.081296139455844241 +3010 5 5.49859047 0.49859046936035156 0.24859245613697567 +3011 6 6.578227 0.57822704315185547 0.33434651343213773 +3012 6 6.490192 0.49019193649291992 0.24028813460267884 +3013 6 6.142816 0.14281606674194336 0.02039642891963922 +3014 6 5.70586872 0.29413127899169922 0.086513209281292802 +3015 6 6.18539858 0.18539857864379883 0.034372632963140859 +3016 6 6.142816 0.14281606674194336 0.02039642891963922 +3017 6 6.595993 0.5959930419921875 0.35520770610310137 +3018 8 6.70484924 1.2951507568359375 1.6774154829327017 +3019 6 6.18539858 0.18539857864379883 0.034372632963140859 +3020 6 5.724778 0.27522182464599609 0.075747052761471423 +3021 4 4.71791 0.71790981292724609 0.51539449949723348 +3022 5 4.8001194 0.19988059997558594 0.039952254246600205 +3023 6 5.70586872 0.29413127899169922 0.086513209281292802 +3024 6 6.142816 0.14281606674194336 0.02039642891963922 +3025 7 6.297473 0.70252704620361328 0.49354425064757379 +3026 6 5.74832726 0.25167274475097656 0.063339170450490201 +3027 5 5.63797855 0.63797855377197266 0.40701663507297781 +3028 6 6.04139233 0.041392326354980469 0.0017133246810772107 +3029 8 7.32478333 0.6752166748046875 0.45591755793429911 +3030 8 7.32478333 0.6752166748046875 0.45591755793429911 +3031 6 5.770422 0.22957801818847656 0.052706066435348475 +3032 5 6.11206055 1.112060546875 1.2366786599159241 +3033 6 5.547751 0.45224905014038086 0.20452920335287672 +3034 6 5.473764 0.52623605728149414 0.27692438798317198 +3035 7 6.44003153 0.55996847152709961 0.31356468910439617 +3036 5 5.454294 0.45429420471191406 0.20638322443483048 +3037 6 5.60835171 0.39164829254150391 0.15338838505067542 +3038 6 6.35107 0.35106992721557617 0.12325009379514995 +3039 6 5.549563 0.45043706893920898 0.20289355307454571 +3040 5 5.781478 0.78147792816162109 0.61070775220377982 +3041 6 5.62197447 0.37802553176879883 0.14290330266908313 +3042 6 5.60835171 0.39164829254150391 0.15338838505067542 +3043 6 5.745906 0.25409412384033203 0.064563823770185991 +3044 6 5.62443 0.37556982040405273 0.14105268999833243 +3045 6 6.139705 0.13970518112182617 0.019517537632282256 +3046 6 6.6571207 0.65712070465087891 0.43180762048086763 +3047 5 6.00035667 1.0003566741943359 1.0007134756051528 +3048 6 5.87789154 0.12210845947265625 0.014910475874785334 +3049 5 5.17909861 0.17909860610961914 0.032076310710408507 +3050 4 4.05022049 0.050220489501953125 0.002522097565815784 +3051 5 5.17909861 0.17909860610961914 0.032076310710408507 +3052 7 6.18944025 0.81055974960327148 0.65700710767691817 +3053 5 5.895031 0.89503097534179688 0.80108044682128821 +3054 6 6.16691256 0.16691255569458008 0.027859801248496296 +3055 6 6.18159342 0.18159341812133789 0.032976169504991049 +3056 5 5.956998 0.95699787139892578 0.91584492586207489 +3057 5 6.58366 1.5836601257324219 2.5079793938348303 +3058 5 5.5251646 0.52516460418701172 0.27579786149090069 +3059 6 5.821914 0.1780858039855957 0.031714553581196014 +3060 5 5.609995 0.60999488830566406 0.37209376375903958 +3061 5 5.609995 0.60999488830566406 0.37209376375903958 +3062 8 7.084814 0.91518592834472656 0.83756528344019898 +3063 5 5.609995 0.60999488830566406 0.37209376375903958 +3064 5 5.29221535 0.29221534729003906 0.08538980919183814 +3065 6 6.29819 0.29819011688232422 0.088917345806294179 +3066 5 5.29221535 0.29221534729003906 0.08538980919183814 +3067 4 5.599751 1.5997509956359863 2.5592032480383295 +3068 6 6.56485462 0.56485462188720703 0.31906074386733962 +3069 8 6.26474047 1.7352595329284668 3.0111256466191207 +3070 8 7.084814 0.91518592834472656 0.83756528344019898 +3071 7 6.44469547 0.55530452728271484 0.30836311802067939 +3072 6 6.57061625 0.57061624526977539 0.32560289936577647 +3073 5 6.649056 1.6490559577941895 2.7193855519365115 +3074 5 6.186977 1.1869769096374512 1.4089141840124739 +3075 7 6.56810045 0.4318995475769043 0.18653721919713462 +3076 5 5.397916 0.39791584014892578 0.15833701584142545 +3077 5 5.5251646 0.52516460418701172 0.27579786149090069 +3078 5 6.315502 1.3155021667480469 1.7305459507188061 +3079 5 5.47873354 0.47873353958129883 0.22918580192003901 +3080 6 5.821914 0.1780858039855957 0.031714553581196014 +3081 5 5.609995 0.60999488830566406 0.37209376375903958 +3082 6 5.750258 0.24974203109741211 0.062371082096660757 +3083 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3084 6 6.36839533 0.36839532852172852 0.13571511807663228 +3085 6 5.86258459 0.13741540908813477 0.018882994654859431 +3086 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3087 3 5.453733 2.453732967376709 6.0208054751913096 +3088 6 6.26444435 0.26444435119628906 0.069930814879626269 +3089 7 6.818311 0.18168878555297852 0.033010814795716215 +3090 6 6.36839533 0.36839532852172852 0.13571511807663228 +3091 6 5.36129951 0.63870048522949219 0.40793830983238877 +3092 6 6.025925 0.025925159454345703 0.0006721138927332504 +3093 7 6.56711 0.43288993835449219 0.18739369872855605 +3094 6 5.42497349 0.57502651214599609 0.33065548967078939 +3095 6 5.42497349 0.57502651214599609 0.33065548967078939 +3096 7 6.43372345 0.56627655029296875 0.32066913141170517 +3097 5 5.12878942 0.12878942489624023 0.016586715965104304 +3098 7 6.50207567 0.4979243278503418 0.24792863626521466 +3099 7 6.64832 0.35167980194091797 0.12367868309320329 +3100 7 6.737263 0.26273679733276367 0.069030624672677732 +3101 6 6.020496 0.020495891571044922 0.00042008157129203028 +3102 6 5.56049442 0.43950557708740234 0.19316515229093056 +3103 7 6.56711 0.43288993835449219 0.18739369872855605 +3104 5 5.87965727 0.87965726852416992 0.77379691006740359 +3105 6 5.9182477 0.081752300262451172 0.0066834385982019739 +3106 6 6.025925 0.025925159454345703 0.0006721138927332504 +3107 6 5.901361 0.098639011383056641 0.0097296545666267775 +3108 5 5.305002 0.30500221252441406 0.093026349644787842 +3109 4 5.36367941 1.3636794090270996 1.8596215306044996 +3110 6 6.229444 0.22944402694702148 0.052644561501665521 +3111 7 6.483191 0.51680898666381836 0.26709152869648278 +3112 5 5.716676 0.71667623519897461 0.51362482609897597 +3113 6 5.562755 0.43724489212036133 0.19118309568534642 +3114 6 6.102161 0.10216093063354492 0.010436855747911977 +3115 6 6.102161 0.10216093063354492 0.010436855747911977 +3116 7 6.567311 0.43268918991088867 0.18721993506574108 +3117 7 6.483191 0.51680898666381836 0.26709152869648278 +3118 7 6.90226 0.09774017333984375 0.009553141484502703 +3119 5 4.711436 0.28856420516967773 0.083269300505207866 +3120 6 5.511379 0.48862123489379883 0.23875071118914093 +3121 5 5.716676 0.71667623519897461 0.51362482609897597 +3122 6 6.73026 0.73025989532470703 0.53327951471965207 +3123 5 5.64247 0.64246988296508789 0.41276755051717373 +3124 6 5.562755 0.43724489212036133 0.19118309568534642 +3125 5 5.879442 0.87944221496582031 0.7734186094639881 +3126 7 6.26043272 0.73956727981567383 0.54695976137395519 +3127 5 5.368305 0.36830520629882813 0.13564872498682234 +3128 6 6.38585234 0.38585233688354492 0.14888202587849264 +3129 6 6.175245 0.17524480819702148 0.030710742800010848 +3130 6 6.560212 0.56021213531494141 0.31383763655412622 +3131 5 5.25830126 0.2583012580871582 0.066719539929408711 +3132 6 6.102161 0.10216093063354492 0.010436855747911977 +3133 6 6.73824167 0.73824167251586914 0.54500076703902778 +3134 6 6.15627337 0.15627336502075195 0.02442136461490918 +3135 6 5.55375862 0.44624137878417969 0.19913136813920573 +3136 5 5.8716464 0.87164640426635742 0.75976745407047019 +3137 6 5.95852041 0.041479587554931641 0.0017205561837272398 +3138 6 6.225504 0.22550392150878906 0.050852018615842098 +3139 6 5.814783 0.18521690368652344 0.034305301411222899 +3140 6 5.55375862 0.44624137878417969 0.19913136813920573 +3141 7 5.85702229 1.1429777145385742 1.3063980559318225 +3142 6 5.999185 0.00081491470336914063 6.6408597376721445E-07 +3143 5 5.8716464 0.87164640426635742 0.75976745407047019 +3144 6 5.840115 0.15988492965698242 0.025563190731418217 +3145 6 5.840115 0.15988492965698242 0.025563190731418217 +3146 6 5.840115 0.15988492965698242 0.025563190731418217 +3147 6 5.802998 0.19700193405151367 0.038809762020036942 +3148 6 5.840115 0.15988492965698242 0.025563190731418217 +3149 6 5.802998 0.19700193405151367 0.038809762020036942 +3150 6 6.671808 0.67180776596069336 0.45132567440509774 +3151 6 5.840115 0.15988492965698242 0.025563190731418217 +3152 6 6.17364931 0.17364931106567383 0.030154083233583151 +3153 6 6.669533 0.66953277587890625 0.44827413797611371 +3154 6 6.88131046 0.88131046295166016 0.77670813210806955 +3155 7 6.8698163 0.13018369674682617 0.016947794898669599 +3156 5 5.460132 0.46013212203979492 0.21172156973284473 +3157 7 6.8698163 0.13018369674682617 0.016947794898669599 +3158 7 6.9617424 0.038257598876953125 0.001463643871829845 +3159 6 6.20943069 0.20943069458007813 0.043861215832293965 +3160 6 5.582661 0.41733884811401367 0.17417171414513177 +3161 5 5.460132 0.46013212203979492 0.21172156973284473 +3162 7 6.8698163 0.13018369674682617 0.016947794898669599 +3163 7 6.9617424 0.038257598876953125 0.001463643871829845 +3164 6 5.9588995 0.041100502014160156 0.0016892512658159831 +3165 6 5.76335 0.23664999008178711 0.056003217805709937 +3166 6 6.567506 0.56750583648681641 0.3220628744466012 +3167 7 6.727232 0.27276802062988281 0.074402393078344176 +3168 6 6.314619 0.31461906433105469 0.098985155640548328 +3169 6 6.04131937 0.041319370269775391 0.0017072903594907984 +3170 6 5.893462 0.10653781890869141 0.011350306857821124 +3171 6 6.27120447 0.27120447158813477 0.073551865409399397 +3172 8 7.01964664 0.98035335540771484 0.96109270145916526 +3173 8 7.137502 0.86249780654907227 0.74390246630196089 +3174 8 7.38588428 0.61411571502685547 0.37713811144294596 +3175 6 5.956482 0.04351806640625 0.0018938221037387848 +3176 6 6.27120447 0.27120447158813477 0.073551865409399397 +3177 5 5.549956 0.54995584487915039 0.30245143131674013 +3178 6 6.112071 0.11207103729248047 0.012559917399812548 +3179 4 5.460645 1.4606451988220215 2.1334843968418227 +3180 6 6.260092 0.26009178161621094 0.067647734864294762 +3181 6 6.149753 0.14975309371948242 0.022425989078556086 +3182 5 5.53198862 0.53198862075805664 0.28301189261605941 +3183 6 6.260092 0.26009178161621094 0.067647734864294762 +3184 7 6.457229 0.5427708625793457 0.29460020926512698 +3185 6 6.27707863 0.27707862854003906 0.076772566393628949 +3186 4 4.737908 0.73790788650512695 0.54450804896646332 +3187 7 6.44776058 0.55223941802978516 0.3049683748258758 +3188 8 6.308009 1.691990852355957 2.862833044456238 +3189 5 6.036736 1.036736011505127 1.0748215575515587 +3190 7 6.996594 0.0034060478210449219 1.160116175924486E-05 +3191 6 6.10141 0.101409912109375 0.010283970274031162 +3192 6 6.149753 0.14975309371948242 0.022425989078556086 +3193 5 5.53198862 0.53198862075805664 0.28301189261605941 +3194 5 5.19183826 0.19183826446533203 0.036801919713070674 +3195 6 6.2820797 0.28207969665527344 0.079568955265131081 +3196 7 6.61394024 0.38605976104736328 0.14904213909994724 +3197 6 6.402557 0.4025568962097168 0.1620520546860007 +3198 7 6.61394024 0.38605976104736328 0.14904213909994724 +3199 7 6.70577955 0.2942204475402832 0.08656567175080454 +3200 7 6.81074572 0.1892542839050293 0.035817183976405431 +3201 6 6.402557 0.4025568962097168 0.1620520546860007 +3202 7 6.84895468 0.15104532241821289 0.022814689424421886 +3203 7 6.61394024 0.38605976104736328 0.14904213909994724 +3204 5 5.48264647 0.48264646530151367 0.23294761046804524 +3205 7 6.76702261 0.23297739028930664 0.054278464386015912 +3206 7 6.777936 0.22206401824951172 0.049312428201119474 +3207 6 5.86778831 0.13221168518066406 0.017479929698311025 +3208 5 6.073227 1.0732269287109375 1.1518160405103117 +3209 5 5.365314 0.36531400680541992 0.13345432356823039 +3210 5 5.175463 0.17546319961547852 0.03078733441930126 +3211 6 6.193272 0.19327211380004883 0.037354109972739025 +3212 5 5.83470726 0.83470726013183594 0.69673621011679643 +3213 6 6.04824352 0.048243522644042969 0.0023274374771062867 +3214 6 6.07760859 0.077608585357666016 0.0060230925212181319 +3215 6 6.147291 0.14729118347167969 0.021694692728488008 +3216 5 5.89868069 0.89868068695068359 0.80762697709815257 +3217 5 5.175463 0.17546319961547852 0.03078733441930126 +3218 4 4.90641737 0.9064173698425293 0.82159244835224854 +3219 7 7.13684654 0.13684654235839844 0.018726976155448938 +3220 5 5.536415 0.53641510009765625 0.28774115961277857 +3221 6 6.02255154 0.022551536560058594 0.00050857180121965939 +3222 6 6.53903437 0.53903436660766602 0.29055804838412769 +3223 6 6.193272 0.19327211380004883 0.037354109972739025 +3224 6 6.168674 0.16867399215698242 0.028450915630173768 +3225 7 6.79089451 0.20910549163818359 0.043725106633246469 +3226 6 5.96571875 0.034281253814697266 0.0011752043631076958 +3227 6 5.392663 0.60733699798583984 0.36885822912245203 +3228 6 5.51099634 0.48900365829467773 0.23912457782557794 +3229 7 6.381079 0.61892080307006836 0.38306296047289834 +3230 6 5.647422 0.35257816314697266 0.12431136112809327 +3231 6 6.31671429 0.31671428680419922 0.10030793946589256 +3232 5 5.90930843 0.90930843353271484 0.82684182729371969 +3233 6 6.274285 0.27428483963012695 0.075232173250924461 +3234 6 5.78508043 0.2149195671081543 0.046190420325956438 +3235 6 6.168674 0.16867399215698242 0.028450915630173768 +3236 6 6.614271 0.61427116394042969 0.37732906284873025 +3237 7 6.357264 0.64273595809936523 0.41310951183390898 +3238 5 5.51993227 0.51993227005004883 0.2703295654393969 +3239 7 6.6237483 0.3762516975402832 0.14156533990194475 +3240 6 6.074398 0.074398040771484375 0.0055350684706354514 +3241 7 6.13906431 0.86093568801879883 0.74121025890440251 +3242 6 6.95612049 0.95612049102783203 0.91416639336330263 +3243 7 6.6237483 0.3762516975402832 0.14156533990194475 +3244 7 6.856632 0.14336776733398438 0.020554316710331477 +3245 5 5.51993227 0.51993227005004883 0.2703295654393969 +3246 6 6.32359934 0.32359933853149414 0.10471653189802055 +3247 6 6.28690243 0.28690242767333984 0.082313003004856 +3248 7 6.317185 0.6828150749206543 0.46623642653889874 +3249 7 6.357264 0.64273595809936523 0.41310951183390898 +3250 6 6.52457333 0.52457332611083984 0.27517717446698953 +3251 6 5.6693964 0.33060359954833984 0.10929874003431905 +3252 8 6.88262463 1.117375373840332 1.2485277260648218 +3253 8 6.66403246 1.3359675407409668 1.7848092699134668 +3254 5 5.88028955 0.88028955459594727 0.77490969993073122 +3255 6 6.133121 0.13312101364135742 0.017721204272902469 +3256 6 6.133121 0.13312101364135742 0.017721204272902469 +3257 6 6.133121 0.13312101364135742 0.017721204272902469 +3258 6 6.133121 0.13312101364135742 0.017721204272902469 +3259 6 6.133121 0.13312101364135742 0.017721204272902469 +3260 6 6.133121 0.13312101364135742 0.017721204272902469 +3261 5 6.556014 1.5560140609741211 2.4211797579491758 +3262 7 6.204937 0.79506301879882813 0.63212520386150572 +3263 8 6.869174 1.1308259963989258 1.2787674341316233 +3264 6 5.47448063 0.52551937103271484 0.27617060933062021 +3265 3 4.56640053 1.5664005279541016 2.4536106139748881 +3266 6 6.52271175 0.52271175384521484 0.27322757760794047 +3267 6 5.576181 0.42381906509399414 0.17962259993714724 +3268 6 6.648331 0.6483311653137207 0.42033329991704704 +3269 5 5.18465376 0.18465375900268555 0.034097010713821874 +3270 5 5.78017 0.78016996383666992 0.60866517247291085 +3271 7 6.688666 0.31133413314819336 0.096928942463136991 +3272 7 6.319661 0.68033885955810547 0.46286096382482356 +3273 7 6.793628 0.20637178421020508 0.04258931331810345 +3274 5 6.479464 1.479464054107666 2.1888138873966909 +3275 4 4.61452627 0.61452627182006836 0.37764253875707254 +3276 8 6.66012573 1.339874267578125 1.7952630529180169 +3277 7 6.210549 0.78945112228393555 0.62323307447536536 +3278 5 5.18465376 0.18465375900268555 0.034097010713821874 +3279 6 6.091817 0.091816902160644531 0.0084303435223773704 +3280 5 5.78017 0.78016996383666992 0.60866517247291085 +3281 6 6.48334169 0.48334169387817383 0.2336191930410223 +3282 7 6.691475 0.30852508544921875 0.095187728351447731 +3283 6 5.847695 0.15230512619018555 0.023196851463808343 +3284 6 6.751086 0.75108623504638672 0.56413053247615608 +3285 7 6.57282352 0.42717647552490234 0.18247974124187749 +3286 7 6.57282352 0.42717647552490234 0.18247974124187749 +3287 7 6.57282352 0.42717647552490234 0.18247974124187749 +3288 6 5.847695 0.15230512619018555 0.023196851463808343 +3289 5 5.367988 0.36798810958862305 0.13541524879860845 +3290 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3291 8 7.53098869 0.46901130676269531 0.21997160587125109 +3292 5 5.36597061 0.36597061157226563 0.13393448853457812 +3293 7 6.54328 0.45671987533569336 0.20859304452665128 +3294 6 5.946947 0.053052902221679688 0.0028146104341431055 +3295 5 5.36597061 0.36597061157226563 0.13393448853457812 +3296 5 5.367988 0.36798810958862305 0.13541524879860845 +3297 5 5.321794 0.32179403305053711 0.10355139970693017 +3298 6 6.76998663 0.76998662948608398 0.59287940958733998 +3299 7 6.75744724 0.24255275726318359 0.058831840055972862 +3300 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3301 8 7.53098869 0.46901130676269531 0.21997160587125109 +3302 6 6.59227753 0.59227752685546875 0.35079266881803051 +3303 7 7.045722 0.045722007751464844 0.0020905019928250113 +3304 7 6.83139038 0.168609619140625 0.028429203666746616 +3305 7 6.95902634 0.040973663330078125 0.0016788410866865888 +3306 7 6.83139038 0.168609619140625 0.028429203666746616 +3307 3 4.19923735 1.1992373466491699 1.4381702135981413 +3308 6 5.727543 0.27245712280273438 0.07423288376594428 +3309 7 6.90530252 0.094697475433349609 0.0089676118534498528 +3310 7 6.746764 0.25323581695556641 0.064128378989153134 +3311 7 6.39761066 0.60238933563232422 0.36287291168355296 +3312 7 6.65214872 0.34785127639770508 0.12100051049151261 +3313 7 6.506664 0.49333620071411133 0.24338060693503394 +3314 6 5.32326746 0.67673254013061523 0.45796693087163476 +3315 7 6.48382568 0.51617431640625 0.26643592491745949 +3316 6 6.051728 0.051727771759033203 0.002675762371154633 +3317 6 6.13208 0.132080078125 0.017445147037506104 +3318 7 6.81349325 0.18650674819946289 0.034784767123937854 +3319 5 5.759015 0.75901508331298828 0.57610389669662254 +3320 5 5.567959 0.56795883178710938 0.322577234604978 +3321 6 6.4950285 0.49502849578857422 0.24505321164269844 +3322 7 6.713452 0.28654813766479492 0.082109835199162262 +3323 6 6.312879 0.31287908554077148 0.0978933221688294 +3324 6 6.12515831 0.12515830993652344 0.015664602546166861 +3325 7 6.8268137 0.17318630218505859 0.029993495264534431 +3326 5 5.93371534 0.9337153434753418 0.87182434264127551 +3327 7 6.38604975 0.61395025253295898 0.37693491258528411 +3328 5 6.126393 1.1263928413391113 1.2687608330199964 +3329 6 6.249068 0.24906778335571289 0.062034760705728331 +3330 6 5.88103676 0.11896324157714844 0.014152252846542979 +3331 6 5.950097 0.049902915954589844 0.0024903010207708576 +3332 7 6.466661 0.53333902359008789 0.28445051408402833 +3333 6 6.00232363 0.0023236274719238281 5.3992446282791207E-06 +3334 6 6.16842842 0.16842842102050781 0.028368133007461438 +3335 6 5.741354 0.25864601135253906 0.066897759188577766 +3336 6 5.741354 0.25864601135253906 0.066897759188577766 +3337 6 5.741354 0.25864601135253906 0.066897759188577766 +3338 6 5.58105755 0.41894245147705078 0.17551277764960105 +3339 6 5.836304 0.1636958122253418 0.026796318940114361 +3340 6 6.23716974 0.23716974258422852 0.056249486797469217 +3341 6 5.836304 0.1636958122253418 0.026796318940114361 +3342 5 6.093224 1.093224048614502 1.1951388204690829 +3343 7 5.741354 1.2586460113525391 1.5841897818936559 +3344 6 5.741354 0.25864601135253906 0.066897759188577766 +3345 6 5.95065975 0.049340248107910156 0.0024344600833501318 +3346 6 5.890304 0.1096959114074707 0.012033192979515661 +3347 6 5.88841 0.11158990859985352 0.012452307701323662 +3348 6 5.58105755 0.41894245147705078 0.17551277764960105 +3349 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3350 6 6.129016 0.12901592254638672 0.016645108270495257 +3351 6 6.40267134 0.40267133712768555 0.16214420574419819 +3352 6 6.60754 0.60754013061523438 0.36910501030797604 +3353 6 6.53815842 0.53815841674804688 0.2896144815167645 +3354 7 6.82739 0.17260980606079102 0.029794145148343887 +3355 6 6.443502 0.44350194931030273 0.19669397904203834 +3356 6 6.09565973 0.095659732818603516 0.0091507844829266105 +3357 7 6.59177446 0.40822553634643555 0.16664808852533497 +3358 6 6.60754 0.60754013061523438 0.36910501030797604 +3359 6 6.53815842 0.53815841674804688 0.2896144815167645 +3360 7 6.087488 0.91251182556152344 0.83267783178962418 +3361 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3362 6 6.129016 0.12901592254638672 0.016645108270495257 +3363 6 6.40267134 0.40267133712768555 0.16214420574419819 +3364 6 6.03455544 0.034555435180664063 0.0011940781005250756 +3365 7 6.484774 0.51522588729858398 0.26545771494261317 +3366 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3367 6 6.4610076 0.46100759506225586 0.21252800270508487 +3368 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3369 7 6.464667 0.53533315658569336 0.28658158854000249 +3370 6 6.4610076 0.46100759506225586 0.21252800270508487 +3371 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3372 6 6.33648157 0.33648157119750977 0.11321984775554483 +3373 7 6.817031 0.18296909332275391 0.033477689111350628 +3374 5 5.506074 0.50607395172119141 0.25611084461070277 +3375 6 5.95384169 0.046158313751220703 0.0021305899283561303 +3376 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3377 6 6.000979 0.00097894668579101563 9.5833661362121347E-07 +3378 8 6.860549 1.1394510269165039 1.2983486427410753 +3379 5 5.253192 0.25319194793701172 0.064106162500138453 +3380 7 6.84210443 0.15789556503295898 0.02493100945707738 +3381 7 6.22156429 0.77843570709228516 0.60596215007626597 +3382 7 6.84210443 0.15789556503295898 0.02493100945707738 +3383 6 6.42233229 0.4223322868347168 0.1783645605030415 +3384 6 6.102439 0.10243892669677734 0.010493733702787722 +3385 6 6.48315859 0.48315858840942383 0.23344222155378702 +3386 8 6.860549 1.1394510269165039 1.2983486427410753 +3387 5 5.253192 0.25319194793701172 0.064106162500138453 +3388 6 6.038348 0.038348197937011719 0.0014705842850162298 +3389 7 6.234303 0.76569700241088867 0.58629189950102045 +3390 6 6.80156469 0.80156469345092773 0.64250595778707975 +3391 8 6.80156469 1.1984353065490723 1.4362471839833688 +3392 6 6.67221975 0.67221975326538086 0.45187939668016952 +3393 6 6.48170137 0.48170137405395508 0.23203621376546835 +3394 5 5.35709572 0.35709571838378906 0.12751735208803439 +3395 5 5.31360435 0.31360435485839844 0.098347691386152292 +3396 6 5.980254 0.019745826721191406 0.00038989767290331656 +3397 6 6.015499 0.015499114990234375 0.00024022256548050791 +3398 5 5.31912756 0.31912755966186523 0.10184239933573735 +3399 6 6.43055 0.43055009841918945 0.18537338724877372 +3400 6 5.44203234 0.5579676628112793 0.31132791274308147 +3401 5 5.95098972 0.95098972320556641 0.90438145364259981 +3402 6 5.44203234 0.5579676628112793 0.31132791274308147 +3403 5 5.68300056 0.68300056457519531 0.46648977121003554 +3404 6 5.44582033 0.55417966842651367 0.30711510489732063 +3405 6 6.039283 0.039282798767089844 0.0015431382789756753 +3406 6 6.43055 0.43055009841918945 0.18537338724877372 +3407 5 5.31912756 0.31912755966186523 0.10184239933573735 +3408 6 5.49072456 0.50927543640136719 0.25936147012180299 +3409 3 5.471312 2.4713120460510254 6.1073832289569054 +3410 7 6.274226 0.72577381134033203 0.52674762522747187 +3411 6 6.147217 0.147216796875 0.02167278528213501 +3412 6 5.83013964 0.1698603630065918 0.028852542920731139 +3413 6 5.648756 0.35124397277832031 0.12337232841309742 +3414 7 6.274226 0.72577381134033203 0.52674762522747187 +3415 7 6.80660629 0.19339370727539063 0.037401126013719477 +3416 6 5.683732 0.31626796722412109 0.10002542709207773 +3417 4 5.429571 1.4295711517333984 2.0436736778683553 +3418 6 5.683732 0.31626796722412109 0.10002542709207773 +3419 7 6.80660629 0.19339370727539063 0.037401126013719477 +3420 5 5.32444048 0.32444047927856445 0.10526162459450461 +3421 8 6.66276455 1.3372354507446289 1.7881986507281908 +3422 8 6.97727 1.0227298736572266 1.0459763944709266 +3423 5 5.98238659 0.98238658905029297 0.9650834103458692 +3424 6 6.4767437 0.47674369812011719 0.22728455369724543 +3425 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3426 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3427 6 6.39636 0.39635992050170898 0.15710118658012107 +3428 6 6.4767437 0.47674369812011719 0.22728455369724543 +3429 5 5.98238659 0.98238658905029297 0.9650834103458692 +3430 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3431 6 5.904046 0.095953941345214844 0.0092071588596809306 +3432 5 5.87699652 0.87699651718139648 0.76912289114829946 +3433 7 6.87964058 0.12035942077636719 0.014486390169622609 +3434 6 6.014669 0.014668941497802734 0.00021517784466595913 +3435 6 6.30498 0.30497980117797852 0.093012679126559306 +3436 6 6.01969671 0.019696712493896484 0.00038796048306721787 +3437 5 5.11366749 0.11366748809814453 0.012920297850541829 +3438 5 5.14675951 0.1467595100402832 0.021538353787263986 +3439 5 5.11366749 0.11366748809814453 0.012920297850541829 +3440 5 6.2240715 1.2240715026855469 1.4983510436868528 +3441 5 6.060459 1.0604591369628906 1.1245735811680788 +3442 7 6.419583 0.58041715621948242 0.33688407523391106 +3443 6 5.80606031 0.1939396858215332 0.037612601736555007 +3444 5 5.14675951 0.1467595100402832 0.021538353787263986 +3445 8 7.46482372 0.53517627716064453 0.28641364763552701 +3446 6 5.554438 0.44556188583374023 0.19852539410771897 +3447 6 5.911977 0.088023185729980469 0.0077480812260546372 +3448 7 6.88186169 0.11813831329345703 0.013956661067823006 +3449 8 7.46482372 0.53517627716064453 0.28641364763552701 +3450 7 6.343062 0.65693807601928711 0.43156763572392265 +3451 7 6.343062 0.65693807601928711 0.43156763572392265 +3452 5 5.21926546 0.21926546096801758 0.04807734237351724 +3453 6 6.287645 0.28764486312866211 0.082739567284306759 +3454 5 5.663148 0.66314792633056641 0.43976517219653033 +3455 6 6.118511 0.11851119995117188 0.014044904513866641 +3456 5 5.21130943 0.21130943298339844 0.044651676467765355 +3457 7 6.68455458 0.3154454231262207 0.099505814971280415 +3458 7 6.98832464 0.011675357818603516 0.00013631398019242624 +3459 6 5.715628 0.28437185287475586 0.080867350707421792 +3460 6 6.013219 0.013218879699707031 0.00017473878051532665 +3461 8 6.982139 1.0178608894348145 1.0360407902410316 +3462 6 6.62252235 0.62252235412597656 0.38753408138654777 +3463 7 6.795649 0.20435094833374023 0.041759310084898971 +3464 5 5.5751667 0.57516670227050781 0.33081673540073098 +3465 6 6.67814827 0.67814826965332031 0.45988507563379244 +3466 6 6.62252235 0.62252235412597656 0.38753408138654777 +3467 5 5.500977 0.5009770393371582 0.25097799394302456 +3468 8 6.840452 1.1595478057861328 1.3445511139034352 +3469 6 5.715628 0.28437185287475586 0.080867350707421792 +3470 8 6.982139 1.0178608894348145 1.0360407902410316 +3471 6 6.013219 0.013218879699707031 0.00017473878051532665 +3472 6 6.01919746 0.019197463989257813 0.00036854262361885048 +3473 8 7.03968 0.96031999588012695 0.92221449448720705 +3474 6 5.61084366 0.38915634155273438 0.15144265817070846 +3475 6 5.274944 0.72505617141723633 0.52570645171022079 +3476 8 7.433511 0.56648921966552734 0.32091003599725809 +3477 7 6.277657 0.72234296798706055 0.52177936340035558 +3478 6 5.274944 0.72505617141723633 0.52570645171022079 +3479 7 7.070361 0.070361137390136719 0.0049506896548336954 +3480 8 7.03968 0.96031999588012695 0.92221449448720705 +3481 5 5.62201643 0.62201642990112305 0.38690443906693872 +3482 8 7.16506624 0.83493375778198242 0.69711437988394209 +3483 7 6.988081 0.011919021606445313 0.0001420630760549102 +3484 8 7.433511 0.56648921966552734 0.32091003599725809 +3485 7 5.922049 1.0779509544372559 1.1619782601721909 +3486 6 5.938876 0.061123847961425781 0.0037361247896114946 +3487 6 5.61084366 0.38915634155273438 0.15144265817070846 +3488 6 5.78829956 0.211700439453125 0.044817076064646244 +3489 8 5.86692142 2.1330785751342773 4.5500242076968789 +3490 7 6.277657 0.72234296798706055 0.52177936340035558 +3491 6 5.543023 0.45697689056396484 0.2088278785095099 +3492 7 6.94785261 0.052147388458251953 0.002719350123015829 +3493 7 6.94785261 0.052147388458251953 0.002719350123015829 +3494 6 6.556063 0.55606317520141602 0.30920625481508068 +3495 7 6.27423429 0.72576570510864258 0.52673585871184514 +3496 7 6.67335939 0.32664060592651367 0.10669408544004 +3497 6 6.202401 0.20240116119384766 0.040966230052617902 +3498 6 5.972077 0.027923107147216797 0.00077969991275494976 +3499 7 7.010567 0.010567188262939453 0.00011166546778440534 +3500 7 6.94785261 0.052147388458251953 0.002719350123015829 +3501 6 6.556063 0.55606317520141602 0.30920625481508068 +3502 5 5.308975 0.3089752197265625 0.095465686405077577 +3503 7 6.563628 0.43637180328369141 0.19042035070106067 +3504 7 6.889004 0.11099576950073242 0.012320060847059722 +3505 7 6.65556574 0.34443426132202148 0.11863496037244659 +3506 6 6.23850346 0.23850345611572266 0.056883898579144443 +3507 7 6.84581852 0.15418148040771484 0.023771928900714556 +3508 5 5.308975 0.3089752197265625 0.095465686405077577 +3509 6 5.449322 0.55067777633666992 0.30324601335109946 +3510 6 6.24513245 0.2451324462890625 0.060089916223660111 +3511 7 6.18416262 0.81583738327026367 0.6655906359412711 +3512 6 6.517426 0.5174260139465332 0.26772967990859797 +3513 6 6.079972 0.079971790313720703 0.0063954872459817125 +3514 6 6.457934 0.45793390274047852 0.20970345927912604 +3515 7 6.49270153 0.50729846954345703 0.2573517372011338 +3516 7 6.91192055 0.088079452514648438 0.007757989955280209 +3517 7 6.699911 0.30008888244628906 0.090053337367862696 +3518 5 5.56025028 0.56025028228759766 0.31388037880333286 +3519 7 6.91017151 0.0898284912109375 0.0080691578332334757 +3520 5 5.1707406 0.17074060440063477 0.02915235399109406 +3521 7 6.501419 0.4985809326171875 0.24858294636942446 +3522 5 5.311646 0.3116459846496582 0.097123219748254996 +3523 5 5.1707406 0.17074060440063477 0.02915235399109406 +3524 6 6.429056 0.42905616760253906 0.18408919495777809 +3525 6 6.429056 0.42905616760253906 0.18408919495777809 +3526 6 5.7761054 0.22389459609985352 0.050128790162716541 +3527 6 5.709012 0.29098796844482422 0.084673997779646015 +3528 4 4.35001 0.35000991821289063 0.12250694284739438 +3529 7 6.84373856 0.15626144409179688 0.02441763890965376 +3530 5 5.494679 0.49467897415161133 0.24470728746769055 +3531 5 5.262818 0.2628178596496582 0.069073227350827437 +3532 6 5.934386 0.065614223480224609 0.0043052263229128584 +3533 6 5.83779144 0.16220855712890625 0.026311616005841643 +3534 5 5.494679 0.49467897415161133 0.24470728746769055 +3535 5 5.262818 0.2628178596496582 0.069073227350827437 +3536 6 6.208285 0.20828485488891602 0.043382580776096802 +3537 5 5.483639 0.48363876342773438 0.23390645348990802 +3538 7 6.782946 0.21705389022827148 0.047112391263226527 +3539 6 6.26574755 0.2657475471496582 0.07062175881605981 +3540 6 6.6306076 0.63060760498046875 0.39766595145920292 +3541 6 6.299932 0.29993200302124023 0.089959206436333261 +3542 6 5.786514 0.2134861946105957 0.045576355289313142 +3543 6 6.21291733 0.21291732788085938 0.045333788511925377 +3544 6 6.21291733 0.21291732788085938 0.045333788511925377 +3545 6 6.42701149 0.42701148986816406 0.18233881247942918 +3546 6 5.786514 0.2134861946105957 0.045576355289313142 +3547 6 6.42701149 0.42701148986816406 0.18233881247942918 +3548 6 6.46981049 0.46981048583984375 0.22072189260507002 +3549 6 6.21291733 0.21291732788085938 0.045333788511925377 +3550 6 6.20411634 0.2041163444519043 0.041663482072408442 +3551 6 5.8129344 0.18706560134887695 0.034993539208016955 +3552 6 5.8129344 0.18706560134887695 0.034993539208016955 +3553 6 5.8129344 0.18706560134887695 0.034993539208016955 +3554 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3555 6 6.012086 0.012085914611816406 0.00014606933200411731 +3556 7 6.29893255 0.70106744766235352 0.49149556617180679 +3557 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3558 6 5.8129344 0.18706560134887695 0.034993539208016955 +3559 4 4.42683029 0.42683029174804688 0.18218409795372281 +3560 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3561 5 4.954984 0.045015811920166016 0.0020264233228317607 +3562 6 6.85508347 0.85508346557617188 0.73116773310175631 +3563 5 4.954984 0.045015811920166016 0.0020264233228317607 +3564 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3565 6 5.82309675 0.17690324783325195 0.031294759093952962 +3566 6 6.042418 0.042418003082275391 0.0017992869854879245 +3567 6 6.221795 0.22179508209228516 0.049193058440323512 +3568 7 6.357106 0.64289379119873047 0.41331242676187685 +3569 6 5.82309675 0.17690324783325195 0.031294759093952962 +3570 6 6.221795 0.22179508209228516 0.049193058440323512 +3571 4 4.23669052 0.23669052124023438 0.05602240284497384 +3572 6 6.042418 0.042418003082275391 0.0017992869854879245 +3573 6 6.055631 0.055631160736083984 0.0030948260448440124 +3574 6 5.628368 0.37163209915161133 0.13811041711983307 +3575 7 6.198657 0.80134296417236328 0.6421505462285495 +3576 5 5.53625536 0.5362553596496582 0.28756981075298427 +3577 7 6.521952 0.47804784774780273 0.22852974473630638 +3578 4 4.71375465 0.71375465393066406 0.50944570600768202 +3579 7 6.520844 0.4791560173034668 0.22959048891812017 +3580 5 5.53965044 0.53965044021606445 0.29122259762539215 +3581 7 6.64749527 0.35250473022460938 0.12425958483072463 +3582 6 6.36762857 0.36762857437133789 0.13515076869430231 +3583 6 5.5800705 0.41992950439453125 0.17634078866103664 +3584 7 6.520844 0.4791560173034668 0.22959048891812017 +3585 7 6.106952 0.89304780960083008 0.79753439023284045 +3586 7 6.386778 0.61322212219238281 0.37604137114612968 +3587 6 5.889993 0.11000680923461914 0.012101498077981887 +3588 6 5.889993 0.11000680923461914 0.012101498077981887 +3589 6 5.889993 0.11000680923461914 0.012101498077981887 +3590 7 6.43335152 0.56664848327636719 0.32109050359940738 +3591 5 5.422166 0.42216587066650391 0.1782240223556073 +3592 7 6.39903641 0.60096359252929688 0.36115723954571877 +3593 7 6.386778 0.61322212219238281 0.37604137114612968 +3594 7 6.21197128 0.78802871704101563 0.62098925888130907 +3595 7 6.384263 0.61573696136474609 0.37913200559069082 +3596 7 6.355336 0.64466381072998047 0.41559142886490008 +3597 6 6.1302495 0.1302495002746582 0.016964932321798187 +3598 7 6.663735 0.33626508712768555 0.11307420882098995 +3599 6 5.54587364 0.45412635803222656 0.20623074905961403 +3600 6 6.097955 0.097955226898193359 0.0095952264766765438 +3601 7 6.593367 0.40663290023803711 0.16535031555599744 +3602 6 6.470431 0.47043085098266602 0.22130518555627532 +3603 7 6.99491072 0.0050892829895019531 2.5900801347233937E-05 +3604 6 6.13144875 0.13144874572753906 0.017278772753343219 +3605 5 5.19285 0.19285011291503906 0.037191166051343316 +3606 5 5.31416941 0.31416940689086914 0.098702416226160494 +3607 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3608 6 6.187198 0.18719816207885742 0.035043151885702173 +3609 6 6.187198 0.18719816207885742 0.035043151885702173 +3610 5 5.19285 0.19285011291503906 0.037191166051343316 +3611 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3612 6 5.98245859 0.017541408538818359 0.00030770101352572965 +3613 6 6.187198 0.18719816207885742 0.035043151885702173 +3614 5 5.31416941 0.31416940689086914 0.098702416226160494 +3615 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3616 5 5.17883968 0.17883968353271484 0.031983632406081597 +3617 5 5.800092 0.80009222030639648 0.64014756099481929 +3618 7 5.956605 1.0433950424194336 1.0886732145454516 +3619 6 5.938953 0.061047077178955078 0.0037267456320932979 +3620 7 6.640628 0.35937213897705078 0.1291483342729407 +3621 7 5.956605 1.0433950424194336 1.0886732145454516 +3622 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3623 6 5.938953 0.061047077178955078 0.0037267456320932979 +3624 7 6.782224 0.21777582168579102 0.047426308510921444 +3625 5 5.17883968 0.17883968353271484 0.031983632406081597 +3626 5 5.800092 0.80009222030639648 0.64014756099481929 +3627 5 5.25973225 0.25973224639892578 0.067460839819432294 +3628 6 5.25973225 0.74026775360107422 0.54799634702158073 +3629 6 5.29488373 0.70511627197265625 0.49718895700061694 +3630 6 5.900844 0.099155902862548828 0.0098318930724872189 +3631 6 5.900844 0.099155902862548828 0.0098318930724872189 +3632 6 5.788138 0.21186208724975586 0.044885544013823164 +3633 6 5.900844 0.099155902862548828 0.0098318930724872189 +3634 7 6.45650148 0.54349851608276367 0.29539063698416612 +3635 6 6.089077 0.089076995849609375 0.0079347111895913258 +3636 7 6.637489 0.36251115798950195 0.13141433966688965 +3637 7 6.28777552 0.71222448348999023 0.50726371488258337 +3638 7 6.76056433 0.23943567276000977 0.057329441390038482 +3639 6 6.234292 0.23429203033447266 0.054892755478249455 +3640 6 6.357985 0.35798501968383789 0.1281532743180378 +3641 6 5.833136 0.16686391830444336 0.027843567231911948 +3642 6 5.833136 0.16686391830444336 0.027843567231911948 +3643 6 6.357985 0.35798501968383789 0.1281532743180378 +3644 7 5.92905951 1.0709404945373535 1.1469135428399113 +3645 6 6.23142 0.23142004013061523 0.053555234974055566 +3646 7 5.85718 1.142819881439209 1.3060372814127277 +3647 7 6.691976 0.30802392959594727 0.094878741203729078 +3648 5 6.03854036 1.0385403633117676 1.0785660862277382 +3649 6 6.512135 0.51213502883911133 0.26228228776403739 +3650 4 4.85898256 0.85898256301879883 0.7378510435703447 +3651 6 5.253411 0.74658918380737305 0.55739540937815946 +3652 6 5.90696764 0.093032360076904297 0.0086550200214787765 +3653 6 5.253411 0.74658918380737305 0.55739540937815946 +3654 6 6.11544943 0.11544942855834961 0.01332857055444947 +3655 7 7.151361 0.15136098861694336 0.022910148875098457 +3656 7 6.62748051 0.37251949310302734 0.13877077274173644 +3657 8 6.869378 1.1306219100952148 1.2783059035873521 +3658 7 6.2651124 0.73488759994506836 0.54005978455302284 +3659 8 7.29730844 0.70269155502319336 0.49377542150091358 +3660 8 7.314732 0.68526792526245117 0.46959212939350436 +3661 6 6.14659071 0.1465907096862793 0.021488836166327019 +3662 4 4.47665358 0.4766535758972168 0.22719863141560381 +3663 6 6.59426832 0.5942683219909668 0.35315483852195939 +3664 8 7.26825142 0.73174858093261719 0.53545598569689901 +3665 8 7.29730844 0.70269155502319336 0.49377542150091358 +3666 7 6.25256157 0.74743843078613281 0.55866420781603665 +3667 8 7.314732 0.68526792526245117 0.46959212939350436 +3668 5 5.123465 0.12346506118774414 0.015243621334093405 +3669 7 7.222342 0.22234201431274414 0.04943597132864852 +3670 6 5.395938 0.60406208038330078 0.36489099695700133 +3671 7 6.971204 0.028796195983886719 0.00082922090314241359 +3672 8 7.117149 0.88285112380981445 0.77942610681225233 +3673 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3674 5 5.25115 0.25115013122558594 0.063076388414629037 +3675 6 5.755384 0.24461603164672852 0.059837002938593287 +3676 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3677 6 6.51675129 0.51675128936767578 0.26703189506315539 +3678 5 5.09006453 0.090064525604248047 0.008111618772318252 +3679 7 6.02219152 0.97780847549438477 0.95610941474865285 +3680 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3681 8 6.98234367 1.0176563262939453 1.0356243984460889 +3682 7 6.398295 0.60170507431030273 0.36204899645076694 +3683 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3684 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3685 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3686 5 5.108233 0.10823297500610352 0.011714376878671828 +3687 5 6.19706631 1.1970663070678711 1.4329677435171106 +3688 6 6.434823 0.43482303619384766 0.18907107280483615 +3689 8 6.98234367 1.0176563262939453 1.0356243984460889 +3690 7 6.53908062 0.46091938018798828 0.21244667503287928 +3691 6 6.327841 0.32784080505371094 0.1074795934582653 +3692 7 6.02219152 0.97780847549438477 0.95610941474865285 +3693 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3694 5 5.09006453 0.090064525604248047 0.008111618772318252 +3695 6 6.70085239 0.70085239410400391 0.49119407832131401 +3696 7 6.398295 0.60170507431030273 0.36204899645076694 +3697 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3698 6 6.24541 0.24540996551513672 0.060226051174140594 +3699 5 5.108233 0.10823297500610352 0.011714376878671828 +3700 5 5.486109 0.48610877990722656 0.23630174590289243 +3701 5 5.20689249 0.20689249038696289 0.042804502578519532 +3702 6 5.67937136 0.32062864303588867 0.10280272673503532 +3703 6 5.67937136 0.32062864303588867 0.10280272673503532 +3704 6 5.67937136 0.32062864303588867 0.10280272673503532 +3705 6 5.67937136 0.32062864303588867 0.10280272673503532 +3706 6 6.30640936 0.30640935897827148 0.09388669526947524 +3707 6 6.302135 0.30213499069213867 0.091285552600538722 +3708 5 5.15478468 0.1547846794128418 0.023958296980936211 +3709 5 5.181745 0.18174505233764648 0.03303126404921386 +3710 5 4.88772964 0.11227035522460938 0.012604632662259974 +3711 6 5.67937136 0.32062864303588867 0.10280272673503532 +3712 5 5.59040737 0.59040737152099609 0.34858086434633151 +3713 5 5.16065025 0.16065025329589844 0.025808503884036327 +3714 4 5.40058327 1.4005832672119141 1.9616334883939999 +3715 6 5.902174 0.097826004028320313 0.009569927064148942 +3716 5 5.655233 0.65523290634155273 0.42933016155279802 +3717 6 5.775761 0.22423887252807617 0.050283071952662795 +3718 5 5.20689249 0.20689249038696289 0.042804502578519532 +3719 5 5.38708639 0.38708639144897461 0.1498358744449888 +3720 7 6.94894171 0.051058292388916016 0.0026069492216720391 +3721 5 5.05060768 0.050607681274414063 0.0025611374039726797 +3722 5 4.98821163 0.011788368225097656 0.00013896562541049207 +3723 7 6.490961 0.50903892517089844 0.25912062733914354 +3724 6 6.30076361 0.30076360702514648 0.090458747310776744 +3725 6 6.23129034 0.23129034042358398 0.053495221573257368 +3726 7 6.634293 0.3657069206237793 0.13374155179212721 +3727 7 6.490961 0.50903892517089844 0.25912062733914354 +3728 7 6.83458853 0.16541147232055664 0.027360955175254276 +3729 5 5.10726643 0.10726642608642578 0.011506086165354645 +3730 6 5.732659 0.26734113693237305 0.071471283496293836 +3731 6 6.02678251 0.026782512664794922 0.00071730298463990039 +3732 5 5.10726643 0.10726642608642578 0.011506086165354645 +3733 6 6.601304 0.60130405426025391 0.36156656566981837 +3734 5 5.412523 0.41252279281616211 0.17017505459284621 +3735 6 6.212704 0.21270418167114258 0.045243068900390426 +3736 4 5.974627 1.9746270179748535 3.8991518601162625 +3737 5 5.66151667 0.66151666641235352 0.437604299941313 +3738 6 5.62562132 0.37437868118286133 0.14015939692421853 +3739 7 6.81513262 0.18486738204956055 0.034175948945858181 +3740 7 6.81513262 0.18486738204956055 0.034175948945858181 +3741 7 6.81513262 0.18486738204956055 0.034175948945858181 +3742 7 6.81513262 0.18486738204956055 0.034175948945858181 +3743 7 6.81513262 0.18486738204956055 0.034175948945858181 +3744 7 6.81513262 0.18486738204956055 0.034175948945858181 +3745 7 6.81513262 0.18486738204956055 0.034175948945858181 +3746 5 6.29884863 1.2988486289978027 1.6870077610494718 +3747 6 5.658112 0.3418879508972168 0.11688737096869772 +3748 5 5.37572527 0.37572526931762695 0.14116947800380331 +3749 6 6.59885168 0.59885168075561523 0.35862333554382531 +3750 7 6.81513262 0.18486738204956055 0.034175948945858181 +3751 5 5.352506 0.35250616073608398 0.12426059335689388 +3752 5 5.411717 0.41171693801879883 0.16951083705157544 +3753 5 5.31119251 0.31119251251220703 0.09684077984366013 +3754 8 7.681114 0.31888580322265625 0.10168815549695864 +3755 6 6.103313 0.10331296920776367 0.010673569606524325 +3756 5 5.352506 0.35250616073608398 0.12426059335689388 +3757 5 5.411717 0.41171693801879883 0.16951083705157544 +3758 5 5.31119251 0.31119251251220703 0.09684077984366013 +3759 6 6.103313 0.10331296920776367 0.010673569606524325 +3760 6 6.155523 0.15552282333374023 0.024187348577697776 +3761 7 6.45952559 0.54047441482543945 0.29211259308090121 +3762 5 5.419359 0.41935920715332031 0.17586214462426142 +3763 5 6.03585434 1.0358543395996094 1.0729942128673429 +3764 8 7.681114 0.31888580322265625 0.10168815549695864 +3765 5 5.24535036 0.24535036087036133 0.060196799579216531 +3766 5 5.24535036 0.24535036087036133 0.060196799579216531 +3767 5 5.24535036 0.24535036087036133 0.060196799579216531 +3768 6 6.072592 0.072591781616210938 0.0052695667582156602 +3769 5 5.24535036 0.24535036087036133 0.060196799579216531 +3770 4 5.85129166 1.8512916564941406 3.4272807974048192 +3771 6 5.96826839 0.031731605529785156 0.0010068947894978919 +3772 6 6.072592 0.072591781616210938 0.0052695667582156602 +3773 5 5.567017 0.5670170783996582 0.32150836719688414 +3774 5 5.42932558 0.42932558059692383 0.18432045415488574 +3775 6 6.555324 0.55532407760620117 0.30838483116917814 +3776 5 6.549726 1.5497260093688965 2.401650704114445 +3777 6 6.555324 0.55532407760620117 0.30838483116917814 +3778 7 6.80112171 0.19887828826904297 0.039552573544824554 +3779 7 6.94228554 0.057714462280273438 0.0033309591563011054 +3780 5 5.42932558 0.42932558059692383 0.18432045415488574 +3781 6 5.932433 0.067566871643066406 0.0045652821436306112 +3782 6 6.227729 0.22772884368896484 0.051860426247912983 +3783 5 5.270208 0.27020788192749023 0.073012299455740504 +3784 6 5.81837845 0.18162155151367188 0.032986387974233367 +3785 7 6.71812534 0.28187465667724609 0.079453322076915356 +3786 5 5.407538 0.40753793716430664 0.16608717022813835 +3787 5 5.24300337 0.24300336837768555 0.059050637042901144 +3788 5 5.36877 0.36877012252807617 0.13599140326937231 +3789 6 5.35680771 0.64319229125976563 0.41369632353598718 +3790 5 5.270208 0.27020788192749023 0.073012299455740504 +3791 5 5.30159664 0.30159664154052734 0.090960534188525344 +3792 6 6.023325 0.023324966430664063 0.00054405405899160542 +3793 6 5.47658157 0.52341842651367188 0.27396684921404812 +3794 5 5.64809132 0.64809131622314453 0.42002235416384792 +3795 6 5.81837845 0.18162155151367188 0.032986387974233367 +3796 6 6.42824173 0.42824172973632813 0.1833909790875623 +3797 5 4.83761024 0.16238975524902344 0.026370432609837735 +3798 5 5.660219 0.66021919250488281 0.43588938215179951 +3799 5 5.69797659 0.69797658920288086 0.4871713190752871 +3800 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3801 6 5.97499 0.025010108947753906 0.00062550554957852 +3802 5 5.660219 0.66021919250488281 0.43588938215179951 +3803 6 6.044695 0.044694900512695313 0.0019976341318397317 +3804 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3805 6 5.97499 0.025010108947753906 0.00062550554957852 +3806 5 4.83761024 0.16238975524902344 0.026370432609837735 +3807 5 5.63379145 0.63379144668579102 0.40169159789206788 +3808 6 5.517979 0.48202085494995117 0.23234410460668187 +3809 6 6.044695 0.044694900512695313 0.0019976341318397317 +3810 3 5.139502 2.1395020484924316 4.5774690155033113 +3811 5 5.86564541 0.86564540863037109 0.74934197348284215 +3812 5 5.660219 0.66021919250488281 0.43588938215179951 +3813 5 5.69797659 0.69797658920288086 0.4871713190752871 +3814 5 5.528592 0.52859210968017578 0.27940961841613898 +3815 7 6.71345472 0.2865452766418457 0.082108195565751885 +3816 5 5.46293068 0.46293067932128906 0.21430481385687017 +3817 6 6.24235964 0.24235963821411133 0.058738194235274932 +3818 6 6.441372 0.44137191772460938 0.19480916975589935 +3819 6 6.441372 0.44137191772460938 0.19480916975589935 +3820 5 5.83183 0.83183002471923828 0.69194119002440857 +3821 6 6.02943945 0.029439449310302734 0.00086668117569388414 +3822 6 6.34592 0.34592008590698242 0.1196607058338941 +3823 5 5.289135 0.28913497924804688 0.083599036224768497 +3824 7 6.34184074 0.65815925598144531 0.43317360623404966 +3825 6 6.542632 0.54263210296630859 0.29444959916963853 +3826 6 6.441372 0.44137191772460938 0.19480916975589935 +3827 5 5.547714 0.5477142333984375 0.29999088146723807 +3828 6 6.24235964 0.24235963821411133 0.058738194235274932 +3829 7 6.90751839 0.092481613159179688 0.0085528487725241575 +3830 7 6.662573 0.33742713928222656 0.11385707432418712 +3831 5 5.104566 0.10456609725952148 0.010934068696087706 +3832 5 5.104566 0.10456609725952148 0.010934068696087706 +3833 6 6.39407635 0.39407634735107422 0.1552961675415645 +3834 5 5.11497831 0.11497831344604492 0.013220012562896954 +3835 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3836 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3837 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3838 5 5.11497831 0.11497831344604492 0.013220012562896954 +3839 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3840 6 6.208704 0.20870399475097656 0.043557357425015653 +3841 6 6.314494 0.31449413299560547 0.09890655968865758 +3842 6 6.040485 0.040484905242919922 0.001639027552528205 +3843 7 6.94303846 0.056961536407470703 0.0032446166298996104 +3844 6 6.208704 0.20870399475097656 0.043557357425015653 +3845 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3846 6 6.27509069 0.27509069442749023 0.075674890160598807 +3847 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3848 6 5.67952156 0.32047843933105469 0.1027064300760685 +3849 5 5.12245846 0.12245845794677734 0.014996073922702635 +3850 6 6.27509069 0.27509069442749023 0.075674890160598807 +3851 7 7.210589 0.21058893203735352 0.044347698296633098 +3852 6 6.20994473 0.20994472503662109 0.044076787570702436 +3853 7 7.079849 0.079848766326904297 0.0063758254839285655 +3854 6 6.775606 0.77560615539550781 0.60156490828740061 +3855 6 6.39135551 0.39135551452636719 0.1531591387501976 +3856 6 6.20994473 0.20994472503662109 0.044076787570702436 +3857 6 6.280806 0.28080606460571289 0.078852045919347802 +3858 6 6.61661 0.61661005020141602 0.38020795400939278 +3859 5 5.38074636 0.38074636459350586 0.14496779415117089 +3860 5 5.38074636 0.38074636459350586 0.14496779415117089 +3861 6 5.924023 0.075976848602294922 0.0057724815235360438 +3862 6 5.903024 0.096975803375244141 0.0094043064402740129 +3863 6 5.903024 0.096975803375244141 0.0094043064402740129 +3864 7 6.547844 0.45215606689453125 0.20444510882953182 +3865 6 6.91423035 0.9142303466796875 0.83581712679006159 +3866 6 6.122323 0.12232303619384766 0.014962925183681364 +3867 5 5.38074636 0.38074636459350586 0.14496779415117089 +3868 6 4.826844 1.1731557846069336 1.37629449495671 +3869 6 5.924023 0.075976848602294922 0.0057724815235360438 +3870 6 5.874355 0.12564516067504883 0.015786706401058836 +3871 6 5.903024 0.096975803375244141 0.0094043064402740129 +3872 4 4.866891 0.86689090728759766 0.75149984513791424 +3873 5 5.13102341 0.13102340698242188 0.017167133177281357 +3874 5 5.2737484 0.27374839782714844 0.074938185312930727 +3875 7 5.953763 1.0462369918823242 1.0946118431829746 +3876 5 5.43160534 0.43160533905029297 0.18628316869671835 +3877 5 5.96922541 0.96922540664672852 0.93939788888951625 +3878 5 5.27135849 0.27135848999023438 0.073635430089780129 +3879 4 3.85325718 0.14674282073974609 0.021533455438657256 +3880 6 5.7290225 0.27097749710083008 0.073428803935030373 +3881 6 5.7290225 0.27097749710083008 0.073428803935030373 +3882 5 5.93204927 0.93204927444458008 0.86871584999266815 +3883 6 6.63882732 0.63882732391357422 0.40810034977857867 +3884 6 5.7290225 0.27097749710083008 0.073428803935030373 +3885 6 6.157238 0.15723800659179688 0.024723790716961958 +3886 6 6.63882732 0.63882732391357422 0.40810034977857867 +3887 6 6.157238 0.15723800659179688 0.024723790716961958 +3888 6 5.7290225 0.27097749710083008 0.073428803935030373 +3889 6 6.10551071 0.10551071166992188 0.011132510277093388 +3890 6 6.19827271 0.198272705078125 0.039312065578997135 +3891 5 5.93204927 0.93204927444458008 0.86871584999266815 +3892 5 5.79291964 0.79291963577270508 0.62872154879391928 +3893 5 4.78047943 0.21952056884765625 0.048189280147198588 +3894 6 6.143109 0.14310884475708008 0.020480141447706046 +3895 6 6.40889549 0.40889549255371094 0.16719552383074188 +3896 6 5.741901 0.25809907913208008 0.066615134648827734 +3897 6 5.997462 0.0025382041931152344 6.442480525947758E-06 +3898 7 6.17240953 0.8275904655456543 0.68490597866207281 +3899 5 5.79291964 0.79291963577270508 0.62872154879391928 +3900 5 4.78047943 0.21952056884765625 0.048189280147198588 +3901 4 4.35597134 0.35597133636474609 0.1267155923133032 +3902 6 5.915008 0.084991931915283203 0.0072236284906921355 +3903 6 6.23150444 0.23150444030761719 0.05359430588214309 +3904 7 7.02997 0.029970169067382813 0.00089821103392750956 +3905 7 6.960154 0.039845943450927734 0.0015876992094945308 +3906 7 6.960154 0.039845943450927734 0.0015876992094945308 +3907 7 6.6903367 0.30966329574584961 0.095891356732181521 +3908 7 6.296472 0.70352792739868164 0.49495154462988467 +3909 7 6.296472 0.70352792739868164 0.49495154462988467 +3910 6 6.341356 0.34135580062866211 0.11652378262283491 +3911 6 5.71503448 0.28496551513671875 0.081205344817135483 +3912 7 6.960154 0.039845943450927734 0.0015876992094945308 +3913 6 5.858565 0.14143514633178711 0.020003900617894033 +3914 7 6.296472 0.70352792739868164 0.49495154462988467 +3915 7 6.872329 0.1276707649230957 0.016299824216048364 +3916 6 6.341356 0.34135580062866211 0.11652378262283491 +3917 5 5.19301939 0.19301939010620117 0.037256484956969871 +3918 7 6.62571 0.37428998947143555 0.14009299621852733 +3919 6 6.55708551 0.55708551406860352 0.31034426998508025 +3920 6 5.821983 0.17801713943481445 0.031690101932554171 +3921 5 5.52710438 0.52710437774658203 0.27783902503961144 +3922 7 6.6903367 0.30966329574584961 0.095891356732181521 +3923 5 5.21137667 0.21137666702270508 0.044680095361627536 +3924 5 5.21137667 0.21137666702270508 0.044680095361627536 +3925 5 5.424182 0.42418193817138672 0.17993031667083415 +3926 6 5.80389357 0.1961064338684082 0.03845773340458436 +3927 5 5.96175432 0.96175432205200195 0.92497137598570589 +3928 5 5.141706 0.14170598983764648 0.020080587555867169 +3929 5 5.141706 0.14170598983764648 0.020080587555867169 +3930 6 6.28535843 0.28535842895507813 0.08142943297571037 +3931 6 6.524964 0.5249638557434082 0.2755870498369859 +3932 8 6.46785831 1.5321416854858398 2.3474581444033902 +3933 4 5.35140467 1.3514046669006348 1.8262945737208156 +3934 6 5.92051172 0.079488277435302734 0.0063183862496316578 +3935 5 5.30682325 0.3068232536315918 0.094140508969076109 +3936 6 5.78626442 0.21373558044433594 0.045682898347877199 +3937 5 5.39522934 0.39522933959960938 0.15620623088034336 +3938 6 5.758783 0.24121713638305664 0.058185706884842148 +3939 6 6.261217 0.26121711730957031 0.068234382375521818 +3940 5 5.339176 0.33917617797851563 0.11504047970811371 +3941 5 5.24542665 0.24542665481567383 0.060234242894011913 +3942 6 5.8923316 0.10766839981079102 0.011592484317816343 +3943 6 5.798487 0.20151281356811523 0.040607414032137967 +3944 6 6.21212339 0.21212339401245117 0.044996334287361606 +3945 6 6.261217 0.26121711730957031 0.068234382375521818 +3946 6 6.54871845 0.54871845245361328 0.30109194006308826 +3947 7 6.61867762 0.38132238388061523 0.14540676044839529 +3948 5 5.584513 0.58451318740844727 0.3416556662543826 +3949 5 5.339176 0.33917617797851563 0.11504047970811371 +3950 5 5.24542665 0.24542665481567383 0.060234242894011913 +3951 5 5.350792 0.35079193115234375 0.12305497896159068 +3952 6 6.112464 0.11246395111083984 0.012648140299461375 +3953 7 6.392265 0.60773515701293945 0.36934202106954217 +3954 5 5.350792 0.35079193115234375 0.12305497896159068 +3955 6 6.112464 0.11246395111083984 0.012648140299461375 +3956 5 5.47008228 0.47008228302001953 0.22097735280931374 +3957 5 5.946553 0.94655323028564453 0.89596301776418841 +3958 6 5.66506624 0.33493375778198242 0.11218062210195967 +3959 6 5.66506624 0.33493375778198242 0.11218062210195967 +3960 6 5.3763175 0.62368249893188477 0.38897985947392044 +3961 5 5.18560743 0.1856074333190918 0.034450119303301108 +3962 7 7.151062 0.15106201171875 0.022819731384515762 +3963 7 6.32142735 0.67857265472412109 0.46046084773934126 +3964 5 5.18217325 0.18217325210571289 0.033187093782771626 +3965 4 5.70695639 1.7069563865661621 2.9137001056390091 +3966 6 5.66506624 0.33493375778198242 0.11218062210195967 +3967 4 5.26928663 1.2692866325378418 1.6110885555392542 +3968 6 5.35175 0.64825010299682617 0.42022819603539574 +3969 6 6.229696 0.22969579696655273 0.052760159144099816 +3970 7 6.19331 0.80669021606445313 0.65074910469411407 +3971 6 6.229696 0.22969579696655273 0.052760159144099816 +3972 6 5.54704952 0.45295047760009766 0.20516413515815657 +3973 4 5.26928663 1.2692866325378418 1.6110885555392542 +3974 6 5.35175 0.64825010299682617 0.42022819603539574 +3975 7 6.709179 0.29082107543945313 0.084576897919760086 +3976 7 7.10497856 0.10497856140136719 0.011020498353900621 +3977 6 6.63561869 0.63561868667602539 0.40401111485175534 +3978 7 6.04282236 0.95717763900756836 0.91618903261610285 +3979 6 6.217364 0.21736383438110352 0.047247036496855799 +3980 5 6.02859735 1.028597354888916 1.0580125184844746 +3981 7 6.28068542 0.7193145751953125 0.51741345808841288 +3982 7 6.709179 0.29082107543945313 0.084576897919760086 +3983 6 5.925124 0.074875831604003906 0.0056063901583911502 +3984 7 7.10497856 0.10497856140136719 0.011020498353900621 +3985 6 6.122168 0.12216806411743164 0.014925035890200888 +3986 6 6.122168 0.12216806411743164 0.014925035890200888 +3987 6 5.71410275 0.28589725494384766 0.081737240384427423 +3988 6 5.879811 0.12018918991088867 0.014445441371435663 +3989 6 6.122168 0.12216806411743164 0.014925035890200888 +3990 6 5.71410275 0.28589725494384766 0.081737240384427423 +3991 5 5.62714958 0.62714958190917969 0.39331659808885888 +3992 7 6.14805937 0.85194063186645508 0.72580284022501473 +3993 7 6.485149 0.51485109329223633 0.26507164826421103 +3994 7 6.485149 0.51485109329223633 0.26507164826421103 +3995 5 5.104947 0.10494709014892578 0.011013891730726755 +3996 7 6.485149 0.51485109329223633 0.26507164826421103 +3997 7 6.735825 0.2641749382019043 0.069788397973979954 +3998 6 5.934058 0.065941810607910156 0.0043483223862494924 +3999 6 5.934058 0.065941810607910156 0.0043483223862494924 +4000 6 5.934058 0.065941810607910156 0.0043483223862494924 +4001 5 5.335033 0.33503293991088867 0.11224707082533314 +4002 6 5.60893059 0.39106941223144531 0.15293528518304811 +4003 6 6.45015 0.4501500129699707 0.20263503417686479 +4004 7 6.7571907 0.24280929565429688 0.058956354056135751 +4005 6 6.45015 0.4501500129699707 0.20263503417686479 +4006 6 6.23378134 0.23378133773803711 0.054653713874586174 +4007 5 5.335033 0.33503293991088867 0.11224707082533314 +4008 6 5.60893059 0.39106941223144531 0.15293528518304811 +4009 6 6.07953453 0.079534530639648438 0.0063257415640691761 +4010 6 6.55589867 0.55589866638183594 0.30902332728510373 +4011 7 6.735825 0.2641749382019043 0.069788397973979954 +4012 6 5.934058 0.065941810607910156 0.0043483223862494924 +4013 6 5.441547 0.55845308303833008 0.31186984595501599 +4014 6 6.24294 0.24293994903564453 0.059019818837441562 +4015 5 4.75735331 0.24264669418334961 0.058877418198107989 +4016 5 5.21397972 0.21397972106933594 0.04578732102891081 +4017 6 6.14959431 0.14959430694580078 0.02237845667059446 +4018 6 6.24294 0.24293994903564453 0.059019818837441562 +4019 5 4.75735331 0.24264669418334961 0.058877418198107989 +4020 4 4.47513533 0.47513532638549805 0.22575357837945376 +4021 5 5.643344 0.64334392547607422 0.41389140644696454 +4022 5 5.21397972 0.21397972106933594 0.04578732102891081 +4023 6 6.39005136 0.39005136489868164 0.1521400672593245 +4024 6 6.409837 0.40983676910400391 0.16796617730960861 +4025 6 6.7355876 0.73558759689331055 0.54108911270327553 +4026 6 6.39005136 0.39005136489868164 0.1521400672593245 +4027 5 5.18595076 0.18595075607299805 0.03457768368411962 +4028 6 6.40132236 0.40132236480712891 0.16105964049438626 +4029 6 6.29972172 0.29972171783447266 0.089833108141647244 +4030 5 5.77380943 0.77380943298339844 0.5987810385740886 +4031 5 5.164775 0.16477489471435547 0.02715076592812693 +4032 5 5.318856 0.31885576248168945 0.10166899726777956 +4033 6 6.01368 0.013679981231689453 0.00018714188649937569 +4034 5 5.318856 0.31885576248168945 0.10166899726777956 +4035 6 6.11864853 0.11864852905273438 0.014077473446377553 +4036 5 5.10300541 0.10300540924072266 0.010610114332848752 +4037 5 5.15395546 0.15395545959472656 0.023702283539023483 +4038 5 5.164775 0.16477489471435547 0.02715076592812693 +4039 4 5.06407642 1.0640764236450195 1.1322586353571751 +4040 5 5.49962044 0.49962043762207031 0.24962058168966905 +4041 5 5.2111783 0.21117830276489258 0.044596275558660636 +4042 7 6.820859 0.17914104461669922 0.03209151386636222 +4043 7 6.820859 0.17914104461669922 0.03209151386636222 +4044 7 6.820859 0.17914104461669922 0.03209151386636222 +4045 7 6.820859 0.17914104461669922 0.03209151386636222 +4046 7 6.707407 0.29259300231933594 0.085610665006242925 +4047 6 6.44117928 0.44117927551269531 0.19463915314190672 +4048 6 6.44117928 0.44117927551269531 0.19463915314190672 +4049 6 6.41707468 0.41707468032836914 0.17395128897101131 +4050 7 6.820859 0.17914104461669922 0.03209151386636222 +4051 6 6.331319 0.33131885528564453 0.10977218386778986 +4052 5 5.2111783 0.21117830276489258 0.044596275558660636 +4053 7 6.820859 0.17914104461669922 0.03209151386636222 +4054 7 6.707407 0.29259300231933594 0.085610665006242925 +4055 6 6.331319 0.33131885528564453 0.10977218386778986 +4056 5 5.77324438 0.77324438095092773 0.59790687267218345 +4057 6 6.295132 0.29513216018676758 0.087102991976507838 +4058 6 6.44117928 0.44117927551269531 0.19463915314190672 +4059 6 6.41707468 0.41707468032836914 0.17395128897101131 +4060 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4061 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4062 6 6.082549 0.082549095153808594 0.0068143531107125455 +4063 5 5.371587 0.37158679962158203 0.13807674965300976 +4064 5 6.223232 1.2232317924499512 1.4962960180603204 +4065 8 7.24055958 0.75944042205810547 0.57674975465579337 +4066 6 6.2537303 0.25373029708862305 0.064379063660680913 +4067 5 5.3426137 0.34261369705200195 0.11738414540764097 +4068 6 6.2537303 0.25373029708862305 0.064379063660680913 +4069 6 6.004174 0.0041742324829101563 1.7424216821382288E-05 +4070 5 5.571743 0.57174301147460938 0.32689007117005531 +4071 6 5.818604 0.1813960075378418 0.032904511550668758 +4072 7 6.515072 0.48492813110351563 0.23515529233554844 +4073 5 4.62328625 0.37671375274658203 0.14191325150841294 +4074 4 4.78012753 0.78012752532958984 0.60859895577686984 +4075 6 5.69815826 0.30184173583984375 0.091108433494810015 +4076 5 5.492518 0.49251794815063477 0.24257392925051136 +4077 6 5.968249 0.031751155853271484 0.001008135898018736 +4078 6 5.7745986 0.22540140151977539 0.050805791807079004 +4079 6 5.88386059 0.11613941192626953 0.013488363002579717 +4080 6 5.865267 0.13473320007324219 0.018153035201976309 +4081 6 5.678007 0.32199287414550781 0.10367941100048483 +4082 6 6.05232334 0.052323341369628906 0.0027377320520827197 +4083 5 5.29502439 0.29502439498901367 0.087039393638633555 +4084 8 6.477889 1.5221109390258789 2.3168217107022429 +4085 6 5.937694 0.062305927276611328 0.0038820285737983795 +4086 6 5.76667166 0.23332834243774414 0.054442115384745193 +4087 6 5.690505 0.30949497222900391 0.095787137835031899 +4088 6 6.06473732 0.064737319946289063 0.0041909205938281957 +4089 6 5.55112648 0.44887351989746094 0.20148743686513626 +4090 6 5.529048 0.47095203399658203 0.22179581832551776 +4091 6 5.82618856 0.17381143569946289 0.030210415179908523 +4092 6 5.28551674 0.71448326110839844 0.51048633040409186 +4093 6 5.351238 0.64876222610473633 0.42089242602037302 +4094 7 7.07337046 0.073370456695556641 0.0053832239157145523 +4095 6 5.351238 0.64876222610473633 0.42089242602037302 +4096 5 4.990592 0.0094079971313476563 8.8510410023445729E-05 +4097 6 5.82618856 0.17381143569946289 0.030210415179908523 +4098 5 6.222002 1.2220020294189453 1.4932889599040209 +4099 6 5.28551674 0.71448326110839844 0.51048633040409186 +4100 6 6.014094 0.014093875885009766 0.0001986373374620598 +4101 5 5.22823429 0.22823429107666016 0.052090891623265634 +4102 5 5.22823429 0.22823429107666016 0.052090891623265634 +4103 7 6.371319 0.62868118286132813 0.39524002968391869 +4104 7 6.347439 0.65256118774414063 0.42583610375004355 +4105 7 6.239276 0.76072406768798828 0.57870110715975898 +4106 5 5.64672947 0.64672946929931641 0.41825900646017544 +4107 6 6.32752848 0.32752847671508789 0.10727490305930587 +4108 6 6.51016045 0.51016044616699219 0.26026368083330453 +4109 6 6.0367527 0.036752700805664063 0.0013507610165106598 +4110 5 5.393194 0.39319419860839844 0.15460167781930068 +4111 6 6.05556536 0.055565357208251953 0.0030875089216806373 +4112 6 6.33822441 0.33822441101074219 0.11439575220356346 +4113 6 6.354503 0.35450315475463867 0.1256724867309913 +4114 6 6.023537 0.023537158966064453 0.00055399785219378828 +4115 6 6.138492 0.13849210739135742 0.019180063809699277 +4116 6 5.4326086 0.56739139556884766 0.32193299576556456 +4117 6 5.4326086 0.56739139556884766 0.32193299576556456 +4118 8 6.47382832 1.5261716842651367 2.3292000098526842 +4119 7 6.62782335 0.3721766471862793 0.13851545671082022 +4120 5 5.605265 0.60526514053344727 0.36634589034497367 +4121 6 5.586563 0.4134368896484375 0.17093006172217429 +4122 6 5.498919 0.50108098983764648 0.25108215837667558 +4123 6 6.05965 0.059649944305419922 0.0035581158556396986 +4124 7 6.57852364 0.42147636413574219 0.17764232552508474 +4125 5 5.755329 0.75532913208007813 0.57052209776884411 +4126 5 5.755329 0.75532913208007813 0.57052209776884411 +4127 5 5.55892754 0.55892753601074219 0.3123999905110395 +4128 5 5.2543 0.25430011749267578 0.064668549756788707 +4129 7 6.86728239 0.13271760940551758 0.017613963846315528 +4130 6 6.040545 0.040544986724853516 0.0016438959485185478 +4131 5 5.36841869 0.36841869354248047 0.13573233375154814 +4132 5 5.36841869 0.36841869354248047 0.13573233375154814 +4133 6 6.171894 0.17189407348632813 0.029547572499723174 +4134 6 6.451214 0.45121383666992188 0.20359392640239093 +4135 5 5.92140675 0.92140674591064453 0.84899039140964305 +4136 6 6.35042429 0.35042428970336914 0.12279718281411078 +4137 5 5.36841869 0.36841869354248047 0.13573233375154814 +4138 6 5.7370224 0.26297760009765625 0.069157218153122813 +4139 7 6.313542 0.68645811080932617 0.47122473789590913 +4140 6 5.932523 0.067477226257324219 0.004553176063382125 +4141 6 5.932523 0.067477226257324219 0.004553176063382125 +4142 6 6.059661 0.059660911560058594 0.0035594243681771331 +4143 6 5.80167866 0.19832134246826172 0.039331354878413549 +4144 6 5.932523 0.067477226257324219 0.004553176063382125 +4145 6 5.81908035 0.18091964721679688 0.032731918749050237 +4146 7 6.51515 0.48484992980957031 0.23507945443634526 +4147 7 6.313542 0.68645811080932617 0.47122473789590913 +4148 6 5.77318668 0.22681331634521484 0.051444280471514503 +4149 7 6.57568932 0.42431068420410156 0.1800395567297528 +4150 5 4.879766 0.12023401260375977 0.014456217786801062 +4151 6 6.349858 0.34985780715942383 0.12240048523040059 +4152 6 5.77318668 0.22681331634521484 0.051444280471514503 +4153 5 5.27344227 0.27344226837158203 0.074770674132196291 +4154 5 5.305294 0.30529403686523438 0.093204448945471086 +4155 5 5.27344227 0.27344226837158203 0.074770674132196291 +4156 5 5.31374645 0.31374645233154297 0.098436836350629164 +4157 7 7.011022 0.011022090911865234 0.00012148648806942219 +4158 7 7.011022 0.011022090911865234 0.00012148648806942219 +4159 7 7.011022 0.011022090911865234 0.00012148648806942219 +4160 7 7.011022 0.011022090911865234 0.00012148648806942219 +4161 7 7.011022 0.011022090911865234 0.00012148648806942219 +4162 7 7.011022 0.011022090911865234 0.00012148648806942219 +4163 5 5.25803375 0.25803375244140625 0.066581417398992926 +4164 5 5.40265226 0.40265226364135742 0.1621288454155092 +4165 7 6.126724 0.8732762336730957 0.76261138029826725 +4166 7 6.56084442 0.43915557861328125 0.19285762222716585 +4167 8 7.22911358 0.77088642120361328 0.59426587439611467 +4168 6 6.27897644 0.2789764404296875 0.077827854314818978 +4169 7 6.44153166 0.55846834182739258 0.3118868888234374 +4170 7 7.011022 0.011022090911865234 0.00012148648806942219 +4171 5 6.280464 1.2804641723632813 1.6395884967059828 +4172 6 6.044114 0.044114112854003906 0.0019460549528957927 +4173 5 5.45170975 0.45170974731445313 0.20404169581888709 +4174 6 5.229326 0.77067422866821289 0.59393876673334489 +4175 7 6.15340567 0.84659433364868164 0.71672196576605529 +4176 6 5.96163368 0.038366317749023438 0.0014719743376190308 +4177 6 6.29175138 0.29175138473510742 0.085118870494852672 +4178 7 6.215218 0.78478193283081055 0.61588268209766284 +4179 5 5.26952362 0.26952362060546875 0.072642982064280659 +4180 6 5.36615658 0.63384342193603516 0.40175748353158269 +4181 6 6.041504 0.04150390625 0.0017225742340087891 +4182 6 5.03049135 0.96950864791870117 0.93994701838914807 +4183 7 6.80200052 0.19799947738647461 0.03920379304531707 +4184 7 6.710221 0.2897791862487793 0.08397197678300472 +4185 5 5.26952362 0.26952362060546875 0.072642982064280659 +4186 5 5.451507 0.4515070915222168 0.20385865369485145 +4187 6 6.58606768 0.58606767654418945 0.34347532148990467 +4188 6 6.19589853 0.19589853286743164 0.038376235179612195 +4189 5 5.30196142 0.30196142196655273 0.091180700356062516 +4190 6 5.93951225 0.060487747192382813 0.0036587675604096148 +4191 5 5.727819 0.72781896591186523 0.52972044714101685 +4192 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4193 6 6.08673 0.086730003356933594 0.0075220934822937124 +4194 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4195 8 7.182058 0.81794214248657227 0.66902934845552409 +4196 6 6.189203 0.18920278549194336 0.035797694037910333 +4197 5 5.442303 0.44230318069458008 0.19563210365254236 +4198 5 5.18446827 0.18446826934814453 0.034028542396299599 +4199 6 6.08673 0.086730003356933594 0.0075220934822937124 +4200 6 6.10387468 0.10387468338012695 0.010789949847321623 +4201 6 6.356462 0.35646200180053711 0.12706515872764612 +4202 6 6.76204062 0.76204061508178711 0.58070589903422842 +4203 5 5.26486969 0.26486968994140625 0.070155952649656683 +4204 6 6.04439 0.044390201568603516 0.00197048999530125 +4205 6 6.356462 0.35646200180053711 0.12706515872764612 +4206 6 5.38576365 0.61423635482788086 0.37728629959224236 +4207 7 6.47487068 0.52512931823730469 0.27576080087237642 +4208 6 6.331671 0.33167123794555664 0.11000581008033805 +4209 6 6.61370659 0.61370658874511719 0.3766357770691684 +4210 6 5.75262737 0.24737262725830078 0.061193216716674215 +4211 6 5.57837772 0.42162227630615234 0.17776534387758147 +4212 4 4.7228303 0.72283029556274414 0.52248363618332405 +4213 4 4.765456 0.76545619964599609 0.58592319357649103 +4214 5 5.2678895 0.26788949966430664 0.071764784030392548 +4215 5 5.2678895 0.26788949966430664 0.071764784030392548 +4216 5 5.2678895 0.26788949966430664 0.071764784030392548 +4217 4 4.667052 0.66705179214477539 0.44495809340355663 +4218 6 6.367011 0.36701107025146484 0.13469712568712566 +4219 5 5.2678895 0.26788949966430664 0.071764784030392548 +4220 6 6.083678 0.083677768707275391 0.0070019689758282766 +4221 6 6.6260004 0.62600040435791016 0.39187650625626702 +4222 4 4.667052 0.66705179214477539 0.44495809340355663 +4223 4 4.13989544 0.13989543914794922 0.019570733894397563 +4224 7 6.72387 0.27613019943237305 0.076247887038562112 +4225 5 5.3994503 0.39945030212402344 0.1595605438669736 +4226 7 6.18949127 0.81050872802734375 0.65692439820850268 +4227 7 6.161215 0.83878517150878906 0.70356056394302868 +4228 6 5.363188 0.63681221008300781 0.40552979091080488 +4229 6 5.806095 0.19390487670898438 0.037599101211526431 +4230 6 5.62430429 0.37569570541381836 0.14114726306638659 +4231 6 6.18936443 0.18936443328857422 0.035858888594702876 +4232 6 6.160059 0.16005897521972656 0.025618875548389042 +4233 6 5.78126955 0.21873044967651367 0.04784300961568988 +4234 6 5.681346 0.31865406036376953 0.10154041018631688 +4235 5 5.34582424 0.34582424163818359 0.1195944061046248 +4236 5 5.34582424 0.34582424163818359 0.1195944061046248 +4237 5 5.86143255 0.86143255233764648 0.74206604222695205 +4238 5 5.34582424 0.34582424163818359 0.1195944061046248 +4239 7 7.03946257 0.039462566375732422 0.0015572941449590871 +4240 6 5.66003942 0.33996057510375977 0.11557319262487908 +4241 6 6.583823 0.58382320404052734 0.34084953357614722 +4242 7 6.668239 0.33176088333129883 0.11006528370876367 +4243 6 6.365007 0.36500692367553711 0.13323005433107937 +4244 5 5.33011436 0.33011436462402344 0.1089754937311227 +4245 5 5.42551851 0.42551851272583008 0.18106600467240241 +4246 6 6.26176071 0.26176071166992188 0.068518670173943974 +4247 6 5.43350172 0.5664982795715332 0.32092030075750699 +4248 6 6.15749 0.15748977661132813 0.024803029737086035 +4249 6 5.72360849 0.27639150619506836 0.076392264696778511 +4250 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4251 6 5.6752367 0.32476329803466797 0.10547119975035457 +4252 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4253 4 5.28086 1.2808599472045898 1.6406022043529447 +4254 5 5.8399086 0.83990859985351563 0.70544645610789303 +4255 5 5.131142 0.13114213943481445 0.017198260735540316 +4256 5 5.131142 0.13114213943481445 0.017198260735540316 +4257 5 5.808099 0.80809879302978516 0.65302365929619555 +4258 6 5.882378 0.11762189865112305 0.013834911042295062 +4259 6 6.31239748 0.31239748001098633 0.097592185517214602 +4260 6 6.113717 0.11371707916259766 0.012931574093272502 +4261 7 6.4979763 0.50202369689941406 0.25202779224855476 +4262 6 6.524527 0.52452707290649414 0.27512865021185462 +4263 6 5.814336 0.18566417694091797 0.034471186599148496 +4264 6 5.97327471 0.026725292205810547 0.00071424124348595797 +4265 6 6.113717 0.11371707916259766 0.012931574093272502 +4266 7 6.4979763 0.50202369689941406 0.25202779224855476 +4267 7 6.4979763 0.50202369689941406 0.25202779224855476 +4268 6 6.506674 0.50667381286621094 0.25671835264438414 +4269 5 5.28652143 0.28652143478393555 0.082094532590645031 +4270 6 5.9458127 0.054187297821044922 0.0029362632451466197 +4271 5 5.14096165 0.14096164703369141 0.019870185934451001 +4272 6 5.72031927 0.27968072891235352 0.078221310124945376 +4273 6 5.72031927 0.27968072891235352 0.078221310124945376 +4274 6 5.72031927 0.27968072891235352 0.078221310124945376 +4275 6 5.72031927 0.27968072891235352 0.078221310124945376 +4276 7 7.23196 0.23195981979370117 0.053805357998726322 +4277 5 5.92046642 0.92046642303466797 0.84725843593423633 +4278 4 4.848876 0.84887599945068359 0.72059046244339697 +4279 6 5.82808638 0.17191362380981445 0.029554294051422403 +4280 6 5.72031927 0.27968072891235352 0.078221310124945376 +4281 5 5.164684 0.16468381881713867 0.027120760180196157 +4282 5 5.164684 0.16468381881713867 0.027120760180196157 +4283 6 6.057775 0.057775020599365234 0.0033379530052570772 +4284 6 6.057775 0.057775020599365234 0.0033379530052570772 +4285 6 6.057775 0.057775020599365234 0.0033379530052570772 +4286 6 6.057775 0.057775020599365234 0.0033379530052570772 +4287 5 5.42380047 0.42380046844482422 0.17960683705405245 +4288 6 5.74335527 0.25664472579956055 0.065866515280731619 +4289 6 5.78677559 0.21322441101074219 0.045464649450877914 +4290 5 5.164684 0.16468381881713867 0.027120760180196157 +4291 5 5.40787935 0.40787935256958008 0.16636556625257981 +4292 6 6.09707 0.097070217132568359 0.0094226270541639678 +4293 5 5.40787935 0.40787935256958008 0.16636556625257981 +4294 5 5.84869528 0.84869527816772461 0.72028367518419145 +4295 5 5.40787935 0.40787935256958008 0.16636556625257981 +4296 6 6.09707 0.097070217132568359 0.0094226270541639678 +4297 6 6.33077431 0.33077430725097656 0.10941164233736345 +4298 6 6.20831966 0.20831966400146484 0.043397082409683208 +4299 6 5.624217 0.37578296661376953 0.14121283799704543 +4300 5 5.38560057 0.38560056686401367 0.14868779716584868 +4301 5 5.13298368 0.13298368453979492 0.017684660353779691 +4302 6 5.647275 0.35272502899169922 0.12441494607719505 +4303 6 6.427828 0.42782783508300781 0.18303665647181333 +4304 6 6.19889164 0.19889163970947266 0.03955788434632268 +4305 6 5.85083961 0.14916038513183594 0.022248820492677623 +4306 6 5.92332029 0.076679706573486328 0.0058797774001959624 +4307 7 6.613306 0.38669395446777344 0.14953221442192444 +4308 6 6.286537 0.28653717041015625 0.082103550026658922 +4309 6 6.396994 0.39699411392211914 0.15760432648880851 +4310 6 5.73678637 0.2632136344909668 0.069281417381944266 +4311 5 6.19426775 1.194267749786377 1.4262754581798163 +4312 6 6.427828 0.42782783508300781 0.18303665647181333 +4313 6 6.24178934 0.24178934097290039 0.058462085408109488 +4314 7 6.47377 0.5262298583984375 0.27691786387003958 +4315 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4316 5 4.89074039 0.10925960540771484 0.011937661373849551 +4317 7 6.58141041 0.41858959197998047 0.17521724651396653 +4318 7 6.47377 0.5262298583984375 0.27691786387003958 +4319 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4320 5 5.485202 0.48520183563232422 0.23542082130097697 +4321 6 5.74379873 0.25620126724243164 0.065639089336627876 +4322 7 6.329284 0.6707158088684082 0.44985969626600308 +4323 6 5.644962 0.35503816604614258 0.12605209934940831 +4324 6 5.88721132 0.11278867721557617 0.012721285708039431 +4325 5 5.29375 0.29374980926513672 0.086288950443304202 +4326 5 5.314613 0.31461286544799805 0.098981255105400123 +4327 5 5.29375 0.29374980926513672 0.086288950443304202 +4328 5 5.825475 0.82547521591186523 0.68140933208474053 +4329 5 5.48227 0.4822697639465332 0.23258412521704486 +4330 5 5.29375 0.29374980926513672 0.086288950443304202 +4331 5 5.314613 0.31461286544799805 0.098981255105400123 +4332 8 7.65718842 0.34281158447265625 0.11751978244865313 +4333 8 7.65718842 0.34281158447265625 0.11751978244865313 +4334 8 7.65718842 0.34281158447265625 0.11751978244865313 +4335 8 7.65718842 0.34281158447265625 0.11751978244865313 +4336 8 7.65718842 0.34281158447265625 0.11751978244865313 +4337 8 7.65718842 0.34281158447265625 0.11751978244865313 +4338 8 7.65718842 0.34281158447265625 0.11751978244865313 +4339 8 6.11387157 1.8861284255981445 3.5574804378493354 +4340 8 7.65718842 0.34281158447265625 0.11751978244865313 +4341 6 5.607523 0.39247703552246094 0.15403822341249906 +4342 6 6.406812 0.40681219100952148 0.16549615875396739 +4343 6 5.87327576 0.1267242431640625 0.016059033805504441 +4344 6 5.649031 0.35096883773803711 0.12317912506318862 +4345 6 6.168647 0.16864681243896484 0.028441747345823387 +4346 6 5.649031 0.35096883773803711 0.12317912506318862 +4347 7 6.41372442 0.58627557754516602 0.34371905282591797 +4348 6 5.38195562 0.61804437637329102 0.3819788511666502 +4349 5 5.33784 0.33784008026123047 0.11413591983091464 +4350 6 5.955332 0.044668197631835938 0.0019952478796767537 +4351 6 6.74399137 0.74399137496948242 0.553523166028981 +4352 5 5.696282 0.69628190994262695 0.48480849811335247 +4353 6 5.936355 0.063644886016845703 0.0040506715160972817 +4354 6 6.277787 0.27778720855712891 0.077165733237961831 +4355 6 6.74399137 0.74399137496948242 0.553523166028981 +4356 5 5.74487638 0.74487638473510742 0.55484082853604377 +4357 6 6.078775 0.078774929046630859 0.0062054894463017263 +4358 5 5.325482 0.32548189163208008 0.10593846178039712 +4359 6 5.146009 0.85399103164672852 0.72930068213304367 +4360 5 5.696282 0.69628190994262695 0.48480849811335247 +4361 6 6.354132 0.35413217544555664 0.12540959768580251 +4362 6 6.827937 0.82793712615966797 0.68547988487352995 +4363 5 5.352111 0.35211086273193359 0.12398205965382658 +4364 6 5.949367 0.050632953643798828 0.002563695994695081 +4365 5 5.644166 0.64416599273681641 0.41494982619860821 +4366 6 6.581495 0.58149480819702148 0.3381362119600908 +4367 5 5.352111 0.35211086273193359 0.12398205965382658 +4368 6 6.24809647 0.24809646606445313 0.061551856473670341 +4369 6 5.949367 0.050632953643798828 0.002563695994695081 +4370 5 5.27093458 0.2709345817565918 0.073405547591619325 +4371 5 5.46512651 0.46512651443481445 0.21634267443027966 +4372 6 6.02718067 0.027180671691894531 0.00073878891362255672 +4373 6 6.348733 0.34873294830322266 0.12161466923225817 +4374 5 5.14362526 0.14362525939941406 0.020628215137548978 +4375 6 5.86484051 0.13515949249267578 0.018268088410877681 +4376 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4377 6 6.304982 0.30498218536376953 0.093014133389260678 +4378 5 5.02749825 0.027498245239257813 0.00075615349123836495 +4379 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4380 6 6.19491 0.19491004943847656 0.037989927372109378 +4381 6 6.542717 0.54271697998046875 0.29454172035912052 +4382 6 6.16713762 0.16713762283325195 0.027934984966350385 +4383 6 6.304982 0.30498218536376953 0.093014133389260678 +4384 5 5.121737 0.12173700332641602 0.014819897978895824 +4385 5 5.121737 0.12173700332641602 0.014819897978895824 +4386 6 6.16324 0.16323995590209961 0.026647283202919425 +4387 6 6.20248032 0.20248031616210938 0.040998278433107771 +4388 6 5.73686457 0.26313543319702148 0.069240256203784156 +4389 4 5.578374 1.578373908996582 2.4912641966011506 +4390 5 5.47506475 0.47506475448608398 0.22568652095492325 +4391 5 5.31349 0.31348991394042969 0.098275926142378012 +4392 5 5.47506475 0.47506475448608398 0.22568652095492325 +4393 6 5.894842 0.10515785217285156 0.011058173873607302 +4394 6 5.92819 0.071809768676757813 0.0051566428774094675 +4395 5 5.36295462 0.36295461654663086 0.13173605367251184 +4396 5 5.33769274 0.3376927375793457 0.11403638501383284 +4397 5 5.33769274 0.3376927375793457 0.11403638501383284 +4398 5 5.33769274 0.3376927375793457 0.11403638501383284 +4399 5 5.36295462 0.36295461654663086 0.13173605367251184 +4400 5 5.33769274 0.3376927375793457 0.11403638501383284 +4401 6 6.450748 0.45074796676635742 0.20317372954400525 +4402 6 6.30272961 0.30272960662841797 0.091645214729396685 +4403 5 5.53840542 0.53840541839599609 0.28988039455816761 +4404 5 5.15546846 0.15546846389770508 0.024170443266712027 +4405 5 5.15546846 0.15546846389770508 0.024170443266712027 +4406 7 6.80952168 0.19047832489013672 0.036281992252952477 +4407 6 6.221997 0.22199678421020508 0.049282572199672359 +4408 5 5.15546846 0.15546846389770508 0.024170443266712027 +4409 7 6.80952168 0.19047832489013672 0.036281992252952477 +4410 5 5.41353559 0.41353559494018555 0.17101168828253321 +4411 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4412 7 6.2168684 0.78313159942626953 0.61329510201994708 +4413 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4414 7 6.2168684 0.78313159942626953 0.61329510201994708 +4415 5 5.189993 0.18999290466308594 0.036097303822316462 +4416 5 5.41353559 0.41353559494018555 0.17101168828253321 +4417 6 5.888463 0.11153697967529297 0.012440497835086717 +4418 6 5.8170557 0.18294429779052734 0.033468616094069148 +4419 6 5.8170557 0.18294429779052734 0.033468616094069148 +4420 6 5.8170557 0.18294429779052734 0.033468616094069148 +4421 6 5.8170557 0.18294429779052734 0.033468616094069148 +4422 6 5.888463 0.11153697967529297 0.012440497835086717 +4423 6 5.888463 0.11153697967529297 0.012440497835086717 +4424 6 5.8170557 0.18294429779052734 0.033468616094069148 +4425 6 5.86058664 0.13941335678100586 0.019436084048948032 +4426 6 5.796547 0.20345306396484375 0.041393149236682802 +4427 5 5.34068727 0.34068727493286133 0.11606781930117904 +4428 6 6.74285555 0.74285554885864258 0.55183436647007511 +4429 6 5.862502 0.13749790191650391 0.018905673031440529 +4430 5 5.16007662 0.16007661819458008 0.025624523692613366 +4431 6 6.27077341 0.27077341079711914 0.073318239994705436 +4432 6 6.455703 0.45570278167724609 0.20766502522837982 +4433 5 4.893008 0.10699176788330078 0.011447238394794113 +4434 6 6.0497036 0.049703598022460938 0.0024704476563783828 +4435 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4436 6 6.199245 0.19924497604370117 0.039698560478655054 +4437 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4438 5 5.572666 0.57266616821289063 0.32794654021563474 +4439 5 5.11934042 0.11934041976928711 0.014242135790709654 +4440 5 5.327377 0.3273768424987793 0.10717559700447055 +4441 6 6.27455759 0.27455759048461914 0.075381870492719827 +4442 5 5.327377 0.3273768424987793 0.10717559700447055 +4443 5 5.11934042 0.11934041976928711 0.014242135790709654 +4444 6 6.25034428 0.25034427642822266 0.062672256740370358 +4445 6 6.25034428 0.25034427642822266 0.062672256740370358 +4446 6 6.77828074 0.77828073501586914 0.60572090249684152 +4447 6 6.490504 0.49050378799438477 0.24059396603684036 +4448 5 5.858529 0.85852909088134766 0.7370721998895533 +4449 6 5.77393 0.22606992721557617 0.051107611991255908 +4450 6 6.023334 0.023334026336669922 0.00054447678508040553 +4451 5 5.18813133 0.18813133239746094 0.035393398229643935 +4452 5 5.270654 0.27065420150756836 0.073253696793699419 +4453 6 6.490504 0.49050378799438477 0.24059396603684036 +4454 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4455 5 5.1645813 0.164581298828125 0.027087003923952579 +4456 5 5.1645813 0.164581298828125 0.027087003923952579 +4457 5 5.1645813 0.164581298828125 0.027087003923952579 +4458 7 6.53274345 0.46725654602050781 0.21832867979901494 +4459 5 5.746503 0.74650287628173828 0.55726654429690825 +4460 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4461 6 6.026326 0.026326179504394531 0.00069306772729760269 +4462 6 6.782111 0.78211116790771484 0.61169787896596972 +4463 6 6.42424965 0.42424964904785156 0.17998776471722522 +4464 5 5.338199 0.33819913864135742 0.1143786573777561 +4465 5 5.338199 0.33819913864135742 0.1143786573777561 +4466 5 6.011748 1.0117478370666504 1.0236336858090453 +4467 5 5.807701 0.80770111083984375 0.65238108445191756 +4468 6 5.99583435 0.0041656494140625 1.735263504087925E-05 +4469 6 6.384077 0.38407707214355469 0.14751519734636531 +4470 6 6.19453 0.19453001022338867 0.037841924877511701 +4471 6 6.190817 0.19081687927246094 0.036411081415280933 +4472 5 5.8315444 0.83154439926147461 0.69146608794312669 +4473 5 4.95860672 0.041393280029296875 0.0017134036315837875 +4474 6 5.73346043 0.26653957366943359 0.071043344331883418 +4475 6 6.585525 0.5855250358581543 0.34283956761669288 +4476 6 6.383046 0.38304615020751953 0.14672435318880162 +4477 5 5.17250633 0.17250633239746094 0.029758434717223281 +4478 5 5.17250633 0.17250633239746094 0.029758434717223281 +4479 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4480 5 5.586254 0.58625411987304688 0.34369389306812081 +4481 5 5.17250633 0.17250633239746094 0.029758434717223281 +4482 6 6.64182758 0.64182758331298828 0.41194264670139091 +4483 4 4.56951332 0.56951332092285156 0.32434542270857492 +4484 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4485 6 6.236687 0.23668718338012695 0.056020822776417845 +4486 6 5.62462854 0.37537145614624023 0.14090373008934876 +4487 6 6.149464 0.14946413040161133 0.022339526276709876 +4488 6 6.630827 0.63082695007324219 0.39794264093870879 +4489 6 6.630827 0.63082695007324219 0.39794264093870879 +4490 6 6.326199 0.32619905471801758 0.10640582329892823 +4491 6 6.552785 0.55278491973876953 0.30557116749059787 +4492 6 6.35064173 0.35064172744750977 0.12294962102737372 +4493 6 5.660044 0.33995580673217773 0.11556995053092578 +4494 6 5.86190653 0.13809347152709961 0.019069806878405871 +4495 6 5.608976 0.39102411270141602 0.15289985671392969 +4496 6 5.86190653 0.13809347152709961 0.019069806878405871 +4497 5 5.241128 0.24112796783447266 0.05814269687198248 +4498 5 5.83831549 0.83831548690795898 0.70277285558972835 +4499 6 6.148644 0.14864397048950195 0.022095029962883928 +4500 6 5.876842 0.12315797805786133 0.015167887559300652 +4501 6 5.262086 0.73791408538818359 0.54451719741427951 +4502 6 6.126531 0.12653112411499023 0.016010125369803063 +4503 7 6.66133976 0.33866024017333984 0.11469075827426423 +4504 5 5.45453358 0.45453357696533203 0.20660077258889942 +4505 5 5.415779 0.41577911376953125 0.17287227144697681 +4506 6 6.422779 0.42277908325195313 0.17874215323536191 +4507 5 6.107822 1.1078219413757324 1.2272694537934967 +4508 4 6.141981 2.1419811248779297 4.588083139333321 +4509 5 5.24329853 0.24329853057861328 0.059194174981712422 +4510 6 6.556102 0.55610179901123047 0.30924921086352697 +4511 6 6.363239 0.36323881149291992 0.13194243417478901 +4512 6 6.363239 0.36323881149291992 0.13194243417478901 +4513 6 6.322394 0.32239389419555664 0.10393782301457577 +4514 5 5.04009628 0.040096282958984375 0.0016077119071269408 +4515 6 6.475341 0.47534084320068359 0.22594891721473687 +4516 6 6.45291376 0.45291376113891602 0.20513087502899907 +4517 6 5.81829929 0.18170070648193359 0.033015146736033785 +4518 6 5.56788 0.43211984634399414 0.18672756160435711 +4519 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4520 5 5.3585043 0.35850429534912109 0.12852532978376985 +4521 5 5.146292 0.14629220962524414 0.021401410597036374 +4522 6 5.56788 0.43211984634399414 0.18672756160435711 +4523 5 5.93566465 0.93566465377807617 0.87546834432964715 +4524 6 5.834097 0.16590309143066406 0.027523835746251279 +4525 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4526 6 6.196083 0.19608306884765625 0.038448569888714701 +4527 6 5.81829929 0.18170070648193359 0.033015146736033785 +4528 6 5.14050531 0.85949468612670898 0.73873111548004999 +4529 6 5.61537933 0.38462066650390625 0.14793305710190907 +4530 6 5.579626 0.42037391662597656 0.17671422977946349 +4531 6 5.579626 0.42037391662597656 0.17671422977946349 +4532 6 6.080338 0.080338001251220703 0.0064541944450411393 +4533 5 5.5772934 0.57729339599609375 0.33326766506070271 +4534 6 6.29704 0.29703998565673828 0.088232753078955284 +4535 6 5.61537933 0.38462066650390625 0.14793305710190907 +4536 6 5.55331945 0.44668054580688477 0.19952351000233648 +4537 5 5.09134531 0.091345310211181641 0.0083439656975770049 +4538 6 6.68299675 0.68299674987792969 0.46648456034381525 +4539 5 5.699331 0.69933080673217773 0.48906357724467853 +4540 6 6.555229 0.55522918701171875 0.30827945010969415 +4541 6 6.245467 0.24546718597412109 0.060254139390053751 +4542 5 5.73857737 0.73857736587524414 0.54549652538321425 +4543 5 5.73857737 0.73857736587524414 0.54549652538321425 +4544 6 6.555229 0.55522918701171875 0.30827945010969415 +4545 6 6.471859 0.47185897827148438 0.22265089537540916 +4546 6 6.549561 0.5495610237121582 0.30201731878355531 +4547 6 6.16732836 0.1673283576965332 0.027998779289418962 +4548 5 5.380732 0.38073205947875977 0.14495690111493786 +4549 5 5.73857737 0.73857736587524414 0.54549652538321425 +4550 6 5.989843 0.010157108306884766 0.00010316684915778751 +4551 6 6.09961939 0.099619388580322266 0.0099240225811172422 +4552 6 6.39423275 0.39423274993896484 0.15541946112443839 +4553 6 6.587703 0.58770322799682617 0.34539508419788945 +4554 6 6.245467 0.24546718597412109 0.060254139390053751 +4555 5 5.292268 0.29226779937744141 0.085420466552932339 +4556 5 6.446664 1.4466638565063477 2.0928363137218184 +4557 6 5.477523 0.52247714996337891 0.27298237223385513 +4558 6 6.34416676 0.34416675567626953 0.11845075571272901 +4559 7 6.019767 0.98023319244384766 0.96085711156865727 +4560 6 6.92705 0.92705011367797852 0.85942191327035289 +4561 6 5.979853 0.020146846771240234 0.00040589543482383306 +4562 7 6.10519552 0.89480447769165039 0.80067505329702726 +4563 7 6.56974125 0.43025875091552734 0.1851225927393898 +4564 7 6.18542957 0.81457042694091797 0.66352498044670938 +4565 5 5.39186049 0.3918604850769043 0.15355463976470674 +4566 5 6.22530937 1.2253093719482422 1.5013830569841957 +4567 5 5.39186049 0.3918604850769043 0.15355463976470674 +4568 6 6.126938 0.1269378662109375 0.016113221878185868 +4569 6 5.77645063 0.22354936599731445 0.049974319037801251 +4570 6 6.01089573 0.010895729064941406 0.00011871691185660893 +4571 7 6.57845736 0.42154264450073242 0.17769820113267087 +4572 7 6.440188 0.55981206893920898 0.31338955252999767 +4573 6 6.33240652 0.33240652084350586 0.1104940950992841 +4574 7 6.96231556 0.037684440612792969 0.0014201170642991201 +4575 7 6.81994772 0.18005228042602539 0.032418823686612086 +4576 5 5.687053 0.68705320358276367 0.4720421045533385 +4577 6 6.075848 0.075848102569580078 0.0057529346634055401 +4578 7 7.087625 0.087625026702880859 0.0076781453046805836 +4579 6 6.26486158 0.2648615837097168 0.070151658525219318 +4580 6 6.45493841 0.45493841171264648 0.20696895845162544 +4581 6 6.339595 0.33959484100341797 0.11532465603613673 +4582 6 5.93023872 0.069761276245117188 0.0048666356633475516 +4583 6 5.75422573 0.24577426910400391 0.060404991353607329 +4584 6 5.89385653 0.10614347457885742 0.011266437195672552 +4585 6 6.566305 0.56630516052246094 0.32070153483437025 +4586 6 6.36007071 0.36007070541381836 0.12965091289720476 +4587 6 6.20307446 0.20307445526123047 0.041239234379645495 +4588 5 6.22775126 1.2277512550354004 1.5073731442410008 +4589 6 6.36007071 0.36007070541381836 0.12965091289720476 +4590 6 6.091628 0.091628074645996094 0.0083957040633322322 +4591 6 5.70858669 0.29141330718994141 0.084921715607379156 +4592 6 6.59907055 0.59907054901123047 0.35888552269261709 +4593 6 6.13447571 0.1344757080078125 0.018083716044202447 +4594 6 6.775327 0.77532720565795898 0.60113227583337903 +4595 6 6.27347231 0.27347230911254883 0.074787103851349457 +4596 6 6.20077658 0.20077657699584961 0.040311233870170327 +4597 6 5.56596 0.43404006958007813 0.18839078200107906 +4598 6 6.13447571 0.1344757080078125 0.018083716044202447 +4599 7 6.42611027 0.57388973236083984 0.32934942490919639 +4600 6 5.52788544 0.47211456298828125 0.22289216058561578 +4601 6 6.18567228 0.18567228317260742 0.034474196738528917 +4602 6 6.04761934 0.047619342803955078 0.0022676018090805883 +4603 6 6.05319738 0.053197383880615234 0.0028299616517415416 +4604 6 6.329858 0.32985782623291016 0.10880618552710075 +4605 6 6.70813274 0.70813274383544922 0.50145198289192194 +4606 5 5.980174 0.98017406463623047 0.9607411969855093 +4607 6 6.19283 0.19283008575439453 0.037183441972047149 +4608 7 6.80754328 0.19245672225952148 0.037039589942878592 +4609 4 4.05158043 0.051580429077148438 0.00266054066378274 +4610 6 5.67133236 0.32866764068603516 0.10802241803412471 +4611 5 6.17913532 1.1791353225708008 1.3903601089341464 +4612 5 5.19891071 0.19891071319580078 0.039565471824062115 +4613 5 5.439533 0.43953323364257813 0.19318946347630117 +4614 5 4.95613146 0.043868541717529297 0.0019244489524226083 +4615 7 6.635701 0.36429882049560547 0.13271363061448938 +4616 5 5.638706 0.63870620727539063 0.40794561921211425 +4617 7 7.10083961 0.10083961486816406 0.010168627926759655 +4618 7 6.635701 0.36429882049560547 0.13271363061448938 +4619 5 4.67914963 0.32085037231445313 0.10294496141432319 +4620 6 6.132133 0.13213300704956055 0.017459131551959217 +4621 7 5.89214468 1.1078553199768066 1.2273434100009126 +4622 7 7.09829 0.098289966583251953 0.0096609175309367856 +4623 6 6.41415739 0.41415739059448242 0.17152634418403068 +4624 6 6.581927 0.58192682266235352 0.33863882693390224 +4625 5 5.071765 0.071764945983886719 0.0051502074720701785 +4626 6 5.950599 0.049400806427001953 0.0024404396756381175 +4627 6 6.050242 0.050241947174072266 0.0025242532558422681 +4628 6 6.050242 0.050241947174072266 0.0025242532558422681 +4629 7 6.102637 0.89736318588256836 0.80526068737731293 +4630 7 6.395737 0.6042628288269043 0.36513356630189264 +4631 7 6.45820141 0.54179859161376953 0.29354571387466422 +4632 6 5.950599 0.049400806427001953 0.0024404396756381175 +4633 6 5.82988358 0.17011642456054688 0.028939597905264236 +4634 6 6.556143 0.55614280700683594 0.30929482178544276 +4635 6 5.80749941 0.19250059127807617 0.037056477642408936 +4636 5 5.358758 0.35875797271728516 0.12870728298821632 +4637 6 6.21625137 0.21625137329101563 0.046764656450250186 +4638 5 5.358758 0.35875797271728516 0.12870728298821632 +4639 6 5.71351528 0.28648471832275391 0.082073493832467648 +4640 6 6.21625137 0.21625137329101563 0.046764656450250186 +4641 6 6.377533 0.377532958984375 0.14253113511949778 +4642 7 6.56437159 0.43562841415405273 0.18977211521837489 +4643 6 5.68015242 0.31984758377075195 0.10230247684398819 +4644 6 6.467866 0.46786594390869141 0.21889854146957077 +4645 7 7.116684 0.1166839599609375 0.013615146512165666 +4646 7 6.183157 0.81684303283691406 0.66723254029420787 +4647 7 6.245689 0.75431108474731445 0.56898521257267021 +4648 5 4.80332327 0.19667673110961914 0.038681736559965429 +4649 5 4.89571047 0.10428953170776367 0.010876306423824644 +4650 5 4.89571047 0.10428953170776367 0.010876306423824644 +4651 7 7.10383368 0.10383367538452148 0.010781432143858183 +4652 5 5.10172224 0.10172224044799805 0.01034741420176033 +4653 7 6.79083633 0.20916366577148438 0.043749439078965224 +4654 7 6.693703 0.30629682540893555 0.093817745255591944 +4655 7 6.693703 0.30629682540893555 0.093817745255591944 +4656 7 6.693703 0.30629682540893555 0.093817745255591944 +4657 7 6.65744543 0.34255456924438477 0.117343632910206 +4658 6 6.77934265 0.7793426513671875 0.60737496824003756 +4659 6 5.98162174 0.018378257751464844 0.00033776035797927761 +4660 6 6.34407759 0.34407758712768555 0.11838938596361004 +4661 5 5.58429432 0.58429431915283203 0.34139985139427154 +4662 6 6.614982 0.61498212814331055 0.37820301793567523 +4663 7 6.454456 0.54554414749145508 0.29761841686217849 +4664 7 6.54663849 0.45336151123046875 0.20553665986517444 +4665 6 6.614982 0.61498212814331055 0.37820301793567523 +4666 5 5.25093174 0.25093173980712891 0.062966738042632642 +4667 7 6.54663849 0.45336151123046875 0.20553665986517444 +4668 7 6.454456 0.54554414749145508 0.29761841686217849 +4669 5 5.71813965 0.7181396484375 0.5157245546579361 +4670 6 5.54932833 0.45067167282104492 0.20310495668331896 +4671 5 5.31061268 0.31061267852783203 0.096480236062234326 +4672 5 5.31061268 0.31061267852783203 0.096480236062234326 +4673 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4674 7 6.654536 0.34546422958374023 0.11934553392188718 +4675 6 6.129326 0.12932586669921875 0.016725179797504097 +4676 6 5.83601332 0.1639866828918457 0.02689163216587076 +4677 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4678 6 5.54932833 0.45067167282104492 0.20310495668331896 +4679 5 5.23454332 0.2345433235168457 0.055010570606327747 +4680 4 4.39819431 0.39819431304931641 0.15855871094481699 +4681 6 6.39631176 0.39631175994873047 0.15706301107366016 +4682 6 5.88950825 0.11049175262451172 0.012208427398036292 +4683 6 6.26491642 0.26491641998291016 0.07018070957656164 +4684 6 6.181033 0.18103313446044922 0.032772995772575086 +4685 5 5.48171139 0.48171138763427734 0.23204586097654101 +4686 4 4.39819431 0.39819431304931641 0.15855871094481699 +4687 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4688 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4689 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4690 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4691 7 6.166903 0.83309698104858398 0.6940505798322647 +4692 5 5.380849 0.38084888458251953 0.14504587288774928 +4693 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4694 7 6.166903 0.83309698104858398 0.6940505798322647 +4695 7 6.8444066 0.1555933952331543 0.024209304640180562 +4696 6 6.423567 0.42356681823730469 0.17940884951167391 +4697 7 6.8444066 0.1555933952331543 0.024209304640180562 +4698 6 5.525318 0.47468185424804688 0.22532286275236402 +4699 5 5.677266 0.67726612091064453 0.45868939853335178 +4700 5 5.677266 0.67726612091064453 0.45868939853335178 +4701 6 5.37392664 0.62607336044311523 0.39196785265653489 +4702 6 5.37392664 0.62607336044311523 0.39196785265653489 +4703 7 6.718226 0.28177404403686523 0.079396611892889268 +4704 6 5.235369 0.76463079452514648 0.58466025193615678 +4705 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4706 7 6.586311 0.41368913650512695 0.17113870166235756 +4707 6 5.868769 0.13123083114624023 0.017221531043333016 +4708 6 6.131867 0.1318669319152832 0.017388887732749936 +4709 6 6.52721071 0.52721071243286133 0.2779511353039652 +4710 7 6.806604 0.19339609146118164 0.037402048192461734 +4711 6 5.868769 0.13123083114624023 0.017221531043333016 +4712 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4713 6 6.289812 0.28981208801269531 0.083991046358278254 +4714 7 6.586311 0.41368913650512695 0.17113870166235756 +4715 6 5.7559824 0.24401760101318359 0.059544589604229259 +4716 6 5.51584244 0.48415756225585938 0.23440854508953635 +4717 6 5.624865 0.37513494491577148 0.14072622689695891 +4718 6 5.660127 0.33987283706665039 0.11551354537573388 +4719 6 5.7559824 0.24401760101318359 0.059544589604229259 +4720 5 5.97237635 0.97237634658813477 0.94551575940408839 +4721 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4722 6 5.706852 0.29314804077148438 0.085935773808159865 +4723 6 5.241431 0.75856876373291016 0.57542656931127567 +4724 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4725 6 5.98745346 0.012546539306640625 0.00015741564857307822 +4726 6 6.88603258 0.8860325813293457 0.78505373517714361 +4727 6 5.706852 0.29314804077148438 0.085935773808159865 +4728 6 6.177205 0.17720508575439453 0.03140164241722232 +4729 5 4.73050737 0.26949262619018555 0.072626275570883081 +4730 5 5.814275 0.81427478790283203 0.66304343021420209 +4731 6 6.402927 0.40292692184448242 0.16235010434706965 +4732 6 6.402927 0.40292692184448242 0.16235010434706965 +4733 6 5.71249247 0.28750753402709961 0.08266058212234384 +4734 6 6.274084 0.27408409118652344 0.075122089041542495 +4735 6 6.13222742 0.13222742080688477 0.017484090813240982 +4736 6 6.10331869 0.10331869125366211 0.010674751962369555 +4737 7 6.892216 0.10778379440307617 0.011617346335924594 +4738 6 6.553041 0.55304098129272461 0.30585432698921977 +4739 6 6.274084 0.27408409118652344 0.075122089041542495 +4740 5 5.089445 0.089445114135742188 0.0080004284427559469 +4741 6 6.25626755 0.25626754760742188 0.065673055956722237 +4742 6 6.11390924 0.11390924453735352 0.012975315991070602 +4743 5 5.83421659 0.83421659469604492 0.69591732686626528 +4744 5 5.35093 0.35093021392822266 0.12315201504770812 +4745 3 3.82722521 0.8272252082824707 0.68430154521797704 +4746 6 5.70762 0.29237985610961914 0.085485980258681593 +4747 6 6.29134369 0.29134368896484375 0.084881145099643618 +4748 5 5.34712839 0.34712839126586914 0.12049812002283034 +4749 6 5.35289049 0.6471095085144043 0.41875071600975389 +4750 5 5.83421659 0.83421659469604492 0.69591732686626528 +4751 6 5.51917839 0.48082160949707031 0.23118942015935318 +4752 7 6.60790968 0.3920903205871582 0.1537348194981405 +4753 6 6.60107851 0.60107851028442383 0.3612953755257422 +4754 6 6.02144527 0.021445274353027344 0.00045989979207661236 +4755 6 6.168067 0.16806697845458984 0.028246509246855567 +4756 7 6.81629038 0.18370962142944336 0.033749225005749395 +4757 7 6.81629038 0.18370962142944336 0.033749225005749395 +4758 6 6.5071764 0.50717639923095703 0.25722789993687911 +4759 6 5.8558073 0.14419269561767578 0.020791533469491696 +4760 6 5.8558073 0.14419269561767578 0.020791533469491696 +4761 6 6.42398167 0.42398166656494141 0.17976045358318515 +4762 7 6.319236 0.68076419830322266 0.46343989369142946 +4763 7 6.73848772 0.26151227951049805 0.068388672334776857 +4764 6 6.180128 0.18012809753417969 0.03244613152128295 +4765 8 7.674349 0.32565116882324219 0.10604868375594378 +4766 8 6.59993362 1.4000663757324219 1.9601858564565191 +4767 7 5.88190556 1.1180944442749023 1.2501351863184027 +4768 6 5.5695467 0.43045330047607422 0.18529004389074544 +4769 6 5.5695467 0.43045330047607422 0.18529004389074544 +4770 6 5.5695467 0.43045330047607422 0.18529004389074544 +4771 6 5.5695467 0.43045330047607422 0.18529004389074544 +4772 5 5.31793 0.31793022155761719 0.10107962577967555 +4773 7 6.28737259 0.71262741088867188 0.50783782674989197 +4774 4 4.94949675 0.94949674606323242 0.90154407078466647 +4775 6 5.788814 0.21118593215942383 0.044599497942044763 +4776 6 5.586607 0.41339302062988281 0.17089378950549872 +4777 6 6.67964554 0.67964553833007813 0.46191805777198169 +4778 6 5.625838 0.37416219711303711 0.13999734974845524 +4779 4 4.226809 0.22680902481079102 0.051442333735622015 +4780 5 5.251493 0.25149297714233398 0.063248717551914524 +4781 5 5.251493 0.25149297714233398 0.063248717551914524 +4782 6 5.6815567 0.31844329833984375 0.10140613425755873 +4783 6 5.6815567 0.31844329833984375 0.10140613425755873 +4784 5 5.534597 0.53459692001342773 0.28579386688784325 +4785 7 6.31295729 0.6870427131652832 0.47202768971351361 +4786 8 7.52037668 0.47962331771850586 0.23003852689930682 +4787 8 7.461737 0.53826284408569336 0.28972688932321944 +4788 5 5.534597 0.53459692001342773 0.28579386688784325 +4789 6 6.130587 0.13058710098266602 0.017052990943057011 +4790 6 6.33779 0.33779001235961914 0.11410209244991165 +4791 6 5.6815567 0.31844329833984375 0.10140613425755873 +4792 6 6.60871 0.60870981216430664 0.37052763542510547 +4793 6 5.391595 0.60840511322021484 0.37015678179250244 +4794 5 5.349109 0.34910917282104492 0.12187721454779421 +4795 7 6.60348368 0.39651632308959961 0.15722519447649574 +4796 7 6.60348368 0.39651632308959961 0.15722519447649574 +4797 6 6.444803 0.44480323791503906 0.19784992045970284 +4798 5 5.5460577 0.54605770111083984 0.2981790129424553 +4799 6 5.86040545 0.13959455490112305 0.019486639758042656 +4800 7 6.06000948 0.93999052047729492 0.8835821785871758 +4801 7 6.60348368 0.39651632308959961 0.15722519447649574 +4802 8 7.498994 0.50100612640380859 0.25100713869414903 +4803 7 6.657819 0.34218120574951172 0.11708797756818967 +4804 4 4.9147253 0.91472530364990234 0.83672238113740605 +4805 6 5.73073435 0.26926565170288086 0.072503991186977146 +4806 6 5.533971 0.46602916717529297 0.21718318465809716 +4807 6 6.277921 0.27792119979858398 0.077240193297484439 +4808 5 5.31803656 0.31803655624389648 0.10114725110747713 +4809 6 5.920948 0.079051971435546875 0.0062492141878465191 +4810 5 5.394947 0.39494705200195313 0.15598317388503347 +4811 6 6.31708336 0.31708335876464844 0.10054185640547075 +4812 7 6.53195238 0.4680476188659668 0.21906857352610132 +4813 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4814 6 6.193335 0.19333505630493164 0.037378443996431088 +4815 7 6.322362 0.67763805389404297 0.45919333208530588 +4816 6 5.68325233 0.31674766540527344 0.10032908353969106 +4817 6 6.478207 0.47820711135864258 0.22868204135397718 +4818 6 6.483267 0.48326683044433594 0.23354682940771454 +4819 6 6.193335 0.19333505630493164 0.037378443996431088 +4820 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4821 6 5.80547857 0.19452142715454102 0.037838585622239407 +4822 6 6.046786 0.046785831451416016 0.002188914024600308 +4823 7 6.37059 0.6294097900390625 0.39615668379701674 +4824 5 5.61957836 0.61957836151123047 0.38387734605294099 +4825 6 6.193167 0.19316720962524414 0.037313570874403013 +4826 6 6.193167 0.19316720962524414 0.037313570874403013 +4827 6 6.30881929 0.30881929397583008 0.09536935633173016 +4828 5 5.61957836 0.61957836151123047 0.38387734605294099 +4829 7 6.587614 0.41238594055175781 0.17006216396475793 +4830 6 5.902513 0.097486972808837891 0.0095037098674310982 +4831 6 5.267164 0.73283576965332031 0.53704826528337435 +4832 5 5.476546 0.47654581069946289 0.22709590969520832 +4833 6 6.285742 0.28574180603027344 0.081648379713442409 +4834 7 6.76315069 0.23684930801391602 0.056097594706670861 +4835 6 6.45354271 0.45354270935058594 0.20570098920507007 +4836 5 5.27756 0.27756023406982422 0.077039683536895609 +4837 6 6.6851635 0.68516349792480469 0.46944901888855384 +4838 6 6.40559673 0.40559673309326172 0.16450870989592659 +4839 4 4.615171 0.61517095565795898 0.37843530468512654 +4840 7 6.953846 0.046154022216796875 0.0021301937667885795 +4841 6 6.42197466 0.42197465896606445 0.1780626128095264 +4842 6 5.909714 0.090285778045654297 0.0081515217173091514 +4843 5 5.849253 0.84925317764282227 0.72123095973643103 +4844 6 5.93484 0.065159797668457031 0.0042457992321942584 +4845 5 5.007286 0.00728607177734375 5.3086841944605112E-05 +4846 6 6.584194 0.58419418334960938 0.34128284385951702 +4847 7 6.47132969 0.52867031097412109 0.2794922977054739 +4848 6 6.12405062 0.12405061721801758 0.015388555632171119 +4849 5 5.252341 0.25234079360961914 0.063675876119532404 +4850 6 6.12405062 0.12405061721801758 0.015388555632171119 +4851 5 5.252341 0.25234079360961914 0.063675876119532404 +4852 5 5.93845654 0.93845653533935547 0.88070066872114694 +4853 5 5.962768 0.9627680778503418 0.9269223717276418 +4854 6 6.64682436 0.64682435989379883 0.41838175255202259 +4855 6 5.811765 0.18823480606079102 0.035432342212743606 +4856 6 5.811765 0.18823480606079102 0.035432342212743606 +4857 6 5.96738768 0.032612323760986328 0.0010635636610913934 +4858 5 5.23224735 0.23224735260009766 0.053938832789754088 +4859 6 6.204521 0.20452117919921875 0.041828912741038948 +4860 6 5.651828 0.34817218780517578 0.1212238723610426 +4861 6 6.31806231 0.31806230545043945 0.10116363014844865 +4862 6 6.010396 0.010396003723144531 0.00010807689341163496 +4863 7 6.99840736 0.0015926361083984375 2.5364897737745196E-06 +4864 5 5.177444 0.1774439811706543 0.031486366453691517 +4865 6 6.59354162 0.59354162216186523 0.35229165723853839 +4866 6 6.05234241 0.052342414855957031 0.0027397283929531113 +4867 6 5.65121841 0.34878158569335938 0.12164859451877419 +4868 6 6.40162659 0.4016265869140625 0.161303915316239 +4869 6 5.28494453 0.71505546569824219 0.51130431902493001 +4870 7 6.390793 0.6092071533203125 0.37113335565663874 +4871 6 6.365685 0.36568498611450195 0.13372550906956349 +4872 5 5.51866674 0.51866674423217773 0.26901519157240728 +4873 6 6.25817537 0.25817537307739258 0.066654523263650844 +4874 6 5.92614746 0.0738525390625 0.0054541975259780884 +4875 6 5.56610727 0.43389272689819336 0.18826289845515021 +4876 7 6.79692745 0.20307254791259766 0.041238459715714271 +4877 5 4.49993134 0.50006866455078125 0.25006866926560178 +4878 4 4.44558573 0.44558572769165039 0.19854664072249761 +4879 6 5.391604 0.60839605331420898 0.37014575768830582 +4880 6 5.391604 0.60839605331420898 0.37014575768830582 +4881 6 6.151292 0.15129184722900391 0.022889223037964257 +4882 5 5.638549 0.63854885101318359 0.40774463513025694 +4883 6 5.91789675 0.082103252410888672 0.0067409440564460965 +4884 5 5.34791565 0.3479156494140625 0.12104529910720885 +4885 6 5.391604 0.60839605331420898 0.37014575768830582 +4886 7 7.167016 0.16701602935791016 0.027894354062482307 +4887 7 6.50685453 0.49314546585083008 0.24319245048923221 +4888 5 5.990843 0.99084281921386719 0.98176949238768429 +4889 6 6.151292 0.15129184722900391 0.022889223037964257 +4890 6 6.509506 0.5095062255859375 0.25959659391082823 +4891 6 5.611698 0.38830184936523438 0.15077832622046117 +4892 5 5.985514 0.98551416397094727 0.97123816738735513 +4893 6 6.2242403 0.22424030303955078 0.050283713507269567 +4894 5 5.458216 0.45821619033813477 0.20996207708799375 +4895 6 5.30194473 0.69805526733398438 0.48728115625272039 +4896 7 6.68631124 0.31368875503540039 0.098400635035659434 +4897 6 6.04107332 0.041073322296142578 0.001687017804442803 diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-out.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-out.txt new file mode 100644 index 0000000000..6483a88e76 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-out.txt @@ -0,0 +1,44 @@ +maml.exe CV tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.529227 +L2(avg): 0.479877 +RMS(avg): 0.692731 +Loss-fn(avg): 0.479877 +R Squared: 0.383532 +L1(avg): 0.519622 +L2(avg): 0.463327 +RMS(avg): 0.680681 +Loss-fn(avg): 0.463327 +R Squared: 0.413465 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.524425 (0.0048) +L2(avg): 0.471602 (0.0083) +RMS(avg): 0.686706 (0.0060) +Loss-fn(avg): 0.471602 (0.0083) +R Squared: 0.398499 (0.0150) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-rmse: 0.444161678699535 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Loading data for LightGBM #2' started. +[3] 'Loading data for LightGBM #2' finished in %Time%. +[4] 'Training with LightGBM #2' started. +[4] (%Time%) Iteration: 50 Training-rmse: 0.447777922357938 +[4] 'Training with LightGBM #2' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-rp.txt new file mode 100644 index 0000000000..56cb0fac01 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.524425 0.471602 0.686706 0.471602 0.398499 50 0.2 20 10 + 1 Rmse LightGBMR %Data% %Output% 99 0 0 maml.exe CV tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} threads=- dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Rmse + diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE.txt new file mode 100644 index 0000000000..23cd505851 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-CV-wine.RMSE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +5 6 5.80925941 0.19074058532714844 0.036381970890943194 +6 6 5.25261068 0.74738931655883789 0.55859079050628679 +8 6 5.54791927 0.45208072662353516 0.20437698338446353 +9 6 5.8812604 0.11873960494995117 0.014099093783670469 +10 5 5.785368 0.78536796569824219 0.61680284154499532 +11 5 5.39364529 0.39364528656005859 0.15495661163095065 +18 6 6.00869131 0.0086913108825683594 7.5538884857451194E-05 +20 8 7.3507967 0.64920330047607422 0.42146492534902791 +21 7 5.944835 1.0551648139953613 1.1133727846938655 +25 6 5.694817 0.30518293380737305 0.093136623087275439 +28 6 5.61064863 0.38935136795043945 0.15159448772487849 +31 6 5.437836 0.5621638298034668 0.31602817153930118 +32 6 5.90667772 0.093322277069091797 0.0087090473973603366 +35 5 6.36959553 1.3695955276489258 1.8757919093559394 +37 6 5.738825 0.26117515563964844 0.068212461923394585 +40 6 5.940867 0.059133052825927734 0.00349671793651396 +41 6 5.764175 0.2358250617980957 0.055613459772075657 +44 6 5.675231 0.32476902008056641 0.10547491640409135 +45 7 5.761184 1.2388157844543457 1.5346645478132359 +46 4 5.20731735 1.2073173522949219 1.4576151891524205 +48 6 5.509978 0.49002218246459961 0.24012173930736935 +50 6 6.087853 0.087852954864501953 0.0077181416784242174 +51 7 6.269763 0.73023700714111328 0.53324608659841033 +52 7 5.902807 1.0971927642822266 1.2038319619932736 +54 6 5.920922 0.079078197479248047 0.0062533613165669522 +56 6 6.12345076 0.12345075607299805 0.015240089174994864 +60 6 5.55601835 0.44398164749145508 0.19711970330922668 +63 6 5.4165206 0.58347940444946289 0.3404482154166999 +64 6 5.797542 0.20245790481567383 0.040989203222352444 +66 7 6.7072444 0.2927556037902832 0.085705843550613281 +68 8 6.16529369 1.8347063064575195 3.3661472309549936 +69 5 5.56024361 0.56024360656738281 0.31387289869962842 +70 6 5.368725 0.63127517700195313 0.39850834909884725 +71 5 5.117893 0.11789321899414063 0.0138988110848004 +72 5 4.764992 0.23500776290893555 0.055228648627462462 +73 6 4.900103 1.0998969078063965 1.2097732078020726 +74 8 6.16529369 1.8347063064575195 3.3661472309549936 +76 7 6.41728163 0.5827183723449707 0.33956070146837192 +77 7 6.43876266 0.56123733520507813 0.31498734642809723 +79 5 5.14644241 0.14644241333007813 0.021445380421937443 +82 5 5.25564528 0.2556452751159668 0.065354506689118352 +88 5 5.28622627 0.28622627258300781 0.08192547911676229 +90 6 5.28622627 0.71377372741699219 0.50947293395074666 +91 5 5.319233 0.31923294067382813 0.10190967041125987 +92 7 6.542394 0.45760583877563477 0.20940310368155224 +93 7 6.542394 0.45760583877563477 0.20940310368155224 +95 6 5.60025549 0.39974451065063477 0.15979567379531545 +96 6 5.275809 0.72419118881225586 0.52445287795330842 +97 7 5.49176 1.5082402229309082 2.2747885700666757 +98 4 4.39247751 0.39247751235961914 0.154038597707995 +99 6 5.275809 0.72419118881225586 0.52445287795330842 +100 5 5.7011075 0.70110750198364258 0.49155172933774338 +102 5 5.43836355 0.43836355209350586 0.19216260380403583 +104 5 5.7011075 0.70110750198364258 0.49155172933774338 +105 6 6.030436 0.030436038970947266 0.00092635246824102069 +106 5 5.72359943 0.72359943389892578 0.52359614073884586 +108 6 5.951213 0.048787117004394531 0.002380182785600482 +109 5 5.5798564 0.57985639572143555 0.33623343965905406 +111 5 5.28739548 0.28739547729492188 0.082596160369575955 +112 5 5.051069 0.051068782806396484 0.0026080205773268972 +113 5 5.307395 0.30739498138427734 0.094491674580240215 +115 4 4.551975 0.55197477340698242 0.30467615047768959 +117 6 6.53130627 0.53130626678466797 0.28228634912466077 +120 5 5.270566 0.27056598663330078 0.073205953122851497 +121 5 5.90539455 0.90539455413818359 0.81973929866308026 +122 5 5.915443 0.91544294357299805 0.83803578293759529 +123 6 5.816056 0.1839442253112793 0.033835478025366683 +125 6 6.380141 0.38014078140258789 0.14450701368537011 +128 7 5.995385 1.0046148300170898 1.0092509566902663 +129 6 5.84000444 0.15999555587768555 0.025598577900609598 +131 7 6.206945 0.79305505752563477 0.62893632426698787 +132 5 5.42901468 0.42901468276977539 0.18405359803205101 +133 5 5.59301567 0.59301567077636719 0.35166758578634472 +137 5 5.48119164 0.48119163513183594 0.23154538972084993 +138 7 6.38292551 0.61707448959350586 0.38078092570708577 +141 5 5.48119164 0.48119163513183594 0.23154538972084993 +144 6 5.967776 0.032224178314208984 0.0010383976680259366 +145 6 5.676757 0.32324314117431641 0.10448612831623905 +147 4 5.13458252 1.13458251953125 1.2872774936258793 +150 7 6.13511133 0.86488866806030273 0.74803240813912453 +151 6 6.027541 0.027541160583496094 0.0007585155262859189 +152 6 5.62424946 0.37575054168701172 0.14118846957808273 +154 6 5.33823538 0.66176462173461914 0.43793241457956356 +156 6 5.97231054 0.027689456939697266 0.00076670602561534906 +161 5 5.71372271 0.71372270584106445 0.50940010083309062 +164 5 5.853947 0.85394716262817383 0.72922575656070876 +167 7 6.47956038 0.52043962478637695 0.27085740304778483 +169 5 4.20788145 0.79211854934692383 0.627451796219475 +171 6 6.20117569 0.20117568969726563 0.040471658125170507 +173 7 6.575046 0.42495393753051758 0.18058584902269104 +174 5 5.22949076 0.22949075698852539 0.052666007543166415 +176 4 6.469169 2.4691691398620605 6.0967962412471479 +177 5 5.554319 0.55431890487670898 0.30726944830371394 +179 6 5.21643 0.7835698127746582 0.61398165149171291 +180 6 5.23204136 0.76795864105224609 0.58976047436681256 +181 5 5.114332 0.11433219909667969 0.013071851750282804 +183 6 5.728629 0.27137088775634766 0.073642158721668238 +187 5 6.144768 1.144768238067627 1.310494318888459 +188 8 6.912892 1.0871081352233887 1.1818040976688735 +189 4 5.552815 1.5528149604797363 2.4112343014896851 +191 5 5.36272526 0.36272525787353516 0.13156961269942258 +192 6 6.28948736 0.28948736190795898 0.083802932704429622 +196 5 5.54256725 0.54256725311279297 0.29437922415036155 +198 5 5.42950869 0.42950868606567383 0.18447771140586156 +199 5 5.22549 0.22549009323120117 0.050845782145415797 +201 5 5.42950869 0.42950868606567383 0.18447771140586156 +202 5 4.930763 0.069237232208251953 0.0047937943238594016 +204 4 5.89362049 1.893620491027832 3.5857985640404877 +205 5 5.62215757 0.62215757369995117 0.38708004651221017 +206 5 6.09528875 1.0952887535095215 1.1996574535644413 +207 4 4.813859 0.81385898590087891 0.66236644893160701 +209 6 5.444507 0.55549287796020508 0.30857233746451129 +210 5 5.19806051 0.19806051254272461 0.039227966628686772 +211 7 6.47038841 0.52961158752441406 0.2804884336401301 +212 5 6.09528875 1.0952887535095215 1.1996574535644413 +216 5 5.82277775 0.82277774810791016 0.67696322278152365 +218 5 5.279291 0.27929115295410156 0.078003548118431354 +219 5 6.20777273 1.2077727317810059 1.4587149716337535 +223 6 5.773505 0.22649478912353516 0.051299889500114659 +226 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +228 6 5.99553871 0.0044612884521484375 1.9903094653273001E-05 +233 6 5.95629835 0.043701648712158203 0.0019098341001608787 +237 6 5.319764 0.68023586273193359 0.462720828946658 +239 6 5.79168749 0.2083125114440918 0.043394102424144876 +240 5 5.103008 0.10300779342651367 0.010610605506599313 +241 5 5.67736959 0.67736959457397461 0.45882956765331073 +242 7 6.24281359 0.7571864128112793 0.57333126374601306 +244 5 5.46525669 0.46525669097900391 0.21646378850073233 +246 7 6.98627472 0.01372528076171875 0.00018838333198800683 +247 7 5.997908 1.0020918846130371 1.0041881452073085 +248 7 6.137768 0.86223220825195313 0.74344438094703946 +249 5 5.48982763 0.48982763290405273 0.23993110995638744 +250 4 5.08111 1.0811100006103516 1.1687988334197144 +252 5 5.46525669 0.46525669097900391 0.21646378850073233 +254 6 5.661961 0.33803892135620117 0.11427031235166396 +257 7 5.922548 1.0774521827697754 1.1609032061553535 +258 6 6.399062 0.39906215667724609 0.15925060489189491 +259 4 4.36215544 0.36215543746948242 0.13115656088871219 +260 6 6.13484335 0.13484334945678711 0.018182728892725208 +262 5 5.512335 0.51233482360839844 0.26248697148184874 +267 5 5.598096 0.59809589385986328 0.35771869825202884 +268 6 5.598096 0.40190410614013672 0.16152691053230228 +269 6 5.598096 0.40190410614013672 0.16152691053230228 +271 5 5.62772274 0.62772274017333984 0.39403583853072632 +272 5 5.44098473 0.44098472595214844 0.19446752852309146 +275 6 5.79458046 0.20541954040527344 0.042197187580313766 +276 6 5.819891 0.18010902404785156 0.032439260543469572 +277 5 4.75812 0.24187994003295898 0.058505905390347834 +278 4 5.19088364 1.1908836364746094 1.4182038356229896 +279 7 6.35347462 0.64652538299560547 0.41799507085761434 +280 8 6.60628176 1.3937182426452637 1.9424505398822021 +283 5 5.44280434 0.44280433654785156 0.19607568046558299 +284 5 5.440112 0.44011211395263672 0.19369867284785869 +285 5 5.241145 0.24114513397216797 0.058150975638454838 +288 7 6.387907 0.61209297180175781 0.37465780612910748 +290 7 6.387907 0.61209297180175781 0.37465780612910748 +291 6 6.120554 0.12055397033691406 0.014533259763993556 +293 7 6.009457 0.99054288864135742 0.98117521423796461 +296 5 4.96861649 0.031383514404296875 0.00098492497636470944 +297 7 6.430575 0.56942510604858398 0.32424495139844112 +299 6 6.040891 0.040891170501708984 0.001672087824999835 +300 6 5.68149137 0.31850862503051758 0.10144774421883085 +301 6 5.41270971 0.58729028701782227 0.34490988122547606 +303 6 5.678506 0.32149410247802734 0.10335845792815235 +304 6 5.49561548 0.50438451766967773 0.25440374166487345 +308 7 5.756687 1.2433128356933594 1.5458268073998624 +309 6 5.778518 0.2214818000793457 0.049054187766387258 +311 8 5.75409937 2.2459006309509277 5.0440696441057753 +312 6 6.003036 0.0030360221862792969 9.2174307155801216E-06 +314 5 5.69624 0.69623994827270508 0.48475006557077904 +316 6 6.010912 0.010911941528320313 0.00011907046791748144 +317 5 6.118836 1.1188359260559082 1.2517938294333817 +319 6 5.91781473 0.082185268402099609 0.0067544183423251525 +321 5 6.118836 1.1188359260559082 1.2517938294333817 +323 6 5.817978 0.1820220947265625 0.033132042968645692 +327 6 5.612565 0.38743495941162109 0.15010584777428448 +328 6 5.507632 0.49236822128295898 0.24242646532934486 +329 5 5.871286 0.87128591537475586 0.75913914633042623 +331 5 6.08688164 1.0868816375732422 1.1813116940938926 +332 6 6.02704 0.027040004730224609 0.00073116185581056925 +333 5 5.85901356 0.85901355743408203 0.73790429185555695 +336 6 6.04825258 0.048252582550048828 0.0023283117227492767 +338 5 5.77029 0.77028989791870117 0.59334652683560307 +343 5 6.06355762 1.0635576248168945 1.1311548213061542 +344 6 6.182091 0.18209123611450195 0.0331572182697073 +346 7 5.75412464 1.245875358581543 1.5522054091206883 +347 6 6.342347 0.34234714508056641 0.11720156774481438 +348 6 5.79792 0.20207977294921875 0.040836234635207802 +349 5 6.08598661 1.0859866142272949 1.1793669262808635 +350 7 6.854967 0.14503288269042969 0.021034537061495939 +352 6 5.489034 0.51096582412719727 0.26108607342598589 +353 7 6.611001 0.38899898529052734 0.15132021055705991 +354 6 5.52786064 0.47213935852050781 0.22291557386415661 +355 6 6.276119 0.27611923217773438 0.076241830378421582 +358 6 5.28521156 0.71478843688964844 0.51092250951114693 +360 6 5.749971 0.25002908706665039 0.062514544379382642 +361 5 5.09363651 0.093636512756347656 0.0087677965211696574 +366 6 5.87889862 0.12110137939453125 0.014665544091258198 +368 6 5.62576056 0.37423944473266602 0.14005516199381418 +370 6 5.31511259 0.68488740921020508 0.4690707632946669 +371 6 5.62576056 0.37423944473266602 0.14005516199381418 +373 6 5.85963631 0.14036369323730469 0.019701966379216174 +376 7 5.57551432 1.4244856834411621 2.0291594623288347 +377 7 5.73623 1.2637701034545898 1.5971148743856247 +378 6 5.619952 0.38004779815673828 0.14443632888378488 +379 7 5.57551432 1.4244856834411621 2.0291594623288347 +381 6 5.39476871 0.60523128509521484 0.36630490845800523 +383 6 5.85963631 0.14036369323730469 0.019701966379216174 +384 7 6.641092 0.35890817642211914 0.128815079102651 +387 5 5.16575956 0.16575956344604492 0.027476232873823392 +388 6 5.79469872 0.20530128479003906 0.042148617536440725 +389 7 5.889894 1.1101059913635254 1.2323353120611955 +391 5 5.161842 0.16184186935424805 0.026192790676077493 +392 6 4.993642 1.0063581466674805 1.0127567193640061 +395 5 5.118578 0.11857795715332031 0.014060731922654668 +396 5 6.19858265 1.198582649230957 1.4366003670374994 +398 5 5.2838583 0.28385829925537109 0.08057553405615181 +399 6 6.63788939 0.63788938522338867 0.40690286778067275 +404 6 6.922693 0.92269277572631836 0.85136195837753803 +406 7 7.06596661 0.065966606140136719 0.0043515931256479234 +409 5 6.19858265 1.198582649230957 1.4366003670374994 +413 5 6.020768 1.0207681655883789 1.0419676478786641 +414 6 5.695077 0.30492305755615234 0.092978071029392595 +415 6 6.16900349 0.16900348663330078 0.028562178494212276 +416 6 5.963897 0.036102771759033203 0.0013034101286848454 +418 6 5.963897 0.036102771759033203 0.0013034101286848454 +419 6 5.949179 0.050820827484130859 0.0025827565061717905 +422 6 6.07098675 0.070986747741699219 0.0050391183549436391 +423 6 6.07098675 0.070986747741699219 0.0050391183549436391 +428 5 5.7041 0.70410013198852539 0.49575699586625888 +429 5 5.346765 0.34676504135131836 0.12024599390338153 +430 5 5.213252 0.21325206756591797 0.045476444321138842 +434 8 6.47353649 1.526463508605957 2.3300908431056087 +436 5 5.53445244 0.53445243835449219 0.28563940886306227 +439 5 5.28787327 0.28787326812744141 0.082871018502373772 +440 7 6.07598972 0.92401027679443359 0.85379499162172579 +441 6 5.75848246 0.24151754379272461 0.058330723959670649 +442 8 7.165652 0.83434820175170898 0.69613692176631048 +449 7 6.35148335 0.64851665496826172 0.42057385177122342 +450 5 5.120258 0.12025785446166992 0.014461951559724184 +451 5 5.365356 0.3653559684753418 0.13348498370055495 +452 7 5.664081 1.3359189033508301 1.7846793163300845 +453 7 6.27505159 0.72494840621948242 0.5255501916801677 +454 7 6.35148335 0.64851665496826172 0.42057385177122342 +455 6 6.007873 0.0078730583190917969 6.198504729582055E-05 +456 7 6.707905 0.29209518432617188 0.085319596706540324 +457 5 5.548654 0.54865407943725586 0.30102129888314266 +464 5 4.955248 0.044752120971679688 0.0020027523314638529 +465 5 5.86635351 0.86635351181030273 0.75056840742604436 +466 6 6.02778864 0.027788639068603516 0.00077220846128511766 +467 6 5.234385 0.76561498641967773 0.58616630743040332 +474 6 5.60722351 0.3927764892578125 0.1542733705136925 +480 5 5.260892 0.26089191436767578 0.068064590982430673 +482 5 5.68141937 0.68141937255859375 0.46433236129814759 +483 5 5.260892 0.26089191436767578 0.068064590982430673 +484 5 5.635592 0.63559198379516602 0.40397716986467458 +487 6 5.75940228 0.24059772491455078 0.05788726523405785 +489 6 5.510854 0.48914623260498047 0.23926403687164566 +492 6 5.79296 0.20703983306884766 0.042865492477176304 +493 6 6.572476 0.57247591018676758 0.32772866774416798 +495 6 6.27768564 0.27768564224243164 0.077109315907591736 +497 6 6.73239136 0.732391357421875 0.53639710042625666 +501 6 6.09444 0.094439983367919922 0.0089189104585329915 +502 6 4.93793154 1.0620684623718262 1.1279894187648551 +504 6 6.10658 0.10657978057861328 0.011359249628185353 +507 7 6.01234531 0.98765468597412109 0.97546177872663975 +510 6 5.070314 0.92968606948852539 0.86431618780102326 +513 6 5.1853447 0.81465530395507813 0.66366326426214073 +514 7 5.73061 1.2693901062011719 1.6113512417214224 +517 6 6.6399765 0.63997650146484375 0.40956992242718115 +519 5 5.082864 0.082863807678222656 0.006866410622933472 +520 5 5.31589842 0.31589841842651367 0.099791810764372713 +521 5 5.31589842 0.31589841842651367 0.099791810764372713 +522 6 6.029837 0.029837131500244141 0.00089025441616286116 +523 6 6.27957726 0.27957725524902344 0.078163441652577603 +527 6 6.60642529 0.60642528533935547 0.3677516266989187 +528 6 6.449012 0.44901180267333984 0.20161159893996228 +529 6 6.22961235 0.22961235046386719 0.05272183148554177 +531 5 5.883754 0.88375377655029297 0.78102073756690515 +532 6 5.89077663 0.10922336578369141 0.011929743633118051 +533 6 5.89077663 0.10922336578369141 0.011929743633118051 +534 6 5.89077663 0.10922336578369141 0.011929743633118051 +535 5 5.346645 0.34664487838745117 0.12016267171225081 +538 5 5.79111242 0.79111242294311523 0.62585886573492644 +539 6 4.73198748 1.268012523651123 1.6078557601360899 +540 4 5.58705235 1.5870523452758789 2.5187351466456676 +541 5 4.98033667 0.019663333892822266 0.00038664669978061283 +544 6 5.297719 0.70228099822998047 0.49319860047489783 +546 6 5.97325468 0.026745319366455078 0.00071531210801367706 +547 6 5.00359249 0.99640750885009766 0.99282792369285744 +548 7 6.20132637 0.79867362976074219 0.63787956687519909 +549 5 4.98033667 0.019663333892822266 0.00038664669978061283 +557 6 5.614946 0.38505411148071289 0.14826666876820127 +558 5 5.63443756 0.63443756103515625 0.40251101885223761 +559 6 7.161683 1.1616830825805664 1.3495075843538871 +560 7 5.784691 1.2153091430664063 1.4769763132208027 +561 5 5.333059 0.33305883407592773 0.11092818695601636 +563 7 5.43116951 1.5688304901123047 2.4612291067060141 +565 6 5.93264961 0.067350387573242188 0.0045360747062659357 +566 6 4.46060658 1.539393424987793 2.3697321168956478 +569 6 5.11153841 0.88846158981323242 0.78936399657345646 +577 7 6.873437 0.12656307220458984 0.016018211245864222 +578 7 6.35843754 0.64156246185302734 0.41160239245891717 +581 5 5.36346531 0.36346530914306641 0.13210703095046483 +582 6 5.353838 0.64616203308105469 0.41752537299544201 +584 7 6.347109 0.65289115905761719 0.42626686557559879 +586 6 5.49523 0.50476980209350586 0.25479255310551707 +590 5 5.23018074 0.23018074035644531 0.052983173231041292 +593 5 5.085209 0.085208892822265625 0.0072605554159963503 +594 5 4.95861244 0.041387557983398438 0.0017129299558291677 +600 6 5.57480049 0.42519950866699219 0.18079462217065156 +602 5 5.085209 0.085208892822265625 0.0072605554159963503 +604 6 5.64044237 0.3595576286315918 0.12928168830717368 +606 5 5.693975 0.69397497177124023 0.48160126144489368 +607 5 5.693975 0.69397497177124023 0.48160126144489368 +609 6 5.524192 0.47580814361572266 0.22639338953104016 +612 5 5.31914854 0.31914854049682617 0.1018557909012543 +613 5 5.47212744 0.47212743759155273 0.22290431732676552 +614 5 5.47212744 0.47212743759155273 0.22290431732676552 +617 6 5.64316273 0.35683727264404297 0.12733283914803906 +618 6 5.71493149 0.28506851196289063 0.081264056512736715 +619 6 5.982226 0.017774105072021484 0.00031591881111125986 +621 5 5.498616 0.49861621856689453 0.24861813341794914 +622 6 5.97288942 0.027110576629638672 0.00073498336519151053 +624 5 5.18843842 0.18843841552734375 0.035509036446455866 +627 6 5.47441864 0.52558135986328125 0.27623576583573595 +629 6 5.612334 0.38766622543334961 0.15028510234174064 +633 5 5.130599 0.13059902191162109 0.017056104524272087 +634 6 6.27952433 0.27952432632446289 0.078133849007144818 +638 5 5.46523762 0.46523761749267578 0.2164460407302613 +639 5 5.31655645 0.31655645370483398 0.1002079883821807 +641 4 5.31725073 1.3172507286071777 1.7351494820161406 +642 6 5.8524847 0.14751529693603516 0.021760762830126623 +644 5 5.4044795 0.4044795036315918 0.16360366885805888 +645 5 5.498191 0.49819087982177734 0.2481941527375966 +649 7 6.201396 0.79860401153564453 0.63776836724082386 +652 7 6.201396 0.79860401153564453 0.63776836724082386 +653 6 5.41541433 0.58458566665649414 0.34174040166021769 +654 7 7.25669 0.25669002532958984 0.065889769103705476 +656 6 6.05820942 0.058209419250488281 0.0033883364894791157 +657 5 5.41170025 0.41170024871826172 0.16949709479467856 +660 5 5.218737 0.21873712539672852 0.047845930026824135 +661 7 7.051301 0.051301002502441406 0.0026317928577554994 +665 5 5.25191 0.25191020965576172 0.063458753728809825 +668 6 5.54373264 0.45626735687255859 0.20817990094747074 +670 6 5.238275 0.76172494888305664 0.58022489775089525 +678 7 6.917017 0.082983016967773438 0.0068861811050737742 +679 7 6.917017 0.082983016967773438 0.0068861811050737742 +680 5 5.33085632 0.3308563232421875 0.10946590662933886 +681 5 4.892623 0.10737705230712891 0.011529831362167897 +682 6 5.313394 0.68660593032836914 0.4714277035620853 +683 5 5.51385975 0.51385974884033203 0.26405184147824912 +685 5 5.8867135 0.88671350479125977 0.78626083957919946 +688 6 5.619183 0.38081693649291992 0.1450215391198526 +689 7 6.298906 0.70109415054321289 0.49153300792590926 +691 6 5.242263 0.75773715972900391 0.57416560323417798 +692 5 5.242263 0.24226284027099609 0.058691283776170167 +693 5 5.38634968 0.38634967803955078 0.14926607372126455 +694 6 5.18373251 0.81626749038696289 0.66629261586263056 +696 6 6.368618 0.36861801147460938 0.13587923838349525 +697 5 5.601098 0.60109806060791016 0.36131887846659083 +698 5 5.601098 0.60109806060791016 0.36131887846659083 +700 5 4.656213 0.34378719329833984 0.11818963427595008 +702 4 5.09696865 1.0969686508178711 1.2033402208771804 +704 6 6.340482 0.34048223495483398 0.11592815231983877 +705 5 4.518304 0.48169612884521484 0.23203116054446582 +706 5 5.316164 0.31616401672363281 0.099959685470821569 +707 6 6.184279 0.18427896499633789 0.033958736940121526 +711 6 6.457628 0.45762777328491211 0.20942317888170692 +712 6 6.457628 0.45762777328491211 0.20942317888170692 +714 6 6.295977 0.29597711563110352 0.087602452977307621 +718 7 6.52073431 0.47926568984985352 0.22969560146725598 +719 7 6.42389059 0.57610940933227539 0.33190205152118324 +720 5 5.19151926 0.19151926040649414 0.036679627106650514 +721 5 5.675269 0.67526912689208984 0.45598839373360534 +722 6 6.34894657 0.34894657135009766 0.12176370965698879 +723 8 6.46900225 1.5309977531433105 2.3439541201298653 +724 7 5.61504459 1.3849554061889648 1.9181014771320406 +725 5 5.293491 0.29349088668823242 0.086136900569044883 +726 7 6.81589365 0.18410634994506836 0.033895148090095972 +727 5 5.53785133 0.53785133361816406 0.28928405707483762 +728 5 6.199583 1.1995830535888672 1.438999502457591 +729 5 5.00468874 0.0046887397766113281 2.1984280692777247E-05 +732 7 4.63813353 2.3618664741516113 5.5784132417213641 +735 6 5.423086 0.57691383361816406 0.33282957142000669 +738 7 6.386245 0.61375522613525391 0.37669547760833666 +749 6 6.437719 0.43771886825561523 0.19159780762697665 +752 6 5.85753632 0.14246368408203125 0.020295901282224804 +757 6 5.437741 0.56225919723510742 0.31613540487546743 +758 7 6.76649237 0.23350763320922852 0.0545258147669756 +760 6 5.98200846 0.017991542816162109 0.00032369561290579441 +761 6 5.923116 0.076883792877197266 0.005911117607183769 +764 6 5.51022 0.48977994918823242 0.23988439862682753 +765 6 5.8884306 0.11156940460205078 0.01244773204325611 +770 7 6.357949 0.64205121994018555 0.41222976902668051 +773 5 5.643422 0.64342212677001953 0.41399203321725508 +774 9 5.385422 3.6145777702331543 13.065172457063682 +778 7 5.48641634 1.5135836601257324 2.2909354961996087 +779 8 6.92966747 1.0703325271606445 1.1456117186980919 +780 4 4.419568 0.41956806182861328 0.17603735850661906 +781 6 5.43529367 0.56470632553100586 0.31889323409473036 +782 7 5.48641634 1.5135836601257324 2.2909354961996087 +783 8 6.92966747 1.0703325271606445 1.1456117186980919 +784 5 5.181534 0.1815338134765625 0.032954525435343385 +785 6 5.83593655 0.16406345367431641 0.026916816831544566 +786 6 5.83314848 0.16685152053833008 0.027839429905952784 +788 7 5.66685 1.3331499099731445 1.7772886824614034 +792 5 5.650315 0.6503148078918457 0.42290934936340818 +794 5 5.241264 0.24126386642456055 0.058208253242128194 +795 5 5.309075 0.30907487869262695 0.095527280638862067 +799 8 6.387804 1.6121959686279297 2.5991758412601484 +802 5 5.40781832 0.40781831741333008 0.16631578001783964 +806 5 5.720001 0.720001220703125 0.51840175781399012 +810 5 5.14145136 0.14145135879516602 0.02000848690499879 +816 5 4.93575239 0.064247608184814453 0.0041277551574694371 +817 5 4.872991 0.12700891494750977 0.01613126447614377 +819 5 4.872991 0.12700891494750977 0.01613126447614377 +821 6 5.016827 0.98317289352416992 0.96662893856068877 +826 6 5.95949173 0.040508270263671875 0.0016409199597546831 +827 9 6.604491 2.3955087661743164 5.7384622488179957 +829 7 5.97121668 1.0287833213806152 1.0583951223509303 +836 8 6.864734 1.1352658271789551 1.2888284983603171 +838 8 6.864734 1.1352658271789551 1.2888284983603171 +840 7 6.47057533 0.52942466735839844 0.28029047840755084 +841 7 6.015294 0.98470592498779297 0.96964575870606495 +845 8 6.51863337 1.4813666343688965 2.1944471054214318 +848 7 6.015294 0.98470592498779297 0.96964575870606495 +850 7 6.28177261 0.71822738647460938 0.5158505786821479 +851 5 5.376349 0.37634897232055664 0.14163854896673911 +854 7 6.6217103 0.37828969955444336 0.14310309678899102 +855 7 6.141239 0.85876083374023438 0.73747016956622247 +856 5 5.376349 0.37634897232055664 0.14163854896673911 +858 7 5.7223134 1.277686595916748 1.6324830373853274 +859 5 5.4418416 0.44184160232543945 0.19522400154551178 +860 8 5.917643 2.0823569297790527 4.3362103829988428 +861 7 5.812392 1.1876077651977539 1.4104122039580034 +862 6 5.99450731 0.0054926872253417969 3.0169612955432967E-05 +863 6 6.19006824 0.19006824493408203 0.0361259377323222 +864 5 5.983109 0.9831089973449707 0.96650330066063361 +870 5 5.25949574 0.25949573516845703 0.067338036570617987 +871 5 5.097201 0.097200870513916016 0.0094480092286630679 +872 6 5.8650465 0.13495349884033203 0.018212446849247499 +874 5 5.70609665 0.70609664916992188 0.49857247796899173 +876 9 6.585497 2.4145030975341797 5.8298252080021484 +881 6 4.8947916 1.1052083969116211 1.2214856006039554 +885 7 6.47537041 0.52462959289550781 0.27523620974170626 +887 7 6.98054171 0.019458293914794922 0.00037862520207454509 +888 6 5.94279051 0.057209491729736328 0.0032729259439747693 +890 6 5.56031656 0.43968343734741211 0.19332152507763567 +895 6 5.81204939 0.18795061111450195 0.035325432218314745 +896 6 5.99438763 0.0056123733520507813 3.1498734642809723E-05 +898 6 5.335319 0.66468095779418945 0.44180077565420106 +900 7 6.235049 0.76495122909545898 0.58515038289465338 +902 5 5.44993544 0.4499354362487793 0.20244189679237934 +904 8 5.86388254 2.1361174583435059 4.5629977958399195 +906 4 4.79390144 0.79390144348144531 0.63027950196192251 +908 4 5.38352728 1.3835272789001465 1.9141477314608437 +910 5 5.037945 0.037944793701171875 0.0014398073690244928 +912 5 5.076084 0.076084136962890625 0.0057887958973878995 +914 4 5.011776 1.0117759704589844 1.0236906143982196 +918 6 6.556393 0.55639314651489258 0.30957333348874272 +919 7 5.32240725 1.6775927543640137 2.8143174494946379 +920 7 5.549413 1.4505867958068848 2.1042020521692848 +921 6 5.48633146 0.51366853713989258 0.2638553660474372 +924 8 6.586571 1.413428783416748 1.9977809257909485 +925 5 5.22027159 0.22027158737182617 0.048519572203304051 +926 5 4.644633 0.35536718368530273 0.12628583524042369 +927 7 5.53496361 1.4650363922119141 2.1463316305053013 +930 7 6.20272636 0.79727363586425781 0.63564525044421316 +934 5 5.356482 0.35648202896118164 0.12707943697228075 +935 5 5.21572351 0.21572351455688477 0.046536634732774473 +936 5 5.39356565 0.39356565475463867 0.15489392460244744 +937 5 5.48697138 0.48697137832641602 0.2371411233091294 +938 6 5.733418 0.26658201217651367 0.071065969216078884 +940 5 5.48649 0.48648977279663086 0.23667229903571751 +944 7 5.61722565 1.3827743530273438 1.9120649113901891 +950 5 5.26733351 0.2673335075378418 0.071467204252485317 +953 5 5.79355431 0.79355430603027344 0.62972843661918887 +955 5 5.26733351 0.2673335075378418 0.071467204252485317 +956 5 4.970438 0.029561996459960938 0.000873911634698743 +958 7 5.838447 1.161552906036377 1.3492051535215523 +959 6 5.76039362 0.23960638046264648 0.057411217558410499 +960 6 5.76039362 0.23960638046264648 0.057411217558410499 +964 6 5.433831 0.56616878509521484 0.32054709321619157 +965 5 5.850355 0.85035514831542969 0.72310387826655642 +968 7 6.966538 0.033462047576904297 0.0011197086280390067 +969 7 5.98017645 1.0198235511779785 1.040040075537263 +970 7 6.274452 0.72554779052734375 0.52641959633911029 +971 7 6.336352 0.66364812850952148 0.44042883847419034 +972 6 5.526252 0.47374820709228516 0.2244373637231547 +974 6 7.051524 1.0515241622924805 1.1057030638849028 +976 6 6.41369772 0.41369771957397461 0.17114580318070693 +980 6 5.652429 0.34757089614868164 0.12080552784959764 +982 6 6.40746641 0.40746641159057617 0.16602887657450083 +983 6 6.51755238 0.51755237579345703 0.26786046168945177 +985 6 6.25447845 0.25447845458984375 0.064759283850435168 +986 6 5.613062 0.38693809509277344 0.14972108943402418 +989 7 5.79079962 1.209200382232666 1.4621655643916256 +992 5 5.663801 0.66380119323730469 0.44063202414326952 +994 6 5.55731869 0.44268131256103516 0.1959667444907609 +995 6 5.59174728 0.40825271606445313 0.16667028017400298 +997 6 5.473357 0.52664279937744141 0.277352638136108 +998 6 5.78107262 0.21892738342285156 0.047929199212376261 +999 7 5.74751568 1.2524843215942383 1.5687169758393793 +1002 6 5.24164534 0.75835466384887695 0.57510179618134316 +1004 6 6.97149324 0.97149324417114258 0.94379912347017125 +1006 6 6.97149324 0.97149324417114258 0.94379912347017125 +1007 5 4.93337536 0.066624641418457031 0.0044388428441379801 +1015 5 5.16026 0.16026020050048828 0.025683331864456704 +1016 5 5.38627958 0.38627958297729492 0.14921191622511287 +1017 6 5.939317 0.060682773590087891 0.0036823990105858684 +1018 6 5.7577734 0.24222660064697266 0.058673726060987974 +1021 7 6.02436972 0.97563028335571289 0.95185444980074863 +1025 6 6.155214 0.15521383285522461 0.024091333909609602 +1026 6 6.420076 0.42007589340209961 0.17646375621757215 +1027 4 4.320953 0.3209528923034668 0.10301075907796076 +1030 6 6.197439 0.19743919372558594 0.038982235219009453 +1032 6 5.37426758 0.625732421875 0.39154106378555298 +1033 6 5.37426758 0.625732421875 0.39154106378555298 +1034 3 4.92883873 1.9288387298583984 3.7204188458017597 +1037 5 4.7021246 0.29787540435791016 0.088729756521388481 +1039 5 5.92955065 0.9295506477355957 0.86406440670566553 +1040 4 5.261669 1.2616691589355469 1.5918090666091302 +1044 7 5.83602762 1.1639723777770996 1.3548316962280751 +1045 5 6.239166 1.2391657829284668 1.5355318375807201 +1047 5 3.99405575 1.0059442520141602 1.0119238381603282 +1049 6 7.25993538 1.2599353790283203 1.5874371593272372 +1051 6 5.60375547 0.39624452590942383 0.15700972431318405 +1052 5 5.979352 0.97935199737548828 0.95913033476335841 +1053 4 5.19417763 1.1941776275634766 1.4260602061731333 +1054 5 3.99405575 1.0059442520141602 1.0119238381603282 +1058 6 5.740259 0.25974082946777344 0.067465298492606962 +1059 4 5.367808 1.3678078651428223 1.8708983559465651 +1060 7 6.01093769 0.98906230926513672 0.97824425160888495 +1061 5 5.697409 0.69740915298461914 0.4863795266667239 +1064 6 5.840905 0.15909481048583984 0.025311158723525295 +1065 5 5.58919859 0.58919858932495117 0.34715497766251247 +1068 7 4.898771 2.101229190826416 4.415164112381035 +1069 6 6.51569176 0.51569175720214844 0.26593798844623961 +1071 5 5.58919859 0.58919858932495117 0.34715497766251247 +1072 7 5.658098 1.3419017791748047 1.8007003849525063 +1074 6 4.78750324 1.2124967575073242 1.470148386965775 +1075 7 6.55795527 0.44204473495483398 0.19540354770128943 +1076 6 5.85578537 0.14421463012695313 0.020797859542653896 +1077 5 5.646455 0.64645481109619141 0.41790382278941252 +1079 6 5.67320061 0.32679939270019531 0.10679784306921647 +1080 7 5.97999525 1.0200047492980957 1.0404096885906711 +1082 6 5.49658728 0.50341272354125977 0.25342437022322883 +1083 6 6.262478 0.26247787475585938 0.0688946347363526 +1084 7 5.99038124 1.0096187591552734 1.019330038838234 +1085 5 4.72637224 0.27362775802612305 0.074872149962402545 +1086 8 6.815828 1.1841721534729004 1.4022636890606464 +1088 6 6.262478 0.26247787475585938 0.0688946347363526 +1090 6 5.95233536 0.047664642333984375 0.0022719181288266554 +1091 6 6.284743 0.28474283218383789 0.081078480480073267 +1092 6 6.023808 0.023808002471923828 0.00056682098170313111 +1094 5 5.72295761 0.72295761108398438 0.52266770742426161 +1095 8 6.37091827 1.6290817260742188 2.6539072702289559 +1098 6 5.96830368 0.031696319580078125 0.0010046566749224439 +1099 7 6.86467171 0.13532829284667969 0.018313746844796697 +1100 6 5.49658728 0.50341272354125977 0.25342437022322883 +1101 6 6.43475533 0.43475532531738281 0.18901219289182336 +1103 5 4.511087 0.48891305923461914 0.2390359794901542 +1112 6 5.26224566 0.73775434494018555 0.54428147347812228 +1119 5 4.98052025 0.019479751586914063 0.00037946072188788094 +1122 7 6.588348 0.4116520881652832 0.1694574416908381 +1125 6 4.712504 1.2874960899353027 1.6576461815986931 +1126 7 7.344084 0.34408378601074219 0.11839365179548622 +1129 7 6.40953732 0.59046268463134766 0.34864618194205832 +1130 6 5.62957954 0.37042045593261719 0.13721131417332799 +1133 5 5.253349 0.25334882736206055 0.064185628325731159 +1134 5 5.680931 0.68093109130859375 0.46366715111071244 +1135 6 5.65637636 0.34362363815307617 0.11807720469755623 +1136 8 6.62064457 1.3793554306030273 1.902621403934063 +1137 8 6.2427845 1.7572154998779297 3.0878063130112423 +1138 5 5.055894 0.055893898010253906 0.0031241278347806656 +1140 6 5.753335 0.24666500091552734 0.060843622676657105 +1141 5 4.90070629 0.099293708801269531 0.0098592406075113104 +1143 5 5.72487831 0.72487831115722656 0.52544856598615297 +1144 5 5.61719847 0.61719846725463867 0.38093394798147528 +1146 5 5.02811861 0.028118610382080078 0.00079065624981922156 +1147 5 5.056607 0.056606769561767578 0.0032043263602190564 +1148 6 6.078053 0.078052997589111328 0.0060922704326458188 +1151 5 5.05896759 0.05896759033203125 0.0034771767095662653 +1153 6 5.77633762 0.22366237640380859 0.050024858618598955 +1155 4 6.221552 2.2215518951416016 4.9352928228072415 +1158 6 5.825183 0.17481708526611328 0.030561013300939521 +1159 6 5.808246 0.19175386428833008 0.036769544469507309 +1164 6 5.17904854 0.82095146179199219 0.67396130261840881 +1165 5 6.273182 1.2731819152832031 1.6209921894042054 +1166 5 4.81632471 0.18367528915405273 0.033736611845824882 +1168 5 5.876407 0.87640714645385742 0.76808948635539309 +1169 6 6.071286 0.071286201477050781 0.005081722521026677 +1170 6 5.34411 0.65588998794555664 0.43019167628722244 +1174 6 5.6522193 0.34778070449829102 0.12095141842132762 +1175 5 5.39869833 0.39869832992553711 0.15896035828541244 +1177 6 5.67815351 0.32184648513793945 0.10358515999564588 +1181 6 5.36447144 0.635528564453125 0.40389655623584986 +1182 5 6.27437162 1.2743716239929199 1.6240230360383521 +1184 7 6.60242748 0.39757251739501953 0.15806390658781311 +1186 5 5.32623339 0.3262333869934082 0.10642822278919084 +1187 8 6.35104036 1.6489596366882324 2.7190678834269875 +1191 7 6.0864296 0.91357040405273438 0.83461088316107634 +1195 6 5.57003355 0.42996644973754883 0.1848711478999121 +1198 6 5.755423 0.24457693099975586 0.059817875177259339 +1199 7 5.731105 1.268895149230957 1.6100948997418527 +1200 6 6.085916 0.085916042327880859 0.0073815663292862155 +1201 7 5.94414234 1.0558576583862305 1.1148353947728538 +1202 5 5.404809 0.40480899810791016 0.16387032494913001 +1204 6 5.518382 0.48161792755126953 0.23195582813877991 +1206 6 5.445193 0.55480718612670898 0.30781101377783671 +1207 5 5.404809 0.40480899810791016 0.16387032494913001 +1208 6 6.66462374 0.66462373733520508 0.44172471222941567 +1210 6 4.54080772 1.4591922760009766 2.1292420983409102 +1212 6 6.115354 0.11535406112670898 0.013306559418424513 +1213 6 5.518382 0.48161792755126953 0.23195582813877991 +1214 6 4.642589 1.3574109077453613 1.8425643724660858 +1216 8 6.710257 1.2897429466247559 1.6634368683683078 +1218 8 6.31677532 1.6832246780395508 2.8332453167613494 +1220 6 5.611329 0.38867092132568359 0.15106508508415573 +1221 7 7.4408474 0.44084739685058594 0.19434642730993801 +1229 3 6.484815 3.4848151206970215 12.143936425438596 +1231 7 6.67793751 0.32206249237060547 0.10372424899196631 +1232 7 6.457521 0.54247903823852539 0.29428350692819549 +1233 6 6.70588541 0.70588541030883789 0.49827421248687642 +1234 6 6.234978 0.23497819900512695 0.055214754007693045 +1238 7 6.59822941 0.40177059173583984 0.1614196083837669 +1240 6 5.63298655 0.36701345443725586 0.13469887573796768 +1243 7 6.59822941 0.40177059173583984 0.1614196083837669 +1246 7 5.8469286 1.153071403503418 1.3295736615773421 +1248 7 5.684961 1.3150391578674316 1.7293279867246838 +1249 5 4.7347455 0.26525449752807617 0.070359948458872168 +1251 5 5.594396 0.59439611434936523 0.35330674075362367 +1253 7 6.62163353 0.37836647033691406 0.14316118587521487 +1254 5 5.51827049 0.51827049255371094 0.26860430345186614 +1255 6 5.69098949 0.30901050567626953 0.095487492618303804 +1257 6 5.76259565 0.23740434646606445 0.05636082372097917 +1259 6 5.48381853 0.51618146896362305 0.26644330890144374 +1260 6 5.49859047 0.50140953063964844 0.25141151741627255 +1261 6 5.657525 0.34247493743896484 0.11728908277382288 +1263 6 4.709868 1.2901320457458496 1.664440695460371 +1265 7 6.08131742 0.91868257522583008 0.84397767402356294 +1266 8 6.710818 1.289182186126709 1.6619907090264405 +1268 5 5.2311573 0.23115730285644531 0.05343369866386638 +1269 6 5.478538 0.52146196365356445 0.27192257953743137 +1274 6 5.478538 0.52146196365356445 0.27192257953743137 +1277 5 5.2311573 0.23115730285644531 0.05343369866386638 +1280 6 6.807374 0.80737400054931641 0.65185277676300757 +1281 7 6.404438 0.59556198120117188 0.354694073452265 +1282 5 4.99746656 0.0025334358215332031 6.4182970618276158E-06 +1285 6 6.807374 0.80737400054931641 0.65185277676300757 +1290 6 5.89834833 0.10165166854858398 0.010333061718711178 +1291 6 5.971956 0.028044223785400391 0.00078647848772561701 +1293 4 5.190955 1.1909551620483398 1.4183741980095874 +1296 6 6.45353 0.45352983474731445 0.20568931100592636 +1297 7 6.804424 0.19557619094848633 0.038250046465918786 +1300 6 5.398065 0.60193490982055664 0.36232563566068166 +1301 5 6.25851965 1.2585196495056152 1.5838717081917366 +1302 6 5.77307749 0.22692251205444336 0.051493826477098992 +1306 8 6.853728 1.1462721824645996 1.3139399162921563 +1308 6 5.370329 0.62967109680175781 0.39648569014752866 +1313 5 4.95963049 0.040369510650634766 0.0016296973901717138 +1314 6 5.40624571 0.59375429153442383 0.35254415871554556 +1320 6 5.42479229 0.57520771026611328 0.33086390994958492 +1323 5 6.09546757 1.0954675674438477 1.2000491913213409 +1324 6 5.879797 0.12020301818847656 0.014448765581619227 +1325 7 6.58349276 0.41650724411010742 0.17347828439619661 +1327 6 5.74115562 0.25884437561035156 0.067000410785112763 +1328 6 6.5878973 0.58789730072021484 0.34562323619411472 +1330 5 5.31433058 0.3143305778503418 0.098803712171729785 +1331 6 5.859345 0.1406550407409668 0.019783840485843029 +1334 6 5.78381538 0.21618461608886719 0.046735788233490894 +1336 8 5.991396 2.0086040496826172 4.0344902284014097 +1337 5 5.665654 0.66565418243408203 0.44309549059198616 +1338 5 5.665654 0.66565418243408203 0.44309549059198616 +1340 6 5.678114 0.32188606262207031 0.10361063731033937 +1341 5 4.881372 0.11862802505493164 0.014072608328433489 +1344 8 6.458304 1.5416960716247559 2.3768267772632043 +1345 8 7.06284952 0.93715047836303711 0.87825101909606929 +1346 7 6.51082373 0.48917627334594727 0.23929342640462892 +1348 8 5.991396 2.0086040496826172 4.0344902284014097 +1350 7 6.269445 0.73055505752563477 0.53371069207628352 +1354 5 6.408069 1.4080691337585449 1.9826586854435391 +1355 5 5.80267048 0.80267047882080078 0.6442798975704136 +1356 6 5.897979 0.10202121734619141 0.010408328788798826 +1361 7 6.297319 0.70268106460571289 0.49376067855541805 +1363 4 5.39580774 1.3958077430725098 1.9482792556211734 +1365 7 6.33742571 0.66257429122924805 0.43900469139794041 +1366 6 5.644856 0.35514402389526367 0.12612727770851961 +1367 5 5.3965373 0.39653730392456055 0.1572418334037593 +1370 6 5.53704166 0.46295833587646484 0.21433042075750564 +1372 6 4.98262644 1.0173735618591309 1.0350489643699348 +1373 6 4.98262644 1.0173735618591309 1.0350489643699348 +1375 7 6.539049 0.46095085144042969 0.21247568744365708 +1379 6 4.545688 1.4543118476867676 2.1150229503220999 +1380 7 6.878299 0.12170076370239258 0.014811075885745595 +1381 7 6.69022655 0.30977344512939453 0.095959587307334004 +1382 6 4.617643 1.382357120513916 1.9109112086355253 +1383 6 5.60604048 0.39395952224731445 0.15520410516933225 +1384 6 4.96960258 1.0303974151611328 1.0617188331707439 +1386 7 6.814375 0.18562507629394531 0.034456668949133018 +1388 7 6.14732 0.85268020629882813 0.72706353421381209 +1389 6 5.456267 0.54373311996459961 0.29564570574643767 +1393 6 5.9041357 0.095864295959472656 0.0091899632398053654 +1394 7 6.814375 0.18562507629394531 0.034456668949133018 +1395 7 6.31325054 0.68674945831298828 0.47162481849318283 +1398 7 6.0729084 0.92709159851074219 0.85949883202920319 +1400 7 6.0729084 0.92709159851074219 0.85949883202920319 +1403 8 6.553515 1.4464850425720215 2.0923189783845828 +1404 5 4.51477766 0.48522233963012695 0.23544071887613427 +1406 8 5.84692955 2.1530704498291016 4.6357123619272897 +1407 6 6.19066143 0.19066143035888672 0.03635178102649661 +1408 7 6.0729084 0.92709159851074219 0.85949883202920319 +1409 6 5.880574 0.11942577362060547 0.014262515404880105 +1411 6 6.30539227 0.30539226531982422 0.09326443571717391 +1413 6 5.36225033 0.63774967193603516 0.40672464405452047 +1416 6 5.817216 0.18278408050537109 0.033410020086193981 +1419 7 5.729145 1.2708549499511719 1.6150723038153956 +1420 4 5.15809631 1.1580963134765625 1.3411870712880045 +1421 6 6.552526 0.55252599716186523 0.30528497753971351 +1424 6 5.36225033 0.63774967193603516 0.40672464405452047 +1425 6 5.522351 0.47764921188354492 0.22814876961297159 +1426 6 6.43497562 0.43497562408447266 0.18920379354767647 +1427 5 6.09880924 1.0988092422485352 1.2073817508508 +1431 5 5.47524738 0.47524738311767578 0.2258600751601989 +1434 5 6.09880924 1.0988092422485352 1.2073817508508 +1436 5 4.29367065 0.706329345703125 0.49890114460140467 +1437 7 6.381414 0.61858606338500977 0.38264871781416332 +1438 5 5.76378441 0.76378440856933594 0.58336662277361029 +1439 5 5.28301859 0.28301858901977539 0.080099521730744527 +1440 5 5.32609844 0.32609844207763672 0.10634019392546179 +1442 5 5.15215874 0.15215873718261719 0.02315228130100877 +1443 6 6.60022068 0.60022068023681641 0.36026486498394661 +1447 6 5.92240143 0.07759857177734375 0.00602153834188357 +1456 6 6.18065453 0.18065452575683594 0.032636057676427299 +1457 6 6.200436 0.20043611526489258 0.040174636302481304 +1458 6 6.735425 0.73542499542236328 0.54084992389198305 +1459 6 6.14485168 0.1448516845703125 0.020982010522857308 +1460 6 6.245408 0.24540805816650391 0.060225115013054165 +1461 6 6.01023769 0.010237693786621094 0.00010481037406862015 +1462 6 5.92240143 0.07759857177734375 0.00602153834188357 +1463 6 5.547709 0.45229101181030273 0.20456715936438741 +1464 8 6.88174152 1.1182584762573242 1.2505020197213526 +1465 5 5.582034 0.58203411102294922 0.33876370639427478 +1470 7 6.841235 0.15876483917236328 0.025206274157426378 +1471 6 6.24523163 0.24523162841796875 0.060138551576528698 +1474 4 4.629509 0.62950897216796875 0.39628154603997245 +1478 6 5.93162775 0.068372249603271484 0.0046747645158120577 +1480 6 6.046388 0.046388149261474609 0.0021518603919048473 +1482 6 5.490122 0.50987815856933594 0.25997573658605688 +1484 3 4.92298555 1.9229855537414551 3.6978734398983306 +1485 6 5.54977131 0.45022869110107422 0.20270587429058651 +1486 6 5.915575 0.084424972534179688 0.0071275759873969946 +1488 6 5.247855 0.75214481353759766 0.56572182053150755 +1489 5 5.878215 0.87821483612060547 0.77126129838234192 +1492 5 5.32583046 0.32583045959472656 0.10616548839971074 +1494 8 6.80715847 1.1928415298461914 1.4228709153258023 +1495 7 6.69690275 0.30309724807739258 0.091867941792088459 +1498 6 5.70931149 0.29068851470947266 0.084499812583999301 +1502 5 5.34187937 0.34187936782836914 0.11688150214672532 +1503 7 6.465032 0.53496789932250977 0.28619065330553894 +1505 7 5.42042446 1.5795755386352539 2.4950588822548525 +1506 6 6.12831974 0.12831974029541016 0.016465955749481509 +1508 6 5.17407465 0.82592535018920898 0.68215268408516749 +1509 5 5.704465 0.70446491241455078 0.4962708128232407 +1510 5 5.57555246 0.57555246353149414 0.33126063827717189 +1511 6 5.37051249 0.62948751449584961 0.39625453090616247 +1514 7 6.654268 0.34573221206665039 0.11953076246049932 +1518 6 6.37047958 0.37047958374023438 0.13725512196833733 +1519 5 5.5685 0.56850004196166992 0.32319229771042046 +1521 5 5.34187937 0.34187936782836914 0.11688150214672532 +1522 5 6.161465 1.1614651679992676 1.3490013364755669 +1523 6 5.701397 0.29860305786132813 0.089163786164135672 +1524 6 5.57626057 0.42373943328857422 0.17955510732372204 +1525 5 5.21797943 0.21797943115234375 0.047515032405499369 +1528 6 6.10163975 0.10163974761962891 0.01033063829618186 +1529 6 5.57626057 0.42373943328857422 0.17955510732372204 +1531 7 5.82842255 1.1715774536132813 1.3725937298149802 +1534 6 5.86905527 0.13094472885131836 0.017146522013945287 +1535 6 6.004974 0.0049738883972167969 2.4739565787967877E-05 +1536 5 5.1332283 0.13322830200195313 0.017749780454323627 +1537 6 5.380709 0.61929082870483398 0.38352113051792003 +1539 6 6.15297651 0.15297651290893555 0.023401813501777724 +1541 4 4.89264536 0.89264535903930664 0.79681573701441266 +1544 5 5.1332283 0.13322830200195313 0.017749780454323627 +1545 6 6.029986 0.029985904693603516 0.00089915448029387335 +1546 6 5.563477 0.4365229606628418 0.19055229518585293 +1547 6 5.563477 0.4365229606628418 0.19055229518585293 +1548 6 7.126276 1.1262760162353516 1.2684976647469739 +1550 6 5.78761339 0.2123866081237793 0.045108071310323794 +1553 7 6.29732943 0.70267057418823242 0.49374593583002024 +1555 7 6.534805 0.4651951789855957 0.21640655455144042 +1556 6 5.79464149 0.20535850524902344 0.042172115678113187 +1557 6 5.78761339 0.2123866081237793 0.045108071310323794 +1558 4 5.60473728 1.6047372817993164 2.5751817435966586 +1563 6 6.508431 0.50843095779418945 0.25850203884351686 +1565 6 5.905046 0.094954013824462891 0.0090162647413762897 +1566 5 5.85104227 0.85104227066040039 0.7242729464508102 +1568 6 5.8718257 0.1281743049621582 0.016428652452532333 +1570 5 5.52583742 0.52583742141723633 0.27650499376272819 +1574 4 6.22960234 2.2296023368835449 4.9711265806365645 +1575 6 5.44509125 0.55490875244140625 0.30792372353607789 +1577 4 5.4131093 1.413109302520752 1.9968779008706861 +1579 4 5.4505353 1.4505352973937988 2.1040526489853164 +1582 7 6.07192755 0.92807245254516602 0.86131847717319943 +1583 5 5.42974424 0.42974424362182617 0.18468011492609548 +1584 6 5.56638336 0.43361663818359375 0.18802338890964165 +1586 5 5.02551937 0.025519371032714844 0.00065123829790536547 +1590 6 6.50889826 0.50889825820922852 0.25897743720838662 +1591 6 6.791677 0.79167699813842773 0.62675246938147211 +1593 6 5.138271 0.86172914505004883 0.74257711942868809 +1594 6 5.59737825 0.40262174606323242 0.16210427040300601 +1595 6 5.506587 0.49341297149658203 0.24345636044108687 +1601 6 5.445505 0.55449485778808594 0.30746454731342965 +1602 5 6.579205 1.5792050361633301 2.4938885462436247 +1604 5 5.067999 0.067998886108398438 0.004623848511982942 +1605 9 6.921087 2.0789132118225098 4.3218801422901834 +1606 6 6.41273069 0.41273069381713867 0.17034662561877667 +1608 5 5.352296 0.35229587554931641 0.12411238392905943 +1611 6 5.439003 0.56099700927734375 0.31471764441812411 +1612 7 5.95403051 1.0459694862365723 1.0940521661379989 +1614 5 5.99248362 0.99248361587524414 0.98502372778079916 +1615 6 6.17295 0.17294979095458984 0.029911630191236327 +1618 6 5.036212 0.96378803253173828 0.92888737165139901 +1620 7 5.95403051 1.0459694862365723 1.0940521661379989 +1622 6 5.21739149 0.7826085090637207 0.61247607845893981 +1624 7 5.79714 1.2028598785400391 1.4468718874013575 +1625 6 6.154775 0.15477514266967773 0.023955344788419097 +1627 5 4.874259 0.12574100494384766 0.015810800324288721 +1630 5 5.171584 0.17158412933349609 0.029441113439133915 +1631 6 5.820287 0.17971277236938477 0.032296680552690304 +1635 6 5.85868073 0.14131927490234375 0.019971137458924204 +1637 6 6.16494942 0.16494941711425781 0.027208310206333408 +1638 5 5.0219636 0.021963596343994141 0.00048239956436191278 +1640 5 5.314522 0.31452178955078125 0.098923956102225929 +1643 7 6.005394 0.99460601806640625 0.98924113117391244 +1645 7 6.072939 0.92706108093261719 0.8594422477799526 +1648 5 6.300005 1.3000049591064453 1.6900128937013505 +1649 4 5.1877737 1.1877737045288086 1.4108063731700895 +1650 7 6.635081 0.36491918563842773 0.13316601204701328 +1652 4 5.59403658 1.5940365791320801 2.5409526156111042 +1661 6 5.57137442 0.42862558364868164 0.18371989095817298 +1662 7 5.93672 1.0632801055908203 1.130564582945226 +1666 5 5.0802207 0.080220699310302734 0.0064353605978340056 +1670 6 5.47703 0.52297019958496094 0.27349782965393388 +1671 7 6.782234 0.21776580810546875 0.047421947179827839 +1672 5 5.58361244 0.58361244201660156 0.34060348247658112 +1675 5 5.515949 0.51594877243041992 0.26620313577245724 +1676 7 6.782234 0.21776580810546875 0.047421947179827839 +1678 6 5.84444141 0.15555858612060547 0.024198473715841828 +1682 7 6.28926134 0.7107386589050293 0.50514944126211958 +1683 7 6.28926134 0.7107386589050293 0.50514944126211958 +1686 5 6.27901173 1.2790117263793945 1.6358709962159992 +1687 7 6.0611124 0.93888759613037109 0.88150991816746682 +1689 6 6.20967627 0.20967626571655273 0.043964136404838428 +1691 7 6.28926134 0.7107386589050293 0.50514944126211958 +1692 6 6.29506445 0.29506444931030273 0.087063029246792212 +1693 5 5.413152 0.41315221786499023 0.17069475512676036 +1694 6 5.864325 0.13567495346069336 0.018407692996561309 +1695 6 6.37711525 0.37711524963378906 0.14221591150635504 +1696 6 5.542532 0.45746803283691406 0.20927700106767588 +1698 6 6.29506445 0.29506444931030273 0.087063029246792212 +1700 6 6.019749 0.019749164581298828 0.00039002950165922812 +1703 5 5.314096 0.31409597396850586 0.09865628086322431 +1705 6 6.80662727 0.80662727355957031 0.65064755845014588 +1708 4 5.587132 1.5871319770812988 2.5189879126739925 +1710 5 5.041333 0.041333198547363281 0.0017084333021557541 +1712 6 5.72083235 0.27916765213012695 0.077934577995847576 +1717 6 5.54116535 0.45883464813232422 0.21052923432671378 +1718 4 5.17026567 1.1702656745910645 1.3695217491260792 +1722 6 6.35374975 0.35374975204467773 0.12513888707167098 +1726 6 6.738525 0.7385249137878418 0.54541904828533916 +1727 6 5.399927 0.60007286071777344 0.36008743817001232 +1729 6 6.474758 0.47475814819335938 0.22539529927598778 +1730 6 5.602798 0.3972020149230957 0.15776944065896714 +1732 5 5.432952 0.43295192718505859 0.18744737125325628 +1733 6 5.758369 0.24163103103637695 0.058385555159702562 +1737 6 5.744494 0.25550603866577148 0.065283335794674713 +1738 5 5.71241426 0.71241426467895508 0.50753408451805626 +1741 6 6.7084403 0.70844030380249023 0.50188766405176466 +1742 6 5.48805237 0.5119476318359375 0.26209037774242461 +1745 5 5.133648 0.13364791870117188 0.017861766173155047 +1750 6 6.308025 0.30802488327026367 0.094879328713659561 +1751 7 6.39781 0.60219001770019531 0.36263281741776154 +1752 6 5.633576 0.3664240837097168 0.13426660912250554 +1757 5 5.08499527 0.084995269775390625 0.0072241958841914311 +1759 5 4.57264137 0.42735862731933594 0.18263539634426706 +1760 6 5.35816765 0.64183235168457031 0.41194876766894595 +1761 6 5.830978 0.1690220832824707 0.028568464637146462 +1762 7 6.204322 0.79567813873291016 0.63310370045746822 +1763 6 6.088181 0.088181018829345703 0.0077758920817814214 +1764 5 5.18299437 0.18299436569213867 0.033486937875068179 +1766 5 5.059079 0.059079170227050781 0.0034903483547168435 +1769 7 6.512047 0.48795318603515625 0.2380983117618598 +1770 6 5.67229652 0.32770347595214844 0.10738956815112033 +1771 6 5.850691 0.14930915832519531 0.022293224759778241 +1777 6 5.850691 0.14930915832519531 0.022293224759778241 +1778 8 7.38504457 0.61495542526245117 0.37817017505972217 +1780 5 5.904208 0.90420818328857422 0.81759243872602383 +1781 4 5.6435194 1.643519401550293 2.7011560232722331 +1782 6 6.042781 0.042780876159667969 0.0018302033649888472 +1786 7 6.63890934 0.36109066009521484 0.13038646480799798 +1787 7 6.88856936 0.11143064498901367 0.012416788642667598 +1790 5 5.07970238 0.079702377319335938 0.0063524689503537957 +1791 5 5.499499 0.49949884414672852 0.24949909530391778 +1792 6 5.63644028 0.36355972290039063 0.13217567211540882 +1793 5 5.090697 0.090696811676025391 0.0082259116481964156 +1796 5 6.436928 1.4369277954101563 2.0647614892222919 +1797 8 6.802576 1.1974239349365234 1.4338240799588675 +1798 6 5.83613729 0.16386270523071289 0.026850986165527502 +1799 6 5.91608953 0.083910465240478516 0.0070409661768735532 +1804 6 5.375231 0.62476921081542969 0.39033656678293482 +1806 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1807 6 5.644393 0.35560703277587891 0.12645636175966501 +1808 5 5.25200033 0.25200033187866211 0.063504167266955847 +1809 6 5.644393 0.35560703277587891 0.12645636175966501 +1811 5 4.99574757 0.0042524337768554688 1.8083193026541267E-05 +1813 6 6.00334644 0.0033464431762695313 1.1198681932000909E-05 +1815 6 5.752005 0.24799489974975586 0.061501470301891459 +1819 6 6.7389946 0.73899459838867188 0.54611301644763444 +1820 6 5.752005 0.24799489974975586 0.061501470301891459 +1822 7 6.971259 0.028740882873535156 0.00082603834835026646 +1833 7 6.58283949 0.4171605110168457 0.17402289195183585 +1834 6 5.627404 0.37259578704833984 0.13882762052617181 +1837 7 6.70057869 0.29942131042480469 0.089653121136507252 +1838 6 5.41108942 0.58891057968139648 0.34681567086067844 +1839 6 5.501237 0.49876308441162109 0.24876461437179387 +1840 5 6.12066841 1.1206684112548828 1.2558976879845432 +1842 6 6.20005941 0.20005941390991211 0.040023769093977535 +1846 5 5.35677 0.35677003860473633 0.12728486044602505 +1848 5 4.703982 0.29601812362670898 0.087626729515477564 +1849 6 5.983951 0.016048908233642578 0.00025756745549188054 +1850 7 5.676928 1.3230719566345215 1.7505194024327011 +1851 6 6.48563433 0.48563432693481445 0.23584069949743025 +1852 7 6.038734 0.96126604080200195 0.92403240119915608 +1853 5 5.17571163 0.17571163177490234 0.030874577540998871 +1855 6 6.008804 0.0088038444519042969 7.7507677133326069E-05 +1856 4 4.440154 0.44015407562255859 0.19373561028714903 +1857 5 5.032861 0.032861232757568359 0.0010798606183470838 +1860 6 5.77942848 0.22057151794433594 0.04865179452826851 +1864 6 6.325848 0.32584810256958008 0.10617698594819558 +1865 6 5.458929 0.54107093811035156 0.29275776006761589 +1869 7 6.116072 0.88392782211303711 0.78132839470549698 +1870 6 5.875573 0.12442684173583984 0.015482038944355736 +1872 5 4.96669054 0.033309459686279297 0.0011095201045918657 +1875 5 5.0912385 0.091238498687744141 0.0083244636427934893 +1880 5 5.175462 0.17546176910400391 0.03078683241710678 +1881 6 5.950545 0.049455165863037109 0.002445813430540511 +1882 5 5.175462 0.17546176910400391 0.03078683241710678 +1886 5 4.60353565 0.39646434783935547 0.15718397910768545 +1891 5 5.446395 0.44639492034912109 0.19926842491349817 +1893 5 5.2195406 0.21954059600830078 0.048198073295679933 +1895 6 5.80891371 0.1910862922668457 0.036513971092290376 +1896 6 5.608869 0.39113092422485352 0.1529833998849881 +1897 6 5.608869 0.39113092422485352 0.1529833998849881 +1898 6 5.20592976 0.79407024383544922 0.63054755214488978 +1904 6 5.80891371 0.1910862922668457 0.036513971092290376 +1907 7 6.76484728 0.2351527214050293 0.055296802384191324 +1908 7 6.8543663 0.14563369750976563 0.021209173850365914 +1909 5 5.87015438 0.87015438079833984 0.75716864642254222 +1910 5 5.54551744 0.5455174446105957 0.29758928237447435 +1911 6 5.793866 0.20613384246826172 0.042491161010730139 +1912 6 5.967311 0.032689094543457031 0.0010685769020710723 +1913 6 5.73380566 0.26619434356689453 0.070859428547009884 +1914 6 6.51671028 0.51671028137207031 0.26698951487560407 +1915 7 6.8543663 0.14563369750976563 0.021209173850365914 +1916 5 5.54551744 0.5455174446105957 0.29758928237447435 +1918 6 5.754359 0.24564123153686523 0.060339614630947835 +1920 7 5.34622431 1.653775691986084 2.7349740394040509 +1922 5 5.769138 0.76913785934448242 0.59157304667701283 +1923 5 4.63728237 0.36271762847900391 0.13156407800943271 +1925 6 5.87001657 0.12998342514038086 0.016895690811224995 +1926 6 5.80602169 0.19397830963134766 0.037627584607434983 +1927 5 5.79432964 0.79432964324951172 0.63095958214489656 +1929 5 5.39010525 0.39010524749755859 0.15218210412513145 +1930 6 5.574939 0.42506122589111328 0.18067704575605603 +1931 3 5.49573374 2.4957337379455566 6.2286868907197004 +1933 5 4.799954 0.20004606246948242 0.040018427109544064 +1938 5 5.91960573 0.91960573196411133 0.84567470226124897 +1940 5 4.84486437 0.1551356315612793 0.024067064179916997 +1941 5 5.34108162 0.34108161926269531 0.11633667099886225 +1943 5 5.51694345 0.51694345474243164 0.26723053540104047 +1944 5 5.21851873 0.21851873397827148 0.047750437099466581 +1946 6 4.722785 1.2772150039672852 1.6312781663591522 +1948 7 6.280798 0.71920204162597656 0.51725157667897292 +1949 5 5.261702 0.26170206069946289 0.068487968574345359 +1950 5 5.22447157 0.2244715690612793 0.050387485316832681 +1951 4 4.855174 0.85517406463623047 0.73132268082645169 +1952 7 6.520986 0.47901391983032227 0.22945433539121041 +1953 6 6.01531935 0.015319347381591797 0.00023468240419788344 +1955 5 5.68653727 0.68653726577758789 0.47133341730136635 +1959 5 5.41501045 0.41501045227050781 0.17223367549377144 +1960 5 5.41501045 0.41501045227050781 0.17223367549377144 +1966 6 5.78424644 0.21575355529785156 0.046549596623663092 +1969 7 6.70432138 0.29567861557006836 0.087425843705432271 +1970 6 5.3136754 0.6863245964050293 0.47104145163052635 +1972 5 5.7198534 0.71985340118408203 0.51818891919629095 +1974 5 5.129496 0.12949609756469727 0.016769239284485593 +1975 6 5.346977 0.65302276611328125 0.42643873306224123 +1977 6 5.750509 0.24949121475219727 0.062245866238527015 +1978 6 5.46808672 0.53191328048706055 0.28293173795850635 +1979 6 5.278212 0.72178792953491211 0.52097781522229525 +1980 8 7.46080828 0.53919172286987305 0.29072771401138198 +1982 8 7.46080828 0.53919172286987305 0.29072771401138198 +1984 8 7.46080828 0.53919172286987305 0.29072771401138198 +1985 6 6.078637 0.078637123107910156 0.0061837971306886175 +1986 6 5.89531374 0.10468626022338867 0.010959213079559049 +1989 7 6.54342365 0.45657634735107422 0.20846196096044878 +1990 4 5.04370642 1.0437064170837402 1.0893230850617783 +1992 5 5.810789 0.81078910827636719 0.65737897809958667 +1993 6 5.87721062 0.12278938293457031 0.015077232561452547 +1996 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +1997 6 6.140746 0.14074611663818359 0.019809469348729181 +1998 6 6.140746 0.14074611663818359 0.019809469348729181 +2001 5 4.93630362 0.063696384429931641 0.0040572293894456379 +2002 6 6.542301 0.54230117797851563 0.29409056763688568 +2003 6 5.87721062 0.12278938293457031 0.015077232561452547 +2004 6 5.55052233 0.4494776725769043 0.20203017814515078 +2005 6 6.007432 0.0074319839477539063 5.5234385399671737E-05 +2007 6 5.74052048 0.25947952270507813 0.067329622703255154 +2008 5 6.02844238 1.0284423828125 1.0576937347650528 +2011 5 6.02844238 1.0284423828125 1.0576937347650528 +2019 6 5.84197569 0.15802431106567383 0.024971682887780844 +2022 6 5.573394 0.42660617828369141 0.1819928313498167 +2024 5 4.792466 0.20753383636474609 0.043070293236269208 +2025 5 5.124267 0.1242671012878418 0.015442312462482732 +2027 5 5.156991 0.15699100494384766 0.024646175633279199 +2028 6 5.789144 0.21085596084594727 0.044460236224267646 +2029 6 5.573394 0.42660617828369141 0.1819928313498167 +2031 5 5.7133007 0.71330070495605469 0.50879789569080458 +2032 6 5.85084 0.14915990829467773 0.022248678242476672 +2034 5 5.98954344 0.98954343795776367 0.97919621560527048 +2035 5 5.27746 0.27746009826660156 0.076984106130112195 +2037 5 5.7133007 0.71330070495605469 0.50879789569080458 +2038 5 5.343353 0.3433527946472168 0.11789114159205383 +2039 5 5.00838852 0.008388519287109375 7.0367255830205977E-05 +2043 6 6.453859 0.45385885238647461 0.20598785788956775 +2048 5 5.30091667 0.30091667175292969 0.090550843338860432 +2050 3 5.17047644 2.1704764366149902 4.7109679619009057 +2051 5 5.27376 0.27375984191894531 0.074944451047485927 +2052 5 5.27376 0.27375984191894531 0.074944451047485927 +2057 7 6.840732 0.15926790237426758 0.025366264726699228 +2058 5 5.52679253 0.52679252624511719 0.27751036570771248 +2060 5 5.52702427 0.52702426910400391 0.27775458022460953 +2061 6 6.108241 0.10824108123779297 0.011716131667526497 +2062 5 6.280643 1.2806429862976074 1.6400464583532539 +2063 5 5.4906826 0.49068260192871094 0.2407694158355298 +2064 6 5.73145771 0.26854228973388672 0.07211496137551876 +2065 5 5.608661 0.60866117477416992 0.37046842567747262 +2066 5 5.57306 0.57306003570556641 0.32839780452286504 +2067 5 5.59425449 0.59425449371337891 0.35313840329854429 +2069 7 6.59054 0.40946006774902344 0.16765754708103486 +2070 6 5.66930771 0.33069229125976563 0.10935739149863366 +2071 6 5.56511641 0.43488359451293945 0.18912374077649474 +2073 5 5.19534159 0.19534158706665039 0.038158335637717755 +2074 6 5.73145771 0.26854228973388672 0.07211496137551876 +2076 5 5.3422966 0.34229660034179688 0.11716696260555182 +2078 6 6.25093269 0.25093269348144531 0.062967216657852987 +2079 4 5.891479 1.8914790153503418 3.5776928655106985 +2080 5 5.3422966 0.34229660034179688 0.11716696260555182 +2082 6 5.71104145 0.28895854949951172 0.083497043328861764 +2084 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2085 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2086 5 5.576943 0.57694292068481445 0.3328631337283241 +2087 6 6.12987661 0.12987661361694336 0.016867934764604797 +2089 6 5.95062447 0.049375534057617188 0.0024379433634749148 +2090 5 5.118404 0.11840391159057617 0.014019486279948978 +2091 5 5.15253925 0.15253925323486328 0.023268223777449748 +2094 5 5.23734331 0.23734331130981445 0.056331847423507497 +2096 5 5.091876 0.091876029968261719 0.0084412048827289254 +2097 5 5.54533148 0.54533147811889648 0.29738642102734048 +2099 5 5.692176 0.69217586517333984 0.47910742832846154 +2102 5 5.36260748 0.36260747909545898 0.13148418389596372 +2103 5 5.19033051 0.19033050537109375 0.036225701274815947 +2104 5 5.692176 0.69217586517333984 0.47910742832846154 +2106 5 5.2858057 0.28580570220947266 0.081684899415449763 +2110 5 5.56804276 0.56804275512695313 0.32267257165221963 +2111 5 5.56804276 0.56804275512695313 0.32267257165221963 +2112 5 5.56804276 0.56804275512695313 0.32267257165221963 +2113 5 5.44544268 0.44544267654418945 0.19841917808685139 +2114 6 5.8123064 0.18769359588623047 0.035228885936703591 +2115 5 5.56804276 0.56804275512695313 0.32267257165221963 +2116 4 6.282538 2.2825379371643066 5.2099794345942883 +2118 6 6.26503849 0.26503849029541016 0.070245401338070224 +2120 5 5.75094 0.75093984603881836 0.56391065236880422 +2121 7 6.83608341 0.16391658782958984 0.026868647765695641 +2122 5 5.36746025 0.36746025085449219 0.13502703595804633 +2123 5 5.75094 0.75093984603881836 0.56391065236880422 +2124 7 6.83608341 0.16391658782958984 0.026868647765695641 +2125 5 5.64372635 0.64372634887695313 0.41438361223845277 +2128 6 4.90525 1.094749927520752 1.1984774038066917 +2129 5 5.9750185 0.97501850128173828 0.95066107784168707 +2131 6 5.445048 0.55495214462280273 0.30797188282144816 +2132 6 5.445048 0.55495214462280273 0.30797188282144816 +2134 6 6.177456 0.17745590209960938 0.031490597189986147 +2136 6 5.946258 0.053741931915283203 0.0028881952459869353 +2137 5 5.778809 0.7788090705871582 0.60654356842883317 +2139 5 5.538669 0.53866910934448242 0.29016440936197796 +2142 5 5.330624 0.33062410354614258 0.10931229784569041 +2143 7 6.23745155 0.76254844665527344 0.5814801334963704 +2146 6 5.73914528 0.26085472106933594 0.068045185504161054 +2147 5 5.35492229 0.35492229461669922 0.12596983521598304 +2148 5 5.538669 0.53866910934448242 0.29016440936197796 +2150 6 6.503435 0.50343513488769531 0.25344693503939197 +2152 6 5.99008369 0.0099163055419921875 9.8333115602144971E-05 +2157 6 6.22612 0.2261199951171875 0.051130252191796899 +2158 6 5.796968 0.20303201675415039 0.041221999827257605 +2161 7 6.53926039 0.4607396125793457 0.21228099059976557 +2162 6 4.85092163 1.149078369140625 1.3203810984268785 +2166 5 5.25865555 0.25865554809570313 0.066902692560688592 +2167 7 6.79769468 0.20230531692504883 0.040927441256144448 +2168 7 6.79769468 0.20230531692504883 0.040927441256144448 +2171 7 6.79769468 0.20230531692504883 0.040927441256144448 +2172 5 4.813034 0.1869659423828125 0.034956263611093163 +2173 5 5.442636 0.44263601303100586 0.19592664003198479 +2174 7 6.79769468 0.20230531692504883 0.040927441256144448 +2176 5 4.813034 0.1869659423828125 0.034956263611093163 +2179 6 5.76867342 0.23132658004760742 0.053511986636522124 +2182 5 5.577924 0.57792377471923828 0.33399588938573288 +2184 6 5.91915846 0.080841541290283203 0.006535354798188564 +2186 5 4.922956 0.077044010162353516 0.0059357795018968318 +2189 6 6.28398132 0.2839813232421875 0.080645391950383782 +2192 6 5.59625 0.40374994277954102 0.16301401629448264 +2197 6 6.48611832 0.48611831665039063 0.23631101778300945 +2198 5 4.96211147 0.037888526916503906 0.001435540471902641 +2201 6 5.58790541 0.4120945930480957 0.16982195361947561 +2202 5 4.96211147 0.037888526916503906 0.001435540471902641 +2203 5 5.48719835 0.4871983528137207 0.23736223498440268 +2204 5 5.430422 0.43042182922363281 0.18526295107221813 +2205 5 5.39430428 0.39430427551269531 0.15547586168759153 +2206 6 5.69371843 0.30628156661987305 0.093808398051123731 +2209 6 6.150735 0.15073490142822266 0.022721010508576001 +2210 7 5.605151 1.3948488235473633 1.9456032405514634 +2211 6 5.680932 0.31906795501708984 0.10180435991878767 +2215 6 5.54389143 0.45610857009887695 0.20803502771764215 +2216 5 5.73479843 0.73479843139648438 0.53992873478273395 +2219 7 6.477956 0.52204418182373047 0.27253012777600816 +2222 7 6.15957642 0.840423583984375 0.70631180051714182 +2224 7 6.15957642 0.840423583984375 0.70631180051714182 +2226 5 5.15487766 0.15487766265869141 0.023987090390619414 +2227 5 5.184053 0.18405294418334961 0.033875486262559207 +2232 6 5.49912739 0.50087261199951172 0.25087337345121341 +2233 5 5.451901 0.45190095901489258 0.20421447675857962 +2235 6 5.78070831 0.21929168701171875 0.048088843992445618 +2238 6 5.69238758 0.30761241912841797 0.094625400402037485 +2239 6 5.78070831 0.21929168701171875 0.048088843992445618 +2240 5 5.031944 0.031943798065185547 0.0010204062348293519 +2241 5 5.031944 0.031943798065185547 0.0010204062348293519 +2245 7 5.60611153 1.3938884735107422 1.942925076586107 +2247 6 5.69238758 0.30761241912841797 0.094625400402037485 +2252 5 5.115737 0.11573696136474609 0.01339504422594473 +2253 5 5.045958 0.045958042144775391 0.002112141637780951 +2254 6 5.71639729 0.28360271453857422 0.080430499693648017 +2255 6 5.658473 0.34152698516845703 0.11664068159825547 +2258 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2259 6 5.492666 0.50733423233032227 0.25738802329419741 +2260 5 4.97584963 0.024150371551513672 0.00058324044607616088 +2266 5 5.407028 0.4070281982421875 0.16567195416428149 +2267 6 6.3755393 0.37553930282592773 0.14102976796698385 +2270 7 6.147446 0.8525538444519043 0.72684805768972183 +2271 6 5.66193 0.33806991577148438 0.11429126794973854 +2272 6 6.210824 0.21082401275634766 0.044446764354688639 +2273 5 5.395995 0.39599514007568359 0.15681215096356027 +2274 7 6.147446 0.8525538444519043 0.72684805768972183 +2275 4 5.2996974 1.2996973991394043 1.689213329329732 +2276 6 4.88525772 1.1147422790527344 1.2426503487076843 +2278 6 4.88525772 1.1147422790527344 1.2426503487076843 +2280 6 5.89824867 0.10175132751464844 0.010353332650993252 +2282 5 5.15755272 0.15755271911621094 0.024822859300911659 +2283 5 5.15755272 0.15755271911621094 0.024822859300911659 +2284 5 5.15755272 0.15755271911621094 0.024822859300911659 +2285 5 5.15755272 0.15755271911621094 0.024822859300911659 +2287 5 5.05347538 0.053475379943847656 0.0028596162601388642 +2289 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2290 7 5.835172 1.164827823638916 1.3568238587233736 +2291 6 5.959846 0.040153980255126953 0.0016123421303291252 +2292 6 5.248393 0.75160694122314453 0.56491299409481144 +2293 7 7.02031755 0.020317554473876953 0.00041280301979895739 +2295 6 5.12605143 0.87394857406616211 0.76378611011227804 +2296 7 6.03202057 0.96797943115234375 0.93698417913401499 +2297 6 5.631292 0.36870813369750977 0.13594568785470074 +2298 8 6.72130346 1.2786965370178223 1.6350648337813709 +2299 7 7.42436934 0.42436933517456055 0.18008933263649851 +2300 7 6.75962543 0.24037456512451172 0.057779931558798125 +2304 6 4.80764866 1.1923513412475586 1.4217017209748519 +2306 5 5.49572039 0.49572038650512695 0.24573870159679245 +2310 5 5.3208 0.32079982757568359 0.10291252937258832 +2311 7 6.820328 0.1796717643737793 0.032281942913186867 +2314 6 6.682396 0.68239593505859375 0.4656642121844925 +2315 6 6.07943535 0.079435348510742188 0.0063099745930230711 +2317 5 5.659352 0.65935182571411133 0.43474483007253184 +2318 4 5.559793 1.5597929954528809 2.4329541886638708 +2319 7 6.76099253 0.23900747299194336 0.057124572145994534 +2321 5 5.34529972 0.34529972076416016 0.11923189715980698 +2324 5 5.15271664 0.15271663665771484 0.023322371112044493 +2327 6 5.214839 0.78516101837158203 0.61647782477029978 +2328 5 5.454279 0.45427894592285156 0.20636936070877709 +2329 5 5.28656 0.28656005859375 0.082116667181253433 +2331 5 5.65846634 0.65846633911132813 0.43357791974267457 +2332 6 5.549059 0.45094108581542969 0.20334786287639872 +2333 8 7.05028725 0.94971275329589844 0.90195431377287605 +2334 5 5.55771875 0.55771875381469727 0.3110502083566189 +2335 5 5.80538654 0.80538654327392578 0.64864748408672313 +2336 5 4.931768 0.068232059478759766 0.0046556139407130104 +2337 4 5.43987751 1.4398775100708008 2.073247244007689 +2338 5 5.62999249 0.62999248504638672 0.39689053121492179 +2339 6 5.726933 0.27306699752807617 0.074565585138998358 +2340 6 5.72369 0.27630996704101563 0.076347197886207141 +2342 8 6.948141 1.0518589019775391 1.1064071496693941 +2344 6 5.726933 0.27306699752807617 0.074565585138998358 +2345 6 5.7398963 0.26010370254516602 0.067653936077704202 +2347 6 6.165467 0.1654667854309082 0.027379257080838215 +2349 5 5.23369 0.23368978500366211 0.05461091561505782 +2350 5 5.568386 0.56838607788085938 0.32306273352878634 +2351 6 5.85764074 0.14235925674438477 0.020266157980813659 +2355 7 6.288256 0.71174383163452148 0.50657928186979007 +2358 5 5.388339 0.38833904266357422 0.15080721205686132 +2359 5 5.16930962 0.16930961608886719 0.028665746100159595 +2365 5 5.35451746 0.35451745986938477 0.12568262935224084 +2366 5 5.35875034 0.35875034332275391 0.1287018088341938 +2367 6 5.4548583 0.54514169692993164 0.29717946973164544 +2370 7 6.466535 0.53346490859985352 0.28458480870745007 +2374 6 6.31197357 0.31197357177734375 0.097327509487513453 +2375 6 6.86937952 0.86937952041625977 0.75582075051920583 +2376 6 6.31197357 0.31197357177734375 0.097327509487513453 +2379 4 5.02809525 1.0280952453613281 1.0569798335345695 +2380 4 4.7932725 0.79327249526977539 0.62928125175153582 +2381 6 6.17565966 0.1756596565246582 0.030856314930360895 +2383 6 6.298069 0.29806900024414063 0.088845128906541504 +2386 4 5.639759 1.6397590637207031 2.6888097870541969 +2387 4 5.656129 1.6561288833618164 2.7427628783052569 +2389 8 6.87059641 1.1294035911560059 1.2755524717160824 +2391 6 5.81390524 0.18609476089477539 0.034631260032483624 +2392 7 5.867315 1.1326851844787598 1.282975727137682 +2393 6 5.867315 0.13268518447875977 0.017605358180162511 +2396 5 4.986103 0.013896942138671875 0.00019312500080559403 +2401 4 5.2634654 1.263465404510498 1.5963448283948765 +2403 6 5.8889246 0.11107540130615234 0.01233774477532279 +2406 6 6.67324924 0.67324924468994141 0.4532645454755766 +2415 5 5.575652 0.57565212249755859 0.3313753661359442 +2419 5 5.29736567 0.29736566543579102 0.088426338980070796 +2420 7 6.390013 0.60998678207397461 0.37208387430496259 +2422 5 4.129732 0.87026786804199219 0.75736616214635433 +2423 6 5.695272 0.30472803115844727 0.092859172973703608 +2424 5 4.129732 0.87026786804199219 0.75736616214635433 +2426 6 6.139751 0.13975095748901367 0.019530330119096107 +2427 6 5.70700836 0.29299163818359375 0.085844100045505911 +2428 6 6.139751 0.13975095748901367 0.019530330119096107 +2429 6 5.70700836 0.29299163818359375 0.085844100045505911 +2430 5 5.071437 0.071436882019042969 0.0051032281126026646 +2431 5 5.05151 0.051509857177734375 0.0026532653864705935 +2433 6 5.243469 0.75653076171875 0.57233879342675209 +2435 4 5.316507 1.3165068626403809 1.7331903193792186 +2436 5 5.155265 0.15526485443115234 0.024107175021526928 +2437 6 5.73321342 0.26678657531738281 0.071175076769577572 +2439 6 6.48072529 0.48072528839111328 0.23109680289871903 +2440 5 5.442191 0.44219112396240234 0.19553299011113268 +2441 6 6.501268 0.50126791000366211 0.2512695175994395 +2443 5 5.342942 0.34294223785400391 0.11760937850431219 +2444 5 5.51007938 0.51007938385009766 0.26018097782889527 +2450 5 4.93648863 0.063511371612548828 0.0040336943241072731 +2452 7 6.282725 0.71727514266967773 0.51448363029180655 +2453 6 6.289039 0.28903913497924805 0.083543621549551972 +2455 6 5.800432 0.19956779479980469 0.039827304721256951 +2456 6 5.58649731 0.41350269317626953 0.1709844772640281 +2459 5 5.312827 0.31282711029052734 0.097860800932721759 +2461 5 4.82629 0.17370986938476563 0.030175118721672334 +2464 5 5.128059 0.12805891036987305 0.016399084525119179 +2465 5 5.15147066 0.15147066116333008 0.022943361193256351 +2466 5 5.25195169 0.25195169448852539 0.063479656355639236 +2467 6 5.73090935 0.26909065246582031 0.072409779244480887 +2470 5 5.555554 0.55555391311645508 0.30864015037900572 +2472 6 5.55089235 0.44910764694213867 0.20169767854190468 +2475 5 4.549733 0.45026683807373047 0.20274022546891501 +2477 7 6.442016 0.5579838752746582 0.31134600506652532 +2478 6 5.4986105 0.50138950347900391 0.25139143419892207 +2483 6 5.4986105 0.50138950347900391 0.25139143419892207 +2486 5 5.90252447 0.90252447128295898 0.81455042126458466 +2488 6 6.14779329 0.14779329299926758 0.021842857455567355 +2495 5 5.80160046 0.80160045623779297 0.64256329144063784 +2496 5 5.507049 0.5070490837097168 0.25709877329086339 +2499 6 6.47504044 0.47504043579101563 0.22566341563651804 +2502 4 5.087182 1.0871820449829102 1.1819647989332225 +2503 4 5.087182 1.0871820449829102 1.1819647989332225 +2504 6 5.14028358 0.85971641540527344 0.73911231491729268 +2505 6 4.786265 1.2137351036071777 1.4731529017283265 +2511 6 5.52970362 0.47029638290405273 0.22117868777263539 +2512 6 5.368275 0.63172483444213867 0.39907626645094751 +2513 5 5.0458374 0.04583740234375 0.002101067453622818 +2514 7 7.08240938 0.082409381866455078 0.0067913062196112151 +2517 6 5.202719 0.79728078842163086 0.63565665558621731 +2518 7 6.73800659 0.261993408203125 0.068640545941889286 +2519 5 5.57040739 0.57040739059448242 0.32536459124480643 +2522 8 5.97161341 2.0283865928649902 4.1143521701144437 +2523 5 6.07080841 1.0708084106445313 1.1466306523070671 +2525 8 5.97161341 2.0283865928649902 4.1143521701144437 +2526 7 6.761754 0.23824596405029297 0.05676113938625349 +2531 4 4.59851 0.59850978851318359 0.35821396694609575 +2532 4 4.59851 0.59850978851318359 0.35821396694609575 +2534 7 5.81611061 1.1838893890380859 1.4015940854769724 +2536 6 5.57678366 0.42321634292602539 0.17911207291967912 +2537 6 5.19452047 0.80547952651977539 0.64879726764252155 +2538 6 5.19452047 0.80547952651977539 0.64879726764252155 +2541 6 5.609927 0.39007282257080078 0.15215680690835143 +2545 6 5.838851 0.16114902496337891 0.025969008246647718 +2546 5 5.32331467 0.32331466674804688 0.10453237373440061 +2547 5 4.96645546 0.033544540405273438 0.0011252361910010222 +2548 6 5.4387145 0.56128549575805664 0.31504140774836742 +2551 6 5.4387145 0.56128549575805664 0.31504140774836742 +2552 5 5.353321 0.35332107543945313 0.12483578234969173 +2554 7 6.789461 0.21053886413574219 0.044326613311568508 +2555 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2556 5 5.757903 0.75790309906005859 0.57441710756484099 +2557 7 6.789461 0.21053886413574219 0.044326613311568508 +2558 7 6.94292736 0.057072639465332031 0.0032572861755397753 +2560 6 5.797521 0.20247888565063477 0.040997699134322829 +2562 6 5.797521 0.20247888565063477 0.040997699134322829 +2563 5 5.38012266 0.38012266159057617 0.14449323785470369 +2564 6 5.353371 0.64662885665893555 0.41812887826404221 +2566 7 6.133521 0.86647891998291016 0.75078571877475042 +2567 5 6.320251 1.3202509880065918 1.7430626713323818 +2568 6 5.507352 0.49264812469482422 0.24270217476532707 +2569 6 6.26709557 0.26709556579589844 0.071340041267831111 +2571 6 6.63272762 0.63272762298583984 0.40034424488931108 +2574 5 5.683056 0.68305587768554688 0.46656533204077277 +2575 6 5.839933 0.16006708145141602 0.025621470564374249 +2579 6 5.78327656 0.21672344207763672 0.046969050345978758 +2581 7 6.762539 0.23746109008789063 0.056387769305729307 +2583 7 6.762539 0.23746109008789063 0.056387769305729307 +2584 7 6.762539 0.23746109008789063 0.056387769305729307 +2586 7 6.762539 0.23746109008789063 0.056387769305729307 +2592 5 5.72321844 0.72321844100952148 0.52304491341624271 +2593 5 5.95471859 0.95471858978271484 0.91148758567669574 +2595 5 4.99312162 0.0068783760070800781 4.7312056494774879E-05 +2596 5 5.190575 0.19057512283325195 0.03631887744290907 +2599 6 5.51631451 0.48368549346923828 0.23395165659258055 +2600 7 7.0145216 0.014521598815917969 0.00021087683217047015 +2602 6 6.44506168 0.44506168365478516 0.19807990225763206 +2607 6 5.741097 0.25890302658081055 0.067030777172703893 +2609 6 5.34973574 0.65026426315307617 0.4228436119340131 +2610 5 5.306729 0.30672883987426758 0.09408258121061408 +2611 5 5.490591 0.49059104919433594 0.24067957754959934 +2612 7 6.794416 0.20558404922485352 0.042264801295686993 +2617 7 6.7212 0.27880001068115234 0.077729445955810661 +2618 7 6.34141541 0.6585845947265625 0.43373366841115057 +2619 6 5.4213624 0.57863759994506836 0.33482147207018897 +2621 5 5.406546 0.40654611587524414 0.16527974433324744 +2623 7 6.7212 0.27880001068115234 0.077729445955810661 +2626 7 6.210718 0.78928184509277344 0.6229658309930528 +2628 6 6.039976 0.039976119995117188 0.0015980901698640082 +2633 5 5.61942339 0.61942338943481445 0.38368533537891381 +2635 6 6.508563 0.50856304168701172 0.25863636736994522 +2638 6 6.643812 0.64381217956542969 0.41449412255678908 +2639 6 5.83244467 0.16755533218383789 0.028074789343236262 +2641 5 5.974963 0.97496318817138672 0.95055321828931483 +2644 6 5.97672844 0.023271560668945313 0.0005415655359684024 +2648 6 5.681986 0.31801414489746094 0.10113299635486328 +2650 5 5.43078232 0.43078231811523438 0.18557340560073499 +2652 7 6.80547237 0.19452762603759766 0.037840997291823442 +2653 5 5.53509569 0.5350956916809082 0.28632739925546957 +2654 5 4.69185925 0.30814075469970703 0.094950724706905021 +2658 7 6.433773 0.56622695922851563 0.3206129693571711 +2660 6 5.36555243 0.63444757461547852 0.40252372493546318 +2661 6 5.99006748 0.0099325180053710938 9.8654913927020971E-05 +2664 7 6.39382029 0.60617971420288086 0.36745384591108632 +2665 5 5.5541 0.55410003662109375 0.30702685058349743 +2666 7 7.24123526 0.24123525619506836 0.058194448831500267 +2668 6 6.05001354 0.050013542175292969 0.0025013544009198085 +2669 5 5.359341 0.35934114456176758 0.12912605817496114 +2670 7 7.24123526 0.24123525619506836 0.058194448831500267 +2674 7 5.814148 1.18585205078125 1.4062450863420963 +2679 6 5.801769 0.19823122024536133 0.039295616679964951 +2680 6 6.4041853 0.40418529510498047 0.16336575277910015 +2681 6 6.436047 0.43604707717895508 0.19013705351630961 +2683 5 5.13188839 0.13188838958740234 0.017394547307958419 +2694 6 6.096805 0.096805095672607422 0.0093712265481826762 +2697 5 5.839328 0.83932781219482422 0.70447117632375011 +2698 6 5.567016 0.4329838752746582 0.18747503624786077 +2699 6 5.349456 0.65054416656494141 0.42320771265167423 +2700 7 6.18181944 0.81818056106567383 0.66941943050574082 +2703 5 5.502043 0.50204277038574219 0.25204694329659105 +2706 6 5.34128857 0.65871143341064453 0.43390075250590598 +2707 5 5.502043 0.50204277038574219 0.25204694329659105 +2709 5 6.00174236 1.0017423629760742 1.0034877617808888 +2710 5 6.00174236 1.0017423629760742 1.0034877617808888 +2711 5 5.634198 0.63419818878173828 0.40220734265403735 +2712 5 5.598766 0.59876585006713867 0.35852054320662319 +2716 5 6.00174236 1.0017423629760742 1.0034877617808888 +2717 6 6.102189 0.10218906402587891 0.010442604806485178 +2718 6 5.481989 0.51801109313964844 0.26833549261573353 +2721 5 5.2267313 0.22673130035400391 0.051407082560217532 +2722 7 6.82906866 0.17093133926391602 0.029217522742555957 +2723 6 6.35023165 0.35023164749145508 0.12266220690457885 +2724 6 6.0606904 0.060690402984619141 0.0036833250144354679 +2727 6 6.046403 0.046402931213378906 0.0021532320251935744 +2728 6 5.72376347 0.27623653411865234 0.07630662278188538 +2729 7 6.391809 0.60819101333618164 0.36989630870289147 +2730 5 4.92892742 0.071072578430175781 0.0050513114047134877 +2731 5 4.87044954 0.12955045700073242 0.01678332090909862 +2732 5 5.122189 0.12218904495239258 0.014930162706377814 +2733 7 6.391809 0.60819101333618164 0.36989630870289147 +2739 7 6.561662 0.43833780288696289 0.19214002943976993 +2740 6 5.54297924 0.45702075958251953 0.20886797468938312 +2743 6 5.184127 0.81587314605712891 0.6656489904571572 +2744 6 5.184127 0.81587314605712891 0.6656489904571572 +2745 7 6.623061 0.37693881988525391 0.14208287393648789 +2749 6 5.746345 0.25365495681762695 0.064340837118152194 +2752 6 6.251609 0.25160884857177734 0.063307012679615582 +2753 8 6.050957 1.949042797088623 3.7987678248830434 +2754 5 4.81832361 0.18167638778686523 0.033006309879283435 +2755 5 4.869156 0.1308441162109375 0.017120182747021317 +2756 6 4.98410654 1.0158934593200684 1.0320395206892954 +2757 5 6.02096272 1.0209627151489258 1.0423648657242666 +2758 6 5.85482025 0.14517974853515625 0.021077159384731203 +2759 6 5.76916265 0.23083734512329102 0.053285879903569366 +2760 6 5.790269 0.20973110198974609 0.043987135141833278 +2761 5 5.21827745 0.2182774543762207 0.047645047088963111 +2762 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2764 6 6.01250744 0.012507438659667969 0.00015643602182535687 +2768 6 5.40108156 0.59891843795776367 0.35870329532576761 +2769 5 5.08192539 0.081925392150878906 0.0067117698790752911 +2770 7 5.56935453 1.4306454658508301 2.0467464489595386 +2771 6 5.949611 0.050388813018798828 0.0025390324774434703 +2773 7 6.69609451 0.30390548706054688 0.092358545065508224 +2776 8 6.39705944 1.602940559387207 2.5694184369285722 +2778 7 6.69609451 0.30390548706054688 0.092358545065508224 +2779 5 6.23984575 1.2398457527160645 1.5372174905280644 +2780 5 4.92480946 0.075190544128417969 0.0056536179263275699 +2781 6 4.922699 1.077301025390625 1.1605774993076921 +2782 6 5.967141 0.032858848571777344 0.001079703929462994 +2784 6 5.967141 0.032858848571777344 0.001079703929462994 +2787 5 5.24805164 0.24805164337158203 0.061529617779342516 +2789 5 5.13498068 0.13498067855834961 0.018219783584072502 +2792 5 5.36231041 0.36231040954589844 0.13126883286531665 +2793 7 7.17724466 0.17724466323852539 0.031415670646538274 +2795 8 6.13639641 1.8636035919189453 3.4730183478131949 +2797 5 5.25386858 0.25386857986450195 0.064449255842419007 +2800 5 5.43601561 0.43601560592651367 0.19010960861146486 +2804 8 6.13639641 1.8636035919189453 3.4730183478131949 +2808 6 5.34821272 0.65178728103637695 0.42482665972079303 +2809 7 6.775078 0.22492218017578125 0.050589987135026604 +2810 7 6.34518576 0.65481424331665039 0.42878169325035742 +2811 5 5.64365244 0.64365243911743164 0.41428846238181904 +2813 7 6.775078 0.22492218017578125 0.050589987135026604 +2814 7 6.75550842 0.2444915771484375 0.059776131296530366 +2818 4 6.14127731 2.1412773132324219 4.5850685321638593 +2823 6 6.314358 0.31435823440551758 0.098821099538554336 +2830 5 5.750116 0.75011587142944336 0.5626738205703532 +2831 5 5.03467941 0.034679412841796875 0.001202661675051786 +2833 7 6.039263 0.96073722839355469 0.92301602202132926 +2836 6 5.626615 0.37338495254516602 0.13941632278715588 +2837 6 5.79493475 0.20506525039672852 0.042051756920272965 +2839 7 5.811762 1.1882381439208984 1.4119098866685817 +2840 6 6.206232 0.20623207092285156 0.042531667077128077 +2842 6 5.49120951 0.50879049301147461 0.25886776577885939 +2844 5 5.98960352 0.98960351943969727 0.97931512568743528 +2846 7 7.02146339 0.021463394165039063 0.00046067728908383287 +2847 5 6.279372 1.2793722152709961 1.636793265207416 +2848 5 4.989665 0.010334968566894531 0.000106811575278698 +2850 5 5.96404171 0.96404170989990234 0.92937641842672747 +2852 5 6.11551476 1.1155147552490234 1.2443731691782887 +2854 6 6.2158227 0.21582269668579102 0.046579436404726948 +2856 7 6.999945 5.4836273193359375E-05 3.007016857736744E-09 +2860 6 5.620766 0.37923383712768555 0.14381830322258793 +2861 6 6.2158227 0.21582269668579102 0.046579436404726948 +2863 6 6.51361275 0.51361274719238281 0.26379805407850654 +2865 6 6.3260293 0.32602930068969727 0.10629510490821303 +2868 5 5.85081 0.85081005096435547 0.72387774282196915 +2869 6 6.71658325 0.716583251953125 0.51349155697971582 +2870 7 6.785292 0.21470785140991211 0.046099461457060897 +2871 6 6.188884 0.18888378143310547 0.035677082888469158 +2872 7 7.21496725 0.21496725082397461 0.046210918926817612 +2873 8 6.90970373 1.0902962684631348 1.188745953024636 +2879 6 6.59125471 0.59125471115112305 0.34958213345839795 +2881 7 6.59642029 0.4035797119140625 0.16287658386863768 +2890 8 6.60879755 1.391202449798584 1.9354442563255816 +2891 6 5.983416 0.016583919525146484 0.0002750263868165348 +2893 7 8.001547 1.0015468597412109 1.0030961122574809 +2895 5 5.61847734 0.61847734451293945 0.3825142256757772 +2896 5 5.420413 0.42041301727294922 0.1767471050925451 +2898 5 5.98123741 0.98123741149902344 0.96282685772530385 +2902 5 5.24436 0.24435997009277344 0.059711794983741129 +2903 6 6.211409 0.21140909194946289 0.044693804158896455 +2904 7 5.93855953 1.0614404678344727 1.1266558667566642 +2905 5 5.624597 0.62459707260131836 0.39012150310213656 +2906 5 5.20248127 0.20248126983642578 0.040998664634571469 +2910 5 5.051263 0.051262855529785156 0.0026278803570676246 +2911 5 5.24436 0.24435997009277344 0.059711794983741129 +2913 5 5.6902194 0.69021940231323242 0.47640282332963579 +2919 5 6.3524003 1.3524003028869629 1.828986579248749 +2920 4 5.501398 1.5013980865478516 2.25419621428955 +2923 6 6.342757 0.34275722503662109 0.11748251531480491 +2924 6 6.131525 0.13152503967285156 0.017298836060945177 +2927 7 6.7712183 0.22878170013427734 0.052341066316330398 +2929 6 6.131525 0.13152503967285156 0.017298836060945177 +2933 6 6.342757 0.34275722503662109 0.11748251531480491 +2934 5 5.17446136 0.17446136474609375 0.030436767789069563 +2937 5 5.629732 0.62973213195800781 0.39656255802037776 +2940 6 5.882038 0.11796188354492188 0.01391500596946571 +2941 5 5.606404 0.60640382766723633 0.36772560220947526 +2943 8 7.503963 0.49603700637817383 0.24605271169662046 +2944 6 5.882038 0.11796188354492188 0.01391500596946571 +2947 6 6.19522524 0.19522523880004883 0.03811289386453609 +2948 6 5.376883 0.62311697006225586 0.38827475837956626 +2949 6 5.449442 0.55055809020996094 0.30311421069563949 +2950 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2953 5 5.05951643 0.059516429901123047 0.0035422054281752935 +2955 5 6.26787 1.2678699493408203 1.6074942084414943 +2956 6 6.107019 0.10701894760131836 0.011453055145693725 +2959 7 6.84598875 0.15401124954223633 0.02371946498556099 +2961 6 6.47835541 0.47835540771484375 0.2288238960900344 +2962 5 5.656493 0.65649318695068359 0.4309833045126652 +2964 5 6.28570461 1.2857046127319336 1.6530363512001713 +2965 8 7.26401472 0.73598527908325195 0.54167433102725226 +2967 6 6.001534 0.0015339851379394531 2.353110403419123E-06 +2968 5 6.08952665 1.0895266532897949 1.187068328228861 +2970 5 6.08952665 1.0895266532897949 1.187068328228861 +2971 5 5.307669 0.30766916275024414 0.094660313707436217 +2975 6 5.86485529 0.13514471054077148 0.018264092787148911 +2981 7 6.371684 0.62831592559814453 0.39478090236025309 +2984 6 4.61855555 1.3814444541931152 1.9083887800209141 +2985 7 6.5449214 0.4550786018371582 0.20709653385006277 +2987 7 6.43420458 0.5657954216003418 0.32012445910390852 +2989 6 6.208233 0.20823287963867188 0.043360932162613608 +2991 7 6.8057766 0.19422340393066406 0.037722730634413892 +2994 7 6.43420458 0.5657954216003418 0.32012445910390852 +2996 8 5.816692 2.1833081245422363 4.7668343666921373 +2997 6 6.396095 0.39609479904174805 0.15689108982792277 +2999 7 6.43420458 0.5657954216003418 0.32012445910390852 +3000 7 6.5449214 0.4550786018371582 0.20709653385006277 +3001 7 6.53180838 0.46819162368774414 0.21920339649136622 +3002 7 6.8057766 0.19422340393066406 0.037722730634413892 +3004 6 6.315313 0.31531286239624023 0.099422201192510329 +3005 6 6.09739447 0.097394466400146484 0.0094856820853692625 +3006 6 6.208233 0.20823287963867188 0.043360932162613608 +3013 6 6.648943 0.64894294738769531 0.42112694896422909 +3014 6 5.18606234 0.81393766403198242 0.66249452092984029 +3016 6 6.648943 0.64894294738769531 0.42112694896422909 +3020 6 3.73379683 2.2662031650543213 5.1356767853022234 +3022 5 5.03272629 0.032726287841796875 0.001071009915904142 +3023 6 5.18606234 0.81393766403198242 0.66249452092984029 +3026 6 5.998491 0.0015091896057128906 2.2776532659918303E-06 +3027 5 5.75025034 0.75025033950805664 0.56287557193195425 +3028 6 5.90629435 0.093705654144287109 0.0087807496186087519 +3029 8 7.02977467 0.97022533416748047 0.94133719906039914 +3031 6 6.082838 0.082838058471679688 0.0068621439313574228 +3033 6 5.665061 0.33493900299072266 0.11218413572441932 +3034 6 5.48654842 0.51345157623291016 0.26363252113605995 +3037 6 5.750472 0.24952793121337891 0.062264188455628755 +3038 6 6.538831 0.53883123397827148 0.29033909871054675 +3039 6 5.39716959 0.60283041000366211 0.36340450322518336 +3040 5 6.07817554 1.0781755447387695 1.1624625052727424 +3043 6 5.391435 0.60856485366821289 0.37035118112021337 +3044 6 5.65663147 0.3433685302734375 0.11790194758214056 +3045 6 6.14122248 0.14122247695922852 0.019943787998499829 +3046 6 6.496725 0.49672508239746094 0.24673580748276436 +3049 5 5.29757261 0.29757261276245117 0.088549459866271718 +3050 4 4.71068048 0.71068048477172852 0.50506675143537905 +3053 5 5.75403357 0.75403356552124023 0.56856661793267449 +3055 6 6.435923 0.43592309951782227 0.19002894869322517 +3056 5 5.76071835 0.76071834564208984 0.57869240139643807 +3058 5 5.476526 0.47652578353881836 0.22707682237728477 +3059 6 5.52979374 0.47020626068115234 0.22109392758375179 +3062 8 6.831621 1.1683788299560547 1.3651090902894794 +3064 5 5.3336153 0.33361530303955078 0.1112991704221713 +3065 6 6.481476 0.481475830078125 0.2318189749494195 +3066 5 5.3336153 0.33361530303955078 0.1112991704221713 +3069 8 4.845862 3.1541380882263184 9.9485870795999745 +3070 8 6.831621 1.1683788299560547 1.3651090902894794 +3072 6 6.86424732 0.86424732208251953 0.74692343372680625 +3073 5 6.54508257 1.5450825691223145 2.3872801454056116 +3074 5 6.22429562 1.2242956161499023 1.498899755723869 +3075 7 6.37249041 0.62750959396362305 0.39376829051639106 +3076 5 5.2231307 0.22313070297241211 0.049787310608962798 +3077 5 5.476526 0.47652578353881836 0.22707682237728477 +3078 5 6.578264 1.5782642364501953 2.490918000057718 +3079 5 5.94544172 0.94544172286987305 0.89386005134315383 +3080 6 5.52979374 0.47020626068115234 0.22109392758375179 +3084 6 6.806603 0.80660295486450195 0.65060832679614578 +3086 7 6.88708639 0.11291360855102539 0.012749482996014194 +3088 6 6.47210026 0.47210025787353516 0.22287865348425839 +3090 6 6.806603 0.80660295486450195 0.65060832679614578 +3091 6 5.508926 0.4910740852355957 0.24115375718997711 +3094 6 3.811624 2.1883759498596191 4.7889892979239903 +3095 6 3.811624 2.1883759498596191 4.7889892979239903 +3097 5 6.40035963 1.4003596305847168 1.9610070949713645 +3099 7 6.603572 0.39642810821533203 0.157155244983187 +3101 6 5.885584 0.11441612243652344 0.013091049073409522 +3102 6 5.330082 0.66991806030273438 0.44879020751977805 +3104 5 5.992548 0.99254798889160156 0.98515151025276282 +3105 6 5.881699 0.1183009147644043 0.013995106434094851 +3106 6 6.09651566 0.096515655517578125 0.0093152717599878088 +3108 5 5.790182 0.79018211364746094 0.62438777272836887 +3111 7 6.55089045 0.44910955429077148 0.20169939175525542 +3112 5 5.66179132 0.66179132461547852 0.43796775733630966 +3113 6 5.53946257 0.46053743362426758 0.21209472776922667 +3114 6 6.314805 0.31480503082275391 0.099102207431315037 +3115 6 6.314805 0.31480503082275391 0.099102207431315037 +3116 7 6.43430138 0.56569862365722656 0.32001493280768045 +3117 7 6.55089045 0.44910955429077148 0.20169939175525542 +3119 5 4.536246 0.46375417709350586 0.21506793677167479 +3120 6 5.40785 0.59215021133422852 0.35064187278317149 +3122 6 7.08013153 1.0801315307617188 1.1666841237456538 +3124 6 5.53946257 0.46053743362426758 0.21209472776922667 +3125 5 5.7089 0.70889997482299805 0.50253917430404726 +3126 7 6.19258261 0.80741739273071289 0.65192284608406226 +3128 6 6.53799 0.53799009323120117 0.28943334041491653 +3131 5 5.507035 0.5070347785949707 0.25708426670485096 +3133 6 6.68867445 0.6886744499206543 0.47427249797351578 +3135 6 5.426291 0.57370901107788086 0.32914202939196002 +3138 6 6.12315273 0.12315273284912109 0.01516659560820699 +3140 6 5.426291 0.57370901107788086 0.32914202939196002 +3141 7 5.541848 1.4581518173217773 2.1262067223588019 +3143 5 5.435146 0.43514585494995117 0.18935191508012394 +3144 6 5.710051 0.28994894027709961 0.084070387967813076 +3145 6 5.710051 0.28994894027709961 0.084070387967813076 +3146 6 5.710051 0.28994894027709961 0.084070387967813076 +3147 6 5.56390429 0.4360957145690918 0.19017947226552678 +3151 6 5.710051 0.28994894027709961 0.084070387967813076 +3154 6 6.867949 0.86794900894165039 0.75333548212279311 +3157 7 6.779997 0.22000312805175781 0.048401376352558145 +3158 7 6.926802 0.073197841644287109 0.0053579240213821322 +3159 6 6.36980534 0.36980533599853516 0.13675598653298948 +3162 7 6.779997 0.22000312805175781 0.048401376352558145 +3164 6 6.23988962 0.23988962173461914 0.057547030615978656 +3166 6 6.897838 0.89783811569213867 0.80611328198961019 +3167 7 6.39587927 0.60412073135375977 0.36496185805140158 +3168 6 6.723877 0.723876953125 0.52399784326553345 +3172 8 6.64314556 1.3568544387817383 1.841053968041706 +3173 8 6.6659255 1.3340744972229004 1.7797547641405345 +3174 8 6.88348532 1.1165146827697754 1.2466050368404922 +3175 6 5.76850462 0.23149538040161133 0.053590111147286734 +3176 6 6.294718 0.29471778869628906 0.086858574974030489 +3177 5 5.992035 0.992034912109375 0.98413326684385538 +3178 6 6.112884 0.1128840446472168 0.012742807535914835 +3179 4 5.79313755 1.7931375503540039 3.2153422744895579 +3181 6 6.601753 0.60175323486328125 0.36210695566842332 +3182 5 6.2163825 1.2163825035095215 1.479586394844091 +3183 6 6.049875 0.049874782562255859 0.0024874939356323011 +3189 5 6.140699 1.1406989097595215 1.3011940027265609 +3190 7 7.06220675 0.062206745147705078 0.0038696791418715293 +3192 6 6.601753 0.60175323486328125 0.36210695566842332 +3193 5 6.2163825 1.2163825035095215 1.479586394844091 +3195 6 6.242802 0.24280214309692383 0.058952880692459075 +3197 6 6.737725 0.73772478103637695 0.54423785255517032 +3199 7 6.66018629 0.3398137092590332 0.11547335700038275 +3200 7 6.8083353 0.19166469573974609 0.036735355593009444 +3201 6 6.737725 0.73772478103637695 0.54423785255517032 +3204 5 5.61776447 0.61776447296142578 0.38163294405330817 +3206 7 6.68098974 0.31901025772094727 0.10176754453118519 +3208 5 6.008159 1.0081591606140137 1.0163848931299526 +3209 5 5.57621145 0.57621145248413086 0.3320196379738718 +3211 6 6.456321 0.45632076263427734 0.20822863841112849 +3212 5 6.188125 1.1881251335144043 1.411641332888621 +3215 6 6.065724 0.065723896026611328 0.0043196305089168163 +3216 5 6.28508568 1.2850856781005859 1.6514452000592428 +3217 5 5.11301851 0.11301851272583008 0.012773184218758615 +3218 4 5.18631649 1.1863164901733398 1.4073468148571919 +3220 5 6.04402351 1.0440235137939453 1.0899850973546563 +3224 6 6.42197561 0.42197561264038086 0.17806341766322475 +3225 7 6.61993027 0.38006973266601563 0.14445300168881658 +3228 6 5.33879328 0.66120672225952148 0.43719432956117998 +3229 7 6.44850826 0.55149173736572266 0.30414313638266322 +3230 6 5.59285069 0.40714931488037109 0.16577056460755557 +3231 6 6.36423445 0.36423444747924805 0.1326667327305131 +3233 6 6.892843 0.89284276962280273 0.7971682112677172 +3234 6 5.69793034 0.30206966400146484 0.091246081909957866 +3235 6 6.42197561 0.42197561264038086 0.17806341766322475 +3237 7 6.369823 0.63017702102661133 0.39712307782997414 +3238 5 5.682729 0.68272876739501953 0.46611856982872268 +3243 7 6.61330032 0.38669967651367188 0.14953663981577847 +3245 5 5.682729 0.68272876739501953 0.46611856982872268 +3249 7 6.369823 0.63017702102661133 0.39712307782997414 +3250 6 6.864999 0.86499881744384766 0.74822295417925488 +3254 5 6.04639673 1.0463967323303223 1.0949461214315761 +3257 6 6.379424 0.37942409515380859 0.1439626439832864 +3259 6 6.379424 0.37942409515380859 0.1439626439832864 +3260 6 6.379424 0.37942409515380859 0.1439626439832864 +3261 5 6.71544456 1.7154445648193359 2.9427500549682009 +3262 7 5.91904974 1.0809502601623535 1.1684534649450597 +3265 3 5.408037 2.4080371856689453 5.7986430875644146 +3268 6 6.56899548 0.56899547576904297 0.32375585144563956 +3270 5 5.907564 0.90756416320800781 0.82367271033945144 +3276 8 6.294619 1.705380916595459 2.9083240706879678 +3279 6 6.2112565 0.21125650405883789 0.04462931050716179 +3280 5 5.907564 0.90756416320800781 0.82367271033945144 +3285 7 6.21512938 0.78487062454223633 0.61602189726932011 +3286 7 6.21512938 0.78487062454223633 0.61602189726932011 +3289 5 5.373417 0.37341690063476563 0.13944018167967442 +3291 8 7.06327868 0.9367213249206543 0.877446840561106 +3292 5 5.3677 0.36770009994506836 0.13520336349961326 +3294 6 5.762234 0.23776578903198242 0.056532570434001173 +3301 8 7.06327868 0.9367213249206543 0.877446840561106 +3304 7 7.03957 0.039569854736328125 0.0015657734038541093 +3307 3 5.551138 2.5511379241943359 6.5083047082625853 +3312 7 6.90318632 0.096813678741455078 0.0093728883914536709 +3315 7 6.349025 0.65097522735595703 0.42376874663113995 +3320 5 5.555195 0.55519485473632813 0.30824132672569249 +3322 7 6.713857 0.28614282608032227 0.081877716917233556 +3324 6 6.09259033 0.09259033203125 0.0085729695856571198 +3325 7 6.805244 0.19475603103637695 0.037929911625042223 +3327 7 6.30779028 0.69220972061157227 0.47915429730915093 +3329 6 6.29850864 0.29850864410400391 0.089107410604810866 +3331 6 5.92293072 0.077069282531738281 0.0059396743099568994 +3334 6 6.29176331 0.2917633056640625 0.085125826532021165 +3338 6 4.452654 1.5473461151123047 2.3942799999531417 +3339 6 5.92551756 0.074482440948486328 0.005547634009644753 +3340 6 6.308332 0.30833196640014648 0.095068601504181061 +3341 6 5.92551756 0.074482440948486328 0.005547634009644753 +3345 6 5.78186 0.2181401252746582 0.047585114254843575 +3348 6 4.452654 1.5473461151123047 2.3942799999531417 +3349 6 5.860938 0.13906192779541016 0.019338219762175868 +3350 6 6.46421 0.46421003341674805 0.21549095512477834 +3352 6 6.52834654 0.52834653854370117 0.27915006479111071 +3353 6 6.487485 0.48748493194580078 0.23764155887420202 +3354 7 6.862117 0.13788318634033203 0.019011773075362726 +3358 6 6.52834654 0.52834653854370117 0.27915006479111071 +3360 7 5.929071 1.0709290504455566 1.1468890310882216 +3362 6 6.46421 0.46421003341674805 0.21549095512477834 +3364 6 6.19586229 0.1958622932434082 0.038362037914566827 +3367 6 6.58196354 0.58196353912353516 0.33868156086919043 +3368 6 5.94375134 0.056248664855957031 0.0031639122980777756 +3373 7 6.703072 0.29692792892456055 0.08816619497542888 +3374 5 5.55829239 0.55829238891601563 0.31169039152155165 +3375 6 5.945457 0.054543018341064453 0.0029749408497536933 +3377 6 6.07918072 0.079180717468261719 0.0062695860187886865 +3378 8 6.5126605 1.4873394966125488 2.2121787781836701 +3379 5 5.142003 0.14200305938720703 0.020164868875326647 +3380 7 6.76761866 0.23238134384155273 0.054001088965605959 +3381 7 6.304437 0.69556283950805664 0.48380766370451056 +3385 6 6.483192 0.48319196701049805 0.23347447698347423 +3386 8 6.5126605 1.4873394966125488 2.2121787781836701 +3388 6 6.310103 0.31010293960571289 0.096163833152104417 +3391 8 6.59127235 1.4087276458740234 1.984513580249768 +3392 6 6.58681345 0.58681344985961914 0.34435002493614775 +3393 6 6.242813 0.2428131103515625 0.058958206558600068 +3394 5 5.517561 0.51756095886230469 0.26786934613846825 +3395 5 5.42729425 0.42729425430297852 0.18258037976033847 +3396 6 6.080851 0.080851078033447266 0.006536896819170579 +3398 5 5.633409 0.63340902328491211 0.40120699077874633 +3402 6 5.25966454 0.74033546447753906 0.5480965999631735 +3403 5 6.20717239 1.2071723937988281 1.457265188349993 +3404 6 5.354333 0.64566707611083984 0.41688597317352105 +3407 5 5.633409 0.63340902328491211 0.40120699077874633 +3410 7 6.016722 0.98327779769897461 0.96683522744774564 +3412 6 5.838692 0.16130781173706055 0.026020210127398968 +3413 6 5.566281 0.43371915817260742 0.18811230816595526 +3415 7 6.75017834 0.24982166290283203 0.062410863255536242 +3417 4 6.68368769 2.683687686920166 7.202179600926911 +3418 6 5.59492636 0.40507364273071289 0.16408465603512923 +3419 7 6.75017834 0.24982166290283203 0.062410863255536242 +3420 5 5.18478537 0.18478536605834961 0.034145631509318264 +3421 8 6.518584 1.4814162254333496 2.1945940329771929 +3424 6 6.5416193 0.54161930084228516 0.29335146704488579 +3426 6 6.227545 0.22754478454589844 0.05177662897403934 +3427 6 6.292055 0.29205513000488281 0.085296198962169001 +3428 6 6.5416193 0.54161930084228516 0.29335146704488579 +3429 5 5.917385 0.91738510131835938 0.8415954241208965 +3430 6 6.227545 0.22754478454589844 0.05177662897403934 +3432 5 5.899042 0.89904212951660156 0.80827675064574578 +3433 7 7.028948 0.028947830200195313 0.00083797687329933979 +3434 6 5.98812 0.011879920959472656 0.00014113252200331772 +3436 6 6.27996063 0.27996063232421875 0.078377955651376396 +3438 5 5.35919762 0.35919761657714844 0.12902292775470414 +3440 5 6.570556 1.5705561637878418 2.4666466636119821 +3441 5 6.18622065 1.186220645904541 1.4071194207701865 +3443 6 6.24534845 0.24534845352172852 0.060195863645503778 +3444 5 5.35919762 0.35919761657714844 0.12902292775470414 +3445 8 7.20836258 0.79163742065429688 0.62668980578018818 +3446 6 5.34057474 0.65942525863647461 0.43484167172778143 +3447 6 6.26559734 0.26559734344482422 0.07054194884494791 +3448 7 6.77392 0.22607994079589844 0.051112139630276943 +3449 8 7.20836258 0.79163742065429688 0.62668980578018818 +3453 6 5.924129 0.075870990753173828 0.0057564072378681885 +3460 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3462 6 6.51762867 0.51762866973876953 0.26793943973552814 +3464 5 5.63632774 0.63632774353027344 0.40491299718632945 +3466 6 6.51762867 0.51762866973876953 0.26793943973552814 +3468 8 6.82865238 1.1713476181030273 1.3720552424356356 +3469 6 5.73325253 0.26674747467041016 0.071154215243041108 +3471 6 6.00142 0.0014200210571289063 2.0164598026894964E-06 +3474 6 5.795674 0.20432615280151367 0.041749176718667513 +3476 8 7.431058 0.56894207000732422 0.32369507902421901 +3479 7 7.04171276 0.041712760925292969 0.0017399544240106479 +3485 7 5.834083 1.165916919708252 1.3593622636619784 +3486 6 6.16977739 0.16977739334106445 0.028824363289686517 +3489 8 4.801781 3.198218822479248 10.228603636460548 +3492 7 6.888686 0.11131381988525391 0.012390766497446748 +3495 7 6.191298 0.80870199203491211 0.65399891192123505 +3496 7 6.308696 0.69130420684814453 0.4779015064059422 +3498 6 5.77528572 0.22471427917480469 0.05049650726505206 +3499 7 7.09658337 0.096583366394042969 0.0093283466640059487 +3501 6 6.357981 0.35798120498657227 0.12815054312363827 +3505 7 6.31529951 0.68470048904418945 0.4688147596973522 +3508 5 5.14080048 0.14080047607421875 0.019824774062726647 +3509 6 5.64398 0.35601997375488281 0.12675022171242745 +3510 6 6.093127 0.093126773834228516 0.0086725960047715489 +3512 6 6.499861 0.49986076354980469 0.24986078293659375 +3514 6 6.82486 0.8248600959777832 0.68039417793647772 +3515 7 6.633162 0.36683797836303711 0.13457010236948008 +3521 7 6.103966 0.89603376388549805 0.80287650602281246 +3524 6 7.059881 1.0598812103271484 1.1233481800045411 +3525 6 7.059881 1.0598812103271484 1.1233481800045411 +3530 5 5.521842 0.52184200286865234 0.27231907595796656 +3534 5 5.521842 0.52184200286865234 0.27231907595796656 +3535 5 5.33379745 0.33379745483398438 0.11142074085364584 +3538 7 6.42016 0.57984018325805664 0.33621463812073671 +3539 6 6.67678165 0.67678165435791016 0.45803340767542977 +3540 6 6.71353674 0.71353673934936523 0.50913467840132398 +3545 6 6.0961237 0.096123695373535156 0.009239764812264184 +3548 6 6.183013 0.18301296234130859 0.033493744384941238 +3549 6 6.090422 0.090422153472900391 0.0081761658386767522 +3550 6 6.07437038 0.074370384216308594 0.0055309540484813624 +3552 6 5.76073647 0.23926353454589844 0.057247038963396335 +3553 6 5.76073647 0.23926353454589844 0.057247038963396335 +3554 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3556 7 6.27572966 0.72427034378051758 0.52456753087994912 +3557 6 5.91922855 0.080771446228027344 0.0065240265257671126 +3558 6 5.76073647 0.23926353454589844 0.057247038963396335 +3559 4 4.07595253 0.075952529907226563 0.0057687867993081454 +3561 5 4.905119 0.094881057739257813 0.0090024151177203748 +3562 6 6.55745363 0.55745363235473633 0.31075455222548953 +3563 5 4.905119 0.094881057739257813 0.0090024151177203748 +3565 6 6.04586554 0.045865535736083984 0.002103647368357997 +3569 6 6.04586554 0.045865535736083984 0.002103647368357997 +3570 6 6.00234652 0.0023465156555175781 5.5061357215890894E-06 +3571 4 4.425938 0.42593812942504883 0.18142329009810965 +3575 7 6.21730042 0.7826995849609375 0.61261864029802382 +3583 6 5.68802 0.31197977066040039 0.097331377301316024 +3584 7 6.31275463 0.68724536895751953 0.47230619715355715 +3586 7 6.36759567 0.63240432739257813 0.39993523330485914 +3587 6 5.788671 0.21132898330688477 0.04465993918552158 +3592 7 6.515574 0.48442602157592773 0.2346685703798812 +3598 7 6.75961447 0.24038553237915039 0.057785204177207561 +3599 6 5.357542 0.64245796203613281 0.41275223298362107 +3600 6 6.2097683 0.20976829528808594 0.044002737708069617 +3605 5 5.239256 0.23925590515136719 0.057243388149800012 +3607 6 6.00548553 0.00548553466796875 3.0091090593487024E-05 +3613 6 6.04967546 0.049675464630126953 0.0024676517862189939 +3614 5 5.464339 0.46433877944946289 0.21561050210061694 +3615 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3616 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3620 7 6.543914 0.45608615875244141 0.20801458420555718 +3622 6 6.01449156 0.014491558074951172 0.00021000525543968251 +3625 5 4.96937466 0.030625343322753906 0.00093791165363654727 +3627 5 5.06645775 0.066457748413085938 0.0044166323241370264 +3628 6 4.948763 1.0512371063232422 1.1050994537108636 +3629 6 5.165518 0.83448219299316406 0.69636053042268031 +3631 6 5.855898 0.14410209655761719 0.020765414232300827 +3635 6 5.803308 0.19669198989868164 0.038687738890303081 +3637 7 5.53476954 1.4652304649353027 2.1469003153745234 +3638 7 6.54559469 0.45440530776977539 0.20648418372934429 +3639 6 6.441782 0.44178199768066406 0.19517133347471827 +3640 6 6.44922447 0.44922447204589844 0.20180262628491619 +3643 6 6.44922447 0.44922447204589844 0.20180262628491619 +3645 6 6.42862368 0.42862367630004883 0.18371825588496904 +3646 7 5.662194 1.337806224822998 1.789725495175162 +3647 7 6.61878443 0.38121557235717773 0.14532531260761061 +3650 4 4.981792 0.98179197311401367 0.96391547847110814 +3652 6 6.1309557 0.13095569610595703 0.01714939434259577 +3653 6 5.460203 0.53979682922363281 0.29138061683988781 +3655 7 6.627825 0.37217521667480469 0.13851439190693782 +3656 7 6.350513 0.64948701858520508 0.42183338731069853 +3658 7 6.351104 0.64889621734619141 0.42106630088619568 +3660 8 7.266342 0.7336578369140625 0.53825382166542113 +3661 6 5.73333931 0.26666069030761719 0.071107923755334923 +3668 5 4.298321 0.70167922973632813 0.49235374144336674 +3677 6 6.48859262 0.48859262466430664 0.23872275287635603 +3679 7 6.182809 0.81719112396240234 0.66780133308293443 +3680 6 6.29749 0.29749011993408203 0.088500371458394511 +3681 8 6.875233 1.1247668266296387 1.2651004142865077 +3684 7 6.99874163 0.0012583732604980469 1.5835032627364853E-06 +3687 5 6.75047874 1.7504787445068359 3.0641758349702286 +3688 6 6.5764 0.57639980316162109 0.33223673308475554 +3697 6 6.29749 0.29749011993408203 0.088500371458394511 +3698 6 6.28198338 0.28198337554931641 0.079514624086186814 +3699 5 5.228925 0.22892522811889648 0.052406760069288794 +3702 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3703 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3704 6 6.02090263 0.020902633666992188 0.00043692009421647526 +3706 6 6.62652731 0.62652730941772461 0.39253646944621323 +3714 4 6.085308 2.0853080749511719 4.3485097674565623 +3716 5 6.05689526 1.0568952560424805 1.1170275822451003 +3718 5 5.2608223 0.26082229614257813 0.068028270165086724 +3720 7 7.306124 0.30612421035766602 0.093712032167104553 +3721 5 5.29979467 0.29979467391967773 0.089876846510605901 +3723 7 6.609133 0.39086723327636719 0.15277719404912204 +3724 6 6.398474 0.39847421646118164 0.15878170118435264 +3728 7 6.39105129 0.60894870758056641 0.37081852846404217 +3730 6 5.40976429 0.59023571014404297 0.34837819352924271 +3731 6 6.323588 0.32358789443969727 0.10470912542791666 +3733 6 6.918565 0.91856479644775391 0.84376128527310357 +3734 5 5.592469 0.59246921539306641 0.35101977118847572 +3735 6 6.6319313 0.63193130493164063 0.39933717415260617 +3738 6 5.686131 0.31386899948120117 0.098513748835330261 +3739 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3741 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3744 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3745 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3748 5 5.54170942 0.54170942306518555 0.29344909903761618 +3749 6 6.36270332 0.36270332336425781 0.13155370077947737 +3750 7 6.99610043 0.0038995742797851563 1.520667956356192E-05 +3753 5 5.294697 0.29469680786132813 0.086846208563656546 +3757 5 5.228405 0.22840499877929688 0.052168843467370607 +3759 6 6.1390934 0.13909339904785156 0.019346973658684874 +3762 5 5.38635254 0.3863525390625 0.14926828444004059 +3764 8 7.7105546 0.28944540023803711 0.083778639718957493 +3766 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3767 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3769 5 5.07945967 0.079459667205810547 0.0063138387124581641 +3771 6 5.881416 0.11858415603637695 0.014062202062859797 +3772 6 6.194134 0.19413423538208008 0.037688101347384872 +3776 5 6.84388638 1.8438863754272461 3.3999169654862271 +3778 7 6.78043842 0.21956157684326172 0.048207286025899521 +3779 7 7.006796 0.0067958831787109375 4.6184028178686276E-05 +3782 6 6.213825 0.21382522583007813 0.045721227201283909 +3785 7 6.614752 0.38524818420410156 0.14841616343255737 +3786 5 5.138664 0.13866376876831055 0.019227640769031495 +3790 5 5.36643553 0.36643552780151367 0.1342749960351739 +3794 5 5.73072529 0.73072528839111328 0.53395944709427567 +3795 6 5.587233 0.41276693344116211 0.17037654134242075 +3796 6 6.35663176 0.35663175582885742 0.12718620926557378 +3797 5 5.010817 0.010817050933837891 0.00011700859090524318 +3799 5 6.00536442 1.0053644180297852 1.0107576130403686 +3802 5 5.56199741 0.56199741363525391 0.31584109293271467 +3803 6 6.127415 0.12741518020629883 0.016234628147003605 +3804 5 5.23174334 0.23174333572387695 0.053704973652429544 +3806 5 5.010817 0.010817050933837891 0.00011700859090524318 +3807 5 5.76871 0.76871013641357422 0.59091527382497588 +3810 3 5.63473034 2.634730339050293 6.9418039595120717 +3811 5 5.71404 0.71403980255126953 0.50985283962745598 +3812 5 5.56199741 0.56199741363525391 0.31584109293271467 +3813 5 6.00536442 1.0053644180297852 1.0107576130403686 +3814 5 5.584843 0.58484315872192383 0.34204152030383739 +3816 5 5.614201 0.61420106887817383 0.37724295301109123 +3817 6 6.45202875 0.45202875137329102 0.20432999206809654 +3818 6 6.95391655 0.95391654968261719 0.90995678375838907 +3819 6 6.95391655 0.95391654968261719 0.90995678375838907 +3822 6 6.508243 0.50824308395385742 0.25831103238692776 +3825 6 6.22035742 0.22035741806030273 0.048557391694203034 +3826 6 6.95391655 0.95391654968261719 0.90995678375838907 +3827 5 5.79172754 0.79172754287719727 0.62683250215036423 +3828 6 6.45202875 0.45202875137329102 0.20432999206809654 +3829 7 6.896923 0.10307693481445313 0.010624854490743019 +3831 5 5.33792543 0.33792543411254883 0.11419359902015458 +3832 5 5.33792543 0.33792543411254883 0.11419359902015458 +3835 5 4.95905542 0.040944576263427734 0.0016764583253916499 +3836 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3837 6 5.92592859 0.074071407318115234 0.0054865733820861351 +3840 6 6.563122 0.56312179565429688 0.31710615674091969 +3842 6 6.269664 0.26966381072998047 0.072718570817414729 +3844 6 6.563122 0.56312179565429688 0.31710615674091969 +3845 5 5.040678 0.040678024291992188 0.0016547016602999065 +3846 6 6.333541 0.33354091644287109 0.11124954294155032 +3847 5 5.040678 0.040678024291992188 0.0016547016602999065 +3849 5 5.18588829 0.18588829040527344 0.034554456509795273 +3851 7 7.063238 0.063238143920898438 0.003999062846560264 +3852 6 6.40936041 0.40936040878295898 0.16757594427895128 +3856 6 6.40936041 0.40936040878295898 0.16757594427895128 +3857 6 6.131547 0.13154697418212891 0.017304606416473689 +3858 6 6.55600739 0.55600738525390625 0.30914421245688573 +3859 5 5.479981 0.4799809455871582 0.23038170812674252 +3861 6 5.770308 0.22969198226928711 0.052758406718794504 +3864 7 6.434293 0.56570720672607422 0.32002464374181727 +3865 6 7.211348 1.2113480567932129 1.4673641146966929 +3867 5 5.479981 0.4799809455871582 0.23038170812674252 +3868 6 5.64784956 0.35215044021606445 0.12400993254436798 +3871 6 5.47240543 0.52759456634521484 0.27835602643699531 +3873 5 5.128382 0.12838220596313477 0.016481990807960756 +3874 5 5.36483431 0.36483430862426758 0.13310407274934732 +3877 5 5.846487 0.84648704528808594 0.71654031784055405 +3878 5 5.39803934 0.39803934097290039 0.15843531696214086 +3879 4 5.068995 1.0689949989318848 1.1427503077413803 +3880 6 5.62090158 0.37909841537475586 0.14371560853965093 +3881 6 5.62090158 0.37909841537475586 0.14371560853965093 +3882 5 5.83923769 0.83923768997192383 0.70431990026941094 +3883 6 6.642903 0.64290285110473633 0.41332407595859877 +3884 6 5.62090158 0.37909841537475586 0.14371560853965093 +3885 6 6.30556154 0.30556154251098633 0.093367856261693305 +3887 6 6.30556154 0.30556154251098633 0.093367856261693305 +3890 6 6.616883 0.6168828010559082 0.38054439023858322 +3892 5 6.207933 1.2079329490661621 1.4591020094396754 +3895 6 5.99532557 0.0046744346618652344 2.1850339408047148E-05 +3896 6 5.653739 0.34626102447509766 0.11989669707054418 +3898 7 6.063343 0.93665695190429688 0.87732624555064831 +3899 5 6.207933 1.2079329490661621 1.4591020094396754 +3901 4 4.564142 0.56414222717285156 0.31825645247954526 +3902 6 5.68136072 0.31863927841186523 0.10153098974683417 +3905 7 7.138951 0.13895082473754883 0.019307331695245011 +3906 7 7.138951 0.13895082473754883 0.019307331695245011 +3908 7 6.148028 0.85197210311889648 0.72585646449283558 +3909 7 6.148028 0.85197210311889648 0.72585646449283558 +3910 6 6.63435841 0.63435840606689453 0.40241058734773105 +3911 6 5.38463831 0.61536169052124023 0.37867001016115864 +3913 6 5.75083733 0.24916267395019531 0.062082038090011338 +3914 7 6.148028 0.85197210311889648 0.72585646449283558 +3915 7 7.09318256 0.093182563781738281 0.0086829901929377229 +3917 5 5.26391649 0.2639164924621582 0.069651914993528408 +3920 6 5.7849946 0.21500539779663086 0.046227321081687478 +3922 7 6.80864763 0.19135236740112305 0.036615728510014378 +3923 5 5.02166033 0.021660327911376953 0.00046916980522837548 +3925 5 5.87787962 0.87787961959838867 0.7706726265062116 +3926 6 5.86510658 0.13489341735839844 0.018196234046627069 +3927 5 6.15729952 1.1572995185852051 1.3393421757175474 +3928 5 5.181213 0.1812129020690918 0.032838115876302254 +3930 6 6.24382734 0.24382734298706055 0.059451773188129664 +3931 6 6.76949167 0.76949167251586914 0.5921174340712696 +3932 8 6.814661 1.1853389739990234 1.4050284832810576 +3933 4 5.36573 1.365729808807373 1.8652179106650237 +3936 6 5.942126 0.057874202728271484 0.0033494233414330665 +3937 5 5.47661352 0.47661352157592773 0.22716044894900733 +3940 5 5.20407343 0.20407342910766602 0.041645964467761587 +3941 5 5.28040171 0.28040170669555664 0.078625117117780974 +3942 6 5.689291 0.31070899963378906 0.096540082453429932 +3943 6 5.534346 0.46565389633178711 0.21683355116897474 +3944 6 6.19307756 0.19307756423950195 0.037278945812659003 +3945 6 6.19931555 0.19931554794311523 0.039726687651864268 +3946 6 6.649443 0.64944314956665039 0.42177640451905063 +3947 7 6.5232563 0.47674369812011719 0.22728455369724543 +3949 5 5.20407343 0.20407342910766602 0.041645964467761587 +3950 5 5.28040171 0.28040170669555664 0.078625117117780974 +3951 5 5.33914328 0.33914327621459961 0.11501816180157221 +3952 6 6.17257738 0.1725773811340332 0.029782952479081359 +3953 7 6.01015 0.98985004425048828 0.97980311010269361 +3954 5 5.33914328 0.33914327621459961 0.11501816180157221 +3956 5 5.874935 0.87493515014648438 0.76551151696185116 +3959 6 5.762868 0.23713207244873047 0.056231619783829956 +3960 6 5.484553 0.51544713973999023 0.26568575386613702 +3962 7 6.894317 0.1056828498840332 0.011168864759611097 +3963 7 6.40009546 0.59990453720092773 0.35988545375425929 +3965 4 5.771997 1.7719969749450684 3.1399732792144732 +3967 4 5.61956 1.6195597648620605 2.6229738319600528 +3970 7 6.26989174 0.73010826110839844 0.53305807293872931 +3973 4 5.61956 1.6195597648620605 2.6229738319600528 +3978 7 5.6615057 1.3384943008422852 1.7915669933872778 +3982 7 7.10843658 0.10843658447265625 0.011758492852095515 +3985 6 6.1268425 0.12684249877929688 0.016089019496575929 +3990 6 5.793903 0.20609712600708008 0.042476025348378244 +3993 7 6.273067 0.72693300247192383 0.52843159008284601 +3994 7 6.273067 0.72693300247192383 0.52843159008284601 +3995 5 4.49924231 0.50075769424438477 0.25075826834495274 +3996 7 6.273067 0.72693300247192383 0.52843159008284601 +3997 7 6.61189747 0.38810253143310547 0.15062357490478462 +4002 6 5.52411652 0.47588348388671875 0.2264650902361609 +4003 6 6.44395447 0.4439544677734375 0.19709556945599616 +4004 7 6.93372965 0.066270351409912109 0.0043917594759932399 +4006 6 6.54262829 0.54262828826904297 0.2944454592297916 +4009 6 6.030793 0.030793190002441406 0.00094822055052645737 +4010 6 6.702753 0.70275306701660156 0.49386187320124009 +4011 7 6.61189747 0.38810253143310547 0.15062357490478462 +4014 6 6.416903 0.41690301895141602 0.17380812721080474 +4015 5 4.63322 0.36677980422973633 0.13452742479080371 +4017 6 6.302566 0.3025660514831543 0.091546215510106776 +4018 6 6.416903 0.41690301895141602 0.17380812721080474 +4019 5 4.63322 0.36677980422973633 0.13452742479080371 +4021 5 5.672981 0.67298078536987305 0.45290313747705113 +4022 5 5.24404049 0.24404048919677734 0.059555760367402399 +4024 6 6.498086 0.49808597564697266 0.24808963913619664 +4025 6 7.268845 1.2688450813293457 1.6099678404136739 +4027 5 5.43563271 0.43563270568847656 0.18977585426546284 +4029 6 6.150405 0.15040493011474609 0.022621643002821656 +4031 5 5.149139 0.1491389274597168 0.022242419683834669 +4032 5 5.507375 0.50737476348876953 0.25742915062528482 +4033 6 5.997153 0.0028471946716308594 8.1065174981631571E-06 +4034 5 5.507375 0.50737476348876953 0.25742915062528482 +4035 6 6.290976 0.29097604751586914 0.084667060227957336 +4037 5 5.21681929 0.21681928634643555 0.047010602931777612 +4039 4 5.56902456 1.5690245628356934 2.4618380787817387 +4043 7 6.615785 0.38421487808227539 0.14762107253977774 +4044 7 6.615785 0.38421487808227539 0.14762107253977774 +4047 6 6.399214 0.39921379089355469 0.15937165083960281 +4049 6 6.340012 0.3400120735168457 0.11560821013722489 +4050 7 6.615785 0.38421487808227539 0.14762107253977774 +4051 6 6.762627 0.76262712478637695 0.58160013145993616 +4052 5 5.392097 0.39209699630737305 0.15374005451326411 +4053 7 6.615785 0.38421487808227539 0.14762107253977774 +4054 7 6.69855261 0.30144739151000977 0.090870529848189108 +4055 6 6.762627 0.76262712478637695 0.58160013145993616 +4056 5 5.68365574 0.68365573883056641 0.46738516923596762 +4059 6 6.340012 0.3400120735168457 0.11560821013722489 +4064 5 6.0256834 1.0256834030151367 1.0520264432207114 +4066 6 6.278558 0.27855777740478516 0.077594435352693836 +4070 5 5.71400928 0.71400928497314453 0.50980925902786112 +4071 6 6.35261631 0.35261631011962891 0.12433826216238231 +4075 6 5.782519 0.21748113632202148 0.047298044655917693 +4078 6 5.879521 0.12047910690307617 0.014515215200162856 +4082 6 5.96297741 0.037022590637207031 0.0013706722174902097 +4085 6 5.42402267 0.57597732543945313 0.3317498794203857 +4086 6 5.6922617 0.30773830413818359 0.094702863833845186 +4087 6 5.65787649 0.34212350845336914 0.11704849503644255 +4088 6 5.93835 0.061649799346923828 0.0038006977595159697 +4091 6 5.59978676 0.40021324157714844 0.16017063873368897 +4094 7 7.09430265 0.094302654266357422 0.0088929906016801397 +4096 5 5.004691 0.0046911239624023438 2.2006644030625466E-05 +4097 6 5.59978676 0.40021324157714844 0.16017063873368897 +4099 6 5.251464 0.74853610992431641 0.56030630786062829 +4100 6 6.169235 0.1692352294921875 0.02864056290127337 +4101 5 5.35461 0.35460996627807617 0.12574822818373832 +4102 5 5.35461 0.35460996627807617 0.12574822818373832 +4103 7 6.459716 0.54028415679931641 0.29190697008834832 +4105 7 6.1171217 0.88287830352783203 0.77947409884018271 +4107 6 6.4520607 0.45206069946289063 0.20435887599887792 +4108 6 6.504417 0.50441694259643555 0.25443645197833575 +4109 6 6.58853436 0.58853435516357422 0.34637268720780412 +4111 6 5.88097429 0.11902570724487305 0.014167118985142224 +4112 6 6.374791 0.37479114532470703 0.14046840261380567 +4119 7 6.504891 0.49510908126831055 0.24513300235435054 +4120 5 5.821947 0.82194709777832031 0.67559703154620365 +4122 6 5.31796741 0.68203258514404297 0.46516844719826622 +4125 5 5.840767 0.84076690673828125 0.70688899146625772 +4126 5 5.781769 0.781768798828125 0.61116245482116938 +4128 5 5.52519 0.52518987655639648 0.27582440643732298 +4131 5 5.383935 0.38393497467041016 0.14740606477516849 +4132 5 5.383935 0.38393497467041016 0.14740606477516849 +4133 6 6.15966272 0.15966272354125977 0.025492185288612745 +4134 6 6.03338528 0.033385276794433594 0.0011145767066409462 +4136 6 6.40281725 0.4028172492980957 0.16226173633208418 +4137 5 5.383935 0.38393497467041016 0.14740606477516849 +4138 6 5.73121643 0.2687835693359375 0.072244607144966722 +4139 7 6.34555149 0.65444850921630859 0.42830285121544875 +4140 6 5.88961172 0.11038827896118164 0.012185572132011657 +4141 6 5.88961172 0.11038827896118164 0.012185572132011657 +4143 6 5.593262 0.4067378044128418 0.16543564153857915 +4147 7 6.34555149 0.65444850921630859 0.42830285121544875 +4149 7 6.661175 0.33882522583007813 0.11480253365880344 +4150 5 5.02091932 0.020919322967529297 0.00043761807341979875 +4151 6 6.47969961 0.47969961166381836 0.23011171743041814 +4152 6 5.66785336 0.33214664459228516 0.11032139351391379 +4154 5 5.15050268 0.15050268173217773 0.022651057208577186 +4155 5 5.12121248 0.12121248245239258 0.014692465902271579 +4159 7 7.171123 0.17112302780151367 0.029283090643957621 +4160 7 7.171123 0.17112302780151367 0.029283090643957621 +4162 7 7.171123 0.17112302780151367 0.029283090643957621 +4163 5 5.196028 0.19602823257446289 0.038427067966267714 +4165 7 6.1403017 0.85969829559326172 0.7390811594459592 +4166 7 6.264687 0.73531293869018555 0.54068511780519657 +4168 6 6.413434 0.41343402862548828 0.17092769602550106 +4169 7 6.41145468 0.58854532241821289 0.34638559654035816 +4170 7 7.171123 0.17112302780151367 0.029283090643957621 +4171 5 6.396712 1.3967118263244629 1.9508039257946166 +4174 6 5.622606 0.37739419937133789 0.14242638171913313 +4177 6 6.333195 0.33319520950317383 0.1110190476358639 +4178 7 6.451308 0.54869222640991211 0.30106315932266625 +4179 5 5.080747 0.080747127532958984 0.0065200986048239429 +4180 6 5.17860174 0.82139825820922852 0.67469509858915444 +4181 6 5.97988 0.020120143890380859 0.00040482019016963022 +4184 7 6.664118 0.33588218688964844 0.11281684346977272 +4186 5 5.63166 0.63165998458862305 0.39899433613049951 +4187 6 6.629633 0.62963294982910156 0.39643765151049593 +4188 6 6.45284367 0.45284366607666016 0.20506738590574969 +4189 5 5.431086 0.43108606338500977 0.18583519404478466 +4195 8 6.864855 1.1351451873779297 1.2885545964272751 +4196 6 6.342234 0.34223413467407227 0.11712420293611103 +4199 6 6.092705 0.09270477294921875 0.0085941749275662005 +4203 5 5.11989164 0.11989164352416992 0.014374006186926636 +4205 6 6.4625473 0.46254730224609375 0.2139500068151392 +4206 6 5.41587734 0.58412265777587891 0.34119927932715655 +4207 7 6.66556644 0.33443355560302734 0.11184580311328318 +4208 6 6.23236465 0.23236465454101563 0.053993332679965533 +4210 6 5.624344 0.3756561279296875 0.14111752645112574 +4211 6 5.50366735 0.49633264541625977 0.24634609490590265 +4212 4 5.101606 1.1016058921813965 1.2135355416887705 +4213 4 4.66811943 0.66811943054199219 0.44638357346775592 +4215 5 5.144476 0.14447593688964844 0.020873296340141678 +4218 6 6.2664175 0.26641750335693359 0.070978286094941723 +4221 6 6.68571949 0.68571949005126953 0.47021121903617313 +4222 4 4.72174644 0.72174644470214844 0.52091793044019141 +4223 4 4.507802 0.50780200958251953 0.25786288093604526 +4225 5 5.66852236 0.66852235794067383 0.44692214306655842 +4227 7 5.712353 1.2876467704772949 1.6580342055206074 +4228 6 5.54079962 0.45920038223266602 0.21086499104262657 +4229 6 5.635159 0.36484098434448242 0.13310894385745087 +4230 6 5.206867 0.79313278198242188 0.62905960985517595 +4231 6 6.206823 0.20682287216186523 0.042775700449283249 +4233 6 5.66782 0.33218002319335938 0.11034356780874077 +4235 5 5.115067 0.1150670051574707 0.013240415675909389 +4236 5 5.115067 0.1150670051574707 0.013240415675909389 +4237 5 6.068968 1.0689678192138672 1.142692198514851 +4240 6 5.92421675 0.075783252716064453 0.0057431013922268903 +4241 6 6.78847551 0.78847551345825195 0.62169363532325406 +4244 5 5.40309143 0.4030914306640625 0.16248270147480071 +4249 6 5.87049532 0.12950468063354492 0.016771462305996465 +4251 6 5.72442341 0.27557659149169922 0.07594245777818287 +4253 4 5.871702 1.8717021942138672 3.503269103825005 +4254 5 5.62651348 0.62651348114013672 0.39251914205033245 +4256 5 5.298669 0.29866886138916016 0.089203088763497362 +4257 5 6.2595787 1.2595787048339844 1.5865385136712575 +4260 6 6.039149 0.039148807525634766 0.0015326291306791973 +4261 7 6.67396927 0.32603073120117188 0.10629603768757079 +4262 6 6.53447533 0.53447532653808594 0.28566387467799359 +4263 6 5.570907 0.4290928840637207 0.18412070315412166 +4266 7 6.67396927 0.32603073120117188 0.10629603768757079 +4268 6 6.223932 0.22393178939819336 0.050145446303076824 +4271 5 4.947084 0.052916049957275391 0.0028001083430808649 +4272 6 5.83227158 0.16772842407226563 0.028132824241765775 +4274 6 5.83227158 0.16772842407226563 0.028132824241765775 +4275 6 5.83227158 0.16772842407226563 0.028132824241765775 +4278 4 4.781235 0.7812352180480957 0.61032846591865564 +4279 6 6.009532 0.0095319747924804688 9.0858543444483075E-05 +4281 5 5.3883934 0.38839340209960938 0.15084943479450885 +4288 6 6.39963055 0.39963054656982422 0.15970457375169644 +4291 5 5.64141655 0.64141654968261719 0.41141519020675332 +4292 6 6.14931154 0.14931154251098633 0.022293936727010077 +4295 5 5.64141655 0.64141654968261719 0.41141519020675332 +4297 6 6.430081 0.43008089065551758 0.18496957250704327 +4300 5 5.76332045 0.7633204460144043 0.5826581033036291 +4301 5 5.09951735 0.099517345428466797 0.0099037020411287813 +4304 6 6.01407433 0.014074325561523438 0.00019808664001175202 +4306 6 6.01468229 0.014682292938232422 0.00021556972592406964 +4307 7 6.38643 0.61357021331787109 0.37646840667093784 +4308 6 6.37244368 0.37244367599487305 0.13871429178857397 +4310 6 5.634999 0.36500120162963867 0.13322587719108014 +4311 5 6.35202742 1.352027416229248 1.8279781342355363 +4314 7 6.330645 0.66935491561889648 0.44803600306318003 +4315 7 6.70243 0.29757022857666016 0.088548040935165773 +4318 7 6.330645 0.66935491561889648 0.44803600306318003 +4319 7 6.70243 0.29757022857666016 0.088548040935165773 +4322 7 6.258191 0.74180889129638672 0.55028043120637449 +4323 6 6.030255 0.030254840850830078 0.00091535539490905649 +4324 6 6.287142 0.28714179992675781 0.082450413265178213 +4325 5 5.33152676 0.33152675628662109 0.10990999013392866 +4327 5 5.33152676 0.33152675628662109 0.10990999013392866 +4331 5 5.30460739 0.30460739135742188 0.092785662869573571 +4336 8 7.803421 0.1965789794921875 0.038643295178189874 +4338 8 7.803421 0.1965789794921875 0.038643295178189874 +4339 8 5.894702 2.1052980422973633 4.4322798469011104 +4342 6 6.53088236 0.53088235855102539 0.28183607862069948 +4344 6 5.308004 0.69199609756469727 0.47885859904477002 +4345 6 6.16504431 0.16504430770874023 0.027239623507057331 +4346 6 5.308004 0.69199609756469727 0.47885859904477002 +4347 7 6.508878 0.49112176895141602 0.24120059193796806 +4348 6 5.203784 0.79621601104736328 0.63395993624817493 +4350 6 6.67189741 0.67189741134643555 0.45144613137404122 +4356 5 5.61585426 0.61585426330566406 0.3792764736317622 +4357 6 6.30698061 0.30698060989379883 0.094237094850768699 +4359 6 5.048261 0.95173883438110352 0.90580680886910159 +4360 5 5.47202253 0.47202253341674805 0.22280527205316503 +4364 6 6.12464428 0.12464427947998047 0.01553619640708348 +4367 5 5.313826 0.31382608413696289 0.098486811084740111 +4368 6 6.25579929 0.25579929351806641 0.06543327856434189 +4371 5 5.73987532 0.73987531661987305 0.54741548414335739 +4373 6 6.28148031 0.28148031234741211 0.079231166239196682 +4374 5 5.319378 0.31937789916992188 0.10200224247819278 +4377 6 7.22142553 1.2214255332946777 1.4918803333841879 +4379 5 5.134177 0.13417720794677734 0.018003523132392729 +4381 6 6.37373829 0.37373828887939453 0.13968030857449776 +4383 6 7.22142553 1.2214255332946777 1.4918803333841879 +4384 5 5.17954 0.17954015731811523 0.032234668089813567 +4385 5 5.17954 0.17954015731811523 0.032234668089813567 +4387 6 6.33638859 0.33638858795166016 0.1131572821041118 +4389 4 5.846869 1.8468689918518066 3.4109250730637086 +4390 5 5.244622 0.24462223052978516 0.059840035669367353 +4391 5 5.60372734 0.60372734069824219 0.3644867019065714 +4392 5 5.244622 0.24462223052978516 0.059840035669367353 +4394 6 5.95294666 0.047053337097167969 0.0022140165319797234 +4395 5 5.325285 0.32528495788574219 0.10581030382672907 +4396 5 5.33716774 0.33716773986816406 0.11368208480780595 +4401 6 7.114057 1.1140570640563965 1.2411231419739579 +4402 6 6.401035 0.40103483200073242 0.16082893647785568 +4404 5 5.16598129 0.16598129272460938 0.027549789534532465 +4405 5 5.16598129 0.16598129272460938 0.027549789534532465 +4407 6 6.38966656 0.38966655731201172 0.15184002588739531 +4409 7 6.784521 0.21547889709472656 0.046431155093159759 +4412 7 6.24230337 0.75769662857055664 0.57410418094718807 +4416 5 5.28144741 0.28144741058349609 0.079212644924155029 +4420 6 5.910447 0.089552879333496094 0.0080197181969197118 +4423 6 5.82727575 0.17272424697875977 0.029833665494379602 +4424 6 5.910447 0.089552879333496094 0.0080197181969197118 +4425 6 5.76691437 0.23308563232421875 0.054328911995980889 +4427 5 5.505483 0.50548315048217773 0.25551321542138794 +4429 6 5.82788134 0.1721186637878418 0.029624834424112123 +4430 5 5.208692 0.20869207382202148 0.043552381676136065 +4432 6 6.75506926 0.75506925582885742 0.57012958109794454 +4433 5 4.73662949 0.26337051391601563 0.06936402760038618 +4434 6 5.983093 0.016907215118408203 0.00028585392306013091 +4435 6 5.998494 0.0015058517456054688 2.2675894797430374E-06 +4438 5 5.61417246 0.61417245864868164 0.37720780896256656 +4441 6 6.13689232 0.13689231872558594 0.018739506926067406 +4444 6 6.323481 0.32348108291625977 0.10464001100467613 +4450 6 5.931922 0.068078041076660156 0.0046346196768354275 +4451 5 5.0867095 0.086709499359130859 0.0075185372791111149 +4452 5 5.28290367 0.28290367126464844 0.08003448721501627 +4454 6 5.866116 0.13388395309448242 0.017924912896205569 +4458 7 6.727507 0.27249288558959961 0.074252372696946622 +4463 6 6.66014862 0.66014862060546875 0.43579620128730312 +4464 5 5.33912659 0.3391265869140625 0.11500684195198119 +4467 5 5.814492 0.81449222564697266 0.66339758563935902 +4468 6 6.148203 0.14820289611816406 0.021964098417811329 +4469 6 6.15595961 0.1559596061706543 0.02432339875690559 +4471 6 6.1687336 0.16873359680175781 0.028471026689658174 +4474 6 5.58603525 0.41396474838256836 0.17136681290344313 +4476 6 6.43061924 0.43061923980712891 0.18543292969206959 +4477 5 5.274904 0.27490377426147461 0.07557208510320379 +4479 5 4.76414776 0.23585224151611328 0.055626279828175029 +4480 5 6.48533058 1.4853305816650391 2.2062069368294033 +4483 4 5.231788 1.231788158416748 1.5173020672157236 +4484 5 4.76414776 0.23585224151611328 0.055626279828175029 +4485 6 6.311954 0.31195402145385742 0.097315311501233737 +4487 6 6.056974 0.056973934173583984 0.003246029175215881 +4488 6 6.68880939 0.68880939483642578 0.47445838241492311 +4490 6 6.510393 0.51039314270019531 0.26050116011538194 +4492 6 5.89441824 0.10558176040649414 0.011147508130534334 +4495 6 5.144858 0.85514211654663086 0.7312680394918516 +4500 6 5.839706 0.1602940559387207 0.025694184369285722 +4501 6 4.62486744 1.3751325607299805 1.8909895595797934 +4502 6 6.01956224 0.019562244415283203 0.00038268140656327887 +4505 5 5.376757 0.37675714492797852 0.14194594625428181 +4506 6 6.49714661 0.4971466064453125 0.24715474830009043 +4508 4 6.290004 2.290003776550293 5.2441172966146041 +4510 6 7.13127375 1.1312737464904785 1.2797802894986035 +4513 6 6.11181831 0.11181831359863281 0.012503335256042192 +4515 6 6.48865747 0.48865747451782227 0.23878612740213612 +4518 6 5.303486 0.69651412963867188 0.48513193278631661 +4519 6 6.31545067 0.31545066833496094 0.099509124152973527 +4523 5 5.89000559 0.89000558853149414 0.79210994761729125 +4524 6 5.74650574 0.2534942626953125 0.064259341219440103 +4525 6 6.31545067 0.31545066833496094 0.099509124152973527 +4529 6 5.78503227 0.21496772766113281 0.046211123935790965 +4537 5 5.41821861 0.41821861267089844 0.17490680798437097 +4538 6 7.013766 1.013765811920166 1.0277211214181534 +4539 5 6.30204439 1.3020443916320801 1.6953195977805535 +4540 6 6.81689167 0.81689167022705078 0.66731200088634068 +4541 6 6.21650553 0.21650552749633789 0.046874643436467522 +4545 6 6.73921871 0.73921871185302734 0.54644430395364907 +4546 6 6.66135359 0.66135358810424805 0.43738856849836338 +4547 6 6.231135 0.23113489151000977 0.053423338073343984 +4548 5 5.619266 0.61926603317260742 0.38349041984133692 +4550 6 6.00123453 0.0012345314025878906 1.5240677839756245E-06 +4553 6 6.81689167 0.81689167022705078 0.66731200088634068 +4555 5 5.438729 0.43872880935668945 0.19248296815953836 +4559 7 5.820478 1.1795220375061035 1.3912722369625499 +4560 6 7.43508 1.4350800514221191 2.0594547539897121 +4562 7 6.60676956 0.39323043823242188 0.15463017755246256 +4563 7 6.51218367 0.48781633377075195 0.23796477549353767 +4569 6 5.791381 0.20861911773681641 0.043521936285287666 +4571 7 6.183002 0.81699800491333008 0.66748574003236172 +4574 7 7.28964 0.28963994979858398 0.083891300519326251 +4575 7 6.81097269 0.18902730941772461 0.035731323705704199 +4576 5 6.063239 1.0632390975952148 1.1304773786550868 +4578 7 6.65358162 0.34641838073730469 0.12000569451265619 +4581 6 6.3172965 0.31729650497436523 0.10067707206894738 +4582 6 5.9126215 0.087378501892089844 0.0076350025929059484 +4588 5 6.453704 1.4537038803100586 2.1132549716285212 +4589 6 6.48201656 0.48201656341552734 0.23233996740691509 +4591 6 5.233967 0.76603317260742188 0.5868068215349922 +4592 6 6.46258 0.46258020401000977 0.21398044514194225 +4594 6 7.097535 1.0975351333618164 1.2045833689635401 +4595 6 6.03428125 0.034281253814697266 0.0011752043631076958 +4601 6 6.55298138 0.55298137664794922 0.30578840291946108 +4603 6 6.15366173 0.15366172790527344 0.023611926622834289 +4604 6 6.37432575 0.37432575225830078 0.14011976880374277 +4610 6 5.418315 0.58168506622314453 0.33835751626702404 +4611 5 5.78711462 0.78711462020874023 0.61954942534634938 +4612 5 5.5359993 0.53599929809570313 0.28729524755908642 +4614 5 4.7773695 0.22263050079345703 0.049564339883545472 +4616 5 5.515364 0.51536417007446289 0.26560022779653991 +4618 7 6.754185 0.24581480026245117 0.060424916028068765 +4620 6 5.92583847 0.074161529541015625 0.0054999324638629332 +4622 7 7.02194071 0.021940708160400391 0.00048139467457986029 +4626 6 6.392011 0.39201116561889648 0.15367275396988589 +4627 6 5.879169 0.12083101272583008 0.01460013363634971 +4628 6 5.879169 0.12083101272583008 0.01460013363634971 +4629 7 6.207745 0.79225492477416992 0.62766786582892564 +4631 7 6.29134655 0.70865345001220703 0.50218971221420361 +4633 6 5.58980465 0.41019535064697266 0.16826022569239285 +4634 6 6.5506444 0.5506443977355957 0.30320925275759691 +4637 6 6.52179 0.5217900276184082 0.2722648329220192 +4638 5 5.39053345 0.390533447265625 0.1525163734331727 +4640 6 6.52179 0.5217900276184082 0.2722648329220192 +4643 6 5.714403 0.28559684753417969 0.081565559321461478 +4646 7 6.041397 0.9586029052734375 0.91891952999867499 +4649 5 4.65491056 0.34508943557739258 0.11908671854712338 +4651 7 7.295845 0.29584503173828125 0.08752428280422464 +4652 5 5.108062 0.10806179046630859 0.011677350558784383 +4656 7 6.557833 0.44216680526733398 0.19551148368032045 +4657 7 6.557833 0.44216680526733398 0.19551148368032045 +4661 5 6.112563 1.1125631332397461 1.237796725444241 +4664 7 6.18966246 0.81033754348754883 0.65664693438543509 +4667 7 6.18966246 0.81033754348754883 0.65664693438543509 +4668 7 6.281588 0.71841192245483398 0.5161156903252504 +4669 5 6.191474 1.1914739608764648 1.4196101994466517 +4673 7 6.867097 0.13290309906005859 0.017663233739767747 +4674 7 7.240729 0.24072885513305664 0.057950381693672171 +4678 6 5.62289524 0.37710475921630859 0.14220799942359008 +4679 5 5.20689535 0.20689535140991211 0.042805686435031021 +4682 6 5.69725657 0.30274343490600586 0.091653587378687007 +4684 6 6.23112869 0.23112869262695313 0.053420472555444576 +4685 5 5.61776447 0.61776447296142578 0.38163294405330817 +4686 4 4.58701658 0.58701658248901367 0.34458846811708099 +4688 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4692 5 5.97440958 0.97440958023071289 0.9494740300453941 +4693 6 6.09839344 0.098393440246582031 0.0096812690835577087 +4694 7 6.101005 0.89899492263793945 0.80819187092879474 +4695 7 7.00340128 0.0034012794494628906 1.1568701893338584E-05 +4698 6 5.45968676 0.5403132438659668 0.29193840149696371 +4699 5 5.73117447 0.73117446899414063 0.53461610410886351 +4700 5 5.73117447 0.73117446899414063 0.53461610410886351 +4702 6 5.335329 0.66467094421386719 0.44178746408215375 +4703 7 6.74484062 0.25515937805175781 0.065106308207759866 +4704 6 5.266865 0.73313522338867188 0.53748725577315781 +4705 6 5.828863 0.17113685607910156 0.029287823508639121 +4709 6 6.635482 0.63548183441162109 0.40383716186715901 +4710 7 6.614615 0.38538503646850586 0.14852162633383159 +4711 6 6.165267 0.16526699066162109 0.027313178202348354 +4714 7 6.478859 0.52114105224609375 0.27158799633616582 +4717 6 5.71084 0.28915977478027344 0.083613375350978458 +4720 5 6.142657 1.1426568031311035 1.3056645697417935 +4721 6 6.462371 0.46237087249755859 0.21378682373415359 +4724 6 6.462371 0.46237087249755859 0.21378682373415359 +4726 6 7.20805073 1.2080507278442383 1.4593865610449939 +4728 6 6.28587675 0.28587675094604492 0.081725516731466996 +4731 6 7.07015753 1.070157527923584 1.1452371345715164 +4732 6 7.07015753 1.070157527923584 1.1452371345715164 +4736 6 5.969431 0.030569076538085938 0.00093446844039135613 +4739 6 6.319568 0.31956815719604492 0.10212380709367608 +4740 5 5.16463041 0.16463041305541992 0.027103172902798178 +4741 6 6.012568 0.012567996978759766 0.0001579545480581146 +4742 6 6.012427 0.012426853179931641 0.00015442667995557713 +4744 5 5.40579844 0.40579843521118164 0.16467237001984358 +4745 3 5.750404 2.750403881072998 7.5647215090214104 +4747 6 6.406887 0.40688705444335938 0.1655570750735933 +4749 6 4.94821072 1.0517892837524414 1.1062606974164737 +4750 5 5.616849 0.61684894561767578 0.38050262170963833 +4751 6 5.60638952 0.39361047744750977 0.15492920795645659 +4753 6 6.76105976 0.76105976104736328 0.5792119598854697 +4755 6 6.18791866 0.18791866302490234 0.035313423913066799 +4760 6 5.879002 0.12099790573120117 0.014640493191336645 +4761 6 6.61741972 0.61741971969604492 0.38120711026954268 +4763 7 7.51052475 0.51052474975585938 0.26063552011328284 +4765 8 6.80642462 1.193575382232666 1.4246221930718548 +4767 7 5.490513 1.5094871520996094 2.2785514623537892 +4768 6 5.81628227 0.18371772766113281 0.033752203456970165 +4769 6 5.81628227 0.18371772766113281 0.033752203456970165 +4777 6 6.61448669 0.6144866943359375 0.37759389751590788 +4778 6 5.598406 0.40159416198730469 0.16127787094228552 +4779 4 4.22890425 0.22890424728393555 0.052397154424625114 +4780 5 5.38402939 0.38402938842773438 0.14747857117617968 +4781 5 5.58836842 0.58836841583251953 0.34617739274926862 +4782 6 5.827879 0.17212104797363281 0.029625655155541608 +4786 8 7.105712 0.89428806304931641 0.79975113971249812 +4787 8 6.78330564 1.2166943550109863 1.4803451535156 +4788 5 5.76242447 0.76242446899414063 0.5812910709209973 +4790 6 6.38086653 0.38086652755737305 0.1450593118136112 +4792 6 6.63710833 0.63710832595825195 0.40590701900532622 +4795 7 6.71729469 0.28270530700683594 0.079922290609829361 +4798 5 5.69227552 0.6922755241394043 0.47924540132248694 +4799 6 5.45217276 0.54782724380493164 0.30011468905490801 +4805 6 5.90260267 0.097397327423095703 0.0094862393891617103 +4806 6 5.250485 0.74951505661010742 0.56177282008525253 +4809 6 6.050518 0.050518035888671875 0.0025520719500491396 +4810 5 5.885007 0.88500690460205078 0.78323722119330341 +4814 6 6.350416 0.35041618347167969 0.12279150163885788 +4818 6 6.8706255 0.87062549591064453 0.75798875412965572 +4819 6 6.350416 0.35041618347167969 0.12279150163885788 +4820 5 5.317319 0.31731891632080078 0.10069129465500737 +4821 6 5.720231 0.27976894378662109 0.078270661907481553 +4823 7 6.112958 0.88704204559326172 0.7868435906502782 +4824 5 5.68046 0.68045997619628906 0.46302577920505428 +4825 6 5.996681 0.00331878662109375 1.101434463635087E-05 +4827 6 6.57971 0.57971000671386719 0.33606369188419194 +4831 6 5.615018 0.38498210906982422 0.14821122430385003 +4833 6 6.23332357 0.23332357406616211 0.054439890215007836 +4838 6 6.469409 0.46940898895263672 0.22034479890953662 +4840 7 6.805491 0.19450902938842773 0.037833762513628244 +4842 6 6.237228 0.2372279167175293 0.056277084470139016 +4843 5 6.383863 1.3838629722595215 1.9150767259909571 +4847 7 6.12764263 0.87235736846923828 0.76100737832257437 +4848 6 6.16121864 0.16121864318847656 0.02599145091153332 +4855 6 5.96981859 0.030181407928466797 0.00091091738454451843 +4857 6 5.92357826 0.076421737670898438 0.0058402819886396173 +4858 5 5.098244 0.098244190216064453 0.0096519209112102544 +4861 6 6.082398 0.082397937774658203 0.0067894201495164452 +4863 7 7.10627174 0.10627174377441406 0.011293683524854714 +4864 5 5.585732 0.58573198318481445 0.34308195612561576 +4865 6 6.84959269 0.84959268569946289 0.72180773159402634 +4868 6 6.06707 0.06707000732421875 0.0044983858824707568 +4870 7 6.40111876 0.59888124465942383 0.35865874520482066 +4873 6 6.464158 0.46415805816650391 0.21544270296089962 +4874 6 5.7968936 0.20310640335083008 0.04125221108211008 +4875 6 5.778002 0.22199821472167969 0.049283207339613 +4877 5 4.3623414 0.63765859603881836 0.40660848510219694 +4884 5 5.72053432 0.72053432464599609 0.51916971299306169 +4885 6 5.674971 0.32502889633178711 0.10564378345065961 +4890 6 6.390395 0.39039516448974609 0.15240838445697591 +4891 6 5.462591 0.53740882873535156 0.28880824920270243 +4892 5 6.01234436 1.0123443603515625 1.0248411039356142 +4893 6 6.095607 0.095606803894042969 0.0091406609508339898 +4895 6 5.20881939 0.79118061065673828 0.62596675867916929 +4897 6 5.75556135 0.24443864822387695 0.059750252745516264 +0 6 5.58289576 0.41710424423217773 0.17397595055649617 +1 6 5.33015347 0.66984653472900391 0.44869438008845464 +2 6 5.70412 0.29587984085083008 0.087544880221912535 +3 6 5.96136 0.038640022277832031 0.0014930513216313557 +4 6 5.96136 0.038640022277832031 0.0014930513216313557 +7 6 5.58289576 0.41710424423217773 0.17397595055649617 +12 5 6.31212759 1.3121275901794434 1.7216788129101133 +13 7 6.37878036 0.62121963500976563 0.38591383492166642 +14 5 5.109386 0.10938596725463867 0.011965289832232884 +15 7 6.31677771 0.68322229385375977 0.46679270281879326 +16 6 5.103471 0.89652919769287109 0.80376460231582314 +17 8 6.87536 1.1246399879455566 1.2648151024861818 +19 5 5.5723834 0.57238340377807617 0.32762276092057618 +22 8 6.29127455 1.7087254524230957 2.9197426717585131 +23 5 5.02370834 0.023708343505859375 0.0005620855517918244 +24 6 5.29549646 0.70450353622436523 0.4963252325526355 +26 6 6.15262365 0.15262365341186523 0.023293979580785162 +27 6 5.88923931 0.11076068878173828 0.012267930179405084 +29 7 6.59755468 0.40244531631469727 0.16196223262363674 +30 6 5.72036743 0.279632568359375 0.078194373287260532 +33 6 6.059624 0.059624195098876953 0.0035550446411889425 +34 5 5.379803 0.37980318069458008 0.14425045606571985 +36 5 5.22603941 0.22603940963745117 0.051093814709247454 +38 5 5.35056067 0.35056066513061523 0.12289277993681935 +39 5 5.35056067 0.35056066513061523 0.12289277993681935 +42 6 5.401128 0.59887218475341797 0.35864789367133199 +43 6 5.739065 0.26093482971191406 0.06808698535678559 +47 5 4.90973663 0.09026336669921875 0.0081474753678776324 +49 5 6.105748 1.105748176574707 1.2226790299982895 +53 6 6.438474 0.43847417831420898 0.19225960504832074 +55 6 5.841298 0.15870189666748047 0.025186292005855648 +57 6 5.543428 0.45657205581665039 0.20845804215264252 +58 6 5.454844 0.54515600204467773 0.29719506656533667 +59 6 6.401974 0.40197420120239258 0.16158325843230159 +61 6 5.543428 0.45657205581665039 0.20845804215264252 +62 5 5.132821 0.13282108306884766 0.01764144010758173 +65 5 5.030684 0.030683994293212891 0.00094150750578592124 +67 5 5.35860634 0.35860633850097656 0.12859850601307699 +75 5 5.270853 0.27085304260253906 0.07336137068705284 +78 5 5.718807 0.71880722045898438 0.51668382018397097 +80 6 6.57747 0.57746982574462891 0.33347139964553207 +81 6 6.31010628 0.31010627746582031 0.096165903323708335 +83 6 5.57204151 0.42795848846435547 0.18314846784869587 +84 5 5.23093128 0.23093128204345703 0.0533292570262347 +85 6 5.24266 0.7573399543762207 0.57356380649457606 +86 6 5.35685825 0.64314174652099609 0.41363130611807719 +87 6 5.65553427 0.34446573257446289 0.11865664091806138 +89 6 5.24266 0.7573399543762207 0.57356380649457606 +94 7 5.96693134 1.0330686569213867 1.0672308499133578 +101 5 5.630641 0.63064098358154297 0.39770805017269595 +103 5 5.20167637 0.20167636871337891 0.040673357697414758 +107 6 6.142988 0.14298820495605469 0.020445626756554702 +110 6 5.58482647 0.41517353057861328 0.17236906049311074 +114 5 5.187309 0.18730878829956055 0.03508458217424959 +116 6 6.17693758 0.17693758010864258 0.03130690725470231 +118 5 5.14454842 0.14454841613769531 0.020894244607916335 +119 5 5.04438543 0.044385433197021484 0.0019700666800872568 +124 6 5.616926 0.38307380676269531 0.14674554142766283 +126 5 5.909863 0.90986299514770508 0.82785066993915279 +127 7 6.253766 0.74623394012451172 0.55686509339375334 +130 5 4.510829 0.48917102813720703 0.23928829476881219 +134 5 5.024521 0.0245208740234375 0.00060127326287329197 +135 5 5.717012 0.71701192855834961 0.51410610569496384 +136 6 5.90298939 0.097010612487792969 0.0094110589352567331 +139 6 5.826573 0.17342710494995117 0.030076960731321378 +140 5 5.57194567 0.5719456672668457 0.32712184630531738 +142 6 6.106359 0.10635900497436523 0.011312237939137049 +143 6 5.740864 0.25913619995117188 0.06715157012513373 +146 6 5.35438347 0.64561653137207031 0.41682070558090345 +148 7 6.588247 0.41175317764282227 0.16954067929896155 +149 6 5.54737234 0.45262765884399414 0.20487179755059515 +153 5 6.004873 1.0048727989196777 1.0097693420086671 +155 6 6.044978 0.044978141784667969 0.0020230332384016947 +157 7 6.268512 0.73148822784423828 0.53507502747470426 +158 8 6.197546 1.8024539947509766 3.2488404031937534 +159 8 6.197546 1.8024539947509766 3.2488404031937534 +160 7 6.268512 0.73148822784423828 0.53507502747470426 +162 5 5.403021 0.40302085876464844 0.1624258125993947 +163 6 6.044978 0.044978141784667969 0.0020230332384016947 +165 5 5.61569548 0.61569547653198242 0.37908091982194492 +166 6 5.592527 0.40747308731079102 0.16603431688258752 +168 5 5.02263451 0.022634506225585938 0.00051232087207608856 +170 6 6.00712061 0.0071206092834472656 5.0703076567515382E-05 +172 4 4.794153 0.79415321350097656 0.63067932651392766 +175 6 6.07389736 0.073897361755371094 0.0054608200744041824 +178 4 4.40795135 0.40795135498046875 0.16642430803040043 +182 5 5.4483614 0.44836139678955078 0.201027942131077 +184 5 5.538105 0.53810501098632813 0.28955700284859631 +185 5 5.6508255 0.65082550048828125 0.42357383208582178 +186 6 5.94136524 0.058634757995605469 0.0034380348452032194 +190 6 5.13912439 0.86087560653686523 0.7411068099302156 +193 5 6.05295324 1.0529532432556152 1.1087105324825188 +194 5 5.24736834 0.24736833572387695 0.061191093518800699 +195 6 5.170604 0.82939577102661133 0.68789734499682709 +197 5 5.028246 0.028245925903320313 0.00079783233013586141 +200 5 5.404038 0.4040379524230957 0.16324666699824775 +203 6 6.53488255 0.53488254547119141 0.28609933744974114 +208 5 5.381865 0.38186502456665039 0.14582089698728851 +213 6 5.96111059 0.038889408111572266 0.0015123860632684227 +214 7 6.242515 0.75748491287231445 0.57378339322917782 +215 5 5.28750134 0.28750133514404297 0.082657017709607317 +217 5 5.28750134 0.28750133514404297 0.082657017709607317 +220 5 5.716736 0.71673583984375 0.51371026411652565 +221 6 5.08587837 0.91412162780761719 0.8356183504256478 +222 7 6.242515 0.75748491287231445 0.57378339322917782 +224 6 5.92879 0.071209907531738281 0.0050708509306787164 +225 5 5.738681 0.73868083953857422 0.54564938270141283 +227 6 5.37215567 0.62784433364868164 0.39418850729475707 +229 5 5.738681 0.73868083953857422 0.54564938270141283 +230 4 4.821786 0.82178592681884766 0.67533210951751244 +231 6 5.877407 0.12259292602539063 0.015029025511466898 +232 6 5.765742 0.23425817489624023 0.054876892505717478 +234 6 6.02762 0.027619838714599609 0.0007628554906204954 +235 6 6.02762 0.027619838714599609 0.0007628554906204954 +236 6 6.02762 0.027619838714599609 0.0007628554906204954 +238 7 6.67725468 0.32274532318115234 0.10416454363530647 +243 6 5.970998 0.029002189636230469 0.00084112700369587401 +245 6 5.6585145 0.34148550033569336 0.11661234693951883 +251 3 5.30328751 2.3032875061035156 5.3051333357725525 +253 3 5.191571 2.1915712356567383 4.8029844809580027 +255 8 5.873038 2.1269621849060059 4.5239681360201303 +256 7 6.39684772 0.60315227508544922 0.36379266694075341 +261 5 5.67542458 0.67542457580566406 0.45619835760226124 +263 6 5.66006374 0.33993625640869141 0.11555665842115559 +264 6 5.546553 0.45344686508178711 0.20561405945250044 +265 5 5.67542458 0.67542457580566406 0.45619835760226124 +266 6 5.002925 0.99707508087158203 0.99415871689507185 +270 6 5.002925 0.99707508087158203 0.99415871689507185 +273 5 5.215361 0.21536111831665039 0.046380411282598288 +274 5 5.734063 0.73406314849853516 0.53884870598358248 +281 8 6.663667 1.3363327980041504 1.7857853470216014 +282 4 5.0554595 1.0554594993591309 1.1139947547874272 +286 6 5.21452475 0.78547525405883789 0.61697137473879593 +287 7 6.53254032 0.46745967864990234 0.21851855116346997 +289 7 6.53254032 0.46745967864990234 0.21851855116346997 +292 5 5.402362 0.40236186981201172 0.16189507427861827 +294 3 4.562488 1.5624880790710449 2.4413689972391239 +295 6 5.045992 0.95400810241699219 0.91013145947727025 +298 6 5.77189255 0.22810745239257813 0.052033009837032296 +302 6 6.09933758 0.099337577819824219 0.0098679543671096326 +305 6 5.46788454 0.53211545944213867 0.28314686217731833 +306 5 5.295121 0.29512119293212891 0.087096518517682853 +307 6 5.46788454 0.53211545944213867 0.28314686217731833 +310 7 6.4347477 0.56525230407714844 0.31951016726452508 +313 6 5.421862 0.57813787460327148 0.33424340205078806 +315 6 5.478924 0.52107620239257813 0.27152040869987104 +318 7 6.748587 0.25141286849975586 0.063208430447275532 +320 7 5.75241947 1.2475805282592773 1.5564571744916975 +322 6 6.058367 0.058366775512695313 0.0034066804837493692 +324 5 4.546028 0.45397186279296875 0.20609045220771804 +325 5 4.917919 0.082080841064453125 0.0067372644698480144 +326 6 5.749149 0.25085115432739258 0.062926301627385328 +330 8 6.98020029 1.0197997093200684 1.0399914471292959 +334 5 6.214921 1.2149209976196289 1.4760330304570743 +335 6 6.24653053 0.24653053283691406 0.060777303620852763 +337 6 5.20219231 0.79780769348144531 0.6364971157781838 +339 7 6.743009 0.25699090957641602 0.066044327604913633 +340 7 5.70599937 1.2940006256103516 1.6744376190799812 +341 6 5.213163 0.78683710098266602 0.61911262348280616 +342 6 5.38700151 0.61299848556518555 0.37576714330521099 +345 6 5.97763968 0.022360324859619141 0.00049998412782770174 +351 7 6.794541 0.2054591178894043 0.042213449123892133 +356 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +357 6 5.097309 0.90269088745117188 0.81485083828738425 +359 6 5.955685 0.044314861297607422 0.0019638069318261842 +362 6 6.04658127 0.046581268310546875 0.0021698145574191585 +363 6 6.00004244 4.2438507080078125E-05 1.8010268831858411E-09 +364 7 6.6094327 0.39056730270385742 0.15254281794136659 +365 7 6.87111664 0.12888336181640625 0.016610920953098685 +367 6 5.37173843 0.62826156616210938 0.39471259551646654 +369 5 5.892208 0.89220809936523438 0.79603529257292394 +372 5 4.765526 0.23447418212890625 0.054978142085019499 +374 7 6.53566933 0.46433067321777344 0.2156029740908707 +375 7 6.53566933 0.46433067321777344 0.2156029740908707 +380 7 5.85971642 1.1402835845947266 1.3002466532961989 +382 6 5.252193 0.74780702590942383 0.55921534799949768 +385 7 6.53566933 0.46433067321777344 0.2156029740908707 +386 7 6.42074728 0.57925271987915039 0.33553371348739347 +390 7 5.82244158 1.177558422088623 1.3866438374318477 +393 6 6.1026063 0.10260629653930664 0.01052805208951213 +394 5 5.14353275 0.14353275299072266 0.020601651181095804 +397 6 6.52884865 0.52884864807128906 0.27968089256683015 +400 6 6.52884865 0.52884864807128906 0.27968089256683015 +401 5 5.14353275 0.14353275299072266 0.020601651181095804 +402 5 4.94096375 0.0590362548828125 0.0034852793905884027 +403 5 5.666886 0.6668858528137207 0.44473674068308355 +405 5 5.10803747 0.10803747177124023 0.011672095306721531 +407 5 5.069229 0.0692291259765625 0.0047926718834787607 +408 6 6.01091671 0.010916709899902344 0.00011917455503862584 +410 6 5.872228 0.12777185440063477 0.01632564677697701 +411 6 5.823905 0.17609500885009766 0.031009452141915972 +412 5 5.69728041 0.6972804069519043 0.48619996591901327 +417 5 5.06454945 0.064549446105957031 0.0041666309925858513 +420 7 6.685552 0.31444787979125977 0.098877469105218552 +421 6 5.986877 0.013123035430908203 0.00017221405892087205 +424 7 5.922215 1.0777850151062012 1.1616205387874743 +425 6 5.986877 0.013123035430908203 0.00017221405892087205 +426 6 5.986877 0.013123035430908203 0.00017221405892087205 +427 5 5.250166 0.25016593933105469 0.062582997201388935 +431 5 4.95284557 0.047154426574707031 0.0022235399455894367 +432 7 6.270196 0.72980403900146484 0.53261393534285162 +433 4 5.13603973 1.1360397338867188 1.2905862769694068 +435 7 6.93598032 0.064019680023193359 0.0040985194302720629 +437 8 6.529011 1.4709892272949219 2.1638093068177113 +438 7 6.270196 0.72980403900146484 0.53261393534285162 +443 6 5.58504343 0.41495656967163086 0.17218895471364704 +444 6 5.70104074 0.29895925521850586 0.089376636280803723 +445 3 5.536319 2.5363187789916992 6.432912948665944 +446 5 6.67247 1.6724700927734375 2.7971562112215906 +447 6 5.70106936 0.29893064498901367 0.089359530513547725 +448 6 5.70106936 0.29893064498901367 0.089359530513547725 +458 6 5.050184 0.94981622695922852 0.90215086499506469 +459 5 4.837731 0.16226911544799805 0.026331265828275718 +460 5 5.73105049 0.73105049133300781 0.53443482087823213 +461 5 5.95119953 0.95119953155517578 0.90478054883078585 +462 5 5.154207 0.15420722961425781 0.023779869665304432 +463 6 5.12796068 0.8720393180847168 0.76045257228565788 +468 5 5.164256 0.16425609588623047 0.026980065035786538 +469 5 5.38181925 0.38181924819946289 0.14578593829560305 +470 6 5.00187445 0.99812555313110352 0.99625461981327135 +471 5 5.26753426 0.26753425598144531 0.071574578123545507 +472 6 6.08648539 0.086485385894775391 0.0074797219733682141 +473 7 6.078559 0.92144107818603516 0.84905366056864295 +475 5 6.01866531 1.0186653137207031 1.0376790213776985 +476 7 6.40013742 0.59986257553100586 0.35983510952269171 +477 6 6.20083 0.20082998275756836 0.040332681974405205 +478 6 5.15129375 0.84870624542236328 0.72030229101892473 +479 6 6.16166544 0.16166543960571289 0.026135714362908402 +481 6 6.04767036 0.047670364379882813 0.0022724636401108 +485 6 6.47117424 0.47117424011230469 0.22200516454540775 +486 6 5.911162 0.088838100433349609 0.0078922080886059121 +488 6 5.887391 0.11260890960693359 0.012680766522862541 +490 6 6.33496237 0.33496236801147461 0.11219978798385455 +491 7 6.21005774 0.78994226455688477 0.62400878133325932 +494 6 6.653475 0.65347480773925781 0.42702932434985996 +496 4 5.23894358 1.2389435768127441 1.534981186525556 +498 5 5.103715 0.10371494293212891 0.010756789387414756 +499 4 5.23894358 1.2389435768127441 1.534981186525556 +500 6 5.311577 0.68842315673828125 0.47392644273350015 +503 5 5.137176 0.1371760368347168 0.018817265081679579 +505 6 6.13015556 0.13015556335449219 0.01694047067212523 +506 5 4.47576427 0.52423572540283203 0.27482309578863351 +508 6 6.28651571 0.28651571273803711 0.0820912536457854 +509 7 5.931798 1.068202018737793 1.1410555528354962 +511 6 5.925795 0.074204921722412109 0.0055063704078293085 +512 6 6.149516 0.14951610565185547 0.022355065849296807 +515 6 5.6218214 0.37817859649658203 0.14301905084812461 +516 5 6.00719738 1.007197380065918 1.0144465624116492 +518 6 6.805467 0.80546712875366211 0.64877729550266849 +524 5 4.9252224 0.074777603149414063 0.0055916899327712599 +525 6 5.24856 0.75144004821777344 0.56466214606552967 +526 4 6.14279747 2.1427974700927734 4.5915809978359903 +530 6 6.371907 0.37190723419189453 0.13831499084426468 +536 5 5.10018253 0.10018253326416016 0.010036539971224556 +537 6 5.88101053 0.11898946762084961 0.014158493404693218 +542 6 4.932093 1.0679068565368652 1.1404250542384489 +543 6 6.03408527 0.034085273742675781 0.0011618058861131431 +545 6 6.42284536 0.42284536361694336 0.17879820153234505 +550 7 5.2345643 1.7654356956481934 3.1167631954688204 +551 7 5.86865425 1.1313457489013672 1.2799432035571954 +552 7 6.50745964 0.49254035949707031 0.24259600573350326 +553 7 5.2345643 1.7654356956481934 3.1167631954688204 +554 7 6.50745964 0.49254035949707031 0.24259600573350326 +555 7 5.86865425 1.1313457489013672 1.2799432035571954 +556 5 4.872683 0.12731695175170898 0.016209606203346993 +562 6 5.048077 0.95192289352416992 0.90615719521542815 +564 5 5.479501 0.47950077056884766 0.22992098897611868 +567 5 5.58539 0.58539009094238281 0.34268155857353122 +568 6 5.553329 0.4466710090637207 0.19951499033800246 +570 5 5.11044836 0.11044836044311523 0.012198840324572302 +571 7 6.777907 0.22209310531616211 0.049325347428975874 +572 5 5.358643 0.3586430549621582 0.12862484087258963 +573 7 6.902201 0.097798824310302734 0.0095646100364774611 +574 7 6.177025 0.82297515869140625 0.6772881118231453 +575 6 5.791957 0.20804309844970703 0.043281930812554492 +576 6 5.791957 0.20804309844970703 0.043281930812554492 +579 7 6.542046 0.45795392990112305 0.20972180191188272 +580 5 5.11044836 0.11044836044311523 0.012198840324572302 +583 6 5.35542774 0.64457225799560547 0.41547339577755338 +585 6 5.35542774 0.64457225799560547 0.41547339577755338 +587 7 6.5687685 0.43123149871826172 0.18596060548679816 +588 7 7.028516 0.028515815734863281 0.0008131517470246763 +589 6 5.828428 0.17157220840454102 0.029437022696811255 +591 6 6.46318531 0.46318531036376953 0.21454063173678151 +592 5 5.396524 0.39652395248413086 0.15723124489363727 +595 7 5.208214 1.7917861938476563 3.2104977644630708 +596 5 5.396524 0.39652395248413086 0.15723124489363727 +597 6 6.225943 0.22594308853149414 0.051050279255150599 +598 8 6.305187 1.6948127746582031 2.8723903411446372 +599 7 5.93457365 1.0654263496398926 1.1351333065069866 +601 6 6.00369453 0.0036945343017578125 1.3649583706865087E-05 +603 5 4.94606066 0.053939342498779297 0.0029094526692006184 +605 6 5.596465 0.40353488922119141 0.16284040681875922 +608 5 5.19934368 0.19934368133544922 0.039737903288369125 +610 8 7.12691069 0.87308931350708008 0.76228494936026436 +611 6 5.7924037 0.2075963020324707 0.0430962246175568 +615 5 5.39173031 0.39173030853271484 0.15345263462313596 +616 7 6.271933 0.72806692123413086 0.53008144179534611 +620 5 5.06031942 0.060319423675537109 0.0036384328725489468 +623 5 5.17006063 0.17006063461303711 0.028920619444988915 +625 8 6.47763872 1.5223612785339355 2.3175838623794789 +626 4 4.67777538 0.67777538299560547 0.45937946979483968 +628 6 5.57972527 0.42027473449707031 0.17663085245658294 +630 5 6.085581 1.0855808258056641 1.1784857293569075 +631 5 6.085581 1.0855808258056641 1.1784857293569075 +632 6 6.34318829 0.34318828582763672 0.11777819952931168 +635 6 5.886408 0.11359214782714844 0.012903176047984743 +636 7 6.597964 0.40203619003295898 0.16163309809621751 +637 5 5.137594 0.13759422302246094 0.018932170209154719 +640 7 6.2694006 0.73059940338134766 0.53377548822118115 +643 5 5.46275139 0.46275138854980469 0.21413884760477231 +646 4 4.810526 0.81052589416503906 0.6569522251120361 +647 6 5.254026 0.74597406387329102 0.55647730397163286 +648 5 5.21467161 0.21467161178588867 0.046083900906751296 +650 7 6.55360842 0.44639158248901367 0.1992654449170459 +651 7 6.55360842 0.44639158248901367 0.1992654449170459 +655 6 6.979067 0.97906684875488281 0.95857189433081658 +658 5 5.783849 0.78384876251220703 0.61441888249191834 +659 4 4.837211 0.83721113204956055 0.70092247962770671 +662 4 4.75797558 0.75797557830810547 0.57452697731150693 +663 5 5.03337 0.033370018005371094 0.001113558101678791 +664 6 5.933576 0.066423892974853516 0.0044121335579347942 +666 6 6.59370661 0.59370660781860352 0.35248753616747308 +667 6 5.933576 0.066423892974853516 0.0044121335579347942 +669 5 5.512285 0.51228523254394531 0.26243615948260413 +671 6 6.38181257 0.38181257247924805 0.14578084050322104 +672 8 6.718115 1.2818851470947266 1.6432295303420688 +673 6 6.24267769 0.24267768859863281 0.058892460543574998 +674 5 5.43839359 0.43839359283447266 0.1921889422383174 +675 6 4.94588137 1.0541186332702637 1.1111660930075686 +676 6 4.91327667 1.0867233276367188 1.1809675908298232 +677 7 6.845388 0.15461206436157227 0.023904890446146965 +684 5 5.50572443 0.50572443008422852 0.25575719918401774 +686 7 6.338226 0.6617741584777832 0.43794503682897812 +687 4 4.83409 0.83409023284912109 0.69570651653430104 +690 4 6.03202963 2.0320296287536621 4.1291444121327459 +695 5 5.266163 0.26616287231445313 0.070842674598679878 +699 5 5.75083971 0.7508397102355957 0.56376027046667332 +701 7 7.302115 0.30211496353149414 0.091273451189636035 +703 6 5.64697838 0.35302162170410156 0.12462426539059379 +708 6 6.142319 0.1423192024230957 0.02025475537834609 +709 5 5.07981443 0.079814434051513672 0.0063703438829634251 +710 5 5.186609 0.18660879135131836 0.03482284100959987 +713 5 5.75211859 0.75211858749389648 0.56568236965381402 +715 7 6.74210548 0.25789451599121094 0.066509581378340954 +716 6 5.201803 0.79819679260253906 0.63711811972098076 +717 5 5.72647953 0.72647953033447266 0.52777250799499598 +730 6 6.32876348 0.32876348495483398 0.10808542903964735 +731 6 5.886897 0.11310291290283203 0.012792268907105608 +733 6 5.84083 0.15917015075683594 0.02533513689195388 +734 5 5.29676867 0.2967686653137207 0.088071640712087174 +736 6 5.84083 0.15917015075683594 0.02533513689195388 +737 5 5.29676867 0.2967686653137207 0.088071640712087174 +739 6 5.71197033 0.28802967071533203 0.082961091212382598 +740 3 5.478546 2.478546142578125 6.1431909808889031 +741 6 6.318698 0.31869792938232422 0.10156837019258091 +742 6 6.342546 0.34254598617553711 0.11733775264497126 +743 5 5.46122837 0.46122837066650391 0.21273160990767792 +744 5 5.2266674 0.22666740417480469 0.051378112115344265 +745 6 7.068423 1.068422794342041 1.1415272674696553 +746 6 5.776893 0.22310686111450195 0.049776671476365664 +747 6 6.22603226 0.22603225708007813 0.051090581240714528 +748 6 6.02232647 0.022326469421386719 0.0004984712368241162 +750 6 6.22603226 0.22603225708007813 0.051090581240714528 +751 6 5.94263268 0.057367324829101563 0.0032910099580476526 +753 6 5.776893 0.22310686111450195 0.049776671476365664 +754 5 4.951338 0.048662185668945313 0.0023680083140789066 +755 7 6.66953325 0.33046674728393555 0.10920827106042452 +756 5 5.26670647 0.26670646667480469 0.071132339366158703 +759 7 6.447287 0.55271291732788086 0.30549156898109686 +762 5 5.25446272 0.25446271896362305 0.064751275342359804 +763 6 5.75677967 0.24322032928466797 0.059156128577342315 +766 5 5.064814 0.064814090728759766 0.0042008663569959026 +767 6 5.377497 0.62250280380249023 0.38750974074196165 +768 7 5.636545 1.3634548187255859 1.8590090427060204 +769 7 5.636545 1.3634548187255859 1.8590090427060204 +771 7 5.73526955 1.2647304534912109 1.5995431199880841 +772 7 5.55488348 1.4451165199279785 2.0883617561687515 +775 6 6.36388731 0.36388731002807617 0.13241397439946923 +776 6 5.966575 0.033424854278564453 0.0011172208835432684 +777 5 5.746976 0.74697589874267578 0.55797299330242822 +787 6 5.64129162 0.35870838165283203 0.1286717030679938 +789 6 5.627616 0.37238407135009766 0.13866989659527462 +790 6 5.64129162 0.35870838165283203 0.1286717030679938 +791 7 6.673766 0.32623386383056641 0.10642853390982054 +793 7 6.673766 0.32623386383056641 0.10642853390982054 +796 6 5.34205 0.65794992446899414 0.43289810310875509 +797 6 5.96610975 0.033890247344970703 0.0011485488651032938 +798 6 5.429145 0.57085514068603516 0.32587559164767299 +800 6 5.14655 0.85344982147216797 0.72837659777087538 +801 5 5.268791 0.26879119873046875 0.072248708514962345 +803 7 5.87979031 1.1202096939086914 1.2548697583270041 +804 6 5.493222 0.50677776336669922 0.25682370144295419 +805 6 5.14655 0.85344982147216797 0.72837659777087538 +807 6 5.285724 0.71427583694458008 0.51018997124288035 +808 6 5.1317997 0.86820030212402344 0.75377176460824558 +809 6 5.285931 0.71406888961791992 0.50989437912016911 +811 6 5.13246775 0.86753225326538086 0.75261221045570892 +812 7 4.98973751 2.0102624893188477 4.0411552759624101 +813 6 5.52920055 0.47079944610595703 0.22165211845367594 +814 6 4.9766 1.023399829864502 1.0473472117666915 +815 5 5.0497756 0.049775600433349609 0.0024776103985004738 +818 5 5.0497756 0.049775600433349609 0.0024776103985004738 +820 9 6.84990168 2.1500983238220215 4.6229228021022664 +822 5 6.04735231 1.0473523139953613 1.0969468696314379 +823 6 6.01296329 0.012963294982910156 0.00016804701681394363 +824 5 5.36770439 0.36770439147949219 0.13520651951330365 +825 6 5.936046 0.063953876495361328 0.0040900983187839302 +828 7 6.322937 0.67706298828125 0.45841429010033607 +830 6 5.498639 0.50136089324951172 0.25136274527994829 +831 4 6.24087048 2.240870475769043 5.021500489173377 +832 8 7.105262 0.89473819732666016 0.80055644175536145 +833 6 6.312468 0.31246805191040039 0.097636283464680673 +834 6 5.498639 0.50136089324951172 0.25136274527994829 +835 8 6.844221 1.1557788848876953 1.3358248307522445 +837 8 7.18123341 0.81876659393310547 0.67037873534081882 +839 7 6.57121944 0.42878055572509766 0.18385276496792358 +842 7 6.47577953 0.52422046661376953 0.27480709761675826 +843 7 6.238966 0.76103401184082031 0.57917276717853383 +844 8 6.69551563 1.3044843673706055 1.7016794647142888 +846 5 5.71414852 0.71414852142333984 0.51000811065114249 +847 5 5.787212 0.78721189498901367 0.61970256761219389 +849 6 6.185082 0.18508195877075195 0.034255331462418326 +852 7 6.56788826 0.43211174011230469 0.18672055594288395 +853 5 5.15344524 0.15344524383544922 0.023545442855720466 +857 5 5.152636 0.15263605117797852 0.023297764119206477 +865 6 6.67667437 0.67667436599731445 0.45788819759786747 +866 7 6.56788826 0.43211174011230469 0.18672055594288395 +867 8 6.099201 1.9007987976074219 3.6130360689858207 +868 7 5.922011 1.0779891014099121 1.1620605027585498 +869 6 6.14752531 0.14752531051635742 0.021763717242947678 +873 3 5.358975 2.3589749336242676 5.5647627374676176 +875 7 5.889844 1.1101560592651367 1.2324464759230978 +877 6 5.43060732 0.56939268112182617 0.32420802531510162 +878 6 5.736863 0.26313686370849609 0.069241009042343649 +879 8 6.83100033 1.1689996719360352 1.3665602329865578 +880 7 5.889844 1.1101560592651367 1.2324464759230978 +882 6 6.42099428 0.42099428176879883 0.17723618528202678 +883 6 6.42099428 0.42099428176879883 0.17723618528202678 +884 6 6.170308 0.17030811309814453 0.029004853387050389 +886 6 5.88422441 0.11577558517456055 0.013403986122511924 +889 7 7.024262 0.024261951446533203 0.00058864228799393459 +891 7 6.097072 0.90292787551879883 0.81527874838889147 +892 5 6.012046 1.0120458602905273 1.0242368233311936 +893 7 6.14825344 0.85174655914306641 0.72547220101205312 +894 7 6.097072 0.90292787551879883 0.81527874838889147 +897 6 5.666549 0.3334507942199707 0.11118943216592925 +899 6 6.04876375 0.048763751983642578 0.0023779035075222055 +901 6 5.33798742 0.66201257705688477 0.43826065218149779 +903 6 5.26283264 0.7371673583984375 0.5434157142881304 +905 4 5.24363136 1.2436313629150391 1.5466189668259176 +907 8 6.86781025 1.1321897506713867 1.2818536315253368 +909 5 6.248672 1.2486720085144043 1.5591817848473966 +911 5 5.25836658 0.25836658477783203 0.066753292129760666 +913 5 4.977968 0.022031784057617188 0.00048539950876147486 +915 5 4.99300337 0.0069966316223144531 4.8952854058370576E-05 +916 7 6.15890551 0.8410944938659668 0.70743994761164686 +917 6 5.846199 0.15380096435546875 0.023654736636672169 +922 6 5.560354 0.43964576721191406 0.19328840062735253 +923 6 5.761621 0.23837900161743164 0.056824548412123477 +928 5 5.72981834 0.72981834411621094 0.53263481540852808 +929 5 5.295482 0.29548215866088867 0.087309706086898586 +931 5 5.389781 0.38978099822998047 0.15192922658116004 +932 6 5.69497633 0.3050236701965332 0.093039439380163458 +933 5 5.538747 0.53874683380126953 0.29024815093089273 +939 7 5.803188 1.1968121528625488 1.4323593292394889 +941 6 5.732951 0.26704883575439453 0.071315080677777587 +942 7 5.749693 1.2503070831298828 1.5632678021247557 +943 7 6.44949245 0.55050754547119141 0.30305855762071587 +945 7 6.4388504 0.56114959716796875 0.3148888704017736 +946 5 5.1143384 0.11433839797973633 0.013073269252572572 +947 5 5.71162844 0.71162843704223633 0.50641503240717611 +948 4 4.53004 0.53003978729248047 0.28094217611305794 +949 5 5.905949 0.90594911575317383 0.82074380033395755 +951 6 5.823733 0.17626714706420898 0.031070107134155478 +952 6 6.14641857 0.14641857147216797 0.02143839807195036 +954 6 5.823733 0.17626714706420898 0.031070107134155478 +957 7 6.496833 0.50316715240478516 0.25317718325914029 +961 7 7.02436543 0.024365425109863281 0.00059367394078435609 +962 6 5.981644 0.018355846405029297 0.00033693709724502696 +963 6 6.624413 0.62441301345825195 0.38989161137601513 +966 6 5.28590059 0.71409940719604492 0.50993796335774277 +967 6 5.76070356 0.23929643630981445 0.057262784430577085 +973 7 6.95576334 0.044236660003662109 0.001956882088279599 +975 5 5.028304 0.028304100036621094 0.0008011220788830542 +977 5 6.259195 1.2591948509216309 1.5855716725875482 +978 7 6.75888824 0.24111175537109375 0.058134878578130156 +979 5 5.79845238 0.79845237731933594 0.63752619884689921 +981 7 6.75888824 0.24111175537109375 0.058134878578130156 +984 5 6.57471 1.5747098922729492 2.4797112448222833 +987 6 5.45699358 0.54300642013549805 0.29485597230836902 +988 5 6.57471 1.5747098922729492 2.4797112448222833 +990 6 5.941643 0.058356761932373047 0.003405511663231664 +991 4 4.65947 0.6594700813293457 0.43490078816853384 +993 4 5.050729 1.0507287979125977 1.1040310067628525 +996 5 4.98931551 0.010684490203857422 0.00011415833091632521 +1000 7 5.531526 1.4684739112854004 2.156415628125842 +1001 5 5.625949 0.62594890594482422 0.3918120328535224 +1003 7 5.821002 1.1789979934692383 1.39003626860449 +1005 6 6.94355631 0.94355630874633789 0.89029850777501451 +1008 7 5.755313 1.2446870803833008 1.5492459280731055 +1009 6 5.539026 0.46097421646118164 0.21249722824200035 +1010 6 5.8711915 0.12880849838256836 0.016591629255572116 +1011 7 6.22115 0.77885007858276367 0.60660744490837715 +1012 6 5.37709761 0.62290239334106445 0.38800739163002618 +1013 5 5.706299 0.706298828125 0.49885803461074829 +1014 5 6.018917 1.0189170837402344 1.0381920235377038 +1019 6 5.86288 0.13711977005004883 0.018801831338578268 +1020 7 6.04661751 0.95338249206542969 0.9089381761768891 +1022 8 6.47417259 1.5258274078369141 2.3281492785063165 +1023 6 5.778368 0.22163200378417969 0.049120745101390639 +1024 6 6.23468876 0.23468875885009766 0.055078813530599291 +1028 7 6.22779942 0.77220058441162109 0.59629374256564915 +1029 4 5.16414261 1.1641426086425781 1.3552280132571468 +1031 6 5.641769 0.3582310676574707 0.12832949783501135 +1035 6 6.0397377 0.039737701416015625 0.0015790849138284102 +1036 5 6.4997263 1.4997262954711914 2.2491789613277433 +1038 7 6.298605 0.70139503479003906 0.49195499482812011 +1041 5 5.75377655 0.75377655029296875 0.56817908777156845 +1042 4 5.44314528 1.4431452751159668 2.0826682850895395 +1043 5 5.344182 0.34418201446533203 0.11846125908141403 +1046 5 5.74131536 0.74131536483764648 0.54954847014437291 +1048 5 4.73738956 0.26261043548583984 0.068964240826062451 +1050 5 5.55853367 0.55853366851806641 0.31195985886824928 +1055 5 5.41344547 0.41344547271728516 0.17093715891041938 +1056 6 6.15539265 0.15539264678955078 0.024146874676262087 +1057 5 5.06872654 0.068726539611816406 0.0047233372470145696 +1062 5 5.54800034 0.54800033569335938 0.30030436792003457 +1063 5 5.465916 0.46591615676879883 0.21707786513820793 +1066 6 5.303662 0.69633817672729492 0.48488685636789342 +1067 7 6.23767567 0.76232433319091797 0.58113838897497772 +1070 7 5.98001146 1.0199885368347168 1.0403766152742264 +1073 5 5.61771059 0.61771059036254883 0.3815663734460486 +1078 5 5.622996 0.62299585342407227 0.38812383338358813 +1081 6 5.522897 0.47710323333740234 0.22762749526100379 +1087 8 6.06489849 1.9351015090942383 3.7446178504987984 +1089 7 5.919071 1.0809288024902344 1.1684070760529721 +1093 7 5.85336637 1.1466336250305176 1.3147686700506256 +1096 6 6.022913 0.022912979125976563 0.00052500461242743768 +1097 7 6.048806 0.95119380950927734 0.90476966324877139 +1102 5 6.4617486 1.4617486000061035 2.1367089696198036 +1104 5 5.21519136 0.21519136428833008 0.046307323264272782 +1105 7 6.68964672 0.31035327911376953 0.096319157856669335 +1106 8 7.11303139 0.88696861267089844 0.78671331986333826 +1107 7 6.73190355 0.2680964469909668 0.07187570488918027 +1108 7 6.457533 0.54246711730957031 0.29427057336215512 +1109 4 5.380625 1.3806247711181641 1.9061247586250829 +1110 7 6.73190355 0.2680964469909668 0.07187570488918027 +1111 6 6.65884066 0.65884065628051758 0.43407101036814311 +1113 5 6.05984068 1.0598406791687012 1.1232622652207738 +1114 4 4.139369 0.13936901092529297 0.019423721206294431 +1115 8 5.95124435 2.0487556457519531 4.1973996960005024 +1116 5 4.5486455 0.4513545036315918 0.20372088794852061 +1117 5 5.65911961 0.65911960601806641 0.43443865503741108 +1118 5 4.5486455 0.4513545036315918 0.20372088794852061 +1120 6 6.233022 0.23302221298217773 0.054299351743111401 +1121 6 5.3402257 0.6597743034362793 0.43530213147482755 +1123 5 5.054469 0.054469108581542969 0.0029668837896679179 +1124 5 5.44738436 0.44738435745239258 0.20015276329309017 +1127 7 6.207802 0.79219818115234375 0.62757795822108164 +1128 5 5.9157033 0.91570329666137695 0.83851252751651373 +1131 6 5.68809128 0.31190872192382813 0.09728705081215594 +1132 5 5.68820238 0.6882023811340332 0.4736225173985531 +1139 5 6.475313 1.4753131866455078 2.176548998690123 +1142 5 5.302902 0.3029022216796875 0.091749755898490548 +1145 5 5.27104568 0.27104568481445313 0.073465763256535865 +1149 5 5.626558 0.62655782699584961 0.39257471056976101 +1150 5 5.44962835 0.44962835311889648 0.20216565592841107 +1152 4 4.617794 0.61779403686523438 0.38166947198624257 +1154 4 5.561507 1.5615072250366211 2.4383048138415688 +1156 6 5.28412676 0.71587324142456055 0.51247449778770715 +1157 6 5.28412676 0.71587324142456055 0.51247449778770715 +1160 6 6.12439537 0.12439537048339844 0.015474208197701955 +1161 6 5.28412676 0.71587324142456055 0.51247449778770715 +1162 7 5.895931 1.1040692329406738 1.2189688711262079 +1163 6 5.38675928 0.61324071884155273 0.37606417924530433 +1167 6 5.6267643 0.37323570251464844 0.13930488963160315 +1171 5 4.62260342 0.37739658355712891 0.14242818128059298 +1172 6 6.08686447 0.086864471435546875 0.007545436397776939 +1173 5 6.14243841 1.1424384117126465 1.3051655245565144 +1176 7 5.70132732 1.2986726760864258 1.6865507196134786 +1178 5 4.72919655 0.27080345153808594 0.073334509364940459 +1179 5 5.89185 0.89184999465942383 0.79539641297401431 +1180 5 4.62260342 0.37739658355712891 0.14242818128059298 +1183 6 6.31216526 0.31216526031494141 0.097447149747495132 +1185 5 5.091198 0.091197967529296875 0.0083170692814746872 +1188 6 5.85175133 0.14824867248535156 0.021977668893669033 +1189 5 4.64966965 0.35033035278320313 0.12273135608120356 +1190 6 6.08686447 0.086864471435546875 0.007545436397776939 +1192 6 5.676918 0.32308197021484375 0.10438195947790518 +1193 7 5.63304329 1.3669567108154297 1.8685706492433383 +1194 6 5.49325037 0.50674962997436523 0.25679518747915608 +1196 7 6.384342 0.61565780639648438 0.37903453457693104 +1197 7 5.63304329 1.3669567108154297 1.8685706492433383 +1203 6 5.79636669 0.20363330841064453 0.041466524294264673 +1205 5 4.809882 0.19011783599853516 0.03614479156476591 +1209 6 6.37570572 0.37570571899414063 0.14115478728490416 +1211 5 5.21409225 0.21409225463867188 0.045835493496269919 +1215 5 5.92623568 0.92623567581176758 0.85791252714648181 +1217 5 4.785647 0.21435308456420898 0.045947244862190928 +1219 8 6.444028 1.5559720993041992 2.4210491738131168 +1222 6 5.445072 0.55492782592773438 0.30794489198888186 +1223 5 5.92623568 0.92623567581176758 0.85791252714648181 +1224 7 6.926713 0.073287010192871094 0.0053709858630099916 +1225 6 6.43942976 0.43942975997924805 0.19309851395541955 +1226 7 6.926713 0.073287010192871094 0.0053709858630099916 +1227 5 5.9939723 0.9939723014831543 0.98798093611571858 +1228 6 5.81761837 0.18238162994384766 0.033263058940974588 +1230 6 5.57155275 0.42844724655151367 0.18356704307757354 +1235 5 5.28322 0.28321981430053711 0.080213463212430725 +1236 6 6.43942976 0.43942975997924805 0.19309851395541955 +1237 5 6.46537447 1.4653744697570801 2.1473223366158436 +1239 5 4.89298248 0.10701751708984375 0.011452748964074999 +1241 7 6.052218 0.94778203964233398 0.89829079466858275 +1242 7 6.815272 0.18472814559936523 0.034124487776580281 +1244 5 5.30364943 0.3036494255065918 0.092202973610483241 +1245 4 4.78280544 0.78280544281005859 0.61278436129305192 +1247 6 6.118482 0.11848211288452148 0.014038011073580492 +1250 7 5.700158 1.2998418807983398 1.6895889150773655 +1252 6 5.364317 0.63568305969238281 0.40409295237986953 +1256 6 5.792476 0.20752382278442383 0.043066137023060946 +1258 6 5.448007 0.55199289321899414 0.30469615416427587 +1262 6 5.792476 0.20752382278442383 0.043066137023060946 +1264 5 5.94851971 0.94851970672607422 0.89968963404771785 +1267 7 5.84828329 1.1517167091369629 1.3264513781052756 +1270 7 5.84828329 1.1517167091369629 1.3264513781052756 +1271 5 5.750962 0.7509617805480957 0.56394359584396625 +1272 5 5.325394 0.3253941535949707 0.10588135519378739 +1273 5 5.750962 0.7509617805480957 0.56394359584396625 +1275 6 5.57314968 0.42685031890869141 0.18220119475245156 +1276 7 5.84828329 1.1517167091369629 1.3264513781052756 +1278 6 5.582913 0.41708707809448242 0.17396163071339288 +1279 6 5.870985 0.12901496887207031 0.016644862193061272 +1283 8 7.097483 0.90251684188842773 0.81453664989226127 +1284 7 6.70399857 0.29600143432617188 0.087616849123151042 +1286 7 5.92860174 1.0713982582092285 1.1478942276937687 +1287 7 6.18289757 0.81710243225097656 0.66765638479046174 +1288 7 6.390159 0.60984086990356445 0.37190588660473622 +1289 6 6.822798 0.82279777526855469 0.67699617898688302 +1292 6 6.85950375 0.85950374603271484 0.73874668944426958 +1294 4 5.04547739 1.0454773902893066 1.0930229736061392 +1295 6 5.91815662 0.081843376159667969 0.0066983382212129072 +1298 6 6.40000439 0.40000438690185547 0.16000350954072928 +1299 5 5.940148 0.94014787673950195 0.88387803013779376 +1303 6 5.843109 0.156890869140625 0.024614744819700718 +1304 5 5.16638374 0.16638374328613281 0.027683550029905746 +1305 7 5.97077465 1.0292253494262695 1.0593048199016266 +1307 5 5.20232058 0.20232057571411133 0.040933615357289455 +1309 6 5.4209795 0.57902050018310547 0.33526473963229364 +1310 6 5.561529 0.43847084045410156 0.19225667792852619 +1311 6 5.60187 0.39812994003295898 0.15850744915064752 +1312 5 5.23645258 0.23645257949829102 0.055909822351395633 +1315 6 5.977113 0.022887229919433594 0.00052382529338501627 +1316 6 5.794509 0.20549106597900391 0.042226578197187337 +1317 5 6.033325 1.0333251953125 1.0677609592676163 +1318 6 6.41278648 0.41278648376464844 0.17039268117878237 +1319 5 5.517551 0.51755094528198242 0.26785898096227356 +1321 6 6.57573557 0.57573556900024414 0.33147144541203488 +1322 6 6.117485 0.11748504638671875 0.013802736124489456 +1326 6 5.27129364 0.72870635986328125 0.53101295890519395 +1329 5 5.212231 0.21223115921020508 0.045042064939707416 +1332 7 5.65819645 1.3418035507202148 1.8004367687253762 +1333 8 7.320398 0.67960214614868164 0.46185907704989404 +1335 6 5.220176 0.77982378005981445 0.60812512794677787 +1339 6 5.988458 0.011541843414306641 0.00013321414940037357 +1342 6 5.988458 0.011541843414306641 0.00013321414940037357 +1343 6 6.080612 0.0806121826171875 0.0064983239863067865 +1347 7 6.320307 0.67969322204589844 0.461982876095135 +1349 4 5.433452 1.4334521293640137 2.054785007178225 +1351 7 6.73481274 0.26518726348876953 0.070324284716662078 +1352 6 5.220176 0.77982378005981445 0.60812512794677787 +1353 5 5.60115767 0.60115766525268555 0.36139053849205993 +1357 6 5.43090153 0.56909847259521484 0.3238730715102065 +1358 8 6.70303535 1.2969646453857422 1.682117291380564 +1359 7 6.42182732 0.57817268371582031 0.33428365219515399 +1360 6 5.811853 0.18814706802368164 0.035399319205907886 +1362 7 6.01781368 0.98218631744384766 0.96468996217390668 +1364 5 5.5021925 0.50219249725341797 0.25219730429762421 +1368 6 6.07387352 0.073873519897460938 0.005457296942040557 +1369 5 5.11232948 0.11232948303222656 0.012617912758287275 +1371 7 6.37426662 0.62573337554931641 0.39154225727634184 +1374 7 6.685261 0.31473922729492188 0.099060781198204495 +1376 6 5.576482 0.42351818084716797 0.17936764950809447 +1377 6 5.5179 0.48210000991821289 0.23242041956314097 +1378 7 6.305254 0.69474601745605469 0.48267202877104864 +1385 5 5.41952467 0.4195246696472168 0.17600094844260639 +1387 6 6.671762 0.67176198959350586 0.45126417066262547 +1390 6 6.13112974 0.13112974166870117 0.017195009150100304 +1391 6 6.25453854 0.25453853607177734 0.064789866345563496 +1392 6 6.671762 0.67176198959350586 0.45126417066262547 +1396 7 6.07236338 0.92763662338256836 0.86050970504061297 +1397 7 6.44414234 0.55585765838623047 0.30897773638662329 +1399 6 6.28654957 0.28654956817626953 0.08211065502200654 +1401 6 4.96816349 1.0318365097045898 1.0646865827593501 +1402 8 6.401021 1.5989789962768555 2.5567338305345402 +1405 4 4.93992 0.93991994857788086 0.8834495097346462 +1410 6 6.77783632 0.77783632278442383 0.60502934504279438 +1412 8 6.74131536 1.2586846351623535 1.584287010793787 +1414 6 6.098223 0.098223209381103516 0.0096477988611241017 +1415 5 4.419557 0.58044290542602539 0.33691396645940586 +1417 3 5.175881 2.1758809089660645 4.7344577300029869 +1418 5 5.22850561 0.22850561141967773 0.052214814450280755 +1422 5 5.371983 0.37198305130004883 0.13837139045449476 +1423 4 5.391678 1.3916778564453125 1.9367672561202198 +1428 7 6.444281 0.55571889877319336 0.30882349445369073 +1429 5 5.612692 0.61269187927246094 0.37539133892641985 +1430 4 4.96963263 0.96963262557983398 0.94018742858884252 +1432 7 6.47275925 0.52724075317382813 0.27798281180730555 +1433 6 6.397414 0.39741420745849609 0.15793805228986457 +1435 5 6.0038023 1.0038022994995117 1.0076190564805074 +1441 5 5.365135 0.36513519287109375 0.13332370907301083 +1444 6 6.2645 0.26450014114379883 0.069960324665089502 +1445 6 5.902387 0.097612857818603516 0.0095282700115149055 +1446 6 6.31714964 0.31714963912963867 0.10058389360006004 +1448 6 5.80783939 0.19216060638427734 0.036925698645973171 +1449 6 6.078127 0.078126907348632813 0.0061038136518618558 +1450 6 6.2645 0.26450014114379883 0.069960324665089502 +1451 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1452 6 6.2645 0.26450014114379883 0.069960324665089502 +1453 7 6.87757158 0.12242841720581055 0.014988717339520008 +1454 5 5.756866 0.7568659782409668 0.57284610901865562 +1455 5 5.01117373 0.011173725128173828 0.00012485213323998323 +1466 6 6.078127 0.078126907348632813 0.0061038136518618558 +1467 7 6.7072196 0.29278039932250977 0.085720362227448277 +1468 5 5.14014864 0.14014863967895508 0.019641641203861582 +1469 5 4.93497324 0.065026760101318359 0.0042284795292744093 +1472 5 5.114336 0.11433601379394531 0.013072724050289253 +1473 6 6.27588654 0.27588653564453125 0.076113380549941212 +1475 6 5.69343758 0.30656242370605469 0.093980519628530601 +1476 5 5.377952 0.37795209884643555 0.14284778902242579 +1477 6 5.12870932 0.87129068374633789 0.75914745558316099 +1479 6 5.97060442 0.029395580291748047 0.00086410014068860619 +1481 6 5.87255526 0.12744474411010742 0.01624216280129076 +1483 4 5.11274862 1.1127486228942871 1.2382094977531324 +1487 6 5.67100143 0.32899856567382813 0.1082400562154362 +1490 6 6.281177 0.28117704391479492 0.079060530024662512 +1491 5 5.67186 0.6718602180480957 0.4513961525956347 +1493 8 7.152326 0.84767389297485352 0.71855102883114341 +1496 5 3.60124254 1.3987574577331543 1.9565224255641169 +1497 7 6.07676363 0.92323637008666992 0.85236539505081055 +1499 6 6.293631 0.29363107681274414 0.08621920927021165 +1500 7 6.680092 0.31990814208984375 0.10234121937537566 +1501 5 5.673793 0.67379283905029297 0.45399678995545401 +1504 8 6.313339 1.6866607666015625 2.8448245415929705 +1507 6 5.803581 0.19641876220703125 0.038580330146942288 +1512 7 6.51168633 0.48831367492675781 0.2384502451204753 +1513 6 6.43545341 0.43545341491699219 0.18961967656287015 +1515 6 6.255807 0.25580692291259766 0.06543718181001168 +1516 6 5.870338 0.12966203689575195 0.016812243811955341 +1517 6 5.82861662 0.17138338088989258 0.029372263245249997 +1520 6 5.817548 0.18245220184326172 0.033288805957454315 +1526 6 5.99440527 0.0055947303771972656 3.1301007993533858E-05 +1527 6 6.2122364 0.21223640441894531 0.045044291360682109 +1530 5 5.113673 0.11367321014404297 0.012921598704451753 +1532 7 5.49979448 1.5002055168151855 2.250616592682718 +1533 6 6.35571957 0.35571956634521484 0.1265364098808277 +1538 6 5.86379766 0.13620233535766602 0.018551076156882118 +1540 6 6.057325 0.057324886322021484 0.0032861425918326859 +1542 6 6.2134366 0.21343660354614258 0.045555183733313243 +1543 6 6.21323347 0.21323347091674805 0.045468513119203635 +1549 6 5.80053139 0.19946861267089844 0.039787727440852905 +1551 6 5.668514 0.33148622512817383 0.10988311744972634 +1552 7 6.59583855 0.40416145324707031 0.1633464802907838 +1554 7 6.49526739 0.50473260879516602 0.2547550063811741 +1559 4 5.70196152 1.7019615173339844 2.8966730064857984 +1560 6 6.42826653 0.42826652526855469 0.18341221666560159 +1561 5 4.75953627 0.2404637336730957 0.0578228072120055 +1562 7 6.818427 0.18157291412353516 0.032968723143312673 +1564 5 4.75953627 0.2404637336730957 0.0578228072120055 +1567 5 5.400646 0.40064620971679688 0.16051738536043558 +1569 5 5.62976 0.62975978851318359 0.39659739122816973 +1571 6 5.641856 0.35814380645751953 0.12826698610388121 +1572 6 5.927081 0.072918891906738281 0.0053171647969065816 +1573 5 5.42326546 0.42326545715332031 0.17915364721920923 +1576 6 5.35206366 0.64793634414672852 0.41982150606622781 +1578 5 5.85142469 0.8514246940612793 0.72492400965734305 +1580 5 4.616376 0.38362407684326172 0.14716743233384477 +1581 6 6.01939154 0.019391536712646484 0.00037603169607791642 +1585 5 5.148195 0.14819478988647461 0.021961695749496357 +1587 6 5.495188 0.50481176376342773 0.25483491683394277 +1588 5 5.148195 0.14819478988647461 0.021961695749496357 +1589 6 6.458008 0.4580078125 0.20977115631103516 +1592 6 6.190008 0.19000816345214844 0.036103102178458357 +1596 5 6.11365128 1.1136512756347656 1.2402191637229407 +1597 6 5.53800058 0.46199941635131836 0.21344346070895881 +1598 6 5.62568235 0.37431764602661133 0.1401137001269035 +1599 6 5.89610243 0.1038975715637207 0.010794705376838465 +1600 6 5.408455 0.59154510498046875 0.34992561122635379 +1603 7 5.886322 1.113677978515625 1.2402786398306489 +1607 7 5.848945 1.151054859161377 1.3249272887990173 +1609 7 6.117519 0.88248109817504883 0.77877288863624017 +1610 6 6.04807568 0.048075675964355469 0.0023112706194297061 +1613 7 6.5623827 0.43761730194091797 0.19150890295804857 +1616 6 5.323467 0.67653322219848633 0.45769720073826647 +1617 6 5.734267 0.26573276519775391 0.07061390249964461 +1619 8 6.94580841 1.0541915893554688 1.1113199070678093 +1621 5 4.691925 0.308074951171875 0.094910175539553165 +1623 6 5.742188 0.2578120231628418 0.066467039287317675 +1626 6 5.93749475 0.062505245208740234 0.003906905678604744 +1628 6 5.542873 0.45712709426879883 0.20896518031463529 +1629 6 5.527357 0.47264289855957031 0.22339130955879227 +1632 8 7.01878834 0.98121166229248047 0.96277632621877274 +1633 7 6.146297 0.85370302200317383 0.7288088497773515 +1634 6 5.76403952 0.23596048355102539 0.055677349797633724 +1636 5 5.08614254 0.086142539978027344 0.0074205371938660392 +1639 5 5.69386959 0.69386959075927734 0.48145500898044702 +1641 6 5.7167654 0.28323459625244141 0.080221836514283495 +1642 7 5.635858 1.3641419410705566 1.860883235387746 +1644 7 5.635858 1.3641419410705566 1.860883235387746 +1646 6 5.7167654 0.28323459625244141 0.080221836514283495 +1647 7 6.595718 0.4042820930480957 0.16344401075934911 +1651 6 5.04891062 0.95108938217163086 0.9045710128796145 +1653 6 5.019502 0.98049783706665039 0.9613760084923797 +1654 5 4.9331913 0.066808700561523438 0.0044634024707193021 +1655 5 5.45447063 0.45447063446044922 0.20654355758688325 +1656 5 5.669732 0.66973209381103516 0.4485410774805132 +1657 6 6.788385 0.78838491439819336 0.62155077325064667 +1658 5 5.26004457 0.26004457473754883 0.067623180850432618 +1659 5 5.377065 0.37706518173217773 0.14217815127472022 +1660 6 5.44472837 0.55527162551879883 0.30832657810628916 +1663 6 5.019502 0.98049783706665039 0.9613760084923797 +1664 4 5.48985672 1.4898567199707031 2.2196730460418621 +1665 8 6.362209 1.6377911567687988 2.6823598731900802 +1667 6 5.853944 0.14605617523193359 0.021332406323381292 +1668 7 5.82933331 1.1706666946411133 1.3704605099419496 +1669 6 5.130034 0.86996603012084961 0.75684089356423101 +1673 5 5.570712 0.57071208953857422 0.32571228914548556 +1674 6 5.60828924 0.39171075820922852 0.15343731809684868 +1677 6 6.09377146 0.093771457672119141 0.0087930862739540316 +1679 5 5.491922 0.49192190170288086 0.24198715737497878 +1680 5 5.252373 0.25237321853637695 0.06369224143440988 +1681 6 6.32914257 0.32914257049560547 0.10833483171245462 +1684 7 6.160416 0.8395838737487793 0.70490108105900617 +1685 7 6.60589075 0.39410924911499023 0.15532210023798143 +1688 3 5.280151 2.2801508903503418 5.1990880827654564 +1690 4 4.54363966 0.5436396598815918 0.29554407979617281 +1697 6 6.475748 0.47574806213378906 0.22633621862405562 +1699 6 6.27966833 0.27966833114624023 0.078214375446123086 +1701 5 5.80198145 0.80198144912719727 0.6431742447441593 +1702 4 4.358819 0.35881900787353516 0.12875108041134808 +1704 5 5.21234035 0.21234035491943359 0.045088426327311026 +1706 6 5.9945097 0.0054903030395507813 3.0143427466100547E-05 +1707 5 5.331367 0.33136701583862305 0.10980409918579426 +1709 5 5.9493103 0.949310302734375 0.90119005087763071 +1711 5 6.35904932 1.3590493202209473 1.8470150547930189 +1713 6 5.38475227 0.61524772644042969 0.3785297648901178 +1714 5 5.44625664 0.44625663757324219 0.19914498657817603 +1715 8 6.32466841 1.6753315925598145 2.8067359450290041 +1716 6 6.47190332 0.47190332412719727 0.2226927473222986 +1719 6 5.64309549 0.35690450668334961 0.12738082689088515 +1720 7 6.133768 0.86623191833496094 0.75035773634226643 +1721 7 5.710882 1.2891178131103516 1.6618247360784153 +1723 8 6.32466841 1.6753315925598145 2.8067359450290041 +1724 6 6.21978569 0.21978569030761719 0.048305749663995812 +1725 6 5.76422739 0.23577260971069336 0.055588723489790937 +1728 5 5.44625664 0.44625663757324219 0.19914498657817603 +1731 6 5.48901033 0.51098966598510742 0.26111043874357165 +1734 6 5.853075 0.14692497253417969 0.021586947554169456 +1735 6 6.83932734 0.83932733535766602 0.70447037587859995 +1736 5 5.51393652 0.51393651962280273 0.2641307462019995 +1739 4 4.88872051 0.88872051239013672 0.78982414914298715 +1740 6 5.182924 0.81707620620727539 0.66761352675007402 +1743 6 5.31297255 0.6870274543762207 0.47200672306667002 +1744 5 5.49808359 0.49808359146118164 0.2480872640828693 +1746 5 5.721136 0.72113609313964844 0.52003726482871571 +1747 6 5.31297255 0.6870274543762207 0.47200672306667002 +1748 5 5.6907835 0.69078350067138672 0.47718184479981574 +1749 6 6.03195 0.031949996948242188 0.0010208023049926851 +1753 7 6.0383625 0.96163749694824219 0.9247466755368805 +1754 6 6.89634943 0.89634943008422852 0.80344230081232126 +1755 6 5.46218824 0.5378117561340332 0.2892414850359728 +1756 5 4.970864 0.029136180877685547 0.00084891703613720892 +1758 5 5.600766 0.60076618194580078 0.36092000536973501 +1765 5 5.022516 0.022515773773193359 0.00050696006860562193 +1767 5 5.19753265 0.19753265380859375 0.039019149320665747 +1768 5 5.18421936 0.1842193603515625 0.033936772728338838 +1772 6 5.92966461 0.07033538818359375 0.0049470668309368193 +1773 6 6.00829 0.0082898139953613281 6.8721016077688546E-05 +1774 6 6.18911743 0.189117431640625 0.03576540295034647 +1775 6 6.62580347 0.62580347061157227 0.39162998382948899 +1776 5 6.09891748 1.0989174842834473 1.2076196372638606 +1779 8 6.89703655 1.1029634475708008 1.2165283666772666 +1783 6 4.682983 1.3170170783996582 1.7345339847963714 +1784 7 6.949775 0.050224781036376953 0.00252252863015201 +1785 6 6.21301842 0.21301841735839844 0.045376846133876825 +1788 5 6.638938 1.6389379501342773 2.686117604390347 +1789 7 6.133875 0.86612510681152344 0.75017270064927288 +1794 5 5.16400242 0.16400241851806641 0.026896793279775011 +1795 6 5.117132 0.88286781311035156 0.77945557542625465 +1800 6 5.411709 0.58829116821289063 0.34608649859728757 +1801 5 5.03533125 0.035331249237060547 0.0012482971726512915 +1802 6 6.0186944 0.018694400787353516 0.00034948062079820374 +1803 6 5.90830851 0.091691493988037109 0.0084073300697582454 +1805 5 5.02972 0.029719829559326172 0.00088326826903539768 +1810 6 5.339474 0.66052579879760742 0.43629433087721736 +1812 6 6.510603 0.51060295104980469 0.26071537362076924 +1814 7 6.66430044 0.33569955825805664 0.11269419341465436 +1816 7 6.76522 0.23477983474731445 0.055121570803976283 +1817 4 4.97468042 0.97468042373657227 0.95000192841530406 +1818 6 6.40402842 0.40402841567993164 0.16323896067683563 +1821 5 5.90967035 0.90967035293579102 0.82750015101032659 +1823 6 5.56408072 0.43591928482055664 0.19002562287846558 +1824 5 5.042905 0.042904853820800781 0.0018408264813842834 +1825 5 5.518146 0.51814603805541992 0.26847531675252867 +1826 5 5.042905 0.042904853820800781 0.0018408264813842834 +1827 6 5.56408072 0.43591928482055664 0.19002562287846558 +1828 6 5.545804 0.45419597625732422 0.20629398484834383 +1829 7 6.212104 0.78789615631103516 0.62078035312970314 +1830 7 6.212104 0.78789615631103516 0.62078035312970314 +1831 7 6.59027052 0.4097294807434082 0.16787824739026291 +1832 7 6.212104 0.78789615631103516 0.62078035312970314 +1835 5 5.389878 0.3898777961730957 0.15200469594878996 +1836 6 6.027217 0.027216911315917969 0.00074076026157854358 +1841 7 6.989911 0.010088920593261719 0.00010178631873714039 +1843 6 6.90099573 0.90099573135375977 0.81179330791769644 +1844 6 6.373012 0.37301206588745117 0.13913800129762421 +1845 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1847 5 4.94622946 0.053770542144775391 0.0028912712025430665 +1854 7 5.83561754 1.1643824577331543 1.3557865078767009 +1858 5 4.889405 0.1105952262878418 0.012231304077658933 +1859 6 5.98256636 0.017433643341064453 0.00030393192014344095 +1861 6 5.883474 0.11652612686157227 0.013578338241359234 +1862 7 6.15355825 0.84644174575805664 0.7164636289619466 +1863 5 5.2479043 0.24790430068969727 0.061456542300447836 +1866 6 5.2747364 0.72526359558105469 0.52600728307515965 +1867 6 6.31448936 0.31448936462402344 0.098903560461621964 +1868 7 6.509657 0.49034309387207031 0.24043634970803396 +1871 6 6.063482 0.063481807708740234 0.004029939909969471 +1873 5 5.26915 0.2691497802734375 0.072441604221239686 +1874 5 6.16405 1.1640501022338867 1.3550126405107221 +1876 6 6.09814024 0.098140239715576172 0.0096315066514307546 +1877 6 5.8294735 0.17052650451660156 0.029079288742650533 +1878 6 5.96899843 0.031001567840576172 0.00096109720857384673 +1879 6 5.671555 0.3284449577331543 0.10787609026033351 +1883 5 5.34378052 0.343780517578125 0.11818504426628351 +1884 5 6.07482862 1.0748286247253418 1.1552565725289696 +1885 6 5.671555 0.3284449577331543 0.10787609026033351 +1887 5 6.237499 1.2374992370605469 1.5314043617254356 +1888 5 6.03254032 1.0325403213500977 1.0661395152137629 +1889 5 5.779849 0.77984905242919922 0.60816454457471991 +1890 5 5.34378052 0.343780517578125 0.11818504426628351 +1892 5 5.42887926 0.4288792610168457 0.18393742053035567 +1894 5 5.260407 0.2604069709777832 0.067811790533824023 +1899 7 6.92687559 0.073124408721923828 0.0053471791509309696 +1900 6 5.50394869 0.49605131149291992 0.24606690363384587 +1901 5 5.78969 0.78969001770019531 0.62361032405533479 +1902 6 5.770987 0.22901296615600586 0.052446938667571885 +1903 5 5.426101 0.4261012077331543 0.18156223923165271 +1905 6 5.591873 0.4081268310546875 0.16656751022674143 +1906 5 5.753492 0.75349187850952148 0.56775001097980748 +1917 6 5.890733 0.10926723480224609 0.01193932860132918 +1919 6 5.31168365 0.68831634521484375 0.47377939108991995 +1921 5 5.53998232 0.53998231887817383 0.2915809047010498 +1924 4 5.33742476 1.3374247550964355 1.7887049755447606 +1928 6 5.972093 0.027906894683837891 0.00077879477089481952 +1932 6 4.882628 1.1173720359802246 1.2485202667905924 +1934 6 5.90029144 0.09970855712890625 0.0099417963647283614 +1935 5 5.31565857 0.3156585693359375 0.099640332395210862 +1936 6 5.893681 0.10631895065307617 0.011303719267971246 +1937 7 5.95812225 1.0418777465820313 1.0855092388228513 +1939 5 5.204067 0.20406723022460938 0.041643434451543726 +1942 5 4.610965 0.38903522491455078 0.15134840622431511 +1945 6 5.78697824 0.21302175521850586 0.045378268196373028 +1947 5 5.06945372 0.069453716278076172 0.004823818704835503 +1954 5 5.205833 0.20583295822143555 0.042367206690187231 +1956 5 5.56439972 0.56439971923828125 0.3185470430762507 +1957 6 5.642328 0.35767221450805664 0.12792941303109728 +1958 6 5.27635431 0.72364568710327148 0.5236630804631659 +1961 5 5.182421 0.18242120742797852 0.033277496919481564 +1962 5 5.22548151 0.22548151016235352 0.050841911425095532 +1963 6 5.27635431 0.72364568710327148 0.5236630804631659 +1964 5 5.29695 0.29694986343383789 0.088179221393374974 +1965 6 5.109696 0.8903040885925293 0.79264137016457425 +1967 7 5.887322 1.112678050994873 1.2380524451657493 +1968 6 6.275273 0.27527284622192383 0.075775139867118924 +1971 7 6.79392147 0.20607852935791016 0.042468360262319038 +1973 5 5.14016438 0.14016437530517578 0.01964605210469017 +1976 5 5.727278 0.72727823257446289 0.52893362757663454 +1981 8 7.917678 0.082322120666503906 0.0067769315510304295 +1983 8 7.917678 0.082322120666503906 0.0067769315510304295 +1987 5 6.051807 1.0518069267272949 1.1062978111115171 +1988 6 5.8307457 0.16925430297851563 0.028647019076743163 +1991 8 7.917678 0.082322120666503906 0.0067769315510304295 +1994 6 5.769981 0.23001909255981445 0.052908782942040489 +1995 6 5.94961 0.050389766693115234 0.0025391285873865854 +1999 6 6.65559149 0.65559148788452148 0.42980019898664068 +2000 5 5.357441 0.35744094848632813 0.12776403165480588 +2006 6 5.94961 0.050389766693115234 0.0025391285873865854 +2009 7 6.79772854 0.20227146148681641 0.040913744132012653 +2010 6 6.05053043 0.050530433654785156 0.0025533247253406444 +2012 5 6.21455526 1.2145552635192871 1.475144488142405 +2013 6 5.76146269 0.23853731155395508 0.056900049003388631 +2014 5 6.133267 1.1332669258117676 1.2842939251388543 +2015 6 6.11094332 0.11094331741333008 0.012308419678674909 +2016 7 6.91747046 0.082529544830322266 0.0068111257699001726 +2017 5 6.133267 1.1332669258117676 1.2842939251388543 +2018 7 5.97948074 1.0205192565917969 1.0414595530746737 +2020 6 6.263805 0.26380491256713867 0.069593031894555679 +2021 6 5.830813 0.16918706893920898 0.028624264296240653 +2023 6 5.830813 0.16918706893920898 0.028624264296240653 +2026 5 4.90337944 0.096620559692382813 0.0093355325552693103 +2030 6 5.54503059 0.45496940612792969 0.20699716051240102 +2033 5 6.1886487 1.1886487007141113 1.412885733709345 +2036 6 5.323167 0.67683315277099609 0.45810311668992654 +2040 6 5.88102674 0.1189732551574707 0.014154635442764629 +2041 5 5.21115 0.21115016937255859 0.044584394026060181 +2042 6 5.5706563 0.42934370040893555 0.1843360130808378 +2044 6 5.277161 0.7228388786315918 0.5224960444613771 +2045 5 5.605945 0.60594511032104492 0.3671694767219833 +2046 5 5.02834129 0.028341293334960938 0.00080322890789830126 +2047 5 5.283352 0.28335189819335938 0.080288298209779896 +2049 7 5.77500868 1.2249913215637207 1.500603737906431 +2053 5 6.44825459 1.4482545852661133 2.0974413437443218 +2054 5 6.44825459 1.4482545852661133 2.0974413437443218 +2055 6 5.996897 0.0031027793884277344 9.6272399332519853E-06 +2056 5 5.142752 0.14275217056274414 0.020378182200374795 +2059 5 5.23273373 0.23273372650146484 0.054164987451258639 +2068 6 6.51137161 0.51137161254882813 0.26150092612078879 +2072 5 5.86525726 0.86525726318359375 0.74867013149196282 +2075 5 5.43223667 0.43223667144775391 0.18682854014423356 +2077 6 5.75369072 0.24630928039550781 0.060668261608952889 +2081 5 5.72838259 0.72838258743286133 0.53054119367538988 +2083 5 4.76489258 0.235107421875 0.055275499820709229 +2088 6 5.42661333 0.57338666915893555 0.32877227236917861 +2092 5 4.94481134 0.055188655853271484 0.0030457877348908369 +2093 5 5.41896248 0.41896247863769531 0.1755295585062413 +2095 5 5.394303 0.3943028450012207 0.15547473357605668 +2098 6 5.387457 0.61254310607910156 0.37520905680503347 +2100 5 5.62809563 0.62809562683105469 0.39450411644429551 +2101 6 6.321963 0.32196283340454102 0.10366006609388023 +2105 5 4.7825017 0.2174983024597168 0.04730551157285845 +2107 6 6.202732 0.20273208618164063 0.041100298767560162 +2108 6 5.387457 0.61254310607910156 0.37520905680503347 +2109 6 5.90480042 0.0951995849609375 0.0090629609767347574 +2117 5 5.76381731 0.76381731033325195 0.58341688356472332 +2119 4 5.78921556 1.7892155647277832 3.2012923370641602 +2126 5 4.936701 0.063299179077148438 0.0040067860718409065 +2127 5 4.90092373 0.099076271057128906 0.009816107486585679 +2130 5 6.140603 1.1406030654907227 1.3009753530068338 +2133 6 6.445718 0.44571781158447266 0.19866436756365147 +2135 5 5.743049 0.74304914474487305 0.5521220315060873 +2138 5 5.635716 0.63571596145629883 0.40413478365030642 +2140 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2141 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2144 6 6.080732 0.080731868743896484 0.0065176346308817301 +2145 6 5.74060965 0.25939035415649414 0.067283355829431457 +2149 6 6.53114653 0.53114652633666992 0.28211663243951079 +2151 5 5.08933449 0.089334487915039063 0.0079806507310422603 +2153 6 5.755437 0.24456310272216797 0.059811111213093682 +2154 4 4.18521452 0.18521451950073242 0.034304418233887191 +2155 5 6.15803671 1.1580367088317871 1.3410490190019573 +2156 4 6.28683329 2.2868332862854004 5.229606479262884 +2159 4 5.38970137 1.3897013664245605 1.9312698878422907 +2160 6 6.376475 0.37647485733032227 0.1417333182018865 +2163 6 6.237965 0.23796510696411133 0.056627392132440946 +2164 5 5.71715 0.71715021133422852 0.51430442561672862 +2165 5 5.130902 0.13090181350708008 0.017135284779442372 +2169 7 6.87379265 0.12620735168457031 0.015928295619232813 +2170 7 6.87379265 0.12620735168457031 0.015928295619232813 +2175 7 6.838287 0.1617131233215332 0.026151134254405406 +2177 7 4.953657 2.0463428497314453 4.1875190586470126 +2178 5 5.037093 0.037093162536621094 0.0013759027069681906 +2180 6 5.44559526 0.55440473556518555 0.30736461081710331 +2181 6 5.98071527 0.019284725189208984 0.0003719006256233115 +2183 5 5.60916948 0.60916948318481445 0.37108745924365394 +2185 7 5.64677954 1.3532204627990723 1.8312056209381353 +2187 5 5.58004 0.58003997802734375 0.33644637610996142 +2188 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2190 6 6.555541 0.55554103851318359 0.30862584547230654 +2191 5 5.58781052 0.58781051635742188 0.34552120314037893 +2193 6 5.92142963 0.078570365905761719 0.0061733023985652835 +2194 6 5.94486332 0.055136680603027344 0.0030400535479202517 +2195 5 5.58004 0.58003997802734375 0.33644637610996142 +2196 6 5.494919 0.5050811767578125 0.25510699511505663 +2199 6 5.91814041 0.081859588623046875 0.0067009922495344654 +2200 5 5.42772627 0.42772626876831055 0.18294976099446103 +2207 7 6.20115471 0.79884529113769531 0.63815379917286918 +2208 5 6.01227665 1.0122766494750977 1.0247040150725297 +2212 6 6.209624 0.20962381362915039 0.043942143240428777 +2213 6 6.27866745 0.27866744995117188 0.077655547662288882 +2214 5 6.01227665 1.0122766494750977 1.0247040150725297 +2217 6 5.81703329 0.18296670913696289 0.03347681665240998 +2218 6 5.859478 0.14052200317382813 0.019746433375985362 +2220 6 5.89436436 0.10563564300537109 0.011158889073158207 +2221 6 5.753357 0.24664306640625 0.060832802206277847 +2223 6 5.88092756 0.11907243728637695 0.014178245321318173 +2225 4 5.87550926 1.8755092620849609 3.5175349921664747 +2228 7 6.017545 0.98245477676391602 0.96521738838623605 +2229 6 6.303792 0.30379199981689453 0.092289579152748047 +2230 7 6.017545 0.98245477676391602 0.96521738838623605 +2231 6 6.303792 0.30379199981689453 0.092289579152748047 +2234 5 5.575778 0.57577800750732422 0.3315203139291043 +2236 5 5.2704854 0.27048540115356445 0.073162352237204686 +2237 4 5.158827 1.1588268280029297 1.3428796172993316 +2242 5 5.53293753 0.53293752670288086 0.28402240736818385 +2243 5 6.28247452 1.2824745178222656 1.6447408888634527 +2244 5 5.33255053 0.3325505256652832 0.11058985212025618 +2246 4 5.158827 1.1588268280029297 1.3428796172993316 +2248 6 5.680154 0.31984615325927734 0.10230156175475713 +2249 5 5.066627 0.066627025604248047 0.0044391605408691248 +2250 6 4.959182 1.0408182144165039 1.0833025554611595 +2251 7 6.41361332 0.58638668060302734 0.3438493391886368 +2256 5 5.84614134 0.84614133834838867 0.71595516446200236 +2257 6 5.53059244 0.46940755844116211 0.22034345592169302 +2261 6 5.198945 0.80105495452880859 0.6416890401751516 +2262 6 5.498481 0.50151920318603516 0.25152151116435562 +2263 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2264 6 6.58286762 0.58286762237548828 0.33973466521365481 +2265 5 4.94619465 0.053805351257324219 0.0028950158239240409 +2268 6 5.49432945 0.50567054748535156 0.25570270259413519 +2269 6 5.713871 0.28612899780273438 0.081869803383597173 +2277 6 6.468116 0.46811580657958984 0.21913240836965997 +2279 5 5.187639 0.18763923645019531 0.035208483055612305 +2281 6 5.578538 0.42146205902099609 0.17763026719421759 +2286 5 5.24503756 0.24503755569458008 0.060043403700774434 +2288 5 5.06648064 0.066480636596679688 0.0044196750422997866 +2294 7 7.13601 0.13601016998291016 0.018498766338780115 +2301 5 5.900166 0.90016603469848633 0.81029889002479649 +2302 5 5.0114007 0.011400699615478516 0.00012997595172237197 +2303 5 5.16666365 0.16666364669799805 0.027776771130675115 +2305 7 6.700686 0.29931402206420898 0.089588883804253783 +2307 5 5.45757151 0.45757150650024414 0.20937168356090297 +2308 5 5.029569 0.029569149017333984 0.00087433457360930333 +2309 6 5.427362 0.57263803482055664 0.32791431892314904 +2312 5 5.029569 0.029569149017333984 0.00087433457360930333 +2313 7 6.80353832 0.19646167755126953 0.038597190746259002 +2316 7 6.64999628 0.35000371932983398 0.1225026035447172 +2320 6 6.219693 0.21969318389892578 0.048265095051647222 +2322 6 5.3386817 0.66131830215454102 0.43734189676456481 +2323 6 6.07975531 0.079755306243896484 0.0063609088740577135 +2325 6 5.010644 0.98935604095458984 0.97882537577334006 +2326 5 5.27927828 0.27927827835083008 0.077996356758603724 +2330 6 5.41974068 0.58025932312011719 0.33670088206781656 +2341 5 5.20041227 0.20041227340698242 0.040165079332155074 +2343 5 6.428549 1.4285488128662109 2.0407517107414606 +2346 4 5.21786 1.217860221862793 1.4831835199956913 +2348 6 5.806993 0.19300699234008789 0.037251699092166746 +2352 6 5.25599861 0.74400138854980469 0.55353806616403745 +2353 7 6.67731333 0.32268667221069336 0.10412668842241146 +2354 6 6.64218235 0.64218235015869141 0.41239817085534014 +2356 6 5.86749458 0.13250541687011719 0.017557685499923537 +2357 5 5.94600058 0.94600057601928711 0.89491708982882301 +2360 6 6.17621469 0.17621469497680664 0.031051618725769004 +2361 5 5.13946867 0.13946866989135742 0.019451509881264428 +2362 6 6.729167 0.72916698455810547 0.53168449136956042 +2363 5 5.514287 0.51428699493408203 0.26449111315832852 +2364 5 5.378189 0.3781890869140625 0.14302698546089232 +2368 6 5.58730936 0.41269063949584961 0.17031356392749331 +2369 6 6.56191969 0.5619196891784668 0.31575373708642474 +2371 5 4.946381 0.053618907928466797 0.0028749872874413995 +2372 4 5.022731 1.022730827331543 1.0459783451742624 +2373 3 4.65867138 1.6586713790893555 2.7511907438101844 +2377 6 5.68505859 0.31494140625 0.099188089370727539 +2378 5 5.365645 0.36564493179321289 0.13369621614606331 +2382 8 5.980098 2.019902229309082 4.0800050159677994 +2384 8 5.980098 2.019902229309082 4.0800050159677994 +2385 5 6.06373739 1.0637373924255371 1.1315372400442811 +2388 4 5.438252 1.4382519721984863 2.0685687355328355 +2390 8 6.577091 1.4229087829589844 2.0246694046218181 +2394 5 4.748077 0.2519230842590332 0.063465240382583943 +2395 5 5.46794844 0.46794843673706055 0.21897573944465876 +2397 6 6.152169 0.15216922760009766 0.023155473828410322 +2398 6 6.355004 0.35500383377075195 0.12602772199193168 +2399 6 5.84902763 0.15097236633300781 0.022792655396187911 +2400 4 5.51223755 1.512237548828125 2.2868624040856957 +2402 6 5.63959646 0.36040353775024414 0.12989071002289165 +2404 5 5.11211967 0.11211967468261719 0.01257082145093591 +2405 5 5.799807 0.79980707168579102 0.63969135191860005 +2407 6 6.790098 0.79009819030761719 0.62425515032737167 +2408 5 4.92498446 0.075015544891357422 0.0056273319753472606 +2409 4 6.467688 2.4676880836486816 6.0894844781817028 +2410 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2411 6 5.02752256 0.97247743606567383 0.94571236365686673 +2412 4 4.89793873 0.89793872833251953 0.80629395983942231 +2413 4 6.467688 2.4676880836486816 6.0894844781817028 +2414 4 4.812013 0.81201314926147461 0.65936535457353784 +2416 6 6.02325535 0.023255348205566406 0.00054081122016214067 +2417 5 4.905179 0.094820976257324219 0.0089910175383920432 +2418 5 5.212003 0.21200323104858398 0.044945369975039284 +2421 5 5.728902 0.72890186309814453 0.53129792602794623 +2425 6 5.87789345 0.12210655212402344 0.014910010071616853 +2432 5 5.243106 0.24310588836669922 0.059100472958562023 +2434 6 5.20914364 0.79085636138916016 0.62545378434970189 +2438 5 4.97508335 0.024916648864746094 0.0006208393906490528 +2442 5 5.124124 0.12412405014038086 0.015406779823251782 +2445 5 5.283511 0.28351116180419922 0.08037857886756683 +2446 5 5.283511 0.28351116180419922 0.08037857886756683 +2447 6 5.54187 0.4581298828125 0.20988298952579498 +2448 6 6.25477743 0.25477743148803711 0.064911539595641443 +2449 6 6.04059029 0.040590286254882813 0.0016475713382533286 +2451 5 5.102657 0.10265684127807617 0.010538427061192124 +2454 5 5.52015066 0.52015066146850586 0.27055671062612419 +2457 6 6.17909145 0.17909145355224609 0.03207374873545632 +2458 6 5.62500525 0.37499475479125977 0.14062106612095704 +2460 5 5.3468256 0.34682559967041016 0.12028799658673961 +2462 5 5.26428 0.26427984237670898 0.069843835086658146 +2463 7 5.87194967 1.1280503273010254 1.2724975409239505 +2468 6 5.542082 0.45791816711425781 0.20968904777328135 +2469 5 5.144967 0.14496707916259766 0.021015454040934856 +2471 7 7.0686183 0.068618297576904297 0.0047084707623525901 +2473 6 5.332778 0.66722202301025391 0.44518522798989579 +2474 7 6.526948 0.47305202484130859 0.22377821820646204 +2476 6 5.40006 0.59993982315063477 0.35992779140201492 +2479 6 5.451382 0.54861783981323242 0.30098153416133755 +2480 5 5.305516 0.30551576614379883 0.093339883362432374 +2481 6 5.63753748 0.36246252059936523 0.13137907883924527 +2482 6 5.44933271 0.55066728591918945 0.30323445978160635 +2484 5 5.035196 0.035195827484130859 0.0012387462722927012 +2485 6 5.351825 0.64817476272583008 0.42013052303468612 +2487 6 6.216436 0.21643590927124023 0.046844502822068534 +2489 6 5.25572443 0.74427556991577148 0.55394612397344645 +2490 6 5.24163437 0.75836563110351563 0.57511843043903355 +2491 5 5.23166561 0.23166561126708984 0.053668955443754385 +2492 6 5.25572443 0.74427556991577148 0.55394612397344645 +2493 4 5.047504 1.0475039482116699 1.0972645215190369 +2494 4 5.047504 1.0475039482116699 1.0972645215190369 +2497 5 5.789101 0.78910112380981445 0.62268058359791212 +2498 5 5.789101 0.78910112380981445 0.62268058359791212 +2500 5 5.789101 0.78910112380981445 0.62268058359791212 +2501 5 5.42734766 0.42734766006469727 0.18262602256277205 +2506 6 5.75300074 0.24699926376342773 0.061008636299675345 +2507 7 6.718815 0.28118515014648438 0.079065088662900962 +2508 6 5.369476 0.6305241584777832 0.39756071442411667 +2509 5 5.12915134 0.12915134429931641 0.016680069734320568 +2510 6 5.33514929 0.66485071182250977 0.44202646901089793 +2515 7 6.553418 0.44658184051513672 0.19943534027788701 +2516 6 5.71722269 0.28277730941772461 0.079963006721527563 +2520 5 5.229541 0.22954082489013672 0.052688990291244409 +2521 7 6.4475956 0.55240440368652344 0.30515062521226355 +2524 5 5.229541 0.22954082489013672 0.052688990291244409 +2527 6 6.322875 0.32287502288818359 0.10424828040504508 +2528 6 6.20776 0.20775985717773438 0.043164158254512586 +2529 5 5.05015 0.050149917602539063 0.0025150142355414573 +2530 6 5.70940733 0.29059267044067383 0.084444100113842069 +2533 5 6.127435 1.1274352073669434 1.2711101468105426 +2535 6 5.85946 0.14054012298583984 0.019751526168874989 +2539 5 5.761463 0.76146316528320313 0.57982615208311472 +2540 5 6.34781027 1.3478102684020996 1.8165925196101398 +2542 5 6.003742 1.0037422180175781 1.0074984402308473 +2543 6 5.67026138 0.32973861694335938 0.10872755550371949 +2544 6 5.91505241 0.084947586059570313 0.0072160923773481045 +2549 5 5.905257 0.90525722503662109 0.81949064348100364 +2550 5 5.18551636 0.185516357421875 0.034416318871080875 +2553 7 6.659942 0.3400578498840332 0.11563934126775166 +2559 5 5.171946 0.17194604873657227 0.029565443676119685 +2561 5 5.419591 0.41959095001220703 0.17605656533214642 +2565 5 5.66264248 0.66264247894287109 0.43909505489955336 +2570 5 6.09423256 1.0942325592041016 1.1973448936223576 +2572 5 5.85262251 0.85262250900268555 0.7269651428580346 +2573 5 5.33394337 0.33394336700439453 0.11151817236623174 +2576 5 5.82261133 0.82261133193969727 0.6766894034356028 +2577 5 5.780506 0.78050613403320313 0.60918982526345644 +2578 7 6.720284 0.27971601486206055 0.078241048970312477 +2580 5 5.43206549 0.43206548690795898 0.18668058497701168 +2582 7 6.81294441 0.18705558776855469 0.034989792915439466 +2585 7 6.81294441 0.18705558776855469 0.034989792915439466 +2587 6 5.354246 0.64575386047363281 0.41699804831660003 +2588 7 6.81294441 0.18705558776855469 0.034989792915439466 +2589 4 4.78625631 0.78625631332397461 0.61819899024180813 +2590 6 6.1274457 0.12744569778442383 0.016242405883758693 +2591 7 6.415467 0.5845332145690918 0.34167907893447591 +2594 7 6.423638 0.57636213302612305 0.33219330838642236 +2597 6 6.22214746 0.22214746475219727 0.049349496095828727 +2598 5 5.194394 0.19439411163330078 0.037789070637700206 +2601 5 5.68621063 0.68621063232421875 0.47088503191480413 +2603 7 6.966857 0.033143043518066406 0.0010984613336404436 +2604 7 6.966857 0.033143043518066406 0.0010984613336404436 +2605 6 5.794412 0.20558786392211914 0.042266369792059777 +2606 6 6.468554 0.46855401992797852 0.21954286959066849 +2608 6 6.152119 0.15211915969848633 0.023140238747373587 +2613 5 5.2531476 0.25314760208129883 0.064083708439511611 +2614 5 6.55887175 1.5588717460632324 2.430081120674231 +2615 7 6.630824 0.36917591094970703 0.13629085322554602 +2616 7 6.630824 0.36917591094970703 0.13629085322554602 +2620 5 5.45543861 0.45543861389160156 0.20742433102350333 +2622 7 6.30767059 0.69232940673828125 0.47932000743458048 +2624 5 6.55887175 1.5588717460632324 2.430081120674231 +2625 5 4.713512 0.28648805618286133 0.082075406335434309 +2627 7 6.145278 0.85472202301025391 0.73054973661874101 +2629 5 4.998917 0.0010828971862792969 1.1726663160516182E-06 +2630 6 5.7854867 0.21451330184936523 0.046015956670316882 +2631 7 7.168283 0.16828298568725586 0.02831916327181716 +2632 5 5.06333447 0.063334465026855469 0.0040112544602379785 +2634 5 5.30502844 0.30502843856811523 0.093042348335302449 +2636 5 5.49951124 0.4995112419128418 0.24951148079730956 +2637 5 5.30502844 0.30502843856811523 0.093042348335302449 +2640 6 6.370355 0.37035512924194336 0.13716292175581657 +2642 5 5.604046 0.60404586791992188 0.3648714105511317 +2643 5 5.61569834 0.61569833755493164 0.37908444286790655 +2645 7 6.34942675 0.6505732536315918 0.42324555834079547 +2646 7 6.021215 0.97878503799438477 0.95802015060166923 +2647 5 5.82385874 0.82385873794555664 0.67874322008924537 +2649 6 5.82408476 0.17591524124145508 0.030946172101039338 +2651 5 4.96879244 0.031207561492919922 0.0009739118943343783 +2655 5 5.67757463 0.67757463455200195 0.459107385388279 +2656 4 5.873171 1.8731708526611328 3.5087690432592353 +2657 7 6.70312071 0.29687929153442383 0.088137313741981416 +2659 6 6.201171 0.20117092132568359 0.040469739587024378 +2662 6 6.45812464 0.45812463760375977 0.20987818357957622 +2663 8 5.65337 2.3466300964355469 5.506672809497104 +2667 7 6.00120831 0.99879169464111328 0.99758484928406688 +2671 7 6.983855 0.016145229339599609 0.00026066843042826804 +2672 7 5.72459126 1.2754087448120117 1.6266674663429512 +2673 6 5.512653 0.48734712600708008 0.23750722122736079 +2675 7 5.69395638 1.3060436248779297 1.7057499500842823 +2676 6 6.307566 0.30756616592407227 0.094596946421233952 +2677 6 6.443829 0.44382905960083008 0.19698423414615718 +2678 5 5.273363 0.27336311340332031 0.074727391769556561 +2682 6 6.5731144 0.57311439514160156 0.32846010991852381 +2684 6 6.47421932 0.47421932220458984 0.2248839655521806 +2685 7 6.35321856 0.64678144454956055 0.41832623701361626 +2686 6 6.623215 0.6232151985168457 0.3883971836623914 +2687 5 5.35341358 0.35341358184814453 0.12490115983473515 +2688 6 5.92039251 0.079607486724853516 0.0063373519426477287 +2689 6 5.86066055 0.13933944702148438 0.019415481496253051 +2690 6 5.578879 0.42112112045288086 0.17734299809148979 +2691 6 6.09161 0.091609954833984375 0.0083923838246846572 +2692 6 5.729569 0.2704310417175293 0.073132948324428071 +2693 6 6.20171928 0.20171928405761719 0.040690669560717652 +2695 6 6.645086 0.64508581161499023 0.41613570434697067 +2696 6 5.84798431 0.15201568603515625 0.023108768800739199 +2701 5 5.37176561 0.3717656135559082 0.13820967142260088 +2702 5 5.37176561 0.3717656135559082 0.13820967142260088 +2704 6 5.31003237 0.68996763229370117 0.47605533361297603 +2705 6 5.31003237 0.68996763229370117 0.47605533361297603 +2708 6 5.497318 0.50268220901489258 0.25268940326009215 +2713 6 5.497318 0.50268220901489258 0.25268940326009215 +2714 6 5.59170675 0.40829324722290039 0.16670337572782046 +2715 6 6.01414633 0.014146327972412109 0.0002001185951030493 +2719 6 6.004554 0.0045537948608398438 2.0737047634611372E-05 +2720 7 6.80529833 0.1947016716003418 0.037908740923967343 +2725 5 5.448 0.44799995422363281 0.2007039589843771 +2726 6 5.924554 0.075446128845214844 0.0056921183577287593 +2734 6 5.794034 0.20596599578857422 0.042421991421178973 +2735 6 5.434296 0.5657038688659668 0.32002086724992296 +2736 6 6.01298857 0.012988567352294922 0.00016870288186510152 +2737 7 6.007834 0.99216604232788086 0.98439345554857027 +2738 5 4.610934 0.38906621932983398 0.15137252302361048 +2741 5 4.610934 0.38906621932983398 0.15137252302361048 +2742 6 6.00884151 0.0088415145874023438 7.8172380199248437E-05 +2746 6 5.95755863 0.042441368103027344 0.0018012697264566668 +2747 6 5.59035969 0.40964031219482422 0.16780518537507305 +2748 8 6.45529556 1.5447044372558594 2.3861117984779412 +2750 8 6.45529556 1.5447044372558594 2.3861117984779412 +2751 6 6.10585451 0.10585451126098633 0.011205177554302281 +2763 6 5.63824034 0.36175966262817383 0.13087005350485015 +2765 6 6.276466 0.27646589279174805 0.076433389877138325 +2766 6 6.528149 0.52814912796020508 0.27894150136512508 +2767 6 5.705548 0.29445219039916992 0.086702092430869016 +2772 7 6.990375 0.0096249580383300781 9.2639817239614786E-05 +2774 8 6.647418 1.3525819778442383 1.8294780067890315 +2775 8 6.647418 1.3525819778442383 1.8294780067890315 +2777 6 6.116481 0.11648082733154297 0.013567783135840727 +2783 6 6.070306 0.070305824279785156 0.004942908927660028 +2785 5 5.43653631 0.43653631210327148 0.19056395178472485 +2786 6 6.944194 0.94419384002685547 0.89150200754465914 +2788 5 5.14618063 0.14618062973022461 0.021368776508325027 +2790 6 5.996413 0.0035867691040039063 1.2864912605436984E-05 +2791 5 5.06431532 0.064315319061279297 0.0041364602659541561 +2794 5 5.196513 0.19651317596435547 0.038617428327597736 +2796 7 6.7877326 0.21226739883422852 0.045057448607849437 +2798 7 5.97907734 1.0209226608276367 1.0422830793913818 +2799 7 6.517823 0.48217678070068359 0.23249444784687512 +2801 5 5.36617851 0.36617851257324219 0.13408670307035209 +2802 6 5.80672932 0.19327068328857422 0.037353557018832362 +2803 8 6.202484 1.797515869140625 3.2310632998123765 +2805 6 6.34842634 0.34842634201049805 0.12140091580681656 +2806 5 5.6479187 0.647918701171875 0.41979864332824945 +2807 5 5.6928525 0.69285249710083008 0.48004458273885575 +2812 6 6.332061 0.33206081390380859 0.1102643841304598 +2815 5 5.5959425 0.59594249725341797 0.35514746003264008 +2816 5 5.84147549 0.84147548675537109 0.70808099481018871 +2817 7 7.080033 0.080032825469970703 0.0064052531527067913 +2819 6 6.2077837 0.20778369903564453 0.043174065584935306 +2820 5 5.42021656 0.42021656036376953 0.17658195760395756 +2821 5 5.69374561 0.69374561309814453 0.48128297569292044 +2822 5 5.76683855 0.76683855056762695 0.58804136263665896 +2824 6 5.575345 0.42465496063232422 0.18033183558964083 +2825 6 5.79173851 0.20826148986816406 0.043372848162107402 +2826 6 5.548999 0.45100116729736328 0.20340205290358426 +2827 7 6.41423273 0.58576726913452148 0.34312329358931493 +2828 7 6.41423273 0.58576726913452148 0.34312329358931493 +2829 5 5.660426 0.66042613983154297 0.43616268617279275 +2832 6 6.22251129 0.22251129150390625 0.049511274846736342 +2834 6 6.2342124 0.23421239852905273 0.054855447624731823 +2835 6 5.79173851 0.20826148986816406 0.043372848162107402 +2838 7 6.53514433 0.46485567092895508 0.21609079479480897 +2841 6 5.84660959 0.15339040756225586 0.02352861713211496 +2843 6 5.64633465 0.35366535186767578 0.12507918111168692 +2845 7 6.833482 0.16651821136474609 0.027728314716114255 +2849 5 5.037817 0.037817001342773438 0.001430125590559328 +2851 5 5.75162268 0.75162267684936523 0.56493664835420532 +2853 6 6.388475 0.38847494125366211 0.15091277998203623 +2855 7 6.26280069 0.73719930648803711 0.54346281748644287 +2857 8 6.98407269 1.0159273147583008 1.0321083088720115 +2858 7 6.26280069 0.73719930648803711 0.54346281748644287 +2859 6 6.298114 0.29811382293701172 0.088871851426119974 +2862 6 6.979329 0.97932910919189453 0.95908550411058968 +2864 6 6.388475 0.38847494125366211 0.15091277998203623 +2866 7 6.742437 0.25756311416625977 0.066338757779021762 +2867 7 6.51812935 0.48187065124511719 0.23219932453139336 +2874 7 6.914118 0.085882186889648438 0.007375750024948502 +2875 6 6.06492567 0.064925670623779297 0.004215342705947478 +2876 5 6.01396847 1.0139684677124023 1.0281320535150371 +2877 5 5.71460772 0.71460771560668945 0.51066418720461115 +2878 6 7.44846964 1.4484696388244629 2.09806429459627 +2880 5 5.61933041 0.61933040618896484 0.38357015203018818 +2882 5 5.98323154 0.98323154449462891 0.96674427008929342 +2883 7 6.836774 0.16322612762451172 0.026642768739293388 +2884 7 6.89757824 0.10242176055908203 0.010490217036021932 +2885 6 6.65348339 0.65348339080810547 0.4270405420620591 +2886 5 5.506567 0.50656700134277344 0.25661012684940943 +2887 5 6.570382 1.5703821182250977 2.4660999972411446 +2888 4 5.380556 1.3805561065673828 1.9059351633804908 +2889 6 6.397633 0.39763307571411133 0.15811206290186419 +2892 5 5.364448 0.36444807052612305 0.13282239611021396 +2894 7 6.20067549 0.79932451248168945 0.63891967625409052 +2897 5 5.364448 0.36444807052612305 0.13282239611021396 +2899 5 5.146842 0.14684200286865234 0.021562573806477303 +2900 6 6.481261 0.48126077651977539 0.23161193501641719 +2901 7 6.732033 0.26796722412109375 0.071806433203164488 +2907 6 5.935697 0.064302921295166016 0.0041348656870923151 +2908 6 6.063202 0.063201904296875 0.0039944807067513466 +2909 6 6.188701 0.18870115280151367 0.035608125068620211 +2912 7 6.732033 0.26796722412109375 0.071806433203164488 +2914 6 6.351888 0.35188817977905273 0.12382529106821494 +2915 6 6.351888 0.35188817977905273 0.12382529106821494 +2916 6 7.193787 1.1937870979309082 1.4251276351862998 +2917 7 6.77892828 0.22107172012329102 0.048872705438270714 +2918 6 6.00741529 0.0074152946472167969 5.498659470504208E-05 +2921 6 5.207289 0.79271078109741211 0.62839038246806922 +2922 8 6.728791 1.2712087631225586 1.6159717194395853 +2925 5 5.5744133 0.57441329956054688 0.32995063871203456 +2926 8 6.433487 1.5665130615234375 2.4539631719235331 +2928 7 6.725618 0.27438211441040039 0.07528554470832205 +2930 8 6.32433462 1.6756653785705566 2.8078544609400069 +2931 8 6.433487 1.5665130615234375 2.4539631719235331 +2932 6 6.040474 0.04047393798828125 0.0016381396562792361 +2935 4 5.525333 1.5253329277038574 2.3266405403376211 +2936 5 5.521468 0.52146816253662109 0.27192904453931988 +2938 8 6.206464 1.7935361862182617 3.2167720512743472 +2939 8 6.206464 1.7935361862182617 3.2167720512743472 +2942 5 5.47682953 0.47682952880859375 0.22736639954382554 +2945 8 6.9402957 1.0597043037414551 1.1229732113681621 +2946 6 6.150122 0.15012216567993164 0.022536664628432845 +2951 5 5.433133 0.43313312530517578 0.1876043042366291 +2952 5 5.218945 0.21894502639770508 0.047936924584291773 +2954 7 6.82631826 0.17368173599243164 0.030165345417344724 +2957 6 6.40513372 0.40513372421264648 0.1641333344944087 +2958 5 5.433133 0.43313312530517578 0.1876043042366291 +2960 7 6.320663 0.6793370246887207 0.46149879311292352 +2963 7 6.758505 0.24149513244628906 0.058319898995250696 +2966 6 6.074806 0.07480621337890625 0.0055959695600904524 +2969 6 6.37035227 0.37035226821899414 0.13716080257495378 +2972 6 5.967377 0.032622814178466797 0.0010642480049227743 +2973 6 6.074806 0.07480621337890625 0.0055959695600904524 +2974 6 6.11917543 0.11917543411254883 0.014202784095914467 +2976 6 6.85677767 0.85677766799926758 0.73406797238226318 +2977 6 5.64738846 0.35261154174804688 0.1243348993739346 +2978 6 5.64738846 0.35261154174804688 0.1243348993739346 +2979 7 7.00416327 0.0041632652282714844 1.7332777360934415E-05 +2980 7 6.459112 0.54088783264160156 0.29255964749972918 +2982 6 6.08631945 0.086319446563720703 0.0074510468550670339 +2983 6 6.486003 0.48600292205810547 0.23619884024901694 +2986 7 6.642583 0.35741710662841797 0.1277469881106299 +2988 7 6.099473 0.90052700042724609 0.81094887849849329 +2990 7 7.303502 0.30350208282470703 0.092113514278935327 +2992 7 6.31785631 0.6821436882019043 0.46532001135369683 +2993 7 6.642583 0.35741710662841797 0.1277469881106299 +2995 6 6.261716 0.26171588897705078 0.068495206543047971 +2998 7 6.02018 0.97981977462768555 0.9600467907514485 +3003 7 6.099473 0.90052700042724609 0.81094887849849329 +3007 7 7.303502 0.30350208282470703 0.092113514278935327 +3008 7 7.05388927 0.053889274597167969 0.0029040539166089729 +3009 6 5.962095 0.037905216217041016 0.0014368054164606292 +3010 5 5.75205231 0.75205230712890625 0.56558267265791073 +3011 6 6.4816947 0.48169469833374023 0.23202978240283301 +3012 6 6.84173775 0.84173774719238281 0.70852243504850776 +3015 6 6.66586542 0.66586542129516602 0.44337675927658893 +3017 6 7.075902 1.075901985168457 1.1575650816894267 +3018 8 7.011235 0.98876476287841797 0.97765575631001411 +3019 6 6.66586542 0.66586542129516602 0.44337675927658893 +3021 4 5.329598 1.3295979499816895 1.7678307085955112 +3024 6 6.08960772 0.089607715606689453 0.0080295426962493366 +3025 7 5.93795824 1.0620417594909668 1.1279326989026686 +3030 8 7.151422 0.84857797622680664 0.72008458173718282 +3032 5 6.76317167 1.7631716728210449 3.1087743478385619 +3035 7 6.09332848 0.90667152404785156 0.82205325251925387 +3036 5 5.510598 0.51059818267822266 0.26071050415430364 +3041 6 5.37881136 0.62118864059448242 0.38587532720362105 +3042 6 5.661942 0.3380579948425293 0.11428320787695156 +3047 5 5.774637 0.77463722229003906 0.60006282615722739 +3048 6 6.35629272 0.356292724609375 0.12694450560957193 +3051 5 4.92406559 0.075934410095214844 0.005766034636508266 +3052 7 5.75310135 1.2468986511230469 1.5547562461724738 +3054 6 6.408374 0.40837383270263672 0.16676918723624112 +3057 5 6.842451 1.8424510955810547 3.3946260396078287 +3060 5 5.91603136 0.9160313606262207 0.83911345365072521 +3061 5 5.91603136 0.9160313606262207 0.83911345365072521 +3063 5 5.91603136 0.9160313606262207 0.83911345365072521 +3067 4 5.671678 1.6716780662536621 2.7945075571935831 +3068 6 6.87566 0.87565994262695313 0.76678033512143884 +3071 7 6.60551071 0.39448928833007813 0.15562179860717151 +3081 5 5.91603136 0.9160313606262207 0.83911345365072521 +3082 6 5.680128 0.31987190246582031 0.10231803398710326 +3083 7 6.60002565 0.39997434616088867 0.1599794775868304 +3085 6 6.02571249 0.025712490081787109 0.00066113214620600047 +3087 3 5.521938 2.5219378471374512 6.360170504824282 +3089 7 6.60497332 0.39502668380737305 0.15604608091985028 +3092 6 5.875346 0.12465381622314453 0.015538573898993491 +3093 7 6.42221928 0.57778072357177734 0.33383056453112658 +3096 7 6.04160261 0.95839738845825195 0.91852555420359749 +3098 7 6.134868 0.86513185501098633 0.74845312655475027 +3100 7 6.25054932 0.74945068359375 0.56167632713913918 +3103 7 6.42221928 0.57778072357177734 0.33383056453112658 +3107 6 5.812541 0.18745899200439453 0.035140873683303653 +3109 4 5.29554653 1.2955465316772461 1.6784408157409416 +3110 6 6.20626926 0.20626926422119141 0.042547009362351673 +3118 7 6.6532855 0.34671449661254883 0.12021094216129313 +3121 5 5.4326396 0.43263959884643555 0.18717702249000467 +3123 5 6.173872 1.1738719940185547 1.3779754583410977 +3127 5 5.83897829 0.83897829055786133 0.70388457202739119 +3129 6 6.11212063 0.11212062835693359 0.012571035303153621 +3130 6 6.62801 0.62800979614257813 0.39439630405104253 +3132 6 6.119272 0.11927223205566406 0.014225865339540178 +3134 6 6.2366147 0.23661470413208008 0.055986518211511793 +3136 5 5.514752 0.51475191116333008 0.26496953004630086 +3137 6 5.9501214 0.049878597259521484 0.0024878744645775441 +3139 6 5.58149433 0.41850566864013672 0.17514699468392791 +3142 6 5.798257 0.20174312591552734 0.040700288854168321 +3148 6 5.95302 0.046979904174804688 0.0022071113962738309 +3149 6 6.175666 0.17566585540771484 0.030858492756124178 +3150 6 6.9550066 0.95500659942626953 0.91203760494772723 +3152 6 6.06551075 0.065510749816894531 0.0042916583415717469 +3153 6 6.341843 0.3418431282043457 0.11685672430053273 +3155 7 7.05393267 0.053932666778564453 0.0029087325458476698 +3156 5 5.629764 0.62976408004760742 0.39660279651820929 +3160 6 5.82131863 0.17868137359619141 0.031927033270221727 +3161 5 5.629764 0.62976408004760742 0.39660279651820929 +3163 7 7.06213474 0.062134742736816406 0.0038607262549703592 +3165 6 5.43980265 0.56019735336303711 0.31382107471495146 +3169 6 6.016192 0.016191959381103516 0.00026217954859930614 +3170 6 6.274177 0.27417707443237305 0.07517306814429503 +3171 6 6.243532 0.24353218078613281 0.059307923078449676 +3180 6 6.34757662 0.34757661819458008 0.1208095055155809 +3184 7 6.41739655 0.58260345458984375 0.33942678530002013 +3185 6 6.49914455 0.49914455413818359 0.24914528592580609 +3186 4 5.41402626 1.4140262603759766 1.9994702650328691 +3187 7 6.36057663 0.63942337036132813 0.40886224656424019 +3188 8 6.252697 1.7473030090332031 3.0530678053764859 +3191 6 6.047302 0.047301769256591797 0.0022374573748038529 +3194 5 5.340684 0.34068393707275391 0.11606554497939214 +3196 7 6.3920126 0.60798740386962891 0.36964868326413125 +3198 7 6.3920126 0.60798740386962891 0.36964868326413125 +3202 7 6.708888 0.29111194610595703 0.084746165165597631 +3203 7 6.3920126 0.60798740386962891 0.36964868326413125 +3205 7 6.96342325 0.036576747894287109 0.0013378584865222365 +3207 6 6.063226 0.063226222991943359 0.0039975552738269471 +3210 5 5.12971735 0.12971735000610352 0.016826590892605964 +3213 6 5.94969034 0.050309658050537109 0.0025310616931619734 +3214 6 6.1900773 0.19007730484008789 0.036129381815271699 +3219 7 6.91940975 0.080590248107910156 0.0064947880900945165 +3221 6 6.66447926 0.66447925567626953 0.44153268122408917 +3222 6 6.301735 0.30173492431640625 0.091043964552227408 +3223 6 6.180912 0.18091201782226563 0.032729158192523755 +3226 6 6.033703 0.033702850341796875 0.0011358821211615577 +3227 6 5.27611446 0.72388553619384766 0.52401026951065433 +3232 5 6.434669 1.434669017791748 2.0582751906115391 +3236 6 6.92699432 0.92699432373046875 0.8593184762285091 +3239 7 6.684847 0.31515312194824219 0.099321490273723612 +3240 6 6.14441633 0.14441633224487305 0.020856077019061559 +3241 7 6.31036854 0.68963146209716797 0.47559155351427762 +3242 6 6.469078 0.46907806396484375 0.22003423009300604 +3244 7 6.741383 0.25861692428588867 0.066882713527093074 +3246 6 6.53103065 0.53103065490722656 0.28199355645119795 +3247 6 6.181634 0.18163394927978516 0.032990891530971567 +3248 7 6.287761 0.71223878860473633 0.50728409199314228 +3251 6 5.55754375 0.44245624542236328 0.19576752911325457 +3252 8 6.597662 1.4023380279541016 1.9665519446461985 +3253 8 6.34131336 1.658686637878418 2.7512413626764101 +3255 6 6.1782856 0.17828559875488281 0.031785754723387072 +3256 6 6.1782856 0.17828559875488281 0.031785754723387072 +3258 6 6.1782856 0.17828559875488281 0.031785754723387072 +3263 8 6.55796432 1.4420356750488281 2.0794668881135294 +3264 6 4.65063143 1.3493685722351074 1.8207955437358123 +3266 6 6.52961636 0.52961635589599609 0.2804934844325544 +3267 6 5.60741472 0.39258527755737305 0.15412320015479963 +3269 5 5.20599842 0.20599842071533203 0.042435349337210937 +3271 7 6.82550669 0.17449331283569336 0.030447916224375149 +3272 7 5.845716 1.1542840003967285 1.3323715535718748 +3273 7 6.585916 0.41408395767211914 0.17146552400140536 +3274 5 6.55339956 1.5533995628356934 2.4130502018181232 +3275 4 5.209161 1.2091608047485352 1.4620698517401252 +3277 7 5.775679 1.2243208885192871 1.4989616380646567 +3278 5 5.20599842 0.20599842071533203 0.042435349337210937 +3281 6 6.54781961 0.54781961441040039 0.30010632993275976 +3282 7 6.30941963 0.69058036804199219 0.47690124472501338 +3283 6 6.47506571 0.47506570816040039 0.22568742706994271 +3284 6 6.076994 0.076993942260742188 0.0059280671448505018 +3287 7 6.56880236 0.4311976432800293 0.18593140757025139 +3288 6 6.47506571 0.47506570816040039 0.22568742706994271 +3290 5 5.51041555 0.51041555404663086 0.26052403781272915 +3293 7 6.16678238 0.83321762084960938 0.6942516036942834 +3295 5 5.39381552 0.39381551742553711 0.15509066176514352 +3296 5 5.47942972 0.47942972183227539 0.22985285817617296 +3297 5 5.28573465 0.28573465347290039 0.081644292195278467 +3298 6 6.50759029 0.50759029388427734 0.25764790644552704 +3299 7 6.7499404 0.25005960464477539 0.062529805875101374 +3300 5 5.51041555 0.51041555404663086 0.26052403781272915 +3302 6 6.70693874 0.70693874359130859 0.49976238719045796 +3303 7 6.506652 0.49334812164306641 0.24339236912874185 +3305 7 6.431296 0.56870412826538086 0.32342438550608676 +3306 7 6.60756159 0.39243841171264648 0.15400790698754463 +3308 6 5.94220924 0.057790756225585938 0.0033397715051250998 +3309 7 7.01701355 0.0170135498046875 0.00028946087695658207 +3310 7 6.482798 0.51720190048217773 0.26749780586237648 +3311 7 6.162655 0.83734512329101563 0.70114685549924616 +3313 7 5.716633 1.2833671569824219 1.6470312596211443 +3314 6 4.96552658 1.0344734191894531 1.070135255009518 +3316 6 6.66608953 0.66608953475952148 0.44367526831615578 +3317 6 6.324064 0.32406377792358398 0.10501733216210596 +3318 7 6.45378256 0.54621744155883789 0.29835349346308249 +3319 5 6.07571745 1.0757174491882324 1.1571680304880374 +3321 6 7.0864 1.086400032043457 1.1802650296240245 +3323 6 6.006462 0.00646209716796875 4.1758699808269739E-05 +3326 5 5.880373 0.88037300109863281 0.77505662106341333 +3328 5 6.10443 1.1044301986694336 1.2197660637330046 +3330 6 5.89951468 0.10048532485961914 0.010097300512143192 +3332 7 6.57549572 0.42450428009033203 0.18020388381501107 +3333 6 5.77693367 0.22306632995605469 0.049758587560063461 +3335 6 5.480915 0.51908493041992188 0.26944916498905513 +3336 6 5.480915 0.51908493041992188 0.26944916498905513 +3337 6 5.480915 0.51908493041992188 0.26944916498905513 +3342 5 6.37601328 1.3760132789611816 1.8934125438775027 +3343 7 5.399277 1.6007227897644043 2.5623134496711373 +3344 6 5.480915 0.51908493041992188 0.26944916498905513 +3346 6 6.18561268 0.18561267852783203 0.034452066430276318 +3347 6 5.61463 0.38536977767944336 0.1485098655487036 +3351 6 6.587807 0.58780717849731445 0.34551727909297369 +3355 6 6.764193 0.76419305801391602 0.58399102991666041 +3356 6 5.75061131 0.24938869476318359 0.062194721075684356 +3357 7 6.187659 0.81234121322631836 0.65989824670600683 +3359 6 6.55126047 0.55126047134399414 0.30388810726640259 +3361 6 6.112465 0.11246490478515625 0.012648354808334261 +3363 6 6.587807 0.58780717849731445 0.34551727909297369 +3365 7 6.378836 0.62116384506225586 0.3858445224125262 +3366 6 6.07021 0.070209980010986328 0.0049294412931430998 +3369 7 6.64197254 0.35802745819091797 0.12818366081864951 +3370 6 6.12879467 0.12879467010498047 0.01658806704745075 +3371 6 6.07021 0.070209980010986328 0.0049294412931430998 +3372 6 5.995269 0.0047311782836914063 2.2384047952073161E-05 +3376 6 5.968429 0.031570911407470703 0.00099672244709836377 +3382 7 6.80490828 0.19509172439575195 0.038060780927708038 +3383 6 6.54890728 0.54890727996826172 0.30129920200215565 +3384 6 5.939944 0.060056209564208984 0.0036067483072201867 +3387 5 5.34240532 0.34240531921386719 0.11724140262595029 +3389 7 6.63416529 0.36583471298217773 0.13383503722275236 +3390 6 6.90913439 0.9091343879699707 0.82652533538953321 +3397 6 5.771987 0.22801303863525391 0.051989945787681791 +3399 6 6.254692 0.25469207763671875 0.064868054410908371 +3400 6 5.488096 0.51190376281738281 0.26204546238659532 +3401 5 6.17827 1.1782698631286621 1.3883198703572361 +3405 6 5.978143 0.021856784820556641 0.00047771904269211518 +3406 6 6.254692 0.25469207763671875 0.064868054410908371 +3408 6 5.355218 0.64478206634521484 0.41574391308040504 +3409 3 6.249504 3.2495040893554688 10.559276826737914 +3411 6 6.2559967 0.2559967041015625 0.065534312510862947 +3414 7 6.424868 0.57513189315795898 0.33077669452745795 +3416 6 5.658931 0.34106922149658203 0.11632821385228453 +3422 8 6.920657 1.0793428421020508 1.1649809707969325 +3423 5 5.87612247 0.87612247467041016 0.76759059062260349 +3425 6 5.945171 0.054829120635986328 0.0030062324697155418 +3431 6 5.9485817 0.051418304443359375 0.0026438420318299904 +3435 6 6.27855062 0.27855062484741211 0.07759045060288372 +3437 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3439 5 5.03034163 0.030341625213623047 0.0009206142206039658 +3442 7 6.433718 0.56628179550170898 0.32067507191663935 +3450 7 6.13693428 0.86306571960449219 0.74488243635641993 +3451 7 6.13693428 0.86306571960449219 0.74488243635641993 +3452 5 5.50814629 0.50814628601074219 0.258212647986511 +3454 5 5.78949451 0.78949451446533203 0.62330158837085037 +3455 6 6.10091829 0.10091829299926758 0.010184501861886019 +3456 5 5.165694 0.16569423675537109 0.027454580093944969 +3457 7 6.41468048 0.58531951904296875 0.34259893937269226 +3458 7 7.00273228 0.0027322769165039063 7.4653371484600939E-06 +3459 6 5.586149 0.41385078430175781 0.17127247166718007 +3461 8 5.846415 2.1535849571228027 4.6379281675456241 +3463 7 6.44663429 0.55336570739746094 0.30621360612349235 +3465 6 6.514682 0.51468181610107422 0.26489737182509998 +3467 5 5.617366 0.61736583709716797 0.38114057681468694 +3470 8 5.846415 2.1535849571228027 4.6379281675456241 +3472 6 6.150368 0.15036821365356445 0.022610599677364007 +3473 8 7.01380634 0.98619365692138672 0.97257792895197781 +3475 6 5.450064 0.54993581771850586 0.3024294036097217 +3477 7 5.99216938 1.0078306198120117 1.0157225582306637 +3478 6 5.450064 0.54993581771850586 0.3024294036097217 +3480 8 7.01380634 0.98619365692138672 0.97257792895197781 +3481 5 5.58673239 0.58673238754272461 0.34425489459158598 +3482 8 7.08236551 0.91763448715209961 0.84205305201089686 +3483 7 6.701889 0.2981109619140625 0.088870145613327622 +3484 8 7.058996 0.94100379943847656 0.88548815055764862 +3487 6 5.8508 0.1491999626159668 0.02226062884460589 +3488 6 5.71093845 0.28906154632568359 0.083556577564195322 +3490 7 5.99216938 1.0078306198120117 1.0157225582306637 +3491 6 5.7541585 0.24584150314331055 0.060438044667762369 +3493 7 6.74980736 0.25019264221191406 0.062596358216978842 +3494 6 6.46438169 0.46438169479370117 0.21565035845947023 +3497 6 6.36502266 0.36502265930175781 0.13324154180372716 +3500 7 6.74980736 0.25019264221191406 0.062596358216978842 +3502 5 5.36248827 0.3624882698059082 0.1313977457468809 +3503 7 6.881829 0.11817121505737305 0.01396443606813591 +3504 7 6.456562 0.54343795776367188 0.29532481393835042 +3506 6 6.33520365 0.33520364761352539 0.11236148537341251 +3507 7 7.048058 0.048058032989501953 0.002309574534820058 +3511 7 6.360972 0.63902807235717773 0.40835687726053038 +3513 6 6.1044445 0.10444450378417969 0.010908654370723525 +3516 7 7.216322 0.21632194519042969 0.046795183970971266 +3517 7 6.28893232 0.71106767654418945 0.50561724062595204 +3518 5 5.6771 0.67710018157958984 0.45846465589511354 +3519 7 6.63483524 0.36516475677490234 0.13334529959047359 +3520 5 4.63872862 0.36127138137817383 0.13051701100289392 +3522 5 5.43848848 0.43848848342895508 0.19227215009982501 +3523 5 4.63872862 0.36127138137817383 0.13051701100289392 +3526 6 5.771936 0.22806406021118164 0.052013215560009485 +3527 6 5.60652447 0.39347553253173828 0.15482299470113503 +3528 4 4.22449064 0.22449064254760742 0.050396048591437648 +3529 7 6.925511 0.074489116668701172 0.0055486285020833748 +3531 5 5.419897 0.41989707946777344 0.17631355734556564 +3532 6 6.31524754 0.31524753570556641 0.099381008768432366 +3533 6 5.39744234 0.60255765914916992 0.36307573259932724 +3536 6 6.21340227 0.21340227127075195 0.045540529383515604 +3537 5 5.512594 0.51259422302246094 0.26275283747600042 +3541 6 6.600255 0.60025501251220703 0.36030608004602982 +3542 6 5.77705956 0.22294044494628906 0.049702441992849344 +3543 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3544 6 6.003667 0.0036668777465820313 1.3445992408378515E-05 +3546 6 5.77705956 0.22294044494628906 0.049702441992849344 +3547 6 6.06106949 0.061069488525390625 0.0037294824287528172 +3551 6 5.96327829 0.036721706390380859 0.0013484837202213384 +3555 6 5.940423 0.059576988220214844 0.0035494175253916183 +3560 6 5.945829 0.054171085357666016 0.0029345064888275374 +3564 6 5.945829 0.054171085357666016 0.0029345064888275374 +3566 6 5.766171 0.23382902145385742 0.054676011274068514 +3567 6 6.155753 0.15575313568115234 0.024259039274511451 +3568 7 6.18249464 0.8175053596496582 0.66831501305591701 +3572 6 5.766171 0.23382902145385742 0.054676011274068514 +3573 6 6.43890572 0.43890571594238281 0.19263822748689563 +3574 6 5.84190035 0.15809965133666992 0.024995499752776595 +3576 5 5.53407145 0.53407144546508789 0.28523230886116835 +3577 7 6.537883 0.46211719512939453 0.2135523020342589 +3578 4 5.00972128 1.0097212791442871 1.0195370615567754 +3579 7 6.75660372 0.24339628219604492 0.059241750186856734 +3580 5 5.873912 0.87391185760498047 0.76372193486258766 +3581 7 6.92469168 0.075308322906494141 0.0056713434989887901 +3582 6 6.65167 0.65166997909545898 0.42467376165427595 +3585 7 5.9642787 1.0357213020324707 1.0727186154838364 +3588 6 5.67989063 0.32010936737060547 0.10247000707840925 +3589 6 5.67989063 0.32010936737060547 0.10247000707840925 +3590 7 6.14944029 0.85055971145629883 0.72345182275262232 +3591 5 5.725536 0.72553586959838867 0.52640229807389005 +3593 7 6.46629429 0.53370571136474609 0.28484178634334967 +3594 7 6.41927671 0.58072328567504883 0.33723953452522437 +3595 7 6.160583 0.8394169807434082 0.70462086756037934 +3596 7 6.45985126 0.54014873504638672 0.29176065597221168 +3597 6 5.80583334 0.19416666030883789 0.037700691975487644 +3601 7 6.27083 0.72916984558105469 0.53168866370469914 +3602 6 6.525956 0.52595615386962891 0.27662987579333276 +3603 7 7.042205 0.042204856872558594 0.0017812499436331564 +3604 6 6.36735773 0.36735773086547852 0.13495170242663335 +3606 5 5.287236 0.28723621368408203 0.082504642451567634 +3608 6 6.211688 0.21168804168701172 0.044811826993282011 +3609 6 6.211688 0.21168804168701172 0.044811826993282011 +3610 5 5.13587236 0.13587236404418945 0.018461299310956747 +3611 6 6.12487125 0.12487125396728516 0.015592830067362229 +3612 6 6.04896259 0.048962593078613281 0.0023973355209818692 +3617 5 5.854528 0.85452795028686523 0.73021801782147122 +3618 7 5.47124434 1.5287556648254395 2.3370938827358714 +3619 6 5.60418129 0.39581871032714844 0.15667245144504705 +3621 7 5.47124434 1.5287556648254395 2.3370938827358714 +3623 6 5.60418129 0.39581871032714844 0.15667245144504705 +3624 7 6.501575 0.49842500686645508 0.24842748746982579 +3626 5 5.854528 0.85452795028686523 0.73021801782147122 +3630 6 5.904811 0.095189094543457031 0.0090609637200032012 +3632 6 5.92054844 0.079451560974121094 0.006312550541224482 +3633 6 5.904811 0.095189094543457031 0.0090609637200032012 +3634 7 6.57682848 0.4231715202331543 0.17907413553643892 +3636 7 5.96985435 1.0301456451416016 1.0612000502042065 +3641 6 5.971013 0.028986930847167969 0.00084024215993849793 +3642 6 5.971013 0.028986930847167969 0.00084024215993849793 +3644 7 5.678783 1.3212170600891113 1.7456145198705144 +3648 5 5.74037838 0.74037837982177734 0.54816014530752 +3649 6 6.519111 0.51911115646362305 0.26947639276500013 +3651 6 5.12625 0.87375020980834961 0.76343942914013496 +3654 6 6.135282 0.13528203964233398 0.018301230249790024 +3657 8 5.38427353 2.6157264709472656 6.8420249708142364 +3659 8 6.844641 1.1553587913513184 1.3348539367527792 +3662 4 4.4436326 0.44363260269165039 0.19680988617096773 +3663 6 6.863979 0.86397886276245117 0.74645947530029844 +3664 8 6.80742931 1.192570686340332 1.4222248419182506 +3665 8 6.844641 1.1553587913513184 1.3348539367527792 +3666 7 5.95530224 1.0446977615356445 1.0913934129575864 +3667 8 7.26183653 0.73816347122192383 0.54488531024639997 +3669 7 6.904336 0.095664024353027344 0.0091516055554166087 +3670 6 5.6326046 0.36739540100097656 0.13497938067666837 +3671 7 6.716537 0.2834630012512207 0.08035127307834955 +3672 8 6.25013828 1.7498617172241211 3.0620160294065499 +3673 7 6.419122 0.58087778091430664 0.33741899635992922 +3674 5 5.183054 0.18305397033691406 0.033508756056107813 +3675 6 5.74832344 0.25167655944824219 0.063341090575704584 +3676 7 6.419122 0.58087778091430664 0.33741899635992922 +3678 5 5.605777 0.60577678680419922 0.36696551543082023 +3682 7 6.35266447 0.64733552932739258 0.41904328752957554 +3683 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3685 6 5.90138865 0.098611354827880859 0.0097241993009902217 +3686 5 4.976153 0.023847103118896484 0.00056868432716328243 +3689 8 7.283064 0.71693611145019531 0.51399738790132687 +3690 7 6.09959555 0.90040445327758789 0.81072817948211195 +3691 6 6.28709745 0.28709745407104492 0.082424948134075748 +3692 7 6.131696 0.86830377578735352 0.75395144704657469 +3693 7 7.00987864 0.0098786354064941406 9.7587437494439655E-05 +3694 5 5.605777 0.60577678680419922 0.36696551543082023 +3695 6 6.348696 0.34869623184204102 0.12158906210083842 +3696 7 6.35266447 0.64733552932739258 0.41904328752957554 +3700 5 5.18188858 0.18188858032226563 0.033083455651649274 +3701 5 5.09758472 0.097584724426269531 0.0095227784413509653 +3705 6 5.87677574 0.12322425842285156 0.015184217863861704 +3707 6 6.29291725 0.29291725158691406 0.085800516277231509 +3708 5 4.619965 0.3800349235534668 0.14442654312028935 +3709 5 5.35854626 0.35854625701904297 0.12855541842236562 +3710 5 4.773655 0.22634506225585938 0.051232087207608856 +3711 6 5.87677574 0.12322425842285156 0.015184217863861704 +3712 5 5.613295 0.61329507827758789 0.37613085303951266 +3713 5 4.951788 0.048212051391601563 0.0023244018993864302 +3715 6 5.41483 0.58516979217529297 0.34242368567447556 +3717 6 5.635741 0.36425876617431641 0.13268444873483531 +3719 5 5.69777346 0.69777345657348633 0.48688779669851101 +3722 5 5.10440445 0.10440444946289063 0.010900289067649283 +3725 6 6.60588837 0.60588836669921875 0.36710071290144697 +3726 7 6.394304 0.60569620132446289 0.36686788829888428 +3727 7 6.48175955 0.51824045181274414 0.26857316589507718 +3729 5 5.45680952 0.45680952072143555 0.20867493822174765 +3732 5 5.45680952 0.45680952072143555 0.20867493822174765 +3736 4 6.64277124 2.6427712440490723 6.9842398483726811 +3737 5 5.82993937 0.82993936538696289 0.6887993502189147 +3740 7 6.85790253 0.14209747314453125 0.02019169187406078 +3742 7 6.85790253 0.14209747314453125 0.02019169187406078 +3743 7 6.85790253 0.14209747314453125 0.02019169187406078 +3746 5 6.410911 1.4109110832214355 1.9906700847570846 +3747 6 5.903495 0.096505165100097656 0.0093132468909971067 +3751 5 5.30141163 0.30141162872314453 0.090848969929538725 +3752 5 5.49193048 0.49193048477172852 0.24199560184774782 +3754 8 7.51627445 0.48372554779052734 0.23399040558524575 +3755 6 6.62061739 0.62061738967895508 0.38516594437191998 +3756 5 5.30141163 0.30141162872314453 0.090848969929538725 +3758 5 5.33939171 0.33939170837402344 0.11518673171303817 +3760 6 6.52007627 0.52007627487182617 0.27047933168455529 +3761 7 6.4862113 0.51378870010375977 0.26397882835431119 +3763 5 6.282187 1.2821869850158691 1.6440034645440846 +3765 5 5.128152 0.12815189361572266 0.016422907837295497 +3768 6 5.7956624 0.20433759689331055 0.041753853504133076 +3770 4 6.34593534 2.3459353446960449 5.5034126414941511 +3773 5 5.937312 0.93731212615966797 0.87855402184595732 +3774 5 5.42767525 0.42767524719238281 0.18290611706106574 +3775 6 6.66805124 0.66805124282836914 0.44629246304452863 +3777 6 6.66805124 0.66805124282836914 0.44629246304452863 +3780 5 5.42767525 0.42767524719238281 0.18290611706106574 +3781 6 6.38605833 0.38605833053588867 0.14904103457615747 +3783 5 5.32522774 0.32522773742675781 0.10577308119172812 +3784 6 5.75775862 0.24224138259887695 0.058680887443415486 +3787 5 5.47676039 0.4767603874206543 0.22730046701349238 +3788 5 5.52795649 0.52795648574829102 0.27873805084368541 +3789 6 5.364557 0.63544321060180664 0.40378807389993199 +3791 5 5.39469528 0.39469528198242188 0.15578436561918352 +3792 6 5.909566 0.090434074401855469 0.0081783218129203306 +3793 6 5.29336739 0.70663261413574219 0.49932965136031271 +3798 5 5.59243059 0.59243059158325195 0.35097400584368188 +3800 5 5.20580673 0.20580673217773438 0.042356411009677686 +3801 6 5.628341 0.3716588020324707 0.13813026512821125 +3805 6 5.628341 0.3716588020324707 0.13813026512821125 +3808 6 5.647771 0.35222911834716797 0.12406535181162326 +3809 6 5.84592 0.15407991409301758 0.023740619926911677 +3815 7 6.376214 0.62378597259521484 0.38910893960655812 +3820 5 5.81555 0.81554985046386719 0.66512155859163613 +3821 6 6.02812147 0.028121471405029297 0.00079081715398388042 +3823 5 5.43096447 0.43096446990966797 0.18573037432452111 +3824 7 6.106088 0.89391183853149414 0.79907837506675605 +3830 7 5.819285 1.1807150840759277 1.3940881097644251 +3833 6 5.623856 0.3761439323425293 0.14148425783810126 +3834 5 5.299482 0.29948186874389648 0.089689389706336442 +3838 5 5.299482 0.29948186874389648 0.089689389706336442 +3839 5 5.062541 0.062541007995605469 0.0039113776811063872 +3841 6 6.151886 0.151885986328125 0.023069352842867374 +3843 7 6.883123 0.11687707901000977 0.013660251597912065 +3848 6 5.52939653 0.47060346603393555 0.22146762224315353 +3850 6 6.316198 0.31619787216186523 0.099981094359691269 +3853 7 7.27425861 0.27425861358642578 0.075217787126348412 +3854 6 7.09188 1.0918798446655273 1.1922015951868161 +3855 6 6.427566 0.4275660514831543 0.18281272838089535 +3860 5 5.274571 0.27457094192504883 0.075389202149608536 +3862 6 5.437691 0.56230878829956055 0.31619117339892 +3863 6 5.437691 0.56230878829956055 0.31619117339892 +3866 6 5.87392473 0.12607526779174805 0.015894973148760982 +3869 6 5.405648 0.59435176849365234 0.35325402471153211 +3870 6 5.75473547 0.24526453018188477 0.060154689765340663 +3872 4 5.027593 1.0275931358337402 1.0559476528126197 +3875 7 6.12440825 0.87559175491333008 0.76666092127220509 +3876 5 5.308399 0.30839920043945313 0.095110066831693985 +3886 6 6.642862 0.64286184310913086 0.41327134932566878 +3888 6 5.67370367 0.32629632949829102 0.1064692946440573 +3889 6 5.64668274 0.3533172607421875 0.12483308673836291 +3891 5 5.865996 0.86599588394165039 0.74994887100388041 +3893 5 4.624341 0.37565898895263672 0.14111967598091724 +3894 6 6.324618 0.32461786270141602 0.10537675678483538 +3897 6 6.015486 0.015485763549804688 0.00023980887272045948 +3900 5 4.624341 0.37565898895263672 0.14111967598091724 +3903 6 6.194684 0.19468402862548828 0.037901871001849941 +3904 7 6.61869669 0.38130331039428711 0.14539221451764206 +3907 7 6.946438 0.053562164306640625 0.002868905445211567 +3912 7 7.01307535 0.013075351715087891 0.00017096482247325184 +3916 6 6.58867741 0.58867740631103516 0.34654108870108757 +3918 7 6.268551 0.73144912719726563 0.53501782567764167 +3919 6 6.237363 0.23736286163330078 0.056341128082749492 +3921 5 5.30553961 0.30553960800170898 0.093354452057837989 +3924 5 4.881786 0.11821413040161133 0.013974580626609168 +3929 5 5.26826143 0.26826143264770508 0.071964196246199208 +3934 6 6.38188839 0.38188838958740234 0.14583874210165959 +3935 5 5.359629 0.35962915420532227 0.12933312855443546 +3938 6 6.10134935 0.1013493537902832 0.010271691513707992 +3939 6 6.249502 0.24950218200683594 0.062251338826172287 +3948 5 5.736434 0.73643398284912109 0.54233501109501958 +3955 6 5.976232 0.023767948150634766 0.00056491535929126258 +3957 5 6.780936 1.7809357643127441 3.1717321966082181 +3958 6 5.82819653 0.17180347442626953 0.029516433824937849 +3961 5 4.857042 0.14295816421508789 0.020437036715748036 +3964 5 5.03904772 0.039047718048095703 0.0015247242847635789 +3966 6 5.764548 0.23545217514038086 0.055437726778336582 +3968 6 5.10690451 0.89309549331665039 0.79761956018251112 +3969 6 6.148906 0.14890623092651367 0.022173065608740217 +3971 6 6.148906 0.14890623092651367 0.022173065608740217 +3972 6 5.454913 0.54508686065673828 0.29711968566061842 +3974 6 5.10690451 0.89309549331665039 0.79761956018251112 +3975 7 6.77839375 0.22160625457763672 0.049109332067928335 +3976 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3977 6 6.793038 0.79303789138793945 0.62890909717702925 +3979 6 6.155224 0.15522384643554688 0.024094442502246238 +3980 5 5.886582 0.8865818977355957 0.78602746139245028 +3981 7 6.80097628 0.19902372360229492 0.039610442556522685 +3983 6 5.608051 0.39194917678833008 0.15362415718504963 +3984 7 6.95185852 0.0481414794921875 0.0023176020476967096 +3986 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3987 6 5.70724154 0.29275846481323242 0.085707518719800646 +3988 6 5.9042244 0.095775604248046875 0.0091729663690784946 +3989 6 5.92710543 0.072894573211669922 0.0053136188037115062 +3991 5 5.926727 0.9267268180847168 0.85882259535742378 +3992 7 6.098081 0.90191888809204102 0.8134576806971836 +3998 6 5.93369 0.066309928894042969 0.0043970066699330346 +3999 6 5.93369 0.066309928894042969 0.0043970066699330346 +4000 6 5.93369 0.066309928894042969 0.0043970066699330346 +4001 5 5.49348354 0.49348354339599609 0.24352600760266796 +4005 6 6.2540493 0.25404930114746094 0.064541047413513297 +4007 5 5.49348354 0.49348354339599609 0.24352600760266796 +4008 6 5.61225367 0.38774633407592773 0.15034721958932096 +4012 6 5.93369 0.066309928894042969 0.0043970066699330346 +4013 6 5.200166 0.79983377456665039 0.63973406693753532 +4016 5 5.1244154 0.12441539764404297 0.015479191170925333 +4020 4 4.586666 0.58666610717773438 0.34417712131107692 +4023 6 6.271843 0.27184295654296875 0.073898593022022396 +4026 6 6.271843 0.27184295654296875 0.073898593022022396 +4028 6 6.18963432 0.18963432312011719 0.035961176505225012 +4030 5 6.190148 1.190147876739502 1.4164519685075447 +4036 5 5.464335 0.46433496475219727 0.21560695949142428 +4038 5 5.17922926 0.1792292594909668 0.032123127457680312 +4040 5 5.52691 0.52690982818603516 0.27763396703903709 +4041 5 5.26324558 0.26324558258056641 0.069298236748181807 +4042 7 6.8913846 0.10861539840698242 0.01179730477110752 +4045 7 6.8913846 0.10861539840698242 0.01179730477110752 +4046 7 6.91408825 0.085911750793457031 0.0073808289243970648 +4048 6 6.34028769 0.34028768539428711 0.11579570883100132 +4057 6 6.27755642 0.27755641937255859 0.077037565934915619 +4058 6 6.34028769 0.34028768539428711 0.11579570883100132 +4060 5 5.11373043 0.11373043060302734 0.012934610845150019 +4061 5 5.11373043 0.11373043060302734 0.012934610845150019 +4062 6 6.122509 0.12250900268554688 0.015008455739007331 +4063 5 5.579146 0.57914590835571289 0.33540998316516379 +4065 8 7.120815 0.87918519973754883 0.77296661543755363 +4067 5 5.2989316 0.29893159866333008 0.089360100679414245 +4068 6 6.5147295 0.51472949981689453 0.26494645798175043 +4069 6 5.64842272 0.3515772819519043 0.12360658518468881 +4072 7 6.107794 0.89220619201660156 0.7960318890727649 +4073 5 4.71371031 0.28628969192504883 0.081961787702539368 +4074 4 5.083258 1.0832581520080566 1.1734482238919099 +4076 5 5.92422056 0.92422056198120117 0.85418364718884732 +4077 6 6.005199 0.0051989555358886719 2.7029138664147467E-05 +4079 6 5.716552 0.28344821929931641 0.080342893023953366 +4080 6 5.704811 0.29518890380859375 0.087136488931719214 +4081 6 5.569051 0.43094921112060547 0.18571722256547218 +4083 5 4.93252039 0.067479610443115234 0.0045534978255545866 +4084 8 5.853612 2.146388053894043 4.6069816778990571 +4089 6 5.53380537 0.46619462966918945 0.2173374327323927 +4090 6 5.56470728 0.43529272079467773 0.18947975277683327 +4092 6 5.215562 0.78443813323974609 0.61534318488065765 +4093 6 5.03059769 0.96940231323242188 0.93974084490037058 +4095 6 5.03059769 0.96940231323242188 0.93974084490037058 +4098 5 6.015106 1.015106201171875 1.0304405996575952 +4104 7 6.56624937 0.43375062942504883 0.18813960852662603 +4106 5 6.116082 1.1160821914672852 1.2456394581104178 +4110 5 5.31600857 0.31600856781005859 0.0998614149293644 +4113 6 6.51928663 0.5192866325378418 0.26965860673249153 +4114 6 5.713825 0.28617477416992188 0.081896001371205784 +4115 6 5.93225 0.067749977111816406 0.0045900593986516469 +4116 6 5.14707851 0.85292148590087891 0.72747506111136317 +4117 6 5.14707851 0.85292148590087891 0.72747506111136317 +4118 8 6.23626661 1.7637333869934082 3.1107554603952394 +4121 6 5.7118 0.28819990158081055 0.083059183271188886 +4123 6 6.95849562 0.9584956169128418 0.91871384764112918 +4124 7 6.216066 0.78393411636352539 0.61455269879866137 +4127 5 5.599305 0.59930515289306641 0.3591666662841817 +4129 7 5.934724 1.0652761459350586 1.1348132670982523 +4130 6 5.946668 0.053331851959228516 0.0028442864334010665 +4135 5 6.103442 1.1034421920776367 1.2175846712571001 +4142 6 6.252783 0.25278282165527344 0.063899154924001778 +4144 6 5.86206245 0.13793754577636719 0.019026766534807393 +4145 6 5.94314146 0.056858539581298828 0.0032328935233181255 +4146 7 5.79053 1.2094697952270508 1.4628171855665641 +4148 6 5.52015257 0.47984743118286133 0.23025355721279084 +4153 5 5.20253658 0.20253658294677734 0.041021067431756819 +4156 5 5.38787365 0.38787364959716797 0.15044596805182664 +4157 7 6.977525 0.022474765777587891 0.00050511509675743582 +4158 7 6.977525 0.022474765777587891 0.00050511509675743582 +4161 7 6.977525 0.022474765777587891 0.00050511509675743582 +4164 5 5.730478 0.73047780990600586 0.53359783076507483 +4167 8 6.453016 1.5469841957092285 2.3931601017741286 +4172 6 6.139005 0.13900518417358398 0.019322441227132003 +4173 5 5.60594034 0.60594034194946289 0.36716369800183202 +4175 7 6.018053 0.98194694519042969 0.96421980316881672 +4176 6 6.32258368 0.32258367538452148 0.10406022762458633 +4182 6 5.23854876 0.76145124435424805 0.57980799752863277 +4183 7 6.72853756 0.27146244049072266 0.073691856597179139 +4185 5 5.278079 0.27807903289794922 0.077327948537458724 +4190 6 5.69684839 0.30315160751342773 0.091900897137975335 +4191 5 5.73005342 0.73005342483520508 0.53297800311361243 +4192 6 5.830771 0.16922903060913086 0.028638464800906149 +4193 6 6.13968849 0.13968849182128906 0.019512874747306341 +4194 6 5.830771 0.16922903060913086 0.028638464800906149 +4197 5 5.29363 0.29363012313842773 0.086218649214288234 +4198 5 5.067099 0.067099094390869141 0.0045022884680747666 +4200 6 6.08601665 0.086016654968261719 0.0073988649319289834 +4201 6 6.131825 0.13182497024536133 0.017377822780190399 +4202 6 6.68126154 0.68126153945922852 0.46411728514635797 +4204 6 5.799505 0.20049476623535156 0.040198151287768269 +4209 6 6.531081 0.53108119964599609 0.28204724061743036 +4214 5 5.212247 0.21224689483642578 0.045048744367704785 +4216 5 5.212247 0.21224689483642578 0.045048744367704785 +4217 4 5.07387161 1.0738716125488281 1.1532002402382204 +4219 5 5.212247 0.21224689483642578 0.045048744367704785 +4220 6 6.067357 0.067357063293457031 0.0045369739755187766 +4224 7 6.365413 0.63458681106567383 0.40270042077850121 +4226 7 5.527336 1.4726638793945313 2.1687389016733505 +4232 6 6.64348555 0.64348554611206055 0.4140736480551368 +4234 6 5.63266134 0.36733865737915039 0.13493768920511684 +4238 5 5.22960567 0.22960567474365234 0.052718765874487872 +4239 7 6.749726 0.2502741813659668 0.062637165858404842 +4242 7 6.697168 0.30283212661743164 0.091707296911636149 +4243 6 6.37470675 0.37470674514770508 0.1404051448591872 +4245 5 5.29424858 0.29424858093261719 0.086582227380858967 +4246 6 6.760518 0.76051807403564453 0.5783877409348861 +4247 6 5.40436745 0.59563255310058594 0.35477813831312233 +4248 6 5.580484 0.41951608657836914 0.17599374689802971 +4250 6 5.488685 0.51131486892700195 0.26144289518583719 +4252 6 5.488685 0.51131486892700195 0.26144289518583719 +4255 5 5.07407 0.074069976806640625 0.0054863614641362801 +4258 6 5.98729753 0.012702465057373047 0.00016135261853378324 +4259 6 6.60455 0.60454988479614258 0.36548056320702926 +4264 6 6.177701 0.17770099639892578 0.031577644121171033 +4265 6 5.908764 0.091236114501953125 0.0083240285894135013 +4267 7 6.820651 0.17934894561767578 0.032166044294172025 +4269 5 5.326494 0.32649421691894531 0.10659847368151532 +4270 6 5.813092 0.18690776824951172 0.034934513832013181 +4273 6 5.918317 0.081683158874511719 0.0066721384437187226 +4276 7 7.633585 0.63358497619628906 0.40142992206165218 +4277 5 5.82106733 0.82106733322143555 0.67415156568335988 +4280 6 5.918317 0.081683158874511719 0.0066721384437187226 +4282 5 5.33614159 0.33614158630371094 0.11299116604277515 +4283 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4284 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4285 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4286 6 6.0341835 0.034183502197265625 0.0011685118224704638 +4287 5 5.39428425 0.39428424835205078 0.15546006849854166 +4289 6 5.64777946 0.35222053527832031 0.12405930547174648 +4290 5 5.33614159 0.33614158630371094 0.11299116604277515 +4293 5 5.299876 0.29987621307373047 0.089925743167441397 +4294 5 6.0532794 1.0532793998718262 1.1093974941943543 +4296 6 6.14942265 0.14942264556884766 0.022327127008793468 +4298 6 6.638621 0.63862085342407227 0.40783659442809039 +4299 6 5.2250433 0.77495670318603516 0.60055789181296859 +4302 6 5.51465559 0.48534440994262695 0.23555919626255672 +4303 6 6.4400897 0.44008970260620117 0.19367894634001459 +4305 6 5.619583 0.3804168701171875 0.1447169950697571 +4309 6 6.74624825 0.74624824523925781 0.55688644352267147 +4312 6 6.4400897 0.44008970260620117 0.19367894634001459 +4313 6 6.62467575 0.62467575073242188 0.39021979355311487 +4316 5 4.71171951 0.28828048706054688 0.083105639219866134 +4317 7 7.19724035 0.19724035263061523 0.038903756705849446 +4320 5 5.338316 0.33831596374511719 0.11445769132478745 +4321 6 5.84775972 0.15224027633666992 0.02317710173906562 +4326 5 5.14266634 0.14266633987426758 0.020353684533120031 +4328 5 5.84332 0.84331989288330078 0.7111884417327019 +4329 5 5.784898 0.78489780426025391 0.61606456313256786 +4330 5 5.43720341 0.43720340728759766 0.191146819343885 +4332 8 7.57545471 0.4245452880859375 0.18023870163597167 +4333 8 7.57545471 0.4245452880859375 0.18023870163597167 +4334 8 7.57545471 0.4245452880859375 0.18023870163597167 +4335 8 7.57545471 0.4245452880859375 0.18023870163597167 +4337 8 7.57545471 0.4245452880859375 0.18023870163597167 +4340 8 7.57545471 0.4245452880859375 0.18023870163597167 +4341 6 5.22670174 0.77329826354980469 0.59799020440914319 +4343 6 6.110325 0.11032485961914063 0.012171574649983086 +4349 5 4.938276 0.061724185943603516 0.0038098751304005418 +4351 6 6.868826 0.86882591247558594 0.75485846618903452 +4352 5 5.5040555 0.50405550003051758 0.25407194711101511 +4353 6 5.86647367 0.13352632522583008 0.017829279528314146 +4354 6 6.25179052 0.25179052352905273 0.063398467739034459 +4355 6 6.868826 0.86882591247558594 0.75485846618903452 +4358 5 5.730952 0.73095178604125977 0.53429051351690759 +4361 6 6.518792 0.51879215240478516 0.26914529739678983 +4362 6 6.90053844 0.90053844451904297 0.81096949005677743 +4363 5 5.40533924 0.40533924102783203 0.16429990031701891 +4365 5 5.36372948 0.36372947692871094 0.13229913238683366 +4366 6 6.705825 0.70582485198974609 0.49818872168634698 +4369 6 6.32576561 0.32576560974121094 0.10612323249006295 +4370 5 5.68760538 0.68760538101196289 0.47280115999660666 +4372 6 6.074046 0.074046134948730469 0.0054828301008456037 +4375 6 5.893817 0.10618305206298828 0.01127484054541128 +4376 5 5.17443466 0.17443466186523438 0.030427451260038652 +4378 5 5.038073 0.038073062896728516 0.0014495581183382455 +4380 6 6.3993845 0.39938449859619141 0.15950797771893122 +4382 6 5.917463 0.082537174224853516 0.0068123851290238235 +4386 6 6.25856447 0.25856447219848633 0.066855586283281809 +4388 6 5.614622 0.38537788391113281 0.14851611340782256 +4393 6 5.164492 0.83550786972045898 0.69807340036481946 +4397 5 5.397777 0.39777708053588867 0.15822660579965486 +4398 5 5.397777 0.39777708053588867 0.15822660579965486 +4399 5 5.684684 0.68468379974365234 0.46879190563140583 +4400 5 5.397777 0.39777708053588867 0.15822660579965486 +4403 5 5.706885 0.70688486099243164 0.4996862067002894 +4406 7 6.86297035 0.13702964782714844 0.018777124383632326 +4408 5 5.08429337 0.084293365478515625 0.0071053714636946097 +4410 5 5.277465 0.27746486663818359 0.076986752218545007 +4411 7 6.745393 0.25460720062255859 0.064824826608855801 +4413 7 6.745393 0.25460720062255859 0.064824826608855801 +4414 7 6.442507 0.55749320983886719 0.3107986790164432 +4415 5 4.99544764 0.0045523643493652344 2.0724021169371554E-05 +4417 6 5.8144083 0.18559169769287109 0.034444278252522054 +4418 6 5.931572 0.06842803955078125 0.004682396596763283 +4419 6 5.931572 0.06842803955078125 0.004682396596763283 +4421 6 5.931572 0.06842803955078125 0.004682396596763283 +4422 6 5.8144083 0.18559169769287109 0.034444278252522054 +4426 6 5.705164 0.29483604431152344 0.086928293025266612 +4428 6 6.468404 0.46840381622314453 0.21940213505240536 +4431 6 6.39723539 0.39723539352416992 0.15779595786830214 +4436 6 6.40647268 0.40647268295288086 0.1652200419869132 +4437 6 5.883115 0.11688518524169922 0.013662146528986341 +4439 5 5.15067148 0.15067148208618164 0.022701895514046555 +4440 5 5.1135397 0.11353969573974609 0.012891262508674117 +4442 5 5.1135397 0.11353969573974609 0.012891262508674117 +4443 5 5.15067148 0.15067148208618164 0.022701895514046555 +4445 6 6.049947 0.049946784973144531 0.0024946813291535364 +4446 6 7.41717434 1.4171743392944336 2.0083831079546144 +4447 6 6.83694124 0.83694124221801758 0.70047064292543837 +4448 5 5.7396884 0.73968839645385742 0.54713892384847895 +4449 6 5.59850836 0.40149164199829102 0.16119553859448388 +4453 6 6.83694124 0.83694124221801758 0.70047064292543837 +4455 5 5.36782932 0.36782932281494141 0.13529841072249837 +4456 5 5.36782932 0.36782932281494141 0.13529841072249837 +4457 5 5.36782932 0.36782932281494141 0.13529841072249837 +4459 5 5.74466658 0.74466657638549805 0.5545283099856988 +4460 6 6.03332043 0.033320426940917969 0.001110250851525052 +4461 6 6.06109 0.061089992523193359 0.0037319871864838206 +4462 6 6.87517548 0.87517547607421875 0.76593211392173544 +4465 5 5.08348751 0.083487510681152344 0.0069701644397355267 +4466 5 6.087393 1.0873928070068359 1.1824231167302059 +4470 6 6.019186 0.019186019897460938 0.000368103359505767 +4472 5 6.441713 1.4417128562927246 2.0785359599997264 +4473 5 5.164528 0.16452789306640625 0.02706942759687081 +4475 6 6.676889 0.67688894271850586 0.45817864077457671 +4478 5 5.13800049 0.13800048828125 0.019044134765863419 +4481 5 5.13800049 0.13800048828125 0.019044134765863419 +4482 6 6.622241 0.62224102020263672 0.38718388722281816 +4486 6 5.631071 0.36892890930175781 0.13610854011858464 +4489 6 6.71970654 0.71970653533935547 0.51797749701017892 +4491 6 6.941034 0.94103384017944336 0.88554468836287015 +4493 6 5.62146044 0.3785395622253418 0.14329220016975341 +4494 6 5.2161746 0.78382539749145508 0.61438225375263755 +4496 6 5.2161746 0.78382539749145508 0.61438225375263755 +4497 5 5.11741972 0.11741971969604492 0.01378739057349776 +4498 5 5.85148859 0.85148859024047852 0.72503281930971752 +4499 6 6.16708231 0.16708230972290039 0.027916498222339214 +4503 7 5.85099649 1.1490035057067871 1.3202090561264868 +4504 5 5.362151 0.36215114593505859 0.13115345250207611 +4507 5 6.42801046 1.4280104637145996 2.0392138844783858 +4509 5 5.371576 0.37157583236694336 0.13806859919918679 +4511 6 6.220184 0.2201838493347168 0.048480927507853266 +4512 6 6.220184 0.2201838493347168 0.048480927507853266 +4514 5 4.845057 0.15494298934936523 0.024007329948517508 +4516 6 6.39635229 0.39635229110717773 0.15709513866590896 +4517 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4520 5 5.155404 0.15540409088134766 0.024150431462658162 +4521 5 5.37260532 0.37260532379150391 0.13883472731777147 +4522 6 5.769117 0.23088312149047852 0.053307015789187062 +4526 6 5.97513342 0.024866580963134766 0.00061834684879613633 +4527 6 5.990858 0.0091419219970703125 8.3574737800518051E-05 +4528 6 4.818622 1.1813778877258301 1.395653713607544 +4530 6 5.28060865 0.7193913459777832 0.51752390866772657 +4531 6 5.28060865 0.7193913459777832 0.51752390866772657 +4532 6 6.008641 0.0086407661437988281 7.466283955182007E-05 +4533 5 5.92288446 0.92288446426391602 0.85171573437969528 +4534 6 6.12120628 0.12120628356933594 0.014690963176690275 +4535 6 5.525482 0.474517822265625 0.22516716364771128 +4536 6 5.28060865 0.7193913459777832 0.51752390866772657 +4542 5 6.20716143 1.2071614265441895 1.4572387097362025 +4543 5 6.20716143 1.2071614265441895 1.4572387097362025 +4544 6 6.543812 0.54381179809570313 0.29573127174808178 +4549 5 6.20716143 1.2071614265441895 1.4572387097362025 +4551 6 5.996477 0.0035228729248046875 1.2410633644321933E-05 +4552 6 6.598306 0.59830617904663086 0.3579702838853791 +4554 6 6.31430149 0.31430149078369141 0.098785427108850854 +4556 5 6.612007 1.6120071411132813 2.5985670230002142 +4557 6 5.471904 0.52809619903564453 0.27888559543589508 +4558 6 6.156162 0.15616178512573242 0.024386503133655424 +4561 6 6.82648325 0.82648324966430664 0.68307456197567262 +4564 7 6.24290752 0.75709247589111328 0.57318901705093595 +4565 5 6.27208471 1.2720847129821777 1.6181995170029495 +4566 5 6.538882 1.538881778717041 2.368157128867324 +4567 5 6.27208471 1.2720847129821777 1.6181995170029495 +4568 6 6.33394957 0.33394956588745117 0.11152231255641709 +4570 6 6.37727451 0.37727451324462891 0.14233605834397167 +4572 7 6.25381851 0.74618148803710938 0.5567868130892748 +4573 6 6.933242 0.93324184417724609 0.87094033972334728 +4577 6 5.9036355 0.096364498138427734 0.0092861165014710423 +4579 6 6.24599648 0.24599647521972656 0.060514265820529545 +4580 6 6.653771 0.65377092361450195 0.42741642056375895 +4583 6 5.49828339 0.50171661376953125 0.25171956053236499 +4584 6 5.967186 0.03281402587890625 0.0010767602943815291 +4585 6 6.15143728 0.15143728256225586 0.022933250549840523 +4586 6 6.189822 0.18982219696044922 0.036032466458891577 +4587 6 6.33160353 0.3316035270690918 0.1099608991646619 +4590 6 6.05400848 0.05400848388671875 0.0029169163317419589 +4593 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4596 6 6.55546 0.55545997619628906 0.30853578515598201 +4597 6 4.86262274 1.1373772621154785 1.2936270363773019 +4598 6 5.92394829 0.076051712036132813 0.0057838629036268685 +4599 7 6.113054 0.88694620132446289 0.78667356404389466 +4600 6 5.383654 0.61634588241577148 0.37988224677087601 +4602 6 5.796041 0.20395898818969727 0.041599268863365069 +4605 6 6.691703 0.69170284271240234 0.47845282261641842 +4606 5 5.867839 0.86783885955810547 0.75314428615911311 +4607 6 6.22378063 0.22378063201904297 0.050077771266842319 +4608 7 6.26591825 0.73408174514770508 0.53887600855910023 +4609 4 3.5493567 0.45064330101013184 0.20307938474530829 +4613 5 5.46949959 0.46949958801269531 0.22042986314409063 +4615 7 6.76983929 0.23016071319580078 0.052973953898799664 +4617 7 6.599219 0.40078115463256836 0.16062553390861467 +4619 5 4.840745 0.15925502777099609 0.025362163870340737 +4621 7 5.61909 1.3809099197387695 1.9069122064329349 +4623 6 6.6815424 0.68154239654541016 0.46450003828886111 +4624 6 6.745368 0.74536800384521484 0.55557346115620021 +4625 5 5.35424328 0.35424327850341797 0.12548830036485015 +4630 7 6.001225 0.99877500534057617 0.99755151129306796 +4632 6 6.16925764 0.16925764083862305 0.028648148982256316 +4635 6 5.69187737 0.30812263488769531 0.094939558130135993 +4636 5 5.49239874 0.49239873886108398 0.24245651803198598 +4639 6 5.240025 0.75997495651245117 0.57756193452610205 +4641 6 6.17320633 0.17320632934570313 0.03000043252541218 +4642 7 6.39035463 0.60964536666870117 0.3716674731006151 +4644 6 6.755946 0.75594615936279297 0.57145459585535718 +4645 7 6.61975336 0.38024663925170898 0.14458750666221931 +4647 7 6.0159874 0.98401260375976563 0.96828080435807351 +4648 5 4.8469286 0.15307140350341797 0.023430854570506199 +4650 5 4.755362 0.24463796615600586 0.059847734484947068 +4653 7 6.709774 0.29022598266601563 0.084231121014454402 +4654 7 6.45592451 0.54407548904418945 0.29601813777867392 +4655 7 6.45592451 0.54407548904418945 0.29601813777867392 +4658 6 6.760667 0.76066684722900391 0.57861405247331277 +4659 6 5.703014 0.29698610305786133 0.08820074540949463 +4660 6 6.24925375 0.24925374984741211 0.062127431812996292 +4662 6 6.67323542 0.67323541641235352 0.45324592591191504 +4663 7 6.38869667 0.61130332946777344 0.37369176061838516 +4665 6 6.67323542 0.67323541641235352 0.45324592591191504 +4666 5 5.14793062 0.14793062210083008 0.021883468955138596 +4670 6 5.702476 0.29752397537231445 0.088520515921345577 +4671 5 5.34669828 0.34669828414916992 0.12019970023197857 +4672 5 5.34669828 0.34669828414916992 0.12019970023197857 +4675 6 5.8778615 0.12213850021362305 0.014917813234433197 +4676 6 5.78406429 0.21593570709228516 0.04662822959744517 +4677 7 6.76541662 0.23458337783813477 0.055029361157949097 +4680 4 4.34068155 0.34068155288696289 0.11606392047747249 +4681 6 6.104238 0.10423803329467773 0.010865567585142344 +4683 6 5.93819046 0.061809539794921875 0.0038204192096600309 +4687 6 5.817554 0.18244600296020508 0.03328654399615516 +4689 6 5.817554 0.18244600296020508 0.03328654399615516 +4690 6 5.817554 0.18244600296020508 0.03328654399615516 +4691 7 6.33023167 0.66976833343505859 0.44858962047237583 +4696 6 6.19866753 0.19866752624511719 0.039468785984354327 +4697 7 6.837097 0.16290283203125 0.026537332683801651 +4701 6 5.201102 0.79889822006225586 0.63823836601864059 +4706 7 6.528003 0.47199678421020508 0.2227809643047749 +4707 6 5.96410131 0.035898685455322266 0.0012887156174201664 +4708 6 6.331786 0.33178615570068359 0.11008205311463826 +4712 6 6.04505348 0.045053482055664063 0.0020298162453400437 +4713 6 6.10136843 0.10136842727661133 0.01027555804853364 +4715 6 5.3946147 0.60538530349731445 0.36649136569053553 +4716 6 5.74300957 0.25699043273925781 0.066044082519510994 +4718 6 5.63362646 0.36637353897094727 0.13422957005809621 +4719 6 5.3946147 0.60538530349731445 0.36649136569053553 +4722 6 5.84657 0.15342998504638672 0.023540760311334452 +4723 6 5.28928041 0.71071958541870117 0.50512232909773047 +4725 6 6.00947142 0.0094714164733886719 8.9707730012378306E-05 +4727 6 5.84657 0.15342998504638672 0.023540760311334452 +4729 5 5.473 0.47300004959106445 0.22372904691314943 +4730 5 5.29477644 0.29477643966674805 0.086893149382603951 +4733 6 5.96345949 0.036540508270263672 0.0013352087446492078 +4734 6 6.066205 0.066205024719238281 0.0043831052980749519 +4735 6 5.78232241 0.21767759323120117 0.047383534594928278 +4737 7 6.585888 0.41411209106445313 0.17148882396577392 +4738 6 6.43513536 0.4351353645324707 0.18934278546680616 +4743 5 5.96722364 0.9672236442565918 0.93552157800900204 +4746 6 5.36194372 0.63805627822875977 0.40711581418713649 +4748 5 5.523394 0.52339410781860352 0.27394139209923196 +4752 7 6.93892431 0.061075687408447266 0.0037302395924143639 +4754 6 5.938266 0.061734199523925781 0.0038111113908598782 +4756 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4757 7 6.94749975 0.052500247955322266 0.0027562760353703197 +4758 6 6.21085 0.21084976196289063 0.044457622119807638 +4759 6 5.674312 0.32568788528442383 0.10607259862104002 +4762 7 6.27820635 0.72179365158081055 0.52098607546236053 +4764 6 6.137934 0.13793420791625977 0.019025845713485978 +4766 8 6.511512 1.4884881973266602 2.2155971135807704 +4770 6 5.603624 0.39637613296508789 0.15711403878435704 +4771 6 5.603624 0.39637613296508789 0.15711403878435704 +4772 5 5.26272154 0.26272153854370117 0.06902260681476946 +4773 7 5.97403574 1.0259642601013184 1.0526026630052456 +4774 4 5.354617 1.3546171188354492 1.8349875386420536 +4775 6 5.57587957 0.42412042617797852 0.17987813590139012 +4776 6 5.650073 0.34992694854736328 0.12244886931966903 +4783 6 5.35315752 0.64684247970581055 0.41840519355196193 +4784 5 5.531172 0.53117179870605469 0.28214347974062548 +4785 7 6.33343124 0.66656875610351563 0.4443139066133881 +4789 6 5.343524 0.65647602081298828 0.43096076590245502 +4791 6 5.35315752 0.64684247970581055 0.41840519355196193 +4793 6 5.07362556 0.92637443542480469 0.85816959460862563 +4794 5 5.07362556 0.073625564575195313 0.0054207237590162549 +4796 7 6.493846 0.50615406036376953 0.25619193282273045 +4797 6 6.459453 0.45945310592651367 0.21109715654552019 +4800 7 6.00343752 0.99656248092651367 0.99313677839040793 +4801 7 6.493846 0.50615406036376953 0.25619193282273045 +4802 8 6.794405 1.2055950164794922 1.453459343760187 +4803 7 6.66979647 0.33020353317260742 0.10903437331967325 +4804 4 5.978493 1.9784932136535645 3.914435396473209 +4807 6 6.04026556 0.040265560150146484 0.0016213153342050646 +4808 5 5.662127 0.66212701797485352 0.43841218793227199 +4811 6 6.34599733 0.34599733352661133 0.11971415480752512 +4812 7 6.139992 0.86000776290893555 0.7396133522636319 +4813 5 5.13426828 0.13426828384399414 0.018027972046411378 +4815 7 5.8541317 1.1458683013916016 1.3130141641340742 +4816 6 5.439974 0.56002616882324219 0.31362930976683856 +4817 6 6.275693 0.27569293975830078 0.076006597032574064 +4822 6 6.09246 0.092460155487060547 0.0085488803526914126 +4826 6 6.226658 0.22665786743164063 0.051373788868659176 +4828 5 5.32722235 0.32722234725952148 0.10707446454603087 +4829 7 6.61797571 0.38202428817749023 0.1459425567575181 +4830 6 5.84604 0.15396022796630859 0.023703751795437711 +4832 5 5.717937 0.71793699264526367 0.51543352540852538 +4834 7 6.58480167 0.41519832611083984 0.17238965000524331 +4835 6 6.32257843 0.32257843017578125 0.10405684361467138 +4836 5 5.107541 0.10754108428955078 0.011565084810172266 +4837 6 6.83404541 0.83404541015625 0.69563174620270729 +4839 4 4.61754942 0.61754941940307617 0.38136728540507647 +4841 6 5.934297 0.065702915191650391 0.0043168730646812037 +4844 6 5.908849 0.091151237487792969 0.0083085480955560342 +4845 5 5.235182 0.23518180847167969 0.055310483036009828 +4846 6 6.62231541 0.62231540679931641 0.38727646553979866 +4849 5 5.278072 0.27807188034057617 0.077323970636143713 +4850 6 6.022924 0.022923946380615234 0.0005255073176613223 +4851 5 5.278072 0.27807188034057617 0.077323970636143713 +4852 5 6.418775 1.4187750816345215 2.0129227322670431 +4853 5 5.904184 0.90418386459350586 0.81754846099124734 +4854 6 7.04106474 1.0410647392272949 1.0838157912623956 +4856 6 5.81926346 0.18073654174804688 0.032665697523043491 +4859 6 6.03407764 0.034077644348144531 0.0011612858443186269 +4860 6 6.10150051 0.10150051116943359 0.010302353767656314 +4862 6 6.09098768 0.090987682342529297 0.0082787583380650176 +4866 6 5.99347734 0.0065226554870605469 4.254503460288106E-05 +4867 6 4.705145 1.2948551177978516 1.676649776087288 +4869 6 5.51711273 0.48288726806640625 0.23318011366063729 +4871 6 6.68095255 0.68095254898071289 0.46369637396333019 +4872 5 5.705171 0.70517110824584961 0.49726629190467975 +4876 7 6.81956148 0.18043851852416992 0.032558058967197212 +4878 4 4.51450825 0.51450824737548828 0.26471873661739664 +4879 6 5.44779968 0.5522003173828125 0.30492519051767886 +4880 6 5.44779968 0.5522003173828125 0.30492519051767886 +4881 6 5.75216627 0.2478337287902832 0.061421557126095649 +4882 5 5.97157431 0.97157430648803711 0.94395663302771027 +4883 6 6.152341 0.15234088897705078 0.023207746454318112 +4886 7 6.863344 0.13665580749511719 0.018674809722142527 +4887 7 4.93395472 2.0660452842712402 4.2685431166594299 +4888 5 6.00417376 1.004173755645752 1.0083649315276944 +4889 6 5.75216627 0.2478337287902832 0.061421557126095649 +4894 5 5.44779968 0.4477996826171875 0.20052455575205386 +4896 7 6.65991926 0.34008073806762695 0.11565490840462189 diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-out.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-out.txt new file mode 100644 index 0000000000..d01de377a4 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-out.txt @@ -0,0 +1,32 @@ +maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 +Not adding a normalizer. +Auto-tuning parameters: UseCat = False +LightGBM objective=regression +Not training a calibrator because it is not needed. +L1(avg): 0.407028 +L2(avg): 0.274963 +RMS(avg): 0.524369 +Loss-fn(avg): 0.274963 +R Squared: 0.649369 + +OVERALL RESULTS +--------------------------------------- +L1(avg): 0.407028 (0.0000) +L2(avg): 0.274963 (0.0000) +RMS(avg): 0.524369 (0.0000) +Loss-fn(avg): 0.274963 (0.0000) +R Squared: 0.649369 (0.0000) + +--------------------------------------- +Physical memory usage(MB): %Number% +Virtual memory usage(MB): %Number% +%DateTime% Time elapsed(s): %Number% + +--- Progress log --- +[1] 'Loading data for LightGBM' started. +[1] 'Loading data for LightGBM' finished in %Time%. +[2] 'Training with LightGBM' started. +[2] (%Time%) Iteration: 50 Training-rmse: 0.524369259872456 +[2] 'Training with LightGBM' finished in %Time%. +[3] 'Saving model' started. +[3] 'Saving model' finished in %Time%. diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-rp.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-rp.txt new file mode 100644 index 0000000000..2c813d3277 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE-rp.txt @@ -0,0 +1,4 @@ +LightGBMR +L1(avg) L2(avg) RMS(avg) Loss-fn(avg) R Squared /iter /lr /nl /mil /v /nt /em Learner Name Train Dataset Test Dataset Results File Run Time Physical Memory Virtual Memory Command Line Settings +0.407028 0.274963 0.524369 0.274963 0.649369 50 0.2 20 10 + 1 Rmse LightGBMR %Data% %Data% %Output% 99 0 0 maml.exe TrainTest test=%Data% tr=LightGBMR{nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20} dout=%Output% loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+} data=%Data% out=%Output% seed=1 /iter:50;/lr:0.2;/nl:20;/mil:10;/v:+;/nt:1;/em:Rmse + diff --git a/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE.txt b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE.txt new file mode 100644 index 0000000000..c0618c3738 --- /dev/null +++ b/test/BaselineOutput/SingleRelease/LightGBMR/LightGBMRegRmse-TrainTest-wine.RMSE.txt @@ -0,0 +1,4899 @@ +Instance Label Score L1-loss L2-loss +0 6 5.680711 0.31928920745849609 0.10194559799947456 +1 6 5.534508 0.46549177169799805 0.21668258951854114 +2 6 5.711945 0.2880549430847168 0.082975650235539433 +3 6 5.78378773 0.21621227264404297 0.046747746841901971 +4 6 5.78378773 0.21621227264404297 0.046747746841901971 +5 6 5.711945 0.2880549430847168 0.082975650235539433 +6 6 5.29387236 0.70612764358520508 0.49861624903519441 +7 6 5.680711 0.31928920745849609 0.10194559799947456 +8 6 5.534508 0.46549177169799805 0.21668258951854114 +9 6 5.93140268 0.068597316741943359 0.0047055918641945027 +10 5 5.76748276 0.76748275756835938 0.58902978316473309 +11 5 5.426882 0.42688179016113281 0.18222806277117343 +12 5 5.87265 0.872650146484375 0.76151827815920115 +13 7 6.908373 0.091627120971679688 0.0083955292975588236 +14 5 5.333195 0.33319520950317383 0.1110190476358639 +15 7 6.38952065 0.61047935485839844 0.37268504270832636 +16 6 4.975053 1.0249471664428711 1.0505166939992705 +17 8 7.327068 0.67293214797973633 0.45283767578462175 +18 6 5.770521 0.22947883605957031 0.052660536199255148 +19 5 5.274254 0.27425384521484375 0.075215171615127474 +20 8 7.327068 0.67293214797973633 0.45283767578462175 +21 7 6.28790045 0.71209955215454102 0.50708577217869788 +22 8 6.739554 1.2604460716247559 1.5887242994742792 +23 5 4.72103071 0.27896928787231445 0.077823863575986252 +24 6 5.4655714 0.53442859649658203 0.28561392475330649 +25 6 5.91425276 0.085747241973876953 0.0073525895061266056 +26 6 5.993135 0.0068650245666503906 4.7128562300713384E-05 +27 6 6.12550831 0.12550830841064453 0.015752335480101465 +28 6 5.638529 0.36147117614746094 0.13066141118542873 +29 7 6.716088 0.28391218185424805 0.080606127005239614 +30 6 5.67022943 0.32977056503295898 0.10874862556215703 +31 6 5.82089472 0.17910528182983398 0.03207870197934426 +32 6 5.84701443 0.15298557281494141 0.023404585489515739 +33 6 6.165793 0.16579294204711914 0.027487299632639406 +34 5 5.41362047 0.4136204719543457 0.17108189481973568 +35 5 5.8876605 0.88766050338745117 0.78794116927406321 +36 5 5.140776 0.14077615737915039 0.019817926486439319 +37 6 5.909733 0.090267181396484375 0.0081481640372658148 +38 5 5.090864 0.090864181518554688 0.0082562994830368552 +39 5 5.090864 0.090864181518554688 0.0082562994830368552 +40 6 6.039511 0.039511203765869141 0.0015611352230280318 +41 6 5.72844 0.2715601921081543 0.073744937937817667 +42 6 5.414184 0.5858159065246582 0.34318027633730708 +43 6 5.830394 0.16960620880126953 0.028766266063939838 +44 6 5.829722 0.17027807235717773 0.028994621925676256 +45 7 5.971135 1.028864860534668 1.0585629012430218 +46 4 4.886475 0.8864750862121582 0.78583807847485332 +47 5 4.886475 0.1135249137878418 0.012887906050536913 +48 6 5.414184 0.5858159065246582 0.34318027633730708 +49 5 6.006579 1.0065789222717285 1.0132011267617145 +50 6 5.98721075 0.012789249420166016 0.00016356490073121677 +51 7 6.01847124 0.98152875900268555 0.96339870474935196 +52 7 6.326056 0.67394399642944336 0.45420051032328956 +53 6 6.149549 0.14954900741577148 0.022364905619042474 +54 6 5.874616 0.12538385391235352 0.015721110821914408 +55 6 6.26666641 0.26666641235351563 0.071110975477495231 +56 6 5.986947 0.013052940368652344 0.00017037925226759398 +57 6 5.81298637 0.18701362609863281 0.034974096346559236 +58 6 5.459394 0.54060602188110352 0.29225487089411217 +59 6 5.94256067 0.057439327239990234 0.0032992763137826842 +60 6 5.57885647 0.42114353179931641 0.17736187437640183 +61 6 5.81298637 0.18701362609863281 0.034974096346559236 +62 5 5.00168037 0.0016803741455078125 2.823657268891111E-06 +63 6 5.459394 0.54060602188110352 0.29225487089411217 +64 6 5.89929 0.10070991516113281 0.010142487011762569 +65 5 5.041315 0.041315078735351563 0.0017069357309082989 +66 7 6.70074558 0.29925441741943359 0.0895532063450446 +67 5 4.98183537 0.018164634704589844 0.00032995395395118976 +68 8 6.812332 1.1876678466796875 1.4105549140367657 +69 5 5.2840085 0.28400850296020508 0.080660829753696817 +70 6 5.4217205 0.57827949523925781 0.3344071746141708 +71 5 5.10868025 0.10868024826049805 0.011811396361963489 +72 5 4.84936762 0.15063238143920898 0.022690114338047351 +73 6 5.2388835 0.76111650466918945 0.57929833367984429 +74 8 6.812332 1.1876678466796875 1.4105549140367657 +75 5 5.2840085 0.28400850296020508 0.080660829753696817 +76 7 6.727201 0.27279901504516602 0.074419302609612714 +77 7 6.238829 0.76117086410522461 0.57938108436269431 +78 5 5.73537064 0.73537063598632813 0.54076997227093671 +79 5 5.206772 0.2067718505859375 0.042754598194733262 +80 6 6.218928 0.21892786026000977 0.047929407998026363 +81 6 5.88246059 0.11753940582275391 0.013815511921166035 +82 5 5.21755552 0.21755552291870117 0.047330405552429511 +83 6 5.64936066 0.35063934326171875 0.12294794904300943 +84 5 5.252364 0.25236415863037109 0.063687668561215105 +85 6 5.436144 0.56385612487792969 0.31793372956235544 +86 6 5.301076 0.69892406463623047 0.48849484812762967 +87 6 5.4996624 0.50033760070800781 0.25033771468224586 +88 5 5.252364 0.25236415863037109 0.063687668561215105 +89 6 5.436144 0.56385612487792969 0.31793372956235544 +90 6 5.301076 0.69892406463623047 0.48849484812762967 +91 5 5.332184 0.332183837890625 0.11034610215574503 +92 7 6.585561 0.41443920135498047 0.17175985161975404 +93 7 6.735927 0.26407289505004883 0.069734493900114103 +94 7 5.97698069 1.0230193138122559 1.0465685164328988 +95 6 5.79194736 0.20805263519287109 0.043285899010697904 +96 6 5.435262 0.56473779678344727 0.31892877911582218 +97 7 5.901606 1.0983939170837402 1.2064691970865624 +98 4 4.174137 0.17413711547851563 0.030323734987177886 +99 6 5.435262 0.56473779678344727 0.31892877911582218 +100 5 5.56997252 0.56997251510620117 0.32486866797648872 +101 5 5.66165352 0.66165351867675781 0.4377853787773347 +102 5 5.32760572 0.3276057243347168 0.10732551061687445 +103 5 5.209554 0.20955419540405273 0.043912960811439916 +104 5 5.56997252 0.56997251510620117 0.32486866797648872 +105 6 5.946871 0.053129196166992188 0.0028227114853507373 +106 5 5.66165352 0.66165351867675781 0.4377853787773347 +107 6 5.82830763 0.1716923713684082 0.029478270386107397 +108 6 5.82830763 0.1716923713684082 0.029478270386107397 +109 5 5.289993 0.2899928092956543 0.084095829443185721 +110 6 5.77061224 0.22938776016235352 0.052618744512301419 +111 5 5.123654 0.12365388870239258 0.015290284191223691 +112 5 5.275713 0.27571296691894531 0.076017640127247432 +113 5 5.38431644 0.38431644439697266 0.14769912943393138 +114 5 5.38431644 0.38431644439697266 0.14769912943393138 +115 4 4.31654739 0.31654739379882813 0.10020225252083037 +116 6 6.187931 0.18793106079101563 0.03531808361003641 +117 6 6.22085571 0.220855712890625 0.048777245916426182 +118 5 5.275713 0.27571296691894531 0.076017640127247432 +119 5 5.423021 0.42302083969116211 0.17894663081301587 +120 5 5.28126144 0.28126144409179688 0.079107999932602979 +121 5 5.637559 0.63755893707275391 0.40648139824133978 +122 5 5.77775145 0.77775144577026367 0.60489731139773539 +123 6 5.84558964 0.15441036224365234 0.023842559968215937 +124 6 5.741732 0.25826787948608398 0.066702297574238401 +125 6 6.478015 0.47801494598388672 0.22849828858397814 +126 5 5.651976 0.65197610855102539 0.42507284612133844 +127 7 6.109841 0.89015913009643555 0.79238327689404287 +128 7 6.330519 0.66948080062866211 0.44820454241039442 +129 6 6.17036 0.17036008834838867 0.029022559702070794 +130 5 5.10576 0.10576009750366211 0.011185198223984116 +131 7 6.109841 0.89015913009643555 0.79238327689404287 +132 5 5.40527 0.40527009963989258 0.16424385366212846 +133 5 5.542647 0.54264688491821289 0.29446564171144018 +134 5 5.281421 0.28142118453979492 0.079197883107781308 +135 5 5.44356537 0.44356536865234375 0.19675023626768962 +136 6 6.00983572 0.0098357200622558594 9.6741389143062406E-05 +137 5 5.241497 0.24149703979492188 0.05832082022971008 +138 7 6.315238 0.68476200103759766 0.46889899806501489 +139 6 5.888501 0.11149883270263672 0.012431989694050571 +140 5 5.400142 0.40014219284057617 0.16011377449126485 +141 5 5.241497 0.24149703979492188 0.05832082022971008 +142 6 5.877977 0.12202310562133789 0.014889638305476183 +143 6 5.74312925 0.25687074661254883 0.065982580465288265 +144 6 5.827976 0.17202377319335938 0.029592178543680348 +145 6 5.97833 0.021669864654541016 0.00046958303414612601 +146 6 5.659865 0.34013509750366211 0.11569188455382573 +147 4 4.66095638 0.66095638275146484 0.43686333989990089 +148 7 6.526716 0.47328376770019531 0.22399752476849244 +149 6 5.537257 0.46274280548095703 0.21413090402438684 +150 7 6.371533 0.62846708297729492 0.3949708743859901 +151 6 5.87430143 0.12569856643676758 0.015800129604258473 +152 6 5.537257 0.46274280548095703 0.21413090402438684 +153 5 5.83971643 0.83971643447875977 0.70512369033372124 +154 6 5.504298 0.49570178985595703 0.24572026446639939 +155 6 5.923597 0.076403141021728516 0.0058374399579861347 +156 6 5.923597 0.076403141021728516 0.0058374399579861347 +157 7 6.4670825 0.53291749954223633 0.28400106131834946 +158 8 7.183791 0.81620883941650391 0.66619686954163626 +159 8 7.183791 0.81620883941650391 0.66619686954163626 +160 7 6.4670825 0.53291749954223633 0.28400106131834946 +161 5 5.491083 0.49108314514160156 0.24116265544216731 +162 5 5.358941 0.35894107818603516 0.1288386976093534 +163 6 5.923597 0.076403141021728516 0.0058374399579861347 +164 5 5.557883 0.55788278579711914 0.31123320268875432 +165 5 5.80627 0.80627012252807617 0.65007151048143896 +166 6 5.4762373 0.52376270294189453 0.27432736899299925 +167 7 6.891704 0.10829591751098633 0.011728005749546355 +168 5 5.28792524 0.28792524337768555 0.082900945774099455 +169 5 4.44647264 0.5535273551940918 0.30639253294816626 +170 6 6.20261526 0.20261526107788086 0.041052944021657822 +171 6 5.813782 0.1862177848815918 0.034677063406206798 +172 4 4.291095 0.29109477996826172 0.084736170924770704 +173 7 6.75989151 0.24010848999023438 0.057652086965390481 +174 5 5.5592947 0.55929470062255859 0.31281056214447744 +175 6 6.190523 0.19052314758300781 0.036299069764936576 +176 4 5.546434 1.5464339256286621 2.3914578863352745 +177 5 5.45982838 0.45982837677001953 0.21144213608295104 +178 4 4.225169 0.22516918182373047 0.050701160443168192 +179 6 5.508888 0.49111223220825195 0.24119122462457199 +180 6 5.42470741 0.57529258728027344 0.33096156097963103 +181 5 5.16715574 0.16715574264526367 0.02794104229928962 +182 5 5.24366856 0.24366855621337891 0.059374365287112596 +183 6 5.64808273 0.35191726684570313 0.12384576270414982 +184 5 5.23220968 0.23220968246459961 0.053921336630310179 +185 5 5.196457 0.1964569091796875 0.038595317164435983 +186 6 5.80372334 0.19627666473388672 0.03852452911905857 +187 5 5.99319839 0.99319839477539063 0.98644305138441268 +188 8 7.04508162 0.95491838455200195 0.91186912115540508 +189 4 5.48485327 1.4848532676696777 2.2047892265093196 +190 6 5.43693161 0.56306838989257813 0.31704601169622038 +191 5 5.24366856 0.24366855621337891 0.059374365287112596 +192 6 6.261883 0.26188278198242188 0.068582591498852707 +193 5 6.014933 1.0149331092834473 1.0300892163197659 +194 5 5.24624968 0.24624967575073242 0.060638902807340855 +195 6 5.24624968 0.75375032424926758 0.56813955130587601 +196 5 5.24624968 0.24624967575073242 0.060638902807340855 +197 5 5.250086 0.25008583068847656 0.062542922711145366 +198 5 5.28796864 0.28796863555908203 0.082925935065759404 +199 5 5.250086 0.25008583068847656 0.062542922711145366 +200 5 5.24837 0.24837017059326172 0.061687741640525928 +201 5 5.28796864 0.28796863555908203 0.082925935065759404 +202 5 5.249635 0.24963521957397461 0.062317742851746516 +203 6 6.88108873 0.8810887336730957 0.77631735660565937 +204 4 5.611186 1.6111860275268555 2.5959204152977691 +205 5 5.433936 0.43393611907958984 0.18830055544185598 +206 5 5.67375565 0.67375564575195313 0.45394667018263135 +207 4 4.45758867 0.45758867263793945 0.20938739332655132 +208 5 5.070417 0.070416927337646484 0.0049585436556753848 +209 6 5.637781 0.36221885681152344 0.13120250022984692 +210 5 5.36824369 0.36824369430541992 0.13560341839570356 +211 7 6.63713264 0.36286735534667969 0.13167271757629351 +212 5 5.67375565 0.67375564575195313 0.45394667018263135 +213 6 6.07086134 0.070861339569091797 0.0050213294455261348 +214 7 6.495806 0.50419378280639648 0.25421137062062371 +215 5 5.224705 0.22470521926879883 0.05049243556663896 +216 5 5.80051565 0.80051565170288086 0.64082530862128806 +217 5 5.224705 0.22470521926879883 0.05049243556663896 +218 5 5.27940559 0.27940559387207031 0.078067485887004295 +219 5 5.922441 0.92244100570678711 0.85089740900934885 +220 5 5.80051565 0.80051565170288086 0.64082530862128806 +221 6 5.132604 0.86739587783813477 0.75237560889058841 +222 7 6.495806 0.50419378280639648 0.25421137062062371 +223 6 5.823209 0.17679119110107422 0.031255125250936544 +224 6 5.77888727 0.22111272811889648 0.048890838536181036 +225 5 5.44676161 0.4467616081237793 0.19959593449334534 +226 6 5.878103 0.12189722061157227 0.014858932392826318 +227 6 5.50031567 0.49968433380126953 0.24968443344641855 +228 6 5.878103 0.12189722061157227 0.014858932392826318 +229 5 5.44676161 0.4467616081237793 0.19959593449334534 +230 4 4.546661 0.5466609001159668 0.29883813971559903 +231 6 5.757604 0.24239587783813477 0.058755761592919953 +232 6 5.72927952 0.27072048187255859 0.073289579305310326 +233 6 6.163166 0.16316604614257813 0.026623158613801934 +234 6 6.163166 0.16316604614257813 0.026623158613801934 +235 6 6.163166 0.16316604614257813 0.026623158613801934 +236 6 6.163166 0.16316604614257813 0.026623158613801934 +237 6 5.487222 0.51277780532836914 0.26294107763737884 +238 7 6.68565941 0.31434059143066406 0.098810007420979673 +239 6 5.802817 0.19718313217163086 0.038881187613014845 +240 5 5.11719465 0.11719465255737305 0.013734586588043385 +241 5 5.726284 0.72628402709960938 0.52748848802002613 +242 7 6.105395 0.89460515975952148 0.80031839186835896 +243 6 5.960915 0.039084911346435547 0.0015276302949587262 +244 5 5.216609 0.21660900115966797 0.046919459383389039 +245 6 6.00468969 0.0046896934509277344 2.1993224663674482E-05 +246 7 6.8084445 0.19155550003051758 0.03669350959194162 +247 7 6.10422945 0.89577054977416992 0.80240487784271863 +248 7 6.269913 0.7300868034362793 0.53302674055180432 +249 5 5.307523 0.30752277374267578 0.094570256370388961 +250 4 5.00461149 1.0046114921569824 1.0092442501738788 +251 3 4.74934769 1.7493476867675781 3.0602173291990766 +252 5 5.216609 0.21660900115966797 0.046919459383389039 +253 3 4.21514 1.2151398658752441 1.4765648936393063 +254 6 5.52048063 0.47951936721801758 0.22993882353716799 +255 8 6.49816942 1.5018305778503418 2.2554950845662916 +256 7 5.884387 1.1156129837036133 1.2445923294080785 +257 7 5.884387 1.1156129837036133 1.2445923294080785 +258 6 6.539793 0.53979301452636719 0.29137649853146286 +259 4 4.220551 0.2205510139465332 0.048642749752843883 +260 6 6.21442842 0.21442842483520508 0.045979549377307194 +261 5 5.38486671 0.38486671447753906 0.14812238791273558 +262 5 5.504349 0.5043492317199707 0.2543681475365247 +263 6 5.68215 0.31785011291503906 0.10102869428010308 +264 6 5.6343627 0.36563730239868164 0.13369063690538496 +265 5 5.38486671 0.38486671447753906 0.14812238791273558 +266 6 5.274923 0.72507715225219727 0.52573687671815605 +267 5 5.280154 0.28015422821044922 0.078486391584192461 +268 6 5.36846256 0.63153743743896484 0.39883953488697443 +269 6 5.36846256 0.63153743743896484 0.39883953488697443 +270 6 5.274923 0.72507715225219727 0.52573687671815605 +271 5 5.087133 0.087132930755615234 0.0075921476220628392 +272 5 5.316086 0.3160858154296875 0.099910242715850472 +273 5 4.99754 0.0024600028991699219 6.0516142639244208E-06 +274 5 5.4562726 0.45627260208129883 0.20818468741003926 +275 6 5.997397 0.0026030540466308594 6.7758903696812922E-06 +276 6 5.95126629 0.048733711242675781 0.0023749746114845038 +277 5 5.10343027 0.10343027114868164 0.010697820989889806 +278 4 4.91050863 0.91050863265991211 0.82902597014822277 +279 7 6.508873 0.49112701416015625 0.24120574403787032 +280 8 6.665929 1.334071159362793 1.7797458582435866 +281 8 7.08416 0.91584014892578125 0.83876317838439718 +282 4 4.9356513 0.93565130233764648 0.87544335956613395 +283 5 5.27014065 0.27014064788818359 0.072975969641447591 +284 5 5.23520041 0.23520040512084961 0.055319230569011779 +285 5 5.231636 0.23163604736328125 0.053655258438084275 +286 6 5.39945173 0.60054826736450195 0.36065822143450532 +287 7 6.163166 0.83683395385742188 0.70029106632864568 +288 7 6.163166 0.83683395385742188 0.70029106632864568 +289 7 6.163166 0.83683395385742188 0.70029106632864568 +290 7 6.163166 0.83683395385742188 0.70029106632864568 +291 6 5.971399 0.028601169586181641 0.00081802690169752168 +292 5 5.279406 0.27940607070922852 0.078067752349170405 +293 7 5.74141073 1.2585892677307129 1.5840469448469321 +294 3 3.64403057 0.64403057098388672 0.41477537636183115 +295 6 5.698216 0.30178403854370117 0.091073605919746115 +296 5 5.033449 0.033449172973632813 0.0011188471726200078 +297 7 6.434052 0.5659480094909668 0.32029714944678744 +298 6 5.95223331 0.047766685485839844 0.0022816562423031428 +299 6 5.994336 0.0056638717651367188 3.207944337191293E-05 +300 6 5.8504715 0.14952850341796875 0.022358773334417492 +301 6 5.46959 0.53040981292724609 0.2813345696495162 +302 6 5.8504715 0.14952850341796875 0.022358773334417492 +303 6 5.84660339 0.1533966064453125 0.023530518868938088 +304 6 5.49118376 0.50881624221801758 0.25889396834486433 +305 6 5.49118376 0.50881624221801758 0.25889396834486433 +306 5 5.209182 0.20918178558349609 0.043757019419899734 +307 6 5.46011972 0.53988027572631836 0.29147071211832554 +308 7 6.02967453 0.97032546997070313 0.94153151767386589 +309 6 5.84821558 0.15178442001342773 0.023038510158812642 +310 7 6.60169029 0.39830970764160156 0.15865062320153811 +311 8 7.12271929 0.87728071212768555 0.76962144787125908 +312 6 6.070884 0.070884227752685547 0.0050245737440945959 +313 6 5.46675158 0.5332484245300293 0.28435388226375835 +314 5 5.307043 0.30704307556152344 0.094275450250279391 +315 6 5.632986 0.36701393127441406 0.13469922574950033 +316 6 6.04914 0.049139976501464844 0.002414737290564517 +317 5 6.03052044 1.0305204391479492 1.0619723755016821 +318 7 6.39483166 0.60516834259033203 0.36622872287352948 +319 6 6.043684 0.043684005737304688 0.0019082923572568689 +320 7 6.36964655 0.63035345077514648 0.39734547290413502 +321 5 6.03052044 1.0305204391479492 1.0619723755016821 +322 6 6.04914 0.049139976501464844 0.002414737290564517 +323 6 5.951385 0.048614978790283203 0.0023634161627796857 +324 5 5.121614 0.12161397933959961 0.014789959970812561 +325 5 4.52251625 0.47748374938964844 0.22799073093119659 +326 6 5.72818375 0.27181625366210938 0.073884075754904188 +327 6 5.414321 0.58567905426025391 0.34301995459918544 +328 6 5.475126 0.52487421035766602 0.27549293669858343 +329 5 5.86220741 0.86220741271972656 0.7434016225488449 +330 8 7.05833244 0.94166755676269531 0.886737787459424 +331 5 6.04914 1.0491399765014648 1.1006946902934942 +332 6 6.296459 0.29645919799804688 0.08788805607764516 +333 5 5.67379332 0.67379331588745117 0.45399743253460656 +334 5 5.57425976 0.57425975799560547 0.32977426965317136 +335 6 6.296459 0.29645919799804688 0.08788805607764516 +336 6 6.168834 0.16883420944213867 0.028504990277951947 +337 6 5.571726 0.42827415466308594 0.18341875155238085 +338 5 5.1820116 0.18201160430908203 0.033128224103165849 +339 7 6.845515 0.15448522567749023 0.023865684952625088 +340 7 5.794984 1.2050161361694336 1.4520638884287109 +341 6 5.49368334 0.5063166618347168 0.25635656205145096 +342 6 5.494451 0.50554895401000977 0.25557974490061497 +343 5 5.40403748 0.4040374755859375 0.16324628167785704 +344 6 5.93613958 0.063860416412353516 0.0040781527843591903 +345 6 5.949069 0.050930976867675781 0.0025939644046957255 +346 7 6.168058 0.83194208145141602 0.69212762688971452 +347 6 6.40999 0.40998983383178711 0.16809166384541641 +348 6 5.99639034 0.0036096572875976563 1.3029625733906869E-05 +349 5 5.87430143 0.87430143356323242 0.76440299673072332 +350 7 6.90420866 0.095791339874267578 0.0091759807949074457 +351 7 6.78889275 0.21110725402832031 0.044566272703377763 +352 6 5.511934 0.48806619644165039 0.23820861210901967 +353 7 6.78889275 0.21110725402832031 0.044566272703377763 +354 6 5.65645266 0.34354734420776367 0.11802477771220765 +355 6 6.17624664 0.17624664306640625 0.031062879192177206 +356 6 6.17624664 0.17624664306640625 0.031062879192177206 +357 6 5.61167145 0.38832855224609375 0.15079906448954716 +358 6 5.29756641 0.70243358612060547 0.49341294291025406 +359 6 5.91268969 0.087310314178466797 0.0076230909619425802 +360 6 5.86551237 0.13448762893676758 0.018086922337033684 +361 5 5.08086443 0.080864429473876953 0.0065390559541356197 +362 6 6.06830931 0.068309307098388672 0.004666161436261973 +363 6 6.17624664 0.17624664306640625 0.031062879192177206 +364 7 6.6356883 0.36431169509887695 0.13272301118581709 +365 7 6.97618628 0.023813724517822266 0.0005670934754107293 +366 6 5.7951417 0.20485830307006836 0.041966924336747979 +367 6 5.22309 0.77690982818603516 0.60358888113205467 +368 6 5.72964668 0.27035331726074219 0.07309091615388752 +369 5 5.901571 0.90157079696655273 0.81282990194290505 +370 6 5.22309 0.77690982818603516 0.60358888113205467 +371 6 5.72964668 0.27035331726074219 0.07309091615388752 +372 5 4.81994867 0.18005132675170898 0.032418480265050675 +373 6 5.73458433 0.26541566848754883 0.07044547707869242 +374 7 6.622659 0.37734079360961914 0.14238607452193719 +375 7 6.622659 0.37734079360961914 0.14238607452193719 +376 7 5.72573566 1.2742643356323242 1.6237495970644886 +377 7 5.80524874 1.1947512626647949 1.4274305796391218 +378 6 5.56888628 0.43111371994018555 0.18585903952066474 +379 7 5.72573566 1.2742643356323242 1.6237495970644886 +380 7 5.80524874 1.1947512626647949 1.4274305796391218 +381 6 5.465357 0.53464317321777344 0.28584332266837009 +382 6 5.3793335 0.62066650390625 0.38522690907120705 +383 6 5.73458433 0.26541566848754883 0.07044547707869242 +384 7 6.5848403 0.41515970230102539 0.17235757841467603 +385 7 6.622659 0.37734079360961914 0.14238607452193719 +386 7 6.736278 0.26372194290161133 0.069549263167800746 +387 5 5.15757132 0.15757131576538086 0.024828719552033363 +388 6 5.866982 0.13301801681518555 0.017693792797444985 +389 7 5.79346561 1.2065343856811523 1.4557252238309957 +390 7 5.79346561 1.2065343856811523 1.4557252238309957 +391 5 4.9216423 0.078357696533203125 0.006139928605989553 +392 6 5.582333 0.41766691207885742 0.17444564944548802 +393 6 6.033824 0.033823966979980469 0.0011440607422628091 +394 5 5.2088747 0.20887470245361328 0.043628641325085482 +395 5 5.09981632 0.099816322326660156 0.0099632982028197148 +396 5 6.02121162 1.0212116241455078 1.0428731812899059 +397 6 6.29722261 0.29722261428833008 0.088341282444389435 +398 5 5.280024 0.28002405166625977 0.078413469511588119 +399 6 6.517963 0.51796293258666992 0.26828559953378317 +400 6 6.29722261 0.29722261428833008 0.088341282444389435 +401 5 5.2088747 0.20887470245361328 0.043628641325085482 +402 5 5.03644276 0.036442756652832031 0.0013280745124575333 +403 5 5.31974745 0.3197474479675293 0.10223843048174786 +404 6 6.64804 0.64803981781005859 0.41995560546729394 +405 5 5.09981632 0.099816322326660156 0.0099632982028197148 +406 7 7.076631 0.076631069183349609 0.0058723207641833142 +407 5 5.05094671 0.050946712493896484 0.0025955675139357481 +408 6 5.99687767 0.0031223297119140625 9.7489428299013525E-06 +409 5 6.02121162 1.0212116241455078 1.0428731812899059 +410 6 5.5693655 0.43063449859619141 0.18544607138119318 +411 6 5.84123039 0.15876960754394531 0.025207788279658416 +412 5 5.79458427 0.79458427429199219 0.63136416895213188 +413 5 5.79458427 0.79458427429199219 0.63136416895213188 +414 6 5.5693655 0.43063449859619141 0.18544607138119318 +415 6 5.84123039 0.15876960754394531 0.025207788279658416 +416 6 5.82386971 0.17613029479980469 0.031021880746266106 +417 5 5.18994951 0.18994951248168945 0.036080817292031497 +418 6 5.82386971 0.17613029479980469 0.031021880746266106 +419 6 5.795103 0.20489692687988281 0.041982750644820044 +420 7 6.7393136 0.26068639755249023 0.067957397868894986 +421 6 6.021837 0.021837234497070313 0.0004768648104800377 +422 6 6.021837 0.021837234497070313 0.0004768648104800377 +423 6 6.021837 0.021837234497070313 0.0004768648104800377 +424 7 5.91769934 1.0823006629943848 1.1713747251180848 +425 6 6.021837 0.021837234497070313 0.0004768648104800377 +426 6 6.021837 0.021837234497070313 0.0004768648104800377 +427 5 5.31993246 0.31993246078491211 0.10235677946388932 +428 5 5.541713 0.54171323776245117 0.29345323196707795 +429 5 5.29234028 0.29234027862548828 0.08546283850682812 +430 5 5.31993246 0.31993246078491211 0.10235677946388932 +431 5 4.993221 0.0067791938781738281 4.5957469637869508E-05 +432 7 6.71159029 0.28840970993041992 0.08318016078214896 +433 4 4.595131 0.59513092041015625 0.35418081242823973 +434 8 6.86301756 1.1369824409484863 1.2927290710251782 +435 7 6.96430874 0.035691261291503906 0.0012738661325784051 +436 5 5.21484661 0.21484661102294922 0.046159066268046445 +437 8 7.18364525 0.81635475158691406 0.66643508043853217 +438 7 6.71159029 0.28840970993041992 0.08318016078214896 +439 5 4.960922 0.039078235626220703 0.001527108499658425 +440 7 6.418142 0.58185815811157227 0.33855891616099143 +441 6 5.929764 0.0702362060546875 0.004933124640956521 +442 8 7.54107952 0.45892047882080078 0.21060800588111306 +443 6 5.76989126 0.23010873794555664 0.052950031278896859 +444 6 5.795 0.20499992370605469 0.042024968719488243 +445 3 5.248956 2.2489562034606934 5.0578040050843356 +446 5 6.340478 1.3404779434204102 1.7968811167966123 +447 6 5.84383631 0.15616369247436523 0.024387098847228117 +448 6 5.84383631 0.15616369247436523 0.024387098847228117 +449 7 6.47833157 0.52166843414306641 0.27213795518127881 +450 5 4.94290733 0.057092666625976563 0.003259572582464898 +451 5 5.55804157 0.55804157257080078 0.31141039671729231 +452 7 6.32008076 0.67991924285888672 0.46229017680980178 +453 7 6.45778561 0.54221439361572266 0.29399644864406582 +454 7 6.47833157 0.52166843414306641 0.27213795518127881 +455 6 5.84383631 0.15616369247436523 0.024387098847228117 +456 7 6.69056559 0.30943441390991211 0.095749656511770809 +457 5 5.666873 0.66687297821044922 0.44471956906727428 +458 6 5.436703 0.56329679489135742 0.31730327913487599 +459 5 4.90243149 0.097568511962890625 0.009519614526652731 +460 5 5.666873 0.66687297821044922 0.44471956906727428 +461 5 5.6149745 0.6149744987487793 0.37819363411131235 +462 5 5.289179 0.28917884826660156 0.08362440628479817 +463 6 5.08662176 0.91337823867797852 0.83425980689048629 +464 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +465 5 5.33792353 0.33792352676391602 0.11419230994056306 +466 6 6.279598 0.27959823608398438 0.078175173621275462 +467 6 5.08662176 0.91337823867797852 0.83425980689048629 +468 5 5.00960827 0.0096082687377929688 9.2318828137649689E-05 +469 5 5.35536432 0.35536432266235352 0.1262838018212733 +470 6 5.00434446 0.99565553665161133 0.99132994766500815 +471 5 5.415714 0.41571378707885742 0.1728179527674456 +472 6 6.255002 0.25500202178955078 0.065026031116758531 +473 7 6.1227684 0.87723159790039063 0.76953527635487262 +474 6 5.61289 0.38711023330688477 0.14985433273091076 +475 5 5.6727953 0.67279529571533203 0.45265350993668108 +476 7 6.37792349 0.62207651138305664 0.3869791860145142 +477 6 6.137163 0.13716316223144531 0.018813733073329786 +478 6 5.165093 0.83490705490112305 0.69706979032366689 +479 6 6.256819 0.25681877136230469 0.06595588132404373 +480 5 5.14719439 0.14719438552856445 0.021666187131131665 +481 6 6.024329 0.024329185485839844 0.00059190926640440011 +482 5 5.55854845 0.5585484504699707 0.31197637152240532 +483 5 5.14719439 0.14719438552856445 0.021666187131131665 +484 5 4.807844 0.19215583801269531 0.036923866082361201 +485 6 6.0983386 0.098338603973388672 0.0096704810314349743 +486 6 5.87475061 0.12524938583374023 0.015687408651729129 +487 6 6.023153 0.023152828216552734 0.00053605345442520047 +488 6 6.29130173 0.29130172729492188 0.084856696325005032 +489 6 5.48021841 0.51978158950805664 0.2701729007915219 +490 6 5.77609539 0.22390460968017578 0.050133274236031866 +491 7 6.43585968 0.56414031982421875 0.31825430045137182 +492 6 5.79112244 0.2088775634765625 0.043629836523905396 +493 6 6.26251125 0.26251125335693359 0.068912158139028179 +494 6 6.30851841 0.30851840972900391 0.095183609141713532 +495 6 6.354451 0.35445117950439453 0.12563563865205651 +496 4 4.753712 0.75371217727661133 0.56808204617504998 +497 6 6.817308 0.81730794906616211 0.66799228360673624 +498 5 5.29211855 0.29211854934692383 0.085333246872551172 +499 4 4.753712 0.75371217727661133 0.56808204617504998 +500 6 5.484865 0.51513481140136719 0.26536387391752214 +501 6 6.044801 0.044801235198974609 0.0020071506753538415 +502 6 5.19564533 0.80435466766357422 0.64698643139217893 +503 5 5.20786428 0.20786428451538086 0.043207560777091203 +504 6 6.26455355 0.26455354690551758 0.069988579180289889 +505 6 6.26455355 0.26455354690551758 0.069988579180289889 +506 5 4.85467 0.14532995223999023 0.021120795018077843 +507 7 6.225348 0.77465200424194336 0.60008572767605983 +508 6 5.982076 0.017923831939697266 0.00032126375140251184 +509 7 6.225348 0.77465200424194336 0.60008572767605983 +510 6 5.31798172 0.68201828002929688 0.46514893429412041 +511 6 5.64203167 0.35796833038330078 0.12814132555740798 +512 6 6.37156963 0.37156963348388672 0.13806399252734991 +513 6 5.88133144 0.11866855621337891 0.014082226233767869 +514 7 6.026742 0.97325801849365234 0.94723117056219053 +515 6 5.47360754 0.52639245986938477 0.27708902180734185 +516 5 6.01606941 1.0160694122314453 1.0323970504723547 +517 6 5.994919 0.0050811767578125 2.5818357244133949E-05 +518 6 6.21694946 0.216949462890625 0.047067069448530674 +519 5 5.25397635 0.25397634506225586 0.064503983851182056 +520 5 5.16614771 0.16614770889282227 0.027605061170334011 +521 5 5.16614771 0.16614770889282227 0.027605061170334011 +522 6 6.029863 0.029862880706787109 0.00089179164410779777 +523 6 6.17634344 0.17634344100952148 0.031097009187078584 +524 5 4.46065855 0.53934144973754883 0.29088919940500091 +525 6 5.49068642 0.50931358337402344 0.25940032620928832 +526 4 4.83760929 0.83760929107666016 0.7015893244979452 +527 6 6.53003359 0.53003358840942383 0.28093560484217051 +528 6 6.38529253 0.38529253005981445 0.14845033371989302 +529 6 6.527589 0.52758884429931641 0.27834998862908833 +530 6 6.089735 0.089735031127929688 0.00805237581153051 +531 5 5.81951237 0.81951236724853516 0.67160052007329796 +532 6 5.66872072 0.33127927780151367 0.10974595990069247 +533 6 5.66872072 0.33127927780151367 0.10974595990069247 +534 6 5.66872072 0.33127927780151367 0.10974595990069247 +535 5 5.35391045 0.35391044616699219 0.12525260390611948 +536 5 5.35391045 0.35391044616699219 0.12525260390611948 +537 6 5.66872072 0.33127927780151367 0.10974595990069247 +538 5 5.69457865 0.69457864761352539 0.48243949772063388 +539 6 5.44028759 0.55971240997314453 0.31327798187794542 +540 4 5.25917149 1.2591714859008789 1.5855128309058273 +541 5 5.079481 0.079481124877929688 0.0063172492118610535 +542 6 5.75632048 0.24367952346801758 0.05937971015760013 +543 6 5.91034174 0.089658260345458984 0.008038603648174103 +544 6 5.429198 0.57080221176147461 0.3258151649517913 +545 6 6.05427027 0.054270267486572266 0.0029452619330641028 +546 6 5.790551 0.20944881439208984 0.043868805850252102 +547 6 5.43407631 0.56592369079589844 0.32026962380405166 +548 7 6.30033445 0.69966554641723633 0.48953187684332988 +549 5 5.079481 0.079481124877929688 0.0063172492118610535 +550 7 5.43548965 1.5645103454589844 2.4476926210481906 +551 7 6.03222 0.96778011322021484 0.93659834754453186 +552 7 6.296845 0.7031550407409668 0.49442701131943068 +553 7 5.43548965 1.5645103454589844 2.4476926210481906 +554 7 6.296845 0.7031550407409668 0.49442701131943068 +555 7 6.03222 0.96778011322021484 0.93659834754453186 +556 5 5.032953 0.032952785491943359 0.0010858860716780327 +557 6 5.60137033 0.39862966537475586 0.15890561011678983 +558 5 5.41377 0.41377019882202148 0.17120577743321519 +559 6 6.48004532 0.48004531860351563 0.23044350791315082 +560 7 6.00349665 0.99650335311889648 0.9930189327772041 +561 5 5.24001074 0.24001073837280273 0.057605154534257963 +562 6 5.28676558 0.71323442459106445 0.50870334442174681 +563 7 5.429729 1.5702710151672363 2.4657510610743429 +564 5 5.3263216 0.32632160186767578 0.1064857878454859 +565 6 5.754887 0.24511289596557617 0.060080331768631368 +566 6 5.328569 0.67143106460571289 0.450819674517561 +567 5 5.592988 0.59298801422119141 0.3516347850099919 +568 6 5.67043066 0.32956933975219727 0.10861594970469923 +569 6 5.49481869 0.50518131256103516 0.2552081585608903 +570 5 5.04753637 0.047536373138427734 0.0022597067711558338 +571 7 6.6258 0.37419986724853516 0.14002554064882133 +572 5 5.35135746 0.35135746002197266 0.12345206471309211 +573 7 6.7393136 0.26068639755249023 0.067957397868894986 +574 7 6.16289759 0.83710241317749023 0.70074045014757758 +575 6 5.978729 0.021271228790283203 0.00045246517424857302 +576 6 5.980228 0.019772052764892578 0.00039093407053769624 +577 7 6.7393136 0.26068639755249023 0.067957397868894986 +578 7 6.6258 0.37419986724853516 0.14002554064882133 +579 7 6.59008455 0.40991544723510742 0.16803067388195814 +580 5 5.04753637 0.047536373138427734 0.0022597067711558338 +581 5 5.48165464 0.48165464401245117 0.23199119609876107 +582 6 5.431743 0.56825685501098633 0.32291585326697714 +583 6 5.640394 0.35960578918457031 0.12931632361505763 +584 7 6.35053444 0.64946556091308594 0.42180551481214934 +585 6 5.640394 0.35960578918457031 0.12931632361505763 +586 6 5.52043533 0.47956466674804688 0.22998226959316526 +587 7 6.54887772 0.45112228393554688 0.20351131506322417 +588 7 6.77563524 0.2243647575378418 0.050339544425014537 +589 6 5.89532852 0.10467147827148438 0.010956118363537826 +590 5 4.98952246 0.010477542877197266 0.00010977890474350716 +591 6 6.436891 0.43689107894897461 0.19087381486519917 +592 5 5.309803 0.30980300903320313 0.095977904406026937 +593 5 5.04597664 0.045976638793945313 0.0021138513147889171 +594 5 4.88176441 0.11823558807373047 0.013979654287140875 +595 7 5.559344 1.4406561851501465 2.0754902438113731 +596 5 5.309803 0.30980300903320313 0.095977904406026937 +597 6 6.028057 0.028057098388671875 0.00078720076999161392 +598 8 6.58157253 1.4184274673461914 2.0119364801221309 +599 7 6.23756 0.76244020462036133 0.58131506562153845 +600 6 5.6493926 0.35060739517211914 0.12292554554937851 +601 6 5.82520628 0.17479372024536133 0.030552844637213639 +602 5 5.04597664 0.045976638793945313 0.0021138513147889171 +603 5 4.88176441 0.11823558807373047 0.013979654287140875 +604 6 5.64465666 0.35534334182739258 0.12626889058105917 +605 6 5.64465666 0.35534334182739258 0.12626889058105917 +606 5 5.487342 0.48734188079833984 0.23750210878006328 +607 5 5.487342 0.48734188079833984 0.23750210878006328 +608 5 5.295503 0.29550313949584961 0.087322105451903553 +609 6 5.45708036 0.54291963577270508 0.29476173090756674 +610 8 7.10623741 0.89376258850097656 0.79881156460396596 +611 6 5.615421 0.38457918167114258 0.14790114697484569 +612 5 5.25086737 0.25086736679077148 0.062934435720535475 +613 5 5.33452845 0.33452844619750977 0.11190928131532019 +614 5 5.33452845 0.33452844619750977 0.11190928131532019 +615 5 5.25086737 0.25086736679077148 0.062934435720535475 +616 7 6.00642872 0.99357128143310547 0.98718389128862327 +617 6 5.77096748 0.22903251647949219 0.05245589360492886 +618 6 5.84212971 0.15787029266357422 0.024923029305682576 +619 6 5.984556 0.015443801879882813 0.00023851101650507189 +620 5 5.22900248 0.22900247573852539 0.05244213389437391 +621 5 5.36206055 0.362060546875 0.13108783960342407 +622 6 5.93520927 0.064790725708007813 0.0041978381377703045 +623 5 4.71454334 0.28545665740966797 0.081485503259500547 +624 5 5.071442 0.071442127227783203 0.0051039775428307621 +625 8 6.65726042 1.3427395820617676 1.8029495852354103 +626 4 4.52697849 0.52697849273681641 0.27770633180716686 +627 6 5.39603329 0.60396671295166016 0.36477579035363306 +628 6 5.39603329 0.60396671295166016 0.36477579035363306 +629 6 5.55218744 0.44781255722045898 0.20053608640432685 +630 5 5.42956257 0.42956256866455078 0.1845240003976869 +631 5 5.42956257 0.42956256866455078 0.1845240003976869 +632 6 5.772721 0.2272791862487793 0.051655828501907308 +633 5 5.31113052 0.31113052368164063 0.096802202766411938 +634 6 6.38461 0.38461017608642578 0.14792498754923145 +635 6 6.17356 0.17356014251708984 0.030123123070552538 +636 7 6.31279945 0.68720054626464844 0.47224459078643122 +637 5 5.275313 0.27531290054321289 0.075797193205517033 +638 5 5.26560354 0.26560354232788086 0.070545241697118399 +639 5 5.257151 0.25715112686157227 0.066126702046176433 +640 7 6.23770428 0.76229572296142578 0.58109476924528281 +641 4 5.22752 1.2275199890136719 1.5068053234281251 +642 6 5.822799 0.1772007942199707 0.031400121472188403 +643 5 5.47019768 0.47019767761230469 0.22108585603200481 +644 5 5.47785473 0.47785472869873047 0.2283451417397373 +645 5 5.157337 0.15733718872070313 0.024754990954534151 +646 4 4.80251074 0.80251073837280273 0.64402348520366104 +647 6 6.12228966 0.12228965759277344 0.01495476035415777 +648 5 5.202234 0.20223379135131836 0.040898506364328568 +649 7 6.353786 0.64621400833129883 0.41759254456360395 +650 7 6.353786 0.64621400833129883 0.41759254456360395 +651 7 6.353786 0.64621400833129883 0.41759254456360395 +652 7 6.353786 0.64621400833129883 0.41759254456360395 +653 6 5.529214 0.47078609466552734 0.22163954693041887 +654 7 6.675183 0.32481718063354492 0.10550620083472495 +655 6 6.66171551 0.66171550750732422 0.43786741287567565 +656 6 6.07065535 0.070655345916748047 0.0049921779066153249 +657 5 4.939713 0.060286998748779297 0.0036345222181353165 +658 5 5.754849 0.75484895706176758 0.56979694797723823 +659 4 4.11328363 0.11328363418579102 0.012833181774340119 +660 5 5.09369659 0.09369659423828125 0.0087790517718531191 +661 7 7.069395 0.069395065307617188 0.0048156750890484545 +662 4 4.37782669 0.37782669067382813 0.1427530081855366 +663 5 5.09369659 0.09369659423828125 0.0087790517718531191 +664 6 5.83840847 0.16159152984619141 0.026111822518032568 +665 5 5.153395 0.15339517593383789 0.023530079999773079 +666 6 6.53245831 0.53245830535888672 0.28351184694565745 +667 6 5.83840847 0.16159152984619141 0.026111822518032568 +668 6 5.71215439 0.28784561157226563 0.082855096101411618 +669 5 5.498241 0.49824094772338867 0.24824404198830052 +670 6 5.217243 0.78275680541992188 0.61270821643120144 +671 6 6.30048275 0.30048274993896484 0.090289883010882477 +672 8 7.20319748 0.79680252075195313 0.63489425707666669 +673 6 6.011775 0.011775016784667969 0.00013865102027921239 +674 5 5.35568476 0.35568475723266602 0.12651164652766056 +675 6 5.22133827 0.77866172790527344 0.60631408650442609 +676 6 5.413211 0.58678913116455078 0.34432148445284838 +677 7 6.71524572 0.28475427627563477 0.081084997857260532 +678 7 6.71524572 0.28475427627563477 0.081084997857260532 +679 7 6.71524572 0.28475427627563477 0.081084997857260532 +680 5 5.32334 0.32333993911743164 0.1045487162284644 +681 5 4.97009945 0.029900550842285156 0.00089404294067207957 +682 6 5.39260864 0.607391357421875 0.36892426107078791 +683 5 5.29420948 0.29420948028564453 0.086559218289949058 +684 5 5.5085063 0.50850629806518555 0.25857865517195933 +685 5 5.22983646 0.22983646392822266 0.052824800151029194 +686 7 5.97222853 1.0277714729309082 1.0563142005705686 +687 4 4.579601 0.57960081100463867 0.33593710011723488 +688 6 5.6276 0.37239980697631836 0.13868161623599917 +689 7 6.439974 0.56002616882324219 0.31362930976683856 +690 4 5.59999561 1.5999956130981445 2.5599859619333074 +691 6 5.26191568 0.73808431625366211 0.54476845789963591 +692 5 5.24829674 0.24829673767089844 0.061651269938010955 +693 5 5.16820669 0.16820669174194336 0.028293491146769156 +694 6 5.43879366 0.56120634078979492 0.31495255694267144 +695 5 5.37247038 0.37247037887573242 0.13873418313983166 +696 6 6.118032 0.11803197860717773 0.013931547973925262 +697 5 5.424995 0.42499494552612305 0.1806207037227523 +698 5 5.424995 0.42499494552612305 0.1806207037227523 +699 5 5.522417 0.52241706848144531 0.27291959344074712 +700 5 5.177611 0.17761087417602539 0.031545622625571923 +701 7 7.084567 0.084567070007324219 0.0071515893296236754 +702 4 4.96964169 0.96964168548583984 0.94020499823182035 +703 6 5.691428 0.30857181549072266 0.095216565315240587 +704 6 6.480943 0.48094320297241211 0.23130636448536279 +705 5 5.20250845 0.20250844955444336 0.041009672140944531 +706 5 5.320039 0.32003879547119141 0.10242483060665108 +707 6 6.23916864 0.23916864395141602 0.057201640249559205 +708 6 6.148995 0.14899492263793945 0.022199486971885563 +709 5 4.75704765 0.24295234680175781 0.0590258428164816 +710 5 5.37451839 0.37451839447021484 0.14026402779654745 +711 6 6.10724831 0.10724830627441406 0.011502199198730523 +712 6 6.10724831 0.10724830627441406 0.011502199198730523 +713 5 5.6087265 0.60872650146484375 0.37054795358562842 +714 6 6.025354 0.025353908538818359 0.00064282067819476651 +715 7 6.566482 0.4335179328918457 0.18793779813881883 +716 6 5.37237167 0.62762832641601563 0.39391731611976866 +717 5 5.390794 0.39079380035400391 0.15271979439512506 +718 7 6.566482 0.4335179328918457 0.18793779813881883 +719 7 6.615624 0.38437604904174805 0.1477449470769443 +720 5 5.196617 0.19661712646484375 0.038658294419292361 +721 5 5.14307642 0.14307641983032227 0.020470861911462634 +722 6 6.191565 0.19156503677368164 0.036697163314101999 +723 8 6.70217752 1.2978224754333496 1.6843431777399474 +724 7 5.99594545 1.0040545463562012 1.0081255320585569 +725 5 5.34394455 0.34394454956054688 0.11829785317240749 +726 7 6.90710545 0.092894554138183594 0.0086293981885319226 +727 5 5.340127 0.34012699127197266 0.11568637019172456 +728 5 6.005658 1.0056581497192383 1.0113483140967219 +729 5 5.0085516 0.0085515975952148438 7.3129821430484299E-05 +730 6 6.216481 0.21648120880126953 0.046864113764058857 +731 6 5.50056076 0.49943923950195313 0.24943955395428929 +732 7 6.1538806 0.84611940383911133 0.71591804555305316 +733 6 5.917358 0.082642078399658203 0.006829713122215253 +734 5 5.30464649 0.30464649200439453 0.092809485090583621 +735 6 5.54713726 0.45286273956298828 0.20508466088449495 +736 6 5.917358 0.082642078399658203 0.006829713122215253 +737 5 5.30464649 0.30464649200439453 0.092809485090583621 +738 7 6.35726547 0.64273452758789063 0.41310767295362893 +739 6 5.54713726 0.45286273956298828 0.20508466088449495 +740 3 3.93911076 0.93911075592041016 0.88192901188540418 +741 6 6.073226 0.073225975036621094 0.0053620434200638556 +742 6 6.25418758 0.25418758392333984 0.064611327820784936 +743 5 5.543552 0.54355192184448242 0.29544869174083033 +744 5 5.537819 0.53781890869140625 0.28924917854601517 +745 6 6.385117 0.3851170539855957 0.14831514527054424 +746 6 5.829892 0.17010784149169922 0.028936677736965066 +747 6 6.05567837 0.055678367614746094 0.0031000806202428066 +748 6 5.95539427 0.044605731964111328 0.001989671324054143 +749 6 6.11404753 0.11404752731323242 0.013006838486262495 +750 6 6.05567837 0.055678367614746094 0.0031000806202428066 +751 6 6.03684855 0.036848545074462891 0.0013578152741047234 +752 6 6.08775139 0.087751388549804688 0.0077003061924187932 +753 6 5.829892 0.17010784149169922 0.028936677736965066 +754 5 5.335464 0.3354640007019043 0.11253609576692725 +755 7 6.634498 0.36550188064575195 0.13359162475558151 +756 5 5.459274 0.4592738151550293 0.21093243728705602 +757 6 5.965418 0.034582138061523438 0.001195924272906268 +758 7 6.82623148 0.17376852035522461 0.030195498666444109 +759 7 6.87592745 0.12407255172729492 0.015393998092122274 +760 6 5.95539427 0.044605731964111328 0.001989671324054143 +761 6 5.779576 0.22042417526245117 0.048586817040131791 +762 5 5.325914 0.32591390609741211 0.10621987418767276 +763 6 5.965965 0.034035205841064453 0.0011583952366436279 +764 6 5.52306747 0.47693252563476563 0.22746463400835637 +765 6 5.928421 0.0715789794921875 0.0051235503051429987 +766 5 5.19307232 0.19307231903076172 0.037276920375916234 +767 6 5.473008 0.52699184417724609 0.27772040382933483 +768 7 6.3073473 0.69265270233154297 0.47976776604718907 +769 7 6.3073473 0.69265270233154297 0.47976776604718907 +770 7 6.366083 0.63391685485839844 0.40185057887356379 +771 7 6.00737333 0.99262666702270508 0.98530770008460422 +772 7 5.81501532 1.1849846839904785 1.4041887012920142 +773 5 5.39121532 0.39121532440185547 0.15304943004684901 +774 9 6.090269 2.9097309112548828 8.4665339759121707 +775 6 6.3398385 0.33983850479125977 0.11549020933875909 +776 6 6.049326 0.049325942993164063 0.0024330486521648709 +777 5 5.56175232 0.5617523193359375 0.3155656682793051 +778 7 6.200076 0.79992389678955078 0.63987824065497989 +779 8 7.166649 0.83335113525390625 0.69447411462897435 +780 4 4.306471 0.30647087097167969 0.093924394754139939 +781 6 5.39670324 0.60329675674438477 0.36396697669829337 +782 7 6.200076 0.79992389678955078 0.63987824065497989 +783 8 7.166649 0.83335113525390625 0.69447411462897435 +784 5 5.56175232 0.5617523193359375 0.3155656682793051 +785 6 5.8870883 0.11291170120239258 0.012749052268418382 +786 6 5.62655067 0.37344932556152344 0.13946439876235672 +787 6 5.62655067 0.37344932556152344 0.13946439876235672 +788 7 5.87119961 1.1288003921508789 1.274190325319978 +789 6 5.8870883 0.11291170120239258 0.012749052268418382 +790 6 5.62655067 0.37344932556152344 0.13946439876235672 +791 7 6.791107 0.208892822265625 0.043636211194097996 +792 5 5.34000731 0.34000730514526367 0.11560496755214444 +793 7 6.791107 0.208892822265625 0.043636211194097996 +794 5 5.328908 0.32890796661376953 0.10818045050200453 +795 5 5.189716 0.18971586227416992 0.03599210839843181 +796 6 5.31731224 0.68268775939941406 0.46606257683379226 +797 6 5.86112165 0.13887834548950195 0.019287194845901467 +798 6 5.7783494 0.22165060043334961 0.049128988672464402 +799 8 6.69024658 1.30975341796875 1.7154540158808231 +800 6 5.462918 0.53708219528198242 0.2884572844889135 +801 5 5.281977 0.28197717666625977 0.079511128160675071 +802 5 5.42389345 0.42389345169067383 0.17968565838623363 +803 7 5.8122654 1.1877346038818359 1.4107134892583417 +804 6 5.451923 0.54807710647583008 0.30038851464291838 +805 6 5.462918 0.53708219528198242 0.2884572844889135 +806 5 5.32510662 0.32510662078857422 0.1056943148805658 +807 6 5.34558773 0.65441226959228516 0.42825541859292571 +808 6 5.27500248 0.72499752044677734 0.52562140465397533 +809 6 5.34558773 0.65441226959228516 0.42825541859292571 +810 5 5.281977 0.28197717666625977 0.079511128160675071 +811 6 5.31018972 0.68981027603149414 0.47583821691864614 +812 7 5.168549 1.8314509391784668 3.3542125426176881 +813 6 5.58469772 0.41530227661132813 0.1724759809585521 +814 6 5.335502 0.66449785232543945 0.44155739574512154 +815 5 5.2698555 0.26985549926757813 0.072821990484953858 +816 5 5.22790766 0.22790765762329102 0.051941900403335239 +817 5 5.063816 0.063816070556640625 0.0040724908612901345 +818 5 5.2698555 0.26985549926757813 0.072821990484953858 +819 5 5.063816 0.063816070556640625 0.0040724908612901345 +820 9 7.47892332 1.5210766792297363 2.3136742640965622 +821 6 5.18003941 0.81996059417724609 0.67233537600350246 +822 5 5.799497 0.79949712753295898 0.63919565693345248 +823 6 5.812003 0.18799686431884766 0.035342820993719215 +824 5 5.22790766 0.22790765762329102 0.051941900403335239 +825 6 5.97561169 0.024388313293457031 0.00059478982529981295 +826 6 5.901674 0.098326206207275391 0.0096680428271156416 +827 9 6.82888842 2.1711115837097168 4.7137255089185146 +828 7 6.37836266 0.62163734436035156 0.38643298790339031 +829 7 6.119482 0.88051795959472656 0.77531187716886052 +830 6 5.980976 0.019023895263671875 0.0003619085910031572 +831 4 5.924944 1.9249439239501953 3.7054091103527753 +832 8 7.287973 0.71202707290649414 0.50698255255178992 +833 6 6.375841 0.37584114074707031 0.14125656307805912 +834 6 5.980976 0.019023895263671875 0.0003619085910031572 +835 8 6.824942 1.1750578880310059 1.3807610402238879 +836 8 6.996419 1.0035810470581055 1.0071749180142433 +837 8 6.996419 1.0035810470581055 1.0071749180142433 +838 8 6.996419 1.0035810470581055 1.0071749180142433 +839 7 6.26726866 0.73273134231567383 0.53689522001172918 +840 7 6.27416039 0.72583961486816406 0.52684314651196473 +841 7 6.315333 0.68466711044311523 0.46876905212252495 +842 7 6.315333 0.68466711044311523 0.46876905212252495 +843 7 6.216423 0.78357696533203125 0.6139928605989553 +844 8 6.64945936 1.3505406379699707 1.8239600148083355 +845 8 6.64945936 1.3505406379699707 1.8239600148083355 +846 5 5.850869 0.85086917877197266 0.72397835938409116 +847 5 5.22373867 0.22373867034912109 0.050058992609592678 +848 7 6.315333 0.68466711044311523 0.46876905212252495 +849 6 6.091377 0.091376781463623047 0.0083497161906507245 +850 7 6.216423 0.78357696533203125 0.6139928605989553 +851 5 5.26563931 0.26563930511474609 0.07056424042184517 +852 7 6.802008 0.19799184799194336 0.039200771871264806 +853 5 5.06763172 0.067631721496582031 0.004574049752591236 +854 7 6.802008 0.19799184799194336 0.039200771871264806 +855 7 6.67673635 0.32326364517211914 0.10449938428996575 +856 5 5.26563931 0.26563930511474609 0.07056424042184517 +857 5 5.278694 0.27869415283203125 0.077670430822763592 +858 7 6.01344061 0.98655939102172852 0.97329943201316382 +859 5 5.39770174 0.39770174026489258 0.15816667420972408 +860 8 6.41191339 1.5880866050720215 2.5220190652091787 +861 7 6.09758043 0.9024195671081543 0.8143610750996686 +862 6 5.68773556 0.31226444244384766 0.097509082014767046 +863 6 6.32151937 0.32151937484741211 0.1033747084022707 +864 5 5.586795 0.58679485321044922 0.34432819975427265 +865 6 6.401601 0.40160083770751953 0.16128323284738144 +866 7 6.802008 0.19799184799194336 0.039200771871264806 +867 8 6.85899353 1.1410064697265625 1.301895763957873 +868 7 6.32456255 0.67543745040893555 0.45621574941492327 +869 6 6.04672527 0.046725273132324219 0.0021832511492902995 +870 5 5.081021 0.081020832061767578 0.0065643752279811451 +871 5 5.06763172 0.067631721496582031 0.004574049752591236 +872 6 5.7612443 0.23875570297241211 0.057004285701850677 +873 3 4.103586 1.1035861968994141 1.2179024939869123 +874 5 5.22211456 0.22211456298828125 0.049334879091475159 +875 7 6.17575169 0.82424831390380859 0.67938528297327139 +876 9 7.38359642 1.6164035797119141 2.6127605325054901 +877 6 5.57609 0.42391014099121094 0.17969980763518834 +878 6 5.83978128 0.16021871566772461 0.025670036850215183 +879 8 7.260392 0.73960781097412109 0.54701971405393124 +880 7 6.17575169 0.82424831390380859 0.67938528297327139 +881 6 5.044123 0.95587682723999023 0.91370050885439014 +882 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +883 6 5.99509144 0.0049085617065429688 2.4093978026940022E-05 +884 6 5.8775425 0.12245750427246094 0.014995840352639789 +885 7 6.52155638 0.47844362258911133 0.228908299996192 +886 6 5.89761448 0.10238552093505859 0.010482794897143322 +887 7 6.7517786 0.24822139739990234 0.061613862127160246 +888 6 5.89761448 0.10238552093505859 0.010482794897143322 +889 7 6.7517786 0.24822139739990234 0.061613862127160246 +890 6 5.35475159 0.6452484130859375 0.41634551458992064 +891 7 6.24612236 0.75387763977050781 0.56833149574595154 +892 5 5.746893 0.74689292907714844 0.55784904750544229 +893 7 6.4414587 0.55854129791259766 0.31196838147388917 +894 7 6.24612236 0.75387763977050781 0.56833149574595154 +895 6 6.04552126 0.045521259307861328 0.0020721850489735516 +896 6 6.043535 0.043535232543945313 0.001895316472655395 +897 6 5.37033558 0.62966442108154297 0.39647728317595465 +898 6 5.89646244 0.10353755950927734 0.010720026229137147 +899 6 6.043535 0.043535232543945313 0.001895316472655395 +900 7 6.437248 0.56275177001953125 0.31668955466011539 +901 6 5.793899 0.2061009407043457 0.042477597759216223 +902 5 5.28579044 0.28579044342041016 0.081676177550434659 +903 6 5.409873 0.59012699127197266 0.34824986582771089 +904 8 5.79865074 2.2013492584228516 4.8459385575588385 +905 4 4.89676857 0.89676856994628906 0.80419386804351234 +906 4 4.57636929 0.57636928558349609 0.33220155336402968 +907 8 6.83107567 1.1689243316650391 1.3663840931585582 +908 4 5.50111961 1.5011196136474609 2.2533600944771024 +909 5 5.838393 0.83839321136474609 0.70290317686249182 +910 5 5.26750469 0.26750469207763672 0.071558760283551237 +911 5 5.197639 0.19763898849487305 0.039061169773276561 +912 5 5.24751234 0.2475123405456543 0.061262358722387944 +913 5 4.95306063 0.046939373016357422 0.0022033047391687433 +914 4 4.5945096 0.59450960159301758 0.35344166638628849 +915 5 4.95306063 0.046939373016357422 0.0022033047391687433 +916 7 6.440396 0.55960416793823242 0.31315682477384144 +917 6 5.95007324 0.0499267578125 0.0024926811456680298 +918 6 6.325206 0.32520580291748047 0.10575881425120315 +919 7 5.990829 1.0091710090637207 1.0184261255346883 +920 7 6.069497 0.93050289154052734 0.86583563116528239 +921 6 5.535707 0.46429300308227539 0.21556799271115779 +922 6 5.535707 0.46429300308227539 0.21556799271115779 +923 6 5.70260572 0.2973942756652832 0.088443355198478457 +924 8 6.935463 1.0645370483398438 1.1332391272881068 +925 5 5.005663 0.0056629180908203125 3.2068641303339973E-05 +926 5 5.006425 0.0064249038696289063 4.1279389733972494E-05 +927 7 5.692542 1.3074579238891602 1.7094462227405529 +928 5 5.34776735 0.34776735305786133 0.12094213185287117 +929 5 5.56059361 0.56059360504150391 0.31426519001342967 +930 7 6.387425 0.61257505416870117 0.37524819698978717 +931 5 5.51956034 0.51956033706665039 0.26994294385281137 +932 6 5.69498348 0.30501651763916016 0.093035076032720099 +933 5 5.52175 0.52174997329711914 0.27222303463554454 +934 5 5.398334 0.39833402633666992 0.15866999653758285 +935 5 5.399966 0.39996576309204102 0.15997261164579868 +936 5 5.148321 0.14832115173339844 0.021999164051521802 +937 5 5.56059361 0.56059360504150391 0.31426519001342967 +938 6 5.893504 0.10649585723876953 0.011341367609020381 +939 7 5.759181 1.240818977355957 1.539631734566683 +940 5 5.41476154 0.41476154327392578 0.17202713777896861 +941 6 5.678872 0.32112789154052734 0.10312312272526469 +942 7 5.951344 1.0486559867858887 1.0996793786218859 +943 7 6.59410334 0.40589666366577148 0.16475210157500442 +944 7 5.97247076 1.027529239654541 1.0558163383450392 +945 7 6.28033543 0.71966457366943359 0.51791709859480761 +946 5 4.995405 0.0045948028564453125 2.1112213289598003E-05 +947 5 5.556999 0.55699920654296875 0.31024811608949676 +948 4 4.46932173 0.46932172775268555 0.22026288414076589 +949 5 5.3680234 0.36802339553833008 0.13544121966356215 +950 5 5.094201 0.094201087951660156 0.0088738449712764123 +951 6 5.8765893 0.12341070175170898 0.015230201306849267 +952 6 5.794643 0.20535707473754883 0.042171528144763215 +953 5 5.681073 0.68107318878173828 0.46386068847732531 +954 6 5.8765893 0.12341070175170898 0.015230201306849267 +955 5 5.094201 0.094201087951660156 0.0088738449712764123 +956 5 4.910827 0.089172840118408203 0.0079517954147831915 +957 7 6.410335 0.58966493606567383 0.3477047368253352 +958 7 6.40000057 0.59999942779541016 0.35999931335481961 +959 6 5.77616739 0.22383260726928711 0.050101036076966921 +960 6 5.77616739 0.22383260726928711 0.050101036076966921 +961 7 6.829785 0.17021512985229492 0.028973190430633622 +962 6 5.77616739 0.22383260726928711 0.050101036076966921 +963 6 6.27916765 0.27916765213012695 0.077934577995847576 +964 6 5.445577 0.55442285537719727 0.30738470256460459 +965 5 5.65728569 0.65728569030761719 0.43202447868316085 +966 6 5.425735 0.5742650032043457 0.32978029390528718 +967 6 5.847084 0.15291595458984375 0.023383289168123156 +968 7 6.935579 0.064421176910400391 0.0041500880345211044 +969 7 6.58235359 0.41764640808105469 0.17442852218300686 +970 7 6.57454634 0.42545366287231445 0.181010819251469 +971 7 6.667626 0.33237409591674805 0.11047253963647563 +972 6 5.847084 0.15291595458984375 0.023383289168123156 +973 7 6.935579 0.064421176910400391 0.0041500880345211044 +974 6 6.34301424 0.34301424026489258 0.11765876902450145 +975 5 5.274759 0.27475881576538086 0.075492406840794501 +976 6 6.03319836 0.033198356628417969 0.0011021308828276233 +977 5 5.74932528 0.74932527542114258 0.56148836838497118 +978 7 6.81341648 0.18658351898193359 0.034813409555681574 +979 5 5.48856926 0.48856925964355469 0.23869992146865116 +980 6 5.61005259 0.38994741439819336 0.15205898599583634 +981 7 6.81341648 0.18658351898193359 0.034813409555681574 +982 6 6.38202953 0.38202953338623047 0.14594656437930098 +983 6 6.28082752 0.28082752227783203 0.078864097268706246 +984 5 6.16001749 1.1600174903869629 1.3456405780036675 +985 6 5.89866829 0.10133171081542969 0.01026811561678187 +986 6 5.61840868 0.3815913200378418 0.1456119355282226 +987 6 5.59948635 0.40051364898681641 0.16041118302473478 +988 5 6.16001749 1.1600174903869629 1.3456405780036675 +989 7 6.30157232 0.69842767715454102 0.48780122021548777 +990 6 5.96048832 0.039511680603027344 0.0015611729040756472 +991 4 4.604853 0.60485315322875977 0.36584733697077354 +992 5 5.62472773 0.62472772598266602 0.39028473161147303 +993 4 4.80034733 0.80034732818603516 0.64055584573452506 +994 6 5.684209 0.31579113006591797 0.09972403782830952 +995 6 5.80417538 0.19582462310791016 0.03834728301535506 +996 5 4.886474 0.1135258674621582 0.012888122583035511 +997 6 5.55949831 0.44050168991088867 0.19404173881434872 +998 6 5.67601442 0.32398557662963867 0.10496665386403947 +999 7 6.07843542 0.92156457901000977 0.84928127328589653 +1000 7 5.663046 1.3369541168212891 1.787446310485393 +1001 5 5.360303 0.36030292510986328 0.12981819784272375 +1002 6 5.364488 0.63551187515258789 0.40387534345995846 +1003 7 5.83212233 1.1678776741027832 1.3639382616677267 +1004 6 6.53543663 0.53543663024902344 0.28669238501242944 +1005 6 6.39813471 0.39813470840454102 0.1585112460363689 +1006 6 6.53543663 0.53543663024902344 0.28669238501242944 +1007 5 5.15309 0.15309000015258789 0.02343654814671936 +1008 7 6.193991 0.80600881576538086 0.64965021109151166 +1009 6 5.99658966 0.00341033935546875 1.1630414519459009E-05 +1010 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1011 7 6.34206772 0.65793228149414063 0.4328748870320851 +1012 6 5.97693157 0.023068428039550781 0.0005321523722159327 +1013 5 5.46526432 0.46526432037353516 0.21647088781264756 +1014 5 5.52939034 0.52939033508300781 0.28025412687929929 +1015 5 5.2178936 0.21789360046386719 0.047477621123107383 +1016 5 5.223675 0.22367477416992188 0.05003040459996555 +1017 6 5.99580956 0.0041904449462890625 1.7559828847879544E-05 +1018 6 6.049116 0.049116134643554688 0.0024123946823237929 +1019 6 5.821385 0.17861509323120117 0.031903351529990687 +1020 7 6.07170248 0.92829751968383789 0.8617362850511654 +1021 7 6.07170248 0.92829751968383789 0.8617362850511654 +1022 8 7.050686 0.94931411743164063 0.90119729355501477 +1023 6 5.75873566 0.24126434326171875 0.058208483329508454 +1024 6 5.8799963 0.12000370025634766 0.014400888075215335 +1025 6 5.94306231 0.056937694549560547 0.0032419010606190568 +1026 6 6.319114 0.31911420822143555 0.10183387788879372 +1027 4 4.486199 0.48619890213012695 0.23638937243254077 +1028 7 6.42486572 0.57513427734375 0.33077943697571754 +1029 4 4.84544 0.84543991088867188 0.71476864292344544 +1030 6 5.735335 0.26466512680053711 0.070047629344344386 +1031 6 5.634032 0.36596822738647461 0.13393274345639838 +1032 6 5.66100645 0.33899354934692383 0.11491662649882528 +1033 6 5.66100645 0.33899354934692383 0.11491662649882528 +1034 3 4.125488 1.1254878044128418 1.2667227978820392 +1035 6 6.138177 0.13817691802978516 0.019092860676209966 +1036 5 5.83896446 0.83896446228027344 0.70386136896922835 +1037 5 4.90821743 0.091782569885253906 0.0084240401347415172 +1038 7 6.129409 0.87059116363525391 0.75792897419978544 +1039 5 5.80689764 0.80689764022827148 0.65108380180595304 +1040 4 4.708788 0.70878791809082031 0.5023803128315194 +1041 5 5.35757828 0.35757827758789063 0.12786222460272256 +1042 4 5.14486027 1.1448602676391602 1.3107050324188094 +1043 5 5.193105 0.19310522079467773 0.037289626298161238 +1044 7 5.90646 1.0935401916503906 1.1958301507547731 +1045 5 5.8116107 0.81161069869995117 0.65871192624422292 +1046 5 5.47202826 0.47202825546264648 0.22281067395510945 +1047 5 4.55644464 0.44355535507202148 0.19674135301306706 +1048 5 5.14154768 0.14154767990112305 0.020035745685390793 +1049 6 6.93397 0.93396997451782227 0.87229991330082157 +1050 5 5.74641466 0.7464146614074707 0.55713484676402913 +1051 6 5.719286 0.28071403503417969 0.078800369465170661 +1052 5 5.93918657 0.93918657302856445 0.88207141895713903 +1053 4 4.582541 0.58254098892211914 0.33935400377436054 +1054 5 4.55644464 0.44355535507202148 0.19674135301306706 +1055 5 5.63114262 0.63114261627197266 0.39834100207463052 +1056 6 5.77064943 0.22935056686401367 0.052601682520844406 +1057 5 5.126986 0.12698602676391602 0.016125450993285995 +1058 6 5.77064943 0.22935056686401367 0.052601682520844406 +1059 4 4.764793 0.76479291915893555 0.58490820919564612 +1060 7 6.389546 0.61045408248901367 0.37265418682750351 +1061 5 5.530722 0.53072214126586914 0.28166599122982916 +1062 5 4.86435127 0.13564872741699219 0.018400577249849448 +1063 5 5.185606 0.18560600280761719 0.034449588278221199 +1064 6 5.9687047 0.031295299530029297 0.00097939577267425193 +1065 5 5.57840729 0.57840728759765625 0.33455499034607783 +1066 6 5.432509 0.56749105453491211 0.32204609697714659 +1067 7 6.191147 0.8088531494140625 0.65424341731704772 +1068 7 6.02748346 0.97251653671264648 0.94578841417956028 +1069 6 6.485815 0.48581504821777344 0.23601626107483753 +1070 7 5.874095 1.1259050369262695 1.2676621521759444 +1071 5 5.57840729 0.57840728759765625 0.33455499034607783 +1072 7 6.143502 0.85649776458740234 0.73358842074321728 +1073 5 5.889502 0.88950204849243164 0.79121389427223221 +1074 6 5.229453 0.77054691314697266 0.59374254536032822 +1075 7 6.860558 0.13944196701049805 0.019444062163756826 +1076 6 5.789614 0.21038579940795898 0.044262184592525955 +1077 5 5.7062 0.70620012283325195 0.49871861348970015 +1078 5 5.34196043 0.34196043014526367 0.11693693578513376 +1079 6 5.595201 0.40479898452758789 0.16386221787456634 +1080 7 6.304265 0.69573497772216797 0.48404715922606556 +1081 6 5.60046434 0.3995356559753418 0.15962874039564667 +1082 6 5.60046434 0.3995356559753418 0.15962874039564667 +1083 6 6.12530851 0.12530851364135742 0.015702223591006259 +1084 7 6.0881176 0.91188240051269531 0.83152951236479566 +1085 5 4.941861 0.058138847351074219 0.0033801255713115097 +1086 8 7.36834431 0.63165569305419922 0.39898891456778074 +1087 8 6.271207 1.7287931442260742 2.9887257355230759 +1088 6 6.12530851 0.12530851364135742 0.015702223591006259 +1089 7 6.3522625 0.64773750305175781 0.41956387285972596 +1090 6 5.683116 0.31688404083251953 0.10041549533434591 +1091 6 6.12395525 0.12395524978637695 0.015364903949603104 +1092 6 5.620014 0.37998580932617188 0.14438921528926585 +1093 7 6.19363451 0.8063654899597168 0.65022530339797413 +1094 5 5.29982042 0.2998204231262207 0.089892286123586018 +1095 8 6.90607738 1.0939226150512695 1.196666687720608 +1096 6 5.973055 0.026945114135742188 0.00072603917578817345 +1097 7 6.0881176 0.91188240051269531 0.83152951236479566 +1098 6 6.02920532 0.029205322265625 0.00085295084863901138 +1099 7 7.05420256 0.054202556610107422 0.0029379171430718998 +1100 6 5.60046434 0.3995356559753418 0.15962874039564667 +1101 6 6.717598 0.71759796142578125 0.51494683424243703 +1102 5 6.292189 1.2921891212463379 1.6697527250673829 +1103 5 5.21190643 0.21190643310546875 0.044904336391482502 +1104 5 4.941861 0.058138847351074219 0.0033801255713115097 +1105 7 6.66590166 0.33409833908081055 0.11162170017655626 +1106 8 7.36834431 0.63165569305419922 0.39898891456778074 +1107 7 6.877219 0.12278079986572266 0.015075124815666641 +1108 7 6.55390263 0.44609737396240234 0.19900286705615144 +1109 4 4.86790562 0.86790561676025391 0.75326015960399673 +1110 7 6.877219 0.12278079986572266 0.015075124815666641 +1111 6 6.00191641 0.0019164085388183594 3.6726216876559192E-06 +1112 6 5.69383526 0.30616474151611328 0.093736848947628459 +1113 5 5.76925039 0.76925039291381836 0.59174616699806393 +1114 4 4.30118465 0.30118465423583984 0.0907121959471624 +1115 8 6.56404 1.4359598159790039 2.0619805931064548 +1116 5 4.86854839 0.13145160675048828 0.017279524917285016 +1117 5 5.349912 0.34991216659545898 0.12243852433152824 +1118 5 4.86854839 0.13145160675048828 0.017279524917285016 +1119 5 5.1008563 0.10085630416870117 0.010171994090569569 +1120 6 6.10804558 0.10804557800292969 0.011673846925987164 +1121 6 5.57668161 0.42331838607788086 0.1791984559915818 +1122 7 6.76281452 0.23718547821044922 0.056256951073919481 +1123 5 5.12697363 0.12697362899780273 0.016122302460871651 +1124 5 5.59565544 0.59565544128417969 0.35480540473145084 +1125 6 5.312439 0.68756103515625 0.47274017706513405 +1126 7 7.215483 0.21548318862915039 0.046433004581786008 +1127 7 6.62216425 0.37783575057983398 0.14275985441622652 +1128 5 5.652318 0.65231800079345703 0.42551877415917261 +1129 7 6.32973528 0.67026472091674805 0.44925479610560615 +1130 6 6.008838 0.0088381767272949219 7.8113367862897576E-05 +1131 6 5.69190931 0.3080906867980957 0.094919871291722302 +1132 5 5.54256248 0.54256248474121094 0.29437404984855675 +1133 5 5.666878 0.66687822341918945 0.44472656487073436 +1134 5 5.67285061 0.67285060882568359 0.45272794179709308 +1135 6 5.64160347 0.35839653015136719 0.12844807282453985 +1136 8 7.27833652 0.72166347503662109 0.52079817120193184 +1137 8 6.927531 1.0724692344665527 1.1501902588772737 +1138 5 5.07826948 0.078269481658935547 0.006126111759158448 +1139 5 5.83621359 0.83621358871459961 0.69925316595094955 +1140 6 5.928343 0.071657180786132813 0.0051347515582165215 +1141 5 4.850951 0.14904880523681641 0.02221554634252243 +1142 5 5.07826948 0.078269481658935547 0.006126111759158448 +1143 5 5.90772963 0.9077296257019043 0.82397307337691927 +1144 5 5.90772963 0.9077296257019043 0.82397307337691927 +1145 5 5.13637543 0.13637542724609375 0.01859825715655461 +1146 5 5.33813667 0.33813667297363281 0.1143364096096775 +1147 5 4.88847 0.11152982711791992 0.012438902336953106 +1148 6 6.21973848 0.21973848342895508 0.048285001099657165 +1149 5 5.244409 0.24440908432006836 0.059735800498174285 +1150 5 5.07894039 0.078940391540527344 0.006231585416571761 +1151 5 5.13637543 0.13637542724609375 0.01859825715655461 +1152 4 4.63385725 0.63385725021362305 0.40177501364837553 +1153 6 5.98369 0.016310214996337891 0.00026602311322676542 +1154 4 5.617376 1.6173758506774902 2.6159046423547352 +1155 4 5.803424 1.8034238815307617 3.2523376964754789 +1156 6 5.578991 0.42100906372070313 0.17724863173498306 +1157 6 5.578991 0.42100906372070313 0.17724863173498306 +1158 6 5.70412 0.29587984085083008 0.087544880221912535 +1159 6 5.578991 0.42100906372070313 0.17724863173498306 +1160 6 6.017941 0.017940998077392578 0.00032187941201300418 +1161 6 5.578991 0.42100906372070313 0.17724863173498306 +1162 7 6.018001 0.98199892044067383 0.96432187974664885 +1163 6 5.70412 0.29587984085083008 0.087544880221912535 +1164 6 5.45376539 0.5462346076965332 0.29837224664538553 +1165 5 6.16789961 1.1678996086120605 1.3639894957962042 +1166 5 4.949173 0.0508270263671875 0.0025833866093307734 +1167 6 5.63779 0.36220979690551758 0.13119593697433629 +1168 5 5.710626 0.71062612533569336 0.50498949000962057 +1169 6 6.017941 0.017940998077392578 0.00032187941201300418 +1170 6 5.43487358 0.56512641906738281 0.31936786952792318 +1171 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1172 6 5.81844044 0.18155956268310547 0.032963874801680504 +1173 5 6.03744555 1.0374455451965332 1.076293259248132 +1174 6 6.07708836 0.077088356018066406 0.0059426146335681551 +1175 5 5.48079157 0.48079156875610352 0.23116053258695501 +1176 7 5.870003 1.1299967765808105 1.2768927150830223 +1177 6 5.4681325 0.53186750411987305 0.28288304193870317 +1178 5 4.922261 0.077738761901855469 0.0060433151020333753 +1179 5 5.81053 0.81053018569946289 0.6569591819300058 +1180 5 4.90608358 0.093916416168212891 0.0088202932258809597 +1181 6 5.45621252 0.54378747940063477 0.29570482275289578 +1182 5 6.03744555 1.0374455451965332 1.076293259248132 +1183 6 6.10228348 0.10228347778320313 0.010461909827427007 +1184 7 6.92237663 0.077623367309570313 0.0060253871524764691 +1185 5 5.2008605 0.20086050033569336 0.040344940595105072 +1186 5 5.0423584 0.0423583984375 0.0017942339181900024 +1187 8 6.55680561 1.4431943893432617 2.0828100454318701 +1188 6 5.83443451 0.16556549072265625 0.027411931718233973 +1189 5 4.74727535 0.25272464752197266 0.06386974746510532 +1190 6 5.81844044 0.18155956268310547 0.032963874801680504 +1191 7 6.47237968 0.52762031555175781 0.27838319738293649 +1192 6 5.84241 0.15758991241455078 0.024834580494825786 +1193 7 6.388489 0.61151123046875 0.37394598498940468 +1194 6 5.450869 0.54913091659545898 0.30154476356096893 +1195 6 5.95843744 0.041562557220458984 0.0017274461627039273 +1196 7 6.47237968 0.52762031555175781 0.27838319738293649 +1197 7 6.388489 0.61151123046875 0.37394598498940468 +1198 6 5.84241 0.15758991241455078 0.024834580494825786 +1199 7 6.247097 0.75290298461914063 0.5668629042484099 +1200 6 6.368082 0.36808204650878906 0.13548439296209835 +1201 7 6.383849 0.61615085601806641 0.379641877371796 +1202 5 5.37665272 0.37665271759033203 0.14186726966818242 +1203 6 5.49147367 0.50852632522583008 0.2585990234476867 +1204 6 5.49147367 0.50852632522583008 0.2585990234476867 +1205 5 4.820721 0.17927885055541992 0.03214090625647259 +1206 6 5.5144763 0.48552370071411133 0.23573326395512595 +1207 5 5.37665272 0.37665271759033203 0.14186726966818242 +1208 6 6.214216 0.21421623229980469 0.045888594180723885 +1209 6 6.27291727 0.27291727066040039 0.074483836624722244 +1210 6 5.206366 0.79363393783569336 0.62985482728458919 +1211 5 5.30671549 0.30671548843383789 0.094074390845207745 +1212 6 5.91659546 0.083404541015625 0.0069563174620270729 +1213 6 5.49147367 0.50852632522583008 0.2585990234476867 +1214 6 5.434932 0.56506776809692383 0.31930158254203889 +1215 5 5.5278945 0.52789449691772461 0.27867259987601756 +1216 8 6.689088 1.3109121322631836 1.7184906185148066 +1217 5 4.755091 0.24490880966186523 0.059980325049991734 +1218 8 6.63341141 1.3665885925292969 1.8675643812312046 +1219 8 6.689088 1.3109121322631836 1.7184906185148066 +1220 6 5.60927534 0.39072465896606445 0.15266575912414737 +1221 7 6.98346758 0.016532421112060547 0.00027332094782650529 +1222 6 5.45542 0.54457998275756836 0.29656735762023345 +1223 5 5.5278945 0.52789449691772461 0.27867259987601756 +1224 7 6.87969351 0.12030649185180664 0.014473651981688818 +1225 6 6.18620157 0.18620157241821289 0.03467102557101498 +1226 7 6.87969351 0.12030649185180664 0.014473651981688818 +1227 5 6.072542 1.0725421905517578 1.1503467505135632 +1228 6 5.84670973 0.1532902717590332 0.023497907415958252 +1229 3 5.12617159 2.1261715888977051 4.5206056254357918 +1230 6 5.860294 0.13970613479614258 0.01951780409967796 +1231 7 6.78599644 0.21400356292724609 0.045797524945555779 +1232 7 6.88765144 0.11234855651855469 0.012622198151802877 +1233 6 6.57666636 0.57666635513305664 0.3325440851424446 +1234 6 6.01195574 0.011955738067626953 0.00014293967274170427 +1235 5 5.51621962 0.5162196159362793 0.2664826918773997 +1236 6 6.18620157 0.18620157241821289 0.03467102557101498 +1237 5 6.120411 1.1204109191894531 1.2553206278389553 +1238 7 6.923103 0.076897144317626953 0.0059131708042059472 +1239 5 5.1333437 0.13334369659423828 0.017780541421416274 +1240 6 5.67478561 0.32521438598632813 0.10576439685246442 +1241 7 6.386693 0.61330699920654297 0.3761454752757345 +1242 7 6.761541 0.23845911026000977 0.056862747265995495 +1243 7 6.923103 0.076897144317626953 0.0059131708042059472 +1244 5 5.49561262 0.49561262130737305 0.24563187039916556 +1245 4 4.910776 0.91077613830566406 0.82951317410697811 +1246 7 5.8812623 1.1187376976013184 1.2515740360342988 +1247 6 5.924655 0.075345039367675781 0.0056768749573166133 +1248 7 6.13088036 0.86911964416503906 0.75536895587356412 +1249 5 5.003289 0.0032892227172851563 1.0818986083904747E-05 +1250 7 6.48895645 0.51104354858398438 0.2611655085493112 +1251 5 5.63452435 0.63452434539794922 0.40262114490269596 +1252 6 5.67069244 0.32930755615234375 0.10844346653902903 +1253 7 6.81721258 0.18278741836547852 0.033411240312716473 +1254 5 5.828939 0.82893896102905273 0.68713980111192541 +1255 6 5.722976 0.2770237922668457 0.076742181481904481 +1256 6 5.81828737 0.18171262741088867 0.033019478960568449 +1257 6 5.969221 0.030778884887695313 0.00094733975492999889 +1258 6 5.33740044 0.66259956359863281 0.43903818168109865 +1259 6 5.84787655 0.15212345123291016 0.023141544415011595 +1260 6 5.859397 0.14060306549072266 0.019769222025388444 +1261 6 5.74161673 0.25838327407836914 0.066761916323457626 +1262 6 5.81828737 0.18171262741088867 0.033019478960568449 +1263 6 5.32097244 0.67902755737304688 0.46107842367200647 +1264 5 5.465101 0.46510076522827148 0.21631872181592371 +1265 7 6.204722 0.79527807235717773 0.63246721237214842 +1266 8 6.60801363 1.3919863700866699 1.9376260545070636 +1267 7 6.50023127 0.49976873397827148 0.24976878746224429 +1268 5 5.397177 0.39717721939086914 0.1577497436030626 +1269 6 5.59714651 0.40285348892211914 0.16229093353672397 +1270 7 6.50023127 0.49976873397827148 0.24976878746224429 +1271 5 5.15302753 0.15302753448486328 0.023417426310516021 +1272 5 5.176312 0.17631196975708008 0.03108591067962152 +1273 5 5.15302753 0.15302753448486328 0.023417426310516021 +1274 6 5.59714651 0.40285348892211914 0.16229093353672397 +1275 6 5.59203053 0.40796947479248047 0.16643909236245236 +1276 7 6.50023127 0.49976873397827148 0.24976878746224429 +1277 5 5.397177 0.39717721939086914 0.1577497436030626 +1278 6 5.566156 0.43384408950805664 0.18822069400107466 +1279 6 5.934077 0.065923213958740234 0.0043458701386498433 +1280 6 6.38662767 0.3866276741027832 0.14948095838212794 +1281 7 6.501193 0.49880695343017578 0.24880837679029355 +1282 5 4.947265 0.052734851837158203 0.0027809645982870279 +1283 8 7.58158 0.41841983795166016 0.17507516079149354 +1284 7 6.501193 0.49880695343017578 0.24880837679029355 +1285 6 6.38662767 0.3866276741027832 0.14948095838212794 +1286 7 6.139841 0.86015892028808594 0.73987336815116578 +1287 7 6.50392437 0.49607563018798828 0.24609103086640971 +1288 7 6.72525024 0.274749755859375 0.075487428344786167 +1289 6 6.28108 0.28107976913452148 0.079005836616715897 +1290 6 5.80168343 0.19831657409667969 0.039329463561443845 +1291 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1292 6 6.130666 0.13066577911376953 0.01707354583140841 +1293 4 4.788151 0.78815078735351563 0.62118166360596661 +1294 4 4.788151 0.78815078735351563 0.62118166360596661 +1295 6 5.90492249 0.0950775146484375 0.0090397337917238474 +1296 6 6.36224365 0.36224365234375 0.13122046366333961 +1297 7 6.582107 0.4178929328918457 0.17463450336094866 +1298 6 6.55059576 0.55059576034545898 0.3031556913103941 +1299 5 5.97331524 0.97331523895263672 0.94734255437742831 +1300 6 5.93681765 0.063182353973388672 0.0039920098536185833 +1301 5 5.99956369 0.99956369400024414 0.9991275783634137 +1302 6 5.753585 0.24641513824462891 0.060720420356119575 +1303 6 6.10364437 0.10364437103271484 0.01074215564676706 +1304 5 4.612831 0.38716888427734375 0.1498997449525632 +1305 7 5.955537 1.0444631576538086 1.0909032876961646 +1306 8 6.829604 1.1703958511352539 1.3698264483546154 +1307 5 4.941627 0.058372974395751953 0.0034074041398071131 +1308 6 5.64012241 0.35987758636474609 0.12951187716771528 +1309 6 5.221883 0.77811717987060547 0.60546634560978418 +1310 6 5.45807457 0.54192543029785156 0.29368317200351157 +1311 6 5.909332 0.090668201446533203 0.0082207227535491256 +1312 5 5.35318565 0.35318565368652344 0.12474010596997687 +1313 5 4.43518734 0.56481266021728516 0.31901334114172641 +1314 6 5.36058331 0.63941669464111328 0.40885370938576671 +1315 6 5.82610559 0.17389440536499023 0.030239264217243544 +1316 6 5.933774 0.066226005554199219 0.0043858838116648258 +1317 5 5.721077 0.72107696533203125 0.5199519899324514 +1318 6 6.0769105 0.076910495758056641 0.0059152243577500485 +1319 5 5.427906 0.42790603637695313 0.18310357596783433 +1320 6 5.612823 0.3871769905090332 0.14990602197963199 +1321 6 6.429845 0.42984485626220703 0.18476660045507742 +1322 6 5.86295748 0.13704252243041992 0.018780652954092147 +1323 5 5.48062134 0.480621337890625 0.23099687043577433 +1324 6 5.85815763 0.14184236526489258 0.020119256583939205 +1325 7 6.76510859 0.23489141464233398 0.055173976672676872 +1326 6 5.478635 0.52136516571044922 0.27182163601628417 +1327 6 5.77933025 0.22066974639892578 0.048695136975766218 +1328 6 6.24729967 0.2472996711730957 0.061157127362321262 +1329 5 5.54726648 0.54726648330688477 0.29950060375108478 +1330 5 5.39347935 0.39347934722900391 0.15482599669576302 +1331 6 6.08679676 0.086796760559082031 0.0075336776435506181 +1332 7 6.21610069 0.78389930725097656 0.61449812390856096 +1333 8 7.01025534 0.98974466323852539 0.97959449840914203 +1334 6 5.852407 0.14759302139282227 0.021783699963862091 +1335 6 5.72382832 0.27617168426513672 0.076270799189842364 +1336 8 6.596054 1.4039459228515625 1.9710641542915255 +1337 5 5.49725866 0.49725866317749023 0.24726617810506468 +1338 5 5.49725866 0.49725866317749023 0.24726617810506468 +1339 6 5.488146 0.51185417175292969 0.26199469314087764 +1340 6 5.59975767 0.40024232864379883 0.16019392163821067 +1341 5 5.11727953 0.1172795295715332 0.013754488056520131 +1342 6 5.488146 0.51185417175292969 0.26199469314087764 +1343 6 5.54852057 0.45147943496704102 0.20383368019815862 +1344 8 6.80502939 1.1949706077575684 1.4279547534044923 +1345 8 7.36150551 0.63849449157714844 0.40767521577436128 +1346 7 6.67498064 0.32501935958862305 0.10563758410739865 +1347 7 6.64853954 0.35146045684814453 0.12352445272790646 +1348 8 6.596054 1.4039459228515625 1.9710641542915255 +1349 4 4.20987129 0.20987129211425781 0.044045959253708133 +1350 7 6.88175058 0.11824941635131836 0.013982924467427438 +1351 7 6.931576 0.068424224853515625 0.0046818745468044654 +1352 6 5.72382832 0.27617168426513672 0.076270799189842364 +1353 5 5.49725866 0.49725866317749023 0.24726617810506468 +1354 5 5.646412 0.64641189575195313 0.41784833896963391 +1355 5 5.556504 0.5565037727355957 0.30969644906895155 +1356 6 5.781893 0.21810722351074219 0.04757076094756485 +1357 6 5.502844 0.49715614318847656 0.24716423071004101 +1358 8 6.61071873 1.3892812728881836 1.9301024551978117 +1359 7 6.328941 0.67105913162231445 0.45032035813369475 +1360 6 6.152078 0.15207815170288086 0.023127764225364444 +1361 7 6.2568655 0.74313449859619141 0.55224888300381281 +1362 7 6.257044 0.74295616149902344 0.551983857909363 +1363 4 5.13123131 1.1312313079833984 1.2796842721618304 +1364 5 5.556504 0.5565037727355957 0.30969644906895155 +1365 7 6.42597771 0.57402229309082031 0.32950159296524362 +1366 6 6.17942142 0.17942142486572266 0.03219204770084616 +1367 5 5.251204 0.25120401382446289 0.063103456561520943 +1368 6 5.781893 0.21810722351074219 0.04757076094756485 +1369 5 4.914902 0.085097789764404297 0.0072416338227867527 +1370 6 5.61482573 0.38517427444458008 0.14835922169390869 +1371 7 6.18855333 0.8114466667175293 0.65844569292698907 +1372 6 5.690512 0.30948781967163086 0.095782710525099901 +1373 6 5.690512 0.30948781967163086 0.095782710525099901 +1374 7 6.57598352 0.42401647567749023 0.17978997164595967 +1375 7 6.474106 0.5258941650390625 0.27656467282213271 +1376 6 5.44045067 0.55954933166503906 0.31309545456679189 +1377 6 5.42730761 0.5726923942565918 0.32797657843934758 +1378 7 6.15234852 0.84765148162841797 0.71851303430685221 +1379 6 4.94880867 1.0511913299560547 1.105003212174779 +1380 7 6.84760427 0.15239572525024414 0.0232244570745479 +1381 7 7.003771 0.0037708282470703125 1.4219145668903366E-05 +1382 6 5.2290206 0.77097940444946289 0.59440924208524848 +1383 6 5.473995 0.52600479125976563 0.27668104042822961 +1384 6 5.33457041 0.66542959213256836 0.44279654208571628 +1385 5 5.29342842 0.29342842102050781 0.086100238262588391 +1386 7 6.966072 0.03392791748046875 0.001151103584561497 +1387 6 6.410287 0.41028690338134766 0.16833534308625531 +1388 7 6.245387 0.75461292266845703 0.56944066305823071 +1389 6 5.70716763 0.29283237457275391 0.085750799597917648 +1390 6 5.880706 0.11929416656494141 0.014231098176423984 +1391 6 6.2913146 0.29131460189819336 0.084864197279102882 +1392 6 6.410287 0.41028690338134766 0.16833534308625531 +1393 6 5.585095 0.41490507125854492 0.17214621815605824 +1394 7 6.966072 0.03392791748046875 0.001151103584561497 +1395 7 6.48753452 0.51246547698974609 0.26262086510632798 +1396 7 6.245387 0.75461292266845703 0.56944066305823071 +1397 7 6.31858444 0.68141555786132813 0.46432716249546502 +1398 7 6.31858444 0.68141555786132813 0.46432716249546502 +1399 6 6.270913 0.27091312408447266 0.073393920801208878 +1400 7 6.31858444 0.68141555786132813 0.46432716249546502 +1401 6 5.119604 0.88039588928222656 0.77509692186504253 +1402 8 6.57125139 1.428748607635498 2.0413225838203743 +1403 8 6.820425 1.1795749664306641 1.3913971014299022 +1404 5 5.219756 0.21975612640380859 0.048292755092006701 +1405 4 4.77159548 0.77159547805786133 0.59535958175933956 +1406 8 6.147219 1.852780818939209 3.4327967630290459 +1407 6 6.19692135 0.19692134857177734 0.038778017523327435 +1408 7 6.31858444 0.68141555786132813 0.46432716249546502 +1409 6 6.006806 0.0068058967590332031 4.6320230694618658E-05 +1410 6 6.78585 0.78585004806518555 0.61756029804405443 +1411 6 6.270913 0.27091312408447266 0.073393920801208878 +1412 8 6.838521 1.1614789962768555 1.3490334587922916 +1413 6 5.712056 0.28794384002685547 0.082911655009411334 +1414 6 6.27111959 0.27111959457397461 0.073505834561956362 +1415 5 4.7982645 0.20173549652099609 0.040697210556572827 +1416 6 5.83465528 0.1653447151184082 0.027338874817587566 +1417 3 3.94480681 0.94480681419372559 0.8926599161468971 +1418 5 5.14915037 0.14915037155151367 0.022245833333954579 +1419 7 5.99877644 1.0012235641479492 1.0024486254051226 +1420 4 4.949227 0.94922685623168945 0.90103162459149644 +1421 6 6.25533533 0.25533533096313477 0.065196131238053567 +1422 5 5.661264 0.66126394271850586 0.4372700019396234 +1423 4 4.768664 0.76866388320922852 0.5908441653502905 +1424 6 5.712056 0.28794384002685547 0.082911655009411334 +1425 6 5.82935858 0.17064142227172852 0.029118494994918365 +1426 6 6.34480238 0.3448023796081543 0.11888868098344574 +1427 5 5.729822 0.72982215881347656 0.53264038349516341 +1428 7 6.32088757 0.67911243438720703 0.46119369853931858 +1429 5 5.381057 0.38105678558349609 0.14520427383922652 +1430 4 4.68381166 0.68381166458129883 0.46759839261744673 +1431 5 5.381057 0.38105678558349609 0.14520427383922652 +1432 7 6.46803951 0.53196048736572266 0.28298196011837717 +1433 6 6.136118 0.13611793518066406 0.018528092277847463 +1434 5 5.729822 0.72982215881347656 0.53264038349516341 +1435 5 5.611653 0.61165285110473633 0.37411921026455275 +1436 5 4.68876076 0.31123924255371094 0.096869866105407709 +1437 7 6.32088757 0.67911243438720703 0.46119369853931858 +1438 5 5.26315546 0.26315546035766602 0.06925079631605513 +1439 5 5.47552 0.47552013397216797 0.22611939781290857 +1440 5 5.3382206 0.33822059631347656 0.11439317177064368 +1441 5 5.190989 0.19098901748657227 0.036476804800486207 +1442 5 5.26568127 0.26568126678466797 0.070586535520305915 +1443 6 6.41662264 0.41662263870239258 0.17357442307934434 +1444 6 6.25118971 0.2511897087097168 0.063096269761672374 +1445 6 6.20891047 0.20891046524047852 0.043643582486993182 +1446 6 6.29368258 0.29368257522583008 0.086249454991275343 +1447 6 5.892337 0.10766315460205078 0.011591354858865088 +1448 6 5.892337 0.10766315460205078 0.011591354858865088 +1449 6 6.1661396 0.16613960266113281 0.027602367572399089 +1450 6 6.25118971 0.2511897087097168 0.063096269761672374 +1451 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1452 6 6.25118971 0.2511897087097168 0.063096269761672374 +1453 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1454 5 5.479026 0.47902584075927734 0.22946575611513254 +1455 5 5.074789 0.074789047241210938 0.0055934015872480813 +1456 6 6.29368258 0.29368257522583008 0.086249454991275343 +1457 6 6.20891047 0.20891046524047852 0.043643582486993182 +1458 6 6.450489 0.45048904418945313 0.20294037893472705 +1459 6 6.16096926 0.16096925735473633 0.025911101813335335 +1460 6 6.26689243 0.26689243316650391 0.071231570881536754 +1461 6 6.07949543 0.079495429992675781 0.0063195233897204162 +1462 6 5.892337 0.10766315460205078 0.011591354858865088 +1463 6 5.363495 0.636505126953125 0.40513877663761377 +1464 8 7.07665825 0.92334175109863281 0.85255998932188959 +1465 5 5.519054 0.51905393600463867 0.26941698848190754 +1466 6 6.1661396 0.16613960266113281 0.027602367572399089 +1467 7 6.628117 0.37188291549682617 0.13829690283841956 +1468 5 5.396044 0.39604377746582031 0.1568506736693962 +1469 5 5.05732155 0.057321548461914063 0.0032857599180715624 +1470 7 6.91355038 0.086449623107910156 0.0074735373354997137 +1471 6 6.25118971 0.2511897087097168 0.063096269761672374 +1472 5 4.971684 0.028316020965576172 0.00080179704332294932 +1473 6 6.13895845 0.13895845413208008 0.019309451974777403 +1474 4 4.94047976 0.94047975540161133 0.88450217032027467 +1475 6 5.83468962 0.16531038284301758 0.02732752267570504 +1476 5 5.194277 0.19427680969238281 0.037743478784250328 +1477 6 4.945969 1.0540308952331543 1.1109811281060047 +1478 6 5.97336531 0.026634693145751953 0.00070940687896836607 +1479 6 5.95833 0.041669845581054688 0.0017363760307489429 +1480 6 5.83468962 0.16531038284301758 0.02732752267570504 +1481 6 5.83350468 0.16649532318115234 0.027720692641196365 +1482 6 5.766513 0.23348712921142578 0.054516239507393038 +1483 4 4.94047976 0.94047975540161133 0.88450217032027467 +1484 3 4.470957 1.4709568023681641 2.1637139144331741 +1485 6 5.71909666 0.28090333938598633 0.078906686078198618 +1486 6 5.822368 0.17763185501098633 0.031553075914644069 +1487 6 5.281767 0.71823310852050781 0.51585879817503155 +1488 6 5.49806166 0.5019383430480957 0.2519421002218678 +1489 5 5.55353355 0.55353355407714844 0.30639939548927941 +1490 6 6.164951 0.16495084762573242 0.027208782132447595 +1491 5 5.153073 0.15307283401489258 0.023431292513350854 +1492 5 5.51080036 0.51080036163330078 0.26091700944471086 +1493 8 7.14790726 0.85209274291992188 0.72606204253679607 +1494 8 6.94167757 1.0583224296569824 1.1200463651150585 +1495 7 6.684428 0.31557178497314453 0.099585551471136569 +1496 5 4.59208965 0.40791034698486328 0.16639085117731156 +1497 7 6.43388653 0.56611347198486328 0.32048446316275658 +1498 6 6.206013 0.20601320266723633 0.042441439673211789 +1499 6 6.377341 0.37734079360961914 0.14238607452193719 +1500 7 6.473521 0.52647876739501953 0.27717989251777908 +1501 5 5.64289665 0.64289665222167969 0.41331610543784336 +1502 5 5.318365 0.31836509704589844 0.10135633501704433 +1503 7 6.770466 0.22953414916992188 0.052685925635159947 +1504 8 6.64272928 1.3572707176208496 1.8421838009110161 +1505 7 6.01323271 0.98676729202270508 0.97370968860582252 +1506 6 5.81762934 0.18237066268920898 0.033259058609701242 +1507 6 5.59561062 0.40438938140869141 0.16353077179610409 +1508 6 5.72143364 0.27856636047363281 0.077599217187525937 +1509 5 5.64345741 0.64345741271972656 0.41403744198396453 +1510 5 5.424362 0.4243621826171875 0.18008326203562319 +1511 6 5.81927538 0.1807246208190918 0.032661388570204508 +1512 7 6.42719269 0.57280731201171875 0.32810821669409052 +1513 6 6.5397687 0.53976869583129883 0.29135024499942119 +1514 7 6.473521 0.52647876739501953 0.27717989251777908 +1515 6 6.226191 0.22619104385375977 0.051162388319653473 +1516 6 6.13849163 0.13849163055419922 0.019179931733560807 +1517 6 5.995002 0.0049982070922851563 2.4982074137369636E-05 +1518 6 6.13184547 0.13184547424316406 0.017383229078404838 +1519 5 5.64289665 0.64289665222167969 0.41331610543784336 +1520 6 5.77483654 0.22516345977783203 0.050698583619123383 +1521 5 5.318365 0.31836509704589844 0.10135633501704433 +1522 5 5.813046 0.81304597854614258 0.66104376323005454 +1523 6 5.70439 0.29560995101928711 0.087385243141625324 +1524 6 5.45256138 0.54743862152099609 0.29968904433280841 +1525 5 5.168963 0.16896295547485352 0.028548480322797332 +1526 6 6.030308 0.030307769775390625 0.0009185609087580815 +1527 6 6.06596 0.065959930419921875 0.0043507124210009351 +1528 6 5.98619127 0.013808727264404297 0.00019068094866270258 +1529 6 5.45256138 0.54743862152099609 0.29968904433280841 +1530 5 5.168963 0.16896295547485352 0.028548480322797332 +1531 7 6.09255266 0.90744733810424805 0.82346067143248547 +1532 7 6.17497635 0.82502365112304688 0.68066402491240297 +1533 6 6.188314 0.18831396102905273 0.035462147918451592 +1534 6 5.93772459 0.062275409698486328 0.003878226653114325 +1535 6 5.900267 0.099732875823974609 0.0099466465201203391 +1536 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1537 6 5.703288 0.29671192169189453 0.088037964474096952 +1538 6 5.74273157 0.25726842880249023 0.066187044458501987 +1539 6 6.188314 0.18831396102905273 0.035462147918451592 +1540 6 5.93772459 0.062275409698486328 0.003878226653114325 +1541 4 4.76091242 0.76091241836547852 0.57898770842280101 +1542 6 6.11882639 0.11882638931274414 0.014119710797103835 +1543 6 6.29636 0.29636001586914063 0.087829259005957283 +1544 5 4.95577765 0.044222354888916016 0.0019556166719212342 +1545 6 6.044429 0.044428825378417969 0.0019739205245059566 +1546 6 5.64528561 0.35471439361572266 0.12582230103816983 +1547 6 5.64528561 0.35471439361572266 0.12582230103816983 +1548 6 6.87292671 0.87292671203613281 0.76200104458621354 +1549 6 5.900267 0.099732875823974609 0.0099466465201203391 +1550 6 6.021991 0.021990776062011719 0.00048359423180954764 +1551 6 6.07919264 0.079192638397216797 0.0062714739763123362 +1552 7 7.06551027 0.065510272979736328 0.0042915958658795716 +1553 7 6.482196 0.51780414581298828 0.26812113342111843 +1554 7 6.27147055 0.72852945327758789 0.53075516429294112 +1555 7 6.7877593 0.21224069595336914 0.045046113018770484 +1556 6 5.75313663 0.24686336517333984 0.060941521064705739 +1557 6 6.021991 0.021990776062011719 0.00048359423180954764 +1558 4 4.91349363 0.91349363327026367 0.83447061802530698 +1559 4 4.4660306 0.46603059768676758 0.21718451798028582 +1560 6 6.359429 0.35942888259887695 0.12918912164627727 +1561 5 4.71328 0.28671979904174805 0.082208243162540384 +1562 7 6.898671 0.10132884979248047 0.010267535800267069 +1563 6 6.359429 0.35942888259887695 0.12918912164627727 +1564 5 4.71328 0.28671979904174805 0.082208243162540384 +1565 6 5.96442747 0.035572528839111328 0.0012654048080094071 +1566 5 5.83771753 0.83771753311157227 0.70177066528253818 +1567 5 5.50233173 0.50233173370361328 0.25233717068567785 +1568 6 5.516011 0.48398876190185547 0.23424512164729094 +1569 5 5.306023 0.30602312088012695 0.093650150513212793 +1570 5 5.480161 0.48016119003295898 0.23055476841386735 +1571 6 5.516011 0.48398876190185547 0.23424512164729094 +1572 6 5.753487 0.24651288986206055 0.060768604868144394 +1573 5 5.619523 0.61952304840087891 0.38380880749991775 +1574 4 5.28259468 1.2825946807861328 1.6450491151808819 +1575 6 5.87912941 0.12087059020996094 0.014609699577704305 +1576 6 5.57926 0.42074012756347656 0.17702225494213053 +1577 4 4.433939 0.43393898010253906 0.18830303845243179 +1578 5 5.368031 0.36803102493286133 0.1354468353131324 +1579 4 5.156767 1.1567668914794922 1.3381096412231273 +1580 5 4.508023 0.49197721481323242 0.24204157989538544 +1581 6 5.6025157 0.39748430252075195 0.15799377075040866 +1582 7 6.667178 0.33282184600830078 0.11077038118037308 +1583 5 5.368031 0.36803102493286133 0.1354468353131324 +1584 6 5.357087 0.64291286468505859 0.41333695157754846 +1585 5 5.135726 0.13572597503662109 0.018421540299641492 +1586 5 4.884364 0.11563587188720703 0.013371654867114557 +1587 6 5.357087 0.64291286468505859 0.41333695157754846 +1588 5 5.135726 0.13572597503662109 0.018421540299641492 +1589 6 6.05095768 0.050957679748535156 0.00259668512535427 +1590 6 6.273106 0.27310609817504883 0.074586940860399409 +1591 6 6.14363956 0.14363956451416016 0.020632324493817578 +1592 6 5.825356 0.17464399337768555 0.030500524422905073 +1593 6 5.8224 0.17759990692138672 0.031541726938485226 +1594 6 5.46713 0.53286981582641602 0.28395024061887852 +1595 6 5.4586587 0.54134130477905273 0.29305040825988726 +1596 5 5.47208929 0.47208929061889648 0.2228682983170529 +1597 6 5.4586587 0.54134130477905273 0.29305040825988726 +1598 6 5.762172 0.23782777786254883 0.05656205192303787 +1599 6 5.875584 0.12441587448120117 0.015479309822922005 +1600 6 5.46713 0.53286981582641602 0.28395024061887852 +1601 6 5.634498 0.36550188064575195 0.13359162475558151 +1602 5 6.442401 1.4424009323120117 2.0805204495345606 +1603 7 6.492261 0.50773906707763672 0.25779896023686888 +1604 5 5.0516305 0.051630496978759766 0.0026657082182737213 +1605 9 7.458617 1.5413827896118164 2.3758609041115051 +1606 6 6.246019 0.24601888656616211 0.060525292547254139 +1607 7 6.15459061 0.84540939331054688 0.71471704229770694 +1608 5 5.464145 0.46414518356323242 0.21543075142494672 +1609 7 6.011046 0.98895406723022461 0.97803014709120362 +1610 6 6.246019 0.24601888656616211 0.060525292547254139 +1611 6 5.587227 0.41277313232421875 0.170381658768747 +1612 7 6.48129845 0.51870155334472656 0.26905130144223222 +1613 7 6.61206961 0.38793039321899414 0.15048998998304342 +1614 5 5.850582 0.85058212280273438 0.7234899476316059 +1615 6 6.102702 0.10270214080810547 0.010547729726567923 +1616 6 5.51687765 0.48312234878540039 0.23340720389592207 +1617 6 5.571805 0.42819499969482422 0.18335095776365051 +1618 6 5.28217125 0.71782875061035156 0.5152781152028183 +1619 8 7.13240433 0.86759567260742188 0.75272225112712476 +1620 7 6.48129845 0.51870155334472656 0.26905130144223222 +1621 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1622 6 5.239296 0.76070404052734375 0.57867063727462664 +1623 6 5.86622047 0.13377952575683594 0.01789696151172393 +1624 7 6.18613243 0.81386756896972656 0.66238041982069262 +1625 6 5.87100458 0.12899541854858398 0.016639818006524365 +1626 6 5.90693 0.093070030212402344 0.0086620305237374851 +1627 5 4.94608736 0.053912639617919922 0.0029065727105717087 +1628 6 5.890122 0.1098780632019043 0.012073188773001675 +1629 6 5.977284 0.022716045379638672 0.00051601871768980345 +1630 5 5.31199455 0.31199455261230469 0.097340600859752158 +1631 6 5.890122 0.1098780632019043 0.012073188773001675 +1632 8 7.1502 0.84980010986328125 0.72216022672364488 +1633 7 6.04704762 0.95295238494873047 0.90811824797947338 +1634 6 5.547635 0.45236492156982422 0.20463402226687322 +1635 6 5.52456141 0.47543859481811523 0.22604185744262395 +1636 5 5.148717 0.14871692657470703 0.022116724249826802 +1637 6 6.15984631 0.15984630584716797 0.025550841492986365 +1638 5 5.09744549 0.097445487976074219 0.0094956231268952251 +1639 5 5.942503 0.94250297546386719 0.88831185875824303 +1640 5 5.148717 0.14871692657470703 0.022116724249826802 +1641 6 5.82682943 0.17317056655883789 0.029988045122308904 +1642 7 6.504058 0.49594211578369141 0.24595858220800437 +1643 7 5.77661276 1.2233872413635254 1.4966763423310567 +1644 7 6.504058 0.49594211578369141 0.24595858220800437 +1645 7 6.223316 0.77668380737304688 0.60323773663549218 +1646 6 5.82682943 0.17317056655883789 0.029988045122308904 +1647 7 6.27178574 0.72821426391601563 0.53029601417074446 +1648 5 5.7562747 0.75627470016479492 0.57195142210935046 +1649 4 4.85746956 0.85746955871582031 0.73525404412430362 +1650 7 6.80729961 0.19270038604736328 0.037133438782802841 +1651 6 5.34201 0.6579899787902832 0.43295081218843734 +1652 4 5.75338364 1.7533836364746094 3.0743541766569251 +1653 6 5.71115732 0.28884267807006836 0.083430092674689149 +1654 5 5.11912 0.11912012100219727 0.014189603227578118 +1655 5 5.338051 0.33805084228515625 0.11427837196970358 +1656 5 5.51299047 0.51299047470092773 0.26315922713388318 +1657 6 6.112662 0.11266183853149414 0.012692689861296458 +1658 5 5.144843 0.14484310150146484 0.020979524052563647 +1659 5 5.225776 0.22577619552612305 0.050974890466250145 +1660 6 5.27949429 0.72050571441650391 0.51912848450683668 +1661 6 5.528939 0.47106122970581055 0.22189868213195041 +1662 7 6.071942 0.92805814743041992 0.86129192501198304 +1663 6 5.71115732 0.28884267807006836 0.083430092674689149 +1664 4 5.10081768 1.1008176803588867 1.2117995653907201 +1665 8 7.05892038 0.94107961654663086 0.88563084467955377 +1666 5 4.735589 0.26441097259521484 0.069913162428747455 +1667 6 5.98559475 0.014405250549316406 0.00020751124338858062 +1668 7 6.120982 0.87901782989501953 0.77267234527334949 +1669 6 5.108951 0.89104890823364258 0.79396815686436639 +1670 6 5.488634 0.51136589050292969 0.26149507396985427 +1671 7 6.510288 0.48971223831176758 0.23981807635232144 +1672 5 5.421067 0.42106723785400391 0.1772976187940003 +1673 5 5.347374 0.34737396240234375 0.12066866975510493 +1674 6 5.980884 0.019115924835205078 0.00036541858230521029 +1675 5 5.338103 0.33810281753540039 0.11431351522537625 +1676 7 6.510288 0.48971223831176758 0.23981807635232144 +1677 6 5.90175 0.098249912261962891 0.009653045259483406 +1678 6 5.911432 0.088568210601806641 0.0078443279292059742 +1679 5 5.21312141 0.21312141418457031 0.045420737184031168 +1680 5 5.163654 0.16365385055541992 0.026782582801615717 +1681 6 5.914402 0.085597991943359375 0.0073270162247354165 +1682 7 6.543379 0.45662117004394531 0.20850289293230162 +1683 7 6.543379 0.45662117004394531 0.20850289293230162 +1684 7 6.06433344 0.93566656112670898 0.87547191361068144 +1685 7 6.543379 0.45662117004394531 0.20850289293230162 +1686 5 5.931283 0.93128299713134766 0.86728802074594569 +1687 7 6.06433344 0.93566656112670898 0.87547191361068144 +1688 3 3.90431213 0.9043121337890625 0.81778043531812727 +1689 6 6.370762 0.37076187133789063 0.13746436523797456 +1690 4 4.496808 0.49680805206298828 0.24681824059462087 +1691 7 6.543379 0.45662117004394531 0.20850289293230162 +1692 6 6.363645 0.36364507675170898 0.13223774184575632 +1693 5 5.39188766 0.39188766479492188 0.15357594181841705 +1694 6 5.71193361 0.28806638717651367 0.08298224342092908 +1695 6 6.55674648 0.55674648284912109 0.30996664616486669 +1696 6 5.720357 0.27964305877685547 0.078200240322075842 +1697 6 6.25116253 0.25116252899169922 0.063082615969506151 +1698 6 6.363645 0.36364507675170898 0.13223774184575632 +1699 6 6.13921261 0.13921260833740234 0.019380150320102985 +1700 6 5.93687057 0.063129425048828125 0.0039853243069956079 +1701 5 5.58175659 0.581756591796875 0.33844073209911585 +1702 4 4.31816 0.31816005706787109 0.10122582191343099 +1703 5 5.335852 0.33585214614868164 0.11279666407267541 +1704 5 5.335852 0.33585214614868164 0.11279666407267541 +1705 6 6.527788 0.52778816223144531 0.27856034419164644 +1706 6 5.994899 0.0051012039184570313 2.602228141768137E-05 +1707 5 5.3597784 0.35977840423583984 0.12944050015448738 +1708 4 4.58082151 0.58082151412963867 0.33735363127584606 +1709 5 5.794777 0.79477691650390625 0.63167034700745717 +1710 5 5.04373169 0.043731689453125 0.0019124606624245644 +1711 5 6.12955952 1.1295595169067383 1.275904702234584 +1712 6 5.66090155 0.33909845352172852 0.11498776118082787 +1713 6 5.46919 0.53080987930297852 0.28175912796564262 +1714 5 5.35511971 0.35511970520019531 0.12611000502147363 +1715 8 7.17331171 0.82668828964233398 0.68341352823176749 +1716 6 6.184057 0.18405723571777344 0.033877066020068014 +1717 6 5.552837 0.44716310501098633 0.19995484248306639 +1718 4 5.24975443 1.2497544288635254 1.5618861324639965 +1719 6 5.822894 0.17710590362548828 0.031366501099000743 +1720 7 6.265804 0.73419618606567383 0.53904403963338154 +1721 7 6.404914 0.59508609771728516 0.35412746369638626 +1722 6 6.21475172 0.2147517204284668 0.046118301426986363 +1723 8 7.17331171 0.82668828964233398 0.68341352823176749 +1724 6 6.31798267 0.31798267364501953 0.101112980738435 +1725 6 5.670131 0.32986879348754883 0.10881342091693114 +1726 6 6.60087347 0.60087347030639648 0.36104892731805194 +1727 6 6.0132947 0.013294696807861328 0.00017674896321295819 +1728 5 5.35511971 0.35511970520019531 0.12611000502147363 +1729 6 6.34329748 0.34329748153686523 0.11785316082955433 +1730 6 5.882648 0.11735200881958008 0.0137714939739908 +1731 6 5.65552044 0.34447956085205078 0.11866616784482176 +1732 5 5.520096 0.5200958251953125 0.27049966738559306 +1733 6 5.768575 0.23142480850219727 0.053557441990278676 +1734 6 5.80637026 0.19362974166870117 0.037492476858687951 +1735 6 6.50981569 0.50981569290161133 0.25991204072875007 +1736 5 5.328799 0.32879877090454102 0.10810863174833685 +1737 6 5.80637026 0.19362974166870117 0.037492476858687951 +1738 5 5.449398 0.44939804077148438 0.20195859904924873 +1739 4 4.25049448 0.25049448013305664 0.062747484577130308 +1740 6 5.324389 0.67561101913452148 0.45645024917598676 +1741 6 6.68758 0.68758010864257813 0.47276640580093954 +1742 6 5.503512 0.49648809432983398 0.24650042781127013 +1743 6 5.656073 0.34392690658569336 0.11828571707360425 +1744 5 5.665838 0.66583776473999023 0.44333992895394658 +1745 5 5.11254168 0.11254167556762695 0.012665628739569001 +1746 5 5.823897 0.82389688491821289 0.67880607697793494 +1747 6 5.656073 0.34392690658569336 0.11828571707360425 +1748 5 5.62416 0.62415981292724609 0.38957547207337484 +1749 6 5.776405 0.22359514236450195 0.049994787689001896 +1750 6 6.177006 0.17700576782226563 0.031331041842349805 +1751 7 6.46401453 0.53598546981811523 0.28728042385614572 +1752 6 5.49817276 0.50182723999023438 0.25183057879621629 +1753 7 6.345841 0.6541590690612793 0.42792408763511958 +1754 6 6.470667 0.47066688537597656 0.22152731698952266 +1755 6 5.503512 0.49648809432983398 0.24650042781127013 +1756 5 5.198939 0.19893884658813477 0.039576664681817419 +1757 5 5.099308 0.099308013916015625 0.009862081627943553 +1758 5 5.145771 0.14577102661132813 0.021249192199320532 +1759 5 4.837293 0.16270685195922852 0.026473519674482304 +1760 6 5.61023664 0.38976335525512695 0.1519154730997343 +1761 6 5.76614141 0.23385858535766602 0.054689837945488762 +1762 7 6.44400644 0.55599355697631836 0.30912883539917857 +1763 6 5.63683 0.36317014694213867 0.13189255562997459 +1764 5 5.198939 0.19893884658813477 0.039576664681817419 +1765 5 5.099308 0.099308013916015625 0.009862081627943553 +1766 5 5.14904 0.14904022216796875 0.022212987823877484 +1767 5 5.0502 0.050199985504150391 0.0025200385446169093 +1768 5 5.199506 0.19950580596923828 0.039802566615435353 +1769 7 6.637015 0.36298513412475586 0.131758207595567 +1770 6 5.911365 0.088634967803955078 0.0078561575176081533 +1771 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1772 6 5.90241241 0.09758758544921875 0.0095233368338085711 +1773 6 5.911365 0.088634967803955078 0.0078561575176081533 +1774 6 6.102439 0.10243892669677734 0.010493733702787722 +1775 6 6.09364557 0.093645572662353516 0.0087694932792601321 +1776 5 5.3519 0.35190010070800781 0.12383368087830604 +1777 6 6.07801342 0.078013420104980469 0.0060860937164761708 +1778 8 7.2947197 0.70528030395507813 0.49742030714696739 +1779 8 7.2947197 0.70528030395507813 0.49742030714696739 +1780 5 5.846626 0.84662580490112305 0.71677525352447446 +1781 4 4.88433266 0.88433265686035156 0.7820442479896883 +1782 6 6.15452433 0.15452432632446289 0.023877767426029095 +1783 6 5.11111975 0.88888025283813477 0.79010810388558639 +1784 7 6.66374445 0.33625555038452148 0.11306779516439747 +1785 6 6.15452433 0.15452432632446289 0.023877767426029095 +1786 7 6.39855957 0.6014404296875 0.36173059046268463 +1787 7 6.86035776 0.13964223861694336 0.019499954805951347 +1788 5 6.093183 1.0931830406188965 1.1950491602967759 +1789 7 6.359563 0.64043712615966797 0.41015971256365447 +1790 5 5.47426462 0.47426462173461914 0.22492693142908138 +1791 5 5.364561 0.36456108093261719 0.13290478173075826 +1792 6 5.68573856 0.31426143646240234 0.098760250447412545 +1793 5 5.028987 0.028986930847167969 0.00084024215993849793 +1794 5 5.18260241 0.1826024055480957 0.033343638511951212 +1795 6 5.328547 0.67145299911499023 0.45084913002051508 +1796 5 6.180702 1.1807022094726563 1.3940577074536122 +1797 8 6.97266769 1.0273323059082031 1.0554116667626658 +1798 6 5.629581 0.37041902542114258 0.13721025439394907 +1799 6 5.702408 0.2975921630859375 0.088561095530167222 +1800 6 5.259844 0.74015617370605469 0.5478311614751874 +1801 5 5.11915636 0.1191563606262207 0.014198238277685959 +1802 6 5.629581 0.37041902542114258 0.13721025439394907 +1803 6 5.702408 0.2975921630859375 0.088561095530167222 +1804 6 5.259844 0.74015617370605469 0.5478311614751874 +1805 5 5.27370834 0.27370834350585938 0.074916257304721512 +1806 5 4.864911 0.13508892059326172 0.01824901646705257 +1807 6 6.16377926 0.16377925872802734 0.026823645589502121 +1808 5 5.27370834 0.27370834350585938 0.074916257304721512 +1809 6 6.16377926 0.16377925872802734 0.026823645589502121 +1810 6 5.287707 0.71229314804077148 0.5073615287458324 +1811 5 4.864911 0.13508892059326172 0.01824901646705257 +1812 6 6.20445538 0.20445537567138672 0.041802000640927872 +1813 6 5.9327035 0.067296504974365234 0.0045288195817647647 +1814 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1815 6 5.82937336 0.17062664031982422 0.029113450386830664 +1816 7 6.872754 0.12724590301513672 0.01619151983413758 +1817 4 4.45179462 0.45179462432861328 0.2041183825722328 +1818 6 6.37151432 0.37151432037353516 0.13802289024260972 +1819 6 6.391697 0.39169692993164063 0.15342648491787259 +1820 6 5.82937336 0.17062664031982422 0.029113450386830664 +1821 5 5.9026103 0.90261030197143555 0.81470535722496606 +1822 7 6.993728 0.0062718391418457031 3.9335966221187846E-05 +1823 6 5.900709 0.099290847778320313 0.0098586724525375757 +1824 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1825 5 5.258325 0.25832509994506836 0.066731857261629557 +1826 5 5.00394 0.0039401054382324219 1.5524430864388705E-05 +1827 6 5.900709 0.099290847778320313 0.0098586724525375757 +1828 6 5.753486 0.24651384353637695 0.060769075055077337 +1829 7 6.53176165 0.46823835372924805 0.21924715590307642 +1830 7 6.53176165 0.46823835372924805 0.21924715590307642 +1831 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1832 7 6.53176165 0.46823835372924805 0.21924715590307642 +1833 7 7.06293058 0.062930583953857422 0.0039602583967734972 +1834 6 5.84620237 0.15379762649536133 0.023653709915606669 +1835 5 4.988597 0.011403083801269531 0.00013003032017877558 +1836 6 5.77450943 0.22549057006835938 0.050845997189753689 +1837 7 6.83298 0.16701984405517578 0.027895628308215237 +1838 6 5.66736031 0.33263969421386719 0.11064916616669507 +1839 6 5.77450943 0.22549057006835938 0.050845997189753689 +1840 5 6.134337 1.1343369483947754 1.2867203124935713 +1841 7 6.83298 0.16701984405517578 0.027895628308215237 +1842 6 5.98937035 0.010629653930664063 0.00011298954268568195 +1843 6 6.24796629 0.24796628952026367 0.061487280738447225 +1844 6 6.495384 0.49538421630859375 0.2454055217676796 +1845 5 5.18946362 0.18946361541748047 0.035896461567062943 +1846 5 5.40275526 0.4027552604675293 0.16221179983426737 +1847 5 5.18946362 0.18946361541748047 0.035896461567062943 +1848 5 5.044584 0.044583797454833984 0.0019877149954936613 +1849 6 5.91228 0.087719917297363281 0.0076947838906562538 +1850 7 5.84083033 1.1591696739196777 1.343674332935052 +1851 6 6.495384 0.49538421630859375 0.2454055217676796 +1852 7 6.6136837 0.38631629943847656 0.14924028321183869 +1853 5 5.151337 0.1513371467590332 0.022902931989165154 +1854 7 6.0943203 0.90567970275878906 0.82025572398924851 +1855 6 6.14251947 0.14251947402954102 0.020311800477657016 +1856 4 4.103467 0.10346698760986328 0.010705417525059602 +1857 5 4.735547 0.26445293426513672 0.069935354441440722 +1858 5 5.031725 0.031724929809570313 0.001006471171422163 +1859 6 6.14251947 0.14251947402954102 0.020311800477657016 +1860 6 6.02827644 0.028276443481445313 0.0007995572559593711 +1861 6 6.257553 0.2575531005859375 0.066333599621430039 +1862 7 6.827227 0.17277288436889648 0.029850469573148075 +1863 5 5.36154 0.36153984069824219 0.13071105641211034 +1864 6 6.25475264 0.25475263595581055 0.064898905526433737 +1865 6 5.23789167 0.76210832595825195 0.58080910049488921 +1866 6 5.73634434 0.26365566253662109 0.069514308387624624 +1867 6 6.45096254 0.45096254348754883 0.20336721562875937 +1868 7 6.6029706 0.39702939987182617 0.15763234436258244 +1869 7 5.99931145 1.0006885528564453 1.0013775798179267 +1870 6 6.02254629 0.022546291351318359 0.00050833525369853305 +1871 6 5.893417 0.1065831184387207 0.011359961136122365 +1872 5 5.104985 0.10498523712158203 0.011021900013474806 +1873 5 5.104985 0.10498523712158203 0.011021900013474806 +1874 5 5.75805473 0.75805473327636719 0.5746469786427042 +1875 5 5.14179373 0.14179372787475586 0.020105461264620317 +1876 6 5.905395 0.094604969024658203 0.0089501001641565381 +1877 6 5.79698658 0.20301342010498047 0.041214448742721288 +1878 6 5.723346 0.27665376663208008 0.076537306591717424 +1879 6 5.858292 0.1417078971862793 0.020081128124957104 +1880 5 5.428381 0.42838096618652344 0.18351025219089934 +1881 6 5.858292 0.1417078971862793 0.020081128124957104 +1882 5 5.428381 0.42838096618652344 0.18351025219089934 +1883 5 5.428381 0.42838096618652344 0.18351025219089934 +1884 5 6.015564 1.01556396484375 1.0313701666891575 +1885 6 5.858292 0.1417078971862793 0.020081128124957104 +1886 5 4.56712961 0.43287038803100586 0.18737677283411358 +1887 5 5.531196 0.53119611740112305 0.2821693151420277 +1888 5 5.54939 0.54938983917236328 0.30182919538583519 +1889 5 5.69010973 0.6901097297668457 0.4762514391188688 +1890 5 5.428381 0.42838096618652344 0.18351025219089934 +1891 5 5.475229 0.47522878646850586 0.22584239948832874 +1892 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1893 5 5.09930754 0.099307537078857422 0.0098619869206686417 +1894 5 5.24567556 0.24567556381225586 0.060356482654469801 +1895 6 5.76433468 0.23566532135009766 0.055538143687044794 +1896 6 5.19419336 0.80580663681030273 0.64932433592753114 +1897 6 5.19419336 0.80580663681030273 0.64932433592753114 +1898 6 5.39263535 0.60736465454101563 0.36889182358572725 +1899 7 6.988717 0.011282920837402344 0.00012730430262308801 +1900 6 5.82769728 0.1723027229309082 0.02968822832940532 +1901 5 5.609328 0.60932779312133789 0.37128035947011995 +1902 6 5.70890331 0.29109668731689453 0.084737281366869865 +1903 5 5.44353 0.44353008270263672 0.19671893426220777 +1904 6 5.76433468 0.23566532135009766 0.055538143687044794 +1905 6 5.19419336 0.80580663681030273 0.64932433592753114 +1906 5 5.531166 0.53116607666015625 0.28213740099454299 +1907 7 6.67684364 0.32315635681152344 0.10443003094769665 +1908 7 6.82135153 0.17864847183227539 0.031915276488007294 +1909 5 5.497734 0.49773406982421875 0.24773920426378027 +1910 5 5.55095959 0.55095958709716797 0.30355646661428182 +1911 6 5.8620677 0.13793230056762695 0.019025319539878183 +1912 6 5.89195061 0.10804939270019531 0.01167467126288102 +1913 6 5.496035 0.50396490097045898 0.25398062141016453 +1914 6 6.51767254 0.51767253875732422 0.26798485738345335 +1915 7 6.82135153 0.17864847183227539 0.031915276488007294 +1916 5 5.55095959 0.55095958709716797 0.30355646661428182 +1917 6 5.8620677 0.13793230056762695 0.019025319539878183 +1918 6 5.76833 0.23166990280151367 0.053670943864062792 +1919 6 5.7990675 0.20093250274658203 0.040373870660005196 +1920 7 5.64435625 1.3556437492370605 1.8377699748455143 +1921 5 5.497734 0.49773406982421875 0.24773920426378027 +1922 5 5.60842752 0.60842752456665039 0.37018405265030196 +1923 5 4.886931 0.11306905746459961 0.012784611755932929 +1924 4 4.732981 0.73298120498657227 0.53726144686356747 +1925 6 5.821547 0.17845296859741211 0.031845462001228952 +1926 6 5.763718 0.2362818717956543 0.055829122939258014 +1927 5 5.778531 0.77853107452392578 0.60611063399937848 +1928 6 5.96423244 0.035767555236816406 0.0012793180076187127 +1929 5 5.5253 0.52530002593994141 0.27594011725250311 +1930 6 5.64313173 0.35686826705932617 0.12735496003392655 +1931 3 3.42147088 0.42147088050842285 0.17763770311654525 +1932 6 5.02350473 0.97649526596069336 0.95354300444364526 +1933 5 5.01699162 0.016991615295410156 0.00028871499034721637 +1934 6 5.91134 0.088659763336181641 0.0078605536348277383 +1935 5 5.5253 0.52530002593994141 0.27594011725250311 +1936 6 5.64313173 0.35686826705932617 0.12735496003392655 +1937 7 6.497361 0.50263881683349609 0.25264578018777684 +1938 5 5.77335072 0.77335071563720703 0.59807132937658025 +1939 5 5.323697 0.32369709014892578 0.10477980617088178 +1940 5 4.944163 0.055837154388427734 0.0031177878101971146 +1941 5 5.323697 0.32369709014892578 0.10477980617088178 +1942 5 4.944163 0.055837154388427734 0.0031177878101971146 +1943 5 5.497555 0.49755477905273438 0.24756075815821532 +1944 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1945 6 5.75811338 0.24188661575317383 0.058509134880523561 +1946 6 5.32988358 0.67011642456054688 0.44905602246581111 +1947 5 5.08187628 0.081876277923583984 0.0067037248866199661 +1948 7 6.17266 0.82734012603759766 0.68449168415190798 +1949 5 5.2683053 0.26830530166625977 0.071987734902222655 +1950 5 5.237333 0.23733282089233398 0.056326867872712683 +1951 4 4.32389355 0.32389354705810547 0.10490702982588118 +1952 7 6.74338341 0.25661659240722656 0.065852075498696649 +1953 6 6.021135 0.021134853363037109 0.00044668202667708101 +1954 5 5.237333 0.23733282089233398 0.056326867872712683 +1955 5 5.424599 0.42459917068481445 0.1802844557462322 +1956 5 5.31968 0.31968021392822266 0.1021954391771942 +1957 6 5.79171038 0.20828962326049805 0.043384567158000209 +1958 6 5.584745 0.41525506973266602 0.17243677293868132 +1959 5 5.1785655 0.17856550216674805 0.031885638564062901 +1960 5 5.1785655 0.17856550216674805 0.031885638564062901 +1961 5 4.79571152 0.20428848266601563 0.041733784149982966 +1962 5 5.284309 0.28430891036987305 0.080831556515704506 +1963 6 5.584745 0.41525506973266602 0.17243677293868132 +1964 5 5.307627 0.30762720108032227 0.094634494844513029 +1965 6 5.294085 0.70591497421264648 0.49831595081764135 +1966 6 5.606551 0.39344882965087891 0.15480198155364633 +1967 7 5.817037 1.1829628944396973 1.3994012096211463 +1968 6 6.12541676 0.12541675567626953 0.015729362604361086 +1969 7 6.792339 0.20766115188598633 0.043123154002614683 +1970 6 5.87826252 0.12173748016357422 0.014820014076576626 +1971 7 6.792339 0.20766115188598633 0.043123154002614683 +1972 5 5.54269075 0.54269075393676758 0.29451325440845721 +1973 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1974 5 5.07332945 0.073329448699951172 0.0053772080466387706 +1975 6 5.394777 0.60522317886352539 0.36629509623367085 +1976 5 5.1809783 0.18097829818725586 0.032753144414755297 +1977 6 5.852116 0.14788389205932617 0.021869645530614434 +1978 6 5.504246 0.49575376510620117 0.24577179561697449 +1979 6 5.38840532 0.61159467697143555 0.37404804889979459 +1980 8 7.70184755 0.29815244674682617 0.088894881501119016 +1981 8 7.70184755 0.29815244674682617 0.088894881501119016 +1982 8 7.70184755 0.29815244674682617 0.088894881501119016 +1983 8 7.70184755 0.29815244674682617 0.088894881501119016 +1984 8 7.70184755 0.29815244674682617 0.088894881501119016 +1985 6 5.962447 0.037552833557128906 0.0014102153081694269 +1986 6 5.814902 0.18509817123413086 0.034261332994219629 +1987 5 5.80614376 0.80614376068115234 0.64986776288515102 +1988 6 5.95589161 0.044108390808105469 0.001945550139680563 +1989 7 6.713367 0.28663301467895508 0.082158485103946077 +1990 4 4.43185854 0.43185853958129883 0.18650179820929225 +1991 8 7.70184755 0.29815244674682617 0.088894881501119016 +1992 5 5.683112 0.68311214447021484 0.46664220192269568 +1993 6 5.74645329 0.25354671478271484 0.06428593657710735 +1994 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1995 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1996 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +1997 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1998 6 6.05903625 0.0590362548828125 0.0034852793905884027 +1999 6 6.65917635 0.65917634963989258 0.43451345992457391 +2000 5 5.15526772 0.15526771545410156 0.024108063462335849 +2001 5 5.116252 0.11625194549560547 0.013514514831513225 +2002 6 6.24034739 0.24034738540649414 0.057766865671737833 +2003 6 5.74645329 0.25354671478271484 0.06428593657710735 +2004 6 5.97547865 0.024521350860595703 0.00060129664802843763 +2005 6 6.00442839 0.0044283866882324219 1.9610608660514117E-05 +2006 6 6.05903625 0.0590362548828125 0.0034852793905884027 +2007 6 6.035142 0.035141944885253906 0.0012349562903182232 +2008 5 5.388008 0.38800811767578125 0.15055029938230291 +2009 7 6.72901726 0.27098274230957031 0.073431646629614988 +2010 6 6.07737875 0.077378749847412109 0.0059874709279483795 +2011 5 5.388008 0.38800811767578125 0.15055029938230291 +2012 5 5.91862154 0.91862154006958008 0.84386553387980712 +2013 6 5.776343 0.22365713119506836 0.05002251233440802 +2014 5 5.092607 0.092607021331787109 0.0085760603999460727 +2015 6 6.126408 0.12640810012817383 0.01597900777801442 +2016 7 6.912972 0.087028026580810547 0.0075738774105502671 +2017 5 5.092607 0.092607021331787109 0.0085760603999460727 +2018 7 6.232492 0.76750802993774414 0.58906857601891716 +2019 6 5.776343 0.22365713119506836 0.05002251233440802 +2020 6 6.10125542 0.10125541687011719 0.010252659445541212 +2021 6 5.754315 0.24568510055541992 0.060361168634926798 +2022 6 5.4808135 0.51918649673461914 0.26955461839156669 +2023 6 5.754315 0.24568510055541992 0.060361168634926798 +2024 5 4.96590948 0.034090518951416016 0.0011621634823768545 +2025 5 5.17452765 0.17452764511108398 0.030459898908020477 +2026 5 5.023958 0.023958206176757813 0.0005739956432080362 +2027 5 5.157997 0.15799713134765625 0.024963093514088541 +2028 6 5.89450932 0.10549068450927734 0.011128284518235887 +2029 6 5.4808135 0.51918649673461914 0.26955461839156669 +2030 6 5.95882463 0.041175365447998047 0.0016954107197761914 +2031 5 5.872901 0.87290096282958984 0.76195609090882499 +2032 6 5.861079 0.13892078399658203 0.019298984226225002 +2033 5 5.812295 0.81229496002197266 0.65982310207709816 +2034 5 5.461388 0.46138811111450195 0.212878989077808 +2035 5 5.35088253 0.35088253021240234 0.12311855000825744 +2036 6 5.8191 0.18090009689331055 0.032724845056009144 +2037 5 5.872901 0.87290096282958984 0.76195609090882499 +2038 5 5.41155052 0.41155052185058594 0.16937383203548961 +2039 5 4.945262 0.054738044738769531 0.0029962535418235348 +2040 6 5.609648 0.39035177230834961 0.15237450614426962 +2041 5 5.41155052 0.41155052185058594 0.16937383203548961 +2042 6 5.48308659 0.51691341400146484 0.26719947757464979 +2043 6 6.14729 0.14729022979736328 0.021694411793760082 +2044 6 5.79861736 0.20138263702392578 0.040554966494710243 +2045 5 4.945262 0.054738044738769531 0.0029962535418235348 +2046 5 5.277068 0.27706813812255859 0.076766753162701207 +2047 5 5.24007225 0.24007225036621094 0.057634685395896668 +2048 5 5.30321026 0.30321025848388672 0.091936460849865398 +2049 7 5.9215703 1.0784296989440918 1.1630106155646445 +2050 3 4.432997 1.4329972267150879 2.053481051773133 +2051 5 5.28876 0.28876018524169922 0.083382444580820447 +2052 5 5.28876 0.28876018524169922 0.083382444580820447 +2053 5 5.65129566 0.65129566192626953 0.42418603924397758 +2054 5 5.65129566 0.65129566192626953 0.42418603924397758 +2055 6 5.98419333 0.015806674957275391 0.00024985097320495697 +2056 5 5.28876 0.28876018524169922 0.083382444580820447 +2057 7 6.820425 0.17957496643066406 0.032247168568574125 +2058 5 5.500557 0.50055694580078125 0.25055725598940626 +2059 5 5.399121 0.39912080764770508 0.1592974190973564 +2060 5 5.51282835 0.51282835006713867 0.26299291663258373 +2061 6 5.91880846 0.081191539764404297 0.0065920661293148441 +2062 5 6.137123 1.1371231079101563 1.2930489625432529 +2063 5 5.53835773 0.53835773468017578 0.28982905048997054 +2064 6 5.8279 0.17210006713867188 0.029618433109135367 +2065 5 5.457421 0.45742082595825195 0.20923381202032942 +2066 5 5.50936365 0.50936365127563477 0.25945132924084646 +2067 5 5.50936365 0.50936365127563477 0.25945132924084646 +2068 6 6.24757767 0.24757766723632813 0.061294701314182021 +2069 7 6.39426327 0.60573673248291016 0.36691698907907266 +2070 6 5.37203646 0.62796354293823242 0.39433821125953727 +2071 6 6.07056141 0.070561408996582031 0.0049789124395829276 +2072 5 5.673299 0.67329883575439453 0.45333132222822314 +2073 5 5.340492 0.34049177169799805 0.11593464659404162 +2074 6 5.8279 0.17210006713867188 0.029618433109135367 +2075 5 5.53835773 0.53835773468017578 0.28982905048997054 +2076 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2077 6 5.62602234 0.3739776611328125 0.13985929102636874 +2078 6 6.08607531 0.086075305938720703 0.0074089582924443675 +2079 4 5.137181 1.1371808052062988 1.2931801837296462 +2080 5 5.06985044 0.069850444793701172 0.0048790846378778951 +2081 5 5.31921959 0.31921958923339844 0.10190114615033963 +2082 6 5.793145 0.20685482025146484 0.04278891666126583 +2083 5 5.237396 0.2373957633972168 0.056356748478947338 +2084 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2085 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2086 5 5.515484 0.51548385620117188 0.26572360600403044 +2087 6 5.955682 0.044318199157714844 0.0019641027765828767 +2088 6 5.975536 0.024464130401611328 0.00059849367630704364 +2089 6 6.02037954 0.020379543304443359 0.00041532578529768216 +2090 5 5.20975637 0.20975637435913086 0.04399773658428785 +2091 5 5.30951 0.30951023101806641 0.095796583104856836 +2092 5 5.085698 0.085698127746582031 0.007344169099269493 +2093 5 5.254017 0.25401687622070313 0.064524573404924013 +2094 5 5.254017 0.25401687622070313 0.064524573404924013 +2095 5 5.39610338 0.3961033821105957 0.15689788931945259 +2096 5 4.758813 0.24118709564208984 0.058171215104266594 +2097 5 5.65508652 0.65508651733398438 0.42913834519276861 +2098 6 6.13854647 0.13854646682739258 0.019195123470353792 +2099 5 5.38220358 0.38220357894897461 0.14607957576140507 +2100 5 5.65508652 0.65508651733398438 0.42913834519276861 +2101 6 6.26671 0.26670980453491211 0.071134119835051024 +2102 5 5.41741562 0.41741561889648438 0.17423579889873508 +2103 5 5.247345 0.247344970703125 0.061179534532129765 +2104 5 5.38220358 0.38220357894897461 0.14607957576140507 +2105 5 4.758813 0.24118709564208984 0.058171215104266594 +2106 5 5.057006 0.057005882263183594 0.0032496706126039498 +2107 6 5.77749348 0.22250652313232422 0.049509152836435533 +2108 6 6.13854647 0.13854646682739258 0.019195123470353792 +2109 6 5.957272 0.042727947235107422 0.001825677474926124 +2110 5 5.11222172 0.11222171783447266 0.012593713953719998 +2111 5 5.11222172 0.11222171783447266 0.012593713953719998 +2112 5 5.11222172 0.11222171783447266 0.012593713953719998 +2113 5 5.136051 0.13605117797851563 0.018509923029341735 +2114 6 5.957272 0.042727947235107422 0.001825677474926124 +2115 5 5.11222172 0.11222171783447266 0.012593713953719998 +2116 4 5.84926033 1.8492603302001953 3.4197637688521354 +2117 5 5.63614273 0.63614273071289063 0.40467757383885328 +2118 6 6.353011 0.35301113128662109 0.12461685881226003 +2119 4 5.739438 1.7394380569458008 3.0256447539513829 +2120 5 5.592541 0.59254121780395508 0.35110509479659413 +2121 7 6.842314 0.15768623352050781 0.024864948241884122 +2122 5 5.53295135 0.53295135498046875 0.28403714677551761 +2123 5 5.592541 0.59254121780395508 0.35110509479659413 +2124 7 6.842314 0.15768623352050781 0.024864948241884122 +2125 5 5.52707672 0.52707672119140625 0.2778098700218834 +2126 5 5.25731373 0.25731372833251953 0.066210354788381665 +2127 5 4.86935139 0.13064861297607422 0.017069060072572029 +2128 6 5.41065741 0.58934259414672852 0.34732469327559556 +2129 5 6.337489 1.337489128112793 1.7888771678199191 +2130 5 5.82943773 0.8294377326965332 0.68796695242076567 +2131 6 5.59359074 0.40640926361083984 0.16516848954870511 +2132 6 5.59359074 0.40640926361083984 0.16516848954870511 +2133 6 5.91878843 0.081211566925048828 0.0065953186024216848 +2134 6 6.26523066 0.26523065567016602 0.070347300707226168 +2135 5 5.80142641 0.80142641067504883 0.64228429172749202 +2136 6 6.29388428 0.29388427734375 0.08636796846985817 +2137 5 5.80142641 0.80142641067504883 0.64228429172749202 +2138 5 5.58149242 0.58149242401123047 0.33813343918245664 +2139 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2140 5 5.238538 0.23853778839111328 0.056900276490523538 +2141 5 5.238538 0.23853778839111328 0.056900276490523538 +2142 5 5.346484 0.34648418426513672 0.12005128994587722 +2143 7 6.779074 0.22092580795288086 0.048808212619633196 +2144 6 5.85388136 0.1461186408996582 0.021350657218363267 +2145 6 5.790298 0.2097020149230957 0.043974935062806253 +2146 6 5.929391 0.070609092712402344 0.0049856439736686298 +2147 5 5.50856447 0.50856447219848633 0.25863782238252497 +2148 5 5.00561762 0.0056176185607910156 3.1557638294543722E-05 +2149 6 6.505095 0.50509500503540039 0.25512096411171115 +2150 6 6.639851 0.63985109329223633 0.40940942158727012 +2151 5 5.238538 0.23853778839111328 0.056900276490523538 +2152 6 5.64773 0.35227012634277344 0.12409424191355356 +2153 6 5.92296648 0.077033519744873047 0.0059341631642837456 +2154 4 4.198002 0.19800186157226563 0.039204737186082639 +2155 5 5.715006 0.71500587463378906 0.51123340076082968 +2156 4 5.04174948 1.0417494773864746 1.085241973634993 +2157 6 6.246933 0.2469329833984375 0.06097589829005301 +2158 6 6.27462959 0.27462959289550781 0.075421413293952355 +2159 4 5.01505 1.015049934387207 1.0303263692994733 +2160 6 6.67232943 0.67232942581176758 0.45202685681238108 +2161 7 6.62193441 0.37806558609008789 0.14293358738564166 +2162 6 5.09313726 0.90686273574829102 0.8224000214888747 +2163 6 6.246933 0.2469329833984375 0.06097589829005301 +2164 5 5.51115274 0.51115274429321289 0.26127712799848268 +2165 5 5.17895126 0.17895126342773438 0.032023554682382382 +2166 5 5.17895126 0.17895126342773438 0.032023554682382382 +2167 7 6.7765646 0.22343540191650391 0.049923378829589637 +2168 7 6.7765646 0.22343540191650391 0.049923378829589637 +2169 7 6.7765646 0.22343540191650391 0.049923378829589637 +2170 7 6.7765646 0.22343540191650391 0.049923378829589637 +2171 7 6.7765646 0.22343540191650391 0.049923378829589637 +2172 5 4.84022141 0.15977859497070313 0.025529199410811998 +2173 5 5.25834274 0.25834274291992188 0.066740972819388844 +2174 7 6.7765646 0.22343540191650391 0.049923378829589637 +2175 7 6.770401 0.2295989990234375 0.052715700352564454 +2176 5 4.84022141 0.15977859497070313 0.025529199410811998 +2177 7 5.39672947 1.6032705307006836 2.5704763946132516 +2178 5 5.25834274 0.25834274291992188 0.066740972819388844 +2179 6 5.89384937 0.10615062713623047 0.011267955641415028 +2180 6 5.356053 0.64394712448120117 0.4146678991276076 +2181 6 6.08375168 0.083751678466796875 0.0070143436460057274 +2182 5 5.390071 0.39007091522216797 0.15215531890225975 +2183 5 5.441367 0.44136714935302734 0.19480496052801755 +2184 6 5.66160774 0.33839225769042969 0.11450932006482617 +2185 7 6.191624 0.80837583541870117 0.65347149128888304 +2186 5 5.19513273 0.19513273239135742 0.03807678325051711 +2187 5 5.130219 0.1302189826965332 0.016956983454520014 +2188 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2189 6 6.26448154 0.26448154449462891 0.06995048737826437 +2190 6 6.82654762 0.82654762268066406 0.68318097255905741 +2191 5 5.425485 0.42548513412475586 0.18103759936116148 +2192 6 5.45986128 0.54013872146606445 0.29174983842699476 +2193 6 6.26448154 0.26448154449462891 0.06995048737826437 +2194 6 5.99864054 0.0013594627380371094 1.8481389361113543E-06 +2195 5 5.130219 0.1302189826965332 0.016956983454520014 +2196 6 5.875051 0.12494897842407227 0.015612247209219277 +2197 6 6.14725447 0.14725446701049805 0.021683878054545858 +2198 5 5.17893553 0.17893552780151367 0.032017923109606272 +2199 6 5.539782 0.46021795272827148 0.21180056401340153 +2200 5 5.37913132 0.37913131713867188 0.14374055563530419 +2201 6 5.54702854 0.45297145843505859 0.20518314215678402 +2202 5 5.17893553 0.17893552780151367 0.032017923109606272 +2203 5 5.33585262 0.33585262298583984 0.11279698436646868 +2204 5 4.981754 0.018246173858642578 0.00033292286047981179 +2205 5 5.47519064 0.47519063949584961 0.22580614386447451 +2206 6 5.697418 0.302581787109375 0.091555737890303135 +2207 7 6.363133 0.63686704635620117 0.40559963473447169 +2208 5 5.92743444 0.92743444442749023 0.86013464871052747 +2209 6 6.38974 0.389739990234375 0.15189725998789072 +2210 7 5.881483 1.1185169219970703 1.2510801047938003 +2211 6 6.051986 0.051986217498779297 0.0027025668098303868 +2212 6 6.38974 0.389739990234375 0.15189725998789072 +2213 6 6.225851 0.22585105895996094 0.051008700833335752 +2214 5 5.92743444 0.92743444442749023 0.86013464871052747 +2215 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2216 5 5.22257233 0.22257232666015625 0.049538440594915301 +2217 6 5.75656176 0.2434382438659668 0.059262178576545921 +2218 6 6.004971 0.0049710273742675781 2.4711113155717612E-05 +2219 7 6.9423914 0.057608604431152344 0.0033187513045049855 +2220 6 5.98822832 0.011771678924560547 0.00013857242470294295 +2221 6 6.02901554 0.029015541076660156 0.00084190162397135282 +2222 7 6.238345 0.76165485382080078 0.58011811634878541 +2223 6 5.76465273 0.23534727096557617 0.055388337950944333 +2224 7 6.238345 0.76165485382080078 0.58011811634878541 +2225 4 5.334978 1.3349781036376953 1.7821665371920972 +2226 5 5.42304373 0.42304372787475586 0.17896599569417049 +2227 5 5.3450017 0.3450016975402832 0.11902617130567705 +2228 7 6.38641167 0.61358833312988281 0.37649064255310805 +2229 6 6.327121 0.32712078094482422 0.10700800532595167 +2230 7 6.38641167 0.61358833312988281 0.37649064255310805 +2231 6 6.327121 0.32712078094482422 0.10700800532595167 +2232 6 5.600168 0.39983177185058594 0.15986544578117901 +2233 5 5.111535 0.11153507232666016 0.012440072358913312 +2234 5 5.26435328 0.26435327529907227 0.069882654161347091 +2235 6 5.37941647 0.62058353424072266 0.38512392297070619 +2236 5 5.251844 0.25184392929077148 0.063425364720615107 +2237 4 5.0567894 1.0567893981933594 1.1168038321338827 +2238 6 6.033932 0.033932209014892578 0.0011513948086303571 +2239 6 5.37941647 0.62058353424072266 0.38512392297070619 +2240 5 5.248432 0.24843215942382813 0.061718537835986353 +2241 5 5.251844 0.25184392929077148 0.063425364720615107 +2242 5 5.399409 0.39940881729125977 0.15952740333000293 +2243 5 5.80063057 0.80063056945800781 0.64100930875065387 +2244 5 5.151465 0.15146493911743164 0.022941627781847274 +2245 7 5.89144135 1.1085586547851563 1.2289022910990752 +2246 4 5.0567894 1.0567893981933594 1.1168038321338827 +2247 6 6.033932 0.033932209014892578 0.0011513948086303571 +2248 6 5.807818 0.19218206405639648 0.036933945744976882 +2249 5 5.127346 0.12734603881835938 0.016217013602727093 +2250 6 5.35683775 0.64316225051879883 0.41365768049240614 +2251 7 6.476783 0.52321720123291016 0.2737562396659996 +2252 5 5.24472237 0.24472236633300781 0.059889036583626876 +2253 5 5.127346 0.12734603881835938 0.016217013602727093 +2254 6 5.68012667 0.31987333297729492 0.10231894915000339 +2255 6 5.649487 0.35051298141479492 0.12285935014028837 +2256 5 5.77087641 0.77087640762329102 0.59425043583019033 +2257 6 5.534438 0.46556186676025391 0.21674785178129241 +2258 5 5.237371 0.23737096786499023 0.056344976385162227 +2259 6 5.534438 0.46556186676025391 0.21674785178129241 +2260 5 5.237371 0.23737096786499023 0.056344976385162227 +2261 6 5.32792854 0.67207145690917969 0.45168004319202737 +2262 6 5.51419926 0.48580074310302734 0.23600236199945357 +2263 5 5.17338371 0.17338371276855469 0.030061911853408674 +2264 6 6.11459446 0.11459445953369141 0.013131890155818837 +2265 5 5.17338371 0.17338371276855469 0.030061911853408674 +2266 5 5.259477 0.25947713851928711 0.06732838541415731 +2267 6 6.11459446 0.11459445953369141 0.013131890155818837 +2268 6 5.62352276 0.37647724151611328 0.14173511337958189 +2269 6 5.99339151 0.0066084861755371094 4.367208953226509E-05 +2270 7 6.46453953 0.53546047210693359 0.28671791718898021 +2271 6 5.59352732 0.40647268295288086 0.1652200419869132 +2272 6 6.096581 0.096580982208251953 0.0093278861243106803 +2273 5 4.882008 0.11799192428588867 0.013922094196686885 +2274 7 6.46453953 0.53546047210693359 0.28671791718898021 +2275 4 5.08899927 1.0889992713928223 1.1859194130940978 +2276 6 5.319647 0.68035316467285156 0.46288042868036428 +2277 6 6.20249128 0.20249128341674805 0.041002719859761783 +2278 6 5.319647 0.68035316467285156 0.46288042868036428 +2279 5 5.251488 0.25148820877075195 0.06324631915072132 +2280 6 6.21316671 0.21316671371459961 0.045440047835882069 +2281 6 6.06043863 0.060438632965087891 0.0036528283546886087 +2282 5 5.13450336 0.13450336456298828 0.018091155078764132 +2283 5 5.13450336 0.13450336456298828 0.018091155078764132 +2284 5 5.13450336 0.13450336456298828 0.018091155078764132 +2285 5 5.13450336 0.13450336456298828 0.018091155078764132 +2286 5 5.239092 0.23909187316894531 0.057164923815435031 +2287 5 5.03401 0.034009933471679688 0.0011566755747480784 +2288 5 5.13450336 0.13450336456298828 0.018091155078764132 +2289 7 7.010147 0.0101470947265625 0.0001029635313898325 +2290 7 6.22187948 0.77812051773071289 0.60547154011351267 +2291 6 6.003072 0.0030717849731445313 9.4358629212365486E-06 +2292 6 5.163496 0.83650398254394531 0.69973891281188116 +2293 7 7.010147 0.0101470947265625 0.0001029635313898325 +2294 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2295 6 5.405581 0.59441900253295898 0.3533339505722779 +2296 7 6.178634 0.8213658332824707 0.67464183208380746 +2297 6 5.51448441 0.48551559448242188 0.23572539248561952 +2298 8 7.070608 0.92939186096191406 0.8637692312222498 +2299 7 7.03232765 0.032327651977539063 0.0010450770823808853 +2300 7 6.941374 0.058626174926757813 0.0034370283865428064 +2301 5 5.82642746 0.82642745971679688 0.68298234617395792 +2302 5 5.069897 0.069897174835205078 0.004885615049943226 +2303 5 5.160475 0.16047477722167969 0.025752154124347726 +2304 6 5.08372641 0.91627359390258789 0.83955729888316455 +2305 7 6.6948843 0.30511569976806641 0.093095590244956838 +2306 5 5.255328 0.25532817840576172 0.065192478688004485 +2307 5 5.56966 0.56966018676757813 0.32451272838807199 +2308 5 4.917936 0.082064151763916016 0.0067345250047310401 +2309 6 5.15906954 0.84093046188354492 0.7071640417236722 +2310 5 5.56966 0.56966018676757813 0.32451272838807199 +2311 7 6.76234055 0.23765945434570313 0.056482016239897348 +2312 5 4.917936 0.082064151763916016 0.0067345250047310401 +2313 7 6.685575 0.31442499160766602 0.098863075347480844 +2314 6 6.73747158 0.73747158050537109 0.54386433205309004 +2315 6 6.32627153 0.32627153396606445 0.10645311387656875 +2316 7 6.55684757 0.44315242767333984 0.1963840741527747 +2317 5 5.376687 0.37668704986572266 0.14189313353654143 +2318 4 5.363103 1.363102912902832 1.8580495511641857 +2319 7 7.1930356 0.19303560256958008 0.037262743859400871 +2320 6 6.450675 0.45067501068115234 0.20310796525245678 +2321 5 4.742714 0.25728607177734375 0.06619612273061648 +2322 6 5.43903542 0.56096458435058594 0.31468126489562565 +2323 6 6.52697325 0.52697324752807617 0.27770080361028704 +2324 5 5.214914 0.21491384506225586 0.046187960799443317 +2325 6 4.96547174 1.0345282554626465 1.0702487113505867 +2326 5 5.26503468 0.26503467559814453 0.070243379269413708 +2327 6 4.96547174 1.0345282554626465 1.0702487113505867 +2328 5 5.26503468 0.26503467559814453 0.070243379269413708 +2329 5 5.334872 0.33487176895141602 0.11213910164065055 +2330 6 5.69431925 0.30568075180053711 0.093440722021341571 +2331 5 5.632817 0.63281679153442383 0.40045709164792243 +2332 6 5.70019341 0.29980659484863281 0.089883994314732263 +2333 8 7.38234949 0.61765050888061523 0.38149215112048296 +2334 5 4.905586 0.094414234161376953 0.0089140476122793189 +2335 5 5.82466841 0.82466840744018555 0.68007798222993188 +2336 5 4.577453 0.4225468635559082 0.1785458519009353 +2337 4 5.1711154 1.1711153984069824 1.3715112763859452 +2338 5 5.36899 0.36898994445800781 0.13615357911112369 +2339 6 5.740299 0.25970077514648438 0.067444492611684836 +2340 6 5.75540924 0.24459075927734375 0.059824639523867518 +2341 5 5.36899 0.36898994445800781 0.13615357911112369 +2342 8 6.87260151 1.1273984909057617 1.2710273572965889 +2343 5 6.3333354 1.3333353996276855 1.7777832879003199 +2344 6 5.740299 0.25970077514648438 0.067444492611684836 +2345 6 5.8191905 0.18080949783325195 0.032692074506712743 +2346 4 5.19108963 1.1910896301269531 1.418694506995962 +2347 6 6.069222 0.069221973419189453 0.0047916816040469712 +2348 6 5.79119158 0.20880842208862305 0.043600957135140561 +2349 5 5.02437 0.024370193481445313 0.0005939063303230796 +2350 5 5.51743269 0.51743268966674805 0.26773658833576519 +2351 6 5.81947565 0.18052434921264648 0.032589040658649537 +2352 6 5.35855627 0.64144372940063477 0.41145005798739476 +2353 7 6.329165 0.67083501815795898 0.45001962158698916 +2354 6 6.09388351 0.093883514404296875 0.0088141142769018188 +2355 7 6.501256 0.49874401092529297 0.24874558843384875 +2356 6 5.91373 0.086269855499267578 0.0074424879678645084 +2357 5 5.588777 0.58877706527709961 0.34665843259631401 +2358 5 5.56147957 0.56147956848144531 0.31525930582211004 +2359 5 5.16718626 0.16718626022338867 0.027951245607482633 +2360 6 5.79588366 0.2041163444519043 0.041663482072408442 +2361 5 5.330882 0.33088207244873047 0.10948294586796692 +2362 6 6.38512039 0.38512039184570313 0.14831771621538792 +2363 5 5.396926 0.39692592620849609 0.15755019089647249 +2364 5 5.1075263 0.10752630233764648 0.01156190569440696 +2365 5 5.29107666 0.29107666015625 0.084725622087717056 +2366 5 5.311592 0.31159210205078125 0.097089638060424477 +2367 6 5.39217 0.60783004760742188 0.36945736677444074 +2368 6 5.97187042 0.02812957763671875 0.00079127313802018762 +2369 6 6.071237 0.071237087249755859 0.0050747225998293288 +2370 7 6.65556 0.34443998336791992 0.11863890214249295 +2371 5 5.03869963 0.038699626922607422 0.0014976611239490012 +2372 4 4.18628931 0.18628931045532227 0.034703707189919442 +2373 3 3.84731722 0.84731721878051758 0.71794646924195149 +2374 6 6.297287 0.2972869873046875 0.088379552820697427 +2375 6 6.81347132 0.81347131729125977 0.66173558405557742 +2376 6 6.297287 0.2972869873046875 0.088379552820697427 +2377 6 5.87790442 0.12209558486938477 0.014907331844597138 +2378 5 5.080402 0.080401897430419922 0.0064644651104117656 +2379 4 4.55011559 0.55011558532714844 0.30262715721983113 +2380 4 4.447009 0.44700908660888672 0.19981712351091119 +2381 6 6.23594141 0.23594141006469727 0.055668348983317628 +2382 8 7.02860928 0.97139072418212891 0.94359993902708084 +2383 6 6.467941 0.4679408073425293 0.21896859917637812 +2384 8 7.02860928 0.97139072418212891 0.94359993902708084 +2385 5 5.768393 0.76839303970336914 0.59042786346458342 +2386 4 4.982087 0.98208713531494141 0.96449514135110803 +2387 4 4.92572927 0.92572927474975586 0.85697469012870897 +2388 4 4.838168 0.83816814422607422 0.70252583799538115 +2389 8 7.15358829 0.84641170501708984 0.71641277438993711 +2390 8 6.68599939 1.3140006065368652 1.7265975939792497 +2391 6 5.951952 0.048048019409179688 0.002308612169144908 +2392 7 6.037923 0.96207714080810547 0.9255924248654992 +2393 6 6.037923 0.037922859191894531 0.0014381432492882595 +2394 5 5.070125 0.070125102996826172 0.004917530070315479 +2395 5 5.324506 0.32450580596923828 0.10530401810774492 +2396 5 4.995414 0.0045862197875976563 2.1033411940152291E-05 +2397 6 6.378008 0.37800788879394531 0.14288996399045573 +2398 6 6.13482952 0.13482952117919922 0.018178999781412131 +2399 6 6.16249466 0.16249465942382813 0.026404514341265894 +2400 4 4.94752169 0.94752168655395508 0.8977973464900515 +2401 4 5.241969 1.241969108581543 1.5424872666708325 +2402 6 5.76762533 0.23237466812133789 0.053997986384501928 +2403 6 5.933714 0.066286087036132813 0.0043938453345617745 +2404 5 5.02169943 0.021699428558349609 0.00047086519975891861 +2405 5 5.430184 0.43018388748168945 0.18505817704885885 +2406 6 6.83018541 0.8301854133605957 0.68920782055670315 +2407 6 6.28223658 0.28223657608032227 0.079657484877543538 +2408 5 5.383545 0.383544921875 0.14710670709609985 +2409 4 5.90790749 1.9079074859619141 3.6401109749895113 +2410 6 5.853688 0.14631223678588867 0.021407270633289954 +2411 6 5.365198 0.63480186462402344 0.40297340733013698 +2412 4 4.653695 0.65369510650634766 0.42731729227034521 +2413 4 5.90790749 1.9079074859619141 3.6401109749895113 +2414 4 4.4736166 0.47361660003662109 0.22431268383024872 +2415 5 5.58259344 0.58259344100952148 0.33941511750731479 +2416 6 5.853688 0.14631223678588867 0.021407270633289954 +2417 5 5.08736038 0.087360382080078125 0.0076318363571772352 +2418 5 5.1927886 0.19278860092163086 0.037167444645319847 +2419 5 5.01314974 0.013149738311767578 0.00017291561766796804 +2420 7 6.78615475 0.21384525299072266 0.045729792226666177 +2421 5 5.62462759 0.62462759017944336 0.39015962641337865 +2422 5 4.834279 0.16572093963623047 0.027463429833915143 +2423 6 5.79968929 0.20031070709228516 0.040124379375811259 +2424 5 4.834279 0.16572093963623047 0.027463429833915143 +2425 6 5.79968929 0.20031070709228516 0.040124379375811259 +2426 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2427 6 5.67294264 0.3270573616027832 0.10696651777857369 +2428 6 6.04787254 0.047872543334960938 0.0022917804053577129 +2429 6 5.67294264 0.3270573616027832 0.10696651777857369 +2430 5 5.191099 0.19109916687011719 0.036518891578452894 +2431 5 5.090718 0.090717792510986328 0.0082297178780663671 +2432 5 5.212568 0.21256780624389648 0.045185072251342717 +2433 6 5.457381 0.54261922836303711 0.29443562698929782 +2434 6 5.55754471 0.44245529174804688 0.19576668519584928 +2435 4 5.018812 1.0188121795654297 1.0379782572308613 +2436 5 5.1477704 0.14777040481567383 0.021836092539388119 +2437 6 5.767265 0.23273515701293945 0.05416565330983758 +2438 5 5.1477704 0.14777040481567383 0.021836092539388119 +2439 6 5.80857754 0.19142246246337891 0.036642559135543706 +2440 5 5.177423 0.17742300033569336 0.031478921048119446 +2441 6 6.0388093 0.038809299468994141 0.0015061617252740689 +2442 5 5.33315 0.33314990997314453 0.11098886251511431 +2443 5 5.356635 0.35663509368896484 0.12718859005053673 +2444 5 5.33315 0.33314990997314453 0.11098886251511431 +2445 5 5.36508751 0.36508750915527344 0.13328888934120187 +2446 5 5.356635 0.35663509368896484 0.12718859005053673 +2447 6 5.930377 0.069622993469238281 0.0048473612196175964 +2448 6 6.02893972 0.028939723968505859 0.00083750762337331253 +2449 6 6.112941 0.11294078826904297 0.012755621654832794 +2450 5 5.138178 0.13817787170410156 0.019093124228675151 +2451 5 5.138178 0.13817787170410156 0.019093124228675151 +2452 7 6.46374655 0.53625345230102539 0.28756776510476811 +2453 6 6.33004045 0.33004045486450195 0.10892670184716735 +2454 5 5.5165844 0.51658439636230469 0.26685943856500671 +2455 6 5.63751173 0.3624882698059082 0.1313977457468809 +2456 6 5.84722948 0.1527705192565918 0.023338831553928685 +2457 6 5.84722948 0.1527705192565918 0.023338831553928685 +2458 6 5.63751173 0.3624882698059082 0.1313977457468809 +2459 5 5.22885036 0.22885036468505859 0.052372489416484314 +2460 5 5.22885036 0.22885036468505859 0.052372489416484314 +2461 5 4.82563972 0.17436027526855469 0.030401505591726163 +2462 5 4.90771 0.092289924621582031 0.0085174301866572932 +2463 7 6.190032 0.80996799468994141 0.65604815242204495 +2464 5 5.229953 0.22995281219482422 0.052878295836308098 +2465 5 5.131188 0.13118791580200195 0.017210269252473154 +2466 5 5.164425 0.16442489624023438 0.02703554650361184 +2467 6 5.66543436 0.33456563949584961 0.1119341671312668 +2468 6 5.811642 0.18835783004760742 0.035478672140243361 +2469 5 5.10665464 0.10665464401245117 0.011375213089422687 +2470 5 5.55674934 0.55674934387207031 0.3099698319019808 +2471 7 6.85693 0.14307022094726563 0.020469088121899404 +2472 6 5.627016 0.37298393249511719 0.13911701389952214 +2473 6 5.3198247 0.6801753044128418 0.46263844473310201 +2474 7 6.27704525 0.72295475006103516 0.52266357063581381 +2475 5 4.89538431 0.10461568832397461 0.010944442243498997 +2476 6 5.59821844 0.40178155899047852 0.16142842114481937 +2477 7 6.27704525 0.72295475006103516 0.52266357063581381 +2478 6 5.4796133 0.52038669586181641 0.27080231322997861 +2479 6 5.65785551 0.34214448928833008 0.11706285155037222 +2480 5 5.200323 0.20032310485839844 0.040129346340108896 +2481 6 5.394372 0.60562801361083984 0.36678529087021161 +2482 6 5.52501059 0.47498941421508789 0.22561494361639234 +2483 6 5.4796133 0.52038669586181641 0.27080231322997861 +2484 5 5.12939167 0.12939167022705078 0.01674220432414586 +2485 6 5.59504271 0.40495729446411133 0.16399041033969297 +2486 5 5.50079441 0.50079441070556641 0.25079504179393552 +2487 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2488 6 6.07149029 0.071490287780761719 0.0051108612469761283 +2489 6 5.56793261 0.4320673942565918 0.18668223317968113 +2490 6 5.73469973 0.26530027389526367 0.070384235328901923 +2491 5 5.48845625 0.48845624923706055 0.23858950741873741 +2492 6 5.56793261 0.4320673942565918 0.18668223317968113 +2493 4 5.123062 1.1230621337890625 1.2612685563508421 +2494 4 5.123062 1.1230621337890625 1.2612685563508421 +2495 5 5.651345 0.65134477615356445 0.42425001742253698 +2496 5 5.6806283 0.68062829971313477 0.46325488237039281 +2497 5 5.313193 0.31319284439086914 0.098089757777643172 +2498 5 5.313193 0.31319284439086914 0.098089757777643172 +2499 6 6.38280439 0.38280439376831055 0.14653920388832375 +2500 5 5.313193 0.31319284439086914 0.098089757777643172 +2501 5 5.424 0.42399978637695313 0.17977581884770188 +2502 4 4.899974 0.89997386932373047 0.80995296546552709 +2503 4 4.899974 0.89997386932373047 0.80995296546552709 +2504 6 5.45203543 0.54796457290649414 0.30026517316059653 +2505 6 5.481323 0.5186772346496582 0.2690260737438166 +2506 6 5.456469 0.54353094100952148 0.29542588383469592 +2507 7 6.86489058 0.13510942459106445 0.018254556613328532 +2508 6 5.3075223 0.69247770309448242 0.47952536928301015 +2509 5 5.15516758 0.15516757965087891 0.02407697777471185 +2510 6 5.557624 0.44237613677978516 0.19569664639220719 +2511 6 5.422771 0.57722902297973633 0.33319334497014097 +2512 6 5.622964 0.37703609466552734 0.1421562166806325 +2513 5 5.087558 0.087557792663574219 0.0076663670561174513 +2514 7 6.945491 0.054509162902832031 0.0029712488403674797 +2515 7 6.896848 0.10315179824829102 0.010640293481856133 +2516 6 5.80096245 0.19903755187988281 0.039615947058337042 +2517 6 5.541327 0.45867300033569336 0.21038092123694696 +2518 7 6.896848 0.10315179824829102 0.010640293481856133 +2519 5 5.26988125 0.26988124847412109 0.072835888277950289 +2520 5 5.06689453 0.06689453125 0.0044748783111572266 +2521 7 6.889004 0.11099576950073242 0.012320060847059722 +2522 8 6.341771 1.658228874206543 2.7497229992522989 +2523 5 5.927134 0.92713403701782227 0.85957752259696463 +2524 5 5.06689453 0.06689453125 0.0044748783111572266 +2525 8 6.341771 1.658228874206543 2.7497229992522989 +2526 7 6.889004 0.11099576950073242 0.012320060847059722 +2527 6 6.22118 0.22117996215820313 0.048920575660304166 +2528 6 6.05786 0.057859897613525391 0.0033477677518476412 +2529 5 5.17878962 0.17878961563110352 0.031965726657517735 +2530 6 6.09709454 0.097094535827636719 0.0094273488875842304 +2531 4 4.63009644 0.630096435546875 0.3970215180888772 +2532 4 4.63009644 0.630096435546875 0.3970215180888772 +2533 5 5.742318 0.74231815338134766 0.55103624083949398 +2534 7 5.86696339 1.1330366134643555 1.2837719674507753 +2535 6 5.663614 0.33638620376586914 0.11315567808401283 +2536 6 5.621967 0.37803316116333008 0.14290907093914029 +2537 6 5.53835869 0.46164131164550781 0.21311270061778487 +2538 6 5.53835869 0.46164131164550781 0.21311270061778487 +2539 5 5.52992725 0.52992725372314453 0.280822894238554 +2540 5 5.604961 0.60496091842651367 0.36597771282345093 +2541 6 5.663614 0.33638620376586914 0.11315567808401283 +2542 5 5.57032871 0.57032871246337891 0.32527484026013553 +2543 6 5.621967 0.37803316116333008 0.14290907093914029 +2544 6 6.133279 0.13327884674072266 0.017763250988537038 +2545 6 5.878759 0.12124109268188477 0.014699402554697372 +2546 5 5.218156 0.21815586090087891 0.047591979645403626 +2547 5 5.08556461 0.085564613342285156 0.007321303056414763 +2548 6 5.635065 0.36493492126464844 0.13317749675843515 +2549 5 5.86682272 0.86682271957397461 0.75138162716962142 +2550 5 5.08556461 0.085564613342285156 0.007321303056414763 +2551 6 5.635065 0.36493492126464844 0.13317749675843515 +2552 5 4.91085434 0.089145660400390625 0.0079469487682217732 +2553 7 6.82945776 0.17054224014282227 0.029084655672932058 +2554 7 6.783399 0.21660089492797852 0.046915947683601189 +2555 7 6.82945776 0.17054224014282227 0.029084655672932058 +2556 5 5.36953926 0.36953926086425781 0.13655926532010199 +2557 7 6.783399 0.21660089492797852 0.046915947683601189 +2558 7 6.82945776 0.17054224014282227 0.029084655672932058 +2559 5 5.189397 0.18939685821533203 0.035871169901838584 +2560 6 5.70537949 0.29462051391601563 0.086801247220137157 +2561 5 5.28348732 0.28348731994628906 0.080365060570329661 +2562 6 5.70537949 0.29462051391601563 0.086801247220137157 +2563 5 5.189397 0.18939685821533203 0.035871169901838584 +2564 6 5.399755 0.60024499893188477 0.36029405874273834 +2565 5 5.337183 0.33718299865722656 0.11369237458347925 +2566 7 6.48339272 0.51660728454589844 0.26688308644588687 +2567 5 6.3172555 1.3172554969787598 1.7351620443207594 +2568 6 5.472037 0.52796316146850586 0.27874509986781959 +2569 6 6.171783 0.1717829704284668 0.029509388929227498 +2570 5 6.3172555 1.3172554969787598 1.7351620443207594 +2571 6 6.25385761 0.25385761260986328 0.064443687479979417 +2572 5 5.263467 0.26346683502197266 0.069414773156495357 +2573 5 5.41449165 0.41449165344238281 0.17180333077340038 +2574 5 5.74912739 0.74912738800048828 0.56119184345243411 +2575 6 6.094214 0.094213962554931641 0.0088762707403020613 +2576 5 5.55226135 0.5522613525390625 0.30499260150827467 +2577 5 5.6303606 0.63036060333251953 0.39735449023373803 +2578 7 6.90196466 0.098035335540771484 0.0096109270145916526 +2579 6 5.492593 0.50740718841552734 0.25746205485575047 +2580 5 5.378673 0.37867307662963867 0.1433932989641562 +2581 7 6.623414 0.37658596038818359 0.14181698556149058 +2582 7 6.623414 0.37658596038818359 0.14181698556149058 +2583 7 6.623414 0.37658596038818359 0.14181698556149058 +2584 7 6.623414 0.37658596038818359 0.14181698556149058 +2585 7 6.623414 0.37658596038818359 0.14181698556149058 +2586 7 6.623414 0.37658596038818359 0.14181698556149058 +2587 6 5.450896 0.54910421371459961 0.30151543751912868 +2588 7 6.623414 0.37658596038818359 0.14181698556149058 +2589 4 4.47188 0.47187995910644531 0.2226706958063005 +2590 6 6.29141 0.29140996932983398 0.084919770224814783 +2591 7 6.413187 0.58681297302246094 0.34434946530745947 +2592 5 5.89621 0.8962101936340332 0.80319271117355129 +2593 5 5.977096 0.9770960807800293 0.95471675107569354 +2594 7 6.802061 0.19793891906738281 0.039179815681563923 +2595 5 4.78572226 0.21427774429321289 0.04591495169938753 +2596 5 5.26803637 0.2680363655090332 0.071843493235292044 +2597 6 6.40936327 0.4093632698059082 0.16757828666618479 +2598 5 5.26803637 0.2680363655090332 0.071843493235292044 +2599 6 5.64444828 0.35555171966552734 0.12641702535711374 +2600 7 6.711269 0.28873109817504883 0.083365647053369685 +2601 5 5.516984 0.51698398590087891 0.26727244167796016 +2602 6 6.40936327 0.4093632698059082 0.16757828666618479 +2603 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2604 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2605 6 5.749763 0.25023698806762695 0.062618550197157674 +2606 6 6.066723 0.066722869873046875 0.0044519413640955463 +2607 6 6.004938 0.0049381256103515625 2.4385084543609992E-05 +2608 6 6.19136524 0.19136524200439453 0.036620655847400485 +2609 6 5.749763 0.25023698806762695 0.062618550197157674 +2610 5 5.21728945 0.21728944778442383 0.047214704118459849 +2611 5 5.43802834 0.43802833557128906 0.19186882276335382 +2612 7 6.90342331 0.096576690673828125 0.0093270571815082803 +2613 5 5.316313 0.31631278991699219 0.10005378106507123 +2614 5 6.02755356 1.0275535583496094 1.0558663152769441 +2615 7 6.71482038 0.28517961502075195 0.081327412823384293 +2616 7 6.71482038 0.28517961502075195 0.081327412823384293 +2617 7 6.71482038 0.28517961502075195 0.081327412823384293 +2618 7 6.17836475 0.82163524627685547 0.67508447792442894 +2619 6 5.447172 0.55282783508300781 0.30561861524256528 +2620 5 5.23616838 0.23616838455200195 0.055775505861902275 +2621 5 5.316313 0.31631278991699219 0.10005378106507123 +2622 7 6.17836475 0.82163524627685547 0.67508447792442894 +2623 7 6.71482038 0.28517961502075195 0.081327412823384293 +2624 5 6.02755356 1.0275535583496094 1.0558663152769441 +2625 5 4.932907 0.0670928955078125 0.0045014566276222467 +2626 7 6.67024565 0.32975435256958008 0.10873793303858292 +2627 7 6.191726 0.8082737922668457 0.65330652326542804 +2628 6 6.10126448 0.10126447677612305 0.010254494256741964 +2629 5 4.569814 0.43018579483032227 0.18505981807379612 +2630 6 5.93529558 0.064704418182373047 0.0041866617323194077 +2631 7 6.506482 0.49351787567138672 0.24355989360719832 +2632 5 4.742157 0.257843017578125 0.066483021713793278 +2633 5 5.672364 0.67236423492431641 0.45207366440536134 +2634 5 5.179316 0.17931604385375977 0.032154243583363495 +2635 6 6.10950756 0.10950756072998047 0.01199190585703036 +2636 5 5.672364 0.67236423492431641 0.45207366440536134 +2637 5 5.179316 0.17931604385375977 0.032154243583363495 +2638 6 6.36789942 0.36789941787719727 0.13534998167438062 +2639 6 5.970108 0.0298919677734375 0.00089352973736822605 +2640 6 6.01226473 0.012264728546142578 0.00015042356631056464 +2641 5 5.388603 0.38860321044921875 0.1510124551714398 +2642 5 5.089852 0.089851856231689453 0.0080733560682801908 +2643 5 5.421518 0.42151784896850586 0.17767729699903612 +2644 6 5.965845 0.034154891967773438 0.0011665566453302745 +2645 7 6.45913172 0.54086828231811523 0.2925384988177484 +2646 7 5.962606 1.0373940467834473 1.0761864083017372 +2647 5 5.531743 0.53174304962158203 0.28275067082086025 +2648 6 6.055601 0.055601119995117188 0.0030914845447114203 +2649 6 5.965845 0.034154891967773438 0.0011665566453302745 +2650 5 5.375029 0.37502908706665039 0.14064681614604524 +2651 5 5.00735 0.0073499679565429688 5.4022028962208424E-05 +2652 7 6.862701 0.1372990608215332 0.018851032102475074 +2653 5 5.389191 0.3891911506652832 0.15146975175616717 +2654 5 4.99643946 0.0035605430603027344 1.2677466884269961E-05 +2655 5 5.479881 0.47988080978393555 0.23028559159888573 +2656 4 5.36642933 1.366429328918457 1.8671291109285448 +2657 7 6.66357 0.33643007278442383 0.11318519387373271 +2658 7 6.43240547 0.56759452819824219 0.32216354844058515 +2659 6 6.25220728 0.25220727920532227 0.063608511684151381 +2660 6 5.396139 0.60386085510253906 0.36464793232516968 +2661 6 5.94709873 0.052901268005371094 0.0027985441565760993 +2662 6 6.15312243 0.1531224250793457 0.023446477062179838 +2663 8 6.468452 1.531548023223877 2.3456393474409651 +2664 7 6.755112 0.2448878288269043 0.059970048707555179 +2665 5 5.26342249 0.26342248916625977 0.069391407798548244 +2666 7 6.840258 0.15974187850952148 0.025517467749750722 +2667 7 6.64892 0.35107994079589844 0.12325712482925155 +2668 6 5.510326 0.48967409133911133 0.23978071572878434 +2669 5 5.402378 0.40237808227539063 0.16190812109562103 +2670 7 6.840258 0.15974187850952148 0.025517467749750722 +2671 7 6.964588 0.035411834716796875 0.0012539980380097404 +2672 7 6.438929 0.56107091903686523 0.31480057618887258 +2673 6 5.11319351 0.88680648803710938 0.78642574722471181 +2674 7 5.93575 1.0642499923706055 1.1326280462608338 +2675 7 5.96326256 1.0367374420166016 1.0748245236791263 +2676 6 6.27718973 0.27718973159790039 0.076834147303316058 +2677 6 6.43075943 0.43075942993164063 0.18555368647503201 +2678 5 5.22192669 0.22192668914794922 0.049251455356170482 +2679 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2680 6 6.6857276 0.68572759628295898 0.47022233630400478 +2681 6 6.17682171 0.17682170867919922 0.031265916660231596 +2682 6 6.14539433 0.14539432525634766 0.021139509816748614 +2683 5 5.22192669 0.22192668914794922 0.049251455356170482 +2684 6 6.398973 0.39897298812866211 0.15917944525631356 +2685 7 6.462977 0.53702306747436523 0.28839377499957664 +2686 6 6.6857276 0.68572759628295898 0.47022233630400478 +2687 5 5.45965528 0.4596552848815918 0.21128298091957731 +2688 6 6.17682171 0.17682170867919922 0.031265916660231596 +2689 6 5.90094137 0.099058628082275391 0.0098126117975425586 +2690 6 5.39443636 0.60556364059448242 0.36670732281004348 +2691 6 6.075588 0.075588226318359375 0.0057135799579555169 +2692 6 5.428855 0.57114505767822266 0.32620667691026028 +2693 6 6.246358 0.24635791778564453 0.06069222365567839 +2694 6 6.075588 0.075588226318359375 0.0057135799579555169 +2695 6 6.371832 0.37183189392089844 0.13825895733680227 +2696 6 5.633613 0.36638689041137695 0.13423935346531835 +2697 5 5.98760462 0.98760461807250977 0.97536288163814788 +2698 6 5.428855 0.57114505767822266 0.32620667691026028 +2699 6 5.39443636 0.60556364059448242 0.36670732281004348 +2700 7 6.802134 0.19786596298217773 0.039150939306864529 +2701 5 5.51507568 0.51507568359375 0.26530295982956886 +2702 5 5.51507568 0.51507568359375 0.26530295982956886 +2703 5 5.51507568 0.51507568359375 0.26530295982956886 +2704 6 5.557806 0.44219398498535156 0.19553552035722532 +2705 6 5.60688972 0.39311027526855469 0.15453568852171884 +2706 6 5.79417 0.20583009719848633 0.042366028912738329 +2707 5 5.51507568 0.51507568359375 0.26530295982956886 +2708 6 5.668365 0.3316349983215332 0.10998177211172333 +2709 5 5.385527 0.38552713394165039 0.14863117100526324 +2710 5 5.385527 0.38552713394165039 0.14863117100526324 +2711 5 5.449205 0.44920492172241211 0.20178506169963839 +2712 5 5.503833 0.50383281707763672 0.25384750756438734 +2713 6 5.668365 0.3316349983215332 0.10998177211172333 +2714 6 5.45965528 0.5403447151184082 0.29197241115639372 +2715 6 5.87323952 0.12676048278808594 0.016068219996668631 +2716 5 5.385527 0.38552713394165039 0.14863117100526324 +2717 6 6.10622644 0.10622644424438477 0.011284057456805385 +2718 6 5.66719341 0.33280658721923828 0.11076022449651646 +2719 6 6.14106846 0.14106845855712891 0.019900309999684396 +2720 7 6.80913448 0.19086551666259766 0.036429645450880344 +2721 5 5.197515 0.19751501083374023 0.039012179504652522 +2722 7 6.88614845 0.11385154724121094 0.012962174809217686 +2723 6 6.593465 0.59346485137939453 0.35220052982276684 +2724 6 6.14106846 0.14106845855712891 0.019900309999684396 +2725 5 5.453957 0.45395708084106445 0.20607703124574073 +2726 6 5.930292 0.069707870483398438 0.0048591872073302511 +2727 6 5.986483 0.013516902923583984 0.00018270666464559326 +2728 6 5.44713926 0.55286073684692383 0.30565499434692356 +2729 7 6.42816162 0.57183837890625 0.32699913159012794 +2730 5 5.11883736 0.11883735656738281 0.014122317315923283 +2731 5 5.159798 0.15979814529418945 0.025535447239462883 +2732 5 5.14337635 0.14337635040283203 0.020556777854835673 +2733 7 6.42816162 0.57183837890625 0.32699913159012794 +2734 6 5.868908 0.13109207153320313 0.017185131218866445 +2735 6 5.44713926 0.55286073684692383 0.30565499434692356 +2736 6 5.986483 0.013516902923583984 0.00018270666464559326 +2737 7 6.00914955 0.99085044860839844 0.98178461150746443 +2738 5 4.7449894 0.25501060485839844 0.065030408590246225 +2739 7 6.73053 0.26947021484375 0.072614196687936783 +2740 6 5.63796473 0.36203527450561523 0.13106953998635618 +2741 5 4.7449894 0.25501060485839844 0.065030408590246225 +2742 6 5.878949 0.12105083465576172 0.014653304570856562 +2743 6 5.44707775 0.55292224884033203 0.30572301326265006 +2744 6 5.44707775 0.55292224884033203 0.30572301326265006 +2745 7 6.68483162 0.31516838073730469 0.099331108216574648 +2746 6 5.846201 0.15379905700683594 0.02365414993619197 +2747 6 5.86011 0.13989019393920898 0.019569266360349502 +2748 8 7.558382 0.44161796569824219 0.19502642762745381 +2749 6 5.86011 0.13989019393920898 0.019569266360349502 +2750 8 7.558382 0.44161796569824219 0.19502642762745381 +2751 6 6.354132 0.35413217544555664 0.12540959768580251 +2752 6 6.444844 0.44484376907348633 0.19788597888350523 +2753 8 6.60379028 1.396209716796875 1.9494015732780099 +2754 5 5.163789 0.16378879547119141 0.026826769521903771 +2755 5 4.94988251 0.05011749267578125 0.0025117630721069872 +2756 6 5.5096693 0.49033069610595703 0.24042419154375239 +2757 5 5.64830256 0.64830255508422852 0.42029620292873915 +2758 6 5.50835371 0.49164628982543945 0.24171607429912001 +2759 6 5.96230745 0.037692546844482422 0.0014207280876235018 +2760 6 6.071012 0.071012020111083984 0.0050427070002569963 +2761 5 5.126366 0.12636613845825195 0.015968400948850103 +2762 5 4.961535 0.038465023040771484 0.0014795579975270812 +2763 6 5.63605547 0.36394453048706055 0.13245562127144694 +2764 6 5.87988043 0.12011957168579102 0.014428711501977887 +2765 6 6.52317953 0.52317953109741211 0.273716821759308 +2766 6 6.2780447 0.27804470062255859 0.077308855544288235 +2767 6 5.87988043 0.12011957168579102 0.014428711501977887 +2768 6 5.63605547 0.36394453048706055 0.13245562127144694 +2769 5 4.961535 0.038465023040771484 0.0014795579975270812 +2770 7 6.230737 0.76926279067993164 0.59176524112467632 +2771 6 5.9890213 0.01097869873046875 0.00012053182581439614 +2772 7 7.19588566 0.19588565826416016 0.038371191113583336 +2773 7 6.701176 0.29882383346557617 0.089295683447062402 +2774 8 7.11208963 0.88791036605834961 0.7883848181538724 +2775 8 7.11208963 0.88791036605834961 0.7883848181538724 +2776 8 7.11208963 0.88791036605834961 0.7883848181538724 +2777 6 5.92017651 0.079823493957519531 0.0063717901875861571 +2778 7 6.701176 0.29882383346557617 0.089295683447062402 +2779 5 6.13225031 1.1322503089904785 1.2819907622090341 +2780 5 4.9076457 0.092354297637939453 0.0085293162921971089 +2781 6 5.63751364 0.36248636245727539 0.13139636296750723 +2782 6 5.910954 0.089046001434326172 0.0079291903714420187 +2783 6 5.910954 0.089046001434326172 0.0079291903714420187 +2784 6 5.910954 0.089046001434326172 0.0079291903714420187 +2785 5 5.312507 0.31250715255737305 0.097660720399517231 +2786 6 6.226491 0.22649097442626953 0.051298161496561079 +2787 5 5.312507 0.31250715255737305 0.097660720399517231 +2788 5 5.288817 0.28881692886352539 0.083415218398158686 +2789 5 5.239505 0.23950481414794922 0.057362556000043696 +2790 6 5.910954 0.089046001434326172 0.0079291903714420187 +2791 5 5.335238 0.33523797988891602 0.11238450316000126 +2792 5 5.333069 0.33306884765625 0.11093485727906227 +2793 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2794 5 5.25789976 0.25789976119995117 0.06651228682699184 +2795 8 6.859369 1.1406311988830566 1.3010395318653991 +2796 7 6.90368748 0.096312522888183594 0.0092761020650868886 +2797 5 5.25789976 0.25789976119995117 0.06651228682699184 +2798 7 6.24827337 0.75172662734985352 0.56509292226678554 +2799 7 6.445542 0.5544581413269043 0.30742383048368538 +2800 5 5.335238 0.33523797988891602 0.11238450316000126 +2801 5 5.333069 0.33306884765625 0.11093485727906227 +2802 6 5.92864656 0.071353435516357422 0.0050913127599869767 +2803 8 7.02032 0.97968006134033203 0.95977302258779673 +2804 8 6.859369 1.1406311988830566 1.3010395318653991 +2805 6 6.18910837 0.18910837173461914 0.0357619762601189 +2806 5 5.57462358 0.57462358474731445 0.33019226414785408 +2807 5 5.46513 0.46512985229492188 0.21634577949589584 +2808 6 5.404429 0.59557104110717773 0.35470486500548759 +2809 7 6.74964428 0.25035572052001953 0.062677986797098129 +2810 7 6.45263243 0.54736757278442383 0.29961125973591152 +2811 5 5.919209 0.91920900344848633 0.84494519202075935 +2812 6 6.11701441 0.11701440811157227 0.013692371705701589 +2813 7 6.74964428 0.25035572052001953 0.062677986797098129 +2814 7 6.791037 0.20896291732788086 0.043665500818178771 +2815 5 5.735541 0.73554086685180664 0.54102036680910714 +2816 5 5.957191 0.95719099044799805 0.91621459219481949 +2817 7 6.791037 0.20896291732788086 0.043665500818178771 +2818 4 4.92936659 0.9293665885925293 0.86372225599211561 +2819 6 6.16221571 0.1622157096862793 0.026313936469023247 +2820 5 5.37689543 0.37689542770385742 0.14205016342407362 +2821 5 5.44312143 0.44312143325805664 0.19635660461267435 +2822 5 5.83623457 0.83623456954956055 0.69928825530973882 +2823 6 5.95306063 0.046939373016357422 0.0022033047391687433 +2824 6 5.68058062 0.31941938400268555 0.10202874287665509 +2825 6 5.857073 0.14292716979980469 0.020428175866982201 +2826 6 5.466382 0.53361797332763672 0.28474814145829441 +2827 7 6.83924961 0.16075038909912109 0.02584068759551883 +2828 7 6.83924961 0.16075038909912109 0.02584068759551883 +2829 5 5.557639 0.55763912200927734 0.3109613903952777 +2830 5 5.962908 0.96290779113769531 0.92719141423367546 +2831 5 5.24277925 0.24277925491333008 0.058941766616271707 +2832 6 6.0280633 0.028063297271728516 0.00078754865376140515 +2833 7 6.12555552 0.87444448471069336 0.76465315684095003 +2834 6 6.29048538 0.29048538208007813 0.084381757202208973 +2835 6 5.857073 0.14292716979980469 0.020428175866982201 +2836 6 5.466382 0.53361797332763672 0.28474814145829441 +2837 6 5.772782 0.2272181510925293 0.051628088185907473 +2838 7 6.708939 0.2910609245300293 0.08471646178827541 +2839 7 6.07187033 0.92812967300415039 0.86142468991079113 +2840 6 6.175222 0.17522192001342773 0.030702721253192067 +2841 6 5.65299845 0.34700155258178711 0.12041007749417076 +2842 6 5.60486126 0.39513874053955078 0.15613462427518243 +2843 6 5.718894 0.28110599517822266 0.079020580525138939 +2844 5 6.00124359 1.0012435913085938 1.0024887291365303 +2845 7 6.4817934 0.51820659637451172 0.2685380765260561 +2846 7 6.708939 0.2910609245300293 0.08471646178827541 +2847 5 5.987009 0.98700904846191406 0.97418686174569302 +2848 5 5.18150425 0.18150424957275391 0.032943792612968537 +2849 5 5.016559 0.016559123992919922 0.00027420458741289622 +2850 5 5.75738764 0.75738763809204102 0.5736360343346405 +2851 5 5.504389 0.50438880920410156 0.25440807085033157 +2852 5 5.83271551 0.83271551132202148 0.69341512279629569 +2853 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2854 6 6.241845 0.24184513092041016 0.058489067349910329 +2855 7 6.551627 0.44837284088134766 0.2010382044400103 +2856 7 6.816518 0.18348217010498047 0.033665706746432988 +2857 8 7.0720315 0.92796850204467773 0.86112554078704306 +2858 7 6.551627 0.44837284088134766 0.2010382044400103 +2859 6 5.95013046 0.049869537353515625 0.0024869707558536902 +2860 6 6.036433 0.036433219909667969 0.0013273795129862265 +2861 6 6.241845 0.24184513092041016 0.058489067349910329 +2862 6 6.55694532 0.5569453239440918 0.31018809386318935 +2863 6 6.42587757 0.42587757110595703 0.18137170557110949 +2864 6 6.009859 0.0098590850830078125 9.7201558673987165E-05 +2865 6 5.90828276 0.091717243194580078 0.0084120526992137457 +2866 7 6.816518 0.18348217010498047 0.033665706746432988 +2867 7 6.6592536 0.34074640274047852 0.11610811098057638 +2868 5 5.46810532 0.46810531616210938 0.21912258701922838 +2869 6 6.41052437 0.41052436828613281 0.16853025695672841 +2870 7 6.6592536 0.34074640274047852 0.11610811098057638 +2871 6 6.21243954 0.21243953704833984 0.045130556901312957 +2872 7 7.25975037 0.2597503662109375 0.067470252746716142 +2873 8 7.001045 0.99895477294921875 0.99791063839802518 +2874 7 7.061138 0.061138153076171875 0.0037378737615654245 +2875 6 6.21243954 0.21243953704833984 0.045130556901312957 +2876 5 5.88438272 0.88438272476196289 0.78213280385739381 +2877 5 5.50844669 0.50844669342041016 0.25851804005014856 +2878 6 6.67545128 0.67545127868652344 0.45623442987925955 +2879 6 6.11065865 0.11065864562988281 0.012245335852639982 +2880 5 5.591242 0.59124183654785156 0.34956690928447642 +2881 7 6.55750942 0.44249057769775391 0.19579791135129199 +2882 5 5.81471968 0.81471967697143555 0.66376815204444028 +2883 7 6.662797 0.33720302581787109 0.11370588062072784 +2884 7 7.0597086 0.059708595275878906 0.0035651163498187088 +2885 6 6.686732 0.68673181533813477 0.47160058619761003 +2886 5 5.475714 0.47571420669555664 0.22630400645198279 +2887 5 6.349974 1.3499741554260254 1.8224302203182106 +2888 4 4.76470327 0.76470327377319336 0.58477109691943951 +2889 6 6.016396 0.016396045684814453 0.00026883031409852265 +2890 8 7.01523542 0.98476457595825195 0.96976127006223578 +2891 6 6.067511 0.067511081695556641 0.0045577461517041229 +2892 5 5.22424173 0.22424173355102539 0.050284355065969066 +2893 7 7.046794 0.046793937683105469 0.002189672603890358 +2894 7 6.419709 0.58029079437255859 0.33673740603353508 +2895 5 4.983767 0.016232967376708984 0.00026350922985329817 +2896 5 5.330299 0.33029890060424805 0.10909736374037493 +2897 5 5.22424173 0.22424173355102539 0.050284355065969066 +2898 5 5.48931837 0.4893183708190918 0.23943246802105023 +2899 5 5.496111 0.49611091613769531 0.24612604111098335 +2900 6 6.3282485 0.32824850082397461 0.10774707829318686 +2901 7 6.920011 0.079988956451416016 0.0063982331541865278 +2902 5 5.336474 0.33647394180297852 0.11321471351243417 +2903 6 6.15183258 0.15183258056640625 0.023053132521454245 +2904 7 6.646972 0.3530278205871582 0.12462864210851876 +2905 5 5.2062397 0.20623970031738281 0.042534813987003872 +2906 5 5.24921036 0.24921035766601563 0.062105802368023433 +2907 6 6.15183258 0.15183258056640625 0.023053132521454245 +2908 6 5.733736 0.26626396179199219 0.070896497349167475 +2909 6 6.14865255 0.14865255355834961 0.022097581679417999 +2910 5 5.23128128 0.23128128051757813 0.053491030717850663 +2911 5 5.336474 0.33647394180297852 0.11321471351243417 +2912 7 6.920011 0.079988956451416016 0.0063982331541865278 +2913 5 5.80159569 0.80159568786621094 0.64255564680570387 +2914 6 6.119406 0.11940622329711914 0.014257846162081478 +2915 6 6.119406 0.11940622329711914 0.014257846162081478 +2916 6 6.460953 0.4609532356262207 0.21247788543428214 +2917 7 6.76917076 0.23082923889160156 0.053282137527276063 +2918 6 6.048738 0.048738002777099609 0.0023753929147005692 +2919 5 6.120949 1.1209487915039063 1.2565261931740679 +2920 4 5.38337946 1.3833794593811035 1.9137387286375542 +2921 6 5.487146 0.51285409927368164 0.2630193271418193 +2922 8 7.27026224 0.72973775863647461 0.53251719637978567 +2923 6 6.23462057 0.23462057113647461 0.055046812400405543 +2924 6 6.256033 0.25603294372558594 0.065552868272789055 +2925 5 5.70803 0.70803022384643555 0.50130679788003363 +2926 8 7.411671 0.58832883834838867 0.34613082203236445 +2927 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2928 7 6.97387075 0.026129245758056641 0.00068273748388492095 +2929 6 6.256033 0.25603294372558594 0.065552868272789055 +2930 8 7.243917 0.75608301162719727 0.57166152047125252 +2931 8 7.411671 0.58832883834838867 0.34613082203236445 +2932 6 5.79003048 0.20996952056884766 0.044087199567911739 +2933 6 6.23462057 0.23462057113647461 0.055046812400405543 +2934 5 5.283217 0.28321695327758789 0.080211842623839402 +2935 4 4.40132046 0.40132045745849609 0.16105810957469657 +2936 5 5.679378 0.67937803268432617 0.46155451129402536 +2937 5 5.70803 0.70803022384643555 0.50130679788003363 +2938 8 7.24698639 0.75301361083984375 0.56702949811005965 +2939 8 7.24698639 0.75301361083984375 0.56702949811005965 +2940 6 6.015029 0.015028953552246094 0.00022586944487557048 +2941 5 5.612932 0.61293220520019531 0.37568588817157433 +2942 5 5.347385 0.34738492965698242 0.12067628935278663 +2943 8 7.24698639 0.75301361083984375 0.56702949811005965 +2944 6 6.015029 0.015028953552246094 0.00022586944487557048 +2945 8 7.686467 0.31353282928466797 0.098302835039248748 +2946 6 6.27776 0.27776002883911133 0.077150633620703957 +2947 6 6.27776 0.27776002883911133 0.077150633620703957 +2948 6 5.29857063 0.70142936706542969 0.4920031569818093 +2949 6 5.494495 0.50550508499145508 0.25553539095221822 +2950 5 4.77643776 0.22356224060058594 0.049980075422354275 +2951 5 5.552394 0.55239391326904297 0.30513903541668697 +2952 5 4.928295 0.071704864501953125 0.0051415875932434574 +2953 5 4.77643776 0.22356224060058594 0.049980075422354275 +2954 7 6.866023 0.13397693634033203 0.017949819471141382 +2955 5 6.01920748 1.0192074775695801 1.0387838823337461 +2956 6 5.89857435 0.1014256477355957 0.01028716201858515 +2957 6 6.41994429 0.41994428634643555 0.17635320363501705 +2958 5 5.552394 0.55239391326904297 0.30513903541668697 +2959 7 6.62191057 0.37808942794799805 0.14295161552604441 +2960 7 6.618574 0.38142585754394531 0.14548568480313406 +2961 6 6.2394104 0.239410400390625 0.057317339815199375 +2962 5 5.42872238 0.42872238159179688 0.18380288047774229 +2963 7 6.95440626 0.045593738555908203 0.0020787889955045102 +2964 5 5.79420662 0.79420661926269531 0.63076415408067987 +2965 8 7.7110405 0.28895950317382813 0.083497594474465586 +2966 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2967 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2968 5 5.54127026 0.54127025604248047 0.29297349007629236 +2969 6 6.31686449 0.3168644905090332 0.10040310534554919 +2970 5 5.54127026 0.54127025604248047 0.29297349007629236 +2971 5 5.045367 0.045366764068603516 0.002058143282056335 +2972 6 5.917624 0.082376003265380859 0.006785805913978038 +2973 6 5.95434046 0.045659542083740234 0.0020847937832968455 +2974 6 5.935218 0.064782142639160156 0.0041967260049204924 +2975 6 5.877206 0.12279415130615234 0.015078403594998235 +2976 6 6.488263 0.48826313018798828 0.23840088430097239 +2977 6 5.50998831 0.49001169204711914 0.24011145834288072 +2978 6 5.50998831 0.49001169204711914 0.24011145834288072 +2979 7 6.82792854 0.17207145690917969 0.029608586282847682 +2980 7 6.935555 0.064445018768310547 0.0041531604440478986 +2981 7 6.40632153 0.59367847442626953 0.35245413099710277 +2982 6 5.90127659 0.098723411560058594 0.0097463119900567108 +2983 6 6.29355 0.29355001449584961 0.086171611010513516 +2984 6 5.86181259 0.13818740844726563 0.019095759853371419 +2985 7 6.436311 0.56368923187255859 0.31774555012907513 +2986 7 6.436311 0.56368923187255859 0.31774555012907513 +2987 7 6.436311 0.56368923187255859 0.31774555012907513 +2988 7 6.269313 0.73068714141845703 0.53390369863427622 +2989 6 6.10555744 0.10555744171142578 0.011142373500661051 +2990 7 7.20846272 0.20846271514892578 0.04345670360726217 +2991 7 6.710715 0.28928518295288086 0.083685917076081751 +2992 7 6.5014677 0.49853229522705078 0.24853444938435132 +2993 7 6.436311 0.56368923187255859 0.31774555012907513 +2994 7 6.436311 0.56368923187255859 0.31774555012907513 +2995 6 6.129989 0.1299891471862793 0.016897178386216183 +2996 8 6.42057562 1.5794243812561035 2.4945813761062254 +2997 6 6.217876 0.21787595748901367 0.047469932851754493 +2998 7 6.66316128 0.33683872222900391 0.11346032479286805 +2999 7 6.436311 0.56368923187255859 0.31774555012907513 +3000 7 6.436311 0.56368923187255859 0.31774555012907513 +3001 7 6.5014677 0.49853229522705078 0.24853444938435132 +3002 7 6.710715 0.28928518295288086 0.083685917076081751 +3003 7 6.269313 0.73068714141845703 0.53390369863427622 +3004 6 6.32833624 0.32833623886108398 0.1078046857494428 +3005 6 6.53760242 0.53760242462158203 0.28901636695900379 +3006 6 6.10555744 0.10555744171142578 0.011142373500661051 +3007 7 7.20846272 0.20846271514892578 0.04345670360726217 +3008 7 7.2333436 0.23334360122680664 0.054449236233494958 +3009 6 5.714875 0.28512477874755859 0.081296139455844241 +3010 5 5.49859047 0.49859046936035156 0.24859245613697567 +3011 6 6.578227 0.57822704315185547 0.33434651343213773 +3012 6 6.490192 0.49019193649291992 0.24028813460267884 +3013 6 6.142816 0.14281606674194336 0.02039642891963922 +3014 6 5.70586872 0.29413127899169922 0.086513209281292802 +3015 6 6.18539858 0.18539857864379883 0.034372632963140859 +3016 6 6.142816 0.14281606674194336 0.02039642891963922 +3017 6 6.595993 0.5959930419921875 0.35520770610310137 +3018 8 6.70484924 1.2951507568359375 1.6774154829327017 +3019 6 6.18539858 0.18539857864379883 0.034372632963140859 +3020 6 5.724778 0.27522182464599609 0.075747052761471423 +3021 4 4.71791 0.71790981292724609 0.51539449949723348 +3022 5 4.8001194 0.19988059997558594 0.039952254246600205 +3023 6 5.70586872 0.29413127899169922 0.086513209281292802 +3024 6 6.142816 0.14281606674194336 0.02039642891963922 +3025 7 6.297473 0.70252704620361328 0.49354425064757379 +3026 6 5.74832726 0.25167274475097656 0.063339170450490201 +3027 5 5.63797855 0.63797855377197266 0.40701663507297781 +3028 6 6.04139233 0.041392326354980469 0.0017133246810772107 +3029 8 7.32478333 0.6752166748046875 0.45591755793429911 +3030 8 7.32478333 0.6752166748046875 0.45591755793429911 +3031 6 5.770422 0.22957801818847656 0.052706066435348475 +3032 5 6.11206055 1.112060546875 1.2366786599159241 +3033 6 5.547751 0.45224905014038086 0.20452920335287672 +3034 6 5.473764 0.52623605728149414 0.27692438798317198 +3035 7 6.44003153 0.55996847152709961 0.31356468910439617 +3036 5 5.454294 0.45429420471191406 0.20638322443483048 +3037 6 5.60835171 0.39164829254150391 0.15338838505067542 +3038 6 6.35107 0.35106992721557617 0.12325009379514995 +3039 6 5.549563 0.45043706893920898 0.20289355307454571 +3040 5 5.781478 0.78147792816162109 0.61070775220377982 +3041 6 5.62197447 0.37802553176879883 0.14290330266908313 +3042 6 5.60835171 0.39164829254150391 0.15338838505067542 +3043 6 5.745906 0.25409412384033203 0.064563823770185991 +3044 6 5.62443 0.37556982040405273 0.14105268999833243 +3045 6 6.139705 0.13970518112182617 0.019517537632282256 +3046 6 6.6571207 0.65712070465087891 0.43180762048086763 +3047 5 6.00035667 1.0003566741943359 1.0007134756051528 +3048 6 5.87789154 0.12210845947265625 0.014910475874785334 +3049 5 5.17909861 0.17909860610961914 0.032076310710408507 +3050 4 4.05022049 0.050220489501953125 0.002522097565815784 +3051 5 5.17909861 0.17909860610961914 0.032076310710408507 +3052 7 6.18944025 0.81055974960327148 0.65700710767691817 +3053 5 5.895031 0.89503097534179688 0.80108044682128821 +3054 6 6.16691256 0.16691255569458008 0.027859801248496296 +3055 6 6.18159342 0.18159341812133789 0.032976169504991049 +3056 5 5.956998 0.95699787139892578 0.91584492586207489 +3057 5 6.58366 1.5836601257324219 2.5079793938348303 +3058 5 5.5251646 0.52516460418701172 0.27579786149090069 +3059 6 5.821914 0.1780858039855957 0.031714553581196014 +3060 5 5.609995 0.60999488830566406 0.37209376375903958 +3061 5 5.609995 0.60999488830566406 0.37209376375903958 +3062 8 7.084814 0.91518592834472656 0.83756528344019898 +3063 5 5.609995 0.60999488830566406 0.37209376375903958 +3064 5 5.29221535 0.29221534729003906 0.08538980919183814 +3065 6 6.29819 0.29819011688232422 0.088917345806294179 +3066 5 5.29221535 0.29221534729003906 0.08538980919183814 +3067 4 5.599751 1.5997509956359863 2.5592032480383295 +3068 6 6.56485462 0.56485462188720703 0.31906074386733962 +3069 8 6.26474047 1.7352595329284668 3.0111256466191207 +3070 8 7.084814 0.91518592834472656 0.83756528344019898 +3071 7 6.44469547 0.55530452728271484 0.30836311802067939 +3072 6 6.57061625 0.57061624526977539 0.32560289936577647 +3073 5 6.649056 1.6490559577941895 2.7193855519365115 +3074 5 6.186977 1.1869769096374512 1.4089141840124739 +3075 7 6.56810045 0.4318995475769043 0.18653721919713462 +3076 5 5.397916 0.39791584014892578 0.15833701584142545 +3077 5 5.5251646 0.52516460418701172 0.27579786149090069 +3078 5 6.315502 1.3155021667480469 1.7305459507188061 +3079 5 5.47873354 0.47873353958129883 0.22918580192003901 +3080 6 5.821914 0.1780858039855957 0.031714553581196014 +3081 5 5.609995 0.60999488830566406 0.37209376375903958 +3082 6 5.750258 0.24974203109741211 0.062371082096660757 +3083 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3084 6 6.36839533 0.36839532852172852 0.13571511807663228 +3085 6 5.86258459 0.13741540908813477 0.018882994654859431 +3086 7 6.99761724 0.0023827552795410156 5.6775227221805835E-06 +3087 3 5.453733 2.453732967376709 6.0208054751913096 +3088 6 6.26444435 0.26444435119628906 0.069930814879626269 +3089 7 6.818311 0.18168878555297852 0.033010814795716215 +3090 6 6.36839533 0.36839532852172852 0.13571511807663228 +3091 6 5.36129951 0.63870048522949219 0.40793830983238877 +3092 6 6.025925 0.025925159454345703 0.0006721138927332504 +3093 7 6.56711 0.43288993835449219 0.18739369872855605 +3094 6 5.42497349 0.57502651214599609 0.33065548967078939 +3095 6 5.42497349 0.57502651214599609 0.33065548967078939 +3096 7 6.43372345 0.56627655029296875 0.32066913141170517 +3097 5 5.12878942 0.12878942489624023 0.016586715965104304 +3098 7 6.50207567 0.4979243278503418 0.24792863626521466 +3099 7 6.64832 0.35167980194091797 0.12367868309320329 +3100 7 6.737263 0.26273679733276367 0.069030624672677732 +3101 6 6.020496 0.020495891571044922 0.00042008157129203028 +3102 6 5.56049442 0.43950557708740234 0.19316515229093056 +3103 7 6.56711 0.43288993835449219 0.18739369872855605 +3104 5 5.87965727 0.87965726852416992 0.77379691006740359 +3105 6 5.9182477 0.081752300262451172 0.0066834385982019739 +3106 6 6.025925 0.025925159454345703 0.0006721138927332504 +3107 6 5.901361 0.098639011383056641 0.0097296545666267775 +3108 5 5.305002 0.30500221252441406 0.093026349644787842 +3109 4 5.36367941 1.3636794090270996 1.8596215306044996 +3110 6 6.229444 0.22944402694702148 0.052644561501665521 +3111 7 6.483191 0.51680898666381836 0.26709152869648278 +3112 5 5.716676 0.71667623519897461 0.51362482609897597 +3113 6 5.562755 0.43724489212036133 0.19118309568534642 +3114 6 6.102161 0.10216093063354492 0.010436855747911977 +3115 6 6.102161 0.10216093063354492 0.010436855747911977 +3116 7 6.567311 0.43268918991088867 0.18721993506574108 +3117 7 6.483191 0.51680898666381836 0.26709152869648278 +3118 7 6.90226 0.09774017333984375 0.009553141484502703 +3119 5 4.711436 0.28856420516967773 0.083269300505207866 +3120 6 5.511379 0.48862123489379883 0.23875071118914093 +3121 5 5.716676 0.71667623519897461 0.51362482609897597 +3122 6 6.73026 0.73025989532470703 0.53327951471965207 +3123 5 5.64247 0.64246988296508789 0.41276755051717373 +3124 6 5.562755 0.43724489212036133 0.19118309568534642 +3125 5 5.879442 0.87944221496582031 0.7734186094639881 +3126 7 6.26043272 0.73956727981567383 0.54695976137395519 +3127 5 5.368305 0.36830520629882813 0.13564872498682234 +3128 6 6.38585234 0.38585233688354492 0.14888202587849264 +3129 6 6.175245 0.17524480819702148 0.030710742800010848 +3130 6 6.560212 0.56021213531494141 0.31383763655412622 +3131 5 5.25830126 0.2583012580871582 0.066719539929408711 +3132 6 6.102161 0.10216093063354492 0.010436855747911977 +3133 6 6.73824167 0.73824167251586914 0.54500076703902778 +3134 6 6.15627337 0.15627336502075195 0.02442136461490918 +3135 6 5.55375862 0.44624137878417969 0.19913136813920573 +3136 5 5.8716464 0.87164640426635742 0.75976745407047019 +3137 6 5.95852041 0.041479587554931641 0.0017205561837272398 +3138 6 6.225504 0.22550392150878906 0.050852018615842098 +3139 6 5.814783 0.18521690368652344 0.034305301411222899 +3140 6 5.55375862 0.44624137878417969 0.19913136813920573 +3141 7 5.85702229 1.1429777145385742 1.3063980559318225 +3142 6 5.999185 0.00081491470336914063 6.6408597376721445E-07 +3143 5 5.8716464 0.87164640426635742 0.75976745407047019 +3144 6 5.840115 0.15988492965698242 0.025563190731418217 +3145 6 5.840115 0.15988492965698242 0.025563190731418217 +3146 6 5.840115 0.15988492965698242 0.025563190731418217 +3147 6 5.802998 0.19700193405151367 0.038809762020036942 +3148 6 5.840115 0.15988492965698242 0.025563190731418217 +3149 6 5.802998 0.19700193405151367 0.038809762020036942 +3150 6 6.671808 0.67180776596069336 0.45132567440509774 +3151 6 5.840115 0.15988492965698242 0.025563190731418217 +3152 6 6.17364931 0.17364931106567383 0.030154083233583151 +3153 6 6.669533 0.66953277587890625 0.44827413797611371 +3154 6 6.88131046 0.88131046295166016 0.77670813210806955 +3155 7 6.8698163 0.13018369674682617 0.016947794898669599 +3156 5 5.460132 0.46013212203979492 0.21172156973284473 +3157 7 6.8698163 0.13018369674682617 0.016947794898669599 +3158 7 6.9617424 0.038257598876953125 0.001463643871829845 +3159 6 6.20943069 0.20943069458007813 0.043861215832293965 +3160 6 5.582661 0.41733884811401367 0.17417171414513177 +3161 5 5.460132 0.46013212203979492 0.21172156973284473 +3162 7 6.8698163 0.13018369674682617 0.016947794898669599 +3163 7 6.9617424 0.038257598876953125 0.001463643871829845 +3164 6 5.9588995 0.041100502014160156 0.0016892512658159831 +3165 6 5.76335 0.23664999008178711 0.056003217805709937 +3166 6 6.567506 0.56750583648681641 0.3220628744466012 +3167 7 6.727232 0.27276802062988281 0.074402393078344176 +3168 6 6.314619 0.31461906433105469 0.098985155640548328 +3169 6 6.04131937 0.041319370269775391 0.0017072903594907984 +3170 6 5.893462 0.10653781890869141 0.011350306857821124 +3171 6 6.27120447 0.27120447158813477 0.073551865409399397 +3172 8 7.01964664 0.98035335540771484 0.96109270145916526 +3173 8 7.137502 0.86249780654907227 0.74390246630196089 +3174 8 7.38588428 0.61411571502685547 0.37713811144294596 +3175 6 5.956482 0.04351806640625 0.0018938221037387848 +3176 6 6.27120447 0.27120447158813477 0.073551865409399397 +3177 5 5.549956 0.54995584487915039 0.30245143131674013 +3178 6 6.112071 0.11207103729248047 0.012559917399812548 +3179 4 5.460645 1.4606451988220215 2.1334843968418227 +3180 6 6.260092 0.26009178161621094 0.067647734864294762 +3181 6 6.149753 0.14975309371948242 0.022425989078556086 +3182 5 5.53198862 0.53198862075805664 0.28301189261605941 +3183 6 6.260092 0.26009178161621094 0.067647734864294762 +3184 7 6.457229 0.5427708625793457 0.29460020926512698 +3185 6 6.27707863 0.27707862854003906 0.076772566393628949 +3186 4 4.737908 0.73790788650512695 0.54450804896646332 +3187 7 6.44776058 0.55223941802978516 0.3049683748258758 +3188 8 6.308009 1.691990852355957 2.862833044456238 +3189 5 6.036736 1.036736011505127 1.0748215575515587 +3190 7 6.996594 0.0034060478210449219 1.160116175924486E-05 +3191 6 6.10141 0.101409912109375 0.010283970274031162 +3192 6 6.149753 0.14975309371948242 0.022425989078556086 +3193 5 5.53198862 0.53198862075805664 0.28301189261605941 +3194 5 5.19183826 0.19183826446533203 0.036801919713070674 +3195 6 6.2820797 0.28207969665527344 0.079568955265131081 +3196 7 6.61394024 0.38605976104736328 0.14904213909994724 +3197 6 6.402557 0.4025568962097168 0.1620520546860007 +3198 7 6.61394024 0.38605976104736328 0.14904213909994724 +3199 7 6.70577955 0.2942204475402832 0.08656567175080454 +3200 7 6.81074572 0.1892542839050293 0.035817183976405431 +3201 6 6.402557 0.4025568962097168 0.1620520546860007 +3202 7 6.84895468 0.15104532241821289 0.022814689424421886 +3203 7 6.61394024 0.38605976104736328 0.14904213909994724 +3204 5 5.48264647 0.48264646530151367 0.23294761046804524 +3205 7 6.76702261 0.23297739028930664 0.054278464386015912 +3206 7 6.777936 0.22206401824951172 0.049312428201119474 +3207 6 5.86778831 0.13221168518066406 0.017479929698311025 +3208 5 6.073227 1.0732269287109375 1.1518160405103117 +3209 5 5.365314 0.36531400680541992 0.13345432356823039 +3210 5 5.175463 0.17546319961547852 0.03078733441930126 +3211 6 6.193272 0.19327211380004883 0.037354109972739025 +3212 5 5.83470726 0.83470726013183594 0.69673621011679643 +3213 6 6.04824352 0.048243522644042969 0.0023274374771062867 +3214 6 6.07760859 0.077608585357666016 0.0060230925212181319 +3215 6 6.147291 0.14729118347167969 0.021694692728488008 +3216 5 5.89868069 0.89868068695068359 0.80762697709815257 +3217 5 5.175463 0.17546319961547852 0.03078733441930126 +3218 4 4.90641737 0.9064173698425293 0.82159244835224854 +3219 7 7.13684654 0.13684654235839844 0.018726976155448938 +3220 5 5.536415 0.53641510009765625 0.28774115961277857 +3221 6 6.02255154 0.022551536560058594 0.00050857180121965939 +3222 6 6.53903437 0.53903436660766602 0.29055804838412769 +3223 6 6.193272 0.19327211380004883 0.037354109972739025 +3224 6 6.168674 0.16867399215698242 0.028450915630173768 +3225 7 6.79089451 0.20910549163818359 0.043725106633246469 +3226 6 5.96571875 0.034281253814697266 0.0011752043631076958 +3227 6 5.392663 0.60733699798583984 0.36885822912245203 +3228 6 5.51099634 0.48900365829467773 0.23912457782557794 +3229 7 6.381079 0.61892080307006836 0.38306296047289834 +3230 6 5.647422 0.35257816314697266 0.12431136112809327 +3231 6 6.31671429 0.31671428680419922 0.10030793946589256 +3232 5 5.90930843 0.90930843353271484 0.82684182729371969 +3233 6 6.274285 0.27428483963012695 0.075232173250924461 +3234 6 5.78508043 0.2149195671081543 0.046190420325956438 +3235 6 6.168674 0.16867399215698242 0.028450915630173768 +3236 6 6.614271 0.61427116394042969 0.37732906284873025 +3237 7 6.357264 0.64273595809936523 0.41310951183390898 +3238 5 5.51993227 0.51993227005004883 0.2703295654393969 +3239 7 6.6237483 0.3762516975402832 0.14156533990194475 +3240 6 6.074398 0.074398040771484375 0.0055350684706354514 +3241 7 6.13906431 0.86093568801879883 0.74121025890440251 +3242 6 6.95612049 0.95612049102783203 0.91416639336330263 +3243 7 6.6237483 0.3762516975402832 0.14156533990194475 +3244 7 6.856632 0.14336776733398438 0.020554316710331477 +3245 5 5.51993227 0.51993227005004883 0.2703295654393969 +3246 6 6.32359934 0.32359933853149414 0.10471653189802055 +3247 6 6.28690243 0.28690242767333984 0.082313003004856 +3248 7 6.317185 0.6828150749206543 0.46623642653889874 +3249 7 6.357264 0.64273595809936523 0.41310951183390898 +3250 6 6.52457333 0.52457332611083984 0.27517717446698953 +3251 6 5.6693964 0.33060359954833984 0.10929874003431905 +3252 8 6.88262463 1.117375373840332 1.2485277260648218 +3253 8 6.66403246 1.3359675407409668 1.7848092699134668 +3254 5 5.88028955 0.88028955459594727 0.77490969993073122 +3255 6 6.133121 0.13312101364135742 0.017721204272902469 +3256 6 6.133121 0.13312101364135742 0.017721204272902469 +3257 6 6.133121 0.13312101364135742 0.017721204272902469 +3258 6 6.133121 0.13312101364135742 0.017721204272902469 +3259 6 6.133121 0.13312101364135742 0.017721204272902469 +3260 6 6.133121 0.13312101364135742 0.017721204272902469 +3261 5 6.556014 1.5560140609741211 2.4211797579491758 +3262 7 6.204937 0.79506301879882813 0.63212520386150572 +3263 8 6.869174 1.1308259963989258 1.2787674341316233 +3264 6 5.47448063 0.52551937103271484 0.27617060933062021 +3265 3 4.56640053 1.5664005279541016 2.4536106139748881 +3266 6 6.52271175 0.52271175384521484 0.27322757760794047 +3267 6 5.576181 0.42381906509399414 0.17962259993714724 +3268 6 6.648331 0.6483311653137207 0.42033329991704704 +3269 5 5.18465376 0.18465375900268555 0.034097010713821874 +3270 5 5.78017 0.78016996383666992 0.60866517247291085 +3271 7 6.688666 0.31133413314819336 0.096928942463136991 +3272 7 6.319661 0.68033885955810547 0.46286096382482356 +3273 7 6.793628 0.20637178421020508 0.04258931331810345 +3274 5 6.479464 1.479464054107666 2.1888138873966909 +3275 4 4.61452627 0.61452627182006836 0.37764253875707254 +3276 8 6.66012573 1.339874267578125 1.7952630529180169 +3277 7 6.210549 0.78945112228393555 0.62323307447536536 +3278 5 5.18465376 0.18465375900268555 0.034097010713821874 +3279 6 6.091817 0.091816902160644531 0.0084303435223773704 +3280 5 5.78017 0.78016996383666992 0.60866517247291085 +3281 6 6.48334169 0.48334169387817383 0.2336191930410223 +3282 7 6.691475 0.30852508544921875 0.095187728351447731 +3283 6 5.847695 0.15230512619018555 0.023196851463808343 +3284 6 6.751086 0.75108623504638672 0.56413053247615608 +3285 7 6.57282352 0.42717647552490234 0.18247974124187749 +3286 7 6.57282352 0.42717647552490234 0.18247974124187749 +3287 7 6.57282352 0.42717647552490234 0.18247974124187749 +3288 6 5.847695 0.15230512619018555 0.023196851463808343 +3289 5 5.367988 0.36798810958862305 0.13541524879860845 +3290 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3291 8 7.53098869 0.46901130676269531 0.21997160587125109 +3292 5 5.36597061 0.36597061157226563 0.13393448853457812 +3293 7 6.54328 0.45671987533569336 0.20859304452665128 +3294 6 5.946947 0.053052902221679688 0.0028146104341431055 +3295 5 5.36597061 0.36597061157226563 0.13393448853457812 +3296 5 5.367988 0.36798810958862305 0.13541524879860845 +3297 5 5.321794 0.32179403305053711 0.10355139970693017 +3298 6 6.76998663 0.76998662948608398 0.59287940958733998 +3299 7 6.75744724 0.24255275726318359 0.058831840055972862 +3300 5 4.97801828 0.021981716156005859 0.00048319584516320901 +3301 8 7.53098869 0.46901130676269531 0.21997160587125109 +3302 6 6.59227753 0.59227752685546875 0.35079266881803051 +3303 7 7.045722 0.045722007751464844 0.0020905019928250113 +3304 7 6.83139038 0.168609619140625 0.028429203666746616 +3305 7 6.95902634 0.040973663330078125 0.0016788410866865888 +3306 7 6.83139038 0.168609619140625 0.028429203666746616 +3307 3 4.19923735 1.1992373466491699 1.4381702135981413 +3308 6 5.727543 0.27245712280273438 0.07423288376594428 +3309 7 6.90530252 0.094697475433349609 0.0089676118534498528 +3310 7 6.746764 0.25323581695556641 0.064128378989153134 +3311 7 6.39761066 0.60238933563232422 0.36287291168355296 +3312 7 6.65214872 0.34785127639770508 0.12100051049151261 +3313 7 6.506664 0.49333620071411133 0.24338060693503394 +3314 6 5.32326746 0.67673254013061523 0.45796693087163476 +3315 7 6.48382568 0.51617431640625 0.26643592491745949 +3316 6 6.051728 0.051727771759033203 0.002675762371154633 +3317 6 6.13208 0.132080078125 0.017445147037506104 +3318 7 6.81349325 0.18650674819946289 0.034784767123937854 +3319 5 5.759015 0.75901508331298828 0.57610389669662254 +3320 5 5.567959 0.56795883178710938 0.322577234604978 +3321 6 6.4950285 0.49502849578857422 0.24505321164269844 +3322 7 6.713452 0.28654813766479492 0.082109835199162262 +3323 6 6.312879 0.31287908554077148 0.0978933221688294 +3324 6 6.12515831 0.12515830993652344 0.015664602546166861 +3325 7 6.8268137 0.17318630218505859 0.029993495264534431 +3326 5 5.93371534 0.9337153434753418 0.87182434264127551 +3327 7 6.38604975 0.61395025253295898 0.37693491258528411 +3328 5 6.126393 1.1263928413391113 1.2687608330199964 +3329 6 6.249068 0.24906778335571289 0.062034760705728331 +3330 6 5.88103676 0.11896324157714844 0.014152252846542979 +3331 6 5.950097 0.049902915954589844 0.0024903010207708576 +3332 7 6.466661 0.53333902359008789 0.28445051408402833 +3333 6 6.00232363 0.0023236274719238281 5.3992446282791207E-06 +3334 6 6.16842842 0.16842842102050781 0.028368133007461438 +3335 6 5.741354 0.25864601135253906 0.066897759188577766 +3336 6 5.741354 0.25864601135253906 0.066897759188577766 +3337 6 5.741354 0.25864601135253906 0.066897759188577766 +3338 6 5.58105755 0.41894245147705078 0.17551277764960105 +3339 6 5.836304 0.1636958122253418 0.026796318940114361 +3340 6 6.23716974 0.23716974258422852 0.056249486797469217 +3341 6 5.836304 0.1636958122253418 0.026796318940114361 +3342 5 6.093224 1.093224048614502 1.1951388204690829 +3343 7 5.741354 1.2586460113525391 1.5841897818936559 +3344 6 5.741354 0.25864601135253906 0.066897759188577766 +3345 6 5.95065975 0.049340248107910156 0.0024344600833501318 +3346 6 5.890304 0.1096959114074707 0.012033192979515661 +3347 6 5.88841 0.11158990859985352 0.012452307701323662 +3348 6 5.58105755 0.41894245147705078 0.17551277764960105 +3349 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3350 6 6.129016 0.12901592254638672 0.016645108270495257 +3351 6 6.40267134 0.40267133712768555 0.16214420574419819 +3352 6 6.60754 0.60754013061523438 0.36910501030797604 +3353 6 6.53815842 0.53815841674804688 0.2896144815167645 +3354 7 6.82739 0.17260980606079102 0.029794145148343887 +3355 6 6.443502 0.44350194931030273 0.19669397904203834 +3356 6 6.09565973 0.095659732818603516 0.0091507844829266105 +3357 7 6.59177446 0.40822553634643555 0.16664808852533497 +3358 6 6.60754 0.60754013061523438 0.36910501030797604 +3359 6 6.53815842 0.53815841674804688 0.2896144815167645 +3360 7 6.087488 0.91251182556152344 0.83267783178962418 +3361 6 6.01432467 0.014324665069580078 0.00020519602935564762 +3362 6 6.129016 0.12901592254638672 0.016645108270495257 +3363 6 6.40267134 0.40267133712768555 0.16214420574419819 +3364 6 6.03455544 0.034555435180664063 0.0011940781005250756 +3365 7 6.484774 0.51522588729858398 0.26545771494261317 +3366 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3367 6 6.4610076 0.46100759506225586 0.21252800270508487 +3368 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3369 7 6.464667 0.53533315658569336 0.28658158854000249 +3370 6 6.4610076 0.46100759506225586 0.21252800270508487 +3371 6 6.06122637 0.061226367950439453 0.0037486681324025994 +3372 6 6.33648157 0.33648157119750977 0.11321984775554483 +3373 7 6.817031 0.18296909332275391 0.033477689111350628 +3374 5 5.506074 0.50607395172119141 0.25611084461070277 +3375 6 5.95384169 0.046158313751220703 0.0021305899283561303 +3376 6 5.99021864 0.0097813606262207031 9.5675015700180666E-05 +3377 6 6.000979 0.00097894668579101563 9.5833661362121347E-07 +3378 8 6.860549 1.1394510269165039 1.2983486427410753 +3379 5 5.253192 0.25319194793701172 0.064106162500138453 +3380 7 6.84210443 0.15789556503295898 0.02493100945707738 +3381 7 6.22156429 0.77843570709228516 0.60596215007626597 +3382 7 6.84210443 0.15789556503295898 0.02493100945707738 +3383 6 6.42233229 0.4223322868347168 0.1783645605030415 +3384 6 6.102439 0.10243892669677734 0.010493733702787722 +3385 6 6.48315859 0.48315858840942383 0.23344222155378702 +3386 8 6.860549 1.1394510269165039 1.2983486427410753 +3387 5 5.253192 0.25319194793701172 0.064106162500138453 +3388 6 6.038348 0.038348197937011719 0.0014705842850162298 +3389 7 6.234303 0.76569700241088867 0.58629189950102045 +3390 6 6.80156469 0.80156469345092773 0.64250595778707975 +3391 8 6.80156469 1.1984353065490723 1.4362471839833688 +3392 6 6.67221975 0.67221975326538086 0.45187939668016952 +3393 6 6.48170137 0.48170137405395508 0.23203621376546835 +3394 5 5.35709572 0.35709571838378906 0.12751735208803439 +3395 5 5.31360435 0.31360435485839844 0.098347691386152292 +3396 6 5.980254 0.019745826721191406 0.00038989767290331656 +3397 6 6.015499 0.015499114990234375 0.00024022256548050791 +3398 5 5.31912756 0.31912755966186523 0.10184239933573735 +3399 6 6.43055 0.43055009841918945 0.18537338724877372 +3400 6 5.44203234 0.5579676628112793 0.31132791274308147 +3401 5 5.95098972 0.95098972320556641 0.90438145364259981 +3402 6 5.44203234 0.5579676628112793 0.31132791274308147 +3403 5 5.68300056 0.68300056457519531 0.46648977121003554 +3404 6 5.44582033 0.55417966842651367 0.30711510489732063 +3405 6 6.039283 0.039282798767089844 0.0015431382789756753 +3406 6 6.43055 0.43055009841918945 0.18537338724877372 +3407 5 5.31912756 0.31912755966186523 0.10184239933573735 +3408 6 5.49072456 0.50927543640136719 0.25936147012180299 +3409 3 5.471312 2.4713120460510254 6.1073832289569054 +3410 7 6.274226 0.72577381134033203 0.52674762522747187 +3411 6 6.147217 0.147216796875 0.02167278528213501 +3412 6 5.83013964 0.1698603630065918 0.028852542920731139 +3413 6 5.648756 0.35124397277832031 0.12337232841309742 +3414 7 6.274226 0.72577381134033203 0.52674762522747187 +3415 7 6.80660629 0.19339370727539063 0.037401126013719477 +3416 6 5.683732 0.31626796722412109 0.10002542709207773 +3417 4 5.429571 1.4295711517333984 2.0436736778683553 +3418 6 5.683732 0.31626796722412109 0.10002542709207773 +3419 7 6.80660629 0.19339370727539063 0.037401126013719477 +3420 5 5.32444048 0.32444047927856445 0.10526162459450461 +3421 8 6.66276455 1.3372354507446289 1.7881986507281908 +3422 8 6.97727 1.0227298736572266 1.0459763944709266 +3423 5 5.98238659 0.98238658905029297 0.9650834103458692 +3424 6 6.4767437 0.47674369812011719 0.22728455369724543 +3425 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3426 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3427 6 6.39636 0.39635992050170898 0.15710118658012107 +3428 6 6.4767437 0.47674369812011719 0.22728455369724543 +3429 5 5.98238659 0.98238658905029297 0.9650834103458692 +3430 6 5.99121571 0.0087842941284179688 7.7163823334558401E-05 +3431 6 5.904046 0.095953941345214844 0.0092071588596809306 +3432 5 5.87699652 0.87699651718139648 0.76912289114829946 +3433 7 6.87964058 0.12035942077636719 0.014486390169622609 +3434 6 6.014669 0.014668941497802734 0.00021517784466595913 +3435 6 6.30498 0.30497980117797852 0.093012679126559306 +3436 6 6.01969671 0.019696712493896484 0.00038796048306721787 +3437 5 5.11366749 0.11366748809814453 0.012920297850541829 +3438 5 5.14675951 0.1467595100402832 0.021538353787263986 +3439 5 5.11366749 0.11366748809814453 0.012920297850541829 +3440 5 6.2240715 1.2240715026855469 1.4983510436868528 +3441 5 6.060459 1.0604591369628906 1.1245735811680788 +3442 7 6.419583 0.58041715621948242 0.33688407523391106 +3443 6 5.80606031 0.1939396858215332 0.037612601736555007 +3444 5 5.14675951 0.1467595100402832 0.021538353787263986 +3445 8 7.46482372 0.53517627716064453 0.28641364763552701 +3446 6 5.554438 0.44556188583374023 0.19852539410771897 +3447 6 5.911977 0.088023185729980469 0.0077480812260546372 +3448 7 6.88186169 0.11813831329345703 0.013956661067823006 +3449 8 7.46482372 0.53517627716064453 0.28641364763552701 +3450 7 6.343062 0.65693807601928711 0.43156763572392265 +3451 7 6.343062 0.65693807601928711 0.43156763572392265 +3452 5 5.21926546 0.21926546096801758 0.04807734237351724 +3453 6 6.287645 0.28764486312866211 0.082739567284306759 +3454 5 5.663148 0.66314792633056641 0.43976517219653033 +3455 6 6.118511 0.11851119995117188 0.014044904513866641 +3456 5 5.21130943 0.21130943298339844 0.044651676467765355 +3457 7 6.68455458 0.3154454231262207 0.099505814971280415 +3458 7 6.98832464 0.011675357818603516 0.00013631398019242624 +3459 6 5.715628 0.28437185287475586 0.080867350707421792 +3460 6 6.013219 0.013218879699707031 0.00017473878051532665 +3461 8 6.982139 1.0178608894348145 1.0360407902410316 +3462 6 6.62252235 0.62252235412597656 0.38753408138654777 +3463 7 6.795649 0.20435094833374023 0.041759310084898971 +3464 5 5.5751667 0.57516670227050781 0.33081673540073098 +3465 6 6.67814827 0.67814826965332031 0.45988507563379244 +3466 6 6.62252235 0.62252235412597656 0.38753408138654777 +3467 5 5.500977 0.5009770393371582 0.25097799394302456 +3468 8 6.840452 1.1595478057861328 1.3445511139034352 +3469 6 5.715628 0.28437185287475586 0.080867350707421792 +3470 8 6.982139 1.0178608894348145 1.0360407902410316 +3471 6 6.013219 0.013218879699707031 0.00017473878051532665 +3472 6 6.01919746 0.019197463989257813 0.00036854262361885048 +3473 8 7.03968 0.96031999588012695 0.92221449448720705 +3474 6 5.61084366 0.38915634155273438 0.15144265817070846 +3475 6 5.274944 0.72505617141723633 0.52570645171022079 +3476 8 7.433511 0.56648921966552734 0.32091003599725809 +3477 7 6.277657 0.72234296798706055 0.52177936340035558 +3478 6 5.274944 0.72505617141723633 0.52570645171022079 +3479 7 7.070361 0.070361137390136719 0.0049506896548336954 +3480 8 7.03968 0.96031999588012695 0.92221449448720705 +3481 5 5.62201643 0.62201642990112305 0.38690443906693872 +3482 8 7.16506624 0.83493375778198242 0.69711437988394209 +3483 7 6.988081 0.011919021606445313 0.0001420630760549102 +3484 8 7.433511 0.56648921966552734 0.32091003599725809 +3485 7 5.922049 1.0779509544372559 1.1619782601721909 +3486 6 5.938876 0.061123847961425781 0.0037361247896114946 +3487 6 5.61084366 0.38915634155273438 0.15144265817070846 +3488 6 5.78829956 0.211700439453125 0.044817076064646244 +3489 8 5.86692142 2.1330785751342773 4.5500242076968789 +3490 7 6.277657 0.72234296798706055 0.52177936340035558 +3491 6 5.543023 0.45697689056396484 0.2088278785095099 +3492 7 6.94785261 0.052147388458251953 0.002719350123015829 +3493 7 6.94785261 0.052147388458251953 0.002719350123015829 +3494 6 6.556063 0.55606317520141602 0.30920625481508068 +3495 7 6.27423429 0.72576570510864258 0.52673585871184514 +3496 7 6.67335939 0.32664060592651367 0.10669408544004 +3497 6 6.202401 0.20240116119384766 0.040966230052617902 +3498 6 5.972077 0.027923107147216797 0.00077969991275494976 +3499 7 7.010567 0.010567188262939453 0.00011166546778440534 +3500 7 6.94785261 0.052147388458251953 0.002719350123015829 +3501 6 6.556063 0.55606317520141602 0.30920625481508068 +3502 5 5.308975 0.3089752197265625 0.095465686405077577 +3503 7 6.563628 0.43637180328369141 0.19042035070106067 +3504 7 6.889004 0.11099576950073242 0.012320060847059722 +3505 7 6.65556574 0.34443426132202148 0.11863496037244659 +3506 6 6.23850346 0.23850345611572266 0.056883898579144443 +3507 7 6.84581852 0.15418148040771484 0.023771928900714556 +3508 5 5.308975 0.3089752197265625 0.095465686405077577 +3509 6 5.449322 0.55067777633666992 0.30324601335109946 +3510 6 6.24513245 0.2451324462890625 0.060089916223660111 +3511 7 6.18416262 0.81583738327026367 0.6655906359412711 +3512 6 6.517426 0.5174260139465332 0.26772967990859797 +3513 6 6.079972 0.079971790313720703 0.0063954872459817125 +3514 6 6.457934 0.45793390274047852 0.20970345927912604 +3515 7 6.49270153 0.50729846954345703 0.2573517372011338 +3516 7 6.91192055 0.088079452514648438 0.007757989955280209 +3517 7 6.699911 0.30008888244628906 0.090053337367862696 +3518 5 5.56025028 0.56025028228759766 0.31388037880333286 +3519 7 6.91017151 0.0898284912109375 0.0080691578332334757 +3520 5 5.1707406 0.17074060440063477 0.02915235399109406 +3521 7 6.501419 0.4985809326171875 0.24858294636942446 +3522 5 5.311646 0.3116459846496582 0.097123219748254996 +3523 5 5.1707406 0.17074060440063477 0.02915235399109406 +3524 6 6.429056 0.42905616760253906 0.18408919495777809 +3525 6 6.429056 0.42905616760253906 0.18408919495777809 +3526 6 5.7761054 0.22389459609985352 0.050128790162716541 +3527 6 5.709012 0.29098796844482422 0.084673997779646015 +3528 4 4.35001 0.35000991821289063 0.12250694284739438 +3529 7 6.84373856 0.15626144409179688 0.02441763890965376 +3530 5 5.494679 0.49467897415161133 0.24470728746769055 +3531 5 5.262818 0.2628178596496582 0.069073227350827437 +3532 6 5.934386 0.065614223480224609 0.0043052263229128584 +3533 6 5.83779144 0.16220855712890625 0.026311616005841643 +3534 5 5.494679 0.49467897415161133 0.24470728746769055 +3535 5 5.262818 0.2628178596496582 0.069073227350827437 +3536 6 6.208285 0.20828485488891602 0.043382580776096802 +3537 5 5.483639 0.48363876342773438 0.23390645348990802 +3538 7 6.782946 0.21705389022827148 0.047112391263226527 +3539 6 6.26574755 0.2657475471496582 0.07062175881605981 +3540 6 6.6306076 0.63060760498046875 0.39766595145920292 +3541 6 6.299932 0.29993200302124023 0.089959206436333261 +3542 6 5.786514 0.2134861946105957 0.045576355289313142 +3543 6 6.21291733 0.21291732788085938 0.045333788511925377 +3544 6 6.21291733 0.21291732788085938 0.045333788511925377 +3545 6 6.42701149 0.42701148986816406 0.18233881247942918 +3546 6 5.786514 0.2134861946105957 0.045576355289313142 +3547 6 6.42701149 0.42701148986816406 0.18233881247942918 +3548 6 6.46981049 0.46981048583984375 0.22072189260507002 +3549 6 6.21291733 0.21291732788085938 0.045333788511925377 +3550 6 6.20411634 0.2041163444519043 0.041663482072408442 +3551 6 5.8129344 0.18706560134887695 0.034993539208016955 +3552 6 5.8129344 0.18706560134887695 0.034993539208016955 +3553 6 5.8129344 0.18706560134887695 0.034993539208016955 +3554 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3555 6 6.012086 0.012085914611816406 0.00014606933200411731 +3556 7 6.29893255 0.70106744766235352 0.49149556617180679 +3557 6 5.94413948 0.055860519409179688 0.0031203976286633406 +3558 6 5.8129344 0.18706560134887695 0.034993539208016955 +3559 4 4.42683029 0.42683029174804688 0.18218409795372281 +3560 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3561 5 4.954984 0.045015811920166016 0.0020264233228317607 +3562 6 6.85508347 0.85508346557617188 0.73116773310175631 +3563 5 4.954984 0.045015811920166016 0.0020264233228317607 +3564 6 5.9494977 0.050502300262451172 0.0025504823317987757 +3565 6 5.82309675 0.17690324783325195 0.031294759093952962 +3566 6 6.042418 0.042418003082275391 0.0017992869854879245 +3567 6 6.221795 0.22179508209228516 0.049193058440323512 +3568 7 6.357106 0.64289379119873047 0.41331242676187685 +3569 6 5.82309675 0.17690324783325195 0.031294759093952962 +3570 6 6.221795 0.22179508209228516 0.049193058440323512 +3571 4 4.23669052 0.23669052124023438 0.05602240284497384 +3572 6 6.042418 0.042418003082275391 0.0017992869854879245 +3573 6 6.055631 0.055631160736083984 0.0030948260448440124 +3574 6 5.628368 0.37163209915161133 0.13811041711983307 +3575 7 6.198657 0.80134296417236328 0.6421505462285495 +3576 5 5.53625536 0.5362553596496582 0.28756981075298427 +3577 7 6.521952 0.47804784774780273 0.22852974473630638 +3578 4 4.71375465 0.71375465393066406 0.50944570600768202 +3579 7 6.520844 0.4791560173034668 0.22959048891812017 +3580 5 5.53965044 0.53965044021606445 0.29122259762539215 +3581 7 6.64749527 0.35250473022460938 0.12425958483072463 +3582 6 6.36762857 0.36762857437133789 0.13515076869430231 +3583 6 5.5800705 0.41992950439453125 0.17634078866103664 +3584 7 6.520844 0.4791560173034668 0.22959048891812017 +3585 7 6.106952 0.89304780960083008 0.79753439023284045 +3586 7 6.386778 0.61322212219238281 0.37604137114612968 +3587 6 5.889993 0.11000680923461914 0.012101498077981887 +3588 6 5.889993 0.11000680923461914 0.012101498077981887 +3589 6 5.889993 0.11000680923461914 0.012101498077981887 +3590 7 6.43335152 0.56664848327636719 0.32109050359940738 +3591 5 5.422166 0.42216587066650391 0.1782240223556073 +3592 7 6.39903641 0.60096359252929688 0.36115723954571877 +3593 7 6.386778 0.61322212219238281 0.37604137114612968 +3594 7 6.21197128 0.78802871704101563 0.62098925888130907 +3595 7 6.384263 0.61573696136474609 0.37913200559069082 +3596 7 6.355336 0.64466381072998047 0.41559142886490008 +3597 6 6.1302495 0.1302495002746582 0.016964932321798187 +3598 7 6.663735 0.33626508712768555 0.11307420882098995 +3599 6 5.54587364 0.45412635803222656 0.20623074905961403 +3600 6 6.097955 0.097955226898193359 0.0095952264766765438 +3601 7 6.593367 0.40663290023803711 0.16535031555599744 +3602 6 6.470431 0.47043085098266602 0.22130518555627532 +3603 7 6.99491072 0.0050892829895019531 2.5900801347233937E-05 +3604 6 6.13144875 0.13144874572753906 0.017278772753343219 +3605 5 5.19285 0.19285011291503906 0.037191166051343316 +3606 5 5.31416941 0.31416940689086914 0.098702416226160494 +3607 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3608 6 6.187198 0.18719816207885742 0.035043151885702173 +3609 6 6.187198 0.18719816207885742 0.035043151885702173 +3610 5 5.19285 0.19285011291503906 0.037191166051343316 +3611 6 5.97217226 0.027827739715576172 0.0007743830976778554 +3612 6 5.98245859 0.017541408538818359 0.00030770101352572965 +3613 6 6.187198 0.18719816207885742 0.035043151885702173 +3614 5 5.31416941 0.31416940689086914 0.098702416226160494 +3615 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3616 5 5.17883968 0.17883968353271484 0.031983632406081597 +3617 5 5.800092 0.80009222030639648 0.64014756099481929 +3618 7 5.956605 1.0433950424194336 1.0886732145454516 +3619 6 5.938953 0.061047077178955078 0.0037267456320932979 +3620 7 6.640628 0.35937213897705078 0.1291483342729407 +3621 7 5.956605 1.0433950424194336 1.0886732145454516 +3622 6 5.93752956 0.062470436096191406 0.0039025553860483342 +3623 6 5.938953 0.061047077178955078 0.0037267456320932979 +3624 7 6.782224 0.21777582168579102 0.047426308510921444 +3625 5 5.17883968 0.17883968353271484 0.031983632406081597 +3626 5 5.800092 0.80009222030639648 0.64014756099481929 +3627 5 5.25973225 0.25973224639892578 0.067460839819432294 +3628 6 5.25973225 0.74026775360107422 0.54799634702158073 +3629 6 5.29488373 0.70511627197265625 0.49718895700061694 +3630 6 5.900844 0.099155902862548828 0.0098318930724872189 +3631 6 5.900844 0.099155902862548828 0.0098318930724872189 +3632 6 5.788138 0.21186208724975586 0.044885544013823164 +3633 6 5.900844 0.099155902862548828 0.0098318930724872189 +3634 7 6.45650148 0.54349851608276367 0.29539063698416612 +3635 6 6.089077 0.089076995849609375 0.0079347111895913258 +3636 7 6.637489 0.36251115798950195 0.13141433966688965 +3637 7 6.28777552 0.71222448348999023 0.50726371488258337 +3638 7 6.76056433 0.23943567276000977 0.057329441390038482 +3639 6 6.234292 0.23429203033447266 0.054892755478249455 +3640 6 6.357985 0.35798501968383789 0.1281532743180378 +3641 6 5.833136 0.16686391830444336 0.027843567231911948 +3642 6 5.833136 0.16686391830444336 0.027843567231911948 +3643 6 6.357985 0.35798501968383789 0.1281532743180378 +3644 7 5.92905951 1.0709404945373535 1.1469135428399113 +3645 6 6.23142 0.23142004013061523 0.053555234974055566 +3646 7 5.85718 1.142819881439209 1.3060372814127277 +3647 7 6.691976 0.30802392959594727 0.094878741203729078 +3648 5 6.03854036 1.0385403633117676 1.0785660862277382 +3649 6 6.512135 0.51213502883911133 0.26228228776403739 +3650 4 4.85898256 0.85898256301879883 0.7378510435703447 +3651 6 5.253411 0.74658918380737305 0.55739540937815946 +3652 6 5.90696764 0.093032360076904297 0.0086550200214787765 +3653 6 5.253411 0.74658918380737305 0.55739540937815946 +3654 6 6.11544943 0.11544942855834961 0.01332857055444947 +3655 7 7.151361 0.15136098861694336 0.022910148875098457 +3656 7 6.62748051 0.37251949310302734 0.13877077274173644 +3657 8 6.869378 1.1306219100952148 1.2783059035873521 +3658 7 6.2651124 0.73488759994506836 0.54005978455302284 +3659 8 7.29730844 0.70269155502319336 0.49377542150091358 +3660 8 7.314732 0.68526792526245117 0.46959212939350436 +3661 6 6.14659071 0.1465907096862793 0.021488836166327019 +3662 4 4.47665358 0.4766535758972168 0.22719863141560381 +3663 6 6.59426832 0.5942683219909668 0.35315483852195939 +3664 8 7.26825142 0.73174858093261719 0.53545598569689901 +3665 8 7.29730844 0.70269155502319336 0.49377542150091358 +3666 7 6.25256157 0.74743843078613281 0.55866420781603665 +3667 8 7.314732 0.68526792526245117 0.46959212939350436 +3668 5 5.123465 0.12346506118774414 0.015243621334093405 +3669 7 7.222342 0.22234201431274414 0.04943597132864852 +3670 6 5.395938 0.60406208038330078 0.36489099695700133 +3671 7 6.971204 0.028796195983886719 0.00082922090314241359 +3672 8 7.117149 0.88285112380981445 0.77942610681225233 +3673 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3674 5 5.25115 0.25115013122558594 0.063076388414629037 +3675 6 5.755384 0.24461603164672852 0.059837002938593287 +3676 7 6.98875475 0.011245250701904297 0.00012645566334867908 +3677 6 6.51675129 0.51675128936767578 0.26703189506315539 +3678 5 5.09006453 0.090064525604248047 0.008111618772318252 +3679 7 6.02219152 0.97780847549438477 0.95610941474865285 +3680 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3681 8 6.98234367 1.0176563262939453 1.0356243984460889 +3682 7 6.398295 0.60170507431030273 0.36204899645076694 +3683 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3684 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3685 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3686 5 5.108233 0.10823297500610352 0.011714376878671828 +3687 5 6.19706631 1.1970663070678711 1.4329677435171106 +3688 6 6.434823 0.43482303619384766 0.18907107280483615 +3689 8 6.98234367 1.0176563262939453 1.0356243984460889 +3690 7 6.53908062 0.46091938018798828 0.21244667503287928 +3691 6 6.327841 0.32784080505371094 0.1074795934582653 +3692 7 6.02219152 0.97780847549438477 0.95610941474865285 +3693 7 6.98763037 0.012369632720947266 0.00015300781365112925 +3694 5 5.09006453 0.090064525604248047 0.008111618772318252 +3695 6 6.70085239 0.70085239410400391 0.49119407832131401 +3696 7 6.398295 0.60170507431030273 0.36204899645076694 +3697 6 6.0081 0.0081000328063964844 6.5610531464699307E-05 +3698 6 6.24541 0.24540996551513672 0.060226051174140594 +3699 5 5.108233 0.10823297500610352 0.011714376878671828 +3700 5 5.486109 0.48610877990722656 0.23630174590289243 +3701 5 5.20689249 0.20689249038696289 0.042804502578519532 +3702 6 5.67937136 0.32062864303588867 0.10280272673503532 +3703 6 5.67937136 0.32062864303588867 0.10280272673503532 +3704 6 5.67937136 0.32062864303588867 0.10280272673503532 +3705 6 5.67937136 0.32062864303588867 0.10280272673503532 +3706 6 6.30640936 0.30640935897827148 0.09388669526947524 +3707 6 6.302135 0.30213499069213867 0.091285552600538722 +3708 5 5.15478468 0.1547846794128418 0.023958296980936211 +3709 5 5.181745 0.18174505233764648 0.03303126404921386 +3710 5 4.88772964 0.11227035522460938 0.012604632662259974 +3711 6 5.67937136 0.32062864303588867 0.10280272673503532 +3712 5 5.59040737 0.59040737152099609 0.34858086434633151 +3713 5 5.16065025 0.16065025329589844 0.025808503884036327 +3714 4 5.40058327 1.4005832672119141 1.9616334883939999 +3715 6 5.902174 0.097826004028320313 0.009569927064148942 +3716 5 5.655233 0.65523290634155273 0.42933016155279802 +3717 6 5.775761 0.22423887252807617 0.050283071952662795 +3718 5 5.20689249 0.20689249038696289 0.042804502578519532 +3719 5 5.38708639 0.38708639144897461 0.1498358744449888 +3720 7 6.94894171 0.051058292388916016 0.0026069492216720391 +3721 5 5.05060768 0.050607681274414063 0.0025611374039726797 +3722 5 4.98821163 0.011788368225097656 0.00013896562541049207 +3723 7 6.490961 0.50903892517089844 0.25912062733914354 +3724 6 6.30076361 0.30076360702514648 0.090458747310776744 +3725 6 6.23129034 0.23129034042358398 0.053495221573257368 +3726 7 6.634293 0.3657069206237793 0.13374155179212721 +3727 7 6.490961 0.50903892517089844 0.25912062733914354 +3728 7 6.83458853 0.16541147232055664 0.027360955175254276 +3729 5 5.10726643 0.10726642608642578 0.011506086165354645 +3730 6 5.732659 0.26734113693237305 0.071471283496293836 +3731 6 6.02678251 0.026782512664794922 0.00071730298463990039 +3732 5 5.10726643 0.10726642608642578 0.011506086165354645 +3733 6 6.601304 0.60130405426025391 0.36156656566981837 +3734 5 5.412523 0.41252279281616211 0.17017505459284621 +3735 6 6.212704 0.21270418167114258 0.045243068900390426 +3736 4 5.974627 1.9746270179748535 3.8991518601162625 +3737 5 5.66151667 0.66151666641235352 0.437604299941313 +3738 6 5.62562132 0.37437868118286133 0.14015939692421853 +3739 7 6.81513262 0.18486738204956055 0.034175948945858181 +3740 7 6.81513262 0.18486738204956055 0.034175948945858181 +3741 7 6.81513262 0.18486738204956055 0.034175948945858181 +3742 7 6.81513262 0.18486738204956055 0.034175948945858181 +3743 7 6.81513262 0.18486738204956055 0.034175948945858181 +3744 7 6.81513262 0.18486738204956055 0.034175948945858181 +3745 7 6.81513262 0.18486738204956055 0.034175948945858181 +3746 5 6.29884863 1.2988486289978027 1.6870077610494718 +3747 6 5.658112 0.3418879508972168 0.11688737096869772 +3748 5 5.37572527 0.37572526931762695 0.14116947800380331 +3749 6 6.59885168 0.59885168075561523 0.35862333554382531 +3750 7 6.81513262 0.18486738204956055 0.034175948945858181 +3751 5 5.352506 0.35250616073608398 0.12426059335689388 +3752 5 5.411717 0.41171693801879883 0.16951083705157544 +3753 5 5.31119251 0.31119251251220703 0.09684077984366013 +3754 8 7.681114 0.31888580322265625 0.10168815549695864 +3755 6 6.103313 0.10331296920776367 0.010673569606524325 +3756 5 5.352506 0.35250616073608398 0.12426059335689388 +3757 5 5.411717 0.41171693801879883 0.16951083705157544 +3758 5 5.31119251 0.31119251251220703 0.09684077984366013 +3759 6 6.103313 0.10331296920776367 0.010673569606524325 +3760 6 6.155523 0.15552282333374023 0.024187348577697776 +3761 7 6.45952559 0.54047441482543945 0.29211259308090121 +3762 5 5.419359 0.41935920715332031 0.17586214462426142 +3763 5 6.03585434 1.0358543395996094 1.0729942128673429 +3764 8 7.681114 0.31888580322265625 0.10168815549695864 +3765 5 5.24535036 0.24535036087036133 0.060196799579216531 +3766 5 5.24535036 0.24535036087036133 0.060196799579216531 +3767 5 5.24535036 0.24535036087036133 0.060196799579216531 +3768 6 6.072592 0.072591781616210938 0.0052695667582156602 +3769 5 5.24535036 0.24535036087036133 0.060196799579216531 +3770 4 5.85129166 1.8512916564941406 3.4272807974048192 +3771 6 5.96826839 0.031731605529785156 0.0010068947894978919 +3772 6 6.072592 0.072591781616210938 0.0052695667582156602 +3773 5 5.567017 0.5670170783996582 0.32150836719688414 +3774 5 5.42932558 0.42932558059692383 0.18432045415488574 +3775 6 6.555324 0.55532407760620117 0.30838483116917814 +3776 5 6.549726 1.5497260093688965 2.401650704114445 +3777 6 6.555324 0.55532407760620117 0.30838483116917814 +3778 7 6.80112171 0.19887828826904297 0.039552573544824554 +3779 7 6.94228554 0.057714462280273438 0.0033309591563011054 +3780 5 5.42932558 0.42932558059692383 0.18432045415488574 +3781 6 5.932433 0.067566871643066406 0.0045652821436306112 +3782 6 6.227729 0.22772884368896484 0.051860426247912983 +3783 5 5.270208 0.27020788192749023 0.073012299455740504 +3784 6 5.81837845 0.18162155151367188 0.032986387974233367 +3785 7 6.71812534 0.28187465667724609 0.079453322076915356 +3786 5 5.407538 0.40753793716430664 0.16608717022813835 +3787 5 5.24300337 0.24300336837768555 0.059050637042901144 +3788 5 5.36877 0.36877012252807617 0.13599140326937231 +3789 6 5.35680771 0.64319229125976563 0.41369632353598718 +3790 5 5.270208 0.27020788192749023 0.073012299455740504 +3791 5 5.30159664 0.30159664154052734 0.090960534188525344 +3792 6 6.023325 0.023324966430664063 0.00054405405899160542 +3793 6 5.47658157 0.52341842651367188 0.27396684921404812 +3794 5 5.64809132 0.64809131622314453 0.42002235416384792 +3795 6 5.81837845 0.18162155151367188 0.032986387974233367 +3796 6 6.42824173 0.42824172973632813 0.1833909790875623 +3797 5 4.83761024 0.16238975524902344 0.026370432609837735 +3798 5 5.660219 0.66021919250488281 0.43588938215179951 +3799 5 5.69797659 0.69797658920288086 0.4871713190752871 +3800 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3801 6 5.97499 0.025010108947753906 0.00062550554957852 +3802 5 5.660219 0.66021919250488281 0.43588938215179951 +3803 6 6.044695 0.044694900512695313 0.0019976341318397317 +3804 5 5.09940243 0.099402427673339844 0.0098808426273535588 +3805 6 5.97499 0.025010108947753906 0.00062550554957852 +3806 5 4.83761024 0.16238975524902344 0.026370432609837735 +3807 5 5.63379145 0.63379144668579102 0.40169159789206788 +3808 6 5.517979 0.48202085494995117 0.23234410460668187 +3809 6 6.044695 0.044694900512695313 0.0019976341318397317 +3810 3 5.139502 2.1395020484924316 4.5774690155033113 +3811 5 5.86564541 0.86564540863037109 0.74934197348284215 +3812 5 5.660219 0.66021919250488281 0.43588938215179951 +3813 5 5.69797659 0.69797658920288086 0.4871713190752871 +3814 5 5.528592 0.52859210968017578 0.27940961841613898 +3815 7 6.71345472 0.2865452766418457 0.082108195565751885 +3816 5 5.46293068 0.46293067932128906 0.21430481385687017 +3817 6 6.24235964 0.24235963821411133 0.058738194235274932 +3818 6 6.441372 0.44137191772460938 0.19480916975589935 +3819 6 6.441372 0.44137191772460938 0.19480916975589935 +3820 5 5.83183 0.83183002471923828 0.69194119002440857 +3821 6 6.02943945 0.029439449310302734 0.00086668117569388414 +3822 6 6.34592 0.34592008590698242 0.1196607058338941 +3823 5 5.289135 0.28913497924804688 0.083599036224768497 +3824 7 6.34184074 0.65815925598144531 0.43317360623404966 +3825 6 6.542632 0.54263210296630859 0.29444959916963853 +3826 6 6.441372 0.44137191772460938 0.19480916975589935 +3827 5 5.547714 0.5477142333984375 0.29999088146723807 +3828 6 6.24235964 0.24235963821411133 0.058738194235274932 +3829 7 6.90751839 0.092481613159179688 0.0085528487725241575 +3830 7 6.662573 0.33742713928222656 0.11385707432418712 +3831 5 5.104566 0.10456609725952148 0.010934068696087706 +3832 5 5.104566 0.10456609725952148 0.010934068696087706 +3833 6 6.39407635 0.39407634735107422 0.1552961675415645 +3834 5 5.11497831 0.11497831344604492 0.013220012562896954 +3835 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3836 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3837 6 6.07877064 0.078770637512207031 0.0062048133340795175 +3838 5 5.11497831 0.11497831344604492 0.013220012562896954 +3839 5 5.00733042 0.0073304176330566406 5.3735022675027722E-05 +3840 6 6.208704 0.20870399475097656 0.043557357425015653 +3841 6 6.314494 0.31449413299560547 0.09890655968865758 +3842 6 6.040485 0.040484905242919922 0.001639027552528205 +3843 7 6.94303846 0.056961536407470703 0.0032446166298996104 +3844 6 6.208704 0.20870399475097656 0.043557357425015653 +3845 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3846 6 6.27509069 0.27509069442749023 0.075674890160598807 +3847 5 4.95929766 0.040702342987060547 0.0016566807246363169 +3848 6 5.67952156 0.32047843933105469 0.1027064300760685 +3849 5 5.12245846 0.12245845794677734 0.014996073922702635 +3850 6 6.27509069 0.27509069442749023 0.075674890160598807 +3851 7 7.210589 0.21058893203735352 0.044347698296633098 +3852 6 6.20994473 0.20994472503662109 0.044076787570702436 +3853 7 7.079849 0.079848766326904297 0.0063758254839285655 +3854 6 6.775606 0.77560615539550781 0.60156490828740061 +3855 6 6.39135551 0.39135551452636719 0.1531591387501976 +3856 6 6.20994473 0.20994472503662109 0.044076787570702436 +3857 6 6.280806 0.28080606460571289 0.078852045919347802 +3858 6 6.61661 0.61661005020141602 0.38020795400939278 +3859 5 5.38074636 0.38074636459350586 0.14496779415117089 +3860 5 5.38074636 0.38074636459350586 0.14496779415117089 +3861 6 5.924023 0.075976848602294922 0.0057724815235360438 +3862 6 5.903024 0.096975803375244141 0.0094043064402740129 +3863 6 5.903024 0.096975803375244141 0.0094043064402740129 +3864 7 6.547844 0.45215606689453125 0.20444510882953182 +3865 6 6.91423035 0.9142303466796875 0.83581712679006159 +3866 6 6.122323 0.12232303619384766 0.014962925183681364 +3867 5 5.38074636 0.38074636459350586 0.14496779415117089 +3868 6 4.826844 1.1731557846069336 1.37629449495671 +3869 6 5.924023 0.075976848602294922 0.0057724815235360438 +3870 6 5.874355 0.12564516067504883 0.015786706401058836 +3871 6 5.903024 0.096975803375244141 0.0094043064402740129 +3872 4 4.866891 0.86689090728759766 0.75149984513791424 +3873 5 5.13102341 0.13102340698242188 0.017167133177281357 +3874 5 5.2737484 0.27374839782714844 0.074938185312930727 +3875 7 5.953763 1.0462369918823242 1.0946118431829746 +3876 5 5.43160534 0.43160533905029297 0.18628316869671835 +3877 5 5.96922541 0.96922540664672852 0.93939788888951625 +3878 5 5.27135849 0.27135848999023438 0.073635430089780129 +3879 4 3.85325718 0.14674282073974609 0.021533455438657256 +3880 6 5.7290225 0.27097749710083008 0.073428803935030373 +3881 6 5.7290225 0.27097749710083008 0.073428803935030373 +3882 5 5.93204927 0.93204927444458008 0.86871584999266815 +3883 6 6.63882732 0.63882732391357422 0.40810034977857867 +3884 6 5.7290225 0.27097749710083008 0.073428803935030373 +3885 6 6.157238 0.15723800659179688 0.024723790716961958 +3886 6 6.63882732 0.63882732391357422 0.40810034977857867 +3887 6 6.157238 0.15723800659179688 0.024723790716961958 +3888 6 5.7290225 0.27097749710083008 0.073428803935030373 +3889 6 6.10551071 0.10551071166992188 0.011132510277093388 +3890 6 6.19827271 0.198272705078125 0.039312065578997135 +3891 5 5.93204927 0.93204927444458008 0.86871584999266815 +3892 5 5.79291964 0.79291963577270508 0.62872154879391928 +3893 5 4.78047943 0.21952056884765625 0.048189280147198588 +3894 6 6.143109 0.14310884475708008 0.020480141447706046 +3895 6 6.40889549 0.40889549255371094 0.16719552383074188 +3896 6 5.741901 0.25809907913208008 0.066615134648827734 +3897 6 5.997462 0.0025382041931152344 6.442480525947758E-06 +3898 7 6.17240953 0.8275904655456543 0.68490597866207281 +3899 5 5.79291964 0.79291963577270508 0.62872154879391928 +3900 5 4.78047943 0.21952056884765625 0.048189280147198588 +3901 4 4.35597134 0.35597133636474609 0.1267155923133032 +3902 6 5.915008 0.084991931915283203 0.0072236284906921355 +3903 6 6.23150444 0.23150444030761719 0.05359430588214309 +3904 7 7.02997 0.029970169067382813 0.00089821103392750956 +3905 7 6.960154 0.039845943450927734 0.0015876992094945308 +3906 7 6.960154 0.039845943450927734 0.0015876992094945308 +3907 7 6.6903367 0.30966329574584961 0.095891356732181521 +3908 7 6.296472 0.70352792739868164 0.49495154462988467 +3909 7 6.296472 0.70352792739868164 0.49495154462988467 +3910 6 6.341356 0.34135580062866211 0.11652378262283491 +3911 6 5.71503448 0.28496551513671875 0.081205344817135483 +3912 7 6.960154 0.039845943450927734 0.0015876992094945308 +3913 6 5.858565 0.14143514633178711 0.020003900617894033 +3914 7 6.296472 0.70352792739868164 0.49495154462988467 +3915 7 6.872329 0.1276707649230957 0.016299824216048364 +3916 6 6.341356 0.34135580062866211 0.11652378262283491 +3917 5 5.19301939 0.19301939010620117 0.037256484956969871 +3918 7 6.62571 0.37428998947143555 0.14009299621852733 +3919 6 6.55708551 0.55708551406860352 0.31034426998508025 +3920 6 5.821983 0.17801713943481445 0.031690101932554171 +3921 5 5.52710438 0.52710437774658203 0.27783902503961144 +3922 7 6.6903367 0.30966329574584961 0.095891356732181521 +3923 5 5.21137667 0.21137666702270508 0.044680095361627536 +3924 5 5.21137667 0.21137666702270508 0.044680095361627536 +3925 5 5.424182 0.42418193817138672 0.17993031667083415 +3926 6 5.80389357 0.1961064338684082 0.03845773340458436 +3927 5 5.96175432 0.96175432205200195 0.92497137598570589 +3928 5 5.141706 0.14170598983764648 0.020080587555867169 +3929 5 5.141706 0.14170598983764648 0.020080587555867169 +3930 6 6.28535843 0.28535842895507813 0.08142943297571037 +3931 6 6.524964 0.5249638557434082 0.2755870498369859 +3932 8 6.46785831 1.5321416854858398 2.3474581444033902 +3933 4 5.35140467 1.3514046669006348 1.8262945737208156 +3934 6 5.92051172 0.079488277435302734 0.0063183862496316578 +3935 5 5.30682325 0.3068232536315918 0.094140508969076109 +3936 6 5.78626442 0.21373558044433594 0.045682898347877199 +3937 5 5.39522934 0.39522933959960938 0.15620623088034336 +3938 6 5.758783 0.24121713638305664 0.058185706884842148 +3939 6 6.261217 0.26121711730957031 0.068234382375521818 +3940 5 5.339176 0.33917617797851563 0.11504047970811371 +3941 5 5.24542665 0.24542665481567383 0.060234242894011913 +3942 6 5.8923316 0.10766839981079102 0.011592484317816343 +3943 6 5.798487 0.20151281356811523 0.040607414032137967 +3944 6 6.21212339 0.21212339401245117 0.044996334287361606 +3945 6 6.261217 0.26121711730957031 0.068234382375521818 +3946 6 6.54871845 0.54871845245361328 0.30109194006308826 +3947 7 6.61867762 0.38132238388061523 0.14540676044839529 +3948 5 5.584513 0.58451318740844727 0.3416556662543826 +3949 5 5.339176 0.33917617797851563 0.11504047970811371 +3950 5 5.24542665 0.24542665481567383 0.060234242894011913 +3951 5 5.350792 0.35079193115234375 0.12305497896159068 +3952 6 6.112464 0.11246395111083984 0.012648140299461375 +3953 7 6.392265 0.60773515701293945 0.36934202106954217 +3954 5 5.350792 0.35079193115234375 0.12305497896159068 +3955 6 6.112464 0.11246395111083984 0.012648140299461375 +3956 5 5.47008228 0.47008228302001953 0.22097735280931374 +3957 5 5.946553 0.94655323028564453 0.89596301776418841 +3958 6 5.66506624 0.33493375778198242 0.11218062210195967 +3959 6 5.66506624 0.33493375778198242 0.11218062210195967 +3960 6 5.3763175 0.62368249893188477 0.38897985947392044 +3961 5 5.18560743 0.1856074333190918 0.034450119303301108 +3962 7 7.151062 0.15106201171875 0.022819731384515762 +3963 7 6.32142735 0.67857265472412109 0.46046084773934126 +3964 5 5.18217325 0.18217325210571289 0.033187093782771626 +3965 4 5.70695639 1.7069563865661621 2.9137001056390091 +3966 6 5.66506624 0.33493375778198242 0.11218062210195967 +3967 4 5.26928663 1.2692866325378418 1.6110885555392542 +3968 6 5.35175 0.64825010299682617 0.42022819603539574 +3969 6 6.229696 0.22969579696655273 0.052760159144099816 +3970 7 6.19331 0.80669021606445313 0.65074910469411407 +3971 6 6.229696 0.22969579696655273 0.052760159144099816 +3972 6 5.54704952 0.45295047760009766 0.20516413515815657 +3973 4 5.26928663 1.2692866325378418 1.6110885555392542 +3974 6 5.35175 0.64825010299682617 0.42022819603539574 +3975 7 6.709179 0.29082107543945313 0.084576897919760086 +3976 7 7.10497856 0.10497856140136719 0.011020498353900621 +3977 6 6.63561869 0.63561868667602539 0.40401111485175534 +3978 7 6.04282236 0.95717763900756836 0.91618903261610285 +3979 6 6.217364 0.21736383438110352 0.047247036496855799 +3980 5 6.02859735 1.028597354888916 1.0580125184844746 +3981 7 6.28068542 0.7193145751953125 0.51741345808841288 +3982 7 6.709179 0.29082107543945313 0.084576897919760086 +3983 6 5.925124 0.074875831604003906 0.0056063901583911502 +3984 7 7.10497856 0.10497856140136719 0.011020498353900621 +3985 6 6.122168 0.12216806411743164 0.014925035890200888 +3986 6 6.122168 0.12216806411743164 0.014925035890200888 +3987 6 5.71410275 0.28589725494384766 0.081737240384427423 +3988 6 5.879811 0.12018918991088867 0.014445441371435663 +3989 6 6.122168 0.12216806411743164 0.014925035890200888 +3990 6 5.71410275 0.28589725494384766 0.081737240384427423 +3991 5 5.62714958 0.62714958190917969 0.39331659808885888 +3992 7 6.14805937 0.85194063186645508 0.72580284022501473 +3993 7 6.485149 0.51485109329223633 0.26507164826421103 +3994 7 6.485149 0.51485109329223633 0.26507164826421103 +3995 5 5.104947 0.10494709014892578 0.011013891730726755 +3996 7 6.485149 0.51485109329223633 0.26507164826421103 +3997 7 6.735825 0.2641749382019043 0.069788397973979954 +3998 6 5.934058 0.065941810607910156 0.0043483223862494924 +3999 6 5.934058 0.065941810607910156 0.0043483223862494924 +4000 6 5.934058 0.065941810607910156 0.0043483223862494924 +4001 5 5.335033 0.33503293991088867 0.11224707082533314 +4002 6 5.60893059 0.39106941223144531 0.15293528518304811 +4003 6 6.45015 0.4501500129699707 0.20263503417686479 +4004 7 6.7571907 0.24280929565429688 0.058956354056135751 +4005 6 6.45015 0.4501500129699707 0.20263503417686479 +4006 6 6.23378134 0.23378133773803711 0.054653713874586174 +4007 5 5.335033 0.33503293991088867 0.11224707082533314 +4008 6 5.60893059 0.39106941223144531 0.15293528518304811 +4009 6 6.07953453 0.079534530639648438 0.0063257415640691761 +4010 6 6.55589867 0.55589866638183594 0.30902332728510373 +4011 7 6.735825 0.2641749382019043 0.069788397973979954 +4012 6 5.934058 0.065941810607910156 0.0043483223862494924 +4013 6 5.441547 0.55845308303833008 0.31186984595501599 +4014 6 6.24294 0.24293994903564453 0.059019818837441562 +4015 5 4.75735331 0.24264669418334961 0.058877418198107989 +4016 5 5.21397972 0.21397972106933594 0.04578732102891081 +4017 6 6.14959431 0.14959430694580078 0.02237845667059446 +4018 6 6.24294 0.24293994903564453 0.059019818837441562 +4019 5 4.75735331 0.24264669418334961 0.058877418198107989 +4020 4 4.47513533 0.47513532638549805 0.22575357837945376 +4021 5 5.643344 0.64334392547607422 0.41389140644696454 +4022 5 5.21397972 0.21397972106933594 0.04578732102891081 +4023 6 6.39005136 0.39005136489868164 0.1521400672593245 +4024 6 6.409837 0.40983676910400391 0.16796617730960861 +4025 6 6.7355876 0.73558759689331055 0.54108911270327553 +4026 6 6.39005136 0.39005136489868164 0.1521400672593245 +4027 5 5.18595076 0.18595075607299805 0.03457768368411962 +4028 6 6.40132236 0.40132236480712891 0.16105964049438626 +4029 6 6.29972172 0.29972171783447266 0.089833108141647244 +4030 5 5.77380943 0.77380943298339844 0.5987810385740886 +4031 5 5.164775 0.16477489471435547 0.02715076592812693 +4032 5 5.318856 0.31885576248168945 0.10166899726777956 +4033 6 6.01368 0.013679981231689453 0.00018714188649937569 +4034 5 5.318856 0.31885576248168945 0.10166899726777956 +4035 6 6.11864853 0.11864852905273438 0.014077473446377553 +4036 5 5.10300541 0.10300540924072266 0.010610114332848752 +4037 5 5.15395546 0.15395545959472656 0.023702283539023483 +4038 5 5.164775 0.16477489471435547 0.02715076592812693 +4039 4 5.06407642 1.0640764236450195 1.1322586353571751 +4040 5 5.49962044 0.49962043762207031 0.24962058168966905 +4041 5 5.2111783 0.21117830276489258 0.044596275558660636 +4042 7 6.820859 0.17914104461669922 0.03209151386636222 +4043 7 6.820859 0.17914104461669922 0.03209151386636222 +4044 7 6.820859 0.17914104461669922 0.03209151386636222 +4045 7 6.820859 0.17914104461669922 0.03209151386636222 +4046 7 6.707407 0.29259300231933594 0.085610665006242925 +4047 6 6.44117928 0.44117927551269531 0.19463915314190672 +4048 6 6.44117928 0.44117927551269531 0.19463915314190672 +4049 6 6.41707468 0.41707468032836914 0.17395128897101131 +4050 7 6.820859 0.17914104461669922 0.03209151386636222 +4051 6 6.331319 0.33131885528564453 0.10977218386778986 +4052 5 5.2111783 0.21117830276489258 0.044596275558660636 +4053 7 6.820859 0.17914104461669922 0.03209151386636222 +4054 7 6.707407 0.29259300231933594 0.085610665006242925 +4055 6 6.331319 0.33131885528564453 0.10977218386778986 +4056 5 5.77324438 0.77324438095092773 0.59790687267218345 +4057 6 6.295132 0.29513216018676758 0.087102991976507838 +4058 6 6.44117928 0.44117927551269531 0.19463915314190672 +4059 6 6.41707468 0.41707468032836914 0.17395128897101131 +4060 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4061 5 5.04540539 0.045405387878417969 0.0020616492483895854 +4062 6 6.082549 0.082549095153808594 0.0068143531107125455 +4063 5 5.371587 0.37158679962158203 0.13807674965300976 +4064 5 6.223232 1.2232317924499512 1.4962960180603204 +4065 8 7.24055958 0.75944042205810547 0.57674975465579337 +4066 6 6.2537303 0.25373029708862305 0.064379063660680913 +4067 5 5.3426137 0.34261369705200195 0.11738414540764097 +4068 6 6.2537303 0.25373029708862305 0.064379063660680913 +4069 6 6.004174 0.0041742324829101563 1.7424216821382288E-05 +4070 5 5.571743 0.57174301147460938 0.32689007117005531 +4071 6 5.818604 0.1813960075378418 0.032904511550668758 +4072 7 6.515072 0.48492813110351563 0.23515529233554844 +4073 5 4.62328625 0.37671375274658203 0.14191325150841294 +4074 4 4.78012753 0.78012752532958984 0.60859895577686984 +4075 6 5.69815826 0.30184173583984375 0.091108433494810015 +4076 5 5.492518 0.49251794815063477 0.24257392925051136 +4077 6 5.968249 0.031751155853271484 0.001008135898018736 +4078 6 5.7745986 0.22540140151977539 0.050805791807079004 +4079 6 5.88386059 0.11613941192626953 0.013488363002579717 +4080 6 5.865267 0.13473320007324219 0.018153035201976309 +4081 6 5.678007 0.32199287414550781 0.10367941100048483 +4082 6 6.05232334 0.052323341369628906 0.0027377320520827197 +4083 5 5.29502439 0.29502439498901367 0.087039393638633555 +4084 8 6.477889 1.5221109390258789 2.3168217107022429 +4085 6 5.937694 0.062305927276611328 0.0038820285737983795 +4086 6 5.76667166 0.23332834243774414 0.054442115384745193 +4087 6 5.690505 0.30949497222900391 0.095787137835031899 +4088 6 6.06473732 0.064737319946289063 0.0041909205938281957 +4089 6 5.55112648 0.44887351989746094 0.20148743686513626 +4090 6 5.529048 0.47095203399658203 0.22179581832551776 +4091 6 5.82618856 0.17381143569946289 0.030210415179908523 +4092 6 5.28551674 0.71448326110839844 0.51048633040409186 +4093 6 5.351238 0.64876222610473633 0.42089242602037302 +4094 7 7.07337046 0.073370456695556641 0.0053832239157145523 +4095 6 5.351238 0.64876222610473633 0.42089242602037302 +4096 5 4.990592 0.0094079971313476563 8.8510410023445729E-05 +4097 6 5.82618856 0.17381143569946289 0.030210415179908523 +4098 5 6.222002 1.2220020294189453 1.4932889599040209 +4099 6 5.28551674 0.71448326110839844 0.51048633040409186 +4100 6 6.014094 0.014093875885009766 0.0001986373374620598 +4101 5 5.22823429 0.22823429107666016 0.052090891623265634 +4102 5 5.22823429 0.22823429107666016 0.052090891623265634 +4103 7 6.371319 0.62868118286132813 0.39524002968391869 +4104 7 6.347439 0.65256118774414063 0.42583610375004355 +4105 7 6.239276 0.76072406768798828 0.57870110715975898 +4106 5 5.64672947 0.64672946929931641 0.41825900646017544 +4107 6 6.32752848 0.32752847671508789 0.10727490305930587 +4108 6 6.51016045 0.51016044616699219 0.26026368083330453 +4109 6 6.0367527 0.036752700805664063 0.0013507610165106598 +4110 5 5.393194 0.39319419860839844 0.15460167781930068 +4111 6 6.05556536 0.055565357208251953 0.0030875089216806373 +4112 6 6.33822441 0.33822441101074219 0.11439575220356346 +4113 6 6.354503 0.35450315475463867 0.1256724867309913 +4114 6 6.023537 0.023537158966064453 0.00055399785219378828 +4115 6 6.138492 0.13849210739135742 0.019180063809699277 +4116 6 5.4326086 0.56739139556884766 0.32193299576556456 +4117 6 5.4326086 0.56739139556884766 0.32193299576556456 +4118 8 6.47382832 1.5261716842651367 2.3292000098526842 +4119 7 6.62782335 0.3721766471862793 0.13851545671082022 +4120 5 5.605265 0.60526514053344727 0.36634589034497367 +4121 6 5.586563 0.4134368896484375 0.17093006172217429 +4122 6 5.498919 0.50108098983764648 0.25108215837667558 +4123 6 6.05965 0.059649944305419922 0.0035581158556396986 +4124 7 6.57852364 0.42147636413574219 0.17764232552508474 +4125 5 5.755329 0.75532913208007813 0.57052209776884411 +4126 5 5.755329 0.75532913208007813 0.57052209776884411 +4127 5 5.55892754 0.55892753601074219 0.3123999905110395 +4128 5 5.2543 0.25430011749267578 0.064668549756788707 +4129 7 6.86728239 0.13271760940551758 0.017613963846315528 +4130 6 6.040545 0.040544986724853516 0.0016438959485185478 +4131 5 5.36841869 0.36841869354248047 0.13573233375154814 +4132 5 5.36841869 0.36841869354248047 0.13573233375154814 +4133 6 6.171894 0.17189407348632813 0.029547572499723174 +4134 6 6.451214 0.45121383666992188 0.20359392640239093 +4135 5 5.92140675 0.92140674591064453 0.84899039140964305 +4136 6 6.35042429 0.35042428970336914 0.12279718281411078 +4137 5 5.36841869 0.36841869354248047 0.13573233375154814 +4138 6 5.7370224 0.26297760009765625 0.069157218153122813 +4139 7 6.313542 0.68645811080932617 0.47122473789590913 +4140 6 5.932523 0.067477226257324219 0.004553176063382125 +4141 6 5.932523 0.067477226257324219 0.004553176063382125 +4142 6 6.059661 0.059660911560058594 0.0035594243681771331 +4143 6 5.80167866 0.19832134246826172 0.039331354878413549 +4144 6 5.932523 0.067477226257324219 0.004553176063382125 +4145 6 5.81908035 0.18091964721679688 0.032731918749050237 +4146 7 6.51515 0.48484992980957031 0.23507945443634526 +4147 7 6.313542 0.68645811080932617 0.47122473789590913 +4148 6 5.77318668 0.22681331634521484 0.051444280471514503 +4149 7 6.57568932 0.42431068420410156 0.1800395567297528 +4150 5 4.879766 0.12023401260375977 0.014456217786801062 +4151 6 6.349858 0.34985780715942383 0.12240048523040059 +4152 6 5.77318668 0.22681331634521484 0.051444280471514503 +4153 5 5.27344227 0.27344226837158203 0.074770674132196291 +4154 5 5.305294 0.30529403686523438 0.093204448945471086 +4155 5 5.27344227 0.27344226837158203 0.074770674132196291 +4156 5 5.31374645 0.31374645233154297 0.098436836350629164 +4157 7 7.011022 0.011022090911865234 0.00012148648806942219 +4158 7 7.011022 0.011022090911865234 0.00012148648806942219 +4159 7 7.011022 0.011022090911865234 0.00012148648806942219 +4160 7 7.011022 0.011022090911865234 0.00012148648806942219 +4161 7 7.011022 0.011022090911865234 0.00012148648806942219 +4162 7 7.011022 0.011022090911865234 0.00012148648806942219 +4163 5 5.25803375 0.25803375244140625 0.066581417398992926 +4164 5 5.40265226 0.40265226364135742 0.1621288454155092 +4165 7 6.126724 0.8732762336730957 0.76261138029826725 +4166 7 6.56084442 0.43915557861328125 0.19285762222716585 +4167 8 7.22911358 0.77088642120361328 0.59426587439611467 +4168 6 6.27897644 0.2789764404296875 0.077827854314818978 +4169 7 6.44153166 0.55846834182739258 0.3118868888234374 +4170 7 7.011022 0.011022090911865234 0.00012148648806942219 +4171 5 6.280464 1.2804641723632813 1.6395884967059828 +4172 6 6.044114 0.044114112854003906 0.0019460549528957927 +4173 5 5.45170975 0.45170974731445313 0.20404169581888709 +4174 6 5.229326 0.77067422866821289 0.59393876673334489 +4175 7 6.15340567 0.84659433364868164 0.71672196576605529 +4176 6 5.96163368 0.038366317749023438 0.0014719743376190308 +4177 6 6.29175138 0.29175138473510742 0.085118870494852672 +4178 7 6.215218 0.78478193283081055 0.61588268209766284 +4179 5 5.26952362 0.26952362060546875 0.072642982064280659 +4180 6 5.36615658 0.63384342193603516 0.40175748353158269 +4181 6 6.041504 0.04150390625 0.0017225742340087891 +4182 6 5.03049135 0.96950864791870117 0.93994701838914807 +4183 7 6.80200052 0.19799947738647461 0.03920379304531707 +4184 7 6.710221 0.2897791862487793 0.08397197678300472 +4185 5 5.26952362 0.26952362060546875 0.072642982064280659 +4186 5 5.451507 0.4515070915222168 0.20385865369485145 +4187 6 6.58606768 0.58606767654418945 0.34347532148990467 +4188 6 6.19589853 0.19589853286743164 0.038376235179612195 +4189 5 5.30196142 0.30196142196655273 0.091180700356062516 +4190 6 5.93951225 0.060487747192382813 0.0036587675604096148 +4191 5 5.727819 0.72781896591186523 0.52972044714101685 +4192 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4193 6 6.08673 0.086730003356933594 0.0075220934822937124 +4194 6 5.97759628 0.022403717041015625 0.00050192653725389391 +4195 8 7.182058 0.81794214248657227 0.66902934845552409 +4196 6 6.189203 0.18920278549194336 0.035797694037910333 +4197 5 5.442303 0.44230318069458008 0.19563210365254236 +4198 5 5.18446827 0.18446826934814453 0.034028542396299599 +4199 6 6.08673 0.086730003356933594 0.0075220934822937124 +4200 6 6.10387468 0.10387468338012695 0.010789949847321623 +4201 6 6.356462 0.35646200180053711 0.12706515872764612 +4202 6 6.76204062 0.76204061508178711 0.58070589903422842 +4203 5 5.26486969 0.26486968994140625 0.070155952649656683 +4204 6 6.04439 0.044390201568603516 0.00197048999530125 +4205 6 6.356462 0.35646200180053711 0.12706515872764612 +4206 6 5.38576365 0.61423635482788086 0.37728629959224236 +4207 7 6.47487068 0.52512931823730469 0.27576080087237642 +4208 6 6.331671 0.33167123794555664 0.11000581008033805 +4209 6 6.61370659 0.61370658874511719 0.3766357770691684 +4210 6 5.75262737 0.24737262725830078 0.061193216716674215 +4211 6 5.57837772 0.42162227630615234 0.17776534387758147 +4212 4 4.7228303 0.72283029556274414 0.52248363618332405 +4213 4 4.765456 0.76545619964599609 0.58592319357649103 +4214 5 5.2678895 0.26788949966430664 0.071764784030392548 +4215 5 5.2678895 0.26788949966430664 0.071764784030392548 +4216 5 5.2678895 0.26788949966430664 0.071764784030392548 +4217 4 4.667052 0.66705179214477539 0.44495809340355663 +4218 6 6.367011 0.36701107025146484 0.13469712568712566 +4219 5 5.2678895 0.26788949966430664 0.071764784030392548 +4220 6 6.083678 0.083677768707275391 0.0070019689758282766 +4221 6 6.6260004 0.62600040435791016 0.39187650625626702 +4222 4 4.667052 0.66705179214477539 0.44495809340355663 +4223 4 4.13989544 0.13989543914794922 0.019570733894397563 +4224 7 6.72387 0.27613019943237305 0.076247887038562112 +4225 5 5.3994503 0.39945030212402344 0.1595605438669736 +4226 7 6.18949127 0.81050872802734375 0.65692439820850268 +4227 7 6.161215 0.83878517150878906 0.70356056394302868 +4228 6 5.363188 0.63681221008300781 0.40552979091080488 +4229 6 5.806095 0.19390487670898438 0.037599101211526431 +4230 6 5.62430429 0.37569570541381836 0.14114726306638659 +4231 6 6.18936443 0.18936443328857422 0.035858888594702876 +4232 6 6.160059 0.16005897521972656 0.025618875548389042 +4233 6 5.78126955 0.21873044967651367 0.04784300961568988 +4234 6 5.681346 0.31865406036376953 0.10154041018631688 +4235 5 5.34582424 0.34582424163818359 0.1195944061046248 +4236 5 5.34582424 0.34582424163818359 0.1195944061046248 +4237 5 5.86143255 0.86143255233764648 0.74206604222695205 +4238 5 5.34582424 0.34582424163818359 0.1195944061046248 +4239 7 7.03946257 0.039462566375732422 0.0015572941449590871 +4240 6 5.66003942 0.33996057510375977 0.11557319262487908 +4241 6 6.583823 0.58382320404052734 0.34084953357614722 +4242 7 6.668239 0.33176088333129883 0.11006528370876367 +4243 6 6.365007 0.36500692367553711 0.13323005433107937 +4244 5 5.33011436 0.33011436462402344 0.1089754937311227 +4245 5 5.42551851 0.42551851272583008 0.18106600467240241 +4246 6 6.26176071 0.26176071166992188 0.068518670173943974 +4247 6 5.43350172 0.5664982795715332 0.32092030075750699 +4248 6 6.15749 0.15748977661132813 0.024803029737086035 +4249 6 5.72360849 0.27639150619506836 0.076392264696778511 +4250 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4251 6 5.6752367 0.32476329803466797 0.10547119975035457 +4252 6 5.93525648 0.064743518829345703 0.0041917232304058416 +4253 4 5.28086 1.2808599472045898 1.6406022043529447 +4254 5 5.8399086 0.83990859985351563 0.70544645610789303 +4255 5 5.131142 0.13114213943481445 0.017198260735540316 +4256 5 5.131142 0.13114213943481445 0.017198260735540316 +4257 5 5.808099 0.80809879302978516 0.65302365929619555 +4258 6 5.882378 0.11762189865112305 0.013834911042295062 +4259 6 6.31239748 0.31239748001098633 0.097592185517214602 +4260 6 6.113717 0.11371707916259766 0.012931574093272502 +4261 7 6.4979763 0.50202369689941406 0.25202779224855476 +4262 6 6.524527 0.52452707290649414 0.27512865021185462 +4263 6 5.814336 0.18566417694091797 0.034471186599148496 +4264 6 5.97327471 0.026725292205810547 0.00071424124348595797 +4265 6 6.113717 0.11371707916259766 0.012931574093272502 +4266 7 6.4979763 0.50202369689941406 0.25202779224855476 +4267 7 6.4979763 0.50202369689941406 0.25202779224855476 +4268 6 6.506674 0.50667381286621094 0.25671835264438414 +4269 5 5.28652143 0.28652143478393555 0.082094532590645031 +4270 6 5.9458127 0.054187297821044922 0.0029362632451466197 +4271 5 5.14096165 0.14096164703369141 0.019870185934451001 +4272 6 5.72031927 0.27968072891235352 0.078221310124945376 +4273 6 5.72031927 0.27968072891235352 0.078221310124945376 +4274 6 5.72031927 0.27968072891235352 0.078221310124945376 +4275 6 5.72031927 0.27968072891235352 0.078221310124945376 +4276 7 7.23196 0.23195981979370117 0.053805357998726322 +4277 5 5.92046642 0.92046642303466797 0.84725843593423633 +4278 4 4.848876 0.84887599945068359 0.72059046244339697 +4279 6 5.82808638 0.17191362380981445 0.029554294051422403 +4280 6 5.72031927 0.27968072891235352 0.078221310124945376 +4281 5 5.164684 0.16468381881713867 0.027120760180196157 +4282 5 5.164684 0.16468381881713867 0.027120760180196157 +4283 6 6.057775 0.057775020599365234 0.0033379530052570772 +4284 6 6.057775 0.057775020599365234 0.0033379530052570772 +4285 6 6.057775 0.057775020599365234 0.0033379530052570772 +4286 6 6.057775 0.057775020599365234 0.0033379530052570772 +4287 5 5.42380047 0.42380046844482422 0.17960683705405245 +4288 6 5.74335527 0.25664472579956055 0.065866515280731619 +4289 6 5.78677559 0.21322441101074219 0.045464649450877914 +4290 5 5.164684 0.16468381881713867 0.027120760180196157 +4291 5 5.40787935 0.40787935256958008 0.16636556625257981 +4292 6 6.09707 0.097070217132568359 0.0094226270541639678 +4293 5 5.40787935 0.40787935256958008 0.16636556625257981 +4294 5 5.84869528 0.84869527816772461 0.72028367518419145 +4295 5 5.40787935 0.40787935256958008 0.16636556625257981 +4296 6 6.09707 0.097070217132568359 0.0094226270541639678 +4297 6 6.33077431 0.33077430725097656 0.10941164233736345 +4298 6 6.20831966 0.20831966400146484 0.043397082409683208 +4299 6 5.624217 0.37578296661376953 0.14121283799704543 +4300 5 5.38560057 0.38560056686401367 0.14868779716584868 +4301 5 5.13298368 0.13298368453979492 0.017684660353779691 +4302 6 5.647275 0.35272502899169922 0.12441494607719505 +4303 6 6.427828 0.42782783508300781 0.18303665647181333 +4304 6 6.19889164 0.19889163970947266 0.03955788434632268 +4305 6 5.85083961 0.14916038513183594 0.022248820492677623 +4306 6 5.92332029 0.076679706573486328 0.0058797774001959624 +4307 7 6.613306 0.38669395446777344 0.14953221442192444 +4308 6 6.286537 0.28653717041015625 0.082103550026658922 +4309 6 6.396994 0.39699411392211914 0.15760432648880851 +4310 6 5.73678637 0.2632136344909668 0.069281417381944266 +4311 5 6.19426775 1.194267749786377 1.4262754581798163 +4312 6 6.427828 0.42782783508300781 0.18303665647181333 +4313 6 6.24178934 0.24178934097290039 0.058462085408109488 +4314 7 6.47377 0.5262298583984375 0.27691786387003958 +4315 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4316 5 4.89074039 0.10925960540771484 0.011937661373849551 +4317 7 6.58141041 0.41858959197998047 0.17521724651396653 +4318 7 6.47377 0.5262298583984375 0.27691786387003958 +4319 7 6.99393034 0.0060696601867675781 3.6840774782831431E-05 +4320 5 5.485202 0.48520183563232422 0.23542082130097697 +4321 6 5.74379873 0.25620126724243164 0.065639089336627876 +4322 7 6.329284 0.6707158088684082 0.44985969626600308 +4323 6 5.644962 0.35503816604614258 0.12605209934940831 +4324 6 5.88721132 0.11278867721557617 0.012721285708039431 +4325 5 5.29375 0.29374980926513672 0.086288950443304202 +4326 5 5.314613 0.31461286544799805 0.098981255105400123 +4327 5 5.29375 0.29374980926513672 0.086288950443304202 +4328 5 5.825475 0.82547521591186523 0.68140933208474053 +4329 5 5.48227 0.4822697639465332 0.23258412521704486 +4330 5 5.29375 0.29374980926513672 0.086288950443304202 +4331 5 5.314613 0.31461286544799805 0.098981255105400123 +4332 8 7.65718842 0.34281158447265625 0.11751978244865313 +4333 8 7.65718842 0.34281158447265625 0.11751978244865313 +4334 8 7.65718842 0.34281158447265625 0.11751978244865313 +4335 8 7.65718842 0.34281158447265625 0.11751978244865313 +4336 8 7.65718842 0.34281158447265625 0.11751978244865313 +4337 8 7.65718842 0.34281158447265625 0.11751978244865313 +4338 8 7.65718842 0.34281158447265625 0.11751978244865313 +4339 8 6.11387157 1.8861284255981445 3.5574804378493354 +4340 8 7.65718842 0.34281158447265625 0.11751978244865313 +4341 6 5.607523 0.39247703552246094 0.15403822341249906 +4342 6 6.406812 0.40681219100952148 0.16549615875396739 +4343 6 5.87327576 0.1267242431640625 0.016059033805504441 +4344 6 5.649031 0.35096883773803711 0.12317912506318862 +4345 6 6.168647 0.16864681243896484 0.028441747345823387 +4346 6 5.649031 0.35096883773803711 0.12317912506318862 +4347 7 6.41372442 0.58627557754516602 0.34371905282591797 +4348 6 5.38195562 0.61804437637329102 0.3819788511666502 +4349 5 5.33784 0.33784008026123047 0.11413591983091464 +4350 6 5.955332 0.044668197631835938 0.0019952478796767537 +4351 6 6.74399137 0.74399137496948242 0.553523166028981 +4352 5 5.696282 0.69628190994262695 0.48480849811335247 +4353 6 5.936355 0.063644886016845703 0.0040506715160972817 +4354 6 6.277787 0.27778720855712891 0.077165733237961831 +4355 6 6.74399137 0.74399137496948242 0.553523166028981 +4356 5 5.74487638 0.74487638473510742 0.55484082853604377 +4357 6 6.078775 0.078774929046630859 0.0062054894463017263 +4358 5 5.325482 0.32548189163208008 0.10593846178039712 +4359 6 5.146009 0.85399103164672852 0.72930068213304367 +4360 5 5.696282 0.69628190994262695 0.48480849811335247 +4361 6 6.354132 0.35413217544555664 0.12540959768580251 +4362 6 6.827937 0.82793712615966797 0.68547988487352995 +4363 5 5.352111 0.35211086273193359 0.12398205965382658 +4364 6 5.949367 0.050632953643798828 0.002563695994695081 +4365 5 5.644166 0.64416599273681641 0.41494982619860821 +4366 6 6.581495 0.58149480819702148 0.3381362119600908 +4367 5 5.352111 0.35211086273193359 0.12398205965382658 +4368 6 6.24809647 0.24809646606445313 0.061551856473670341 +4369 6 5.949367 0.050632953643798828 0.002563695994695081 +4370 5 5.27093458 0.2709345817565918 0.073405547591619325 +4371 5 5.46512651 0.46512651443481445 0.21634267443027966 +4372 6 6.02718067 0.027180671691894531 0.00073878891362255672 +4373 6 6.348733 0.34873294830322266 0.12161466923225817 +4374 5 5.14362526 0.14362525939941406 0.020628215137548978 +4375 6 5.86484051 0.13515949249267578 0.018268088410877681 +4376 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4377 6 6.304982 0.30498218536376953 0.093014133389260678 +4378 5 5.02749825 0.027498245239257813 0.00075615349123836495 +4379 5 5.00741434 0.0074143409729003906 5.4972452062429511E-05 +4380 6 6.19491 0.19491004943847656 0.037989927372109378 +4381 6 6.542717 0.54271697998046875 0.29454172035912052 +4382 6 6.16713762 0.16713762283325195 0.027934984966350385 +4383 6 6.304982 0.30498218536376953 0.093014133389260678 +4384 5 5.121737 0.12173700332641602 0.014819897978895824 +4385 5 5.121737 0.12173700332641602 0.014819897978895824 +4386 6 6.16324 0.16323995590209961 0.026647283202919425 +4387 6 6.20248032 0.20248031616210938 0.040998278433107771 +4388 6 5.73686457 0.26313543319702148 0.069240256203784156 +4389 4 5.578374 1.578373908996582 2.4912641966011506 +4390 5 5.47506475 0.47506475448608398 0.22568652095492325 +4391 5 5.31349 0.31348991394042969 0.098275926142378012 +4392 5 5.47506475 0.47506475448608398 0.22568652095492325 +4393 6 5.894842 0.10515785217285156 0.011058173873607302 +4394 6 5.92819 0.071809768676757813 0.0051566428774094675 +4395 5 5.36295462 0.36295461654663086 0.13173605367251184 +4396 5 5.33769274 0.3376927375793457 0.11403638501383284 +4397 5 5.33769274 0.3376927375793457 0.11403638501383284 +4398 5 5.33769274 0.3376927375793457 0.11403638501383284 +4399 5 5.36295462 0.36295461654663086 0.13173605367251184 +4400 5 5.33769274 0.3376927375793457 0.11403638501383284 +4401 6 6.450748 0.45074796676635742 0.20317372954400525 +4402 6 6.30272961 0.30272960662841797 0.091645214729396685 +4403 5 5.53840542 0.53840541839599609 0.28988039455816761 +4404 5 5.15546846 0.15546846389770508 0.024170443266712027 +4405 5 5.15546846 0.15546846389770508 0.024170443266712027 +4406 7 6.80952168 0.19047832489013672 0.036281992252952477 +4407 6 6.221997 0.22199678421020508 0.049282572199672359 +4408 5 5.15546846 0.15546846389770508 0.024170443266712027 +4409 7 6.80952168 0.19047832489013672 0.036281992252952477 +4410 5 5.41353559 0.41353559494018555 0.17101168828253321 +4411 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4412 7 6.2168684 0.78313159942626953 0.61329510201994708 +4413 7 7.09965563 0.099655628204345703 0.0099312442328027828 +4414 7 6.2168684 0.78313159942626953 0.61329510201994708 +4415 5 5.189993 0.18999290466308594 0.036097303822316462 +4416 5 5.41353559 0.41353559494018555 0.17101168828253321 +4417 6 5.888463 0.11153697967529297 0.012440497835086717 +4418 6 5.8170557 0.18294429779052734 0.033468616094069148 +4419 6 5.8170557 0.18294429779052734 0.033468616094069148 +4420 6 5.8170557 0.18294429779052734 0.033468616094069148 +4421 6 5.8170557 0.18294429779052734 0.033468616094069148 +4422 6 5.888463 0.11153697967529297 0.012440497835086717 +4423 6 5.888463 0.11153697967529297 0.012440497835086717 +4424 6 5.8170557 0.18294429779052734 0.033468616094069148 +4425 6 5.86058664 0.13941335678100586 0.019436084048948032 +4426 6 5.796547 0.20345306396484375 0.041393149236682802 +4427 5 5.34068727 0.34068727493286133 0.11606781930117904 +4428 6 6.74285555 0.74285554885864258 0.55183436647007511 +4429 6 5.862502 0.13749790191650391 0.018905673031440529 +4430 5 5.16007662 0.16007661819458008 0.025624523692613366 +4431 6 6.27077341 0.27077341079711914 0.073318239994705436 +4432 6 6.455703 0.45570278167724609 0.20766502522837982 +4433 5 4.893008 0.10699176788330078 0.011447238394794113 +4434 6 6.0497036 0.049703598022460938 0.0024704476563783828 +4435 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4436 6 6.199245 0.19924497604370117 0.039698560478655054 +4437 6 6.002095 0.0020952224731445313 4.389957211969886E-06 +4438 5 5.572666 0.57266616821289063 0.32794654021563474 +4439 5 5.11934042 0.11934041976928711 0.014242135790709654 +4440 5 5.327377 0.3273768424987793 0.10717559700447055 +4441 6 6.27455759 0.27455759048461914 0.075381870492719827 +4442 5 5.327377 0.3273768424987793 0.10717559700447055 +4443 5 5.11934042 0.11934041976928711 0.014242135790709654 +4444 6 6.25034428 0.25034427642822266 0.062672256740370358 +4445 6 6.25034428 0.25034427642822266 0.062672256740370358 +4446 6 6.77828074 0.77828073501586914 0.60572090249684152 +4447 6 6.490504 0.49050378799438477 0.24059396603684036 +4448 5 5.858529 0.85852909088134766 0.7370721998895533 +4449 6 5.77393 0.22606992721557617 0.051107611991255908 +4450 6 6.023334 0.023334026336669922 0.00054447678508040553 +4451 5 5.18813133 0.18813133239746094 0.035393398229643935 +4452 5 5.270654 0.27065420150756836 0.073253696793699419 +4453 6 6.490504 0.49050378799438477 0.24059396603684036 +4454 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4455 5 5.1645813 0.164581298828125 0.027087003923952579 +4456 5 5.1645813 0.164581298828125 0.027087003923952579 +4457 5 5.1645813 0.164581298828125 0.027087003923952579 +4458 7 6.53274345 0.46725654602050781 0.21832867979901494 +4459 5 5.746503 0.74650287628173828 0.55726654429690825 +4460 6 6.0491004 0.049100399017333984 0.0024108491836614121 +4461 6 6.026326 0.026326179504394531 0.00069306772729760269 +4462 6 6.782111 0.78211116790771484 0.61169787896596972 +4463 6 6.42424965 0.42424964904785156 0.17998776471722522 +4464 5 5.338199 0.33819913864135742 0.1143786573777561 +4465 5 5.338199 0.33819913864135742 0.1143786573777561 +4466 5 6.011748 1.0117478370666504 1.0236336858090453 +4467 5 5.807701 0.80770111083984375 0.65238108445191756 +4468 6 5.99583435 0.0041656494140625 1.735263504087925E-05 +4469 6 6.384077 0.38407707214355469 0.14751519734636531 +4470 6 6.19453 0.19453001022338867 0.037841924877511701 +4471 6 6.190817 0.19081687927246094 0.036411081415280933 +4472 5 5.8315444 0.83154439926147461 0.69146608794312669 +4473 5 4.95860672 0.041393280029296875 0.0017134036315837875 +4474 6 5.73346043 0.26653957366943359 0.071043344331883418 +4475 6 6.585525 0.5855250358581543 0.34283956761669288 +4476 6 6.383046 0.38304615020751953 0.14672435318880162 +4477 5 5.17250633 0.17250633239746094 0.029758434717223281 +4478 5 5.17250633 0.17250633239746094 0.029758434717223281 +4479 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4480 5 5.586254 0.58625411987304688 0.34369389306812081 +4481 5 5.17250633 0.17250633239746094 0.029758434717223281 +4482 6 6.64182758 0.64182758331298828 0.41194264670139091 +4483 4 4.56951332 0.56951332092285156 0.32434542270857492 +4484 5 4.91907072 0.080929279327392578 0.0065495482524511317 +4485 6 6.236687 0.23668718338012695 0.056020822776417845 +4486 6 5.62462854 0.37537145614624023 0.14090373008934876 +4487 6 6.149464 0.14946413040161133 0.022339526276709876 +4488 6 6.630827 0.63082695007324219 0.39794264093870879 +4489 6 6.630827 0.63082695007324219 0.39794264093870879 +4490 6 6.326199 0.32619905471801758 0.10640582329892823 +4491 6 6.552785 0.55278491973876953 0.30557116749059787 +4492 6 6.35064173 0.35064172744750977 0.12294962102737372 +4493 6 5.660044 0.33995580673217773 0.11556995053092578 +4494 6 5.86190653 0.13809347152709961 0.019069806878405871 +4495 6 5.608976 0.39102411270141602 0.15289985671392969 +4496 6 5.86190653 0.13809347152709961 0.019069806878405871 +4497 5 5.241128 0.24112796783447266 0.05814269687198248 +4498 5 5.83831549 0.83831548690795898 0.70277285558972835 +4499 6 6.148644 0.14864397048950195 0.022095029962883928 +4500 6 5.876842 0.12315797805786133 0.015167887559300652 +4501 6 5.262086 0.73791408538818359 0.54451719741427951 +4502 6 6.126531 0.12653112411499023 0.016010125369803063 +4503 7 6.66133976 0.33866024017333984 0.11469075827426423 +4504 5 5.45453358 0.45453357696533203 0.20660077258889942 +4505 5 5.415779 0.41577911376953125 0.17287227144697681 +4506 6 6.422779 0.42277908325195313 0.17874215323536191 +4507 5 6.107822 1.1078219413757324 1.2272694537934967 +4508 4 6.141981 2.1419811248779297 4.588083139333321 +4509 5 5.24329853 0.24329853057861328 0.059194174981712422 +4510 6 6.556102 0.55610179901123047 0.30924921086352697 +4511 6 6.363239 0.36323881149291992 0.13194243417478901 +4512 6 6.363239 0.36323881149291992 0.13194243417478901 +4513 6 6.322394 0.32239389419555664 0.10393782301457577 +4514 5 5.04009628 0.040096282958984375 0.0016077119071269408 +4515 6 6.475341 0.47534084320068359 0.22594891721473687 +4516 6 6.45291376 0.45291376113891602 0.20513087502899907 +4517 6 5.81829929 0.18170070648193359 0.033015146736033785 +4518 6 5.56788 0.43211984634399414 0.18672756160435711 +4519 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4520 5 5.3585043 0.35850429534912109 0.12852532978376985 +4521 5 5.146292 0.14629220962524414 0.021401410597036374 +4522 6 5.56788 0.43211984634399414 0.18672756160435711 +4523 5 5.93566465 0.93566465377807617 0.87546834432964715 +4524 6 5.834097 0.16590309143066406 0.027523835746251279 +4525 6 6.02958632 0.029586315155029297 0.00087535004445271625 +4526 6 6.196083 0.19608306884765625 0.038448569888714701 +4527 6 5.81829929 0.18170070648193359 0.033015146736033785 +4528 6 5.14050531 0.85949468612670898 0.73873111548004999 +4529 6 5.61537933 0.38462066650390625 0.14793305710190907 +4530 6 5.579626 0.42037391662597656 0.17671422977946349 +4531 6 5.579626 0.42037391662597656 0.17671422977946349 +4532 6 6.080338 0.080338001251220703 0.0064541944450411393 +4533 5 5.5772934 0.57729339599609375 0.33326766506070271 +4534 6 6.29704 0.29703998565673828 0.088232753078955284 +4535 6 5.61537933 0.38462066650390625 0.14793305710190907 +4536 6 5.55331945 0.44668054580688477 0.19952351000233648 +4537 5 5.09134531 0.091345310211181641 0.0083439656975770049 +4538 6 6.68299675 0.68299674987792969 0.46648456034381525 +4539 5 5.699331 0.69933080673217773 0.48906357724467853 +4540 6 6.555229 0.55522918701171875 0.30827945010969415 +4541 6 6.245467 0.24546718597412109 0.060254139390053751 +4542 5 5.73857737 0.73857736587524414 0.54549652538321425 +4543 5 5.73857737 0.73857736587524414 0.54549652538321425 +4544 6 6.555229 0.55522918701171875 0.30827945010969415 +4545 6 6.471859 0.47185897827148438 0.22265089537540916 +4546 6 6.549561 0.5495610237121582 0.30201731878355531 +4547 6 6.16732836 0.1673283576965332 0.027998779289418962 +4548 5 5.380732 0.38073205947875977 0.14495690111493786 +4549 5 5.73857737 0.73857736587524414 0.54549652538321425 +4550 6 5.989843 0.010157108306884766 0.00010316684915778751 +4551 6 6.09961939 0.099619388580322266 0.0099240225811172422 +4552 6 6.39423275 0.39423274993896484 0.15541946112443839 +4553 6 6.587703 0.58770322799682617 0.34539508419788945 +4554 6 6.245467 0.24546718597412109 0.060254139390053751 +4555 5 5.292268 0.29226779937744141 0.085420466552932339 +4556 5 6.446664 1.4466638565063477 2.0928363137218184 +4557 6 5.477523 0.52247714996337891 0.27298237223385513 +4558 6 6.34416676 0.34416675567626953 0.11845075571272901 +4559 7 6.019767 0.98023319244384766 0.96085711156865727 +4560 6 6.92705 0.92705011367797852 0.85942191327035289 +4561 6 5.979853 0.020146846771240234 0.00040589543482383306 +4562 7 6.10519552 0.89480447769165039 0.80067505329702726 +4563 7 6.56974125 0.43025875091552734 0.1851225927393898 +4564 7 6.18542957 0.81457042694091797 0.66352498044670938 +4565 5 5.39186049 0.3918604850769043 0.15355463976470674 +4566 5 6.22530937 1.2253093719482422 1.5013830569841957 +4567 5 5.39186049 0.3918604850769043 0.15355463976470674 +4568 6 6.126938 0.1269378662109375 0.016113221878185868 +4569 6 5.77645063 0.22354936599731445 0.049974319037801251 +4570 6 6.01089573 0.010895729064941406 0.00011871691185660893 +4571 7 6.57845736 0.42154264450073242 0.17769820113267087 +4572 7 6.440188 0.55981206893920898 0.31338955252999767 +4573 6 6.33240652 0.33240652084350586 0.1104940950992841 +4574 7 6.96231556 0.037684440612792969 0.0014201170642991201 +4575 7 6.81994772 0.18005228042602539 0.032418823686612086 +4576 5 5.687053 0.68705320358276367 0.4720421045533385 +4577 6 6.075848 0.075848102569580078 0.0057529346634055401 +4578 7 7.087625 0.087625026702880859 0.0076781453046805836 +4579 6 6.26486158 0.2648615837097168 0.070151658525219318 +4580 6 6.45493841 0.45493841171264648 0.20696895845162544 +4581 6 6.339595 0.33959484100341797 0.11532465603613673 +4582 6 5.93023872 0.069761276245117188 0.0048666356633475516 +4583 6 5.75422573 0.24577426910400391 0.060404991353607329 +4584 6 5.89385653 0.10614347457885742 0.011266437195672552 +4585 6 6.566305 0.56630516052246094 0.32070153483437025 +4586 6 6.36007071 0.36007070541381836 0.12965091289720476 +4587 6 6.20307446 0.20307445526123047 0.041239234379645495 +4588 5 6.22775126 1.2277512550354004 1.5073731442410008 +4589 6 6.36007071 0.36007070541381836 0.12965091289720476 +4590 6 6.091628 0.091628074645996094 0.0083957040633322322 +4591 6 5.70858669 0.29141330718994141 0.084921715607379156 +4592 6 6.59907055 0.59907054901123047 0.35888552269261709 +4593 6 6.13447571 0.1344757080078125 0.018083716044202447 +4594 6 6.775327 0.77532720565795898 0.60113227583337903 +4595 6 6.27347231 0.27347230911254883 0.074787103851349457 +4596 6 6.20077658 0.20077657699584961 0.040311233870170327 +4597 6 5.56596 0.43404006958007813 0.18839078200107906 +4598 6 6.13447571 0.1344757080078125 0.018083716044202447 +4599 7 6.42611027 0.57388973236083984 0.32934942490919639 +4600 6 5.52788544 0.47211456298828125 0.22289216058561578 +4601 6 6.18567228 0.18567228317260742 0.034474196738528917 +4602 6 6.04761934 0.047619342803955078 0.0022676018090805883 +4603 6 6.05319738 0.053197383880615234 0.0028299616517415416 +4604 6 6.329858 0.32985782623291016 0.10880618552710075 +4605 6 6.70813274 0.70813274383544922 0.50145198289192194 +4606 5 5.980174 0.98017406463623047 0.9607411969855093 +4607 6 6.19283 0.19283008575439453 0.037183441972047149 +4608 7 6.80754328 0.19245672225952148 0.037039589942878592 +4609 4 4.05158043 0.051580429077148438 0.00266054066378274 +4610 6 5.67133236 0.32866764068603516 0.10802241803412471 +4611 5 6.17913532 1.1791353225708008 1.3903601089341464 +4612 5 5.19891071 0.19891071319580078 0.039565471824062115 +4613 5 5.439533 0.43953323364257813 0.19318946347630117 +4614 5 4.95613146 0.043868541717529297 0.0019244489524226083 +4615 7 6.635701 0.36429882049560547 0.13271363061448938 +4616 5 5.638706 0.63870620727539063 0.40794561921211425 +4617 7 7.10083961 0.10083961486816406 0.010168627926759655 +4618 7 6.635701 0.36429882049560547 0.13271363061448938 +4619 5 4.67914963 0.32085037231445313 0.10294496141432319 +4620 6 6.132133 0.13213300704956055 0.017459131551959217 +4621 7 5.89214468 1.1078553199768066 1.2273434100009126 +4622 7 7.09829 0.098289966583251953 0.0096609175309367856 +4623 6 6.41415739 0.41415739059448242 0.17152634418403068 +4624 6 6.581927 0.58192682266235352 0.33863882693390224 +4625 5 5.071765 0.071764945983886719 0.0051502074720701785 +4626 6 5.950599 0.049400806427001953 0.0024404396756381175 +4627 6 6.050242 0.050241947174072266 0.0025242532558422681 +4628 6 6.050242 0.050241947174072266 0.0025242532558422681 +4629 7 6.102637 0.89736318588256836 0.80526068737731293 +4630 7 6.395737 0.6042628288269043 0.36513356630189264 +4631 7 6.45820141 0.54179859161376953 0.29354571387466422 +4632 6 5.950599 0.049400806427001953 0.0024404396756381175 +4633 6 5.82988358 0.17011642456054688 0.028939597905264236 +4634 6 6.556143 0.55614280700683594 0.30929482178544276 +4635 6 5.80749941 0.19250059127807617 0.037056477642408936 +4636 5 5.358758 0.35875797271728516 0.12870728298821632 +4637 6 6.21625137 0.21625137329101563 0.046764656450250186 +4638 5 5.358758 0.35875797271728516 0.12870728298821632 +4639 6 5.71351528 0.28648471832275391 0.082073493832467648 +4640 6 6.21625137 0.21625137329101563 0.046764656450250186 +4641 6 6.377533 0.377532958984375 0.14253113511949778 +4642 7 6.56437159 0.43562841415405273 0.18977211521837489 +4643 6 5.68015242 0.31984758377075195 0.10230247684398819 +4644 6 6.467866 0.46786594390869141 0.21889854146957077 +4645 7 7.116684 0.1166839599609375 0.013615146512165666 +4646 7 6.183157 0.81684303283691406 0.66723254029420787 +4647 7 6.245689 0.75431108474731445 0.56898521257267021 +4648 5 4.80332327 0.19667673110961914 0.038681736559965429 +4649 5 4.89571047 0.10428953170776367 0.010876306423824644 +4650 5 4.89571047 0.10428953170776367 0.010876306423824644 +4651 7 7.10383368 0.10383367538452148 0.010781432143858183 +4652 5 5.10172224 0.10172224044799805 0.01034741420176033 +4653 7 6.79083633 0.20916366577148438 0.043749439078965224 +4654 7 6.693703 0.30629682540893555 0.093817745255591944 +4655 7 6.693703 0.30629682540893555 0.093817745255591944 +4656 7 6.693703 0.30629682540893555 0.093817745255591944 +4657 7 6.65744543 0.34255456924438477 0.117343632910206 +4658 6 6.77934265 0.7793426513671875 0.60737496824003756 +4659 6 5.98162174 0.018378257751464844 0.00033776035797927761 +4660 6 6.34407759 0.34407758712768555 0.11838938596361004 +4661 5 5.58429432 0.58429431915283203 0.34139985139427154 +4662 6 6.614982 0.61498212814331055 0.37820301793567523 +4663 7 6.454456 0.54554414749145508 0.29761841686217849 +4664 7 6.54663849 0.45336151123046875 0.20553665986517444 +4665 6 6.614982 0.61498212814331055 0.37820301793567523 +4666 5 5.25093174 0.25093173980712891 0.062966738042632642 +4667 7 6.54663849 0.45336151123046875 0.20553665986517444 +4668 7 6.454456 0.54554414749145508 0.29761841686217849 +4669 5 5.71813965 0.7181396484375 0.5157245546579361 +4670 6 5.54932833 0.45067167282104492 0.20310495668331896 +4671 5 5.31061268 0.31061267852783203 0.096480236062234326 +4672 5 5.31061268 0.31061267852783203 0.096480236062234326 +4673 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4674 7 6.654536 0.34546422958374023 0.11934553392188718 +4675 6 6.129326 0.12932586669921875 0.016725179797504097 +4676 6 5.83601332 0.1639866828918457 0.02689163216587076 +4677 7 6.90913153 0.090868473052978516 0.0082570793949798826 +4678 6 5.54932833 0.45067167282104492 0.20310495668331896 +4679 5 5.23454332 0.2345433235168457 0.055010570606327747 +4680 4 4.39819431 0.39819431304931641 0.15855871094481699 +4681 6 6.39631176 0.39631175994873047 0.15706301107366016 +4682 6 5.88950825 0.11049175262451172 0.012208427398036292 +4683 6 6.26491642 0.26491641998291016 0.07018070957656164 +4684 6 6.181033 0.18103313446044922 0.032772995772575086 +4685 5 5.48171139 0.48171138763427734 0.23204586097654101 +4686 4 4.39819431 0.39819431304931641 0.15855871094481699 +4687 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4688 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4689 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4690 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4691 7 6.166903 0.83309698104858398 0.6940505798322647 +4692 5 5.380849 0.38084888458251953 0.14504587288774928 +4693 6 5.92201233 0.0779876708984375 0.0060820768121629953 +4694 7 6.166903 0.83309698104858398 0.6940505798322647 +4695 7 6.8444066 0.1555933952331543 0.024209304640180562 +4696 6 6.423567 0.42356681823730469 0.17940884951167391 +4697 7 6.8444066 0.1555933952331543 0.024209304640180562 +4698 6 5.525318 0.47468185424804688 0.22532286275236402 +4699 5 5.677266 0.67726612091064453 0.45868939853335178 +4700 5 5.677266 0.67726612091064453 0.45868939853335178 +4701 6 5.37392664 0.62607336044311523 0.39196785265653489 +4702 6 5.37392664 0.62607336044311523 0.39196785265653489 +4703 7 6.718226 0.28177404403686523 0.079396611892889268 +4704 6 5.235369 0.76463079452514648 0.58466025193615678 +4705 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4706 7 6.586311 0.41368913650512695 0.17113870166235756 +4707 6 5.868769 0.13123083114624023 0.017221531043333016 +4708 6 6.131867 0.1318669319152832 0.017388887732749936 +4709 6 6.52721071 0.52721071243286133 0.2779511353039652 +4710 7 6.806604 0.19339609146118164 0.037402048192461734 +4711 6 5.868769 0.13123083114624023 0.017221531043333016 +4712 6 6.03437138 0.034371376037597656 0.0011813914907179424 +4713 6 6.289812 0.28981208801269531 0.083991046358278254 +4714 7 6.586311 0.41368913650512695 0.17113870166235756 +4715 6 5.7559824 0.24401760101318359 0.059544589604229259 +4716 6 5.51584244 0.48415756225585938 0.23440854508953635 +4717 6 5.624865 0.37513494491577148 0.14072622689695891 +4718 6 5.660127 0.33987283706665039 0.11551354537573388 +4719 6 5.7559824 0.24401760101318359 0.059544589604229259 +4720 5 5.97237635 0.97237634658813477 0.94551575940408839 +4721 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4722 6 5.706852 0.29314804077148438 0.085935773808159865 +4723 6 5.241431 0.75856876373291016 0.57542656931127567 +4724 6 6.09070158 0.090701580047607422 0.0082267766231325368 +4725 6 5.98745346 0.012546539306640625 0.00015741564857307822 +4726 6 6.88603258 0.8860325813293457 0.78505373517714361 +4727 6 5.706852 0.29314804077148438 0.085935773808159865 +4728 6 6.177205 0.17720508575439453 0.03140164241722232 +4729 5 4.73050737 0.26949262619018555 0.072626275570883081 +4730 5 5.814275 0.81427478790283203 0.66304343021420209 +4731 6 6.402927 0.40292692184448242 0.16235010434706965 +4732 6 6.402927 0.40292692184448242 0.16235010434706965 +4733 6 5.71249247 0.28750753402709961 0.08266058212234384 +4734 6 6.274084 0.27408409118652344 0.075122089041542495 +4735 6 6.13222742 0.13222742080688477 0.017484090813240982 +4736 6 6.10331869 0.10331869125366211 0.010674751962369555 +4737 7 6.892216 0.10778379440307617 0.011617346335924594 +4738 6 6.553041 0.55304098129272461 0.30585432698921977 +4739 6 6.274084 0.27408409118652344 0.075122089041542495 +4740 5 5.089445 0.089445114135742188 0.0080004284427559469 +4741 6 6.25626755 0.25626754760742188 0.065673055956722237 +4742 6 6.11390924 0.11390924453735352 0.012975315991070602 +4743 5 5.83421659 0.83421659469604492 0.69591732686626528 +4744 5 5.35093 0.35093021392822266 0.12315201504770812 +4745 3 3.82722521 0.8272252082824707 0.68430154521797704 +4746 6 5.70762 0.29237985610961914 0.085485980258681593 +4747 6 6.29134369 0.29134368896484375 0.084881145099643618 +4748 5 5.34712839 0.34712839126586914 0.12049812002283034 +4749 6 5.35289049 0.6471095085144043 0.41875071600975389 +4750 5 5.83421659 0.83421659469604492 0.69591732686626528 +4751 6 5.51917839 0.48082160949707031 0.23118942015935318 +4752 7 6.60790968 0.3920903205871582 0.1537348194981405 +4753 6 6.60107851 0.60107851028442383 0.3612953755257422 +4754 6 6.02144527 0.021445274353027344 0.00045989979207661236 +4755 6 6.168067 0.16806697845458984 0.028246509246855567 +4756 7 6.81629038 0.18370962142944336 0.033749225005749395 +4757 7 6.81629038 0.18370962142944336 0.033749225005749395 +4758 6 6.5071764 0.50717639923095703 0.25722789993687911 +4759 6 5.8558073 0.14419269561767578 0.020791533469491696 +4760 6 5.8558073 0.14419269561767578 0.020791533469491696 +4761 6 6.42398167 0.42398166656494141 0.17976045358318515 +4762 7 6.319236 0.68076419830322266 0.46343989369142946 +4763 7 6.73848772 0.26151227951049805 0.068388672334776857 +4764 6 6.180128 0.18012809753417969 0.03244613152128295 +4765 8 7.674349 0.32565116882324219 0.10604868375594378 +4766 8 6.59993362 1.4000663757324219 1.9601858564565191 +4767 7 5.88190556 1.1180944442749023 1.2501351863184027 +4768 6 5.5695467 0.43045330047607422 0.18529004389074544 +4769 6 5.5695467 0.43045330047607422 0.18529004389074544 +4770 6 5.5695467 0.43045330047607422 0.18529004389074544 +4771 6 5.5695467 0.43045330047607422 0.18529004389074544 +4772 5 5.31793 0.31793022155761719 0.10107962577967555 +4773 7 6.28737259 0.71262741088867188 0.50783782674989197 +4774 4 4.94949675 0.94949674606323242 0.90154407078466647 +4775 6 5.788814 0.21118593215942383 0.044599497942044763 +4776 6 5.586607 0.41339302062988281 0.17089378950549872 +4777 6 6.67964554 0.67964553833007813 0.46191805777198169 +4778 6 5.625838 0.37416219711303711 0.13999734974845524 +4779 4 4.226809 0.22680902481079102 0.051442333735622015 +4780 5 5.251493 0.25149297714233398 0.063248717551914524 +4781 5 5.251493 0.25149297714233398 0.063248717551914524 +4782 6 5.6815567 0.31844329833984375 0.10140613425755873 +4783 6 5.6815567 0.31844329833984375 0.10140613425755873 +4784 5 5.534597 0.53459692001342773 0.28579386688784325 +4785 7 6.31295729 0.6870427131652832 0.47202768971351361 +4786 8 7.52037668 0.47962331771850586 0.23003852689930682 +4787 8 7.461737 0.53826284408569336 0.28972688932321944 +4788 5 5.534597 0.53459692001342773 0.28579386688784325 +4789 6 6.130587 0.13058710098266602 0.017052990943057011 +4790 6 6.33779 0.33779001235961914 0.11410209244991165 +4791 6 5.6815567 0.31844329833984375 0.10140613425755873 +4792 6 6.60871 0.60870981216430664 0.37052763542510547 +4793 6 5.391595 0.60840511322021484 0.37015678179250244 +4794 5 5.349109 0.34910917282104492 0.12187721454779421 +4795 7 6.60348368 0.39651632308959961 0.15722519447649574 +4796 7 6.60348368 0.39651632308959961 0.15722519447649574 +4797 6 6.444803 0.44480323791503906 0.19784992045970284 +4798 5 5.5460577 0.54605770111083984 0.2981790129424553 +4799 6 5.86040545 0.13959455490112305 0.019486639758042656 +4800 7 6.06000948 0.93999052047729492 0.8835821785871758 +4801 7 6.60348368 0.39651632308959961 0.15722519447649574 +4802 8 7.498994 0.50100612640380859 0.25100713869414903 +4803 7 6.657819 0.34218120574951172 0.11708797756818967 +4804 4 4.9147253 0.91472530364990234 0.83672238113740605 +4805 6 5.73073435 0.26926565170288086 0.072503991186977146 +4806 6 5.533971 0.46602916717529297 0.21718318465809716 +4807 6 6.277921 0.27792119979858398 0.077240193297484439 +4808 5 5.31803656 0.31803655624389648 0.10114725110747713 +4809 6 5.920948 0.079051971435546875 0.0062492141878465191 +4810 5 5.394947 0.39494705200195313 0.15598317388503347 +4811 6 6.31708336 0.31708335876464844 0.10054185640547075 +4812 7 6.53195238 0.4680476188659668 0.21906857352610132 +4813 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4814 6 6.193335 0.19333505630493164 0.037378443996431088 +4815 7 6.322362 0.67763805389404297 0.45919333208530588 +4816 6 5.68325233 0.31674766540527344 0.10032908353969106 +4817 6 6.478207 0.47820711135864258 0.22868204135397718 +4818 6 6.483267 0.48326683044433594 0.23354682940771454 +4819 6 6.193335 0.19333505630493164 0.037378443996431088 +4820 5 5.06972742 0.069727420806884766 0.0048619132123803865 +4821 6 5.80547857 0.19452142715454102 0.037838585622239407 +4822 6 6.046786 0.046785831451416016 0.002188914024600308 +4823 7 6.37059 0.6294097900390625 0.39615668379701674 +4824 5 5.61957836 0.61957836151123047 0.38387734605294099 +4825 6 6.193167 0.19316720962524414 0.037313570874403013 +4826 6 6.193167 0.19316720962524414 0.037313570874403013 +4827 6 6.30881929 0.30881929397583008 0.09536935633173016 +4828 5 5.61957836 0.61957836151123047 0.38387734605294099 +4829 7 6.587614 0.41238594055175781 0.17006216396475793 +4830 6 5.902513 0.097486972808837891 0.0095037098674310982 +4831 6 5.267164 0.73283576965332031 0.53704826528337435 +4832 5 5.476546 0.47654581069946289 0.22709590969520832 +4833 6 6.285742 0.28574180603027344 0.081648379713442409 +4834 7 6.76315069 0.23684930801391602 0.056097594706670861 +4835 6 6.45354271 0.45354270935058594 0.20570098920507007 +4836 5 5.27756 0.27756023406982422 0.077039683536895609 +4837 6 6.6851635 0.68516349792480469 0.46944901888855384 +4838 6 6.40559673 0.40559673309326172 0.16450870989592659 +4839 4 4.615171 0.61517095565795898 0.37843530468512654 +4840 7 6.953846 0.046154022216796875 0.0021301937667885795 +4841 6 6.42197466 0.42197465896606445 0.1780626128095264 +4842 6 5.909714 0.090285778045654297 0.0081515217173091514 +4843 5 5.849253 0.84925317764282227 0.72123095973643103 +4844 6 5.93484 0.065159797668457031 0.0042457992321942584 +4845 5 5.007286 0.00728607177734375 5.3086841944605112E-05 +4846 6 6.584194 0.58419418334960938 0.34128284385951702 +4847 7 6.47132969 0.52867031097412109 0.2794922977054739 +4848 6 6.12405062 0.12405061721801758 0.015388555632171119 +4849 5 5.252341 0.25234079360961914 0.063675876119532404 +4850 6 6.12405062 0.12405061721801758 0.015388555632171119 +4851 5 5.252341 0.25234079360961914 0.063675876119532404 +4852 5 5.93845654 0.93845653533935547 0.88070066872114694 +4853 5 5.962768 0.9627680778503418 0.9269223717276418 +4854 6 6.64682436 0.64682435989379883 0.41838175255202259 +4855 6 5.811765 0.18823480606079102 0.035432342212743606 +4856 6 5.811765 0.18823480606079102 0.035432342212743606 +4857 6 5.96738768 0.032612323760986328 0.0010635636610913934 +4858 5 5.23224735 0.23224735260009766 0.053938832789754088 +4859 6 6.204521 0.20452117919921875 0.041828912741038948 +4860 6 5.651828 0.34817218780517578 0.1212238723610426 +4861 6 6.31806231 0.31806230545043945 0.10116363014844865 +4862 6 6.010396 0.010396003723144531 0.00010807689341163496 +4863 7 6.99840736 0.0015926361083984375 2.5364897737745196E-06 +4864 5 5.177444 0.1774439811706543 0.031486366453691517 +4865 6 6.59354162 0.59354162216186523 0.35229165723853839 +4866 6 6.05234241 0.052342414855957031 0.0027397283929531113 +4867 6 5.65121841 0.34878158569335938 0.12164859451877419 +4868 6 6.40162659 0.4016265869140625 0.161303915316239 +4869 6 5.28494453 0.71505546569824219 0.51130431902493001 +4870 7 6.390793 0.6092071533203125 0.37113335565663874 +4871 6 6.365685 0.36568498611450195 0.13372550906956349 +4872 5 5.51866674 0.51866674423217773 0.26901519157240728 +4873 6 6.25817537 0.25817537307739258 0.066654523263650844 +4874 6 5.92614746 0.0738525390625 0.0054541975259780884 +4875 6 5.56610727 0.43389272689819336 0.18826289845515021 +4876 7 6.79692745 0.20307254791259766 0.041238459715714271 +4877 5 4.49993134 0.50006866455078125 0.25006866926560178 +4878 4 4.44558573 0.44558572769165039 0.19854664072249761 +4879 6 5.391604 0.60839605331420898 0.37014575768830582 +4880 6 5.391604 0.60839605331420898 0.37014575768830582 +4881 6 6.151292 0.15129184722900391 0.022889223037964257 +4882 5 5.638549 0.63854885101318359 0.40774463513025694 +4883 6 5.91789675 0.082103252410888672 0.0067409440564460965 +4884 5 5.34791565 0.3479156494140625 0.12104529910720885 +4885 6 5.391604 0.60839605331420898 0.37014575768830582 +4886 7 7.167016 0.16701602935791016 0.027894354062482307 +4887 7 6.50685453 0.49314546585083008 0.24319245048923221 +4888 5 5.990843 0.99084281921386719 0.98176949238768429 +4889 6 6.151292 0.15129184722900391 0.022889223037964257 +4890 6 6.509506 0.5095062255859375 0.25959659391082823 +4891 6 5.611698 0.38830184936523438 0.15077832622046117 +4892 5 5.985514 0.98551416397094727 0.97123816738735513 +4893 6 6.2242403 0.22424030303955078 0.050283713507269567 +4894 5 5.458216 0.45821619033813477 0.20996207708799375 +4895 6 5.30194473 0.69805526733398438 0.48728115625272039 +4896 7 6.68631124 0.31368875503540039 0.098400635035659434 +4897 6 6.04107332 0.041073322296142578 0.001687017804442803 diff --git a/test/Directory.Build.props b/test/Directory.Build.props index d5a86e7fbd..ee5d507566 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -1,6 +1,19 @@ + + true + + + $(NoWarn),1573,1591,1712 + + trx $(OutputPath) diff --git a/test/Directory.Build.targets b/test/Directory.Build.targets index c497a50172..88f693b838 100644 --- a/test/Directory.Build.targets +++ b/test/Directory.Build.targets @@ -1,34 +1,5 @@ - - - - - lib - .dll - .so - .dylib - - - - - $(NativeOutputPath)$(LibPrefix)%(NativeAssemblyReference.Identity)$(LibExtension) - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.ML.Benchmarks/StochasticDualCoordinateAscentClassifierBench.cs b/test/Microsoft.ML.Benchmarks/StochasticDualCoordinateAscentClassifierBench.cs index adfa42e50d..bb76ab8523 100644 --- a/test/Microsoft.ML.Benchmarks/StochasticDualCoordinateAscentClassifierBench.cs +++ b/test/Microsoft.ML.Benchmarks/StochasticDualCoordinateAscentClassifierBench.cs @@ -23,7 +23,7 @@ public class StochasticDualCoordinateAscentClassifierBench private static IrisData[][] s_batches; private static readonly int[] s_batchSizes = new int[] { 1, 2, 5 }; private readonly Random r = new Random(0); - private readonly static IrisData s_example = new IrisData() + private static readonly IrisData s_example = new IrisData() { SepalLength = 3.3f, SepalWidth = 1.6f, diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/ContractsCheckTest.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/ContractsCheckTest.cs new file mode 100644 index 0000000000..a004994f4f --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/ContractsCheckTest.cs @@ -0,0 +1,87 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.IO; +using System.Reflection; +using System.Threading; +using Microsoft.ML.CodeAnalyzer.Tests.Helpers; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.ML.CodeAnalyzer.Tests +{ + public sealed class ContractsCheckTest : DiagnosticVerifier + { + private static string _contractsSource; + internal static string Source => TestUtils.EnsureSourceLoaded(ref _contractsSource, "ContractsCheckResource.cs"); + + [Fact] + public void ContractsCheck() + { + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diagName = analyzer.SupportedDiagnostics[0]; + var diagExceptExp = analyzer.SupportedDiagnostics[1]; + var diagMsg = analyzer.SupportedDiagnostics[2]; + var diagDecode = analyzer.SupportedDiagnostics[3]; + + const int basis = 10; + var expected = new DiagnosticResult[] { + diagName.CreateDiagnosticResult(basis + 8, 46, "CheckParam", "paramName", "\"p\""), + diagName.CreateDiagnosticResult(basis + 9, 46, "CheckParam", "paramName", "nameof(p) + nameof(p)"), + diagName.CreateDiagnosticResult(basis + 11, 28, "CheckValue", "paramName", "\"p\""), + diagName.CreateDiagnosticResult(basis + 13, 39, "CheckUserArg", "name", "\"foo\""), + diagExceptExp.CreateDiagnosticResult(basis + 15, 13, "Except"), + diagExceptExp.CreateDiagnosticResult(basis + 16, 13, "ExceptParam"), + diagName.CreateDiagnosticResult(basis + 22, 39, "ExceptParam", "paramName", "\"env\""), + diagMsg.CreateDiagnosticResult(basis + 24, 29, "Check", "$\"Hello {foo} is cool\""), + diagMsg.CreateDiagnosticResult(basis + 28, 29, "Check", "string.Format(\"Hello {0} is cool\", foo)"), + diagMsg.CreateDiagnosticResult(basis + 32, 35, "Check", "\"Less fine: \" + env.GetType().Name"), + diagName.CreateDiagnosticResult(basis + 34, 17, "CheckUserArg", "name", "\"p\""), + diagDecode.CreateDiagnosticResult(basis + 39, 41, "CheckDecode", "\"This message is suspicious\""), + }; + + VerifyCSharpDiagnostic(Source, expected); + } + + [Fact] + public void ContractsCheckDecoy() + { + // Run a test with a "decoy" Contacts that has the same signature on the method, + // except the namespace is distinct so it is a different type. We should not find + // diagnostics on a class like this! + const string decoySource = @" +using System; +namespace TestNamespace +{ + public static class Contracts + + { + public static Exception ExceptParam(string paramName, string msg) => null; + } + + public sealed class TypeName + { + public TypeName() + => Contracts.ExceptParam(""myAwesomeParameter"", ""What a great thing""); + } +}"; + VerifyCSharpDiagnostic(decoySource, new DiagnosticResult[0]); + } + } + + public sealed class ContractsCheckFixTest : CodeFixVerifier + { + private static string _preFix; + private static string _postFix; + + [Fact] + public void ContractsCheckFix() + { + string test = TestUtils.EnsureSourceLoaded(ref _preFix, "ContractsCheckBeforeFix.cs"); + string expected = TestUtils.EnsureSourceLoaded(ref _postFix, "ContractsCheckAfterFix.cs"); + + VerifyCSharpFix(test, expected); + } + } +} diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/CodeFixVerifier.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/CodeFixVerifier.cs new file mode 100644 index 0000000000..489ec5c446 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/CodeFixVerifier.cs @@ -0,0 +1,194 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Formatting; +using Microsoft.CodeAnalysis.Simplification; +using Xunit; + +namespace Microsoft.ML.CodeAnalyzer.Tests.Helpers +{ + /// + /// Superclass of all Unit tests made for diagnostics with codefixes. + /// Contains methods used to verify correctness of codefixes + /// + public abstract partial class CodeFixVerifier : DiagnosticVerifier + where TDiag : DiagnosticAnalyzer, new() + where TFix : CodeFixProvider, new() + { + /// + /// Returns the codefix being tested (C#) - to be implemented in non-abstract class + /// + /// The CodeFixProvider to be used for CSharp code + protected virtual TFix GetCSharpCodeFixProvider() + => new TFix(); + + /// + /// Returns the codefix being tested (VB) - to be implemented in non-abstract class + /// + /// The CodeFixProvider to be used for VisualBasic code + protected virtual TFix GetBasicCodeFixProvider() + => new TFix(); + + /// + /// Called to test a C# codefix when applied on the input string as a source + /// + /// A class in the form of a string before the CodeFix was applied to it + /// A class in the form of a string after the CodeFix was applied to it + /// Index determining which codefix to apply if there are multiple + /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied + protected void VerifyCSharpFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false) + { + VerifyFix(LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), GetCSharpCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics); + } + + /// + /// Called to test a VB codefix when applied on the input string as a source + /// + /// A class in the form of a string before the CodeFix was applied to it + /// A class in the form of a string after the CodeFix was applied to it + /// Index determining which codefix to apply if there are multiple + /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied + protected void VerifyBasicFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false) + { + VerifyFix(LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), GetBasicCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics); + } + + /// + /// General verifier for codefixes. + /// Creates a Document from the source string, then gets diagnostics on it and applies the relevant codefixes. + /// Then gets the string after the codefix is applied and compares it with the expected result. + /// Note: If any codefix causes new diagnostics to show up, the test fails unless allowNewCompilerDiagnostics is set to true. + /// + /// The analyzer to be applied to the source code + /// The codefix to be applied to the code wherever the relevant Diagnostic is found + /// A class in the form of a string before the CodeFix was applied to it + /// A class in the form of a string after the CodeFix was applied to it + /// Index determining which codefix to apply if there are multiple + /// A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied + private void VerifyFix(string language, DiagnosticAnalyzer analyzer, CodeFixProvider codeFixProvider, string oldSource, string newSource, int? codeFixIndex, bool allowNewCompilerDiagnostics) + { + var document = CreateDocument(oldSource); + var analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document }); + var compilerDiagnostics = GetCompilerDiagnostics(document); + int attempts = analyzerDiagnostics.Length; + + for (int i = 0; i < attempts; ++i) + { + var actions = new List(); + var context = new CodeFixContext(document, + analyzerDiagnostics[i + analyzerDiagnostics.Length - attempts], (a, d) => actions.Add(a), CancellationToken.None); + codeFixProvider.RegisterCodeFixesAsync(context).Wait(); + + if (actions.Count == 0) + continue; + + if (codeFixIndex != null) + { + document = ApplyFix(document, actions.ElementAt((int)codeFixIndex)); + break; + } + + document = ApplyFix(document, actions.ElementAt(0)); + analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document }); + + var newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document)); + + //check if applying the code fix introduced any new compiler diagnostics + if (!allowNewCompilerDiagnostics && newCompilerDiagnostics.Any()) + { + // Format and get the compiler diagnostics again so that the locations make sense in the output + document = document.WithSyntaxRoot(Formatter.Format(document.GetSyntaxRootAsync().Result, Formatter.Annotation, document.Project.Solution.Workspace)); + newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document)); + + string diags = string.Join("\r\n", newCompilerDiagnostics.Select(d => d.ToString())); + string root = document.GetSyntaxRootAsync().Result.ToFullString(); + Assert.True(false, + $"Fix introduced new compiler diagnostics:\r\n{diags}\r\n\r\nNew document:\r\n{root}\r\n"); + } + + //check if there are analyzer diagnostics left after the code fix + if (analyzerDiagnostics.Length == 0) + break; + } + + //after applying all of the code fixes, compare the resulting string to the input one + var actual = GetStringFromDocument(document); + Assert.Equal(newSource, actual); + } + + /// + /// Apply the inputted CodeAction to the input document. + /// Meant to be used to apply codefixes. + /// + /// The Document to apply the fix on + /// A CodeAction that will be applied to the Document. + /// A Document with the changes from the CodeAction + private static Document ApplyFix(Document document, CodeAction codeAction) + { + var operations = codeAction.GetOperationsAsync(CancellationToken.None).Result; + var solution = operations.OfType().Single().ChangedSolution; + return solution.GetDocument(document.Id); + } + + /// + /// Compare two collections of Diagnostics,and return a list of any new diagnostics that appear only in the second collection. + /// Note: Considers Diagnostics to be the same if they have the same Ids. In the case of multiple diagnostics with the same Id in a row, + /// this method may not necessarily return the new one. + /// + /// The Diagnostics that existed in the code before the CodeFix was applied + /// The Diagnostics that exist in the code after the CodeFix was applied + /// A list of Diagnostics that only surfaced in the code after the CodeFix was applied + private static IEnumerable GetNewDiagnostics(IEnumerable diagnostics, IEnumerable newDiagnostics) + { + var oldArray = diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray(); + var newArray = newDiagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray(); + + int oldIndex = 0; + int newIndex = 0; + + while (newIndex < newArray.Length) + { + if (oldIndex < oldArray.Length && oldArray[oldIndex].Id == newArray[newIndex].Id) + { + ++oldIndex; + ++newIndex; + } + else + { + yield return newArray[newIndex++]; + } + } + } + + /// + /// Get the existing compiler diagnostics on the input document. + /// + /// The Document to run the compiler diagnostic analyzers on + /// The compiler diagnostics that were found in the code + private static IEnumerable GetCompilerDiagnostics(Document document) + { + return document.GetSemanticModelAsync().Result.GetDiagnostics(); + } + + /// + /// Given a document, turn it into a string based on the syntax root + /// + /// The Document to be converted to a string + /// A string containing the syntax of the Document after formatting + private static string GetStringFromDocument(Document document) + { + var simplifiedDoc = Simplifier.ReduceAsync(document, Simplifier.Annotation).Result; + var root = simplifiedDoc.GetSyntaxRootAsync().Result; + root = Formatter.Format(root, Formatter.Annotation, simplifiedDoc.Project.Solution.Workspace); + return root.GetText().ToString(); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/DiagnosticResult.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/DiagnosticResult.cs new file mode 100644 index 0000000000..d915ab7cc3 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/DiagnosticResult.cs @@ -0,0 +1,61 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.CodeAnalysis; +using System; + +namespace Microsoft.ML.CodeAnalyzer.Tests.Helpers +{ + /// + /// Location where the diagnostic appears, as determined by path, line number, and column number. + /// + public struct DiagnosticResultLocation + { + public string Path { get; } + public int Line { get; } + public int Column { get; } + + public DiagnosticResultLocation(string path, int line, int column) + { + if (line < -1) + throw new ArgumentOutOfRangeException(nameof(line), "Must be >= -1"); + + if (column < -1) + throw new ArgumentOutOfRangeException(nameof(column), "Must be >= -1"); + + Path = path; + Line = line; + Column = column; + } + } + + /// + /// Struct that stores information about a Diagnostic appearing in a source + /// + public struct DiagnosticResult + { + private DiagnosticResultLocation[] _locations; + + public DiagnosticResultLocation[] Locations { + get => _locations ?? new DiagnosticResultLocation[0]; + set => _locations = value; + } + + public DiagnosticSeverity Severity { get; set; } + public string Id { get; set; } + public string Message { get; set; } + + public DiagnosticResultLocation? Location { + get => Locations.Length > 0 ? Locations[0] : (DiagnosticResultLocation?)null; + set => _locations = value == null ? null : new DiagnosticResultLocation[] { value.Value }; + } + + public string Path => + Locations.Length > 0 ? Locations[0].Path : ""; + public int Line => + Locations.Length > 0 ? Locations[0].Line : -1; + public int Column => + Locations.Length > 0 ? Locations[0].Column : -1; + } +} \ No newline at end of file diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/DiagnosticVerifier.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/DiagnosticVerifier.cs new file mode 100644 index 0000000000..2d51ac6559 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/DiagnosticVerifier.cs @@ -0,0 +1,415 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Reflection; +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Text; +using Xunit; + +namespace Microsoft.ML.CodeAnalyzer.Tests.Helpers +{ + /// + /// Superclass of all Unit Tests for DiagnosticAnalyzers + /// + public abstract partial class DiagnosticVerifier + where TDiag : DiagnosticAnalyzer, new() + { + private protected DiagnosticVerifier() + { + } + + #region To be implemented by Test classes + /// + /// Get the CSharp analyzer being tested - to be implemented in non-abstract class + /// + protected virtual TDiag GetCSharpDiagnosticAnalyzer() + => new TDiag(); + + /// + /// Get the Visual Basic analyzer being tested (C#) - to be implemented in non-abstract class + /// + protected virtual DiagnosticAnalyzer GetBasicDiagnosticAnalyzer() + => new TDiag(); + + #endregion + + #region Verifier wrappers + + /// + /// Called to test a C# DiagnosticAnalyzer when applied on the single input string as a source + /// Note: input a DiagnosticResult for each Diagnostic expected + /// + /// A class in the form of a string to run the analyzer on + /// DiagnosticResults that should appear after the analyzer is run on the source + protected void VerifyCSharpDiagnostic(string source, params DiagnosticResult[] expected) + { + VerifyDiagnostics(new[] { source }, GetCSharpDiagnosticAnalyzer(), expected); + } + + /// + /// Called to test a C# DiagnosticAnalyzer when applied on the input strings as a source + /// Note: input a DiagnosticResult for each Diagnostic expected + /// + /// An array of strings to create source documents from to run the analyzers on + /// DiagnosticResults that should appear after the analyzer is run on the sources + protected void VerifyCSharpDiagnostic(string[] sources, params DiagnosticResult[] expected) + { + VerifyDiagnostics(sources, GetCSharpDiagnosticAnalyzer(), expected); + } + + /// + /// General method that gets a collection of actual diagnostics found in the source after the analyzer is run, + /// then verifies each of them. + /// + /// An array of strings to create source documents from to run the analyzers on + /// The analyzer to be run on the source code + /// DiagnosticResults that should appear after the analyzer is run on the sources + private void VerifyDiagnostics(string[] sources, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expected) + { + var diagnostics = GetSortedDiagnostics(sources, analyzer); + VerifyDiagnosticResults(diagnostics, analyzer, expected); + } + + #endregion + + #region Actual comparisons and verifications + /// + /// Checks each of the actual Diagnostics found and compares them with the corresponding DiagnosticResult in the array of expected results. + /// Diagnostics are considered equal only if the DiagnosticResultLocation, Id, Severity, and Message of the DiagnosticResult match the actual diagnostic. + /// + /// The Diagnostics found by the compiler after running the analyzer on the source code + /// The analyzer that was being run on the sources + /// Diagnostic Results that should have appeared in the code + private static void VerifyDiagnosticResults(IEnumerable actualResults, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expectedResults) + { + int expectedCount = expectedResults.Length; + int actualCount = actualResults.Count(); + + if (expectedCount != actualCount) + { + string diagnosticsOutput = actualResults.Any() ? FormatDiagnostics(analyzer, actualResults.ToArray()) : " NONE."; + + Assert.True(false, + $"Mismatch between number of diagnostics returned, expected \"{expectedCount}\" actual \"{actualCount}\"\r\n\r\nDiagnostics:\r\n{diagnosticsOutput}\r\n"); + } + + for (int i = 0; i < expectedResults.Length; i++) + { + var actual = actualResults.ElementAt(i); + var expected = expectedResults[i]; + + if (expected.Line == -1 && expected.Column == -1) + { + if (actual.Location != Location.None) + { + Assert.True(false, + $"Expected:\nA project diagnostic with No location\nActual:\n{FormatDiagnostics(analyzer, actual)}"); + } + } + else + { + VerifyDiagnosticLocation(analyzer, actual, actual.Location, expected.Locations.First()); + var additionalLocations = actual.AdditionalLocations.ToArray(); + + if (additionalLocations.Length != expected.Locations.Length - 1) + { + Assert.True(false, + string.Format("Expected {0} additional locations but got {1} for Diagnostic:\r\n {2}\r\n", + expected.Locations.Length - 1, additionalLocations.Length, + FormatDiagnostics(analyzer, actual))); + } + + for (int j = 0; j < additionalLocations.Length; ++j) + { + VerifyDiagnosticLocation(analyzer, actual, additionalLocations[j], expected.Locations[j + 1]); + } + } + + if (actual.Id != expected.Id) + { + Assert.True(false, + string.Format("Expected diagnostic id to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", + expected.Id, actual.Id, FormatDiagnostics(analyzer, actual))); + } + + if (actual.Severity != expected.Severity) + { + Assert.True(false, + string.Format("Expected diagnostic severity to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", + expected.Severity, actual.Severity, FormatDiagnostics(analyzer, actual))); + } + + if (actual.GetMessage() != expected.Message) + { + Assert.True(false, + string.Format("Expected diagnostic message to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", + expected.Message, actual.GetMessage(), FormatDiagnostics(analyzer, actual))); + } + } + } + + /// + /// Helper method to VerifyDiagnosticResult that checks the location of a diagnostic and compares it with the location in the expected DiagnosticResult. + /// + /// The analyzer that was being run on the sources + /// The diagnostic that was found in the code + /// The Location of the Diagnostic found in the code + /// The DiagnosticResultLocation that should have been found + private static void VerifyDiagnosticLocation(DiagnosticAnalyzer analyzer, Diagnostic diagnostic, Location actual, DiagnosticResultLocation expected) + { + var actualSpan = actual.GetLineSpan(); + + Assert.True(actualSpan.Path == expected.Path || (actualSpan.Path != null && actualSpan.Path.Contains("Test0.") && expected.Path.Contains("Test.")), + string.Format("Expected diagnostic to be in file \"{0}\" was actually in file \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", + expected.Path, actualSpan.Path, FormatDiagnostics(analyzer, diagnostic))); + + var actualLinePosition = actualSpan.StartLinePosition; + + // Only check line position if there is an actual line in the real diagnostic + if (actualLinePosition.Line > 0) + { + if (actualLinePosition.Line + 1 != expected.Line) + { + Assert.True(false, + string.Format("Expected diagnostic to be on line \"{0}\" was actually on line \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", + expected.Line, actualLinePosition.Line + 1, FormatDiagnostics(analyzer, diagnostic))); + } + } + + // Only check column position if there is an actual column position in the real diagnostic + if (actualLinePosition.Character > 0) + { + if (actualLinePosition.Character + 1 != expected.Column) + { + Assert.True(false, + string.Format("Expected diagnostic to start at column \"{0}\" was actually at column \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n", + expected.Column, actualLinePosition.Character + 1, FormatDiagnostics(analyzer, diagnostic))); + } + } + } + #endregion + + #region Formatting Diagnostics + /// + /// Helper method to format a Diagnostic into an easily readable string + /// + /// The analyzer that this verifier tests + /// The Diagnostics to be formatted + /// The Diagnostics formatted as a string + private static string FormatDiagnostics(DiagnosticAnalyzer analyzer, params Diagnostic[] diagnostics) + { + var builder = new StringBuilder(); + for (int i = 0; i < diagnostics.Length; ++i) + { + builder.AppendLine("// " + diagnostics[i].ToString()); + + var analyzerType = analyzer.GetType(); + var rules = analyzer.SupportedDiagnostics; + + foreach (var rule in rules) + { + if (rule != null && rule.Id == diagnostics[i].Id) + { + var location = diagnostics[i].Location; + if (location == Location.None) + { + builder.AppendFormat("GetGlobalResult({0}.{1})", analyzerType.Name, rule.Id); + } + else + { + Assert.True(location.IsInSource, + $"Test base does not currently handle diagnostics in metadata locations. Diagnostic in metadata: {diagnostics[i]}\r\n"); + + string resultMethodName = diagnostics[i].Location.SourceTree.FilePath.EndsWith(".cs") ? "GetCSharpResultAt" : "GetBasicResultAt"; + var linePosition = diagnostics[i].Location.GetLineSpan().StartLinePosition; + + builder.AppendFormat("{0}({1}, {2}, {3}.{4})", + resultMethodName, + linePosition.Line + 1, + linePosition.Character + 1, + analyzerType.Name, + rule.Id); + } + + if (i != diagnostics.Length - 1) + { + builder.Append(','); + } + + builder.AppendLine(); + break; + } + } + } + return builder.ToString(); + } + #endregion + + private static readonly MetadataReference CorlibReference = RefFromType(); + // I'd hope for a better way for these two. + private static readonly MetadataReference StandardReference = MetadataReference.CreateFromFile(Assembly.Load("netstandard, Version=2.0.0.0").Location); + private static readonly MetadataReference RuntimeReference = MetadataReference.CreateFromFile(Assembly.Load("System.Runtime, Version=0.0.0.0").Location); + + private static readonly MetadataReference SystemCoreReference = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location); + private static readonly MetadataReference CSharpSymbolsReference = RefFromType(); + private static readonly MetadataReference CodeAnalysisReference = RefFromType(); + + private static readonly MetadataReference MLNetCoreReference = RefFromType(); + private static readonly MetadataReference MLNetDataReference = RefFromType(); + + private static MetadataReference RefFromType() + => MetadataReference.CreateFromFile(typeof(TType).Assembly.Location); + + internal const string DefaultFilePathPrefix = "Test"; + internal const string CSharpDefaultFileExt = "cs"; + internal const string TestProjectName = "TestProject"; + + #region Get Diagnostics + + /// + /// Given classes in the form of strings, their language, and an IDiagnosticAnlayzer to apply to it, return the diagnostics found in the string after converting it to a document. + /// + /// Classes in the form of strings + /// The analyzer to be run on the sources + /// An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location + private static Diagnostic[] GetSortedDiagnostics(string[] sources, DiagnosticAnalyzer analyzer) + { + return GetSortedDiagnosticsFromDocuments(analyzer, GetDocuments(sources)); + } + + /// + /// Given an analyzer and a document to apply it to, run the analyzer and gather an array of diagnostics found in it. + /// The returned diagnostics are then ordered by location in the source document. + /// + /// The analyzer to run on the documents + /// The Documents that the analyzer will be run on + /// An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location + protected static Diagnostic[] GetSortedDiagnosticsFromDocuments(DiagnosticAnalyzer analyzer, Document[] documents) + { + var projects = new HashSet(); + + foreach (var document in documents) + { + projects.Add(document.Project); + } + + var diagnostics = new List(); + foreach (var project in projects) + { + var comp = project.GetCompilationAsync().Result; + var compilationWithAnalyzers = comp.WithAnalyzers(ImmutableArray.Create(analyzer)); + var diags = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result; + foreach (var diag in diags) + { + if (diag.Location == Location.None || diag.Location.IsInMetadata) + { + diagnostics.Add(diag); + } + else + { + for (int i = 0; i < documents.Length; i++) + { + var document = documents[i]; + var tree = document.GetSyntaxTreeAsync().Result; + if (tree == diag.Location.SourceTree) + { + diagnostics.Add(diag); + } + } + } + } + } + + var results = SortDiagnostics(diagnostics); + diagnostics.Clear(); + return results; + } + + /// + /// Sort diagnostics by location in source document + /// + /// The list of Diagnostics to be sorted + /// An IEnumerable containing the Diagnostics in order of Location + private static Diagnostic[] SortDiagnostics(IEnumerable diagnostics) + { + return diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray(); + } + + #endregion + + #region Set up compilation and documents + /// + /// Given an array of strings as sources and a language, turn them into a project and return the documents and spans of it. + /// + /// Classes in the form of strings + /// A Tuple containing the Documents produced from the sources and their TextSpans if relevant + private static Document[] GetDocuments(string[] sources) + { + var project = CreateProject(sources); + var documents = project.Documents.ToArray(); + + if (sources.Length != documents.Length) + { + throw new SystemException("Amount of sources did not match amount of Documents created"); + } + + return documents; + } + + /// + /// Create a Document from a string through creating a project that contains it. + /// + /// Classes in the form of a string + /// A Document created from the source string + protected static Document CreateDocument(string source) + { + return CreateProject(new[] { source }).Documents.First(); + } + + /// + /// Create a project using the input strings as sources. + /// + /// Classes in the form of strings + /// A Project created out of the Documents created from the source strings + private static Project CreateProject(string[] sources) + { + string fileNamePrefix = DefaultFilePathPrefix; + + ProjectId projectId = ProjectId.CreateNewId(debugName: TestProjectName); + + var solution = new AdhocWorkspace() + .CurrentSolution + .AddProject(projectId, TestProjectName, TestProjectName, LanguageNames.CSharp) + .AddMetadataReference(projectId, CorlibReference) + .AddMetadataReference(projectId, StandardReference) + .AddMetadataReference(projectId, RuntimeReference) + .AddMetadataReference(projectId, SystemCoreReference) + .AddMetadataReference(projectId, CSharpSymbolsReference) + .AddMetadataReference(projectId, CodeAnalysisReference) + .AddMetadataReference(projectId, MLNetCoreReference) + .AddMetadataReference(projectId, MLNetDataReference); + + int count = 0; + foreach (string source in sources) + { + string sourceTrimmed = source.TrimStart('\r', '\n'); + string newFileName = fileNamePrefix + count + "." + CSharpDefaultFileExt; + DocumentId documentId = DocumentId.CreateNewId(projectId, debugName: newFileName); + solution = solution.AddDocument(documentId, newFileName, SourceText.From(sourceTrimmed)); + count++; + } + var proj = solution.GetProject(projectId); + proj = proj.WithCompilationOptions(proj.CompilationOptions.WithOutputKind(OutputKind.DynamicallyLinkedLibrary)); + return proj; + } + #endregion + } +} diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/TestUtils.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/TestUtils.cs new file mode 100644 index 0000000000..73430ee488 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Helpers/TestUtils.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.IO; +using System.Reflection; +using System.Threading; +using Microsoft.CodeAnalysis; + +namespace Microsoft.ML.CodeAnalyzer.Tests.Helpers +{ + internal static class TestUtils + { + public static DiagnosticResult CreateDiagnosticResult(this DiagnosticDescriptor desc, int line, int column, params object[] formatArgs) + { + return new DiagnosticResult + { + Id = desc.Id, + Message = string.Format(desc.MessageFormat.ToString(), formatArgs), + Severity = desc.DefaultSeverity, + Location = new DiagnosticResultLocation("Test0.cs", line, column), + }; + } + + public static ref string EnsureSourceLoaded(ref string source, string resourceName) + { + if (source == null) + { + string loadedSource; + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) + using (var reader = new StreamReader(stream)) + loadedSource = reader.ReadToEnd(); + Interlocked.CompareExchange(ref source, loadedSource, null); + } + return ref source; + } + } +} diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/InstanceInitializerTest.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/InstanceInitializerTest.cs new file mode 100644 index 0000000000..8baed00840 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/InstanceInitializerTest.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.CodeAnalyzer.Tests.Helpers; +using Xunit; + +namespace Microsoft.ML.CodeAnalyzer.Tests +{ + public sealed class InstanceInitializerTest : DiagnosticVerifier + { + [Fact] + public void InstanceInitializer() + { + const string test = @" +namespace TestNamespace +{ + class TypeName + { + private int _foo = 5; + private int _bar; + private const int _bizz = 2; + private static int _muck = 4; + private readonly float _blorg = 3.0f; + private string _fooBacking; + public string Foo { get; set => _fooBacking = value; } + public string Bar { get; } = ""Hello""; + public static string Bizz { get; } = ""Nice""; + } +}"; + + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diag = analyzer.SupportedDiagnostics[0]; + + var expected = new DiagnosticResult[] { + diag.CreateDiagnosticResult(5, 21, "_foo", "field"), + diag.CreateDiagnosticResult(9, 32, "_blorg", "field"), + diag.CreateDiagnosticResult(12, 23, "Bar", "property"), + }; + + VerifyCSharpDiagnostic(test, expected); + } + } +} diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Microsoft.ML.CodeAnalyzer.Tests.csproj b/test/Microsoft.ML.CodeAnalyzer.Tests/Microsoft.ML.CodeAnalyzer.Tests.csproj new file mode 100644 index 0000000000..341eb710f2 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Microsoft.ML.CodeAnalyzer.Tests.csproj @@ -0,0 +1,20 @@ + + + netcoreapp2.0 + + + + + + %(RecursiveDir)%(Filename)%(Extension) + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/NameTest.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/NameTest.cs new file mode 100644 index 0000000000..2f87acd01a --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/NameTest.cs @@ -0,0 +1,206 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.CodeAnalyzer.Tests.Helpers; +using Xunit; + +namespace Microsoft.ML.CodeAnalyzer.Tests +{ + public sealed class NameTest : DiagnosticVerifier + { + [Fact] + public void PrivateFieldName() + { + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diag = analyzer.SupportedDiagnostics[0]; + + var expected = new DiagnosticResult[] { + diag.CreateDiagnosticResult(5, 21, "foo"), + diag.CreateDiagnosticResult(7, 24, "_Bubba"), + diag.CreateDiagnosticResult(8, 22, "_shouldParseHTML"), + diag.CreateDiagnosticResult(11, 23, "BillyClub"), + diag.CreateDiagnosticResult(13, 30, "bob"), + diag.CreateDiagnosticResult(14, 30, "CHAZ"), + diag.CreateDiagnosticResult(17, 21, "_liveFromNYC"), + diag.CreateDiagnosticResult(19, 28, "nice"), + }; + + VerifyCSharpDiagnostic(PrivateTestSource, expected); + } + + internal const string PrivateTestSource = @" +namespace TestNamespace +{ + class TypeName + { + private int foo; + private int _bar; + private string _Bubba; + private bool _shouldParseHTML; + private string _who2Call; + float _burgers4babies; + private float BillyClub; + private const string Alice = ""Hello""; + private const string bob = ""Hello""; + private const string CHAZ = ""Hello""; + private const string DEBora = ""Hello""; + private const string _yuck = ""Hello""; + private int _liveFromNYC; + private int _liveFromNYCity; + private static int nice; + } +}"; + + [Fact] + public void MoreNameTests() + { + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diagP = analyzer.SupportedDiagnostics[0]; + var diagG = analyzer.SupportedDiagnostics[1]; + + var expected = new DiagnosticResult[] { + diagG.CreateDiagnosticResult(6, 11, "CLASS"), + diagG.CreateDiagnosticResult(8, 20, "alice"), + diagG.CreateDiagnosticResult(9, 21, "_bob"), + diagG.CreateDiagnosticResult(10, 22, "_chaz"), + diagG.CreateDiagnosticResult(11, 30, "emily"), + diagG.CreateDiagnosticResult(11, 37, "_francis"), + diagG.CreateDiagnosticResult(16, 21, "this_is_not_python"), + diagG.CreateDiagnosticResult(17, 21, "thisIsNotJava"), + diagP.CreateDiagnosticResult(21, 30, "BadEvent"), + diagG.CreateDiagnosticResult(22, 29, "bad_event"), + diagG.CreateDiagnosticResult(25, 30, "_badEv"), + diagG.CreateDiagnosticResult(27, 29, "one"), + diagG.CreateDiagnosticResult(27, 39, "three"), + diagG.CreateDiagnosticResult(28, 22, "enumb"), + diagG.CreateDiagnosticResult(28, 35, "Two_Two"), + diagG.CreateDiagnosticResult(28, 44, "_three"), + diagG.CreateDiagnosticResult(30, 25, "_m2"), + diagG.CreateDiagnosticResult(37, 12, "marco"), + diagG.CreateDiagnosticResult(37, 31, "polo"), + }; + + VerifyCSharpDiagnostic(TestSource, expected); + } + + internal const string TestSource = @" +using System; +namespace silly { } +namespace NotSilly { } +namespace foo.bar.Biz +{ + class CLASS + { + public int alice { get; } + private int _bob { get; } + internal int _chaz; + internal int Debora, emily, _francis; + int _george; + + CLASS() { } + + public void this_is_not_python() { } + public void thisIsNotJava() { } + public void ThisIsCSharp() { } + + private event Action _goodEvent; + private event Action BadEvent; + public event Action bad_event; + public event Action GoodEvent; + private event Action GoodEv { add { } remove { } } + private event Action _badEv { add { } remove { } } + + public enum EnumA { one, Two, three } + private enum enumb { One, Two_Two, _three } + + protected float _m2; + protected float M4; + } + + class A { } + class BeClass { } + + struct marco { public int polo; } +}"; + [Fact] + public void ExternName() + { + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diagP = analyzer.SupportedDiagnostics[0]; + var diagG = analyzer.SupportedDiagnostics[1]; + + const string source = @" +using System; +using System.Runtime.InteropServices; + +namespace TestNamespace +{ + class CLASS + { + + [DllImport(""kernel32.dll"")] + public static extern IntPtr who_run_bartertown(string libraryPath); + + public void masterBlaster() {} + } +} +"; + + var expected = new DiagnosticResult[] { + diagG.CreateDiagnosticResult(6, 11, "CLASS"), + diagG.CreateDiagnosticResult(12, 21, "masterBlaster"), + }; + + VerifyCSharpDiagnostic(source, expected); + } + } + + public sealed class NameFixTest : CodeFixVerifier + { + [Fact] + public void NameFix() + { + VerifyCSharpFix(NameTest.TestSource, FixedTestSource); + } + + private const string FixedTestSource = @"using System; +namespace silly { } +namespace NotSilly { } +namespace foo.bar.Biz +{ + class Class + { + public int Alice { get; } + private int Bob { get; } + internal int Chaz; + internal int Debora, Emily, Francis; + int _george; + + Class() { } + + public void ThisIsNotPython() { } + public void ThisIsNotJava() { } + public void ThisIsCSharp() { } + + private event Action _goodEvent; + private event Action _badEvent; + public event Action BadEvent; + public event Action GoodEvent; + private event Action GoodEv { add { } remove { } } + private event Action BadEv { add { } remove { } } + + public enum EnumA { One, Two, Three } + private enum Enumb { One, TwoTwo, Three } + + protected float M2; + protected float M4; + } + + class A { } + class BeClass { } + + struct Marco { public int Polo; } +}"; + } +} \ No newline at end of file diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/ParameterVariableNameTest.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/ParameterVariableNameTest.cs new file mode 100644 index 0000000000..673ead697d --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/ParameterVariableNameTest.cs @@ -0,0 +1,57 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.CodeAnalyzer.Tests.Helpers; +using Xunit; + +namespace Microsoft.ML.CodeAnalyzer.Tests +{ + public sealed class ParameterVariableNameTest : DiagnosticVerifier + { + [Fact] + public void ParameterVariableName() + { + const string test = @" +using System.Linq; +namespace TestNamespace +{ + public class A + { + public int Albatross, Buttermilk, Coffee; + public A(int Unlimited, int POWER) + { + int foo = -POWER, Tada = Unlimited + POWER; + string FORMAT = $""{Unlimited} + {POWER}""; + int _coolSum = FORMAT.ToCharArray().Sum(CHAR => CHAR + POWER + Buttermilk++); + Albatross = -_coolSum; + } + + public static void B(string Hello, int goodbye, string HelloAgain) + { + int i_think_this_is_python = Hello.Length + goodbye + HelloAgain.Length; + } + } +}"; + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diag = analyzer.SupportedDiagnostics[0]; + + const string param = "parameter"; + const string local = "local variable"; + + var expected = new DiagnosticResult[] { + diag.CreateDiagnosticResult(7, 22, "Unlimited", param), + diag.CreateDiagnosticResult(7, 37, "POWER", param), + diag.CreateDiagnosticResult(9, 31, "Tada", local), + diag.CreateDiagnosticResult(10, 20, "FORMAT", local), + diag.CreateDiagnosticResult(11, 17, "_coolSum", local), + diag.CreateDiagnosticResult(11, 53, "CHAR", param), + diag.CreateDiagnosticResult(15, 37, "Hello", param), + diag.CreateDiagnosticResult(15, 64, "HelloAgain", param), + diag.CreateDiagnosticResult(17, 17, "i_think_this_is_python", local), + }; + + VerifyCSharpDiagnostic(test, expected); + } + } +} diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckAfterFix.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckAfterFix.cs new file mode 100644 index 0000000000..c3e9ecfa31 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckAfterFix.cs @@ -0,0 +1,36 @@ +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using System; +namespace Bubba +{ + public class Foo + { + public Foo(int yuck) { if (false) Contracts.ExceptParam(nameof(yuck)); } + public static void Bar(float tom, Arguments args) + { + string str = "hello"; + Contracts.CheckValue(str, nameof(str)); + Contracts.CheckUserArg(0 <= A.B.Foo && A.B.Foo < 10, nameof(A.B.Foo), "Should be in range[0, 10)"); + Contracts.CheckUserArg(A.B.Bar.Length == 2, nameof(A.B.Bar), "Length must be exactly 2"); + Contracts.CheckUserArg(A.B.Bar.Length == 2, nameof(A), "Length must be exactly 2"); + if (false) throw Contracts.ExceptParam(nameof(A.B.Bar), $"Length should have been 2 but was { A.B.Bar.Length}"); + Func isFive = val => val == 5; + Contracts.CheckParam(!isFive(4), + nameof(isFive)); + Contracts.CheckValue(typeof(X.Y.Z), nameof(X.Y)); + if (false) throw Contracts.ExceptParam(nameof(tom)); + Contracts.CheckValue(str, "noMatch"); + Contracts.CheckUserArg(str.Length == 2, nameof(args.chumble), "Whoa!"); + Contracts.CheckUserArg(str.Length == 2, nameof(args.spuzz), "Git along, little dogies, git along..."); + } + } + public static class A { public static class B { public const int Foo = 5; public const string Bar = "Yo"; } } + public static class X { public static class Y { public static class Z { } } } + public sealed class Arguments + { + [Argument(ArgumentType.AtMostOnce, HelpText = "Yakka foob mog.", ShortName = "chum")] + public int chumble; + [Argument(ArgumentType.AtMostOnce, HelpText = "Grug pubbawup zink wattoom gazork.", ShortName = "spu,sp")] + public int spuzz; + } +} \ No newline at end of file diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckBeforeFix.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckBeforeFix.cs new file mode 100644 index 0000000000..2835c06794 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckBeforeFix.cs @@ -0,0 +1,36 @@ +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using System; +namespace Bubba +{ + public class Foo + { + public Foo(int yuck) { if (false) Contracts.ExceptParam("yuck"); } + public static void Bar(float tom, Arguments args) + { + string str = "hello"; + Contracts.CheckValue(str, "str"); + Contracts.CheckUserArg(0 <= A.B.Foo && A.B.Foo < 10, "Foo", "Should be in range[0, 10)"); + Contracts.CheckUserArg(A.B.Bar.Length == 2, "Bar", "Length must be exactly 2"); + Contracts.CheckUserArg(A.B.Bar.Length == 2, "A", "Length must be exactly 2"); + if (false) throw Contracts.ExceptParam("Bar", $"Length should have been 2 but was { A.B.Bar.Length}"); + Func isFive = val => val == 5; + Contracts.CheckParam(!isFive(4), + "isFive"); + Contracts.CheckValue(typeof(X.Y.Z), "Y"); + if (false) throw Contracts.ExceptParam("tom"); + Contracts.CheckValue(str, "noMatch"); + Contracts.CheckUserArg(str.Length == 2, "chumble", "Whoa!"); + Contracts.CheckUserArg(str.Length == 2, "sp", "Git along, little dogies, git along..."); + } + } + public static class A { public static class B { public const int Foo = 5; public const string Bar = "Yo"; } } + public static class X { public static class Y { public static class Z { } } } + public sealed class Arguments + { + [Argument(ArgumentType.AtMostOnce, HelpText = "Yakka foob mog.", ShortName = "chum")] + public int chumble; + [Argument(ArgumentType.AtMostOnce, HelpText = "Grug pubbawup zink wattoom gazork.", ShortName = "spu,sp")] + public int spuzz; + } +} \ No newline at end of file diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckResource.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckResource.cs new file mode 100644 index 0000000000..0c8ca4f332 --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/Resources/ContractsCheckResource.cs @@ -0,0 +1,59 @@ +// Note that this is *not* an actual source file, it is instead an embedded +// resource for the ContractsCheckTest. It contains both the utilizing test +// code, as well as code for "Contracts" derived from and intended to resemble +// the corresponding code in ML.NET. + +using System; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Model; + +namespace TestNamespace +{ + public sealed class TypeName + { + public TypeName(IHostEnvironment env, float p, int foo) + { + Contracts.CheckValue(env, nameof(env)); + env.CheckParam(0 <= p && p <= 1, nameof(p), "Should be in range [0,1]"); + env.CheckParam(0 <= p && p <= 1, "p"); // Should fail. + env.CheckParam(0 <= p && p <= 1, nameof(p) + nameof(p)); // Should fail. + env.CheckValue(paramName: nameof(p), val: "p"); // Should succeed despite confusing order. + env.CheckValue(paramName: "p", val: nameof(p)); // Should fail despite confusing order. + env.CheckValue("p", nameof(p)); + env.CheckUserArg(foo > 5, "foo", "Nice"); + env.CheckUserArg(foo > 5, nameof(foo), "Nice"); + env.Except(); // Not throwing or doing anything with the exception, so should fail. + Contracts.ExceptParam(nameof(env), "What a silly env"); // Should also fail. + if (false) + throw env.Except(); // Should not fail. + if (false) + throw env.ExceptParam(nameof(env), "What a silly env"); // Should not fail. + if (false) + throw env.ExceptParam("env", "What a silly env"); // Should fail due to name error. + var e = env.Except(); + env.Check(true, $"Hello {foo} is cool"); + env.Check(true, "Hello it is cool"); + string coolMessage = "Hello it is cool"; + env.Check(true, coolMessage); + env.Check(true, string.Format("Hello {0} is cool", foo)); + env.Check(true, Messages.CoolMessage); + env.CheckDecode(true, "Not suspicious, no ModelLoadContext"); + Contracts.Check(true, "Fine: " + nameof(env)); + Contracts.Check(true, "Less fine: " + env.GetType().Name); + Contracts.CheckUserArg(0 <= p && p <= 1, + "p", "On a new line"); + } + + private void Loader(ModelLoadContext ctx) + { + Contracts.CheckDecode(true, "This message is suspicious"); + } + + private Exception CreateException() => Contracts.Except(); // This should be fine, since it's a return value not a standalone. + } + + public static class Messages + { + public const string CoolMessage = "This is super cool"; + } +} diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/SingleVariableDeclarationTest.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/SingleVariableDeclarationTest.cs new file mode 100644 index 0000000000..add947f5dd --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/SingleVariableDeclarationTest.cs @@ -0,0 +1,49 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.CodeAnalyzer.Tests.Helpers; +using Xunit; + +namespace Microsoft.ML.CodeAnalyzer.Tests +{ + public sealed class SingleVariableDeclarationTest : DiagnosticVerifier + { + [Fact] + public void SingleVariableDeclaration() + { + const string test = @" +namespace TestNamespace +{ + class TypeName + { + int a, b, c; + int d; + int e, f; + + public TypeName(int g, int h) + { + a = b = g; + c = d = h; + int i = 2; + for (int j = 0, k = i; j < k; ++j) + { + int l = j, m = k; + } + } + } +}"; + + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diag = analyzer.SupportedDiagnostics[0]; + + var expected = new DiagnosticResult[] { + diag.CreateDiagnosticResult(5, 9, "a', 'b', 'c"), + diag.CreateDiagnosticResult(7, 9, "e', 'f"), + diag.CreateDiagnosticResult(16, 17, "l', 'm"), + }; + + VerifyCSharpDiagnostic(test, expected); + } + } +} diff --git a/test/Microsoft.ML.CodeAnalyzer.Tests/TypeParamNameTest.cs b/test/Microsoft.ML.CodeAnalyzer.Tests/TypeParamNameTest.cs new file mode 100644 index 0000000000..b9de9bf42f --- /dev/null +++ b/test/Microsoft.ML.CodeAnalyzer.Tests/TypeParamNameTest.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.CodeAnalyzer.Tests.Helpers; +using Xunit; + +namespace Microsoft.ML.CodeAnalyzer.Tests +{ + public sealed class TypeParamNameTest : DiagnosticVerifier + { + [Fact] + public void TypeParamName() + { + const string test = @" +namespace TestNamespace +{ + interface IAlice {} + interface IBob : IAlice {} + interface IChaz : IAlice, Tom> {} + + public class Foo + { + public static void Bar() {} + } +}"; + var analyzer = GetCSharpDiagnosticAnalyzer(); + var diag = analyzer.SupportedDiagnostics[0]; + + var expected = new DiagnosticResult[] { + diag.CreateDiagnosticResult(3, 26, "hello"), + diag.CreateDiagnosticResult(5, 21, "Tom"), + diag.CreateDiagnosticResult(7, 22, "mytype"), + diag.CreateDiagnosticResult(9, 32, "YourType"), + }; + + VerifyCSharpDiagnostic(test, expected); + } + } +} diff --git a/test/Microsoft.ML.Core.Tests/Microsoft.ML.Core.Tests.csproj b/test/Microsoft.ML.Core.Tests/Microsoft.ML.Core.Tests.csproj index 9f38858721..ea92975b35 100644 --- a/test/Microsoft.ML.Core.Tests/Microsoft.ML.Core.Tests.csproj +++ b/test/Microsoft.ML.Core.Tests/Microsoft.ML.Core.Tests.csproj @@ -8,7 +8,10 @@ + + + @@ -20,6 +23,7 @@ + \ No newline at end of file diff --git a/test/Microsoft.ML.Core.Tests/UnitTests/TestCSharpApi.cs b/test/Microsoft.ML.Core.Tests/UnitTests/TestCSharpApi.cs index b42dee2d52..34922a4ab1 100644 --- a/test/Microsoft.ML.Core.Tests/UnitTests/TestCSharpApi.cs +++ b/test/Microsoft.ML.Core.Tests/UnitTests/TestCSharpApi.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; using System.Linq; using Microsoft.ML.Data; using Microsoft.ML.Runtime.Data; @@ -262,7 +263,7 @@ public void TestCrossValidationBinaryMacro() [Fact] public void TestCrossValidationMacro() { - var dataPath = GetDataPath(TestDatasets.winequality.trainFilename); + var dataPath = GetDataPath(TestDatasets.winequalitymacro.trainFilename); using (var env = new TlcEnvironment(42)) { var subGraph = env.CreateExperiment(); @@ -303,14 +304,14 @@ public void TestCrossValidationMacro() { Name = "Label", Source = new [] { new TextLoaderRange(11) }, - Type = DataKind.Num + Type = ML.Data.DataKind.Num }, new TextLoaderColumn() { Name = "Features", Source = new [] { new TextLoaderRange(0,10) }, - Type = DataKind.Num + Type = ML.Data.DataKind.Num } } } @@ -372,9 +373,9 @@ public void TestCrossValidationMacro() foldGetter(ref fold); Assert.True(fold.EqualsStr("Standard Deviation")); if (w == 1) - Assert.Equal(0.002827, stdev, 6); + Assert.Equal(0.004557, stdev, 6); else - Assert.Equal(0.002376, stdev, 6); + Assert.Equal(0.000393, stdev, 6); isWeightedGetter(ref isWeighted); Assert.True(isWeighted.IsTrue == (w == 1)); } @@ -528,6 +529,89 @@ public void TestCrossValidationMacroWithMultiClass() } Assert.Equal(0, rowCount); } + + var warnings = experiment.GetOutput(crossValidateOutput.Warnings); + using (var cursor = warnings.GetRowCursor(col => true)) + Assert.False(cursor.MoveNext()); + } + } + + [Fact] + public void TestCrossValidationMacroMultiClassWithWarnings() + { + var dataPath = GetDataPath(@"Train-Tiny-28x28.txt"); + using (var env = new TlcEnvironment(42)) + { + var subGraph = env.CreateExperiment(); + + var nop = new ML.Transforms.NoOperation(); + var nopOutput = subGraph.Add(nop); + + var learnerInput = new ML.Trainers.LogisticRegressionClassifier + { + TrainingData = nopOutput.OutputData, + NumThreads = 1 + }; + var learnerOutput = subGraph.Add(learnerInput); + + var experiment = env.CreateExperiment(); + var importInput = new ML.Data.TextLoader(dataPath); + var importOutput = experiment.Add(importInput); + + var filter = new ML.Transforms.RowRangeFilter(); + filter.Data = importOutput.Data; + filter.Column = "Label"; + filter.Min = 0; + filter.Max = 5; + var filterOutput = experiment.Add(filter); + + var term = new ML.Transforms.TextToKeyConverter(); + term.Column = new[] + { + new ML.Transforms.TermTransformColumn() + { + Source = "Label", Name = "Strat", Sort = ML.Transforms.TermTransformSortOrder.Value + } + }; + term.Data = filterOutput.OutputData; + var termOutput = experiment.Add(term); + + var crossValidate = new ML.Models.CrossValidator + { + Data = termOutput.OutputData, + Nodes = subGraph, + Kind = ML.Models.MacroUtilsTrainerKinds.SignatureMultiClassClassifierTrainer, + TransformModel = null, + StratificationColumn = "Strat" + }; + crossValidate.Inputs.Data = nop.Data; + crossValidate.Outputs.PredictorModel = learnerOutput.PredictorModel; + var crossValidateOutput = experiment.Add(crossValidate); + + experiment.Compile(); + importInput.SetInput(env, experiment); + experiment.Run(); + var warnings = experiment.GetOutput(crossValidateOutput.Warnings); + + var schema = warnings.Schema; + var b = schema.TryGetColumnIndex("WarningText", out int warningCol); + Assert.True(b); + using (var cursor = warnings.GetRowCursor(col => col == warningCol)) + { + var getter = cursor.GetGetter(warningCol); + + b = cursor.MoveNext(); + Assert.True(b); + var warning = default(DvText); + getter(ref warning); + Assert.Contains("test instances with class values not seen in the training set.", warning.ToString()); + b = cursor.MoveNext(); + Assert.True(b); + getter(ref warning); + Assert.Contains("Detected columns of variable length: SortedScores, SortedClasses", warning.ToString()); + b = cursor.MoveNext(); + Assert.False(b); + } } } @@ -666,7 +750,7 @@ public void TestCrossValidationMacroWithNonDefaultNames() importInput.Arguments.Column = new TextLoaderColumn[] { new TextLoaderColumn { Name = "Label", Source = new[] { new TextLoaderRange(0) } }, - new TextLoaderColumn { Name = "Workclass", Source = new[] { new TextLoaderRange(1) }, Type = DataKind.Text }, + new TextLoaderColumn { Name = "Workclass", Source = new[] { new TextLoaderRange(1) }, Type = ML.Data.DataKind.Text }, new TextLoaderColumn { Name = "Features", Source = new[] { new TextLoaderRange(9, 14) } } }; var importOutput = experiment.Add(importInput); @@ -678,6 +762,7 @@ public void TestCrossValidationMacroWithNonDefaultNames() TransformModel = null, LabelColumn = "Label1", GroupColumn = "GroupId1", + NameColumn = "Workclass", Kind = Models.MacroUtilsTrainerKinds.SignatureRankerTrainer }; crossValidate.Inputs.Data = textToKey.Data; @@ -714,9 +799,9 @@ public void TestCrossValidationMacroWithNonDefaultNames() getter(ref stdev); foldGetter(ref fold); Assert.True(fold.EqualsStr("Standard Deviation")); - Assert.Equal(5.247, stdev.Values[0], 3); - Assert.Equal(4.703, stdev.Values[1], 3); - Assert.Equal(3.844, stdev.Values[2], 3); + Assert.Equal(2.462, stdev.Values[0], 3); + Assert.Equal(2.763, stdev.Values[1], 3); + Assert.Equal(3.273, stdev.Values[2], 3); var sumBldr = new BufferBuilder(R8Adder.Instance); sumBldr.Reset(avg.Length, true); @@ -737,6 +822,21 @@ public void TestCrossValidationMacroWithNonDefaultNames() b = cursor.MoveNext(); Assert.False(b); } + + data = experiment.GetOutput(crossValidateOutput.PerInstanceMetrics); + Assert.True(data.Schema.TryGetColumnIndex("Instance", out int nameCol)); + using (var cursor = data.GetRowCursor(col => col == nameCol)) + { + var getter = cursor.GetGetter(nameCol); + while (cursor.MoveNext()) + { + DvText name = default; + getter(ref name); + Assert.Subset(new HashSet() { new DvText("Private"), new DvText("?"), new DvText("Federal-gov") }, new HashSet() { name }); + if (cursor.Position > 4) + break; + } + } } } @@ -798,5 +898,64 @@ public void TestOvaMacro() } } } + + [Fact] + public void TestOvaMacroWithUncalibratedLearner() + { + var dataPath = GetDataPath(@"iris.txt"); + using (var env = new TlcEnvironment(42)) + { + // Specify subgraph for OVA + var subGraph = env.CreateExperiment(); + var learnerInput = new Trainers.AveragedPerceptronBinaryClassifier { Shuffle = false }; + var learnerOutput = subGraph.Add(learnerInput); + // Create pipeline with OVA and multiclass scoring. + var experiment = env.CreateExperiment(); + var importInput = new ML.Data.TextLoader(dataPath); + importInput.Arguments.Column = new TextLoaderColumn[] + { + new TextLoaderColumn { Name = "Label", Source = new[] { new TextLoaderRange(0) } }, + new TextLoaderColumn { Name = "Features", Source = new[] { new TextLoaderRange(1,4) } } + }; + var importOutput = experiment.Add(importInput); + var oneVersusAll = new Models.OneVersusAll + { + TrainingData = importOutput.Data, + Nodes = subGraph, + UseProbabilities = true, + }; + var ovaOutput = experiment.Add(oneVersusAll); + var scoreInput = new ML.Transforms.DatasetScorer + { + Data = importOutput.Data, + PredictorModel = ovaOutput.PredictorModel + }; + var scoreOutput = experiment.Add(scoreInput); + var evalInput = new ML.Models.ClassificationEvaluator + { + Data = scoreOutput.ScoredData + }; + var evalOutput = experiment.Add(evalInput); + experiment.Compile(); + experiment.SetInput(importInput.InputFile, new SimpleFileHandle(env, dataPath, false, false)); + experiment.Run(); + + var data = experiment.GetOutput(evalOutput.OverallMetrics); + var schema = data.Schema; + var b = schema.TryGetColumnIndex(MultiClassClassifierEvaluator.AccuracyMacro, out int accCol); + Assert.True(b); + using (var cursor = data.GetRowCursor(col => col == accCol)) + { + var getter = cursor.GetGetter(accCol); + b = cursor.MoveNext(); + Assert.True(b); + double acc = 0; + getter(ref acc); + Assert.Equal(0.71, acc, 2); + b = cursor.MoveNext(); + Assert.False(b); + } + } + } } } diff --git a/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs b/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs index 60e79a943d..b0bc269164 100644 --- a/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs +++ b/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs @@ -6,16 +6,20 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using Microsoft.ML.Runtime.Api; using Microsoft.ML.Runtime.Core.Tests.UnitTests; using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.Data.IO; +using Microsoft.ML.Runtime.Ensemble.OutputCombiners; using Microsoft.ML.Runtime.EntryPoints; using Microsoft.ML.Runtime.EntryPoints.JsonUtils; using Microsoft.ML.Runtime.FastTree; +using Microsoft.ML.Runtime.Internal.Calibration; using Microsoft.ML.Runtime.Internal.Utilities; using Microsoft.ML.Runtime.Learners; using Microsoft.ML.Runtime.PCA; +using Microsoft.ML.Runtime.TextAnalytics; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Xunit; @@ -29,69 +33,41 @@ public TestEntryPoints(ITestOutputHelper output) : base(output) { } - [Fact] - public void EntryPointTrainTestSplit() + private IDataView GetBreastCancerDataView() { var dataPath = GetDataPath("breast-cancer.txt"); var inputFile = new SimpleFileHandle(Env, dataPath, false, false); - /*var dataView = ImportTextData.ImportText(Env, new ImportTextData.Input - { InputFile = inputFile, CustomSchema = "col=Label:0 col=Features:TX:1-9" }).Data;*/ - - var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() + return ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() { Arguments = { - SeparatorChars = new []{',' }, - HasHeader = true, Column = new[] { new TextLoader.Column() { Name = "Label", Source = new [] { new TextLoader.Range() { Min = 0, Max = 0} }, - Type = Runtime.Data.DataKind.Text + Type = Runtime.Data.DataKind.R4 }, new TextLoader.Column() { Name = "Features", Source = new [] { new TextLoader.Range() { Min = 1, Max = 9} }, - Type = Runtime.Data.DataKind.Text + Type = Runtime.Data.DataKind.R4 } } }, InputFile = inputFile }).Data; - - var splitOutput = TrainTestSplit.Split(Env, new TrainTestSplit.Input { Data = dataView, Fraction = 0.9f }); - - int totalRows = CountRows(dataView); - int trainRows = CountRows(splitOutput.TrainData); - int testRows = CountRows(splitOutput.TestData); - - Assert.Equal(totalRows, trainRows + testRows); - Assert.Equal(0.9, (double)trainRows / totalRows, 1); } - private static int CountRows(IDataView dataView) - { - int totalRows = 0; - using (var cursor = dataView.GetRowCursor(col => false)) - { - while (cursor.MoveNext()) - totalRows++; - } - - return totalRows; - } - - [Fact()] - public void EntryPointFeatureCombiner() + private IDataView GetBreastCancerDataviewWithTextColumns() { var dataPath = GetDataPath("breast-cancer.txt"); var inputFile = new SimpleFileHandle(Env, dataPath, false, false); - var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() + return ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() { Arguments = { @@ -128,6 +104,39 @@ public void EntryPointFeatureCombiner() InputFile = inputFile }).Data; + } + + + [Fact] + public void EntryPointTrainTestSplit() + { + var dataView = GetBreastCancerDataView(); + var splitOutput = TrainTestSplit.Split(Env, new TrainTestSplit.Input { Data = dataView, Fraction = 0.9f }); + + int totalRows = CountRows(dataView); + int trainRows = CountRows(splitOutput.TrainData); + int testRows = CountRows(splitOutput.TestData); + + Assert.Equal(totalRows, trainRows + testRows); + Assert.Equal(0.9, (double)trainRows / totalRows, 1); + } + + private static int CountRows(IDataView dataView) + { + int totalRows = 0; + using (var cursor = dataView.GetRowCursor(col => false)) + { + while (cursor.MoveNext()) + totalRows++; + } + + return totalRows; + } + + [Fact()] + public void EntryPointFeatureCombiner() + { + var dataView = GetBreastCancerDataviewWithTextColumns(); dataView = Env.CreateTransform("Term{col=F1}", dataView); var result = FeatureCombiner.PrepareFeatures(Env, new FeatureCombiner.FeatureCombinerInput() { Data = dataView, Features = new[] { "F1", "F2", "Rest" } }).OutputData; @@ -146,48 +155,8 @@ public void EntryPointFeatureCombiner() [Fact] public void EntryPointScoring() { - var dataPath = GetDataPath("breast-cancer.txt"); - var inputFile = new SimpleFileHandle(Env, dataPath, false, false); - var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() - { - Arguments = - { - HasHeader = true, - Column = new[] - { - new TextLoader.Column() - { - Name = "Label", - Source = new [] { new TextLoader.Range() { Min = 0, Max = 0} } - }, - - new TextLoader.Column() - { - Name = "F1", - Source = new [] { new TextLoader.Range() { Min = 1, Max = 1} }, - Type = Runtime.Data.DataKind.Text - }, - - new TextLoader.Column() - { - Name = "F2", - Source = new [] { new TextLoader.Range() { Min = 2, Max = 2} }, - Type = Runtime.Data.DataKind.I4 - }, - - new TextLoader.Column() - { - Name = "Rest", - Source = new [] { new TextLoader.Range() { Min = 3, Max = 9} } - } - } - }, - - InputFile = inputFile - }).Data; - + var dataView = GetBreastCancerDataviewWithTextColumns(); dataView = Env.CreateTransform("Term{col=F1}", dataView); - var trainData = FeatureCombiner.PrepareFeatures(Env, new FeatureCombiner.FeatureCombinerInput() { Data = dataView, Features = new[] { "F1", "F2", "Rest" } }); var lrModel = LogisticRegression.TrainBinary(Env, new LogisticRegression.Arguments { TrainingData = trainData.OutputData }).PredictorModel; var model = ModelOperations.CombineTwoModels(Env, new ModelOperations.SimplePredictorModelInput() { TransformModel = trainData.Model, PredictorModel = lrModel }).PredictorModel; @@ -206,45 +175,7 @@ public void EntryPointScoring() [Fact] public void EntryPointApplyModel() { - var dataPath = GetDataPath("breast-cancer.txt"); - var inputFile = new SimpleFileHandle(Env, dataPath, false, false); - var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() - { - Arguments = - { - HasHeader = true, - Column = new[] - { - new TextLoader.Column() - { - Name = "Label", - Source = new [] { new TextLoader.Range() { Min = 0, Max = 0} }, - }, - - new TextLoader.Column() - { - Name = "F1", - Source = new [] { new TextLoader.Range() { Min = 1, Max = 1} }, - Type = Runtime.Data.DataKind.Text - }, - - new TextLoader.Column() - { - Name = "F2", - Source = new [] { new TextLoader.Range() { Min = 2, Max = 2} }, - Type = Runtime.Data.DataKind.I4 - }, - - new TextLoader.Column() - { - Name = "Rest", - Source = new [] { new TextLoader.Range() { Min = 3, Max = 9} } - } - } - }, - - InputFile = inputFile - }).Data; + var dataView = GetBreastCancerDataviewWithTextColumns(); dataView = Env.CreateTransform("Term{col=F1}", dataView); @@ -258,50 +189,7 @@ public void EntryPointApplyModel() [Fact] public void EntryPointCaching() { - var dataPath = GetDataPath("breast-cancer.txt"); - var inputFile = new SimpleFileHandle(Env, dataPath, false, false); - /*var dataView = ImportTextData.ImportText(Env, new ImportTextData.Input { InputFile = inputFile, - CustomSchema = "col=Label:0 col=F1:TX:1 col=F2:I4:2 col=Rest:3-9" }).Data; - */ - - var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() - { - Arguments = - { - SeparatorChars = new []{',' }, - HasHeader = true, - Column = new[] - { - new TextLoader.Column() - { - Name = "Label", - Source = new [] { new TextLoader.Range() { Min = 0, Max = 0} } - }, - - new TextLoader.Column() - { - Name = "F1", - Source = new [] { new TextLoader.Range() { Min = 1, Max = 1} }, - Type = Runtime.Data.DataKind.Text - }, - - new TextLoader.Column() - { - Name = "F2", - Source = new [] { new TextLoader.Range() { Min = 2, Max = 2} }, - Type = Runtime.Data.DataKind.I4 - }, - - new TextLoader.Column() - { - Name = "Rest", - Source = new [] { new TextLoader.Range() { Min = 3, Max = 9} } - } - } - }, - - InputFile = inputFile - }).Data; + var dataView = GetBreastCancerDataviewWithTextColumns(); dataView = Env.CreateTransform("Term{col=F1}", dataView); @@ -387,13 +275,31 @@ public void EntryPointCatalog() var entryPointsSubDir = Path.Combine("..", "Common", "EntryPoints"); var catalog = ModuleCatalog.CreateInstance(Env); var path = DeleteOutputPath(entryPointsSubDir, epListFile); + + var regex = new Regex(@"\r\n?|\n", RegexOptions.Compiled); File.WriteAllLines(path, catalog.AllEntryPoints() - .Select(x => string.Join("\t", x.Name, x.Description, x.Method.DeclaringType, x.Method.Name, x.InputType, x.OutputType).Replace(Environment.NewLine, "\\n ")) + .Select(x => string.Join("\t", + x.Name, + regex.Replace(x.Description, ""), + x.Method.DeclaringType, + x.Method.Name, + x.InputType, + x.OutputType) + .Replace(Environment.NewLine, "")) .OrderBy(x => x)); CheckEquality(entryPointsSubDir, epListFile); var jObj = JsonManifestUtils.BuildAllManifests(Env, catalog); + + //clean up the description from the new line characters + if (jObj[FieldNames.TopEntryPoints] != null && jObj[FieldNames.TopEntryPoints] is JArray) + { + foreach (JToken entry in jObj[FieldNames.TopEntryPoints].Children()) + if (entry[FieldNames.Desc] != null) + entry[FieldNames.Desc] = regex.Replace(entry[FieldNames.Desc].ToString(), ""); + } + var jPath = DeleteOutputPath(entryPointsSubDir, manifestFile); using (var file = File.OpenWrite(jPath)) using (var writer = new StreamWriter(file)) @@ -423,12 +329,12 @@ public void EntryPointInputBuilderOptionals() ib1.TrySetValue("WeightColumn", "OtherWeight"); Assert.True(instance.WeightColumn.IsExplicit); - Assert.True(string.Compare(instance.WeightColumn.Value, "OtherWeight") == 0); + Assert.Equal("OtherWeight", instance.WeightColumn.Value); var tok = (JToken)JValue.CreateString("AnotherWeight"); ib1.TrySetValueJson("WeightColumn", tok); Assert.True(instance.WeightColumn.IsExplicit); - Assert.True(string.Compare(instance.WeightColumn.Value, "AnotherWeight") == 0); + Assert.Equal("AnotherWeight", instance.WeightColumn.Value); } [Fact] @@ -480,6 +386,128 @@ public void EntryPointInputArgsChecks() EntryPointUtils.CheckInputArgs(Env, input); } + [Fact] + public void EntryPointCreateEnsemble() + { + var dataView = GetBreastCancerDataView(); + const int nModels = 5; + var splitOutput = CVSplit.Split(Env, new CVSplit.Input { Data = dataView, NumFolds = nModels + 1 }); + var predictorModels = new IPredictorModel[nModels]; + var individualScores = new IDataView[nModels]; + for (int i = 0; i < nModels; i++) + { + var data = splitOutput.TrainData[i]; + var lrInput = new LogisticRegression.Arguments + { + TrainingData = data, + L1Weight = (Single)0.1 * i, + L2Weight = (Single)0.01 * (1 + i), + NormalizeFeatures = NormalizeOption.No + }; + predictorModels[i] = LogisticRegression.TrainBinary(Env, lrInput).PredictorModel; + individualScores[i] = + ScoreModel.Score(Env, + new ScoreModel.Input { Data = splitOutput.TestData[nModels], PredictorModel = predictorModels[i] }) + .ScoredData; + + individualScores[i] = new CopyColumnsTransform(Env, + new CopyColumnsTransform.Arguments() + { + Column = new[] + { + new CopyColumnsTransform.Column() + { + Name = MetadataUtils.Const.ScoreValueKind.Score + i, + Source = MetadataUtils.Const.ScoreValueKind.Score + }, + } + }, individualScores[i]); + individualScores[i] = new DropColumnsTransform(Env, + new DropColumnsTransform.Arguments() { Column = new[] { MetadataUtils.Const.ScoreValueKind.Score } }, + individualScores[i]); + } + + var avgEnsembleInput = new EnsembleCreator.ClassifierInput { Models = predictorModels, ModelCombiner = EnsembleCreator.ClassifierCombiner.Average }; + var avgEnsemble = EnsembleCreator.CreateBinaryEnsemble(Env, avgEnsembleInput).PredictorModel; + var avgScored = + ScoreModel.Score(Env, + new ScoreModel.Input { Data = splitOutput.TestData[nModels], PredictorModel = avgEnsemble }).ScoredData; + + var medEnsembleInput = new EnsembleCreator.ClassifierInput { Models = predictorModels }; + var medEnsemble = EnsembleCreator.CreateBinaryEnsemble(Env, medEnsembleInput).PredictorModel; + var medScored = + ScoreModel.Score(Env, + new ScoreModel.Input { Data = splitOutput.TestData[nModels], PredictorModel = medEnsemble }).ScoredData; + + var regEnsembleInput = new EnsembleCreator.RegressionInput() { Models = predictorModels }; + var regEnsemble = EnsembleCreator.CreateRegressionEnsemble(Env, regEnsembleInput).PredictorModel; + var regScored = + ScoreModel.Score(Env, + new ScoreModel.Input { Data = splitOutput.TestData[nModels], PredictorModel = regEnsemble }).ScoredData; + + var zippedScores = ZipDataView.Create(Env, individualScores); + + var avgComb = new Average(Env).GetCombiner(); + var medComb = new Median(Env).GetCombiner(); + using (var curs1 = avgScored.GetRowCursor(col => true)) + using (var curs2 = medScored.GetRowCursor(col => true)) + using (var curs3 = regScored.GetRowCursor(col => true)) + using (var curs4 = zippedScores.GetRowCursor(col => true)) + { + var found = curs1.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out int scoreCol); + Assert.True(found); + var avgScoreGetter = curs1.GetGetter(scoreCol); + + found = curs2.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out scoreCol); + Assert.True(found); + var medScoreGetter = curs2.GetGetter(scoreCol); + + found = curs3.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out scoreCol); + Assert.True(found); + var regScoreGetter = curs3.GetGetter(scoreCol); + + var individualScoreGetters = new ValueGetter[nModels]; + for (int i = 0; i < nModels; i++) + { + curs4.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score + i, out scoreCol); + individualScoreGetters[i] = curs4.GetGetter(scoreCol); + } + + var scoreBuffer = new Single[nModels]; + while (curs1.MoveNext()) + { + var move = curs2.MoveNext(); + Assert.True(move); + move = curs3.MoveNext(); + Assert.True(move); + move = curs4.MoveNext(); + Assert.True(move); + + Single score = 0; + avgScoreGetter(ref score); + for (int i = 0; i < nModels; i++) + individualScoreGetters[i](ref scoreBuffer[i]); + Single avgScore = 0; + avgComb(ref avgScore, scoreBuffer, null); + Assert.Equal(score, avgScore); + + medScoreGetter(ref score); + Single medScore = 0; + medComb(ref medScore, scoreBuffer, null); + Assert.Equal(score, medScore); + + regScoreGetter(ref score); + Assert.Equal(score, medScore); + } + var moved = curs2.MoveNext(); + Assert.False(moved); + moved = curs3.MoveNext(); + Assert.False(moved); + moved = curs4.MoveNext(); + Assert.False(moved); + } + } + [Fact] public void EntryPointOptionalParams() { @@ -629,46 +657,675 @@ public void EntryPointExecGraphCommand() // Assert.NotNull(model); //} - //[Fact] - //public void EntryPointCalibrate() - //{ - // var dataPath = GetDataPath("breast-cancer.txt"); - // var inputFile = new SimpleFileHandle(Env, dataPath, false, false); - // var dataView = ImportTextData.ImportText(Env, new ImportTextData.Input { InputFile = inputFile, CustomSchema = "col=Label:0 col=Features:1-9" }).Data; - - // var splitOutput = CVSplit.Split(Env, new CVSplit.Input { Data = dataView, NumFolds = 3 }); - - // var lrModel = LogisticRegression.TrainBinary(Env, new LogisticRegression.Arguments { TrainingData = splitOutput.TestData[0] }).PredictorModel; - // var calibratedLrModel = Calibrate.FixedPlatt(Env, - // new Calibrate.FixedPlattInput { Data = splitOutput.TestData[1], UncalibratedPredictorModel = lrModel }).PredictorModel; - - // var scored1 = ScoreModel.Score(Env, new ScoreModel.Input() { Data = splitOutput.TestData[2], PredictorModel = lrModel }).ScoredData; - // scored1 = ScoreModel.SelectColumns(Env, new ScoreModel.ScoreColumnSelectorInput() { Data = scored1, ExtraColumns = new[] { "Label" } }).OutputData; - - // var scored2 = ScoreModel.Score(Env, new ScoreModel.Input() { Data = splitOutput.TestData[2], PredictorModel = calibratedLrModel }).ScoredData; - // scored2 = ScoreModel.SelectColumns(Env, new ScoreModel.ScoreColumnSelectorInput() { Data = scored2, ExtraColumns = new[] { "Label" } }).OutputData; - - // Assert.Equal(4, scored1.Schema.ColumnCount); - // CheckSameValues(scored1, scored2); - - // var input = new Calibrate.NoArgumentsInput() { Data = splitOutput.TestData[1], UncalibratedPredictorModel = lrModel }; - // calibratedLrModel = Calibrate.Platt(Env, input).PredictorModel; - // calibratedLrModel = Calibrate.Naive(Env, input).PredictorModel; - // calibratedLrModel = Calibrate.Pav(Env, input).PredictorModel; - - // // This tests that the SchemaBindableCalibratedPredictor doesn't get confused if its sub-predictor is already calibrated. - // var fastForest = new FastForestClassification(Env, new FastForestClassification.Arguments()); - // var rmd = RoleMappedData.Create(splitOutput.TrainData[0], - // RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Feature, "Features"), - // RoleMappedSchema.CreatePair(RoleMappedSchema.ColumnRole.Label, "Label")); - // fastForest.Train(rmd); - // var ffModel = new PredictorModel(Env, rmd, splitOutput.TrainData[0], fastForest.CreatePredictor()); - // var calibratedFfModel = Calibrate.Platt(Env, - // new Calibrate.NoArgumentsInput() { Data = splitOutput.TestData[0], UncalibratedPredictorModel = ffModel }).PredictorModel; - // var twiceCalibratedFfModel = Calibrate.Platt(Env, - // new Calibrate.NoArgumentsInput() { Data = splitOutput.TestData[0], UncalibratedPredictorModel = calibratedFfModel }).PredictorModel; - // var scoredFf = ScoreModel.Score(Env, new ScoreModel.Input() { Data = splitOutput.TestData[2], PredictorModel = twiceCalibratedFfModel }).ScoredData; - //} + [Fact] + public void EntryPointCalibrate() + { + var dataView = GetBreastCancerDataView(); + + var splitOutput = CVSplit.Split(Env, new CVSplit.Input { Data = dataView, NumFolds = 3 }); + + var lrModel = LogisticRegression.TrainBinary(Env, new LogisticRegression.Arguments { TrainingData = splitOutput.TestData[0] }).PredictorModel; + var calibratedLrModel = Calibrate.FixedPlatt(Env, + new Calibrate.FixedPlattInput { Data = splitOutput.TestData[1], UncalibratedPredictorModel = lrModel }).PredictorModel; + + var scored1 = ScoreModel.Score(Env, new ScoreModel.Input() { Data = splitOutput.TestData[2], PredictorModel = lrModel }).ScoredData; + scored1 = ScoreModel.SelectColumns(Env, new ScoreModel.ScoreColumnSelectorInput() { Data = scored1, ExtraColumns = new[] { "Label" } }).OutputData; + + var scored2 = ScoreModel.Score(Env, new ScoreModel.Input() { Data = splitOutput.TestData[2], PredictorModel = calibratedLrModel }).ScoredData; + scored2 = ScoreModel.SelectColumns(Env, new ScoreModel.ScoreColumnSelectorInput() { Data = scored2, ExtraColumns = new[] { "Label" } }).OutputData; + + Assert.Equal(4, scored1.Schema.ColumnCount); + CheckSameValues(scored1, scored2); + + var input = new Calibrate.NoArgumentsInput() { Data = splitOutput.TestData[1], UncalibratedPredictorModel = lrModel }; + calibratedLrModel = Calibrate.Platt(Env, input).PredictorModel; + calibratedLrModel = Calibrate.Naive(Env, input).PredictorModel; + calibratedLrModel = Calibrate.Pav(Env, input).PredictorModel; + + // This tests that the SchemaBindableCalibratedPredictor doesn't get confused if its sub-predictor is already calibrated. + var fastForest = new FastForestClassification(Env, new FastForestClassification.Arguments()); + var rmd = new RoleMappedData(splitOutput.TrainData[0], "Label", "Features"); + var ffModel = new PredictorModel(Env, rmd, splitOutput.TrainData[0], fastForest.Train(rmd)); + var calibratedFfModel = Calibrate.Platt(Env, + new Calibrate.NoArgumentsInput() { Data = splitOutput.TestData[0], UncalibratedPredictorModel = ffModel }).PredictorModel; + var twiceCalibratedFfModel = Calibrate.Platt(Env, + new Calibrate.NoArgumentsInput() { Data = splitOutput.TestData[0], UncalibratedPredictorModel = calibratedFfModel }).PredictorModel; + var scoredFf = ScoreModel.Score(Env, new ScoreModel.Input() { Data = splitOutput.TestData[2], PredictorModel = twiceCalibratedFfModel }).ScoredData; + } + + + [Fact] + public void EntryPointPipelineEnsemble() + { + var dataView = GetBreastCancerDataView(); + const int nModels = 5; + var splitOutput = CVSplit.Split(Env, new CVSplit.Input { Data = dataView, NumFolds = nModels + 1 }); + var predictorModels = new IPredictorModel[nModels]; + var individualScores = new IDataView[nModels]; + for (int i = 0; i < nModels; i++) + { + var data = splitOutput.TrainData[i]; + data = new RffTransform(Env, new RffTransform.Arguments() + { + Column = new[] + { + new RffTransform.Column() {Name = "Features1", Source = "Features"}, + new RffTransform.Column() {Name = "Features2", Source = "Features"}, + }, + NewDim = 10, + UseSin = false + }, data); + data = new ConcatTransform(Env, new ConcatTransform.Arguments() + { + Column = new[] { new ConcatTransform.Column() { Name = "Features", Source = new[] { "Features1", "Features2" } } } + }, data); + + data = new TermTransform(Env, new TermTransform.Arguments() + { + Column = new[] + { + new TermTransform.Column() + { + Name = "Label", + Source = "Label", + Sort = TermTransform.SortOrder.Value + } + } + }, data); + + var lrInput = new LogisticRegression.Arguments + { + TrainingData = data, + L1Weight = (Single)0.1 * i, + L2Weight = (Single)0.01 * (1 + i), + NormalizeFeatures = NormalizeOption.Yes + }; + predictorModels[i] = LogisticRegression.TrainBinary(Env, lrInput).PredictorModel; + var transformModel = new TransformModel(Env, data, splitOutput.TrainData[i]); + + predictorModels[i] = ModelOperations.CombineTwoModels(Env, + new ModelOperations.SimplePredictorModelInput() + { PredictorModel = predictorModels[i], TransformModel = transformModel }).PredictorModel; + + individualScores[i] = + ScoreModel.Score(Env, + new ScoreModel.Input { Data = splitOutput.TestData[nModels], PredictorModel = predictorModels[i] }) + .ScoredData; + } + + var binaryEnsembleModel = EnsembleCreator.CreateBinaryPipelineEnsemble(Env, + new EnsembleCreator.PipelineClassifierInput() + { + ModelCombiner = EntryPoints.EnsembleCreator.ClassifierCombiner.Average, + Models = predictorModels + }).PredictorModel; + var binaryEnsembleCalibrated = Calibrate.Platt(Env, + new Calibrate.NoArgumentsInput() + { + Data = splitOutput.TestData[nModels], + UncalibratedPredictorModel = binaryEnsembleModel + }).PredictorModel; + var binaryScored = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = binaryEnsembleModel + }).ScoredData; + var binaryScoredCalibrated = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = binaryEnsembleCalibrated + }).ScoredData; + + var regressionEnsembleModel = EntryPoints.EnsembleCreator.CreateRegressionPipelineEnsemble(Env, + new EntryPoints.EnsembleCreator.PipelineRegressionInput() + { + ModelCombiner = EntryPoints.EnsembleCreator.ScoreCombiner.Average, + Models = predictorModels + }).PredictorModel; + var regressionScored = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = regressionEnsembleModel + }).ScoredData; + + var anomalyEnsembleModel = EntryPoints.EnsembleCreator.CreateAnomalyPipelineEnsemble(Env, + new EntryPoints.EnsembleCreator.PipelineAnomalyInput() + { + ModelCombiner = EnsembleCreator.ScoreCombiner.Average, + Models = predictorModels + }).PredictorModel; + var anomalyScored = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = anomalyEnsembleModel + }).ScoredData; + + // Make sure the scorers have the correct types. + var hasScoreCol = binaryScored.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out int scoreIndex); + Assert.True(hasScoreCol, "Data scored with binary ensemble does not have a score column"); + var type = binaryScored.Schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.ScoreColumnKind, scoreIndex); + Assert.True(type != null && type.IsText, "Binary ensemble scored data does not have correct type of metadata."); + var kind = default(DvText); + binaryScored.Schema.GetMetadata(MetadataUtils.Kinds.ScoreColumnKind, scoreIndex, ref kind); + Assert.True(kind.EqualsStr(MetadataUtils.Const.ScoreColumnKind.BinaryClassification), + $"Binary ensemble scored data column type should be '{MetadataUtils.Const.ScoreColumnKind.BinaryClassification}', but is instead '{kind}'"); + + hasScoreCol = regressionScored.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out scoreIndex); + Assert.True(hasScoreCol, "Data scored with regression ensemble does not have a score column"); + type = regressionScored.Schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.ScoreColumnKind, scoreIndex); + Assert.True(type != null && type.IsText, "Regression ensemble scored data does not have correct type of metadata."); + regressionScored.Schema.GetMetadata(MetadataUtils.Kinds.ScoreColumnKind, scoreIndex, ref kind); + Assert.True(kind.EqualsStr(MetadataUtils.Const.ScoreColumnKind.Regression), + $"Regression ensemble scored data column type should be '{MetadataUtils.Const.ScoreColumnKind.Regression}', but is instead '{kind}'"); + + hasScoreCol = anomalyScored.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out scoreIndex); + Assert.True(hasScoreCol, "Data scored with anomaly detection ensemble does not have a score column"); + type = anomalyScored.Schema.GetMetadataTypeOrNull(MetadataUtils.Kinds.ScoreColumnKind, scoreIndex); + Assert.True(type != null && type.IsText, "Anomaly detection ensemble scored data does not have correct type of metadata."); + anomalyScored.Schema.GetMetadata(MetadataUtils.Kinds.ScoreColumnKind, scoreIndex, ref kind); + Assert.True(kind.EqualsStr(MetadataUtils.Const.ScoreColumnKind.AnomalyDetection), + $"Anomaly detection ensemble scored data column type should be '{MetadataUtils.Const.ScoreColumnKind.AnomalyDetection}', but is instead '{kind}'"); + + var modelPath = DeleteOutputPath("SavePipe", "PipelineEnsembleModel.zip"); + using (var file = Env.CreateOutputFile(modelPath)) + using (var strm = file.CreateWriteStream()) + regressionEnsembleModel.Save(Env, strm); + + IPredictorModel loadedFromSaved; + using (var file = Env.OpenInputFile(modelPath)) + using (var strm = file.OpenReadStream()) + loadedFromSaved = new PredictorModel(Env, strm); + + var scoredFromSaved = ScoreModel.Score(Env, + new ScoreModel.Input() + { + Data = splitOutput.TestData[nModels], + PredictorModel = loadedFromSaved + }).ScoredData; + + using (var cursReg = regressionScored.GetRowCursor(col => true)) + using (var cursBin = binaryScored.GetRowCursor(col => true)) + using (var cursBinCali = binaryScoredCalibrated.GetRowCursor(col => true)) + using (var cursAnom = anomalyScored.GetRowCursor(col => true)) + using (var curs0 = individualScores[0].GetRowCursor(col => true)) + using (var curs1 = individualScores[1].GetRowCursor(col => true)) + using (var curs2 = individualScores[2].GetRowCursor(col => true)) + using (var curs3 = individualScores[3].GetRowCursor(col => true)) + using (var curs4 = individualScores[4].GetRowCursor(col => true)) + using (var cursSaved = scoredFromSaved.GetRowCursor(col => true)) + { + var good = curs0.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out int col); + Assert.True(good); + var getter0 = curs0.GetGetter(col); + good = curs1.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter1 = curs1.GetGetter(col); + good = curs2.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter2 = curs2.GetGetter(col); + good = curs3.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter3 = curs3.GetGetter(col); + good = curs4.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter4 = curs4.GetGetter(col); + good = cursReg.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterReg = cursReg.GetGetter(col); + good = cursBin.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterBin = cursBin.GetGetter(col); + good = cursBinCali.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterBinCali = cursBinCali.GetGetter(col); + good = cursSaved.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterSaved = cursSaved.GetGetter(col); + good = cursAnom.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterAnom = cursAnom.GetGetter(col); + + var c = new Average(Env).GetCombiner(); + while (cursReg.MoveNext()) + { + Single score = 0; + getterReg(ref score); + Assert.True(curs0.MoveNext()); + Assert.True(curs1.MoveNext()); + Assert.True(curs2.MoveNext()); + Assert.True(curs3.MoveNext()); + Assert.True(curs4.MoveNext()); + Assert.True(cursBin.MoveNext()); + Assert.True(cursBinCali.MoveNext()); + Assert.True(cursSaved.MoveNext()); + Assert.True(cursAnom.MoveNext()); + Single[] score0 = new Single[5]; + getter0(ref score0[0]); + getter1(ref score0[1]); + getter2(ref score0[2]); + getter3(ref score0[3]); + getter4(ref score0[4]); + Single scoreBin = 0; + Single scoreBinCali = 0; + Single scoreSaved = 0; + Single scoreAnom = 0; + getterBin(ref scoreBin); + getterBinCali(ref scoreBinCali); + getterSaved(ref scoreSaved); + getterAnom(ref scoreAnom); + Assert.True(Single.IsNaN(scoreBin) && Single.IsNaN(score) || scoreBin == score); + Assert.True(Single.IsNaN(scoreBinCali) && Single.IsNaN(score) || scoreBinCali == score); + Assert.True(Single.IsNaN(scoreSaved) && Single.IsNaN(score) || scoreSaved == score); + Assert.True(Single.IsNaN(scoreAnom) && Single.IsNaN(score) || scoreAnom == score); + + Single avg = 0; + c(ref avg, score0, null); + Assert.True(Single.IsNaN(avg) && Single.IsNaN(score) || avg == score); + } + Assert.False(curs0.MoveNext()); + Assert.False(curs1.MoveNext()); + Assert.False(curs2.MoveNext()); + Assert.False(curs3.MoveNext()); + Assert.False(curs4.MoveNext()); + Assert.False(cursBin.MoveNext()); + Assert.False(cursBinCali.MoveNext()); + Assert.False(cursSaved.MoveNext()); + Assert.False(cursAnom.MoveNext()); + } + } + + + [Fact] + public void EntryPointPipelineEnsembleText() + { + var dataPath = GetDataPath("lm.sample.txt"); + var inputFile = new SimpleFileHandle(Env, dataPath, false, false); + var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() + { + Arguments = + { + HasHeader = true, + Column = new[] + { + new TextLoader.Column() + { + Name = "Label", + Source = new [] { new TextLoader.Range() { Min = 0, Max = 0} }, + Type = Runtime.Data.DataKind.TX + }, + + new TextLoader.Column() + { + Name = "Text", + Source = new [] { new TextLoader.Range() { Min = 3, Max = 3} }, + Type = Runtime.Data.DataKind.TX + } + } + }, + + InputFile = inputFile + }).Data; + + ValueMapper labelToBinary = + (ref DvText src, ref DvBool dst) => + { + if (src.EqualsStr("Sport")) + dst = DvBool.True; + else + dst = DvBool.False; + }; + dataView = LambdaColumnMapper.Create(Env, "TextToBinaryLabel", dataView, "Label", "Label", + TextType.Instance, BoolType.Instance, labelToBinary); + + const int nModels = 5; + var splitOutput = CVSplit.Split(Env, new CVSplit.Input { Data = dataView, NumFolds = nModels + 1 }); + var predictorModels = new IPredictorModel[nModels]; + var individualScores = new IDataView[nModels]; + for (int i = 0; i < nModels; i++) + { + var data = splitOutput.TrainData[i]; + if (i % 2 == 0) + { + data = TextTransform.Create(Env, + new TextTransform.Arguments() + { + Column = new TextTransform.Column() { Name = "Features", Source = new[] { "Text" } }, + StopWordsRemover = new PredefinedStopWordsRemoverFactory() + }, data); + } + else + { + data = WordHashBagTransform.Create(Env, + new WordHashBagTransform.Arguments() + { + Column = + new[] { new WordHashBagTransform.Column() { Name = "Features", Source = new[] { "Text" } }, } + }, + data); + } + var lrInput = new LogisticRegression.Arguments + { + TrainingData = data, + L1Weight = (Single)0.1 * i, + L2Weight = (Single)0.01 * (1 + i), + NormalizeFeatures = NormalizeOption.Yes + }; + predictorModels[i] = LogisticRegression.TrainBinary(Env, lrInput).PredictorModel; + var transformModel = new TransformModel(Env, data, splitOutput.TrainData[i]); + + predictorModels[i] = ModelOperations.CombineTwoModels(Env, + new ModelOperations.SimplePredictorModelInput() + { PredictorModel = predictorModels[i], TransformModel = transformModel }).PredictorModel; + + individualScores[i] = + ScoreModel.Score(Env, + new ScoreModel.Input { Data = splitOutput.TestData[nModels], PredictorModel = predictorModels[i] }) + .ScoredData; + } + + var binaryEnsembleModel = EnsembleCreator.CreateBinaryPipelineEnsemble(Env, + new EnsembleCreator.PipelineClassifierInput() + { + ModelCombiner = EnsembleCreator.ClassifierCombiner.Average, + Models = predictorModels + }).PredictorModel; + var binaryEnsembleCalibrated = Calibrate.Platt(Env, + new Calibrate.NoArgumentsInput() + { + Data = splitOutput.TestData[nModels], + UncalibratedPredictorModel = binaryEnsembleModel + }).PredictorModel; + var binaryScored = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = binaryEnsembleModel + }).ScoredData; + var binaryScoredCalibrated = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = binaryEnsembleCalibrated + }).ScoredData; + + var regressionEnsembleModel = EnsembleCreator.CreateRegressionPipelineEnsemble(Env, + new EnsembleCreator.PipelineRegressionInput() + { + ModelCombiner = EnsembleCreator.ScoreCombiner.Average, + Models = predictorModels + }).PredictorModel; + var regressionScored = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = regressionEnsembleModel + }).ScoredData; + + var modelPath = DeleteOutputPath("SavePipe", "PipelineEnsembleModel.zip"); + using (var file = Env.CreateOutputFile(modelPath)) + using (var strm = file.CreateWriteStream()) + regressionEnsembleModel.Save(Env, strm); + + IPredictorModel loadedFromSaved; + using (var file = Env.OpenInputFile(modelPath)) + using (var strm = file.OpenReadStream()) + loadedFromSaved = new PredictorModel(Env, strm); + + var scoredFromSaved = ScoreModel.Score(Env, + new ScoreModel.Input() + { + Data = splitOutput.TestData[nModels], + PredictorModel = loadedFromSaved + }).ScoredData; + + using (var cursReg = regressionScored.GetRowCursor(col => true)) + using (var cursBin = binaryScored.GetRowCursor(col => true)) + using (var cursBinCali = binaryScoredCalibrated.GetRowCursor(col => true)) + using (var curs0 = individualScores[0].GetRowCursor(col => true)) + using (var curs1 = individualScores[1].GetRowCursor(col => true)) + using (var curs2 = individualScores[2].GetRowCursor(col => true)) + using (var curs3 = individualScores[3].GetRowCursor(col => true)) + using (var curs4 = individualScores[4].GetRowCursor(col => true)) + using (var cursSaved = scoredFromSaved.GetRowCursor(col => true)) + { + var good = curs0.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out int col); + Assert.True(good); + var getter0 = curs0.GetGetter(col); + good = curs1.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter1 = curs1.GetGetter(col); + good = curs2.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter2 = curs2.GetGetter(col); + good = curs3.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter3 = curs3.GetGetter(col); + good = curs4.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter4 = curs4.GetGetter(col); + good = cursReg.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterReg = cursReg.GetGetter(col); + good = cursBin.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterBin = cursBin.GetGetter(col); + good = cursBinCali.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterBinCali = cursBinCali.GetGetter(col); + good = cursSaved.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterSaved = cursSaved.GetGetter(col); + + var c = new Average(Env).GetCombiner(); + while (cursReg.MoveNext()) + { + Single score = 0; + getterReg(ref score); + Assert.True(curs0.MoveNext()); + Assert.True(curs1.MoveNext()); + Assert.True(curs2.MoveNext()); + Assert.True(curs3.MoveNext()); + Assert.True(curs4.MoveNext()); + Assert.True(cursBin.MoveNext()); + Assert.True(cursBinCali.MoveNext()); + Assert.True(cursSaved.MoveNext()); + Single[] score0 = new Single[5]; + getter0(ref score0[0]); + getter1(ref score0[1]); + getter2(ref score0[2]); + getter3(ref score0[3]); + getter4(ref score0[4]); + Single scoreBin = 0; + Single scoreBinCali = 0; + Single scoreSaved = 0; + getterBin(ref scoreBin); + getterBinCali(ref scoreBinCali); + getterSaved(ref scoreSaved); + Assert.True(Single.IsNaN(scoreBin) && Single.IsNaN(score) || scoreBin == score); + Assert.True(Single.IsNaN(scoreBinCali) && Single.IsNaN(score) || scoreBinCali == score); + Assert.True(Single.IsNaN(scoreSaved) && Single.IsNaN(score) || scoreSaved == score); + + Single avg = 0; + c(ref avg, score0, null); + Assert.True(Single.IsNaN(avg) && Single.IsNaN(score) || avg == score); + } + Assert.False(curs0.MoveNext()); + Assert.False(curs1.MoveNext()); + Assert.False(curs2.MoveNext()); + Assert.False(curs3.MoveNext()); + Assert.False(curs4.MoveNext()); + Assert.False(cursBin.MoveNext()); + Assert.False(cursBinCali.MoveNext()); + Assert.False(cursSaved.MoveNext()); + } + } + + [Fact] + public void EntryPointMulticlassPipelineEnsemble() + { + var dataPath = GetDataPath("iris.txt"); + var inputFile = new SimpleFileHandle(Env, dataPath, false, false); + var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() + { + Arguments = + { + Column = new[] + { + new TextLoader.Column() + { + Name = "Label", + Source = new [] { new TextLoader.Range() { Min = 0, Max = 0} }, + Type = Runtime.Data.DataKind.R4 + }, + + new TextLoader.Column() + { + Name = "Features", + Source = new [] { new TextLoader.Range() { Min = 1, Max = 4} }, + Type = Runtime.Data.DataKind.R4 + } + } + }, + + InputFile = inputFile + }).Data; + + const int nModels = 5; + var splitOutput = CVSplit.Split(Env, new CVSplit.Input { Data = dataView, NumFolds = nModels + 1 }); + var predictorModels = new IPredictorModel[nModels]; + var individualScores = new IDataView[nModels]; + for (int i = 0; i < nModels; i++) + { + var data = splitOutput.TrainData[i]; + data = new RffTransform(Env, new RffTransform.Arguments() + { + Column = new[] + { + new RffTransform.Column() {Name = "Features1", Source = "Features"}, + new RffTransform.Column() {Name = "Features2", Source = "Features"}, + }, + NewDim = 10, + UseSin = false + }, data); + data = new ConcatTransform(Env, new ConcatTransform.Arguments() + { + Column = new[] { new ConcatTransform.Column() { Name = "Features", Source = new[] { "Features1", "Features2" } } } + }, data); + + var mlr = new MulticlassLogisticRegression(Env, new MulticlassLogisticRegression.Arguments()); + var rmd = new RoleMappedData(data, "Label", "Features"); + + predictorModels[i] = new PredictorModel(Env, rmd, data, mlr.Train(rmd)); + var transformModel = new TransformModel(Env, data, splitOutput.TrainData[i]); + + predictorModels[i] = ModelOperations.CombineTwoModels(Env, + new ModelOperations.SimplePredictorModelInput() + { PredictorModel = predictorModels[i], TransformModel = transformModel }).PredictorModel; + + individualScores[i] = + ScoreModel.Score(Env, + new ScoreModel.Input { Data = splitOutput.TestData[nModels], PredictorModel = predictorModels[i] }) + .ScoredData; + } + + var mcEnsembleModel = EnsembleCreator.CreateMultiClassPipelineEnsemble(Env, + new EnsembleCreator.PipelineClassifierInput() + { + ModelCombiner = EnsembleCreator.ClassifierCombiner.Average, + Models = predictorModels + }).PredictorModel; + var mcScored = ScoreModel.Score(Env, + new ScoreModel.Input + { + Data = splitOutput.TestData[nModels], + PredictorModel = mcEnsembleModel + }).ScoredData; + + var modelPath = DeleteOutputPath("SavePipe", "PipelineEnsembleModel.zip"); + using (var file = Env.CreateOutputFile(modelPath)) + using (var strm = file.CreateWriteStream()) + mcEnsembleModel.Save(Env, strm); + + IPredictorModel loadedFromSaved; + using (var file = Env.OpenInputFile(modelPath)) + using (var strm = file.OpenReadStream()) + loadedFromSaved = new PredictorModel(Env, strm); + + var scoredFromSaved = ScoreModel.Score(Env, + new ScoreModel.Input() + { + Data = splitOutput.TestData[nModels], + PredictorModel = loadedFromSaved + }).ScoredData; + + using (var curs = mcScored.GetRowCursor(col => true)) + using (var cursSaved = scoredFromSaved.GetRowCursor(col => true)) + using (var curs0 = individualScores[0].GetRowCursor(col => true)) + using (var curs1 = individualScores[1].GetRowCursor(col => true)) + using (var curs2 = individualScores[2].GetRowCursor(col => true)) + using (var curs3 = individualScores[3].GetRowCursor(col => true)) + using (var curs4 = individualScores[4].GetRowCursor(col => true)) + { + var good = curs0.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out int col); + Assert.True(good); + var getter0 = curs0.GetGetter>(col); + good = curs1.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter1 = curs1.GetGetter>(col); + good = curs2.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter2 = curs2.GetGetter>(col); + good = curs3.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter3 = curs3.GetGetter>(col); + good = curs4.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter4 = curs4.GetGetter>(col); + good = curs.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getter = curs.GetGetter>(col); + good = cursSaved.Schema.TryGetColumnIndex(MetadataUtils.Const.ScoreValueKind.Score, out col); + Assert.True(good); + var getterSaved = cursSaved.GetGetter>(col); + + var c = new MultiAverage(Env, new MultiAverage.Arguments()).GetCombiner(); + VBuffer score = default(VBuffer); + VBuffer[] score0 = new VBuffer[5]; + VBuffer scoreSaved = default(VBuffer); + VBuffer avg = default(VBuffer); + VBuffer dense1 = default(VBuffer); + VBuffer dense2 = default(VBuffer); + while (curs.MoveNext()) + { + getter(ref score); + Assert.True(curs0.MoveNext()); + Assert.True(curs1.MoveNext()); + Assert.True(curs2.MoveNext()); + Assert.True(curs3.MoveNext()); + Assert.True(curs4.MoveNext()); + Assert.True(cursSaved.MoveNext()); + getter0(ref score0[0]); + getter1(ref score0[1]); + getter2(ref score0[2]); + getter3(ref score0[3]); + getter4(ref score0[4]); + getterSaved(ref scoreSaved); + Assert.True(CompareVBuffers(ref scoreSaved, ref score, ref dense1, ref dense2)); + c(ref avg, score0, null); + Assert.True(CompareVBuffers(ref avg, ref score, ref dense1, ref dense2)); + } + Assert.False(curs0.MoveNext()); + Assert.False(curs1.MoveNext()); + Assert.False(curs2.MoveNext()); + Assert.False(curs3.MoveNext()); + Assert.False(curs4.MoveNext()); + Assert.False(cursSaved.MoveNext()); + } + } private static bool CompareVBuffers(ref VBuffer v1, ref VBuffer v2, ref VBuffer dense1, ref VBuffer dense2) { @@ -911,25 +1568,33 @@ public void EntryPointTextToKeyToText() } private void RunTrainScoreEvaluate(string learner, string evaluator, string dataPath, string warningsPath, string overallMetricsPath, - string instanceMetricsPath, string confusionMatrixPath = null, string loader = null) + string instanceMetricsPath, string confusionMatrixPath = null, string loader = null, string transforms = null, + string splitterInput = "AllData") { - string inputGraph = string.Format(@" + if (string.IsNullOrEmpty(transforms)) + transforms = ""; + loader = string.IsNullOrWhiteSpace(loader) ? "" : string.Format(",'CustomSchema': '{0}'", loader); + var confusionMatrixVar = confusionMatrixPath != null ? ", 'ConfusionMatrix': '$ConfusionMatrix'" : ""; + confusionMatrixPath = confusionMatrixPath != null ? string.Format(", 'ConfusionMatrix' : '{0}'", EscapePath(confusionMatrixPath)) : ""; + var scorerModel = string.IsNullOrEmpty(transforms) ? "Model" : "CombinedModel"; + string inputGraph = $@" {{ 'Nodes': [ {{ 'Name': 'Data.CustomTextLoader', 'Inputs': {{ 'InputFile': '$file' - {8} + {loader} }}, 'Outputs': {{ 'Data': '$AllData' }} }}, + {transforms} {{ 'Name': 'Transforms.TrainTestDatasetSplitter', 'Inputs': {{ - 'Data': '$AllData', + 'Data': '${splitterInput}', 'Fraction': 0.8 }}, 'Outputs': {{ @@ -938,7 +1603,7 @@ private void RunTrainScoreEvaluate(string learner, string evaluator, string data }} }}, {{ - 'Name': '{0}', + 'Name': '{learner}', 'Inputs': {{ 'TrainingData': '$TrainData' }}, @@ -957,7 +1622,7 @@ private void RunTrainScoreEvaluate(string learner, string evaluator, string data }} }}, {{ - 'Name': '{1}', + 'Name': '{evaluator}', 'Inputs': {{ 'Data': '$ScoredData' }}, @@ -965,23 +1630,20 @@ private void RunTrainScoreEvaluate(string learner, string evaluator, string data 'Warnings': '$Warnings', 'OverallMetrics': '$OverallMetrics', 'PerInstanceMetrics': '$PerInstanceMetrics' - {6} + {confusionMatrixVar} }} }} ], 'Inputs' : {{ - 'file' : '{2}' + 'file' : '{EscapePath(dataPath)}' }}, 'Outputs' : {{ - 'Warnings' : '{3}', - 'OverallMetrics' : '{4}', - 'PerInstanceMetrics' : '{5}' - {7} + 'Warnings' : '{EscapePath(warningsPath)}', + 'OverallMetrics' : '{EscapePath(overallMetricsPath)}', + 'PerInstanceMetrics' : '{EscapePath(instanceMetricsPath)}' + {confusionMatrixPath} }} - }}", learner, evaluator, EscapePath(dataPath), EscapePath(warningsPath), EscapePath(overallMetricsPath), EscapePath(instanceMetricsPath), - confusionMatrixPath != null ? ", 'ConfusionMatrix': '$ConfusionMatrix'" : "", - confusionMatrixPath != null ? string.Format(", 'ConfusionMatrix' : '{0}'", EscapePath(confusionMatrixPath)) : "", - string.IsNullOrWhiteSpace(loader) ? "" : string.Format(",'CustomSchema': '{0}'", loader)); + }}"; var jsonPath = DeleteOutputPath("graph.json"); File.WriteAllLines(jsonPath, new[] { inputGraph }); @@ -1042,13 +1704,13 @@ public void EntryPointEvaluateMultiClass() [Fact] public void EntryPointEvaluateRegression() { - var dataPath = GetDataPath(TestDatasets.winequality.trainFilename); + var dataPath = GetDataPath(TestDatasets.winequalitymacro.trainFilename); var warningsPath = DeleteOutputPath("warnings.idv"); var overallMetricsPath = DeleteOutputPath("overall.idv"); var instanceMetricsPath = DeleteOutputPath("instance.idv"); RunTrainScoreEvaluate("Trainers.StochasticDualCoordinateAscentRegressor", "Models.RegressionEvaluator", - dataPath, warningsPath, overallMetricsPath, instanceMetricsPath, loader: TestDatasets.winequality.loaderSettings); + dataPath, warningsPath, overallMetricsPath, instanceMetricsPath, loader: TestDatasets.winequalitymacro.loaderSettings); using (var loader = new BinaryLoader(Env, new BinaryLoader.Arguments(), warningsPath)) Assert.Equal(0, CountRows(loader)); @@ -1060,6 +1722,93 @@ public void EntryPointEvaluateRegression() Assert.Equal(975, CountRows(loader)); } + [Fact] + public void EntryPointEvaluateRanking() + { + var dataPath = GetDataPath(@"adult.tiny.with-schema.txt"); + var warningsPath = DeleteOutputPath("warnings.idv"); + var overallMetricsPath = DeleteOutputPath("overall.idv"); + var instanceMetricsPath = DeleteOutputPath("instance.idv"); + + var transforms = @" + { + 'Inputs': { + 'Column': [ + { + 'Name': 'GroupId', + 'Source': 'Workclass' + } + ], + 'Data': '$AllData', + 'MaxNumTerms': 1000000, + 'Sort': 'Occurrence', + 'TextKeyValues': false + }, + 'Name': 'Transforms.TextToKeyConverter', + 'Outputs': { + 'Model': '$output_model1', + 'OutputData': '$output_data1' + } + }, + { + 'Name': 'Transforms.LabelColumnKeyBooleanConverter', + 'Inputs': { + 'Data': '$output_data1', + 'LabelColumn': 'Label', + 'TextKeyValues': false + }, + 'Outputs': { + 'Model': '$output_model2', + 'OutputData': '$output_data2' + } + }, + { + 'Name': 'Transforms.ColumnCopier', + 'Inputs': { + 'Column': [ + { + 'Name': 'Features', + 'Source': 'NumericFeatures' + } + ], + 'Data': '$output_data2' + }, + 'Outputs': { + 'Model': '$output_model3', + 'OutputData': '$output_data3' + } + },"; + + RunTrainScoreEvaluate("Trainers.FastTreeRanker", "Models.RankerEvaluator", + dataPath, warningsPath, overallMetricsPath, instanceMetricsPath, + splitterInput: "output_data3", transforms: transforms); + + using (var loader = new BinaryLoader(Env, new BinaryLoader.Arguments(), warningsPath)) + Assert.Equal(0, CountRows(loader)); + + using (var loader = new BinaryLoader(Env, new BinaryLoader.Arguments(), overallMetricsPath)) + Assert.Equal(1, CountRows(loader)); + + using (var loader = new BinaryLoader(Env, new BinaryLoader.Arguments(), instanceMetricsPath)) + { + Assert.Equal(103, CountRows(loader)); + Assert.True(loader.Schema.TryGetColumnIndex("GroupId", out var groupCol)); + Assert.True(loader.Schema.TryGetColumnIndex("Label", out var labelCol)); + } + } + + [Fact] + public void EntryPointLightGbmBinary() + { + TestEntryPointRoutine("breast-cancer.txt", "Trainers.LightGbmBinaryClassifier"); + } + + [Fact] + public void EntryPointLightGbmMultiClass() + { + TestEntryPointRoutine(GetDataPath(@"iris.txt"), "Trainers.LightGbmClassifier"); + } + [Fact] public void EntryPointSdcaBinary() { @@ -1075,7 +1824,7 @@ public void EntryPointSDCAMultiClass() [Fact()] public void EntryPointSDCARegression() { - TestEntryPointRoutine(TestDatasets.winequality.trainFilename, "Trainers.StochasticDualCoordinateAscentRegressor", loader: TestDatasets.winequality.loaderSettings); + TestEntryPointRoutine(TestDatasets.winequalitymacro.trainFilename, "Trainers.StochasticDualCoordinateAscentRegressor", loader: TestDatasets.winequalitymacro.loaderSettings); } [Fact] @@ -1116,6 +1865,39 @@ public void EntryPointPcaTransform() }); } + [Fact] + public void EntryPointLightLdaTransform() + { + string dataFile = DeleteOutputPath("SavePipe", "SavePipeTextLightLda-SampleText.txt"); + File.WriteAllLines(dataFile, new[] { + "The quick brown fox jumps over the lazy dog.", + "The five boxing wizards jump quickly." + }); + + TestEntryPointPipelineRoutine(dataFile, "sep={ } col=T:TX:0-**", + new[] + { + "Transforms.TextFeaturizer", + "Transforms.LightLda" + }, + new[] + { + @"'Column': { + 'Name': 'T', + 'Source': [ + 'T' + ] + + }, + 'VectorNormalizer': 'None'", + @"'Column': [ + { + 'Name': 'T', + 'Source': 'T' + }]" + }); + } + [Fact] public void EntryPointAveragePerceptron() { @@ -1134,6 +1916,24 @@ public void EntryPointLinearSVM() TestEntryPointRoutine("iris.txt", "Trainers.LinearSvmBinaryClassifier"); } + [Fact] + public void EntryPointBinaryEnsemble() + { + TestEntryPointRoutine("iris.txt", "Trainers.EnsembleBinaryClassifier"); + } + + [Fact] + public void EntryPointClassificationEnsemble() + { + TestEntryPointRoutine("iris.txt", "Trainers.EnsembleClassification"); + } + + [Fact] + public void EntryPointRegressionEnsemble() + { + TestEntryPointRoutine(TestDatasets.winequalitymacro.trainFilename, "Trainers.EnsembleRegression", loader: TestDatasets.winequalitymacro.loaderSettings); + } + [Fact] public void EntryPointNaiveBayesMultiClass() { @@ -1146,10 +1946,10 @@ public void EntryPointHogwildSGD() TestEntryPointRoutine("breast-cancer.txt", "Trainers.StochasticGradientDescentBinaryClassifier"); } - [Fact()] + [Fact] public void EntryPointPoissonRegression() { - TestEntryPointRoutine(TestDatasets.winequality.trainFilename, "Trainers.PoissonRegressor", loader: TestDatasets.winequality.loaderSettings); + TestEntryPointRoutine(TestDatasets.winequalitymacro.trainFilename, "Trainers.PoissonRegressor", loader: TestDatasets.winequalitymacro.loaderSettings); } [Fact] @@ -2619,8 +3419,6 @@ public void EntryPointLinearPredictorSummary() var dataPath = GetDataPath("breast-cancer-withheader.txt"); var inputFile = new SimpleFileHandle(Env, dataPath, false, false); - /*var dataView = ImportTextData.ImportText(Env, new ImportTextData.Input - { InputFile = inputFile, CustomSchema = "header+ col=Label:0 col=Features:Num:1-9"*/ var dataView = ImportTextData.TextLoader(Env, new ImportTextData.LoaderInput() { Arguments = @@ -2653,7 +3451,7 @@ public void EntryPointLinearPredictorSummary() NormalizeFeatures = NormalizeOption.Yes, NumThreads = 1, // REVIEW: this depends on MKL library which is not available - ShowTrainingStats = false + ShowTrainingStats = false }; var model = LogisticRegression.TrainBinary(Env, lrInput).PredictorModel; diff --git a/test/Microsoft.ML.Predictor.Tests/Microsoft.ML.Predictor.Tests.csproj b/test/Microsoft.ML.Predictor.Tests/Microsoft.ML.Predictor.Tests.csproj index 2329491e08..7f0a8d05f9 100644 --- a/test/Microsoft.ML.Predictor.Tests/Microsoft.ML.Predictor.Tests.csproj +++ b/test/Microsoft.ML.Predictor.Tests/Microsoft.ML.Predictor.Tests.csproj @@ -13,6 +13,7 @@ + @@ -25,6 +26,7 @@ + diff --git a/test/Microsoft.ML.Predictor.Tests/TestAutoInference.cs b/test/Microsoft.ML.Predictor.Tests/TestAutoInference.cs index 0cd6b0c906..44e8f523ea 100644 --- a/test/Microsoft.ML.Predictor.Tests/TestAutoInference.cs +++ b/test/Microsoft.ML.Predictor.Tests/TestAutoInference.cs @@ -2,13 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Linq; -using System.Collections.Generic; -using Newtonsoft.Json.Linq; using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.EntryPoints; using Microsoft.ML.Runtime.EntryPoints.JsonUtils; using Microsoft.ML.Runtime.PipelineInference; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; using Xunit; using Xunit.Abstractions; @@ -33,7 +34,7 @@ public void TestLearn() int batchSize = 5; int numIterations = 10; int numTransformLevels = 3; - AutoInference.SupportedMetric metric = AutoInference.SupportedMetric.Auc; + SupportedMetric metric = PipelineSweeperSupportedMetrics.GetSupportedMetric(PipelineSweeperSupportedMetrics.Metrics.Auc); // Using the simple, uniform random sampling (with replacement) engine PipelineOptimizerBase autoMlEngine = new UniformRandomEngine(env); @@ -58,7 +59,7 @@ public void TestLearn() new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data; #pragma warning restore 0618 - // REVIEW: Theoretically, it could be the case that a new, very bad learner is introduced and + // REVIEW: Theoretically, it could be the case that a new, very bad learner is introduced and // we get unlucky and only select it every time, such that this test fails. Not // likely at all, but a non-zero probability. Should be ok, since all current learners are returning d > .80. bestPipeline.RunTrainTestExperiment(datasetTrain, datasetTest, metric, MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer, @@ -68,289 +69,6 @@ public void TestLearn() Done(); } - [Fact] - [TestCategory("EntryPoints")] - public void TestPipelineSweeperMacroNoTransforms() - { - // Set up inputs for experiment - string pathData = GetDataPath("adult.train"); - string pathDataTest = GetDataPath("adult.test"); - const int numOfSampleRows = 1000; - const string schema = "sep=, col=Features:R4:0,2,4,10-12 col=Label:R4:14 header=+"; - - var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); -#pragma warning disable 0618 - var datasetTrain = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); - var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); - var datasetTest = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); -#pragma warning restore 0618 - const int batchSize = 5; - const int numIterations = 20; - const int numTransformLevels = 2; - AutoInference.SupportedMetric metric = AutoInference.SupportedMetric.Auc; - - // Using the simple, uniform random sampling (with replacement) engine - PipelineOptimizerBase autoMlEngine = new UniformRandomEngine(Env); - - // Create search object - var amls = new AutoInference.AutoMlMlState(Env, metric, autoMlEngine, new IterationTerminator(numIterations), - MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer, datasetTrain, datasetTest); - - // Infer search space - amls.InferSearchSpace(numTransformLevels); - - // Create macro object - var pipelineSweepInput = new Microsoft.ML.Models.PipelineSweeper() - { - BatchSize = batchSize, - }; - - var exp = new Experiment(Env); - var output = exp.Add(pipelineSweepInput); - exp.Compile(); - exp.SetInput(pipelineSweepInput.TrainingData, datasetTrain); - exp.SetInput(pipelineSweepInput.TestingData, datasetTest); - exp.SetInput(pipelineSweepInput.State, amls); - exp.SetInput(pipelineSweepInput.CandidateOutputs, new IDataView[0]); - exp.Run(); - - // Make sure you get back an AutoMlState, and that it ran for correct number of iterations - // with at least minimal performance values (i.e., best should have AUC better than 0.1 on this dataset). - AutoInference.AutoMlMlState amlsOut = (AutoInference.AutoMlMlState)exp.GetOutput(output.State); - Assert.NotNull(amlsOut); - Assert.Equal(amlsOut.GetAllEvaluatedPipelines().Length, numIterations); - Assert.True(amlsOut.GetBestPipeline().PerformanceSummary.MetricValue > 0.1); - } - - [Fact] - [TestCategory("EntryPoints")] - public void EntryPointPipelineSweepSerialization() - { - // Get datasets - var pathData = GetDataPath("adult.train"); - var pathDataTest = GetDataPath("adult.test"); - const int numOfSampleRows = 1000; - int numIterations = 10; - const string schema = - "sep=, col=Features:R4:0,2,4,10-12 col=workclass:TX:1 col=education:TX:3 col=marital_status:TX:5 col=occupation:TX:6 " + - "col=relationship:TX:7 col=ethnicity:TX:8 col=sex:TX:9 col=native_country:TX:13 col=label_IsOver50K_:R4:14 header=+"; - var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); -#pragma warning disable 0618 - var datasetTrain = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); - var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); - var datasetTest = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); -#pragma warning restore 0618 - - // Define entrypoint graph - string inputGraph = @" - { - 'Nodes': [ - { - 'Name': 'Models.PipelineSweeper', - 'Inputs': { - 'TrainingData': '$TrainingData', - 'TestingData': '$TestingData', - 'StateArguments': { - 'Name': 'AutoMlState', - 'Settings': { - 'Metric': 'Auc', - 'Engine': { - 'Name': 'UniformRandom' - }, - 'TerminatorArgs': { - 'Name': 'IterationLimited', - 'Settings': { - 'FinalHistoryLength': 10 - } - }, - 'TrainerKind': 'SignatureBinaryClassifierTrainer' - } - }, - 'BatchSize': 5 - }, - 'Outputs': { - 'State': '$StateOut', - 'Results': '$ResultsOut' - } - }, - ] - }"; - - JObject graphJson = JObject.Parse(inputGraph); - var catalog = ModuleCatalog.CreateInstance(Env); - var graph = new EntryPointGraph(Env, catalog, graphJson[FieldNames.Nodes] as JArray); - // Test if ToJson() works properly. - var nodes = new JArray(graph.AllNodes.Select(node => node.ToJson())); - var runner = new GraphRunner(Env, catalog, nodes); - runner.SetInput("TrainingData", datasetTrain); - runner.SetInput("TestingData", datasetTest); - runner.RunAll(); - - var results = runner.GetOutput("ResultsOut"); - Assert.NotNull(results); - var rows = PipelinePattern.ExtractResults(Env, results, - "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); - Assert.True(rows.Length == numIterations); - } - - [Fact] - public void EntryPointPipelineSweep() - { - // Get datasets - var pathData = GetDataPath("adult.tiny.with-schema.txt"); - var pathDataTest = GetDataPath("adult.tiny.with-schema.txt"); - const int numOfSampleRows = 1000; - int numIterations = 4; - var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); -#pragma warning disable 0618 - var datasetTrain = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTrain }).Data.Take(numOfSampleRows); - var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); - var datasetTest = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTest }).Data.Take(numOfSampleRows); -#pragma warning restore 0618 - // Define entrypoint graph - string inputGraph = @" - { - 'Nodes': [ - { - 'Name': 'Models.PipelineSweeper', - 'Inputs': { - 'TrainingData': '$TrainingData', - 'TestingData': '$TestingData', - 'StateArguments': { - 'Name': 'AutoMlState', - 'Settings': { - 'Metric': 'Auc', - 'Engine': { - 'Name': 'UniformRandom' - }, - 'TerminatorArgs': { - 'Name': 'IterationLimited', - 'Settings': { - 'FinalHistoryLength': 4 - } - }, - 'TrainerKind': 'SignatureBinaryClassifierTrainer' - } - }, - 'BatchSize': 2 - }, - 'Outputs': { - 'State': '$StateOut', - 'Results': '$ResultsOut' - } - }, - ] - }"; - - JObject graph = JObject.Parse(inputGraph); - var catalog = ModuleCatalog.CreateInstance(Env); - - var runner = new GraphRunner(Env, catalog, graph[FieldNames.Nodes] as JArray); - runner.SetInput("TrainingData", datasetTrain); - runner.SetInput("TestingData", datasetTest); - runner.RunAll(); - - var autoMlState = runner.GetOutput("StateOut"); - Assert.NotNull(autoMlState); - var allPipelines = autoMlState.GetAllEvaluatedPipelines(); - var bestPipeline = autoMlState.GetBestPipeline(); - Assert.Equal(allPipelines.Length, numIterations); - Assert.True(bestPipeline.PerformanceSummary.MetricValue > 0.1); - - var results = runner.GetOutput("ResultsOut"); - Assert.NotNull(results); - var rows = PipelinePattern.ExtractResults(Env, results, - "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); - Assert.True(rows.Length == numIterations); - Assert.True(rows.All(r => r.TrainingMetricValue > 0.1)); - } - - [Fact] - public void TestRocketPipelineEngine() - { - // Get datasets - var pathData = GetDataPath("adult.train"); - var pathDataTest = GetDataPath("adult.test"); - const int numOfSampleRows = 1000; - int numIterations = 35; - const string schema = - "sep=, col=Features:R4:0,2,4,10-12 col=workclass:TX:1 col=education:TX:3 col=marital_status:TX:5 col=occupation:TX:6 " + - "col=relationship:TX:7 col=ethnicity:TX:8 col=sex:TX:9 col=native_country:TX:13 col=label_IsOver50K_:R4:14 header=+"; - var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); -#pragma warning disable 0618 - var datasetTrain = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); - var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); - var datasetTest = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); -#pragma warning restore 0618 - // Define entrypoint graph - string inputGraph = @" - { - 'Nodes': [ - { - 'Name': 'Models.PipelineSweeper', - 'Inputs': { - 'TrainingData': '$TrainingData', - 'TestingData': '$TestingData', - 'StateArguments': { - 'Name': 'AutoMlState', - 'Settings': { - 'Metric': 'Auc', - 'Engine': { - 'Name': 'Rocket', - 'Settings' : { - 'TopKLearners' : 2, - 'SecondRoundTrialsPerLearner' : 5 - }, - }, - 'TerminatorArgs': { - 'Name': 'IterationLimited', - 'Settings': { - 'FinalHistoryLength': 35 - } - }, - 'TrainerKind': 'SignatureBinaryClassifierTrainer' - } - }, - 'BatchSize': 5 - }, - 'Outputs': { - 'State': '$StateOut', - 'Results': '$ResultsOut' - } - }, - ] - }"; - - JObject graph = JObject.Parse(inputGraph); - var catalog = ModuleCatalog.CreateInstance(Env); - - var runner = new GraphRunner(Env, catalog, graph[FieldNames.Nodes] as JArray); - runner.SetInput("TrainingData", datasetTrain); - runner.SetInput("TestingData", datasetTest); - runner.RunAll(); - - var autoMlState = runner.GetOutput("StateOut"); - Assert.NotNull(autoMlState); - var allPipelines = autoMlState.GetAllEvaluatedPipelines(); - var bestPipeline = autoMlState.GetBestPipeline(); - Assert.Equal(allPipelines.Length, numIterations); - Assert.True(bestPipeline.PerformanceSummary.MetricValue > 0.1); - - var results = runner.GetOutput("ResultsOut"); - Assert.NotNull(results); - var rows = PipelinePattern.ExtractResults(Env, results, - "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); - Assert.True(rows.Length == numIterations); - } - [Fact(Skip = "Need CoreTLC specific baseline update")] public void TestTextDatasetLearn() { @@ -361,7 +79,7 @@ public void TestTextDatasetLearn() int numIterations = 35; int numTransformLevels = 1; int numSampleRows = 100; - AutoInference.SupportedMetric metric = AutoInference.SupportedMetric.AccuracyMicro; + SupportedMetric metric = PipelineSweeperSupportedMetrics.GetSupportedMetric(PipelineSweeperSupportedMetrics.Metrics.AccuracyMicro); // Using the simple, uniform random sampling (with replacement) engine PipelineOptimizerBase autoMlEngine = new UniformRandomEngine(env); @@ -412,27 +130,6 @@ public void TestPipelineNodeCloning() } } - [Fact] - public void TestSupportedMetricsByName() - { - var names = new List() - { - AutoInference.SupportedMetric.AccuracyMacro.Name, - AutoInference.SupportedMetric.AccuracyMicro.Name, - AutoInference.SupportedMetric.Auc.Name, - AutoInference.SupportedMetric.AuPrc.Name, - AutoInference.SupportedMetric.Dbi.Name, - AutoInference.SupportedMetric.F1.Name, - AutoInference.SupportedMetric.LogLossReduction.Name - }; - - foreach (var name in names) - { - var metric = AutoInference.SupportedMetric.ByName(name); - Assert.Equal(metric.Name, name); - } - } - [Fact] public void TestHyperparameterFreezing() { @@ -441,41 +138,44 @@ public void TestHyperparameterFreezing() int batchSize = 1; int numIterations = 10; int numTransformLevels = 3; - AutoInference.SupportedMetric metric = AutoInference.SupportedMetric.Auc; + using (var env = new TlcEnvironment()) + { + SupportedMetric metric = PipelineSweeperSupportedMetrics.GetSupportedMetric(PipelineSweeperSupportedMetrics.Metrics.Auc); - // Using the simple, uniform random sampling (with replacement) brain - PipelineOptimizerBase autoMlBrain = new UniformRandomEngine(Env); + // Using the simple, uniform random sampling (with replacement) brain + PipelineOptimizerBase autoMlBrain = new UniformRandomEngine(Env); - // Run initial experiments - var amls = AutoInference.InferPipelines(Env, autoMlBrain, pathData, "", out var _, numTransformLevels, batchSize, - metric, out var bestPipeline, numOfSampleRows, new IterationTerminator(numIterations), - MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer); + // Run initial experiments + var amls = AutoInference.InferPipelines(Env, autoMlBrain, pathData, "", out var _, numTransformLevels, batchSize, + metric, out var bestPipeline, numOfSampleRows, new IterationTerminator(numIterations), + MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer); - // Clear results - amls.ClearEvaluatedPipelines(); + // Clear results + amls.ClearEvaluatedPipelines(); - // Get space, remove transforms and all but one learner, freeze hyperparameters on learner. - var space = amls.GetSearchSpace(); - var transforms = space.Item1.Where(t => - t.ExpertType != typeof(TransformInference.Experts.Categorical)).ToArray(); - var learners = new[] { space.Item2.First() }; - var hyperParam = learners[0].PipelineNode.SweepParams.First(); - var frozenParamValue = hyperParam.RawValue; - hyperParam.Frozen = true; - amls.UpdateSearchSpace(learners, transforms); + // Get space, remove transforms and all but one learner, freeze hyperparameters on learner. + var space = amls.GetSearchSpace(); + var transforms = space.Item1.Where(t => + t.ExpertType != typeof(TransformInference.Experts.Categorical)).ToArray(); + var learners = new[] { space.Item2.First() }; + var hyperParam = learners[0].PipelineNode.SweepParams.First(); + var frozenParamValue = hyperParam.RawValue; + hyperParam.Frozen = true; + amls.UpdateSearchSpace(learners, transforms); - // Allow for one more iteration - amls.UpdateTerminator(new IterationTerminator(numIterations + 1)); + // Allow for one more iteration + amls.UpdateTerminator(new IterationTerminator(numIterations + 1)); - // Do learning. Only retained learner should be left in all pipelines. - bestPipeline = amls.InferPipelines(numTransformLevels, batchSize, numOfSampleRows); + // Do learning. Only retained learner should be left in all pipelines. + bestPipeline = amls.InferPipelines(numTransformLevels, batchSize, numOfSampleRows); - // Make sure all pipelines have retained learner - Assert.True(amls.GetAllEvaluatedPipelines().All(p => p.Learner.LearnerName == learners[0].LearnerName)); + // Make sure all pipelines have retained learner + Assert.True(amls.GetAllEvaluatedPipelines().All(p => p.Learner.LearnerName == learners[0].LearnerName)); - // Make sure hyperparameter value did not change - Assert.NotNull(bestPipeline); - Assert.Equal(bestPipeline.Learner.PipelineNode.SweepParams.First().RawValue, frozenParamValue); + // Make sure hyperparameter value did not change + Assert.NotNull(bestPipeline); + Assert.Equal(bestPipeline.Learner.PipelineNode.SweepParams.First().RawValue, frozenParamValue); + } } [Fact(Skip = "Dataset not available.")] @@ -486,26 +186,29 @@ public void TestRegressionPipelineWithMinimizingMetric() int batchSize = 5; int numIterations = 10; int numTransformLevels = 1; - AutoInference.SupportedMetric metric = AutoInference.SupportedMetric.L1; + using (var env = new TlcEnvironment()) + { + SupportedMetric metric = PipelineSweeperSupportedMetrics.GetSupportedMetric(PipelineSweeperSupportedMetrics.Metrics.AccuracyMicro); - // Using the simple, uniform random sampling (with replacement) brain - PipelineOptimizerBase autoMlBrain = new UniformRandomEngine(Env); + // Using the simple, uniform random sampling (with replacement) brain + PipelineOptimizerBase autoMlBrain = new UniformRandomEngine(Env); - // Run initial experiments - var amls = AutoInference.InferPipelines(Env, autoMlBrain, pathData, "", out var _, numTransformLevels, batchSize, - metric, out var bestPipeline, numOfSampleRows, new IterationTerminator(numIterations), - MacroUtils.TrainerKinds.SignatureRegressorTrainer); + // Run initial experiments + var amls = AutoInference.InferPipelines(Env, autoMlBrain, pathData, "", out var _, numTransformLevels, batchSize, + metric, out var bestPipeline, numOfSampleRows, new IterationTerminator(numIterations), + MacroUtils.TrainerKinds.SignatureRegressorTrainer); - // Allow for one more iteration - amls.UpdateTerminator(new IterationTerminator(numIterations + 1)); + // Allow for one more iteration + amls.UpdateTerminator(new IterationTerminator(numIterations + 1)); - // Do learning. Only retained learner should be left in all pipelines. - bestPipeline = amls.InferPipelines(numTransformLevels, batchSize, numOfSampleRows); + // Do learning. Only retained learner should be left in all pipelines. + bestPipeline = amls.InferPipelines(numTransformLevels, batchSize, numOfSampleRows); - // Make sure hyperparameter value did not change - Assert.NotNull(bestPipeline); - Assert.True(amls.GetAllEvaluatedPipelines().All( - p => p.PerformanceSummary.MetricValue >= bestPipeline.PerformanceSummary.MetricValue)); + // Make sure hyperparameter value did not change + Assert.NotNull(bestPipeline); + Assert.True(amls.GetAllEvaluatedPipelines().All( + p => p.PerformanceSummary.MetricValue >= bestPipeline.PerformanceSummary.MetricValue)); + } } [Fact] @@ -517,102 +220,26 @@ public void TestLearnerConstrainingByName() int numIterations = 1; int numTransformLevels = 2; var retainedLearnerNames = new[] { $"LogisticRegressionBinaryClassifier", $"FastTreeBinaryClassifier" }; - AutoInference.SupportedMetric metric = AutoInference.SupportedMetric.Auc; - - // Using the simple, uniform random sampling (with replacement) brain. - PipelineOptimizerBase autoMlBrain = new UniformRandomEngine(Env); + using (var env = new TlcEnvironment()) + { + SupportedMetric metric = PipelineSweeperSupportedMetrics.GetSupportedMetric(PipelineSweeperSupportedMetrics.Metrics.Auc); - // Run initial experiment. - var amls = AutoInference.InferPipelines(Env, autoMlBrain, pathData, "", out var _, - numTransformLevels, batchSize, metric, out var _, numOfSampleRows, - new IterationTerminator(numIterations), MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer); + // Using the simple, uniform random sampling (with replacement) brain. + PipelineOptimizerBase autoMlBrain = new UniformRandomEngine(Env); - // Keep only logistic regression and FastTree. - amls.KeepSelectedLearners(retainedLearnerNames); - var space = amls.GetSearchSpace(); + // Run initial experiment. + var amls = AutoInference.InferPipelines(Env, autoMlBrain, pathData, "", out var _, + numTransformLevels, batchSize, metric, out var _, numOfSampleRows, + new IterationTerminator(numIterations), MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer); - // Make sure only learners left are those retained. - Assert.Equal(retainedLearnerNames.Length, space.Item2.Length); - Assert.True(space.Item2.All(l => retainedLearnerNames.Any(r => r == l.LearnerName))); - } + // Keep only logistic regression and FastTree. + amls.KeepSelectedLearners(retainedLearnerNames); + var space = amls.GetSearchSpace(); - [Fact] - public void TestRequestedLearners() - { - // Get datasets - var pathData = GetDataPath("adult.train"); - var pathDataTest = GetDataPath("adult.test"); - const int numOfSampleRows = 100; - const string schema = - "sep=, col=Features:R4:0,2,4,10-12 col=workclass:TX:1 col=education:TX:3 col=marital_status:TX:5 col=occupation:TX:6 " + - "col=relationship:TX:7 col=race:TX:8 col=sex:TX:9 col=native_country:TX:13 col=label_IsOver50K_:R4:14 header=+"; - var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); -#pragma warning disable 0618 - var datasetTrain = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); - var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); - var datasetTest = ImportTextData.ImportText(Env, - new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); - var requestedLearners = new[] { $"LogisticRegressionBinaryClassifier", $"FastTreeBinaryClassifier" }; -#pragma warning restore 0618 - // Define entrypoint graph - string inputGraph = @" - { - 'Nodes': [ - { - 'Name': 'Models.PipelineSweeper', - 'Inputs': { - 'TrainingData': '$TrainingData', - 'TestingData': '$TestingData', - 'StateArguments': { - 'Name': 'AutoMlState', - 'Settings': { - 'Metric': 'Auc', - 'Engine': { - 'Name': 'Rocket', - 'Settings' : { - 'TopKLearners' : 2, - 'SecondRoundTrialsPerLearner' : 0 - }, - }, - 'TerminatorArgs': { - 'Name': 'IterationLimited', - 'Settings': { - 'FinalHistoryLength': 35 - } - }, - 'TrainerKind': 'SignatureBinaryClassifierTrainer', - 'RequestedLearners' : [ - 'LogisticRegressionBinaryClassifier', - 'FastTreeBinaryClassifier' - ] - } - }, - 'BatchSize': 5 - }, - 'Outputs': { - 'State': '$StateOut', - 'Results': '$ResultsOut' - } - }, - ] - }"; - - JObject graph = JObject.Parse(inputGraph); - var catalog = ModuleCatalog.CreateInstance(Env); - - var runner = new GraphRunner(Env, catalog, graph[FieldNames.Nodes] as JArray); - runner.SetInput("TrainingData", datasetTrain); - runner.SetInput("TestingData", datasetTest); - runner.RunAll(); - - var autoMlState = runner.GetOutput("StateOut"); - Assert.NotNull(autoMlState); - var space = autoMlState.GetSearchSpace(); - - // Make sure only learners left are those retained. - Assert.Equal(requestedLearners.Length, space.Item2.Length); - Assert.True(space.Item2.All(l => requestedLearners.Any(r => r == l.LearnerName))); + // Make sure only learners left are those retained. + Assert.Equal(retainedLearnerNames.Length, space.Item2.Length); + Assert.True(space.Item2.All(l => retainedLearnerNames.Any(r => r == l.LearnerName))); + } } [Fact] diff --git a/test/Microsoft.ML.Predictor.Tests/TestDatasetInference.cs b/test/Microsoft.ML.Predictor.Tests/TestDatasetInference.cs index 495f844133..0bde64a2af 100644 --- a/test/Microsoft.ML.Predictor.Tests/TestDatasetInference.cs +++ b/test/Microsoft.ML.Predictor.Tests/TestDatasetInference.cs @@ -121,7 +121,7 @@ public void InferSchemaCommandTest() [Fact] public void InferRecipesCommandTest() { - var datasets = new Tuple[] + var datasets = new Tuple[] { Tuple.Create( GetDataPath(Path.Combine("..", "data", "wikipedia-detox-250-line-data.tsv")), diff --git a/test/Microsoft.ML.Predictor.Tests/TestPipelineSweeper.cs b/test/Microsoft.ML.Predictor.Tests/TestPipelineSweeper.cs new file mode 100644 index 0000000000..d11811df6b --- /dev/null +++ b/test/Microsoft.ML.Predictor.Tests/TestPipelineSweeper.cs @@ -0,0 +1,564 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.EntryPoints; +using Microsoft.ML.Runtime.EntryPoints.JsonUtils; +using Microsoft.ML.Runtime.PipelineInference; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.ML.Runtime.RunTests +{ + public sealed class TestPipelineSweeper : BaseTestBaseline + { + public TestPipelineSweeper(ITestOutputHelper helper) + : base(helper) + { + } + + [Fact] + public void PipelineSweeperBasic() + { + // Get datasets + var pathData = GetDataPath("adult.tiny.with-schema.txt"); + var pathDataTest = GetDataPath("adult.tiny.with-schema.txt"); + const int numOfSampleRows = 1000; + int numIterations = 4; + var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); +#pragma warning disable 0618 + var datasetTrain = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTrain }).Data.Take(numOfSampleRows); + var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); + var datasetTest = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTest }).Data.Take(numOfSampleRows); +#pragma warning restore 0618 + // Define entrypoint graph + string inputGraph = @" + { + 'Nodes': [ + { + 'Name': 'Models.PipelineSweeper', + 'Inputs': { + 'TrainingData': '$TrainingData', + 'TestingData': '$TestingData', + 'StateArguments': { + 'Name': 'AutoMlState', + 'Settings': { + 'Metric': 'Auc', + 'Engine': { + 'Name': 'UniformRandom' + }, + 'TerminatorArgs': { + 'Name': 'IterationLimited', + 'Settings': { + 'FinalHistoryLength': 4 + } + }, + 'TrainerKind': 'SignatureBinaryClassifierTrainer' + } + }, + 'BatchSize': 2 + }, + 'Outputs': { + 'State': '$StateOut', + 'Results': '$ResultsOut' + } + }, + ] + }"; + + JObject graph = JObject.Parse(inputGraph); + var catalog = ModuleCatalog.CreateInstance(Env); + + var runner = new GraphRunner(Env, catalog, graph[FieldNames.Nodes] as JArray); + runner.SetInput("TrainingData", datasetTrain); + runner.SetInput("TestingData", datasetTest); + runner.RunAll(); + + var autoMlState = runner.GetOutput("StateOut"); + Assert.NotNull(autoMlState); + var allPipelines = autoMlState.GetAllEvaluatedPipelines(); + var bestPipeline = autoMlState.GetBestPipeline(); + Assert.Equal(allPipelines.Length, numIterations); + Assert.True(bestPipeline.PerformanceSummary.MetricValue > 0.1); + + var results = runner.GetOutput("ResultsOut"); + Assert.NotNull(results); + var rows = PipelinePattern.ExtractResults(Env, results, + "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); + Assert.True(rows.Length == numIterations); + Assert.True(rows.All(r => r.TrainingMetricValue > 0.1)); + } + + [Fact] + [TestCategory("EntryPoints")] + public void PipelineSweeperNoTransforms() + { + // Set up inputs for experiment + string pathData = GetDataPath("adult.train"); + string pathDataTest = GetDataPath("adult.test"); + const int numOfSampleRows = 1000; + const string schema = "sep=, col=Features:R4:0,2,4,10-12 col=Label:R4:14 header=+"; + + var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); +#pragma warning disable 0618 + var datasetTrain = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); + var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); + var datasetTest = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); +#pragma warning restore 0618 + const int batchSize = 5; + const int numIterations = 20; + const int numTransformLevels = 2; + using (var env = new TlcEnvironment()) + { + SupportedMetric metric = PipelineSweeperSupportedMetrics.GetSupportedMetric(PipelineSweeperSupportedMetrics.Metrics.Auc); + + // Using the simple, uniform random sampling (with replacement) engine + PipelineOptimizerBase autoMlEngine = new UniformRandomEngine(Env); + + // Create search object + var amls = new AutoInference.AutoMlMlState(Env, metric, autoMlEngine, new IterationTerminator(numIterations), + MacroUtils.TrainerKinds.SignatureBinaryClassifierTrainer, datasetTrain, datasetTest); + + // Infer search space + amls.InferSearchSpace(numTransformLevels); + + // Create macro object + var pipelineSweepInput = new Microsoft.ML.Models.PipelineSweeper() + { + BatchSize = batchSize, + }; + + var exp = new Experiment(Env); + var output = exp.Add(pipelineSweepInput); + exp.Compile(); + exp.SetInput(pipelineSweepInput.TrainingData, datasetTrain); + exp.SetInput(pipelineSweepInput.TestingData, datasetTest); + exp.SetInput(pipelineSweepInput.State, amls); + exp.SetInput(pipelineSweepInput.CandidateOutputs, new IDataView[0]); + exp.Run(); + + // Make sure you get back an AutoMlState, and that it ran for correct number of iterations + // with at least minimal performance values (i.e., best should have AUC better than 0.1 on this dataset). + AutoInference.AutoMlMlState amlsOut = (AutoInference.AutoMlMlState)exp.GetOutput(output.State); + Assert.NotNull(amlsOut); + Assert.Equal(amlsOut.GetAllEvaluatedPipelines().Length, numIterations); + Assert.True(amlsOut.GetBestPipeline().PerformanceSummary.MetricValue > 0.8); + } + } + + [Fact] + [TestCategory("EntryPoints")] + public void PipelineSweeperSerialization() + { + // Get datasets + var pathData = GetDataPath("adult.train"); + var pathDataTest = GetDataPath("adult.test"); + const int numOfSampleRows = 1000; + int numIterations = 10; + const string schema = + "sep=, col=Features:R4:0,2,4,10-12 col=workclass:TX:1 col=education:TX:3 col=marital_status:TX:5 col=occupation:TX:6 " + + "col=relationship:TX:7 col=ethnicity:TX:8 col=sex:TX:9 col=native_country:TX:13 col=label_IsOver50K_:R4:14 header=+"; + var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); +#pragma warning disable 0618 + var datasetTrain = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); + var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); + var datasetTest = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); +#pragma warning restore 0618 + + // Define entrypoint graph + string inputGraph = @" + { + 'Nodes': [ + { + 'Name': 'Models.PipelineSweeper', + 'Inputs': { + 'TrainingData': '$TrainingData', + 'TestingData': '$TestingData', + 'StateArguments': { + 'Name': 'AutoMlState', + 'Settings': { + 'Metric': 'Auc', + 'Engine': { + 'Name': 'UniformRandom' + }, + 'TerminatorArgs': { + 'Name': 'IterationLimited', + 'Settings': { + 'FinalHistoryLength': 10 + } + }, + 'TrainerKind': 'SignatureBinaryClassifierTrainer' + } + }, + 'BatchSize': 5 + }, + 'Outputs': { + 'State': '$StateOut', + 'Results': '$ResultsOut' + } + }, + ] + }"; + + JObject graphJson = JObject.Parse(inputGraph); + var catalog = ModuleCatalog.CreateInstance(Env); + var graph = new EntryPointGraph(Env, catalog, graphJson[FieldNames.Nodes] as JArray); + // Test if ToJson() works properly. + var nodes = new JArray(graph.AllNodes.Select(node => node.ToJson())); + var runner = new GraphRunner(Env, catalog, nodes); + runner.SetInput("TrainingData", datasetTrain); + runner.SetInput("TestingData", datasetTest); + runner.RunAll(); + + var results = runner.GetOutput("ResultsOut"); + Assert.NotNull(results); + var rows = PipelinePattern.ExtractResults(Env, results, + "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); + Assert.True(rows.Length == numIterations); + } + + [Fact] + [TestCategory("EntryPoints")] + public void PipelineSweeperRoles() + { + // Get datasets + var pathData = GetDataPath("adult.train"); + var pathDataTest = GetDataPath("adult.test"); + const int numOfSampleRows = 100; + int numIterations = 2; + const string schema = + "sep=, col=age:R4:0 col=workclass:TX:1 col=fnlwgt:R4:2 col=education:TX:3 col=education_num:R4:4 col=marital_status:TX:5 col=occupation:TX:6 " + + "col=relationship:TX:7 col=ethnicity:TX:8 col=sex:TX:9 col=Features:R4:10-12 col=native_country:TX:13 col=IsOver50K_:R4:14 header=+"; + var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); +#pragma warning disable 0618 + var datasetTrain = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); + var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); + var datasetTest = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); +#pragma warning restore 0618 + + // Define entrypoint graph + string inputGraph = @" + { + 'Nodes': [ + { + 'Name': 'Models.PipelineSweeper', + 'Inputs': { + 'TrainingData': '$TrainingData', + 'TestingData': '$TestingData', + 'LabelColumns': ['IsOver50K_'], + 'WeightColumns': ['education_num'], + 'NameColumns': ['education'], + 'TextFeatureColumns': ['workclass', 'marital_status', 'occupation'], + 'StateArguments': { + 'Name': 'AutoMlState', + 'Settings': { + 'Metric': 'Auc', + 'Engine': { + 'Name': 'Defaults' + }, + 'TerminatorArgs': { + 'Name': 'IterationLimited', + 'Settings': { + 'FinalHistoryLength': 2 + } + }, + 'TrainerKind': 'SignatureBinaryClassifierTrainer', + 'RequestedLearners' : [ + 'LogisticRegressionBinaryClassifier', + 'FastTreeBinaryClassifier' + ] + } + }, + 'BatchSize': 1 + }, + 'Outputs': { + 'State': '$StateOut', + 'Results': '$ResultsOut' + } + }, + ] + }"; + + JObject graphJson = JObject.Parse(inputGraph); + var catalog = ModuleCatalog.CreateInstance(Env); + var runner = new GraphRunner(Env, catalog, graphJson[FieldNames.Nodes] as JArray); + runner.SetInput("TrainingData", datasetTrain); + runner.SetInput("TestingData", datasetTest); + runner.RunAll(); + + var autoMlState = runner.GetOutput("StateOut"); + Assert.NotNull(autoMlState); + var allPipelines = autoMlState.GetAllEvaluatedPipelines(); + var bestPipeline = autoMlState.GetBestPipeline(); + Assert.Equal(allPipelines.Length, numIterations); + + var trainAuc = bestPipeline.PerformanceSummary.TrainingMetricValue; + var testAuc = bestPipeline.PerformanceSummary.MetricValue; + Assert.True((0.94 < trainAuc) && (trainAuc < 0.95)); + Assert.True((0.815 < testAuc) && (testAuc < 0.825)); + + var results = runner.GetOutput("ResultsOut"); + Assert.NotNull(results); + var rows = PipelinePattern.ExtractResults(Env, results, + "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); + Assert.True(rows.Length == numIterations); + Assert.True(rows.All(r => r.TrainingMetricValue > 0.1)); + } + + [Fact] + [TestCategory("EntryPoints")] + public void PipelineSweeperMultiClassClassification() + { + // Get datasets + // TODO (agoswami) : For now we use the same dataset for train and test since the repo does not have a separate test file for the iris dataset. + // In the future the PipelineSweeper Macro will have an option to take just one dataset as input, and do the train-test split internally. + var pathData = GetDataPath(@"iris.txt"); + var pathDataTest = GetDataPath(@"iris.txt"); + int numIterations = 2; + const string schema = "col=Species:R4:0 col=SepalLength:R4:1 col=SepalWidth:R4:2 col=PetalLength:R4:3 col=PetalWidth:R4:4"; + var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); +#pragma warning disable 0618 + var datasetTrain = ImportTextData.ImportText(Env, new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data; + var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); + var datasetTest = ImportTextData.ImportText(Env, new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data; +#pragma warning restore 0618 + + // Define entrypoint graph + string inputGraph = @" + { + 'Nodes': [ + { + 'Name': 'Models.PipelineSweeper', + 'Inputs': { + 'TrainingData': '$TrainingData', + 'TestingData': '$TestingData', + 'LabelColumns': ['Species'], + 'StateArguments': { + 'Name': 'AutoMlState', + 'Settings': { + 'Metric': 'AccuracyMicro', + 'Engine': { + 'Name': 'Defaults' + }, + 'TerminatorArgs': { + 'Name': 'IterationLimited', + 'Settings': { + 'FinalHistoryLength': 2 + } + }, + 'TrainerKind': 'SignatureMultiClassClassifierTrainer', + 'RequestedLearners' : [ + 'LogisticRegressionClassifier', + 'StochasticDualCoordinateAscentClassifier' + ] + } + }, + 'BatchSize': 1 + }, + 'Outputs': { + 'State': '$StateOut', + 'Results': '$ResultsOut' + } + }, + ] + }"; + + JObject graphJson = JObject.Parse(inputGraph); + var catalog = ModuleCatalog.CreateInstance(Env); + var runner = new GraphRunner(Env, catalog, graphJson[FieldNames.Nodes] as JArray); + runner.SetInput("TrainingData", datasetTrain); + runner.SetInput("TestingData", datasetTest); + runner.RunAll(); + + var autoMlState = runner.GetOutput("StateOut"); + Assert.NotNull(autoMlState); + var allPipelines = autoMlState.GetAllEvaluatedPipelines(); + var bestPipeline = autoMlState.GetBestPipeline(); + Assert.Equal(allPipelines.Length, numIterations); + + var bestMicroAccuracyTrain = bestPipeline.PerformanceSummary.TrainingMetricValue; + var bestMicroAccuracyTest = bestPipeline.PerformanceSummary.MetricValue; + Assert.True((0.97 < bestMicroAccuracyTrain) && (bestMicroAccuracyTrain < 0.99)); + Assert.True((0.97 < bestMicroAccuracyTest) && (bestMicroAccuracyTest < 0.99)); + + var results = runner.GetOutput("ResultsOut"); + Assert.NotNull(results); + var rows = PipelinePattern.ExtractResults(Env, results, + "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); + Assert.True(rows.Length == numIterations); + Assert.True(rows.All(r => r.MetricValue > 0.9)); + } + + [Fact] + public void PipelineSweeperRocketEngine() + { + // Get datasets + var pathData = GetDataPath("adult.train"); + var pathDataTest = GetDataPath("adult.test"); + const int numOfSampleRows = 1000; + int numIterations = 35; + const string schema = + "sep=, col=Features:R4:0,2,4,10-12 col=workclass:TX:1 col=education:TX:3 col=marital_status:TX:5 col=occupation:TX:6 " + + "col=relationship:TX:7 col=ethnicity:TX:8 col=sex:TX:9 col=native_country:TX:13 col=label_IsOver50K_:R4:14 header=+"; + var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); +#pragma warning disable 0618 + var datasetTrain = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); + var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); + var datasetTest = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); +#pragma warning restore 0618 + // Define entrypoint graph + string inputGraph = @" + { + 'Nodes': [ + { + 'Name': 'Models.PipelineSweeper', + 'Inputs': { + 'TrainingData': '$TrainingData', + 'TestingData': '$TestingData', + 'StateArguments': { + 'Name': 'AutoMlState', + 'Settings': { + 'Metric': 'Auc', + 'Engine': { + 'Name': 'Rocket', + 'Settings' : { + 'TopKLearners' : 2, + 'SecondRoundTrialsPerLearner' : 5 + }, + }, + 'TerminatorArgs': { + 'Name': 'IterationLimited', + 'Settings': { + 'FinalHistoryLength': 35 + } + }, + 'TrainerKind': 'SignatureBinaryClassifierTrainer' + } + }, + 'BatchSize': 5 + }, + 'Outputs': { + 'State': '$StateOut', + 'Results': '$ResultsOut' + } + }, + ] + }"; + + JObject graph = JObject.Parse(inputGraph); + var catalog = ModuleCatalog.CreateInstance(Env); + + var runner = new GraphRunner(Env, catalog, graph[FieldNames.Nodes] as JArray); + runner.SetInput("TrainingData", datasetTrain); + runner.SetInput("TestingData", datasetTest); + runner.RunAll(); + + var autoMlState = runner.GetOutput("StateOut"); + Assert.NotNull(autoMlState); + var allPipelines = autoMlState.GetAllEvaluatedPipelines(); + var bestPipeline = autoMlState.GetBestPipeline(); + Assert.Equal(allPipelines.Length, numIterations); + Assert.True(bestPipeline.PerformanceSummary.MetricValue > 0.1); + + var results = runner.GetOutput("ResultsOut"); + Assert.NotNull(results); + var rows = PipelinePattern.ExtractResults(Env, results, + "Graph", "MetricValue", "PipelineId", "TrainingMetricValue", "FirstInput", "PredictorModel"); + Assert.True(rows.Length == numIterations); + } + + [Fact] + public void PipelineSweeperRequestedLearners() + { + // Get datasets + var pathData = GetDataPath("adult.train"); + var pathDataTest = GetDataPath("adult.test"); + const int numOfSampleRows = 100; + const string schema = + "sep=, col=Features:R4:0,2,4,10-12 col=workclass:TX:1 col=education:TX:3 col=marital_status:TX:5 col=occupation:TX:6 " + + "col=relationship:TX:7 col=race:TX:8 col=sex:TX:9 col=native_country:TX:13 col=label_IsOver50K_:R4:14 header=+"; + var inputFileTrain = new SimpleFileHandle(Env, pathData, false, false); +#pragma warning disable 0618 + var datasetTrain = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTrain, CustomSchema = schema }).Data.Take(numOfSampleRows); + var inputFileTest = new SimpleFileHandle(Env, pathDataTest, false, false); + var datasetTest = ImportTextData.ImportText(Env, + new ImportTextData.Input { InputFile = inputFileTest, CustomSchema = schema }).Data.Take(numOfSampleRows); + var requestedLearners = new[] { $"LogisticRegressionBinaryClassifier", $"FastTreeBinaryClassifier" }; +#pragma warning restore 0618 + // Define entrypoint graph + string inputGraph = @" + { + 'Nodes': [ + { + 'Name': 'Models.PipelineSweeper', + 'Inputs': { + 'TrainingData': '$TrainingData', + 'TestingData': '$TestingData', + 'StateArguments': { + 'Name': 'AutoMlState', + 'Settings': { + 'Metric': 'Auc', + 'Engine': { + 'Name': 'Rocket', + 'Settings' : { + 'TopKLearners' : 2, + 'SecondRoundTrialsPerLearner' : 0 + }, + }, + 'TerminatorArgs': { + 'Name': 'IterationLimited', + 'Settings': { + 'FinalHistoryLength': 35 + } + }, + 'TrainerKind': 'SignatureBinaryClassifierTrainer', + 'RequestedLearners' : [ + 'LogisticRegressionBinaryClassifier', + 'FastTreeBinaryClassifier' + ] + } + }, + 'BatchSize': 5 + }, + 'Outputs': { + 'State': '$StateOut', + 'Results': '$ResultsOut' + } + }, + ] + }"; + + JObject graph = JObject.Parse(inputGraph); + var catalog = ModuleCatalog.CreateInstance(Env); + + var runner = new GraphRunner(Env, catalog, graph[FieldNames.Nodes] as JArray); + runner.SetInput("TrainingData", datasetTrain); + runner.SetInput("TestingData", datasetTest); + runner.RunAll(); + + var autoMlState = runner.GetOutput("StateOut"); + Assert.NotNull(autoMlState); + var space = autoMlState.GetSearchSpace(); + + // Make sure only learners left are those retained. + Assert.Equal(requestedLearners.Length, space.Item2.Length); + Assert.True(space.Item2.All(l => requestedLearners.Any(r => r == l.LearnerName))); + } + } +} diff --git a/test/Microsoft.ML.Predictor.Tests/TestPredictors.cs b/test/Microsoft.ML.Predictor.Tests/TestPredictors.cs index 91513e0e74..7f6c4b5ccd 100644 --- a/test/Microsoft.ML.Predictor.Tests/TestPredictors.cs +++ b/test/Microsoft.ML.Predictor.Tests/TestPredictors.cs @@ -11,6 +11,12 @@ namespace Microsoft.ML.Runtime.RunTests { + using Microsoft.ML.Runtime.Data; + using Microsoft.ML.Runtime.EntryPoints; + using Microsoft.ML.Runtime.FastTree; + using Microsoft.ML.Runtime.FastTree.Internal; + using System.Linq; + using System.Runtime.InteropServices; using Xunit; using Xunit.Abstractions; using TestLearners = TestLearnersBase; @@ -84,7 +90,7 @@ public IList GetDatasetsForClassificationWeightingPredictorsTest() [TestCategory("Binary")] public void BinaryClassifierPerceptronTest() { - var binaryPredictors = new[] { TestLearners.perceptron, /*TestLearners.perceptron_reg*/ }; + var binaryPredictors = new[] { TestLearners.perceptron }; var binaryClassificationDatasets = GetDatasetsForBinaryClassifierBaseTest(); RunAllTests(binaryPredictors, binaryClassificationDatasets); Done(); @@ -382,7 +388,7 @@ public void WeightingFastForestRegressionPredictorsTest() }); Done(); } - + [Fact] [TestCategory("Binary")] [TestCategory("FastTree")] @@ -392,7 +398,7 @@ public void FastTreeBinaryClassificationTest() { var learners = new[] { TestLearners.FastTreeClassfier, TestLearners.FastTreeDropoutClassfier, TestLearners.FastTreeBsrClassfier, TestLearners.FastTreeClassfierDisk }; - var binaryClassificationDatasets = new List { TestDatasets.breastCancerPipe}; + var binaryClassificationDatasets = new List { TestDatasets.breastCancerPipe }; foreach (var learner in learners) { foreach (TestDataset dataset in binaryClassificationDatasets) @@ -402,6 +408,259 @@ public void FastTreeBinaryClassificationTest() Done(); } + [Fact] + [TestCategory("Binary")] + [TestCategory("LightGBM")] + public void LightGBMClassificationTest() + { + var learners = new[] { TestLearners.LightGBMClassifier }; + var binaryClassificationDatasets = new List { TestDatasets.breastCancerPipe }; + foreach (var learner in learners) + { + foreach (TestDataset dataset in binaryClassificationDatasets) + Run_TrainTest(learner, dataset); + } + + Done(); + } + + [Fact] + [TestCategory("Binary"), TestCategory("LightGBM")] + public void GossLightGBMTest() + { + var binaryPredictors = new[] { TestLearners.LightGBMGoss }; + var binaryClassificationDatasets = new List { TestDatasets.breastCancerPipe }; + RunAllTests(binaryPredictors, binaryClassificationDatasets, extraTag: "goss"); + Done(); + } + + [Fact] + [TestCategory("Binary")] + [TestCategory("LightGBM")] + public void DartLightGBMTest() + { + var binaryPredictors = new[] { TestLearners.LightGBMDart }; + var binaryClassificationDatasets = new List { TestDatasets.breastCancerPipe }; + RunAllTests(binaryPredictors, binaryClassificationDatasets, extraTag: "dart"); + Done(); + } + + /// + /// A test for multi class classifiers. + /// + [Fact] + [TestCategory("Multiclass")] + [TestCategory("LightGBM")] + public void MultiClassifierLightGBMKeyLabelTest() + { + var multiPredictors = new[] { TestLearners.LightGBMMC }; + var multiClassificationDatasets = new[] { TestDatasets.irisLoader }; + RunAllTests(multiPredictors, multiClassificationDatasets, extraTag: "key"); + Done(); + } + + /// + /// A test for multi class classifiers. + /// + [Fact] + [TestCategory("Multiclass")] + [TestCategory("LightGBM")] + public void MultiClassifierLightGBMKeyLabelU404Test() + { + var multiPredictors = new[] { TestLearners.LightGBMMC }; + var multiClassificationDatasets = new[] { TestDatasets.irisLoaderU404 }; + RunAllTests(multiPredictors, multiClassificationDatasets, extraTag: "keyU404"); + Done(); + } + + /// + /// A test for regression. + /// + [Fact] + [TestCategory("Regression")] + [TestCategory("LightGBM")] + public void RegressorLightGBMTest() + { + var regPredictors = new[] { TestLearners.LightGBMReg }; + var regDatasets = new[] { TestDatasets.winequality }; + RunAllTests(regPredictors, regDatasets); + Done(); + } + + /// + /// A test for regression. + /// + [Fact] + [TestCategory("Regression")] + [TestCategory("LightGBM")] + public void RegressorLightGBMMAETest() + { + var regPredictors = new[] { TestLearners.LightGBMRegMae }; + var regDatasets = new[] { TestDatasets.winequality }; + RunAllTests(regPredictors, regDatasets, extraTag: "MAE"); + Done(); + } + + /// + /// A test for regression. + /// + [Fact] + [TestCategory("Regression")] + [TestCategory("LightGBM")] + public void RegressorLightGBMRMSETest() + { + var regPredictors = new[] { TestLearners.LightGBMRegRmse }; + var regDatasets = new[] { TestDatasets.winequality }; + RunAllTests(regPredictors, regDatasets, extraTag: "RMSE"); + Done(); + } + + /// + /// A test for ranking. The training does not seem to be accurate. + /// The evaluation is still based on nDCG which is not really convenient pair-wise ranking. + /// + [Fact(Skip = "Need to find ranking dataset.")] + [TestCategory("Ranking")] + [TestCategory("LightGBM")] + public void RankingLightGBMTest() + { + var args = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBMRank", + "nt=1 iter=20 v=+ mil=20 nl=20 lr=0.2") + }; + + var rankPredictors = new[] { args }; + var rankDatasets = new[] { TestDatasets.MQ2008 }; + RunAllTests(rankPredictors, rankDatasets); + Done(); + } + + [Fact] + public void TestTreeEnsembleCombiner() + { + var dataPath = GetDataPath("breast-cancer.txt"); + var inputFile = new SimpleFileHandle(Env, dataPath, false, false); +#pragma warning disable 0618 + var dataView = ImportTextData.ImportText(Env, new ImportTextData.Input { InputFile = inputFile }).Data; +#pragma warning restore 0618 + + var fastTrees = new IPredictorModel[3]; + for (int i = 0; i < 3; i++) + { + fastTrees[i] = FastTree.TrainBinary(Env, new FastTreeBinaryClassificationTrainer.Arguments + { + FeatureColumn = "Features", + NumTrees = 5, + NumLeaves = 4, + LabelColumn = DefaultColumnNames.Label, + TrainingData = dataView + }).PredictorModel; + } + CombineAndTestTreeEnsembles(dataView, fastTrees); + } + + [Fact] + public void TestTreeEnsembleCombinerWithCategoricalSplits() + { + var dataPath = GetDataPath("adult.tiny.with-schema.txt"); + var inputFile = new SimpleFileHandle(Env, dataPath, false, false); +#pragma warning disable 0618 + var dataView = ImportTextData.ImportText(Env, new ImportTextData.Input { InputFile = inputFile }).Data; +#pragma warning restore 0618 + + var cat = CategoricalTransform.Create(Env, + new CategoricalTransform.Arguments() + { + Column = new[] + { + new CategoricalTransform.Column() { Name = "Features", Source = "Categories" } + } + }, dataView); + var fastTrees = new IPredictorModel[3]; + for (int i = 0; i < 3; i++) + { + fastTrees[i] = FastTree.TrainBinary(Env, new FastTreeBinaryClassificationTrainer.Arguments + { + FeatureColumn = "Features", + NumTrees = 5, + NumLeaves = 4, + CategoricalSplit = true, + LabelColumn = DefaultColumnNames.Label, + TrainingData = cat + }).PredictorModel; + } + CombineAndTestTreeEnsembles(cat, fastTrees); + } + + private void CombineAndTestTreeEnsembles(IDataView idv, IPredictorModel[] fastTrees) + { + var combiner = new TreeEnsembleCombiner(Env, PredictionKind.BinaryClassification); + + var fastTree = combiner.CombineModels(fastTrees.Select(pm => pm.Predictor as IPredictorProducing)); + + var data = new RoleMappedData(idv, label: null, feature: "Features"); + var scored = ScoreModel.Score(Env, new ScoreModel.Input() { Data = idv, PredictorModel = new PredictorModel(Env, data, idv, fastTree) }).ScoredData; + Assert.True(scored.Schema.TryGetColumnIndex("Score", out int scoreCol)); + Assert.True(scored.Schema.TryGetColumnIndex("Probability", out int probCol)); + Assert.True(scored.Schema.TryGetColumnIndex("PredictedLabel", out int predCol)); + + var scoredArray = new IDataView[3]; + var scoreColArray = new int[3]; + var probColArray = new int[3]; + var predColArray = new int[3]; + for (int i = 0; i < 3; i++) + { + scoredArray[i] = ScoreModel.Score(Env, new ScoreModel.Input() { Data = idv, PredictorModel = fastTrees[i] }).ScoredData; + Assert.True(scoredArray[i].Schema.TryGetColumnIndex("Score", out scoreColArray[i])); + Assert.True(scoredArray[i].Schema.TryGetColumnIndex("Probability", out probColArray[i])); + Assert.True(scoredArray[i].Schema.TryGetColumnIndex("PredictedLabel", out predColArray[i])); + } + + var cursors = new IRowCursor[3]; + using (var curs = scored.GetRowCursor(c => c == scoreCol || c == probCol || c == predCol)) + using (cursors[0] = scoredArray[0].GetRowCursor(c => c == scoreColArray[0] || c == probColArray[0] || c == predColArray[0])) + using (cursors[1] = scoredArray[1].GetRowCursor(c => c == scoreColArray[1] || c == probColArray[1] || c == predColArray[1])) + using (cursors[2] = scoredArray[2].GetRowCursor(c => c == scoreColArray[2] || c == probColArray[2] || c == predColArray[2])) + { + var scoreGetter = curs.GetGetter(scoreCol); + var probGetter = curs.GetGetter(probCol); + var predGetter = curs.GetGetter(predCol); + var scoreGetters = new ValueGetter[3]; + var probGetters = new ValueGetter[3]; + var predGetters = new ValueGetter[3]; + for (int i = 0; i < 3; i++) + { + scoreGetters[i] = cursors[i].GetGetter(scoreColArray[i]); + probGetters[i] = cursors[i].GetGetter(probColArray[i]); + predGetters[i] = cursors[i].GetGetter(predColArray[i]); + } + + float score = 0; + float prob = 0; + var pred = default(DvBool); + var scores = new float[3]; + var probs = new float[3]; + var preds = new DvBool[3]; + while (curs.MoveNext()) + { + scoreGetter(ref score); + probGetter(ref prob); + predGetter(ref pred); + for (int i = 0; i < 3; i++) + { + Assert.True(cursors[i].MoveNext()); + scoreGetters[i](ref scores[i]); + probGetters[i](ref probs[i]); + predGetters[i](ref preds[i]); + } + Assert.Equal(score, 0.4 * scores.Sum() / 3, 5); + Assert.Equal(prob, 1 / (1 + Math.Exp(-score)), 6); + Assert.True(pred.IsTrue == score > 0); + } + } + } + [Fact] [TestCategory("Binary")] [TestCategory("FastTree")] @@ -651,7 +910,7 @@ public void RegressorSdcaTest() Done(); } -#region "Regressor" + #region "Regressor" #if OLD_TESTS // REVIEW: Port these tests? /// @@ -962,7 +1221,7 @@ public void RegressorSyntheticDuplicatedOlsTest() } #endif -#endregion + #endregion /// ///A test for FR ranker @@ -1042,7 +1301,7 @@ public IList GetDatasetsForCalibratorTest() public void DefaultCalibratorPerceptronTest() { var datasets = GetDatasetsForCalibratorTest(); - RunAllTests( new[] { TestLearners.perceptronDefault }, datasets, new string[] { "cali={}" }, "nocalibration"); + RunAllTests(new[] { TestLearners.perceptronDefault }, datasets, new string[] { "cali={}" }, "nocalibration"); Done(); } @@ -1054,7 +1313,7 @@ public void DefaultCalibratorPerceptronTest() public void PAVCalibratorPerceptronTest() { var datasets = GetDatasetsForCalibratorTest(); - RunAllTests( new[] { TestLearners.perceptronDefault }, datasets, new[] { "cali=PAV" }, "PAVcalibration"); + RunAllTests(new[] { TestLearners.perceptronDefault }, datasets, new[] { "cali=PAV" }, "PAVcalibration"); Done(); } @@ -1066,7 +1325,7 @@ public void PAVCalibratorPerceptronTest() public void RandomCalibratorPerceptronTest() { var datasets = GetDatasetsForCalibratorTest(); - RunAllTests( new[] { TestLearners.perceptronDefault }, datasets, new string[] { "numcali=200" }, "calibrateRandom"); + RunAllTests(new[] { TestLearners.perceptronDefault }, datasets, new string[] { "numcali=200" }, "calibrateRandom"); Done(); } @@ -1078,7 +1337,7 @@ public void RandomCalibratorPerceptronTest() public void NoCalibratorLinearSvmTest() { var datasets = GetDatasetsForCalibratorTest(); - RunAllTests( new[] { TestLearners.linearSVM }, datasets, new string[] { "cali={}" }, "nocalibration"); + RunAllTests(new[] { TestLearners.linearSVM }, datasets, new string[] { "cali={}" }, "nocalibration"); Done(); } @@ -1090,7 +1349,7 @@ public void NoCalibratorLinearSvmTest() public void PAVCalibratorLinearSvmTest() { var datasets = GetDatasetsForCalibratorTest(); - RunAllTests( new[] { TestLearners.linearSVM }, datasets, new string[] { "cali=PAV" }, "PAVcalibration"); + RunAllTests(new[] { TestLearners.linearSVM }, datasets, new string[] { "cali=PAV" }, "PAVcalibration"); Done(); } @@ -1278,10 +1537,10 @@ public void CompareSvmPredictorResultsToLibSvm() Column = new[] { new NormalizeTransform.AffineColumn() { Name = "Features", Source = "Features" } } }, trainView); - var trainData = TrainUtils.CreateExamples(trainView, "Label", "Features"); + var trainData = new RoleMappedData(trainView, "Label", "Features"); IDataView testView = new TextLoader(env, new TextLoader.Arguments(), new MultiFileSource(GetDataPath(TestDatasets.mnistOneClass.testFilename))); ApplyTransformUtils.ApplyAllTransformsToData(env, trainView, testView); - var testData = TrainUtils.CreateExamples(testView, "Label", "Features"); + var testData = new RoleMappedData(testView, "Label", "Features"); CompareSvmToLibSvmCore("linear kernel", "LinearKernel", env, trainData, testData); CompareSvmToLibSvmCore("polynomial kernel", "PolynomialKernel{d=2}", env, trainData, testData); diff --git a/test/Microsoft.ML.Predictor.Tests/TestTransposer.cs b/test/Microsoft.ML.Predictor.Tests/TestTransposer.cs index 39a8b4e8cf..ed1780c6d7 100644 --- a/test/Microsoft.ML.Predictor.Tests/TestTransposer.cs +++ b/test/Microsoft.ML.Predictor.Tests/TestTransposer.cs @@ -179,7 +179,7 @@ public void TransposerTest() Contracts.Assert(result); Assert.True(trueIndex == index, $"Transpose schema had column '{names[i]}' at unexpected index"); } - // Check the contents + // Check the contents Assert.Null(trans.TransposeSchema.GetSlotType(2)); // C check to see that it's not transposable. TransposeCheckHelper(view, 0, trans); // A check. TransposeCheckHelper(view, 1, trans); // B check. diff --git a/test/Microsoft.ML.Sweeper.Tests/Microsoft.ML.Sweeper.Tests.csproj b/test/Microsoft.ML.Sweeper.Tests/Microsoft.ML.Sweeper.Tests.csproj new file mode 100644 index 0000000000..3364b79fda --- /dev/null +++ b/test/Microsoft.ML.Sweeper.Tests/Microsoft.ML.Sweeper.Tests.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp2.0 + CORECLR + false + + + + + + diff --git a/test/Microsoft.ML.Sweeper.Tests/SweeperTest.cs b/test/Microsoft.ML.Sweeper.Tests/SweeperTest.cs new file mode 100644 index 0000000000..4bcb69874f --- /dev/null +++ b/test/Microsoft.ML.Sweeper.Tests/SweeperTest.cs @@ -0,0 +1,69 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.RunTests; +using Microsoft.ML.Runtime.Sweeper; +using System; +using System.IO; +using Xunit; + +namespace Microsoft.ML.Sweeper.Tests +{ + public class SweeperTest + { + [Fact] + public void UniformRandomSweeperReturnsDistinctValuesWhenProposeSweep() + { + DiscreteValueGenerator valueGenerator = CreateDiscreteValueGenerator(); + + using (var writer = new StreamWriter(new MemoryStream())) + using (var env = new TlcEnvironment(42, outWriter: writer, errWriter: writer)) + { + var sweeper = new UniformRandomSweeper(env, + new SweeperBase.ArgumentsBase(), + new[] { valueGenerator }); + + var results = sweeper.ProposeSweeps(3); + Assert.NotNull(results); + + int length = results.Length; + Assert.Equal(2, length); + } + } + + [Fact] + public void RandomGridSweeperReturnsDistinctValuesWhenProposeSweep() + { + DiscreteValueGenerator valueGenerator = CreateDiscreteValueGenerator(); + + using (var writer = new StreamWriter(new MemoryStream())) + using (var env = new TlcEnvironment(42, outWriter: writer, errWriter: writer)) + { + var sweeper = new RandomGridSweeper(env, + new RandomGridSweeper.Arguments(), + new[] { valueGenerator }); + + var results = sweeper.ProposeSweeps(3); + Assert.NotNull(results); + + int length = results.Length; + Assert.Equal(2, length); + } + } + + private static DiscreteValueGenerator CreateDiscreteValueGenerator() + { + var args = new DiscreteParamArguments() + { + Name = "TestParam", + Values = new string[] { "one", "two" } + }; + + return new DiscreteValueGenerator(args); + } + } +} diff --git a/test/Microsoft.ML.TestFramework/BaseTestBaseline.cs b/test/Microsoft.ML.TestFramework/BaseTestBaseline.cs index 848fa15a44..f57b50bdab 100644 --- a/test/Microsoft.ML.TestFramework/BaseTestBaseline.cs +++ b/test/Microsoft.ML.TestFramework/BaseTestBaseline.cs @@ -269,8 +269,8 @@ protected void DoNotEverUseInvertPass() private static readonly Regex _matchDateTime = new Regex(@"[0-9]{1,4}[-/][0-9]{1,2}[-/][0-9]{1,4} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,4}(\.[0-9]+)?( [AP]M)?", RegexOptions.IgnoreCase | RegexOptions.Compiled); private static readonly Regex _matchTime = new Regex(@"[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?", RegexOptions.Compiled); private static readonly Regex _matchShortTime = new Regex(@"\([0-9]{2}:[0-9]{2}(\.[0-9]+)?\)", RegexOptions.Compiled); - private static readonly Regex _matchMemory = new Regex(@"memory usage\(MB\): [0-9]+" /*(s)\: [0-9]+"*/, RegexOptions.Compiled); - private static readonly Regex _matchElapsed = new Regex(@"Time elapsed\(s\): [0-9.]+" /*(s)\: [0-9\.]+"*/, RegexOptions.Compiled); + private static readonly Regex _matchMemory = new Regex(@"memory usage\(MB\): [0-9]+", RegexOptions.Compiled); + private static readonly Regex _matchElapsed = new Regex(@"Time elapsed\(s\): [0-9.]+", RegexOptions.Compiled); private static readonly Regex _matchTimes = new Regex(@"Instances caching time\(s\): [0-9\.]+", RegexOptions.Compiled); private static readonly Regex _matchUpdatesPerSec = new Regex(@", ([0-9\.]+|Infinity)M WeightUpdates/sec", RegexOptions.Compiled); private static readonly Regex _matchParameterT = new Regex(@"=PARAM:/t:[0-9]+", RegexOptions.Compiled); diff --git a/test/Microsoft.ML.TestFramework/CopyAction.cs b/test/Microsoft.ML.TestFramework/CopyAction.cs index 4ea65bbbd5..b7ec2327db 100644 --- a/test/Microsoft.ML.TestFramework/CopyAction.cs +++ b/test/Microsoft.ML.TestFramework/CopyAction.cs @@ -38,7 +38,7 @@ private static void CopyAll(string sourcePath, string destinationPath) /// /// Since test folder doesn't have libraries from AutoLoad folder and Win libraries, /// we copy them for each test (only newest one). - // This allow execute tests locally. + /// This allow execute tests locally. /// public static void Execute() { diff --git a/test/Microsoft.ML.TestFramework/DataPipe/TestDataPipe.cs b/test/Microsoft.ML.TestFramework/DataPipe/TestDataPipe.cs new file mode 100644 index 0000000000..c598879795 --- /dev/null +++ b/test/Microsoft.ML.TestFramework/DataPipe/TestDataPipe.cs @@ -0,0 +1,148 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Float = System.Single; + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.ML.Runtime.CommandLine; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Data.IO; +using Microsoft.ML.Runtime.Internal.Utilities; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Runtime.TextAnalytics; +using Xunit; + +namespace Microsoft.ML.Runtime.RunTests +{ + /// + /// A class for non-baseline data pipe tests. + /// + public sealed partial class TestDataPipeNoBaseline : TestDataViewBase + { + [Fact] + public void TestLDATransform() + { + var builder = new ArrayDataViewBuilder(Env); + var data = new[] + { + new[] { (Float)1.0, (Float)0.0, (Float)0.0 }, + new[] { (Float)0.0, (Float)1.0, (Float)0.0 }, + new[] { (Float)0.0, (Float)0.0, (Float)1.0 }, + }; + + builder.AddColumn("F1V", NumberType.Float, data); + + var srcView = builder.GetDataView(); + + LdaTransform.Column col = new LdaTransform.Column(); + col.Source = "F1V"; + col.NumTopic = 20; + col.NumTopic = 3; + col.NumSummaryTermPerTopic = 3; + col.AlphaSum = 3; + col.NumThreads = 1; + col.ResetRandomGenerator = true; + LdaTransform.Arguments args = new LdaTransform.Arguments(); + args.Column = new LdaTransform.Column[] { col }; + + LdaTransform ldaTransform = new LdaTransform(Env, args, srcView); + + using (var cursor = ldaTransform.GetRowCursor(c => true)) + { + var resultGetter = cursor.GetGetter>(1); + VBuffer resultFirstRow = new VBuffer(); + VBuffer resultSecondRow = new VBuffer(); + VBuffer resultThirdRow = new VBuffer(); + + Assert.True(cursor.MoveNext()); + resultGetter(ref resultFirstRow); + Assert.True(cursor.MoveNext()); + resultGetter(ref resultSecondRow); + Assert.True(cursor.MoveNext()); + resultGetter(ref resultThirdRow); + Assert.False(cursor.MoveNext()); + + Assert.True(resultFirstRow.Length == 3); + Assert.True(resultFirstRow.GetItemOrDefault(0) == 0); + Assert.True(resultFirstRow.GetItemOrDefault(2) == 0); + Assert.True(resultFirstRow.GetItemOrDefault(1) == 1.0); + Assert.True(resultSecondRow.Length == 3); + Assert.True(resultSecondRow.GetItemOrDefault(0) == 0); + Assert.True(resultSecondRow.GetItemOrDefault(2) == 0); + Assert.True(resultSecondRow.GetItemOrDefault(1) == 1.0); + Assert.True(resultThirdRow.Length == 3); + Assert.True(resultThirdRow.GetItemOrDefault(0) == 0); + Assert.True(resultThirdRow.GetItemOrDefault(1) == 0); + Assert.True(resultThirdRow.GetItemOrDefault(2) == 1.0); + } + + using (var cursor = ldaTransform.GetRowCursor(c => true)) + { + var resultGetter = cursor.GetGetter>(1); + VBuffer resultFirstRow = new VBuffer(); + VBuffer resultSecondRow = new VBuffer(); + VBuffer resultThirdRow = new VBuffer(); + + Assert.True(cursor.MoveNext()); + resultGetter(ref resultFirstRow); + Assert.True(cursor.MoveNext()); + resultGetter(ref resultSecondRow); + Assert.True(cursor.MoveNext()); + resultGetter(ref resultThirdRow); + Assert.False(cursor.MoveNext()); + + Assert.True(resultFirstRow.Length == 3); + Assert.True(resultFirstRow.GetItemOrDefault(0) == 0); + Assert.True(resultFirstRow.GetItemOrDefault(2) == 0); + Assert.True(resultFirstRow.GetItemOrDefault(1) == 1.0); + Assert.True(resultSecondRow.Length == 3); + Assert.True(resultSecondRow.GetItemOrDefault(0) == 0); + Assert.True(resultSecondRow.GetItemOrDefault(2) == 0); + Assert.True(resultSecondRow.GetItemOrDefault(1) == 1.0); + Assert.True(resultThirdRow.Length == 3); + Assert.True(resultThirdRow.GetItemOrDefault(0) == 0); + Assert.True(resultThirdRow.GetItemOrDefault(1) == 0); + Assert.True(resultThirdRow.GetItemOrDefault(2) == 1.0); + } + } + + [Fact] + public void TestLdaTransformEmptyDocumentException() + { + var builder = new ArrayDataViewBuilder(Env); + var data = new[] + { + new[] { (Float)0.0, (Float)0.0, (Float)0.0 }, + new[] { (Float)0.0, (Float)0.0, (Float)0.0 }, + new[] { (Float)0.0, (Float)0.0, (Float)0.0 }, + }; + + builder.AddColumn("Zeros", NumberType.Float, data); + + var srcView = builder.GetDataView(); + var col = new LdaTransform.Column() + { + Source = "Zeros" + }; + var args = new LdaTransform.Arguments() + { + Column = new[] { col } + }; + + try + { + var lda = new LdaTransform(Env, args, srcView); + } + catch (InvalidOperationException ex) + { + Assert.Equal(ex.Message, string.Format("The specified documents are all empty in column '{0}'.", col.Source)); + return; + } + + Assert.True(false, "The LDA transform does not throw expected error on empty documents."); + } + } +} diff --git a/test/Microsoft.ML.TestFramework/Datasets.cs b/test/Microsoft.ML.TestFramework/Datasets.cs index 76bea677b6..272780021b 100644 --- a/test/Microsoft.ML.TestFramework/Datasets.cs +++ b/test/Microsoft.ML.TestFramework/Datasets.cs @@ -152,7 +152,7 @@ public static class TestDatasets testFilename = "housing.txt" }; - public static TestDataset winequality = new TestDataset + public static TestDataset winequalitymacro = new TestDataset { name = "wine", trainFilename = "external/winequality-white.csv", @@ -160,6 +160,14 @@ public static class TestDatasets loaderSettings = "col=Label:R4:11 col=Features:R4:0-10 sep=; header+" }; + public static TestDataset winequality = new TestDataset + { + name = "wine", + trainFilename = "external/winequality-white.csv", + testFilename = "external/winequality-white.csv", + loaderSettings = "loader=Text{col=Label:R4:11 col=Features:R4:0-10 sep=; header+}" + }; + public static TestDataset msm = new TestDataset { // REVIEW: Why is the MSM train set smaller than the test set? Reverse these! diff --git a/test/Microsoft.ML.TestFramework/Learners.cs b/test/Microsoft.ML.TestFramework/Learners.cs index 9b64c0ac74..9672c88fe8 100644 --- a/test/Microsoft.ML.TestFramework/Learners.cs +++ b/test/Microsoft.ML.TestFramework/Learners.cs @@ -35,16 +35,13 @@ public PredictorAndArgs(SubComponent trainer, string tag = null) } } - public /*static*/ class TestLearnersBase + public class TestLearnersBase { // This ensures that the needed assemblies are loaded! static TestLearnersBase() { bool ok = true; - //ok &= typeof(BinaryNeuralNetwork) != null; ok &= typeof(FastTreeBinaryClassificationTrainer) != null; - //ok &= typeof(OneClassSvmTrainer) != null; - //ok &= typeof(LDSvmTrainer) != null; Contracts.Check(ok, "Missing assemblies!"); } @@ -267,6 +264,55 @@ static TestLearnersBase() BaselineProgress = true, }; + public static PredictorAndArgs LightGBMClassifier = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBMBinary", "nt=1 nl=5 mil=5 lr=0.25 iter=20 mb=255"), + Tag = "LightGBM", + BaselineProgress = true, + }; + + public static PredictorAndArgs LightGBMGoss = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBM", "nt=1 iter=10 v=+ booster=goss lr=0.2 mil=10 nl=20"), + Tag = "LightGBMGoss", + BaselineProgress = true, + }; + + public static PredictorAndArgs LightGBMDart = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBM", "nt=1 iter=10 booster=dart lr=0.2 mil=10 nl=20"), + Tag = "LightGBMDart", + BaselineProgress = true, + }; + + public static PredictorAndArgs LightGBMMC = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBMMC", "nt=1 iter=10 v=- lr=0.2 mil=10 nl=20"), + Tag = "LightGBMMC", + BaselineProgress = true, + }; + + public static PredictorAndArgs LightGBMReg = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBMR", "nt=1 iter=50 v=+ booster=gbdt{l1=0.2 l2=0.2} lr=0.2 mil=10 nl=20"), + Tag = "LightGBMReg", + BaselineProgress = true, + }; + + public static PredictorAndArgs LightGBMRegMae = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBMR", "nt=1 iter=50 em=mae v=+ lr=0.2 mil=10 nl=20"), + Tag = "LightGBMRegMae", + BaselineProgress = true, + }; + + public static PredictorAndArgs LightGBMRegRmse = new PredictorAndArgs + { + Trainer = new SubComponent("LightGBMR", "nt=1 iter=50 em=rmse v=+ lr=0.2 mil=10 nl=20"), + Tag = "LightGBMRegRmse", + BaselineProgress = true, + }; + public static PredictorAndArgs FastTreeWithCategoricalClassfier = new PredictorAndArgs { Trainer = new SubComponent("FastTreeBinaryClassification", "cat=+ nl=5 mil=5 lr=0.25 iter=20 mb=255"), diff --git a/test/Microsoft.ML.TestFramework/Microsoft.ML.TestFramework.csproj b/test/Microsoft.ML.TestFramework/Microsoft.ML.TestFramework.csproj index d9cf8a2f29..2eb04a1437 100644 --- a/test/Microsoft.ML.TestFramework/Microsoft.ML.TestFramework.csproj +++ b/test/Microsoft.ML.TestFramework/Microsoft.ML.TestFramework.csproj @@ -13,4 +13,9 @@ + + + + + \ No newline at end of file diff --git a/test/Microsoft.ML.TestFramework/ModelHelper.cs b/test/Microsoft.ML.TestFramework/ModelHelper.cs index edf4408bcb..42c684e51a 100644 --- a/test/Microsoft.ML.TestFramework/ModelHelper.cs +++ b/test/Microsoft.ML.TestFramework/ModelHelper.cs @@ -70,147 +70,147 @@ private static ITransformModel CreateKcHousePricePredictorModel(string dataPath) { Name = "Id", Source = new [] { new TextLoaderRange(0) }, - Type = Runtime.Data.DataKind.Text + Type = Data.DataKind.Text }, new TextLoaderColumn() { Name = "Date", Source = new [] { new TextLoaderRange(1) }, - Type = Runtime.Data.DataKind.Text + Type = Data.DataKind.Text }, new TextLoaderColumn() { Name = "Label", Source = new [] { new TextLoaderRange(2) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Bedrooms", Source = new [] { new TextLoaderRange(3) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Bathrooms", Source = new [] { new TextLoaderRange(4) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SqftLiving", Source = new [] { new TextLoaderRange(5) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SqftLot", Source = new [] { new TextLoaderRange(6) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Floors", Source = new [] { new TextLoaderRange(7) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Waterfront", Source = new [] { new TextLoaderRange(8) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "View", Source = new [] { new TextLoaderRange(9) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Condition", Source = new [] { new TextLoaderRange(10) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Grade", Source = new [] { new TextLoaderRange(11) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SqftAbove", Source = new [] { new TextLoaderRange(12) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SqftBasement", Source = new [] { new TextLoaderRange(13) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "YearBuilt", Source = new [] { new TextLoaderRange(14) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "YearRenovated", Source = new [] { new TextLoaderRange(15) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Zipcode", Source = new [] { new TextLoaderRange(16) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Lat", Source = new [] { new TextLoaderRange(17) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Long", Source = new [] { new TextLoaderRange(18) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SqftLiving15", Source = new [] { new TextLoaderRange(19) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SqftLot15", Source = new [] { new TextLoaderRange(20) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, } } diff --git a/test/Microsoft.ML.TestFramework/TestCategory.cs b/test/Microsoft.ML.TestFramework/TestCategory.cs index 30811f5b72..69913b3fc9 100644 --- a/test/Microsoft.ML.TestFramework/TestCategory.cs +++ b/test/Microsoft.ML.TestFramework/TestCategory.cs @@ -8,19 +8,18 @@ using Xunit.Abstractions; using Xunit.Sdk; -/// -/// This is a replacement for the MSTest [TestCategoryAttribute] on xunit -/// xunit does not have the concept of Category for tests and instead, the have [TraitAttribute(string key, string value)] -/// If we replace the MSTest [TestCategoryAttribute] for the [Trait("Category", "BVT")], we will surely fall at some time in cases -/// where people will typo on the "Category" key part of the Trait. -/// On order to achieve the same behaviour as on MSTest, a custom [TestCategory] was created -/// to mimic the MSTest one and avoid replace it on every existent test. -/// The tests can be filtered by xunit runners by usage of "-trait" on the command line with the expresion like -/// -trait "Category=BVT" for example that will only run the tests with [TestCategory("BVT")] on it. -/// - namespace Xunit { + /// + /// This is a replacement for the MSTest [TestCategoryAttribute] on xunit + /// xunit does not have the concept of Category for tests and instead, the have [TraitAttribute(string key, string value)] + /// If we replace the MSTest [TestCategoryAttribute] for the [Trait("Category", "BVT")], we will surely fall at some time in cases + /// where people will typo on the "Category" key part of the Trait. + /// On order to achieve the same behaviour as on MSTest, a custom [TestCategory] was created + /// to mimic the MSTest one and avoid replace it on every existent test. + /// The tests can be filtered by xunit runners by usage of "-trait" on the command line with the expresion like + /// -trait "Category=BVT" for example that will only run the tests with [TestCategory("BVT")] on it. + /// [TraitDiscoverer("CategoryDiscoverer", "TestExtensions")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public class TestCategoryAttribute : Attribute, ITraitAttribute diff --git a/test/Microsoft.ML.TestFramework/TestCommandBase.cs b/test/Microsoft.ML.TestFramework/TestCommandBase.cs index 708778a48a..18b4abf0cf 100644 --- a/test/Microsoft.ML.TestFramework/TestCommandBase.cs +++ b/test/Microsoft.ML.TestFramework/TestCommandBase.cs @@ -6,15 +6,13 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using Microsoft.ML.Runtime; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.ML.Runtime.Command; using Microsoft.ML.Runtime.Data; -using Microsoft.ML.Runtime.EntryPoints; using Microsoft.ML.Runtime.Internal.Utilities; -//using Microsoft.ML.Runtime.StandardLearners; using Microsoft.ML.Runtime.Model; using Microsoft.ML.Runtime.Tools; -using System.Threading; -using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -294,7 +292,7 @@ protected bool TestCore(RunContextBase ctx, string cmdName, string args, params if (!ctx.NoComparisons) { all &= outputPath.CheckEqualityNormalized(); - if(toCompare != null) + if (toCompare != null) foreach (var c in toCompare) all &= c.CheckEquality(); } @@ -308,7 +306,7 @@ protected bool TestCore(RunContextBase ctx, string cmdName, string args, params /// /// The environment to use. /// - /// The writer to print the . Usually this should be the same writer that is used in . + /// The writer to print the . Usually this should be the same writer that is used in . /// /// The arguments for MAML. /// Whether to print the progress summary. If true, progress summary will appear in the end of baseline output file. @@ -504,7 +502,7 @@ protected void TestPipeFromModel(string dataPath, OutputPath model) public abstract class TestSteppedDmCommandBase : TestDmCommandBase { - protected TestSteppedDmCommandBase(ITestOutputHelper helper): base(helper) + protected TestSteppedDmCommandBase(ITestOutputHelper helper) : base(helper) { _step = 0; _paramsStep = -1; @@ -591,7 +589,7 @@ protected OutputPath FoldModelPath(int fold) /// /// Creates an output path with a suffix based on the test name. For new tests please - /// do not use this, but instead utilize the + /// do not use this, but instead utilize the /// method. /// protected OutputPath CreateOutputPath(string suffix) @@ -813,6 +811,21 @@ public void CommandCrossValidation() Done(); } + [Fact] + public void CommandCrossValidationKeyLabelWithFloatKeyValues() + { + RunMTAThread(() => + { + string pathData = GetDataPath(@"adult.tiny.with-schema.txt"); + var perInstFile = CreateOutputPath("perinst.txt"); + // Create a copy of the label column and use it for stratification, in order to create different label counts in the different folds. + string extraArgs = $"tr=FastRankRanking{{t=1}} strat=Strat prexf=rangefilter{{col=Label min=20 max=25}} prexf=term{{col=Strat:Label}} xf=term{{col=Label}} xf=hash{{col=GroupId}} threads- norm=Warn dout={{{perInstFile.Path}}}"; + string loaderArgs = "loader=text{col=Features:R4:10-14 col=Label:R4:9 col=GroupId:TX:1 header+}"; + TestCore("cv", pathData, loaderArgs, extraArgs); + }); + Done(); + } + [TestCategory(Cat)] [Fact(Skip = "Need CoreTLC specific baseline update")] public void CommandCrossValidationVectorNoNames() @@ -1528,7 +1541,7 @@ public void CommandTrainScoreEvaluateRegression() Done(); } - [Fact(Skip = "Need CoreTLC specific baseline update")] + [Fact(Skip = "Need CoreTLC specific baseline update")] [TestCategory("SDCAR")] public void CommandTrainScoreWTFSdcaR() { diff --git a/test/Microsoft.ML.TestFramework/TestInitialization.cs b/test/Microsoft.ML.TestFramework/TestInitialization.cs index b1debcfea4..ebe0eb0a79 100644 --- a/test/Microsoft.ML.TestFramework/TestInitialization.cs +++ b/test/Microsoft.ML.TestFramework/TestInitialization.cs @@ -199,14 +199,6 @@ public TestImageAnalyticsTransforms(ITestOutputHelper helper) } } - /* public partial class TestUtilities - { - public TestUtilities(ITestOutputHelper helper) - { - TestContext = new TestContext(helper); - } - }*/ - public partial class TestRepositoryReader : BaseTestBaseline { public TestRepositoryReader(ITestOutputHelper helper) diff --git a/test/Microsoft.ML.TestFramework/TestSparseDataView.cs b/test/Microsoft.ML.TestFramework/TestSparseDataView.cs new file mode 100644 index 0000000000..08c9e17a28 --- /dev/null +++ b/test/Microsoft.ML.TestFramework/TestSparseDataView.cs @@ -0,0 +1,116 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Runtime.Api; +using Microsoft.ML.Runtime.Data; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.ML.Runtime.RunTests +{ + public sealed class TestSparseDataView : TestDataViewBase + { + private const string Cat = "DataView"; + + public TestSparseDataView(ITestOutputHelper obj) : base(obj) + { + } + + private class DenseExample + { + [VectorType(2)] + public T[] X; + } + + private class SparseExample + { + [VectorType(5)] + public VBuffer X; + } + + [Fact] + [TestCategory(Cat)] + public void SparseDataView() + { + GenericSparseDataView(new[] { 1f, 2f, 3f }, new[] { 1f, 10f, 100f }); + GenericSparseDataView(new DvInt4[] { 1, 2, 3 }, new DvInt4[] { 1, 10, 100 }); + GenericSparseDataView(new DvBool[] { true, true, true }, new DvBool[] { false, false, false }); + GenericSparseDataView(new double[] { 1, 2, 3 }, new double[] { 1, 10, 100 }); + GenericSparseDataView(new DvText[] { new DvText("a"), new DvText("b"), new DvText("c") }, + new DvText[] { new DvText("aa"), new DvText("bb"), new DvText("cc") }); + } + + private void GenericSparseDataView(T[] v1, T[] v2) + { + var inputs = new[] { + new SparseExample() { X = new VBuffer (5, 3, v1, new int[] { 0, 2, 4 }) }, + new SparseExample() { X = new VBuffer (5, 3, v2, new int[] { 0, 1, 3 }) } + }; + using (var host = new TlcEnvironment()) + { + var data = host.CreateStreamingDataView(inputs); + var value = new VBuffer(); + int n = 0; + using (var cur = data.GetRowCursor(i => true)) + { + var getter = cur.GetGetter>(0); + while (cur.MoveNext()) + { + getter(ref value); + Assert.True(value.Count == 3); + ++n; + } + } + Assert.True(n == 2); + var iter = data.AsEnumerable>(host, false).GetEnumerator(); + n = 0; + while (iter.MoveNext()) + ++n; + Assert.True(n == 2); + } + } + + [Fact] + [TestCategory(Cat)] + public void DenseDataView() + { + GenericDenseDataView(new[] { 1f, 2f, 3f }, new[] { 1f, 10f, 100f }); + GenericDenseDataView(new DvInt4[] { 1, 2, 3 }, new DvInt4[] { 1, 10, 100 }); + GenericDenseDataView(new DvBool[] { true, true, true }, new DvBool[] { false, false, false }); + GenericDenseDataView(new double[] { 1, 2, 3 }, new double[] { 1, 10, 100 }); + GenericDenseDataView(new DvText[] { new DvText("a"), new DvText("b"), new DvText("c") }, + new DvText[] { new DvText("aa"), new DvText("bb"), new DvText("cc") }); + } + + private void GenericDenseDataView(T[] v1, T[] v2) + { + var inputs = new[] { + new DenseExample() { X = v1 }, + new DenseExample() { X = v2 } + }; + using (var host = new TlcEnvironment()) + { + var data = host.CreateStreamingDataView(inputs); + var value = new VBuffer(); + int n = 0; + using (var cur = data.GetRowCursor(i => true)) + { + var getter = cur.GetGetter>(0); + while (cur.MoveNext()) + { + getter(ref value); + Assert.True(value.Count == 3); + ++n; + } + } + Assert.True(n == 2); + var iter = data.AsEnumerable>(host, false).GetEnumerator(); + n = 0; + while (iter.MoveNext()) + ++n; + Assert.True(n == 2); + } + } + } +} diff --git a/test/Microsoft.ML.Tests/CSharpCodeGen.cs b/test/Microsoft.ML.Tests/CSharpCodeGen.cs index c647110702..678edac461 100644 --- a/test/Microsoft.ML.Tests/CSharpCodeGen.cs +++ b/test/Microsoft.ML.Tests/CSharpCodeGen.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.ML.Runtime.RunTests; using Microsoft.ML.TestFramework; using System.IO; using Xunit; @@ -9,17 +10,39 @@ namespace Microsoft.ML.Tests { - public class CSharpCodeGen : BaseTestClass + public class CSharpCodeGen : BaseTestBaseline { public CSharpCodeGen(ITestOutputHelper output) : base(output) { } - [Fact(Skip = "Temporary solution(Windows ONLY) to regenerate codegenerated CSharpAPI.cs")] - public void GenerateCSharpAPI() + [Fact(Skip = "Execute this test if you want to regenerate CSharpApi file")] + public void RegenerateCSharpApi() { - var cSharpAPIPath = Path.Combine(RootDir, @"src\\Microsoft.ML\\CSharpApi.cs"); - Runtime.Tools.Maml.Main(new[] { $"? generator=cs{{csFilename={cSharpAPIPath}}}" }); + var basePath = GetDataPath("../../src/Microsoft.ML/CSharpApi.cs"); + Runtime.Tools.Maml.Main(new[] { $"? generator=cs{{csFilename={basePath}}}" }); + } + + [Fact] + public void TestGeneratedCSharpAPI() + { + var dataPath = GetOutputPath("Api.cs"); + Runtime.Tools.Maml.Main(new[] { $"? generator=cs{{csFilename={dataPath}}}" }); + + var basePath = GetDataPath("../../src/Microsoft.ML/CSharpApi.cs"); + using (StreamReader baseline = OpenReader(basePath)) + using (StreamReader result = OpenReader(dataPath)) + { + for (; ; ) + { + string line1 = baseline.ReadLine(); + string line2 = result.ReadLine(); + + if (line1 == null && line2 == null) + break; + Assert.Equal(line1, line2); + } + } } } } diff --git a/test/Microsoft.ML.Tests/CollectionDataSourceTests.cs b/test/Microsoft.ML.Tests/CollectionDataSourceTests.cs index 923d4eb375..87e23952d6 100644 --- a/test/Microsoft.ML.Tests/CollectionDataSourceTests.cs +++ b/test/Microsoft.ML.Tests/CollectionDataSourceTests.cs @@ -9,8 +9,10 @@ using Microsoft.ML.TestFramework; using Microsoft.ML.Trainers; using Microsoft.ML.Transforms; +using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using Xunit; using Xunit.Abstractions; @@ -134,9 +136,9 @@ public void CanTrain() { var pipeline = new LearningPipeline(); var data = new List() { - new IrisData { SepalLength = 1f, SepalWidth = 1f ,PetalLength=0.3f, PetalWidth=5.1f, Label=1}, - new IrisData { SepalLength = 1f, SepalWidth = 1f ,PetalLength=0.3f, PetalWidth=5.1f, Label=1}, - new IrisData { SepalLength = 1.2f, SepalWidth = 0.5f ,PetalLength=0.3f, PetalWidth=5.1f, Label=0} + new IrisData { SepalLength = 1f, SepalWidth = 1f, PetalLength=0.3f, PetalWidth=5.1f, Label=1}, + new IrisData { SepalLength = 1f, SepalWidth = 1f, PetalLength=0.3f, PetalWidth=5.1f, Label=1}, + new IrisData { SepalLength = 1.2f, SepalWidth = 0.5f, PetalLength=0.3f, PetalWidth=5.1f, Label=0} }; var collection = CollectionDataSource.Create(data); @@ -205,5 +207,407 @@ public class IrisPrediction public float[] PredictedLabels; } + public class ConversionSimpleClass + { + public int fInt; + public uint fuInt; + public short fShort; + public ushort fuShort; + public sbyte fsByte; + public byte fByte; + public long fLong; + public ulong fuLong; + public float fFloat; + public double fDouble; + public bool fBool; + public string fString; + } + + public class ConversionNullalbeClass + { + public int? fInt; + public uint? fuInt; + public short? fShort; + public ushort? fuShort; + public sbyte? fsByte; + public byte? fByte; + public long? fLong; + public ulong? fuLong; + public float? fFloat; + public double? fDouble; + public bool? fBool; + public string fString; + } + + public bool CompareObjectValues(object x, object y, Type type) + { + // By default behaviour for DvText is to be empty string, while for string is null. + // So if we do roundtrip string-> DvText -> string all null string become empty strings. + // Therefore replace all null values to empty string if field is string. + if (type == typeof(string) && x == null) + x = ""; + if (type == typeof(string) && y == null) + y = ""; + if (x == null && y == null) + return true; + if (x == null && y != null) + return false; + return x.Equals(y); + } + + public bool CompareThroughReflection(T x, T y) + { + foreach (var field in typeof(T).GetFields()) + { + var xvalue = field.GetValue(x); + var yvalue = field.GetValue(y); + if (field.FieldType.IsArray) + { + if (!CompareArrayValues(xvalue as Array, yvalue as Array)) + return false; + } + else + { + if (!CompareObjectValues(xvalue, yvalue, field.FieldType)) + return false; + } + } + return true; + } + + public bool CompareArrayValues(Array x, Array y) + { + if (x == null && y == null) return true; + if ((x == null && y != null) || (y == null && x != null)) + return false; + if (x.Length != y.Length) + return false; + for (int i = 0; i < x.Length; i++) + if (!CompareObjectValues(x.GetValue(i), y.GetValue(i), x.GetType().GetElementType())) + return false; + return true; + } + + public class ClassWithConstField + { + public const string ConstString = "N"; + public string fString; + public const int ConstInt = 100; + public int fInt; + } + + [Fact] + public void RoundTripConversionWithBasicTypes() + { + var data = new List + { + new ConversionSimpleClass() + { + fInt = int.MaxValue - 1, + fuInt = uint.MaxValue - 1, + fBool = true, + fsByte = sbyte.MaxValue - 1, + fByte = byte.MaxValue - 1, + fDouble = double.MaxValue - 1, + fFloat = float.MaxValue - 1, + fLong = long.MaxValue - 1, + fuLong = ulong.MaxValue - 1, + fShort = short.MaxValue - 1, + fuShort = ushort.MaxValue - 1, + fString = null + }, + new ConversionSimpleClass() + { + fInt = int.MaxValue, + fuInt = uint.MaxValue, + fBool = true, + fsByte = sbyte.MaxValue, + fByte = byte.MaxValue, + fDouble = double.MaxValue, + fFloat = float.MaxValue, + fLong = long.MaxValue, + fuLong = ulong.MaxValue, + fShort = short.MaxValue, + fuShort = ushort.MaxValue, + fString = "ooh" + }, + new ConversionSimpleClass() + { + fInt = int.MinValue + 1, + fuInt = uint.MinValue + 1, + fBool = false, + fsByte = sbyte.MinValue + 1, + fByte = byte.MinValue + 1, + fDouble = double.MinValue + 1, + fFloat = float.MinValue + 1, + fLong = long.MinValue + 1, + fuLong = ulong.MinValue + 1, + fShort = short.MinValue + 1, + fuShort = ushort.MinValue + 1, + fString = "" + }, + new ConversionSimpleClass() + }; + + var dataNullable = new List + { + new ConversionNullalbeClass() + { + fInt = int.MaxValue - 1, + fuInt = uint.MaxValue - 1, + fBool = true, + fsByte = sbyte.MaxValue - 1, + fByte = byte.MaxValue - 1, + fDouble = double.MaxValue - 1, + fFloat = float.MaxValue - 1, + fLong = long.MaxValue - 1, + fuLong = ulong.MaxValue - 1, + fShort = short.MaxValue - 1, + fuShort = ushort.MaxValue - 1, + fString = "ha" + }, + new ConversionNullalbeClass() + { + fInt = int.MaxValue, + fuInt = uint.MaxValue, + fBool = true, + fsByte = sbyte.MaxValue, + fByte = byte.MaxValue, + fDouble = double.MaxValue, + fFloat = float.MaxValue, + fLong = long.MaxValue, + fuLong = ulong.MaxValue, + fShort = short.MaxValue, + fuShort = ushort.MaxValue, + fString = "ooh" + }, + new ConversionNullalbeClass() + { + fInt = int.MinValue + 1, + fuInt = uint.MinValue, + fBool = false, + fsByte = sbyte.MinValue + 1, + fByte = byte.MinValue, + fDouble = double.MinValue + 1, + fFloat = float.MinValue + 1, + fLong = long.MinValue + 1, + fuLong = ulong.MinValue, + fShort = short.MinValue + 1, + fuShort = ushort.MinValue, + fString = "" + }, + new ConversionNullalbeClass() + }; + + using (var env = new TlcEnvironment()) + { + var dataView = ComponentCreation.CreateDataView(env, data); + var enumeratorSimple = dataView.AsEnumerable(env, false).GetEnumerator(); + var originalEnumerator = data.GetEnumerator(); + while (enumeratorSimple.MoveNext() && originalEnumerator.MoveNext()) + { + Assert.True(CompareThroughReflection(enumeratorSimple.Current, originalEnumerator.Current)); + } + Assert.True(!enumeratorSimple.MoveNext() && !originalEnumerator.MoveNext()); + + dataView = ComponentCreation.CreateDataView(env, dataNullable); + var enumeratorNullable = dataView.AsEnumerable(env, false).GetEnumerator(); + var originalNullableEnumerator = dataNullable.GetEnumerator(); + while (enumeratorNullable.MoveNext() && originalNullableEnumerator.MoveNext()) + { + Assert.True(CompareThroughReflection(enumeratorNullable.Current, originalNullableEnumerator.Current)); + } + Assert.True(!enumeratorNullable.MoveNext() && !originalNullableEnumerator.MoveNext()); + } + } + + public class ConversionNotSupportedMinValueClass + { + public int fInt; + public long fLong; + public short fShort; + public sbyte fSByte; + } + + [Fact] + public void ConversionExceptionsBehavior() + { + using (var env = new TlcEnvironment()) + { + var data = new ConversionNotSupportedMinValueClass[1]; + foreach (var field in typeof(ConversionNotSupportedMinValueClass).GetFields()) + { + data[0] = new ConversionNotSupportedMinValueClass(); + FieldInfo fi; + if ((fi = field.FieldType.GetField("MinValue")) != null) + { + field.SetValue(data[0], fi.GetValue(null)); + } + var dataView = ComponentCreation.CreateDataView(env, data); + var enumerator = dataView.AsEnumerable(env, false).GetEnumerator(); + try + { + enumerator.MoveNext(); + Assert.True(false); + } + catch + { + } + } + } + } + + public class ConversionLossMinValueClass + { + public int? fInt; + public long? fLong; + public short? fShort; + public sbyte? fSByte; + } + + [Fact] + public void ConversionMinValueToNullBehavior() + { + using (var env = new TlcEnvironment()) + { + + var data = new List + { + new ConversionLossMinValueClass() { fSByte = null, fInt = null, fLong = null, fShort = null }, + new ConversionLossMinValueClass() { fSByte = sbyte.MinValue, fInt = int.MinValue, fLong = long.MinValue, fShort = short.MinValue } + }; + foreach (var field in typeof(ConversionLossMinValueClass).GetFields()) + { + var dataView = ComponentCreation.CreateDataView(env, data); + var enumerator = dataView.AsEnumerable(env, false).GetEnumerator(); + while (enumerator.MoveNext()) + { + Assert.True(enumerator.Current.fInt == null && enumerator.Current.fLong == null && + enumerator.Current.fSByte == null && enumerator.Current.fShort == null); + } + } + } + } + + [Fact] + public void ClassWithConstFieldsConversion() + { + var data = new List() + { + new ClassWithConstField(){ fInt=1, fString ="lala" }, + new ClassWithConstField(){ fInt=-1, fString ="" }, + new ClassWithConstField(){ fInt=0, fString =null } + }; + + using (var env = new TlcEnvironment()) + { + var dataView = ComponentCreation.CreateDataView(env, data); + var enumeratorSimple = dataView.AsEnumerable(env, false).GetEnumerator(); + var originalEnumerator = data.GetEnumerator(); + while (enumeratorSimple.MoveNext() && originalEnumerator.MoveNext()) + Assert.True(CompareThroughReflection(enumeratorSimple.Current, originalEnumerator.Current)); + Assert.True(!enumeratorSimple.MoveNext() && !originalEnumerator.MoveNext()); + } + } + + public class ClassWithArrays + { + public string[] fString; + public int[] fInt; + public uint[] fuInt; + public short[] fShort; + public ushort[] fuShort; + public sbyte[] fsByte; + public byte[] fByte; + public long[] fLong; + public ulong[] fuLong; + public float[] fFloat; + public double[] fDouble; + public bool[] fBool; + } + + public class ClassWithNullableArrays + { + public string[] fString; + public int?[] fInt; + public uint?[] fuInt; + public short?[] fShort; + public ushort?[] fuShort; + public sbyte?[] fsByte; + public byte?[] fByte; + public long?[] fLong; + public ulong?[] fuLong; + public float?[] fFloat; + public double?[] fDouble; + public bool?[] fBool; + } + + [Fact] + public void RoundTripConversionWithArrays() + { + + var data = new List + { + new ClassWithArrays() + { + fInt = new int[3] { 0, 1, 2 }, + fFloat = new float[3] { -0.99f, 0f, 0.99f }, + fString = new string[2] { "hola", "lola" }, + fBool = new bool[2] { true, false }, + fByte = new byte[3] { 0, 124, 255 }, + fDouble = new double[3] { -1, 0, 1 }, + fLong = new long[] { 0, 1, 2 }, + fsByte = new sbyte[3] { -127, 127, 0 }, + fShort = new short[3] { 0, 1225, 32767 }, + fuInt = new uint[2] { 0, uint.MaxValue }, + fuLong = new ulong[2] { ulong.MaxValue, 0 }, + fuShort = new ushort[2] { 0, ushort.MaxValue } + }, + new ClassWithArrays() { fInt = new int[3] { -2, 1, 0 }, fFloat = new float[3] { 0.99f, 0f, -0.99f }, fString = new string[2] { "", null } }, + new ClassWithArrays() + }; + + var nullableData = new List + { + new ClassWithNullableArrays() + { + fInt = new int?[3] { null, -1, 1 }, + fFloat = new float?[3] { -0.99f, null, 0.99f }, + fString = new string[2] { null, "" }, + fBool = new bool?[3] { true, null, false }, + fByte = new byte?[4] { 0, 125, null, 255 }, + fDouble = new double?[3] { -1, null, 1 }, + fLong = new long?[] { null, -1, 1 }, + fsByte = new sbyte?[3] { -127, 127, null }, + fShort = new short?[3] { 0, null, 32767 }, + fuInt = new uint?[4] { null, 42, 0, uint.MaxValue }, + fuLong = new ulong?[3] { ulong.MaxValue, null, 0 }, + fuShort = new ushort?[3] { 0, null, ushort.MaxValue } + }, + new ClassWithNullableArrays() { fInt = new int?[3] { -2, 1, 0 }, fFloat = new float?[3] { 0.99f, 0f, -0.99f }, fString = new string[2] { "lola", "hola" } }, + new ClassWithNullableArrays() + }; + + using (var env = new TlcEnvironment()) + { + var dataView = ComponentCreation.CreateDataView(env, data); + var enumeratorSimple = dataView.AsEnumerable(env, false).GetEnumerator(); + var originalEnumerator = data.GetEnumerator(); + while (enumeratorSimple.MoveNext() && originalEnumerator.MoveNext()) + { + Assert.True(CompareThroughReflection(enumeratorSimple.Current, originalEnumerator.Current)); + } + Assert.True(!enumeratorSimple.MoveNext() && !originalEnumerator.MoveNext()); + + var nullableDataView = ComponentCreation.CreateDataView(env, nullableData); + var enumeratorNullable = nullableDataView.AsEnumerable(env, false).GetEnumerator(); + var originalNullalbleEnumerator = nullableData.GetEnumerator(); + while (enumeratorNullable.MoveNext() && originalNullalbleEnumerator.MoveNext()) + { + Assert.True(CompareThroughReflection(enumeratorNullable.Current, originalNullalbleEnumerator.Current)); + } + Assert.True(!enumeratorNullable.MoveNext() && !originalNullalbleEnumerator.MoveNext()); + } + } } } diff --git a/test/Microsoft.ML.Tests/LearningPipelineTests.cs b/test/Microsoft.ML.Tests/LearningPipelineTests.cs index 165b8d8fd2..f19e3285d7 100644 --- a/test/Microsoft.ML.Tests/LearningPipelineTests.cs +++ b/test/Microsoft.ML.Tests/LearningPipelineTests.cs @@ -19,7 +19,6 @@ public class LearningPipelineTests : BaseTestClass public LearningPipelineTests(ITestOutputHelper output) : base(output) { - } [Fact] diff --git a/test/Microsoft.ML.Tests/Microsoft.ML.Tests.csproj b/test/Microsoft.ML.Tests/Microsoft.ML.Tests.csproj index c4ccb76ae9..2a2ea8bca1 100644 --- a/test/Microsoft.ML.Tests/Microsoft.ML.Tests.csproj +++ b/test/Microsoft.ML.Tests/Microsoft.ML.Tests.csproj @@ -4,12 +4,14 @@ + + @@ -18,5 +20,6 @@ + \ No newline at end of file diff --git a/test/Microsoft.ML.Tests/OnnxTests.cs b/test/Microsoft.ML.Tests/OnnxTests.cs index 6910aba70b..d9c05ddcc1 100644 --- a/test/Microsoft.ML.Tests/OnnxTests.cs +++ b/test/Microsoft.ML.Tests/OnnxTests.cs @@ -8,7 +8,9 @@ using Microsoft.ML.Runtime.Data; using Microsoft.ML.Runtime.RunTests; using Microsoft.ML.Trainers; +using Microsoft.ML.Transforms; using System.IO; +using System.Text.RegularExpressions; using Xunit; using Xunit.Abstractions; @@ -24,6 +26,14 @@ public class BreastCancerData { public float Label; + public float F1; + public DvText F2; + } + + public class BreastCancerDataAllColumns + { + public float Label; + [VectorType(9)] public float[] Features; } @@ -34,8 +44,86 @@ public class BreastCancerPrediction public DvBool Cancerous; } + public class BreastCancerMCPrediction + { + [ColumnName("Score")] + public float[] Scores; + } + + [Fact] + public void BinaryClassificationFastTreeSaveModelToOnnxTest() + { + string dataPath = GetDataPath(@"breast-cancer.txt"); + var pipeline = new LearningPipeline(); + + pipeline.Add(new Data.TextLoader(dataPath) + { + Arguments = new TextLoaderArguments + { + Separator = new[] { '\t' }, + HasHeader = true, + Column = new[] + { + new TextLoaderColumn() + { + Name = "Label", + Source = new [] { new TextLoaderRange(0) }, + Type = Data.DataKind.Num + }, + + new TextLoaderColumn() + { + Name = "F1", + Source = new [] { new TextLoaderRange(1, 1) }, + Type = Data.DataKind.Num + }, + + new TextLoaderColumn() + { + Name = "F2", + Source = new [] { new TextLoaderRange(2, 2) }, + Type = Data.DataKind.TX + } + } + } + }); + + pipeline.Add(new MissingValueSubstitutor("F1")); + pipeline.Add(new MinMaxNormalizer("F1")); + pipeline.Add(new CategoricalOneHotVectorizer("F2")); + pipeline.Add(new ColumnConcatenator("Features", "F1", "F2")); + pipeline.Add(new FastTreeBinaryClassifier() { NumLeaves = 2, NumTrees = 1, MinDocumentsInLeafs = 2 }); + + var model = pipeline.Train(); + var subDir = Path.Combine("..", "..", "BaselineOutput", "Common", "Onnx", "BinaryClassification", "BreastCancer"); + var onnxPath = GetOutputPath(subDir, "BinaryClassificationFastTreeSaveModelToOnnxTest.onnx"); + DeleteOutputPath(onnxPath); + + var onnxAsJsonPath = GetOutputPath(subDir, "BinaryClassificationFastTreeSaveModelToOnnxTest.json"); + DeleteOutputPath(onnxAsJsonPath); + + OnnxConverter converter = new OnnxConverter() + { + InputsToDrop = new[] { "Label" }, + OutputsToDrop = new[] { "Label", "F1", "F2", "Features" }, + Onnx = onnxPath, + Json = onnxAsJsonPath, + Domain = "Onnx" + }; + + converter.Convert(model); + + // Strip the version. + var fileText = File.ReadAllText(onnxAsJsonPath); + fileText = Regex.Replace(fileText, "\"producerVersion\": \"([^\"]+)\"", "\"producerVersion\": \"##VERSION##\""); + File.WriteAllText(onnxAsJsonPath, fileText); + + CheckEquality(subDir, "BinaryClassificationFastTreeSaveModelToOnnxTest.json"); + Done(); + } + [Fact] - public void BinaryClassificationSaveModelToOnnxTest() + public void BinaryClassificationLightGBMSaveModelToOnnxTest() { string dataPath = GetDataPath(@"breast-cancer.txt"); var pipeline = new LearningPipeline(); @@ -52,27 +140,27 @@ public void BinaryClassificationSaveModelToOnnxTest() { Name = "Label", Source = new [] { new TextLoaderRange(0) }, - Type = DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "Features", Source = new [] { new TextLoaderRange(1, 9) }, - Type = DataKind.Num + Type = Data.DataKind.Num } } } }); - pipeline.Add(new FastTreeBinaryClassifier() { NumLeaves = 5, NumTrees = 5, MinDocumentsInLeafs = 2 }); + pipeline.Add(new LightGbmBinaryClassifier() { NumLeaves = 2, NumBoostRound = 1, MinDataPerLeaf = 2 }); - var model = pipeline.Train(); + var model = pipeline.Train(); var subDir = Path.Combine("..", "..", "BaselineOutput", "Common", "Onnx", "BinaryClassification", "BreastCancer"); - var onnxPath = GetOutputPath(subDir, "SaveModelToOnnxTest.pb"); + var onnxPath = GetOutputPath(subDir, "BinaryClassificationLightGBMSaveModelToOnnxTest.onnx"); DeleteOutputPath(onnxPath); - var onnxAsJsonPath = GetOutputPath(subDir, "SaveModelToOnnxTest.json"); + var onnxAsJsonPath = GetOutputPath(subDir, "BinaryClassificationLightGBMSaveModelToOnnxTest.json"); DeleteOutputPath(onnxAsJsonPath); OnnxConverter converter = new OnnxConverter() @@ -86,8 +174,137 @@ public void BinaryClassificationSaveModelToOnnxTest() converter.Convert(model); - CheckEquality(subDir, "SaveModelToOnnxTest.json"); + // Strip the version. + var fileText = File.ReadAllText(onnxAsJsonPath); + fileText = Regex.Replace(fileText, "\"producerVersion\": \"([^\"]+)\"", "\"producerVersion\": \"##VERSION##\""); + File.WriteAllText(onnxAsJsonPath, fileText); + + CheckEquality(subDir, "BinaryClassificationLightGBMSaveModelToOnnxTest.json"); Done(); } + + [Fact] + public void BinaryClassificationLRSaveModelToOnnxTest() + { + string dataPath = GetDataPath(@"breast-cancer.txt"); + var pipeline = new LearningPipeline(); + + pipeline.Add(new Data.TextLoader(dataPath) + { + Arguments = new TextLoaderArguments + { + Separator = new[] { '\t' }, + HasHeader = true, + Column = new[] + { + new TextLoaderColumn() + { + Name = "Label", + Source = new [] { new TextLoaderRange(0) }, + Type = Data.DataKind.Num + }, + + new TextLoaderColumn() + { + Name = "Features", + Source = new [] { new TextLoaderRange(1, 9) }, + Type = Data.DataKind.Num + } + } + } + }); + + pipeline.Add(new LogisticRegressionBinaryClassifier() { UseThreads = false }); + + var model = pipeline.Train(); + var subDir = Path.Combine("..", "..", "BaselineOutput", "Common", "Onnx", "BinaryClassification", "BreastCancer"); + var onnxPath = GetOutputPath(subDir, "BinaryClassificationLRSaveModelToOnnxTest.onnx"); + DeleteOutputPath(onnxPath); + + var onnxAsJsonPath = GetOutputPath(subDir, "BinaryClassificationLRSaveModelToOnnxTest.json"); + DeleteOutputPath(onnxAsJsonPath); + + OnnxConverter converter = new OnnxConverter() + { + InputsToDrop = new[] { "Label" }, + OutputsToDrop = new[] { "Label", "Features" }, + Onnx = onnxPath, + Json = onnxAsJsonPath, + Domain = "Onnx" + }; + + converter.Convert(model); + + // Strip the version. + var fileText = File.ReadAllText(onnxAsJsonPath); + fileText = Regex.Replace(fileText, "\"producerVersion\": \"([^\"]+)\"", "\"producerVersion\": \"##VERSION##\""); + File.WriteAllText(onnxAsJsonPath, fileText); + + CheckEquality(subDir, "BinaryClassificationLRSaveModelToOnnxTest.json"); + Done(); + } + + [Fact] + public void MultiClassificationLRSaveModelToOnnxTest() + { + string dataPath = GetDataPath(@"breast-cancer.txt"); + var pipeline = new LearningPipeline(); + + pipeline.Add(new Data.TextLoader(dataPath) + { + Arguments = new TextLoaderArguments + { + Separator = new[] { '\t' }, + HasHeader = true, + Column = new[] + { + new TextLoaderColumn() + { + Name = "Label", + Source = new [] { new TextLoaderRange(0) }, + Type = Data.DataKind.Num + }, + + new TextLoaderColumn() + { + Name = "Features", + Source = new [] { new TextLoaderRange(1, 9) }, + Type = Data.DataKind.Num + } + } + } + }); + + pipeline.Add(new Dictionarizer("Label")); + pipeline.Add(new LogisticRegressionClassifier() { UseThreads = false }); + + var model = pipeline.Train(); + var subDir = Path.Combine("..", "..", "BaselineOutput", "Common", "Onnx", "MultiClassClassification", "BreastCancer"); + var onnxPath = GetOutputPath(subDir, "MultiClassificationLRSaveModelToOnnxTest.onnx"); + DeleteOutputPath(onnxPath); + + var onnxAsJsonPath = GetOutputPath(subDir, "MultiClassificationLRSaveModelToOnnxTest.json"); + DeleteOutputPath(onnxAsJsonPath); + + OnnxConverter converter = new OnnxConverter() + { + InputsToDrop = new[] { "Label" }, + OutputsToDrop = new[] { "Label", "Features" }, + Onnx = onnxPath, + Json = onnxAsJsonPath, + Domain = "Onnx" + }; + + converter.Convert(model); + + // Strip the version. + var fileText = File.ReadAllText(onnxAsJsonPath); + fileText = Regex.Replace(fileText, "\"producerVersion\": \"([^\"]+)\"", "\"producerVersion\": \"##VERSION##\""); + File.WriteAllText(onnxAsJsonPath, fileText); + + CheckEquality(subDir, "MultiClassificationLRSaveModelToOnnxTest.json"); + Done(); + } + } } diff --git a/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationTests.cs b/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationTests.cs index 6612dfea69..ae8e214975 100644 --- a/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationTests.cs +++ b/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationTests.cs @@ -18,7 +18,7 @@ public void TrainAndPredictIrisModelTest() { string dataPath = GetDataPath("iris.txt"); - var pipeline = new LearningPipeline(seed:1, conc:1); + var pipeline = new LearningPipeline(seed: 1, conc: 1); pipeline.Add(new TextLoader(dataPath).CreateFrom(useHeader: false)); pipeline.Add(new ColumnConcatenator(outputColumn: "Features", @@ -30,10 +30,10 @@ public void TrainAndPredictIrisModelTest() IrisPrediction prediction = model.Predict(new IrisData() { - SepalLength = 3.3f, - SepalWidth = 1.6f, - PetalLength = 0.2f, - PetalWidth= 5.1f, + SepalLength = 5.1f, + SepalWidth = 3.3f, + PetalLength = 1.6f, + PetalWidth = 0.2f, }); Assert.Equal(1, prediction.PredictedLabels[0], 2); @@ -42,10 +42,10 @@ public void TrainAndPredictIrisModelTest() prediction = model.Predict(new IrisData() { - SepalLength = 3.1f, - SepalWidth = 5.5f, - PetalLength = 2.2f, - PetalWidth = 6.4f, + SepalLength = 6.4f, + SepalWidth = 3.1f, + PetalLength = 5.5f, + PetalWidth = 2.2f, }); Assert.Equal(0, prediction.PredictedLabels[0], 2); @@ -54,10 +54,10 @@ public void TrainAndPredictIrisModelTest() prediction = model.Predict(new IrisData() { - SepalLength = 3.1f, - SepalWidth = 2.5f, - PetalLength = 1.2f, - PetalWidth = 4.4f, + SepalLength = 4.4f, + SepalWidth = 3.1f, + PetalLength = 2.5f, + PetalWidth = 1.2f, }); Assert.Equal(.2, prediction.PredictedLabels[0], 1); @@ -136,6 +136,37 @@ public class IrisPrediction [ColumnName("Score")] public float[] PredictedLabels; } + + [Fact] + public void TrainOneVersusAll() + { + string dataPath = GetDataPath("iris.txt"); + + var pipeline = new LearningPipeline(seed: 1, conc: 1); + pipeline.Add(new TextLoader(dataPath).CreateFrom(useHeader: false)); + pipeline.Add(new ColumnConcatenator(outputColumn: "Features", + "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")); + + pipeline.Add(OneVersusAll.With(new StochasticDualCoordinateAscentBinaryClassifier())); + + var model = pipeline.Train(); + + var testData = new TextLoader(dataPath).CreateFrom(useHeader: false); + var evaluator = new ClassificationEvaluator(); + ClassificationMetrics metrics = evaluator.Evaluate(model, testData); + CheckMetrics(metrics); + + var trainTest = new TrainTestEvaluator() { Kind = MacroUtilsTrainerKinds.SignatureMultiClassClassifierTrainer }.TrainTestEvaluate(pipeline, testData); + CheckMetrics(trainTest.ClassificationMetrics); + } + + private void CheckMetrics(ClassificationMetrics metrics) + { + Assert.Equal(.96, metrics.AccuracyMacro, 2); + Assert.Equal(.96, metrics.AccuracyMicro, 2); + Assert.Equal(.19, metrics.LogLoss, 1); + Assert.InRange(metrics.LogLossReduction, 80, 84); + } } } diff --git a/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationWithStringLabelTests.cs b/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationWithStringLabelTests.cs index 348a851020..2b2435b661 100644 --- a/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationWithStringLabelTests.cs +++ b/test/Microsoft.ML.Tests/Scenarios/IrisPlantClassificationWithStringLabelTests.cs @@ -41,10 +41,10 @@ public void TrainAndPredictIrisModelWithStringLabelTest() IrisPrediction prediction = model.Predict(new IrisDataWithStringLabel() { - SepalLength = 3.3f, - SepalWidth = 1.6f, - PetalLength = 0.2f, - PetalWidth = 5.1f, + SepalLength = 5.1f, + SepalWidth = 3.3f, + PetalLength = 1.6f, + PetalWidth = 0.2f, }); Assert.Equal(1, prediction.PredictedLabels[0], 2); @@ -53,10 +53,10 @@ public void TrainAndPredictIrisModelWithStringLabelTest() prediction = model.Predict(new IrisDataWithStringLabel() { - SepalLength = 3.1f, - SepalWidth = 5.5f, - PetalLength = 2.2f, - PetalWidth = 6.4f, + SepalLength = 6.4f, + SepalWidth = 3.1f, + PetalLength = 5.5f, + PetalWidth = 2.2f, }); Assert.Equal(0, prediction.PredictedLabels[0], 2); @@ -65,10 +65,10 @@ public void TrainAndPredictIrisModelWithStringLabelTest() prediction = model.Predict(new IrisDataWithStringLabel() { - SepalLength = 3.1f, - SepalWidth = 2.5f, - PetalLength = 1.2f, - PetalWidth = 4.4f, + SepalLength = 4.4f, + SepalWidth = 3.1f, + PetalLength = 2.5f, + PetalWidth = 1.2f, }); Assert.Equal(.2, prediction.PredictedLabels[0], 1); @@ -127,16 +127,16 @@ public void TrainAndPredictIrisModelWithStringLabelTest() public class IrisDataWithStringLabel { [Column("0")] - public float PetalWidth; + public float SepalLength; [Column("1")] - public float SepalLength; + public float SepalWidth; [Column("2")] - public float SepalWidth; + public float PetalLength; [Column("3")] - public float PetalLength; + public float PetalWidth; [Column("4", name: "Label")] public string IrisPlantType; diff --git a/test/Microsoft.ML.Tests/Scenarios/SentimentPredictionTests.cs b/test/Microsoft.ML.Tests/Scenarios/SentimentPredictionTests.cs index 7a31f17d96..9c4283df45 100644 --- a/test/Microsoft.ML.Tests/Scenarios/SentimentPredictionTests.cs +++ b/test/Microsoft.ML.Tests/Scenarios/SentimentPredictionTests.cs @@ -32,6 +32,18 @@ public void TrainAndPredictSentimentModelTest() ValidateBinaryMetrics(metrics); } + [Fact] + public void TrainAndPredictLightGBMSentimentModelTest() + { + var pipeline = PreparePipelineLightGBM(); + var model = pipeline.Train(); + var testData = PrepareTextLoaderTestData(); + var evaluator = new BinaryClassificationEvaluator(); + var metrics = evaluator.Evaluate(model, testData); + ValidateExamplesLightGBM(model); + ValidateBinaryMetricsLightGBM(metrics); + } + [Fact] public void TrainTestPredictSentimentModelTest() { @@ -63,47 +75,47 @@ public void CrossValidateSentimentModelTest() //Avergae of all folds. var metrics = cv.BinaryClassificationMetrics[0]; - Assert.Equal(0.57023626091422708, metrics.Accuracy, 4); - Assert.Equal(0.54960689910161487, metrics.Auc, 1); - Assert.Equal(0.67048277219704255, metrics.Auprc, 2); + Assert.Equal(0.603235747303544, metrics.Accuracy, 4); + Assert.Equal(0.58811318075483943, metrics.Auc, 4); + Assert.Equal(0.70302385499183984, metrics.Auprc, 4); Assert.Equal(0, metrics.Entropy, 3); - Assert.Equal(0.68942642723130532, metrics.F1Score, 4); - Assert.Equal(0.97695909611968434, metrics.LogLoss, 3); - Assert.Equal(-3.050726259114541, metrics.LogLossReduction, 3); - Assert.Equal(0.37553879310344829, metrics.NegativePrecision, 3); - Assert.Equal(0.25683962264150945, metrics.NegativeRecall, 3); - Assert.Equal(0.63428539173628362, metrics.PositivePrecision, 3); - Assert.Equal(0.75795196364816619, metrics.PositiveRecall); + Assert.Equal(0.71751777634130576, metrics.F1Score, 4); + Assert.Equal(0.95263103280238037, metrics.LogLoss, 4); + Assert.Equal(-0.39971801589876232, metrics.LogLossReduction, 4); + Assert.Equal(0.43965517241379309, metrics.NegativePrecision, 4); + Assert.Equal(0.26627358490566039, metrics.NegativeRecall, 4); + Assert.Equal(0.64937737441958632, metrics.PositivePrecision, 4); + Assert.Equal(0.8027426160337553, metrics.PositiveRecall); Assert.Null(metrics.ConfusionMatrix); //Std. Deviation. metrics = cv.BinaryClassificationMetrics[1]; - Assert.Equal(0.039933230611196011, metrics.Accuracy, 4); - Assert.Equal(0.021066177821462407, metrics.Auc, 1); - Assert.Equal(0.045842033921572725, metrics.Auprc, 2); + Assert.Equal(0.057781201848998764, metrics.Accuracy, 4); + Assert.Equal(0.04249579360413544, metrics.Auc, 4); + Assert.Equal(0.086083866074815427, metrics.Auprc, 4); Assert.Equal(0, metrics.Entropy, 3); - Assert.Equal(0.030085767890644915, metrics.F1Score, 4); - Assert.Equal(0.032906777175141941, metrics.LogLoss, 3); - Assert.Equal(0.86311349745170118, metrics.LogLossReduction, 3); - Assert.Equal(0.030711206896551647, metrics.NegativePrecision, 3); - Assert.Equal(0.068160377358490579, metrics.NegativeRecall, 3); - Assert.Equal(0.051761119891622735, metrics.PositivePrecision, 3); - Assert.Equal(0.0015417072379052127, metrics.PositiveRecall); + Assert.Equal(0.04718810601163604, metrics.F1Score, 4); + Assert.Equal(0.063839715206238851, metrics.LogLoss, 4); + Assert.Equal(4.1937544629633878, metrics.LogLossReduction, 4); + Assert.Equal(0.060344827586206781, metrics.NegativePrecision, 4); + Assert.Equal(0.058726415094339748, metrics.NegativeRecall, 4); + Assert.Equal(0.057144364710848418, metrics.PositivePrecision, 4); + Assert.Equal(0.030590717299577637, metrics.PositiveRecall); Assert.Null(metrics.ConfusionMatrix); //Fold 1. metrics = cv.BinaryClassificationMetrics[2]; - Assert.Equal(0.53030303030303028, metrics.Accuracy, 4); - Assert.Equal(0.52854072128015284, metrics.Auc, 1); - Assert.Equal(0.62464073827546951, metrics.Auprc, 2); + Assert.Equal(0.54545454545454541, metrics.Accuracy, 4); + Assert.Equal(0.54561738715070451, metrics.Auc, 4); + Assert.Equal(0.61693998891702417, metrics.Auprc, 4); Assert.Equal(0, metrics.Entropy, 3); - Assert.Equal(0.65934065934065933, metrics.F1Score, 4); - Assert.Equal(1.0098658732948276, metrics.LogLoss, 3); - Assert.Equal(-3.9138397565662424, metrics.LogLossReduction, 3); - Assert.Equal(0.34482758620689657, metrics.NegativePrecision, 3); - Assert.Equal(0.18867924528301888, metrics.NegativeRecall, 3); - Assert.Equal(0.58252427184466016, metrics.PositivePrecision, 3); - Assert.Equal(0.759493670886076, metrics.PositiveRecall); + Assert.Equal(0.67032967032967028, metrics.F1Score, 4); + Assert.Equal(1.0164707480086188, metrics.LogLoss, 4); + Assert.Equal(-4.59347247886215, metrics.LogLossReduction, 4); + Assert.Equal(0.37931034482758619, metrics.NegativePrecision, 4); + Assert.Equal(0.20754716981132076, metrics.NegativeRecall, 4); + Assert.Equal(0.59223300970873782, metrics.PositivePrecision, 4); + Assert.Equal(0.77215189873417722, metrics.PositiveRecall); var matrix = metrics.ConfusionMatrix; Assert.Equal(2, matrix.Order); @@ -111,29 +123,29 @@ public void CrossValidateSentimentModelTest() Assert.Equal("positive", matrix.ClassNames[0]); Assert.Equal("negative", matrix.ClassNames[1]); - Assert.Equal(60, matrix[0, 0]); - Assert.Equal(60, matrix["positive", "positive"]); - Assert.Equal(19, matrix[0, 1]); - Assert.Equal(19, matrix["positive", "negative"]); + Assert.Equal(61, matrix[0, 0]); + Assert.Equal(61, matrix["positive", "positive"]); + Assert.Equal(18, matrix[0, 1]); + Assert.Equal(18, matrix["positive", "negative"]); - Assert.Equal(43, matrix[1, 0]); - Assert.Equal(43, matrix["negative", "positive"]); - Assert.Equal(10, matrix[1, 1]); - Assert.Equal(10, matrix["negative", "negative"]); + Assert.Equal(42, matrix[1, 0]); + Assert.Equal(42, matrix["negative", "positive"]); + Assert.Equal(11, matrix[1, 1]); + Assert.Equal(11, matrix["negative", "negative"]); //Fold 2. metrics = cv.BinaryClassificationMetrics[3]; - Assert.Equal(0.61016949152542377, metrics.Accuracy, 4); - Assert.Equal(0.57067307692307689, metrics.Auc, 1); - Assert.Equal(0.71632480611861549, metrics.Auprc, 2); + Assert.Equal(0.66101694915254239, metrics.Accuracy, 4); + Assert.Equal(0.63060897435897434, metrics.Auc, 4); + Assert.Equal(0.7891077210666555, metrics.Auprc, 4); Assert.Equal(0, metrics.Entropy, 3); - Assert.Equal(0.71951219512195119, metrics.F1Score, 4); - Assert.Equal(0.94405231894454111, metrics.LogLoss, 3); - Assert.Equal(-2.1876127616628396, metrics.LogLossReduction, 3); - Assert.Equal(0.40625, metrics.NegativePrecision, 3); + Assert.Equal(0.76470588235294124, metrics.F1Score, 4); + Assert.Equal(0.88879131759614194, metrics.LogLoss, 4); + Assert.Equal(3.7940364470646255, metrics.LogLossReduction, 4); + Assert.Equal(0.5, metrics.NegativePrecision, 3); Assert.Equal(0.325, metrics.NegativeRecall, 3); - Assert.Equal(0.686046511627907, metrics.PositivePrecision, 3); - Assert.Equal(0.75641025641025639, metrics.PositiveRecall); + Assert.Equal(0.70652173913043481, metrics.PositivePrecision, 4); + Assert.Equal(0.83333333333333337, metrics.PositiveRecall); matrix = metrics.ConfusionMatrix; Assert.Equal(2, matrix.Order); @@ -141,10 +153,10 @@ public void CrossValidateSentimentModelTest() Assert.Equal("positive", matrix.ClassNames[0]); Assert.Equal("negative", matrix.ClassNames[1]); - Assert.Equal(59, matrix[0, 0]); - Assert.Equal(59, matrix["positive", "positive"]); - Assert.Equal(19, matrix[0, 1]); - Assert.Equal(19, matrix["positive", "negative"]); + Assert.Equal(65, matrix[0, 0]); + Assert.Equal(65, matrix["positive", "positive"]); + Assert.Equal(13, matrix[0, 1]); + Assert.Equal(13, matrix["positive", "negative"]); Assert.Equal(27, matrix[1, 0]); Assert.Equal(27, matrix["negative", "positive"]); @@ -163,18 +175,19 @@ public void CrossValidateSentimentModelTest() Assert.True(predictions.ElementAt(1).Sentiment.IsTrue); } - private void ValidateBinaryMetrics(BinaryClassificationMetrics metrics) + private void ValidateBinaryMetricsLightGBM(BinaryClassificationMetrics metrics) { - Assert.Equal(.5556, metrics.Accuracy, 4); + + Assert.Equal(.6111, metrics.Accuracy, 4); Assert.Equal(.8, metrics.Auc, 1); - Assert.Equal(.87, metrics.Auprc, 2); + Assert.Equal(0.88, metrics.Auprc, 2); Assert.Equal(1, metrics.Entropy, 3); - Assert.Equal(.6923, metrics.F1Score, 4); - Assert.Equal(.969, metrics.LogLoss, 3); - Assert.Equal(3.083, metrics.LogLossReduction, 3); + Assert.Equal(.72, metrics.F1Score, 4); + Assert.Equal(0.96456100297125325, metrics.LogLoss, 4); + Assert.Equal(3.5438997028746755, metrics.LogLossReduction, 4); Assert.Equal(1, metrics.NegativePrecision, 3); - Assert.Equal(.111, metrics.NegativeRecall, 3); - Assert.Equal(.529, metrics.PositivePrecision, 3); + Assert.Equal(.222, metrics.NegativeRecall, 3); + Assert.Equal(.562, metrics.PositivePrecision, 3); Assert.Equal(1, metrics.PositiveRecall); var matrix = metrics.ConfusionMatrix; @@ -188,10 +201,43 @@ private void ValidateBinaryMetrics(BinaryClassificationMetrics metrics) Assert.Equal(0, matrix[0, 1]); Assert.Equal(0, matrix["positive", "negative"]); - Assert.Equal(8, matrix[1, 0]); - Assert.Equal(8, matrix["negative", "positive"]); - Assert.Equal(1, matrix[1, 1]); - Assert.Equal(1, matrix["negative", "negative"]); + Assert.Equal(7, matrix[1, 0]); + Assert.Equal(7, matrix["negative", "positive"]); + Assert.Equal(2, matrix[1, 1]); + Assert.Equal(2, matrix["negative", "negative"]); + + } + + private void ValidateBinaryMetrics(BinaryClassificationMetrics metrics) + { + + Assert.Equal(0.6111, metrics.Accuracy, 4); + Assert.Equal(0.6667, metrics.Auc, 4); + Assert.Equal(0.8621, metrics.Auprc, 4); + Assert.Equal(1, metrics.Entropy, 3); + Assert.Equal(0.72, metrics.F1Score, 2); + Assert.Equal(0.9689, metrics.LogLoss, 4); + Assert.Equal(3.1122, metrics.LogLossReduction, 4); + Assert.Equal(1, metrics.NegativePrecision, 1); + Assert.Equal(0.2222, metrics.NegativeRecall, 4); + Assert.Equal(0.5625, metrics.PositivePrecision, 4); + Assert.Equal(1, metrics.PositiveRecall); + + var matrix = metrics.ConfusionMatrix; + Assert.Equal(2, matrix.Order); + Assert.Equal(2, matrix.ClassNames.Count); + Assert.Equal("positive", matrix.ClassNames[0]); + Assert.Equal("negative", matrix.ClassNames[1]); + + Assert.Equal(9, matrix[0, 0]); + Assert.Equal(9, matrix["positive", "positive"]); + Assert.Equal(0, matrix[0, 1]); + Assert.Equal(0, matrix["positive", "negative"]); + + Assert.Equal(7, matrix[1, 0]); + Assert.Equal(7, matrix["negative", "positive"]); + Assert.Equal(2, matrix[1, 1]); + Assert.Equal(2, matrix["negative", "negative"]); } private LearningPipeline PreparePipeline() @@ -211,14 +257,14 @@ private LearningPipeline PreparePipeline() { Name = "Label", Source = new [] { new TextLoaderRange(0) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SentimentText", Source = new [] { new TextLoaderRange(1) }, - Type = Runtime.Data.DataKind.Text + Type = Data.DataKind.Text } } } @@ -236,17 +282,80 @@ private LearningPipeline PreparePipeline() WordFeatureExtractor = new NGramNgramExtractor() { NgramLength = 2, AllLengths = true } }); + pipeline.Add(new FastTreeBinaryClassifier() { NumLeaves = 5, NumTrees = 5, MinDocumentsInLeafs = 2 }); + pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" }); return pipeline; } - private void ValidateExamples(PredictionModel model) + private LearningPipeline PreparePipelineLightGBM() + { + var dataPath = GetDataPath(SentimentDataPath); + var pipeline = new LearningPipeline(); + + pipeline.Add(new Data.TextLoader(dataPath) + { + Arguments = new TextLoaderArguments + { + Separator = new[] { '\t' }, + HasHeader = true, + Column = new[] + { + new TextLoaderColumn() + { + Name = "Label", + Source = new [] { new TextLoaderRange(0) }, + Type = Data.DataKind.Num + }, + + new TextLoaderColumn() + { + Name = "SentimentText", + Source = new [] { new TextLoaderRange(1) }, + Type = Data.DataKind.Text + } + } + } + }); + + pipeline.Add(new TextFeaturizer("Features", "SentimentText") + { + KeepDiacritics = false, + KeepPunctuations = false, + TextCase = TextNormalizerTransformCaseNormalizationMode.Lower, + OutputTokens = true, + StopWordsRemover = new PredefinedStopWordsRemover(), + VectorNormalizer = TextTransformTextNormKind.L2, + CharFeatureExtractor = new NGramNgramExtractor() { NgramLength = 3, AllLengths = false }, + WordFeatureExtractor = new NGramNgramExtractor() { NgramLength = 2, AllLengths = true } + }); + + + pipeline.Add(new LightGbmBinaryClassifier() { NumLeaves = 5, NumBoostRound = 5, MinDataPerLeaf = 2 }); + + pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" }); + return pipeline; + } + + private void ValidateExamples(PredictionModel model, bool useLightGBM = false) + { + var sentiments = GetTestData(); + var predictions = model.Predict(sentiments); + Assert.Equal(2, predictions.Count()); + + Assert.True(predictions.ElementAt(0).Sentiment.IsTrue); + Assert.True(predictions.ElementAt(1).Sentiment.IsTrue); + + } + + private void ValidateExamplesLightGBM(PredictionModel model) { var sentiments = GetTestData(); var predictions = model.Predict(sentiments); Assert.Equal(2, predictions.Count()); - Assert.True(predictions.ElementAt(0).Sentiment.IsFalse); + + Assert.True(predictions.ElementAt(0).Sentiment.IsTrue); Assert.True(predictions.ElementAt(1).Sentiment.IsTrue); } @@ -265,14 +374,14 @@ private Data.TextLoader PrepareTextLoaderTestData() { Name = "Label", Source = new [] { new TextLoaderRange(0) }, - Type = Runtime.Data.DataKind.Num + Type = Data.DataKind.Num }, new TextLoaderColumn() { Name = "SentimentText", Source = new [] { new TextLoaderRange(1) }, - Type = Runtime.Data.DataKind.Text + Type = Data.DataKind.Text } } } diff --git a/test/Microsoft.ML.Tests/ScenariosWithDirectInstantiation/IrisPlantClassificationTests.cs b/test/Microsoft.ML.Tests/ScenariosWithDirectInstantiation/IrisPlantClassificationTests.cs new file mode 100644 index 0000000000..0535f2b15d --- /dev/null +++ b/test/Microsoft.ML.Tests/ScenariosWithDirectInstantiation/IrisPlantClassificationTests.cs @@ -0,0 +1,209 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Models; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Api; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.Learners; +using Microsoft.ML.Runtime.Model; +using System; +using System.IO; +using Xunit; + +namespace Microsoft.ML.Scenarios +{ + public partial class ScenariosTests + { + [Fact] + public void TrainAndPredictIrisModelUsingDirectInstantiationTest() + { + string dataPath = GetDataPath("iris.txt"); + string testDataPath = dataPath; + + using (var env = new TlcEnvironment(seed: 1, conc: 1)) + { + // Pipeline + var loader = new TextLoader(env, + new TextLoader.Arguments() + { + HasHeader = false, + Column = new[] { + new TextLoader.Column() + { + Name = "Label", + Source = new [] { new TextLoader.Range() { Min = 0, Max = 0} }, + Type = DataKind.R4 + }, + new TextLoader.Column() + { + Name = "SepalLength", + Source = new [] { new TextLoader.Range() { Min = 1, Max = 1} }, + Type = DataKind.R4 + }, + new TextLoader.Column() + { + Name = "SepalWidth", + Source = new [] { new TextLoader.Range() { Min = 2, Max = 2} }, + Type = DataKind.R4 + }, + new TextLoader.Column() + { + Name = "PetalLength", + Source = new [] { new TextLoader.Range() { Min = 3, Max = 3} }, + Type = DataKind.R4 + }, + new TextLoader.Column() + { + Name = "PetalWidth", + Source = new [] { new TextLoader.Range() { Min = 4, Max = 4} }, + Type = DataKind.R4 + } + } + }, new MultiFileSource(dataPath)); + + IDataTransform trans = new ConcatTransform(env, loader, "Features", + "SepalLength", "SepalWidth", "PetalLength", "PetalWidth"); + + // Normalizer is not automatically added though the trainer has 'NormalizeFeatures' On/Auto + trans = NormalizeTransform.CreateMinMaxNormalizer(env, trans, "Features"); + + // Train + var trainer = new SdcaMultiClassTrainer(env, new SdcaMultiClassTrainer.Arguments() { NumThreads = 1 } ); + + // Explicity adding CacheDataView since caching is not working though trainer has 'Caching' On/Auto + var cached = new CacheDataView(env, trans, prefetch: null); + var trainRoles = new RoleMappedData(cached, label: "Label", feature: "Features"); + var pred = trainer.Train(trainRoles); + + // Get scorer and evaluate the predictions from test data + IDataScorerTransform testDataScorer = GetScorer(env, trans, pred, testDataPath); + var metrics = Evaluate(env, testDataScorer); + CompareMatrics(metrics); + + // Create prediction engine and test predictions + var model = env.CreatePredictionEngine(testDataScorer); + ComparePredictions(model); + + // Get feature importance i.e. weight vector + var summary = ((MulticlassLogisticRegressionPredictor)pred).GetSummaryInKeyValuePairs(trainRoles.Schema); + Assert.Equal(7.757864, Convert.ToDouble(summary[0].Value), 5); + } + } + + private void ComparePredictions(PredictionEngine model) + { + IrisPrediction prediction = model.Predict(new IrisData() + { + SepalLength = 5.1f, + SepalWidth = 3.3f, + PetalLength = 1.6f, + PetalWidth = 0.2f, + }); + + Assert.Equal(1, prediction.PredictedLabels[0], 2); + Assert.Equal(0, prediction.PredictedLabels[1], 2); + Assert.Equal(0, prediction.PredictedLabels[2], 2); + + prediction = model.Predict(new IrisData() + { + SepalLength = 6.4f, + SepalWidth = 3.1f, + PetalLength = 5.5f, + PetalWidth = 2.2f, + }); + + Assert.Equal(0, prediction.PredictedLabels[0], 2); + Assert.Equal(0, prediction.PredictedLabels[1], 2); + Assert.Equal(1, prediction.PredictedLabels[2], 2); + + prediction = model.Predict(new IrisData() + { + SepalLength = 4.4f, + SepalWidth = 3.1f, + PetalLength = 2.5f, + PetalWidth = 1.2f, + }); + + Assert.Equal(.2, prediction.PredictedLabels[0], 1); + Assert.Equal(.8, prediction.PredictedLabels[1], 1); + Assert.Equal(0, prediction.PredictedLabels[2], 2); + } + + private void CompareMatrics(ClassificationMetrics metrics) + { + Assert.Equal(.98, metrics.AccuracyMacro); + Assert.Equal(.98, metrics.AccuracyMicro, 2); + Assert.Equal(.06, metrics.LogLoss, 2); + Assert.InRange(metrics.LogLossReduction, 94, 96); + Assert.Equal(1, metrics.TopKAccuracy); + + Assert.Equal(3, metrics.PerClassLogLoss.Length); + Assert.Equal(0, metrics.PerClassLogLoss[0], 1); + Assert.Equal(.1, metrics.PerClassLogLoss[1], 1); + Assert.Equal(.1, metrics.PerClassLogLoss[2], 1); + + ConfusionMatrix matrix = metrics.ConfusionMatrix; + Assert.Equal(3, matrix.Order); + Assert.Equal(3, matrix.ClassNames.Count); + Assert.Equal("0", matrix.ClassNames[0]); + Assert.Equal("1", matrix.ClassNames[1]); + Assert.Equal("2", matrix.ClassNames[2]); + + Assert.Equal(50, matrix[0, 0]); + Assert.Equal(50, matrix["0", "0"]); + Assert.Equal(0, matrix[0, 1]); + Assert.Equal(0, matrix["0", "1"]); + Assert.Equal(0, matrix[0, 2]); + Assert.Equal(0, matrix["0", "2"]); + + Assert.Equal(0, matrix[1, 0]); + Assert.Equal(0, matrix["1", "0"]); + Assert.Equal(48, matrix[1, 1]); + Assert.Equal(48, matrix["1", "1"]); + Assert.Equal(2, matrix[1, 2]); + Assert.Equal(2, matrix["1", "2"]); + + Assert.Equal(0, matrix[2, 0]); + Assert.Equal(0, matrix["2", "0"]); + Assert.Equal(1, matrix[2, 1]); + Assert.Equal(1, matrix["2", "1"]); + Assert.Equal(49, matrix[2, 2]); + Assert.Equal(49, matrix["2", "2"]); + } + + private ClassificationMetrics Evaluate(IHostEnvironment env, IDataView scoredData) + { + var dataEval = new RoleMappedData(scoredData, label: "Label", feature: "Features", opt: true); + + // Evaluate. + // It does not work. It throws error "Failed to find 'Score' column" when Evaluate is called + //var evaluator = new MultiClassClassifierEvaluator(env, new MultiClassClassifierEvaluator.Arguments() { OutputTopKAcc = 3 }); + + var evaluator = new MultiClassMamlEvaluator(env, new MultiClassMamlEvaluator.Arguments() { OutputTopKAcc = 3 }); + var metricsDic = evaluator.Evaluate(dataEval); + + return ClassificationMetrics.FromMetrics(env, metricsDic["OverallMetrics"], metricsDic["ConfusionMatrix"])[0]; + } + + private IDataScorerTransform GetScorer(IHostEnvironment env, IDataView transforms, IPredictor pred, string testDataPath = null) + { + using (var ch = env.Start("Saving model")) + using (var memoryStream = new MemoryStream()) + { + var trainRoles = new RoleMappedData(transforms, label: "Label", feature: "Features"); + + // Model cannot be saved with CacheDataView + TrainUtils.SaveModel(env, ch, memoryStream, pred, trainRoles); + memoryStream.Position = 0; + using (var rep = RepositoryReader.Open(memoryStream, ch)) + { + IDataLoader testPipe = ModelFileUtils.LoadLoader(env, rep, new MultiFileSource(testDataPath), true); + RoleMappedData testRoles = new RoleMappedData(testPipe, label: "Label", feature: "Features"); + return ScoreUtils.GetScorer(pred, testRoles, env, testRoles.Schema); + } + } + } + } +} diff --git a/test/Microsoft.ML.Tests/ScenariosWithDirectInstantiation/SentimentPredictionTests.cs b/test/Microsoft.ML.Tests/ScenariosWithDirectInstantiation/SentimentPredictionTests.cs new file mode 100644 index 0000000000..bea81175d8 --- /dev/null +++ b/test/Microsoft.ML.Tests/ScenariosWithDirectInstantiation/SentimentPredictionTests.cs @@ -0,0 +1,117 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.ML.Models; +using Microsoft.ML.Runtime; +using Microsoft.ML.Runtime.Api; +using Microsoft.ML.Runtime.Data; +using Microsoft.ML.Runtime.FastTree; +using Microsoft.ML.Runtime.Internal.Calibration; +using Microsoft.ML.Runtime.Model; +using Microsoft.ML.Trainers; +using Microsoft.ML.Transforms; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Xunit; + +namespace Microsoft.ML.Scenarios +{ + public partial class ScenariosTests + { + [Fact] + public void TrainAndPredictSentimentModelWithDirectionInstantiationTest() + { + var dataPath = GetDataPath(SentimentDataPath); + var testDataPath = GetDataPath(SentimentTestPath); + + using (var env = new TlcEnvironment(seed: 1, conc: 1)) + { + // Pipeline + var loader = new TextLoader(env, + new TextLoader.Arguments() + { + Separator = "tab", + HasHeader = true, + Column = new[] + { + new TextLoader.Column() + { + Name = "Label", + Source = new [] { new TextLoader.Range() { Min=0, Max=0} }, + Type = DataKind.Num + }, + + new TextLoader.Column() + { + Name = "SentimentText", + Source = new [] { new TextLoader.Range() { Min=1, Max=1} }, + Type = DataKind.Text + } + } + }, new MultiFileSource(dataPath)); + + var trans = TextTransform.Create(env, new TextTransform.Arguments() + { + Column = new TextTransform.Column + { + Name = "Features", + Source = new[] { "SentimentText" } + }, + KeepDiacritics = false, + KeepPunctuations = false, + TextCase = Runtime.TextAnalytics.TextNormalizerTransform.CaseNormalizationMode.Lower, + OutputTokens = true, + StopWordsRemover = new Runtime.TextAnalytics.PredefinedStopWordsRemoverFactory(), + VectorNormalizer = TextTransform.TextNormKind.L2, + CharFeatureExtractor = new NgramExtractorTransform.NgramExtractorArguments() { NgramLength = 3, AllLengths = false }, + WordFeatureExtractor = new NgramExtractorTransform.NgramExtractorArguments() { NgramLength = 2, AllLengths = true }, + }, + loader); + + // Train + var trainer = new FastTreeBinaryClassificationTrainer(env, new FastTreeBinaryClassificationTrainer.Arguments() + { + NumLeaves = 5, + NumTrees = 5, + MinDocumentsInLeafs = 2 + }); + + var trainRoles = new RoleMappedData(trans, label: "Label", feature: "Features"); + var pred = trainer.Train(trainRoles); + + // Get scorer and evaluate the predictions from test data + IDataScorerTransform testDataScorer = GetScorer(env, trans, pred, testDataPath); + var metrics = EvaluateBinary(env, testDataScorer); + ValidateBinaryMetrics(metrics); + + // Create prediction engine and test predictions + var model = env.CreateBatchPredictionEngine(testDataScorer); + var sentiments = GetTestData(); + var predictions = model.Predict(sentiments, false); + Assert.Equal(2, predictions.Count()); + Assert.True(predictions.ElementAt(0).Sentiment.IsTrue); + Assert.True(predictions.ElementAt(1).Sentiment.IsTrue); + + // Get feature importance based on feature gain during training + var summary = ((FeatureWeightsCalibratedPredictor)pred).GetSummaryInKeyValuePairs(trainRoles.Schema); + Assert.Equal(1.0, (double)summary[0].Value, 1); + } + } + + private BinaryClassificationMetrics EvaluateBinary(IHostEnvironment env, IDataView scoredData) + { + var dataEval = new RoleMappedData(scoredData, label: "Label", feature: "Features", opt: true); + + // Evaluate. + // It does not work. It throws error "Failed to find 'Score' column" when Evaluate is called + //var evaluator = new BinaryClassifierEvaluator(env, new BinaryClassifierEvaluator.Arguments()); + + var evaluator = new BinaryClassifierMamlEvaluator(env, new BinaryClassifierMamlEvaluator.Arguments()); + var metricsDic = evaluator.Evaluate(dataEval); + + return BinaryClassificationMetrics.FromMetrics(env, metricsDic["OverallMetrics"], metricsDic["ConfusionMatrix"])[0]; + } + } +} diff --git a/test/data/iris.txt b/test/data/iris.txt index cb2a9a14ee..e5256d475e 100644 --- a/test/data/iris.txt +++ b/test/data/iris.txt @@ -1,151 +1,151 @@ #Label Sepal length Sepal width Petal length Petal width -0 3.5 1.4 0.2 5.1 -0 3.0 1.4 0.2 4.9 -0 3.2 1.3 0.2 4.7 -0 3.1 1.5 0.2 4.6 -0 3.6 1.4 0.2 5.0 -0 3.9 1.7 0.4 5.4 -0 3.4 1.4 0.3 4.6 -0 3.4 1.5 0.2 5.0 -0 2.9 1.4 0.2 4.4 -0 3.1 1.5 0.1 4.9 -0 3.7 1.5 0.2 5.4 -0 3.4 1.6 0.2 4.8 -0 3.0 1.4 0.1 4.8 -0 3.0 1.1 0.1 4.3 -0 4.0 1.2 0.2 5.8 -0 4.4 1.5 0.4 5.7 -0 3.9 1.3 0.4 5.4 -0 3.5 1.4 0.3 5.1 -0 3.8 1.7 0.3 5.7 -0 3.8 1.5 0.3 5.1 -0 3.4 1.7 0.2 5.4 -0 3.7 1.5 0.4 5.1 -0 3.6 1.0 0.2 4.6 -0 3.3 1.7 0.5 5.1 -0 3.4 1.9 0.2 4.8 -0 3.0 1.6 0.2 5.0 -0 3.4 1.6 0.4 5.0 -0 3.5 1.5 0.2 5.2 -0 3.4 1.4 0.2 5.2 -0 3.2 1.6 0.2 4.7 -0 3.1 1.6 0.2 4.8 -0 3.4 1.5 0.4 5.4 -0 4.1 1.5 0.1 5.2 -0 4.2 1.4 0.2 5.5 -0 3.1 1.5 0.1 4.9 -0 3.2 1.2 0.2 5.0 -0 3.5 1.3 0.2 5.5 -0 3.1 1.5 0.1 4.9 -0 3.0 1.3 0.2 4.4 -0 3.4 1.5 0.2 5.1 -0 3.5 1.3 0.3 5.0 -0 2.3 1.3 0.3 4.5 -0 3.2 1.3 0.2 4.4 -0 3.5 1.6 0.6 5.0 -0 3.8 1.9 0.4 5.1 -0 3.0 1.4 0.3 4.8 -0 3.8 1.6 0.2 5.1 -0 3.2 1.4 0.2 4.6 -0 3.7 1.5 0.2 5.3 -0 3.3 1.4 0.2 5.0 -1 3.2 4.7 1.4 7.0 -1 3.2 4.5 1.5 6.4 -1 3.1 4.9 1.5 6.9 -1 2.3 4.0 1.3 5.5 -1 2.8 4.6 1.5 6.5 -1 2.8 4.5 1.3 5.7 -1 3.3 4.7 1.6 6.3 -1 2.4 3.3 1.0 4.9 -1 2.9 4.6 1.3 6.6 -1 2.7 3.9 1.4 5.2 -1 2.0 3.5 1.0 5.0 -1 3.0 4.2 1.5 5.9 -1 2.2 4.0 1.0 6.0 -1 2.9 4.7 1.4 6.1 -1 2.9 3.6 1.3 5.6 -1 3.1 4.4 1.4 6.7 -1 3.0 4.5 1.5 5.6 -1 2.7 4.1 1.0 5.8 -1 2.2 4.5 1.5 6.2 -1 2.5 3.9 1.1 5.6 -1 3.2 4.8 1.8 5.9 -1 2.8 4.0 1.3 6.1 -1 2.5 4.9 1.5 6.3 -1 2.8 4.7 1.2 6.1 -1 2.9 4.3 1.3 6.4 -1 3.0 4.4 1.4 6.6 -1 2.8 4.8 1.4 6.8 -1 3.0 5.0 1.7 6.7 -1 2.9 4.5 1.5 6.0 -1 2.6 3.5 1.0 5.7 -1 2.4 3.8 1.1 5.5 -1 2.4 3.7 1.0 5.5 -1 2.7 3.9 1.2 5.8 -1 2.7 5.1 1.6 6.0 -1 3.0 4.5 1.5 5.4 -1 3.4 4.5 1.6 6.0 -1 3.1 4.7 1.5 6.7 -1 2.3 4.4 1.3 6.3 -1 3.0 4.1 1.3 5.6 -1 2.5 4.0 1.3 5.5 -1 2.6 4.4 1.2 5.5 -1 3.0 4.6 1.4 6.1 -1 2.6 4.0 1.2 5.8 -1 2.3 3.3 1.0 5.0 -1 2.7 4.2 1.3 5.6 -1 3.0 4.2 1.2 5.7 -1 2.9 4.2 1.3 5.7 -1 2.9 4.3 1.3 6.2 -1 2.5 3.0 1.1 5.1 -1 2.8 4.1 1.3 5.7 -2 3.3 6.0 2.5 6.3 -2 2.7 5.1 1.9 5.8 -2 3.0 5.9 2.1 7.1 -2 2.9 5.6 1.8 6.3 -2 3.0 5.8 2.2 6.5 -2 3.0 6.6 2.1 7.6 -2 2.5 4.5 1.7 4.9 -2 2.9 6.3 1.8 7.3 -2 2.5 5.8 1.8 6.7 -2 3.6 6.1 2.5 7.2 -2 3.2 5.1 2.0 6.5 -2 2.7 5.3 1.9 6.4 -2 3.0 5.5 2.1 6.8 -2 2.5 5.0 2.0 5.7 -2 2.8 5.1 2.4 5.8 -2 3.2 5.3 2.3 6.4 -2 3.0 5.5 1.8 6.5 -2 3.8 6.7 2.2 7.7 -2 2.6 6.9 2.3 7.7 -2 2.2 5.0 1.5 6.0 -2 3.2 5.7 2.3 6.9 -2 2.8 4.9 2.0 5.6 -2 2.8 6.7 2.0 7.7 -2 2.7 4.9 1.8 6.3 -2 3.3 5.7 2.1 6.7 -2 3.2 6.0 1.8 7.2 -2 2.8 4.8 1.8 6.2 -2 3.0 4.9 1.8 6.1 -2 2.8 5.6 2.1 6.4 -2 3.0 5.8 1.6 7.2 -2 2.8 6.1 1.9 7.4 -2 3.8 6.4 2.0 7.9 -2 2.8 5.6 2.2 6.4 -2 2.8 5.1 1.5 6.3 -2 2.6 5.6 1.4 6.1 -2 3.0 6.1 2.3 7.7 -2 3.4 5.6 2.4 6.3 -2 3.1 5.5 1.8 6.4 -2 3.0 4.8 1.8 6.0 -2 3.1 5.4 2.1 6.9 -2 3.1 5.6 2.4 6.7 -2 3.1 5.1 2.3 6.9 -2 2.7 5.1 1.9 5.8 -2 3.2 5.9 2.3 6.8 -2 3.3 5.7 2.5 6.7 -2 3.0 5.2 2.3 6.7 -2 2.5 5.0 1.9 6.3 -2 3.0 5.2 2.0 6.5 -2 3.4 5.4 2.3 6.2 -2 3.0 5.1 1.8 5.9 +0 5.1 3.5 1.4 0.2 +0 4.9 3.0 1.4 0.2 +0 4.7 3.2 1.3 0.2 +0 4.6 3.1 1.5 0.2 +0 5.0 3.6 1.4 0.2 +0 5.4 3.9 1.7 0.4 +0 4.6 3.4 1.4 0.3 +0 5.0 3.4 1.5 0.2 +0 4.4 2.9 1.4 0.2 +0 4.9 3.1 1.5 0.1 +0 5.4 3.7 1.5 0.2 +0 4.8 3.4 1.6 0.2 +0 4.8 3.0 1.4 0.1 +0 4.3 3.0 1.1 0.1 +0 5.8 4.0 1.2 0.2 +0 5.7 4.4 1.5 0.4 +0 5.4 3.9 1.3 0.4 +0 5.1 3.5 1.4 0.3 +0 5.7 3.8 1.7 0.3 +0 5.1 3.8 1.5 0.3 +0 5.4 3.4 1.7 0.2 +0 5.1 3.7 1.5 0.4 +0 4.6 3.6 1.0 0.2 +0 5.1 3.3 1.7 0.5 +0 4.8 3.4 1.9 0.2 +0 5.0 3.0 1.6 0.2 +0 5.0 3.4 1.6 0.4 +0 5.2 3.5 1.5 0.2 +0 5.2 3.4 1.4 0.2 +0 4.7 3.2 1.6 0.2 +0 4.8 3.1 1.6 0.2 +0 5.4 3.4 1.5 0.4 +0 5.2 4.1 1.5 0.1 +0 5.5 4.2 1.4 0.2 +0 4.9 3.1 1.5 0.1 +0 5.0 3.2 1.2 0.2 +0 5.5 3.5 1.3 0.2 +0 4.9 3.1 1.5 0.1 +0 4.4 3.0 1.3 0.2 +0 5.1 3.4 1.5 0.2 +0 5.0 3.5 1.3 0.3 +0 4.5 2.3 1.3 0.3 +0 4.4 3.2 1.3 0.2 +0 5.0 3.5 1.6 0.6 +0 5.1 3.8 1.9 0.4 +0 4.8 3.0 1.4 0.3 +0 5.1 3.8 1.6 0.2 +0 4.6 3.2 1.4 0.2 +0 5.3 3.7 1.5 0.2 +0 5.0 3.3 1.4 0.2 +1 7.0 3.2 4.7 1.4 +1 6.4 3.2 4.5 1.5 +1 6.9 3.1 4.9 1.5 +1 5.5 2.3 4.0 1.3 +1 6.5 2.8 4.6 1.5 +1 5.7 2.8 4.5 1.3 +1 6.3 3.3 4.7 1.6 +1 4.9 2.4 3.3 1.0 +1 6.6 2.9 4.6 1.3 +1 5.2 2.7 3.9 1.4 +1 5.0 2.0 3.5 1.0 +1 5.9 3.0 4.2 1.5 +1 6.0 2.2 4.0 1.0 +1 6.1 2.9 4.7 1.4 +1 5.6 2.9 3.6 1.3 +1 6.7 3.1 4.4 1.4 +1 5.6 3.0 4.5 1.5 +1 5.8 2.7 4.1 1.0 +1 6.2 2.2 4.5 1.5 +1 5.6 2.5 3.9 1.1 +1 5.9 3.2 4.8 1.8 +1 6.1 2.8 4.0 1.3 +1 6.3 2.5 4.9 1.5 +1 6.1 2.8 4.7 1.2 +1 6.4 2.9 4.3 1.3 +1 6.6 3.0 4.4 1.4 +1 6.8 2.8 4.8 1.4 +1 6.7 3.0 5.0 1.7 +1 6.0 2.9 4.5 1.5 +1 5.7 2.6 3.5 1.0 +1 5.5 2.4 3.8 1.1 +1 5.5 2.4 3.7 1.0 +1 5.8 2.7 3.9 1.2 +1 6.0 2.7 5.1 1.6 +1 5.4 3.0 4.5 1.5 +1 6.0 3.4 4.5 1.6 +1 6.7 3.1 4.7 1.5 +1 6.3 2.3 4.4 1.3 +1 5.6 3.0 4.1 1.3 +1 5.5 2.5 4.0 1.3 +1 5.5 2.6 4.4 1.2 +1 6.1 3.0 4.6 1.4 +1 5.8 2.6 4.0 1.2 +1 5.0 2.3 3.3 1.0 +1 5.6 2.7 4.2 1.3 +1 5.7 3.0 4.2 1.2 +1 5.7 2.9 4.2 1.3 +1 6.2 2.9 4.3 1.3 +1 5.1 2.5 3.0 1.1 +1 5.7 2.8 4.1 1.3 +2 6.3 3.3 6.0 2.5 +2 5.8 2.7 5.1 1.9 +2 7.1 3.0 5.9 2.1 +2 6.3 2.9 5.6 1.8 +2 6.5 3.0 5.8 2.2 +2 7.6 3.0 6.6 2.1 +2 4.9 2.5 4.5 1.7 +2 7.3 2.9 6.3 1.8 +2 6.7 2.5 5.8 1.8 +2 7.2 3.6 6.1 2.5 +2 6.5 3.2 5.1 2.0 +2 6.4 2.7 5.3 1.9 +2 6.8 3.0 5.5 2.1 +2 5.7 2.5 5.0 2.0 +2 5.8 2.8 5.1 2.4 +2 6.4 3.2 5.3 2.3 +2 6.5 3.0 5.5 1.8 +2 7.7 3.8 6.7 2.2 +2 7.7 2.6 6.9 2.3 +2 6.0 2.2 5.0 1.5 +2 6.9 3.2 5.7 2.3 +2 5.6 2.8 4.9 2.0 +2 7.7 2.8 6.7 2.0 +2 6.3 2.7 4.9 1.8 +2 6.7 3.3 5.7 2.1 +2 7.2 3.2 6.0 1.8 +2 6.2 2.8 4.8 1.8 +2 6.1 3.0 4.9 1.8 +2 6.4 2.8 5.6 2.1 +2 7.2 3.0 5.8 1.6 +2 7.4 2.8 6.1 1.9 +2 7.9 3.8 6.4 2.0 +2 6.4 2.8 5.6 2.2 +2 6.3 2.8 5.1 1.5 +2 6.1 2.6 5.6 1.4 +2 7.7 3.0 6.1 2.3 +2 6.3 3.4 5.6 2.4 +2 6.4 3.1 5.5 1.8 +2 6.0 3.0 4.8 1.8 +2 6.9 3.1 5.4 2.1 +2 6.7 3.1 5.6 2.4 +2 6.9 3.1 5.1 2.3 +2 5.8 2.7 5.1 1.9 +2 6.8 3.2 5.9 2.3 +2 6.7 3.3 5.7 2.5 +2 6.7 3.0 5.2 2.3 +2 6.3 2.5 5.0 1.9 +2 6.5 3.0 5.2 2.0 +2 6.2 3.4 5.4 2.3 +2 5.9 3.0 5.1 1.8 diff --git a/test/data/lm.sample.txt b/test/data/lm.sample.txt new file mode 100644 index 0000000000..4aa28ab03f --- /dev/null +++ b/test/data/lm.sample.txt @@ -0,0 +1,120 @@ +Wirtschaft de-DE url-pathpart-wirtschaft url-pathpart-soziales url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,793077,00 url-pagepartsplitname-0,1518,793077,00 url-lastpartpagename-html#ref=rss weg fuer milliardenhilfe frei vor dem parlamentsgebaeude toben strassenkaempfe zwischen demonstranten drinnen haben die griechischen abgeordneten das drastische sparpaket am abend endgueltig beschlossen die entscheidung ist eine wichtige voraussetzung fuer die auszahlung von weiteren acht milliarden euro hilfsgeldern athen das griechische parlament hat einem umfassenden sparpaket endgueltig zugestimmt +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-versicherer url-pathpart-460206 url-domainname-www.wiwo.de url-domainprefix-www url-domainprefix-www.wiwo url-domaintype-de url-domainsuffix-wiwo.de versicherer lediglich air worldwide ein spezialist fuer risikomodelle wagte sich schnell mit einer ersten schaetzung vor +Wirtschaft de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-198684 url-pagepartsplitname-198684 url-lastpartpagename-html neue todesfaelle durch ehec hannover berlin dpa nd in niedersachsen hat der ehec erreger erneut ein todesopfer gefordert eine ueber 70 jahre alte frau aus cuxhaven sei am freitagmorgen in einem bremer krankenhaus an hus dem haemolytisch uraemischen syndrom gestorben sagte ein sprecher des niedersaechsischen gesundheitsministeriums am freitag in hannover die infektion sei bei der frau bereits labordiagnostisch nachgewiesen zudem habe sich der tod einer 41 jaehrigen vom vergangenen mittwoch auf ehec zurueckfuehren lassen die frau stammte ebenfalls aus cuxhaven damit ist die zahl der bestaetigten todesfaelle durch den gefaehrlichen darmkeim ehec in deutschland auf fuenf gestiegen nach angaben des robert koch instituts rki sind von donnerstag auf freitag etwa 60 neue hus faelle gemeldet worden die gesundheitsbehoerden in kopenhagen und stockholm teilten mit in daenemark und schweden seien bisher 32 ehec faelle nachgewiesen worden alle betroffenen seien zuvor in deutschland auf reisen gewesen das aggressive bakterium ehec treibt seit mitte mai in deutschland sein unwesen das hus ist eine schwere verlaufsform bei der giftige stoffwechselprodukte des bakteriums zu nierenschaeden fuehren koennen auf der suche nach einer quelle fuer den erreger waren experten am donnerstag bei gurken aus spanien fuendig geworden +Wirtschaft de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-204736 url-pagepartsplitname-204736 url-lastpartpagename-html italiens schattenwirtschaft blueht in rom beginnt in diesen tagen die parlamentarische diskussion ueber das sparpaket das vergangene woche verabschiedet wurde darin werden in erster linie die aermeren zur kasse gebeten ein wichtiger wirtschaftszweig bleibt vollkommen ungeschoren +Wirtschaft de-DE url-pathpart-wirtschaft url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,785498,00 url-pagepartsplitname-0,1518,785498,00 url-lastpartpagename-html#ref=rss krise in griechenland die wirtschaftsaussichten fuer griechenland sind offenbar noch schlimmer als bislang angenommen +Wirtschaft de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-206132 url-pagepartsplitname-206132 url-lastpartpagename-html auf wackligen fuessen die sogenannte laenderklausel im gesetzentwurf zur abscheidung und speicherung von co2 bietet nach einem gutachten keine ausreichende rechtssicherheit auf der zielgeraden des bereits im bundestag verabschiedeten gesetzentwurfes zur speicherung und lagerung von kohlendioxid co2 haben sich am dienstag in kiel noch einmal die umweltverbaende von greenpeace und bund zu wort gemeldet und die sogenannte laenderklausel als ein womoeglich unsicheres mittel zur verhinderung der co2 verpressung bezeichnet diese biete juristische angriffsflaechen zudem gebe es ausserhalb der zwoelf seemeilen umfassenden aussenwirtschaftszone in der nordsee ohnehin keinen zugriff fuer eine laenderhoheit beide organisationen stellten ein entsprechendes rechtsgutachten der anwaeltin roda verheyen aus hamburg vor in dessen schlussfolgerung steht die forderung speziell an die beiden schwarz gelben landesregierungen von schleswig holstein und niedersachsen am 23 september im bundesrat gegen das ausgearbeitete ccs carbon capture and storage gesetz zu stimmen weil es den einzelnen laendern nur eine truegerische sicherheit biete dass es nicht doch zur erprobung oder anwendung der speichertechnologie komme greenpeace energieexpertin anike peters spricht in diesem zusammenhang von einem faulen deal die bund klimaexpertin tina loeffelsend nennt es eine beruhigungspille die der bevoelkerung verabreicht werde bereits 2017 erfahre das gesetz eine evaluierung und damit wahrscheinlich eine novellierung prophezeit die anwaeltin verheyen tamara zieschang staatssekretaerin aus dem schleswig holsteinischen wirtschaftsministerium hatte kuerzlich auf einer versammlung der buergerinitiative gegen co2 speicherung in nordfriesland bekraeftigt dass es mit der laenderklausel gelingen werde die im hohen norden auf breite ablehnung stossenden plaene zu verhindern insbesondere sorgen sich landwirte und trinkwasserverbaende die sich von vornherein nicht auf moegliche gefahren einlassen wollen und mit den zwischen und endlagerunzulaenglichkeiten rund um den atommuell in der asse und gorleben genuegend anschauungsunterricht geliefert bekommen abgesehen von der sicherheitsphilosophie steht das gesetz und hier besonders die laenderklausel aus sicht der ccs gegner auch rechtlich auf wackeligen fuessen es handele sich geradezu um eine arbeitsbeschaffungsmassnahme fuer juristen so verheyen die sich nicht vorstellen kann dass energiekonzerne sich gaenzlich von ihren ccs vorhaben abbringen lassen erst recht nicht vor dem hintergrund von 21 geplanten oder noch in bau befindlichen kohlekraftwerken und der wende in der energiepolitik dass bundesrechtliche kompetenz in solch einem politikfeld nun ausgerechnet auf die laenderebene heruntergereicht werde stelle ein novum dar betont verheyen eine gesetzliche verankerung des sankt florians prinzips und damit eine ungleichgewichtung einer lastenteilung sei unter umstaenden verfassungsrechtlich angreifbar fuehrt verheyen aus da mit der laenderklausel weder co2 pipelines und transportwege noch die abscheidung selbst verhindert werden sei die vermeintliche teilblockade die womoeglich gerichtlich wieder kassiert werden koenne irrefuehrend klueger sei zur vorgeschriebenen umsetzung der eu richtlinie ein verbotsgesetz wie es oesterreich bereits verabschiedet hat versichert loeffelsend um das zu erreichen kuendigte schleswig holsteins bund landesvorsitzende sybille macht baumgarten an der oertliche protest in form von montagsdemonstrationen werde nicht nachlassen ccs carbon capture and storage steht fuer die technologie der co2 abscheidung und speicherung im juli hatte der bundestag einen gesetzentwurf verabschiedet der diese technologie zu forschungszwecken erlaubt das gesetz geht auf eine eu richtlinie zurueck +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-strengerer url-pathpart-stresstest url-pathpart-fuer url-pathpart-banken url-pathpart-459120 url-domainname-www.wiwo.de url-domainprefix-www url-domainprefix-www.wiwo url-domaintype-de url-domainsuffix-wiwo.de strengerer stresstest fuer banken die neue eu bankenaufsicht eba will die finanzinstitute strengeren stresstests unterwerfen die kriterien des verschaerften verfahrens sind bislang offen doch immerhin steht jetzt der zeitplan fest fuer den 11 maerz hat die bundesbank die wichtigen deutschen banken vorgeladen um ueber die details des wieder bevorstehenden stresstests zu sprechen das erwaehnte wolfgang kirsch vorstandsvorsitzender der genossenschaftlich organisierten dz bank anlaesslich der bilanzpressekonferenz seines hauses in frankfurt kirsch vermutet dass die neue europaeische bankenaufsichtsbehoerde eba die anforderungen an die institute hochschrauben koennte laut eba chef andrea enria sieht es tatsaechlich danach aus wir muessen aus der vergangenheit lernen und zu einer strengeren und serioeseren ueberpruefung kommen sagte enria der nachrichtenagentur reuters mit der vergangenheit spielt der bankenaufseher auf den ersten europaeischen stresstest an der im vergangenen jahr stattfand damals waren nur sieben der 91 getesteten institute durchgefallen darunter die verstaatlichte deutsche immobilienbank hypo real estate irische banken dagegen die mit irland den zweiten eu mitgliedstaat nach griechenland in die krise gestuerzt hatten bestanden den test dieses manko will die seit januar 2011 fuer die europaeische bankenaufsicht zustaendige eba beim nun bevorstehenden zweiten testlauf beseitigen aufgabe der eba ist in kooperation mit nationalen kontrollbehoerden wie der bundesbank oder der bundesanstalt fuer finanzdienstleistungsaufsicht bafin fuer stabile finanzmaerkte zu sorgen die eba will ausserdem die finanzmarktregeln in der europaeischen union harmonisieren um gleiche bedingungen fuer alle europaeischen institute zu schaffen wie bereits im vergangenen jahr simulieren die kontrolleure im rahmen des stresstests ein wirtschaftliches negativszenario das die europaeische zentralbank entwickelt hat die simulation soll zeigen ob europas wichtigste banken fit genug sind um finanzschocks wie fallende immobilienpreise oder explodierende zinsen fuer staatsanleihen zu ueberstehen ziel ist zu beurteilen wie krisenresistent der finanzsektor ist erst am 18 maerz wird bekannt gegeben wie viele und welche finanzinstitute ueberprueft werden auch will die eba erst im april bekannt geben wie die testbedingungen genau aussehen doch schon morgen wollen die aufseher laut enria diese informationen an die fuer den stresstest ausgewaehlten banken weiterleiten das soll den betroffenen instituten die moeglichkeit fuer ein kritisches feedback geben im juni will die eba das ergebnis des stresstests bekannt geben strittig ist in welcher form die oeffentlichkeit und die spieler an den finanzmaerkten darueber zu informieren sind wie einzelne institute abgeschnitten haben der genossenschaftsbanker wolfgang kirsch bevorzugt eine regulierung im stillen denn schlechte testergebnisse duerften zur folge haben dass bedrohte banken keine privaten kapitalgeber mehr finden +Wirtschaft de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-207623 url-pagepartsplitname-207623 url-lastpartpagename-html boeings albtraum ist ausgeliefert irgendwie ist man geneigt die maschine mit einem trabant zu vergleichen erstens weil das ddr auto auch zum gutteil aus verbundwerkstoffen bestand und daher sehr leicht war zweitens weil kunden ewig und drei tage auf die auslieferung ihres traums warten mussten doch nun wird der erste der 55 von ana bestellten 787 langstreckenjets richtung japan abheben mit rund dreieinhalbjaehriger verspaetung im november wird die 787 zunaechst auf ana inlandslinien eingesetzt im dezember folgt dann die verbindung tokio peking bevor ana dann ab januar mit der 787 zwischen tokio haneda und frankfurt am main pendelt insgesamt sind derzeit 820 dreamliner deren rumpf und tragflaechen zum grossteil aus kohlefaserwerkstoff bestehen in boeings orderbuechern vermerkt das ist ein stattlicher auftrag die airlines erhoffen sich einen effektivitaetsschub von der maschine dass der typ so spaet kommt liegt unter anderem daran dass die produktion zum grossen teil ins ausland verlagert wurde gut ein drittel der bauteile des modells kommt aus japan von den zulieferfirmen mitsubishi kawasaki und juji heavy industries das boeing management war nicht in der lage die herstellung zu koordinieren und dabei technische schwierigkeiten die sich bei tests herausgestellt haben zu beheben die ersten drei exemplare musste der hersteller wegen unverkaeuflichkeit abschreiben so wurden aus veranschlagten sechs milliarden dollar entwicklungskosten rund 15 milliarden dollar und der dreamliner zum teuersten zivilflugzeugprogramm aller zeiten also zum albtraum der konzernbosse boeing dementiert nicht dass man erst um die tausend jets verkaufen muss bevor man in die gewinnzone fliegen kann auch bei der modernisierung ihres jumbos 747 hat boeing bislang nicht viel glueck die us frachtflug gesellschaft air atlas hat drei ihrer urspruenglich zwoelf georderten maschinen abbestellt als gruende werden mangelnde termintreue sowie leistungserwaegungen geltend gemacht unlaengst hatte die cargolux gesellschaft boeing duepiert weil sie die uebergabezeremonie platzen liess wegen technischer probleme hatte sich die erstauslieferung des neuen jumbos immer wieder verschoben man liegt rund zwei jahre hinter dem urspruenglichen zeitplan zurueck was die zuverlaessigkeit des 787 traum typs betrifft so kann lufthansa einiges dazu beitragen der technik betrieb der deutsche airline uebernimmt fuer einen weiteren japanischen 787 kunden die japan airlines wartung und service +Gesundheit de-DE url-pathpart-c url-pathpart-32201 url-pathpart-f url-pathpart-423986 url-pathpart-s url-pathpart-144fc263 url-pathpart-l url-pathpart-0L0Saerztezeitung0Bde0Cmedizin0Ckrankheiten0Cdiabetes0Carticle0C650A7360Ctyp0E20Ediabetes0Easthma0Erisiko0Everdoppelt0Bhtml url-domainname-rss.feedsportal.com url-domainprefix-rss url-domainprefix-rss.feedsportal url-domaintype-com url-domainsuffix-feedsportal.com url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm bei typ 2 diabetes ist das asthma risiko verdoppelt neu isenburg ikr es lohnt sich offenbar nicht nur bei asthmatikern verstaerkt auf hinweise fuer diabetes zu achten umgekehrt ist es auch wichtig bei typ 2 diabetikern das erhoehte asthmarisiko im blick zu haben denn dieses ist aktuellen studiendaten zufolge bei typ 2 diabetikern praktisch verdoppelt erst vor kurzem hat eine us amerikanische studie mit rund 2400 asthma patienten und 4 800 kontrollpersonen ohne die chronisch obstruktive atemwegserkrankung ergeben +Gesundheit de-DE url-pathpart-c url-pathpart-32191 url-pathpart-f url-pathpart-443314 url-pathpart-s url-pathpart-144f4210 url-pathpart-l url-pathpart-0L0Sfocus0Bde0Cgesundheit0Cratgeber0Csexualitaet0Cnews0Cattraktivitaet0Ewie0Emaenner0Efrauen0Eum0Eden0Efinger0Ewickeln0Iaid0I6198990Bhtml url-domainname-rss2.focus.de url-domainprefix-rss2 url-domainprefix-rss2.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm attraktivitaet wie maenner frauen um den finger wickeln das laengenverhaeltnis von zeige und ringfinger eines mannes ist aussagekraeftig +Gesundheit de-DE url-pathpart-c url-pathpart-32201 url-pathpart-f url-pathpart-423986 url-pathpart-s url-pathpart-144c9d77 url-pathpart-l url-pathpart-0L0Saerztezeitung0Bde0Cpraxis0Iwirtschaft0Cpersonalfuehurng0Carticle0C650A740A0Cdeutsche0Ekein0Eproblem0Eteilzeit0Echefinnen0Bhtml url-domainname-rss.feedsportal.com url-domainprefix-rss url-domainprefix-rss.feedsportal url-domaintype-com url-domainsuffix-feedsportal.com url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm deutsche haben kein problem mit teilzeit chefinnen muenchen reh gut drei viertel der deutschen koennen sich vorstellen unter einer vorgesetzten mit teilzeitvertrag zu arbeiten das zeigt eine repraesentative online umfrage unter 1000 buergern der unternehmensberatung rochus mummert die angst vieler unternehmen dass teilzeit chefinnen autoritaetsprobleme drohten sei also unbegruendet so das beratungsunternehmen noch sei aber nicht einmal jede vierte fuehrungsposition im mittleren management mit einer frau besetzt dabei haetten frauen als leitende teilzeitangestellte die chance nicht nur beruf und familie sondern auch karriere und familie miteinander zu verbinden das fachliche und persoenliche wissen eine fuehrungsposition zu uebernehmen trauen die bundesbuerger den frauen laut der umfrage allemal zu fuer zwei von drei befragten macht es keinen unterschied ob sie von einer frau oder einem mann gefuehrt werden unternehmen die fuer qualifizierte frauen als arbeitgeber attraktiv sein moechten sollten sich beeilen fuehrungskultur und fuehrungsprozesse auf teilzeitmodelle auszurichten sagt bernhard walter senior berater bei rochus mummert dabei geht es nicht um die erfuellung wie und von wem auch immer berechneter frauenquoten sondern um das ureigene interesse der firmen im kampf um die besten koepfe auch auf alle koepfe zugreifen zu koennen die definition von arbeitgeberattraktivitaet hoert in diesem zusammenhang eben nicht beim betriebskindergarten auf sondern umfasst genauso das aufzeigen klarer karriereperspektiven +Gesundheit de-DE url-pathpart-news url-domainname-www.n24.de url-domainprefix-www url-domainprefix-www.n24 url-domaintype-de url-domainsuffix-n24.de url-firstpartpagename-newsitem_7180047 url-pagepartsplitname-newsitem url-pagepartsplitname-7180047 url-lastpartpagename-html fernsehen als einschlafhilfe wer unter schlafstoerungen leidet laesst kaum etwas unversucht um abends besser zur ruhe zu kommen wie eine repraesentative umfrage im auftrag des gesundheitsmagazins apotheken umschau herausfand ist die gaengigste methode der betroffenen das schlichte abwarten +Gesundheit de-DE url-pathpart-politik url-pathpart-gesellschaft url-pathpart-berufspolitik url-pathpart-article url-pathpart-672701 url-domainname-www.aerztezeitung.de url-domainprefix-www url-domainprefix-www.aerztezeitung url-domaintype-de url-domainsuffix-aerztezeitung.de url-firstpartpagename-kbv-chef-koehler-fuerchtet-blockade-spezialaerztlichen-versorgung url-pagepartsplitname-kbv url-pagepartsplitname-chef url-pagepartsplitname-koehler url-pagepartsplitname-fuerchtet url-pagepartsplitname-blockade url-pagepartsplitname-spezialaerztlichen url-pagepartsplitname-versorgung url-lastpartpagename-html kbv chef koehler fuerchtet blockade der spezialaerztlichen versorgung das versorgungsgesetz eroeffnet kven viele handlungsmoeglichkeiten eindringlich mahnt kbv chef dr andreas koehler jetzt zu liefern sein vorstandskollege dr carl heinz mueller fordert erneut die abschaffung der richtgroessen regresse berlin im vorfeld der parlamentarischen beratungen des gkv versorgungsstrukturgesetzes hat kbv chef andreas koehler am freitag bei der internen vertreterversammlung seiner organisation die kven ermahnt die chancen dieses gesetzes zu nutzen diese regierung beschert uns ein liberales gesetz es schafft neue instrumente aber wir muessen sie auch nutzen wollen sagte koehler bereits fuer oktober kuendigte er ein neues gesamtkonzept fuer die bedarfsplanung an hier liegt der ball klar im feld der aerzteschaft die freiheiten die die kven bei der bedarfsplanung erhalten bedeuteten auch gewohnheiten auf den pruefstand zu stellen die ermittlung von verhaeltniszahlen je landkreis oder kreisfreier stadt auf der grundlage der bedarfsverteilung von 1990 sei nicht mehr zeitgemaess je nach fachgruppe muessten differenzierte bedarfsplanungsregionen jenseits von land und stadtkreisen gefunden werden entschieden werden muesse die frage ob auch die ausschliesslich auftragnehmenden fachaerzte in die bedarfsplanung einbezogen werden sollen ein besonderes problem fuer die bedarfsplanung koennten die psychotherapeuten werden angesichts der demografischen entwicklung muesse die zahl der notwendigen sitze dramatisch erhoeht werden das werde aber nur funktionieren wenn die psychotherapie ausserhalb der morbiditaetsbedingten gesamtverguetung finanziert werde diese fachgruppe sei ein gutes beispiel dafuer dass eine am tatsaechlichen versorgungsbedarf orientierte planung sinnvoll sei um wartezeiten auf einen therapieplatz zu verkuerzen koehler sorgt sich um realisierung der spezialaerztlichen versorgung mit sorge sieht koehler dass aufgrund der intervention der laender die spezialaerztliche versorgung nicht realisiert wird zwar seien erhebliche korrekturen am entwurf von paragraf 116 b noetig +Gesundheit de-DE url-pathpart-medizin url-pathpart-krankheiten url-pathpart-demenz url-pathpart-article url-pathpart-673819 url-domainname-www.aerztezeitung.de url-domainprefix-www url-domainprefix-www.aerztezeitung url-domaintype-de url-domainsuffix-aerztezeitung.de url-firstpartpagename-wenn-menschen-teuren-anzug-stundenlang-duschen url-pagepartsplitname-wenn url-pagepartsplitname-menschen url-pagepartsplitname-teuren url-pagepartsplitname-anzug url-pagepartsplitname-stundenlang url-pagepartsplitname-duschen url-lastpartpagename-html wenn menschen im teuren anzug stundenlang duschen ein mann in anzug unter der dusche +Gesundheit de-DE url-pathpart-politik url-pathpart-gesellschaft url-pathpart-article url-pathpart-673507 url-domainname-www.aerztezeitung.de url-domainprefix-www url-domainprefix-www.aerztezeitung url-domaintype-de url-domainsuffix-aerztezeitung.de url-firstpartpagename-spd-setzt-haeusliche-pflege-rund-uhr url-pagepartsplitname-spd url-pagepartsplitname-setzt url-pagepartsplitname-haeusliche url-pagepartsplitname-pflege url-pagepartsplitname-rund url-pagepartsplitname-uhr url-lastpartpagename-html spd setzt auf haeusliche pflege rund um die uhr die spd bundestagsfraktion hat eine pflege wunschliste erarbeitet +Gesundheit de-DE url-pathpart-medizin url-pathpart-krankheiten url-pathpart-neuro url-pathpart-psychiatrische url-pathpart-krankheiten url-pathpart-schlafstoerungen url-pathpart-article url-pathpart-672538 url-domainname-www.aerztezeitung.de url-domainprefix-www url-domainprefix-www.aerztezeitung url-domaintype-de url-domainsuffix-aerztezeitung.de url-firstpartpagename-dopamin-agonisten-bringen-quaelend-rastlose-beine-ruhe url-pagepartsplitname-dopamin url-pagepartsplitname-agonisten url-pagepartsplitname-bringen url-pagepartsplitname-quaelend url-pagepartsplitname-rastlose url-pagepartsplitname-beine url-pagepartsplitname-ruhe url-lastpartpagename-html dopamin agonisten bringen quaelend rastlose beine zur ruhe das restless legs syndrom rls laesst sich mit dopaminergen arzneien inzwischen gut behandeln auch eine augmentation ist weitgehend vermeidbar allerdings wird es immer noch zu selten erkannt wiesbaden es zieht kribbelt und brennt in den beinen man findet kaum noch schlaf +Deutschland de-DE url-pathpart-c url-pathpart-33356 url-pathpart-f url-pathpart-566375 url-pathpart-s url-pathpart-1782004b url-pathpart-l url-pathpart-0L0Stagesspiegel0Bde0Cberlin0Cpolizei0Ejustiz0Ckinderwagen0Ebrandstiftungen0Everdaechtiger0Efestgenommen0C451520A80Bhtml url-domainname-tagesspiegel.feedsportal.com url-domainprefix-tagesspiegel url-domainprefix-tagesspiegel.feedsportal url-domaintype-com url-domainsuffix-feedsportal.com url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm kinderwagen brandstiftungen update in prenzlauer berg hat die polizei am fruehen freitagmorgen einen 29 jaehrigen festgenommen er soll in einem wohnhaus in der winsstrasse zwei kinderwagen in brand gesteckt haben wenn sie diese felder durch einen klick aktivieren werden informationen an facebook twitter oder google in die usa uebertragen und unter umstaenden auch dort gespeichert bei dem festgenommenen handele es sich um einen zeitungsaustraeger aus neukoelln teilte die polizei mit der 29 jaehrige hatte bereits die aufmerksamkeit der ermittler auf sich gezogen und wurde deshalb in der vergangenen nacht beobachtet nachdem er seine zeitungslieferung entgegengenommen hatte laut polizeiangaben folgten ihm zivilpolizisten waehrend er seine route durch den kiez absolvierte jeder hausflur wurde von den zivilpolizisten kontrolliert in einem haus in der winsstrasse hielt sich der beobachtete laengere zeit auf nachdem er das gebaeude wieder verlassen hatte und in die heinrich roller strasse abgebogen war entdeckten die beamten die brennenden kinderwagen informierten die kollegen und versuchten mit feuerloeschern den brand zu ersticken in der heinrich roller strasse klickten dann kurz darauf die handschellen der festgenommene hatte ein einwegfeuerzeug dabei er wurde nach einer erkennungsdienstlichen behandlung den ermittlern des zustaendigen brandkommissariates des landeskriminalamtes ueberstellt inwieweit der mann auch fuer brandlegungen an kinderwagen in der vergangenheit in frage kommt ist gegenstand der laufenden ermittlungen am nachmittag lief noch die vernehmung des mannes durch die ermittler vom lka spaeter soll entschieden werden ob ein haftbefehl beantragt wird fuer wie viele braende der 29 jaehrige insgesamt im verdacht steht wollte die polizei am freitag noch nicht sagen als zeitungszusteller hatte der mann zu dutzenden haeusern im bezirk zugang in der gegend hatte es immer wieder trotz verschlossener tueren gebrannt wie die ermittler auf den verdaechtigen aufmerksam wurden wollten sie aus ermittlungstaktischen gruenden nicht verraten sicher ist nur dass es die erste nacht war in der zivilpolizisten den verdaechtigen auf schritt und tritt ueberwacht und auch gleich ertappt haben haeufig verraten brandstifter sich selbst indem sie am tatort bleiben und vorgeben beim loeschen zu helfen oder sie kehren zurueck um sich ihr werk anzusehen die polizei ist daher speziell geschult auf verdaechtige schaulustige und besonders engagierte helfer zu achten inwieweit der mann auch fuer brandlegungen an kinderwagen in der vergangenheit in frage kommt ist gegenstand der laufenden ermittlungen in berlin kommt es seit monaten regelmaessig zu braenden in hausfluren nach polizeiangaben der polizei gab es zwischen januar und mai bereits 163 braende in hausfluren bei denen zum teil mieter rauchvergiftungen erlitten und hoher sachschaden entstand im vergleichszeitraum des vorjahres waren es insgesamt 144 brandstiftungen wenn sie diese felder durch einen klick aktivieren werden informationen an facebook twitter oder google in die usa uebertragen und unter umstaenden auch dort gespeichert +Deutschland de-DE url-pathpart-c url-pathpart-33356 url-pathpart-f url-pathpart-566375 url-pathpart-s url-pathpart-175ec8be url-pathpart-l url-pathpart-0L0Stagesspiegel0Bde0Cberlin0Cpolizei0Ejustiz0C580Ejaehriger0Edurch0Esprengsatz0Ein0Epark0Everletzt0C4498170A0Bhtml url-domainname-tagesspiegel.feedsportal.com url-domainprefix-tagesspiegel url-domainprefix-tagesspiegel.feedsportal url-domaintype-com url-domainsuffix-feedsportal.com url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm 58 jaehriger durch sprengsatz in park verletzt update bei der explosion eines sprengsatzes in einem park im wedding ist am sonntag ein 58 jaehriger verletzt worden im wedding wurden schon zuvor rohrbomben gefunden wenn sie diese felder durch einen klick aktivieren werden informationen an facebook twitter oder google in die usa uebertragen und unter umstaenden auch dort gespeichert ein spaziergaenger ist am sonntagnachmittag in wedding von einer bombe schwer verletzt worden die in einer plastiktuete versteckt war der 58 jaehrige aus dem gleichen bezirk hatte seinen hund im schillerpark nahe der edinburger strasse ausgefuehrt als er eine neben einer parkbank herumliegende plastiktuete aufheben wollte kam es zur explosion der mann erlitt schwere verletzungen im gesicht und an den beinen ersten erkenntnissen zufolge handelte es sich bei dem sprengsatz um eine rohrbombe ein aehnlicher fall bei dem aber niemand verletzt wurde ereignete sich bereits im mai dieses jahres gleichfalls in wedding die polizei sperrte den schillerpark ueber stunden komplett ab und durchsuchte ihn dabei wurde jedoch nichts gefaehrliches mehr gefunden erschwert war die spurensicherung durch starke regenfaelle der schwerverletzte wurde von einem notarztwagen ins weddinger virchowklinikum gebracht der mann schwebt nicht in lebensgefahr bei der such nach dem bombenbauer tappen die ermittler weiterhin im dunkeln hiess es am montag von einem polizeisprecher die polizei warnte am sonntagabend davor verdaechtige gegenstaende vor allem in tueten aufzuheben im verdachtsfalle solle die polizei alarmiert werden am sonntagabend suchten sprengstoffspuerhunde im schillerpark nach gegenstaenden die moeglicherweise mit in der plastiktuete lagen und durch die explosion weggeschleudert worden waren der fuer sprengstoffdelikte zustaendige staatsschutz bei der polizei hat die ermittlungen uebernommen die experten sehen einen zusammenhang mit einem aehnlichen vorfall im vergangenen mai am 26 mai war ebenfalls in wedding eine rohrbombe in einer plastiktuete gefunden worden eine passantin hatte den verdaechtigen und mit kabeln versehenen gegenstand an der boeschung des nordufers entdeckt und die polizei gerufen die beamten konnten die bombe damals entschaerfen am tag danach hatte das praesidium mitgeteilt dass die eigenkonstruktion sprengfaehig gewesen sei die explosionswirkung habe jedoch nur fuer die unmittelbare umgebung ausgereicht also fuer denjenigen der die selbstbaubombe hochhebt fuer die auf der anderen seite des spandauer schifffahrtskanals gelegene auslaenderbehoerde habe keine gefahr bestanden hiess es die in der linken szene umstrittene behoerde war damals als moegliches ziel genannt worden spaetestens seit dem anschlag im schillerpark ist zu vermuten dass die rohrbomben von einem taeter wahllos abgelegt werden denn in oder am schillerpark ist laut polizei kein politisches motiv zu erkennen offensichtlich hat der bombenbastler sogar seine faehigkeiten weiterentwickelt und perfektioniert auch in den jahren davor hatte es bereits mehrere rohrbombenalarme in wedding gegeben im juni 2007 und juni 2008 waren jeweils in gruenanlagen am dohnagestell reste von rohrbomben gefunden worden diese waren bereits zur explosion gebracht worden durch wen und wieso konnte die polizei nie ermitteln auch diese beiden fundorte liegen ganz in der naehe von jenen in diesem jahr ermittler des lka pruefen nun ob es sich moeglicherweise in all diesen faellen um den gleichen taeter handelt erleichtert wird dies weil die nicht detonierte bastelbombe vom nordufer quasi als vergleichsstueck dienen kann im november 2002 hatten zwei lehrlinge eine selbstgebaute rohrbombe auf einen bvg bus geworfen niemand wurde verletzt bei ihrer festnahme gestanden sie den sprengsatz in ihrer ausbildungswerkstatt hergestellt zu haben ein zusammenhang mit den jetzigen faellen gilt aber als unwahrscheinlich die beiden lehrlinge erhielten bewaehrungsstrafen von sechs und acht monaten wenn sie diese felder durch einen klick aktivieren werden informationen an facebook twitter oder google in die usa uebertragen und unter umstaenden auch dort gespeichert +Ausland de-DE url-pathpart-politik url-pathpart-ausland url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,780177,00 url-pagepartsplitname-0,1518,780177,00 url-lastpartpagename-html#ref=rss militaer chinas erster flugzeugtraeger hat seinen heimathafen dalian im nordosten des landes wieder erreicht nach fuenf tagen hat er die testfahrt im pazifik abschlossen der betrieb des in der ukraine gekauften 300 meter langen schiffs beunruhigt die nachbarlaender und die usa peking der erste chinesische flugzeugtraeger hat am sonntag eine fuenftaegige testfahrt abgeschlossen wie die amtliche nachrichtenagentur xinhua berichtete kehrte die warjag in die hafenstadt dalian im nordosten des landes zurueck ein kleiner teil des seegebiets vor dalian war bis zum abend fuer andere schiffe gesperrt die regierung in peking hatte 1998 der ukraine das stillgelegte schiff ohne motoren sowie waffen und navigationssysteme abgekauft und fuer eine generalueberholung in den hafen von dalian geschleppt seither wurde es umgeruestet nach chinesischen angaben soll der flugzeugtraeger forschungs und uebungszwecken dienen nachbarlaender beobachteten die testfahrt jedoch angesichts chinesischer seemachtsambitionen mit sorge +Ausland de-DE url-pathpart-US url-pathpart-Schuldenkrise url-pathpart-!75381 url-domainname-www.taz.de url-domainprefix-www url-domainprefix-www.taz url-domaintype-de url-domainsuffix-taz.de us schuldenkrise die republikaner verschieben eine abstimmung und die linke protestiert doch ueber obama sprechen nur wenige seine art zu verhandeln missfaellt vielen von dorothea hahn hoert auf die weisheit des heiligen wortes ruft welton gaddy am donnerstagmittag in eine runde aus linken demokratinnen gewerkschafterinnen und frauengruppen sie haben sich direkt vor dem kapitol in washington versammelt um im allerletzten moment zu verhindern dass die sozialversicherung und die beiden staatlichen krankenversicherungen fuer beduerftige gekuerzt werden auf ihren transparenten steht +Unterhaltung de-DE url-pathpart-vermischtes url-pathpart-article1797547 url-domainname-www.morgenpost.de url-domainprefix-www url-domainprefix-www.morgenpost url-domaintype-de url-domainsuffix-morgenpost.de url-firstpartpagename-Kerner-will-nicht-mehr-Kerner-machen url-pagepartsplitname-Kerner url-pagepartsplitname-will url-pagepartsplitname-nicht url-pagepartsplitname-mehr url-pagepartsplitname-Kerner url-pagepartsplitname-machen url-lastpartpagename-html sat 1 zuerst hat er getraeumt dann hat er gebangt schliesslich wieder gehofft doch nun hat johannes b kerner seinen mitarbeitern am dienstag verkuendet dass er zum jahresende sein magazin kerner bei sat 1 beenden werde ja es stimmt johannes b kerner wird am 15 dezember in form eines jahresrueckblicks zum letzten mal sein magazin praesentieren sagte eine sprecherin des muenchner privatsenders mit grossen erwartungen war der damals 44 jaehrige hoffnungstraeger der frueher schon bei sat 1 aktiv war im jahr 2009 vom zdf zu seinem alten sender gewechselt mit ihm wuerden auch die vielen stamm zuschauer die vorher sein mehrfach die woche ausgestrahltes magazin im zdf gesehen hatten abwandern hatte der gebuertige bonner insgeheim gedacht doch die spekulationen erfuellten sich nicht der zdf zuschauer wechselt nicht einfach zu sat 1 auch nicht wegen kerner nach seinem start am montagabend fuhr die sendung quoten im einstelligen marktanteilsbereich ein und das beim fuer sat 1 so wichtigen publikum zwischen 14 und 49 jahren zu wenig fuer einen kommerziell arbeitenden programmveranstalter so bekam kerners magazin am donnerstag eine neue chance denn der moderator war ein zu wertvolles gesamtgut fuer den sender um ihn sofort aus dem programm zu verbannen als tv produzent und fussballexperte mit vielen kontakten in die sportbranche spielt er im fernsehen eine gewichtige rolle daran aenderte auch der geschaeftsfuehrerwechsel bei sat 1 nichts guido bolten der kerner 2009 noch verpflichtet hatte wurde anfang 2010 von andreas bartl abgeloest auf dem neuen sendeplatz donnerstagabends meist um 22 15 uhr erholte sich die sendung allmaehlich die marktanteile stiessen in den unteren zweistelligen marktanteilsbereich doch vor wenigen wochen verkuendete der moderator im branchendienst dwdl de vorsichtshalber schon mal +Unterhaltung de-DE url-pathpart-aktuelles url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-aura-dione-nackt-neuem-albumcover-1432280 url-pagepartsplitname-aura url-pagepartsplitname-dione url-pagepartsplitname-nackt url-pagepartsplitname-neuem url-pagepartsplitname-albumcover url-pagepartsplitname-1432280 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss aura dione nuernberg so hatte sich monika gruber ihren ersten auftritt bei wetten dass sicher nicht vorgestellt die kabarettistin wurde bei der samstagabend show opfer einer technsichen panne das war passiert +Unterhaltung de-DE url-pathpart-kultur url-pathpart-article1777949 url-domainname-www.morgenpost.de url-domainprefix-www url-domainprefix-www.morgenpost url-domaintype-de url-domainsuffix-morgenpost.de url-firstpartpagename-Roman-Polanski-fuer-Lebenswerk-geehrt url-pagepartsplitname-Roman url-pagepartsplitname-Polanski url-pagepartsplitname-fuer url-pagepartsplitname-Lebenswerk url-pagepartsplitname-geehrt url-lastpartpagename-html filmfestival kult regisseur roman polanski hat beim zurich film festival den preis fuer sein lebenswerk entgegengenommen zwei jahre spaeter als geplant zwei jahre spaeter als geplant hat der polnisch franzoesische starregisseur roman polanski am dienstagabend in zuerich den preis fuer sein lebenswerk entgegengenommen die auszeichnung war ihm vom zurich film festival bereits 2009 zugesprochen worden doch als er vor zwei jahren am 26 september in die schweiz einreisen wollte wurde er in zuerich verhaftet grund war ein internationaler haftbefehl der usa diese forderten die auslieferung polanskis weil der regisseur 1977 eine minderjaehrige missbraucht haben soll polanski wurde in seinem chalet in gstaad unter hausarrest gestellt im juli 2010 wurde er freigelassen die schweiz lehnte seine auslieferung ab die behoerden hatten zweifel an der darstellung des sachverhalts durch die usa die us behoerden legen dem polnisch franzoesischen oscarpreistraeger zur last 1977 eine 13 jaehrige vergewaltigt zu haben polanski hatte seinerzeit eingeraeumt das maedchen mit champagner und drogen verfuehrt zu haben als ihm aber seiner ansicht nach absprachewidrig eine laengere haftstrafe drohte floh er 1978 aus den usa und kehrte seither nie wieder zurueck mit zwei jahren verspaetung sollte der 78 jaehrige nun am dienstagabend das goldene auge des zuercher filmfestivals entgegennehmen besser spaet als nie sagte er in einem interview mit dem franzoesischsprachigen schweizer fernsehen er sei nach wie vor sehr gerne in der schweiz die festivalleitung hatte sich ueber die zusage polanskis sehr gefreut wir sind sehr stolz und geehrt roman polanski nun endlich in zuerich empfangen zu koennen teilte sie mit auch den oscar mit dem er 2003 fuer der pianist als bester regisseur ausgezeichnet wurde wagte er aus angst vor verhaftung nicht selbst entgegenzunehmen als sein film der ghostwriter auf der berlinale 2010 uraufgefuehrt wurde sass er noch in gstaad im hausarrest zur premiere von der gott des gemetzels in venedig reiste er nicht an an seinem wohnsitz paris war er als franzoesischer staatsbuerger vor einer auslieferung sicher polanski schuf bis zu seinem 35 lebensjahr bereits vier filme die ihm allesamt hoechste internationale anerkennung einbrachten und klassiker der leinwand sind danach ueberwand er berufliche wie auch private tiefschlaege und errang 2003 mit dem oscar fuer das holocaust drama der pianist seinen groessten triumph es war der spaete doch laengst ueberfaellige hoehepunkt einer karriere die polanski einen herausragenden platz in der filmgeschichte sichert +Unterhaltung de-DE url-pathpart-nachrichten url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-kurt-kroemer-darum-brauche-keinen-fuehrerschein-1456312 url-pagepartsplitname-kurt url-pagepartsplitname-kroemer url-pagepartsplitname-darum url-pagepartsplitname-brauche url-pagepartsplitname-keinen url-pagepartsplitname-fuehrerschein url-pagepartsplitname-1456312 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss kurt kroemer der komiker kurt kroemer hat keine lust auto zu fahren kurt kroemer hat keinen fuehrerschein sagte der 36 jaehrige der nachrichtenagentur dpa ich vermisse ihn auch nicht wird er bei freunden und bekannten im auto mitgenommen werde fast immer geflucht immer da wo man gerade auto fahren will ist stau sagte kroemer da laufe ich lieber vor seinen auftritten gehe er in der stadt in der gastiere ausgiebig spazieren da sehe und erlebe ich die tollsten sachen sagte kroemer diese kommen dann auf die buehne die geschichten von der strasse sind meist die groessten brueller sagte er vor dem start seiner deutschlandtournee am freitag in magdeburg +Unterhaltung de-DE url-pathpart-nachrichten url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-keine-strafe-skandal-rocker-pete-doherty-1430824 url-pagepartsplitname-keine url-pagepartsplitname-strafe url-pagepartsplitname-skandal url-pagepartsplitname-rocker url-pagepartsplitname-pete url-pagepartsplitname-doherty url-pagepartsplitname-1430824 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss keine strafe fuer skandal rocker pete doherty nuernberg so hatte sich monika gruber ihren ersten auftritt bei wetten dass sicher nicht vorgestellt die kabarettistin wurde bei der samstagabend show opfer einer technsichen panne das war passiert +Sport de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-204208 url-pagepartsplitname-204208 url-lastpartpagename-html baldriantropfen fuer den calcio nicht der gesamte italienische fussball ist korrupt es handelt sich nur um einzelne schwarze schafe in der kickerherde zu dieser besaenftigenden schlussfolgerung verleitet der urteilsspruch der ersten instanz der disziplinarkommission des italienischen fussballverbandes figc sie bestaetigte am dienstag weitgehend die strafen die der anklaeger stefano palazzi zuvor gefordert hatte zur debatte stand allerdings nur ein kleiner teil der zwischenzeitlich von staatsanwaelten wettanbietern und medien als verdaechtig erachteten spiele danach wurden die wichtigsten drahtzieher der spielabsprachen und wettbetruegereien zu fuenf jahren sperre und einem folgenden lebenslangen betaetigungsverbot in allen der figc angeschlossenen ligen verurteilt dies betrifft u a den ex nationalspieler giuseppe signori den die staatsanwaelte aus cremona fuer den kopf der sogenannten bologneser gruppe halten zur gleichen strafe wurden der ex profi antonio bellavista der sportdirektor des drittligisten ravenna calcio giorgio buffone und der wettbuerobetreiber massimo erodiani verurteilt von noch aktiven profis traf es den zweitligaspieler vincenzo sommese ascoli sowie die drittliga akteure carlo gervasoni cremona und marco paoloni cremona und benevento deren machenschaften loesten den anfangsverdacht der staatsanwaltschaft cremona aus in der serie a wurden nur der kapitaen von aufsteiger atalanta bergamo cristiano doni 3 jahre 6 monate und dessen mannschaftsgefaehrte thomas manfredini 3 jahre belangt beide waren von ihrem verein bereits bei einem freundschaftsspiel am wochenende nicht mehr beruecksichtigt worden nicht deshalb sondern wegen einer urspruenglich fehlerhaften addierung wurde atalanta vom gericht mit einem minuspunkt weniger belegt statt mit geforderten minus sieben startet der aufsteiger nun mit minus sechs punkten in die am 27 august beginnende saison figc anklaeger palazzi vergab zwei minuspunkte pro anklagepunkt fuer vereinsangehoerige und einen zusatzpunkt bei besonderer schwere des vergehens andere vereine konnten sich ueber eine noch gewichtigere strafverkuerzung freuen drittligist benevento geht nur mit neun statt 14 minuspunkten in die neue saison cremoneses handicap betraegt sechs statt neun punkte bei zweitligist ascoli blieb es bei den geforderten sechs punkten abzug die drittligisten alessandria und ravenna muessen zwangsweise absteigen die urteile sind allerdings noch nicht endgueltig fuer kommenden dienstag ist die verhandlung der zweiten instanz geplant giuseppe signori kuendigte bereits berufung an ebenso die anwaelte von atalanta bergamo und us cremonese prozessbeobachter gehen von einem aehnlichen szenario wie bei der aufarbeitung des schiedsrichterbestechungsskandals im jahre 2006 aus dort wurden die strafen von instanz zu instanz milder einsicht in schuldhaftes verhalten ist im italienischen fussball nicht sonderlich verbreitet wie schon 2006 beklagten auch die aktuellen richter eine omerta ein schweigegeluebde im fussballmilieu das eine aufklaerung erschwere dass der gesamte sumpf nicht trockengelegt wurde zeigt sich indes daran dass die disziplinarkammer nur ueber jene 18 spiele befand die die staatsanwaltschaft cremona in einer ersten phase im visier hatte bei mindestens 30 spielen der italienischen ligen hatten wettanbieter jedoch unregelmaessigkeiten festgestellt das verfahren dient damit eher der beruhigung anstatt der aufklaerung +Sport de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-199706 url-pagepartsplitname-199706 url-lastpartpagename-html fussball pur aber professioneller vor rund zwei wochen hat thomas bastian beim finanziell krisengeschuettelten fussballklub sv babelsberg 03 die nachfolge des zurueckgetretenen praesidenten rainer sperr uebernommen ueber die immer noch angespannte situation und die schwierige aufgabe den verein zu stabilisieren sprach mit dem 51 jaehrigen kino inhaber der schon seit 2003 als vertreter der fans im aufsichtsrat sass peer wilhelms nd +Sport de-DE url-pathpart-sport url-pathpart-wintersport url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-eishockey-del-del-mannheim-und-eisbaeren-mit-muehevollen-siegen_aid_677052 url-pagepartsplitname-eishockey url-pagepartsplitname-del url-pagepartsplitname-del url-pagepartsplitname-mannheim url-pagepartsplitname-und url-pagepartsplitname-eisbaeren url-pagepartsplitname-mit url-pagepartsplitname-muehevollen url-pagepartsplitname-siegen url-pagepartsplitname-aid url-pagepartsplitname-677052 url-lastpartpagename-html eishockey del del spitzenreiter adler mannheim hat am 12 spieltag der deutschen eishockey liga die tabellenfuehrung durch ein muehevolles 4 +Sport de-DE url-pathpart-sport url-pathpart-fussball url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-dfl-bierwerbung-rauball-contra-zwanziger_aid_676706 url-pagepartsplitname-dfl url-pagepartsplitname-bierwerbung url-pagepartsplitname-rauball url-pagepartsplitname-contra url-pagepartsplitname-zwanziger url-pagepartsplitname-aid url-pagepartsplitname-676706 url-lastpartpagename-html dfl bierwerbung wenn der dfb beschliesst keine werbevertraege mit brauereien mehr abzuschliessen werden wir die dfl einen anderen weg gehen sagte rauball bei einem sport empfang der spd buergerschaftsfraktion im festsaal des hamburger rathauses zwanziger hatte die verhandlungen ueber eine vertragsverlaengerung mit dem nationalmannschaftssponsor bitburger ueber die euro 2012 hinaus gestoppt da der deutsche fussball bund dfb die neue aktion alkoholfrei sport geniessen des deutschen olympischen sportbundes dosb und der bundeszentrale fuer gesundheitliche aufklaerung bzga unterstuetzt hat zwanziger vorlaeufig sein veto gegen eine vertragsverlaengerung eingelegt wenn der verband zeitgleich mit seinem partner bitburger ueber eine vertragsverlaengerung verhandelt dann muss sehr genau ausgelotet werden ob und wie sich diese aktivitaet noch mit einer bierwerbung vertraegt sagte zwanziger leidtragende eines generellen alkoholwerbeverbots waere vor allem die bundesliga der rund 300 millionen euro verloren gingen wir muessen nicht paepstlicher sein als der papst sagte rauball am donnerstag +Sport de-DE url-pathpart-c url-pathpart-32191 url-pathpart-f url-pathpart-443319 url-pathpart-s url-pathpart-18d3c775 url-pathpart-l url-pathpart-0L0Sfocus0Bde0Csport0Cfussball0Cbundesliga10Cbundesliga0Ehsv0Eboss0Estevens0Everpflichtung0Enoch0Enicht0Efix0Iaid0I6685620Bhtml url-domainname-rss2.focus.de url-domainprefix-rss2 url-domainprefix-rss2.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm bundesliga hsv boss die chefetage des hsv will anfang kommender woche einen neuen trainer praesentieren hat aber eine bereits feststehende verpflichtung des niederlaenders huub stevens dementiert die chefetage des fussball bundesligisten hamburger sv will anfang kommender woche einen nachfolger fuer den entlassenen trainer michael oenning praesentieren hat aber eine bereits feststehende verpflichtung des niederlaenders huub stevens dementiert es gibt noch nichts zu vermelden es ist noch nichts fix sagte der hamburger vorstandsvorsitzende carl edgar jarchow nach dem ersten saisonsieg am freitagabend beim vfb stuttgart 2 +Sport de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-205901 url-pagepartsplitname-205901 url-lastpartpagename-html breite flotte duenne spitze fuer manche deutsche medienvertreter war die bis sonntag dauernde ruder wm im slowenischen bled schon am donnerstag vorbei da gewann der bedeutungsschwanger benamte deutschland achter sein 30 rennen und den dritten titel in serie das grossboot gern als flaggschiff des deutschen rudersports tituliert verdiente sich diese beim olympia debakel 2008 mit rang acht in peking verloren gegangene bezeichnung erst bei dieser wm wieder seit der olympiapleite hat das vom dortmunder ralf holtmeyer betreute prestigeobjekt kein rennen mehr verloren in der oeffentlichkeit wird der achter als synonym fuer den rudersport betrachtet und uebersehen dass er nur ein mosaikstein einer vielfaeltigen sportart ist in bled stehen 27 wettbewerbe auf dem programm 14 olympisch acht nichtolympisch und fuenf sogenannte adaptive events fuer behinderte von den 14 wiederum interessieren neben dem achter eventuell noch der einer marcel hacker und die doppelvierer natuerlich hat der achter jeden respekt verdient art und weise wie er unter regie des in wriezen geborenen steuermanns martin sauer die weltelite dominiert ist faszinierend gleichwohl stehen dem andere kaum nach beispiel +Sport de-DE url-pathpart-c url-pathpart-32191 url-pathpart-f url-pathpart-443319 url-pathpart-s url-pathpart-1835b8d7 url-pathpart-l url-pathpart-0L0Sfocus0Bde0Csport0Cmehrsport0Cmoderner0Efuenfkampf0Ewm0Efuenfkampf0Ewm0Edeutsche0Emaenner0Eim0Efinale0Echancenlos0Iaid0I6642680Bhtml url-domainname-rss2.focus.de url-domainprefix-rss2 url-domainprefix-rss2.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm moderner fuenfkampf wm fuenfkampf wm andrei moissejew hat sich bei der heim wm der modernen fuenfkaempfer in moskau die krone aufgesetzt das deutsche herren trio hatte hingegen mit der entscheidung nichts zu tun doppel olympiasieger delf borrmann berlin stefan koellner potsdam und alexander nobis berlin verpassten als 17 19 und 25 die top ten deutlich silber hinter dem ueberlegenen moissejew der 2004 in athen und 2008 in peking olympisches gold geholt hatte gewann sein russischer landsmann alexander lesun vor dem ungarn adam marosi weltmeister von 2009 +Sport de-DE url-pathpart-c url-pathpart-32191 url-pathpart-f url-pathpart-443319 url-pathpart-s url-pathpart-1782d53b url-pathpart-l url-pathpart-0L0Sfocus0Bde0Csport0Cfussball0Cbundesliga10Cbundesliga0Eschalke0Eentscheidung0Eim0Efall0Eral0Ebis0Ezum0Esonntag0Iaid0I6569510Bhtml url-domainname-rss2.focus.de url-domainprefix-rss2 url-domainprefix-rss2.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm bundesliga schalke ein klaerendes gespraech mit manager horst heldt werde noch vor dem spiel gegen mainz stattfinden sagte trainer ralf rangnick am freitag nach dem 0 +Sport de-DE url-pathpart-2011 url-pathpart-40 url-domainname-www.zeit.de url-domainprefix-www url-domainprefix-www.zeit url-domaintype-de url-domainsuffix-zeit.de url-firstpartpagename-Deutschlandkarte-Fussball url-pagepartsplitname-Deutschlandkarte url-pagepartsplitname-Fussball deutschlandkarte wer will kann belegen dass das interesse am frauenfussball seit der weltmeisterschaft im sommer enorm ja rasant gestiegen ist in der neuen bundesliga saison kamen zu den spielen des weiblichen fc bayern muenchen im schnitt 615 zuschauer statt 473 im vorigen jahr was einer steigerung von mehr als 30 prozent entspricht um die karte zu vergroessern klicken sie bitte hier andererseits verzeihung 615 zuschauer das schaffen die bayern maenner beim training der vergleich ist aber deswegen unfair weil die bayern frauen in der bundesliga nur mittelmass sind siebte von zwoelfen sind sie gerade die traditionell erfolgreichen frankfurterinnen duisburgerinnen und potsdamerinnen ziehen schon mehr zuschauer an es scheint zu helfen wenn es keine konkurrierenden erstliga maennermannschaft in der stadt gibt von einer sogwirkung durch die maenner ist also eher nicht auszugehen eine ausnahme ist der vfl wolfsburg vielleicht liegt es an dem was man dort am wochenende sonst so tun kann vielleicht ist es aber auch die emanzipierteste stadt des landes +Sport de-DE url-pathpart-sport url-pathpart-formel1 url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-formel-1-hamilton-schnappt-vettel-pole-position-weg_aid_674833 url-pagepartsplitname-formel url-pagepartsplitname-1 url-pagepartsplitname-hamilton url-pagepartsplitname-schnappt url-pagepartsplitname-vettel url-pagepartsplitname-pole url-pagepartsplitname-position url-pagepartsplitname-weg url-pagepartsplitname-aid url-pagepartsplitname-674833 url-lastpartpagename-html formel 1 hamilton schnappt vettel pole position weg mclaren pilot lewis hamilton hat sebastian vettel die pole position fuer den gp von suedkorea weggeschnappt vettel fehlten auf rang zwei etwas mehr als zwei zehntelsekunden jede serie endet einmal auch fuer sebastian vettel und sein red bull team das in suedkorea beim 16 rennen des jahres erstmals nicht die pole position holte in einem wieder einmal erneut spannenden qualifying stoppte der brite lewis hamilton im mclaren mercedes den bullen express und verwies den alten und neuen weltmeister vettel um etwas mehr als zwei zehntelsekunden auf platz zwei worueber sich der champion dennoch freute ich bin sehr gluecklich gerade weil es anfangs hier nicht so gut aussah mclaren war sehr stark aber auch wir waren im qualifying auf den punkt da sagte vettel und fuegte hinzu +Technik & Wissen de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-171875 url-pagepartsplitname-171875 url-lastpartpagename-html held mit schattenseiten kein zweifel er war sehr gefragt und so schrieb er +Technik & Wissen de-DE url-pathpart-wirtschaft url-pathpart-soziales url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,768732,00 url-pagepartsplitname-0,1518,768732,00 url-lastpartpagename-html#ref=rss solarfoerderung die solarbranche kann vorerst aufatmen +Technik & Wissen de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-172364 url-pagepartsplitname-172364 url-lastpartpagename-html traumatische erlebnisse brennen sich ein nd +Technik & Wissen de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-169252 url-pagepartsplitname-169252 url-lastpartpagename-html ist da draussen jemand eine frage bewegt die menschheit seit langem +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-weltall url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,747514,00 url-pagepartsplitname-0,1518,747514,00 url-lastpartpagename-html#ref=rss space shuttle 40 000 menschen schauten vor ort zu 1100 journalisten waren versammelt +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-technik url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,740808,00 url-pagepartsplitname-0,1518,740808,00 url-lastpartpagename-html#ref=rss neckarwestheim i das atomkraftwerk neckarwestheim i ist der erste meiler der seinen weiterbetrieb der von schwarz gelb beschlossenen laufzeitverlaengerung verdankt doch ein neues gutachten moniert dass wichtige sicherheitsnachruestungen jahrelang verschleppt wurden lange sah es so aus als wuerde der erste block des kernkraftwerks neckarwestheim in diesen tagen zum technikmuseum werden nach dem von rot gruen beschlossenen atomausstieg waere der uralt meiler offizielle abkuerzung +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-technik url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,751970,00 url-pagepartsplitname-0,1518,751970,00 url-lastpartpagename-html#ref=rss akw katastrophe in japan zum ersten mal gibt es bilder die den zustand des akw fukushima aus naechster naehe zeigen +Technik & Wissen de-DE url-pathpart-~r url-pathpart-rp url-pathpart-online url-pathpart-rss url-pathpart-wissen url-pathpart-~3 url-pathpart-kAfWJpo4WuM url-domainname-feeds.rp-online.de url-domainprefix-feeds url-domainprefix-feeds.rp-online url-domaintype-de url-domainsuffix-rp-online.de url-firstpartpagename-1019185 url-pagepartsplitname-1019185 studie arten fliehen schneller vor klimawandel washington rpo viele tiere und pflanzen fliehen sehr viel schneller als gedacht vor dem klimawandel +Technik & Wissen de-DE url-pathpart-~r url-pathpart-rp url-pathpart-online url-pathpart-rss url-pathpart-wissen url-pathpart-~3 url-pathpart-PTSlL1qolho url-domainname-feeds.rp-online.de url-domainprefix-feeds url-domainprefix-feeds.rp-online url-domaintype-de url-domainsuffix-rp-online.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm was man wissen kann aber nicht muss warum man sich nicht selbst kitzeln kann duesseldorf rpo es gibt sachen die kann man wissen muss man aber nicht man koennte auch ohne sie leben interessant sind sie aber dennoch und als gespraechsstoff fuer die naechste party halten sie allemal her wir haben eine menge davon fuer sie gesammelt zum beispiel diese +Technik & Wissen de-DE url-pathpart-wissen url-domainname-www.sueddeutsche.de url-domainprefix-www url-domainprefix-www.sueddeutsche url-domaintype-de url-domainsuffix-sueddeutsche.de url-firstpartpagename-packeeis-schrumpft-auf-neues-minimum-gefaehrliches-tauwetter-im-ewigen-eis-1 url-pagepartsplitname-packeeis url-pagepartsplitname-schrumpft url-pagepartsplitname-auf url-pagepartsplitname-neues url-pagepartsplitname-minimum url-pagepartsplitname-gefaehrliches url-pagepartsplitname-tauwetter url-pagepartsplitname-im url-pagepartsplitname-ewigen url-pagepartsplitname-eis url-pagepartsplitname-1 url-lastpartpagename-1141322 packeis schrumpft auf neues minimum das meereis in der arktis wird in diesem sommer auf ein neues minimum zusammenschmelzen das aktuelle tempo des eisrueckgangs laesst darauf schliessen dass der bisherige negativrekord aus dem jahr 2007 unterboten wird teilte die universitaet bremen am freitag mit demnach ist die meereisflaeche am donnerstag auf 4 24 millionen quadratkilometer geschrumpft und lag damit unter dem entsprechenden tageswert des jahres 2007 damals waren 4 27 millionen quadratkilometer gemessen worden dass in diesem jahr ein negativrekord zu erwarten ist hatte sich bereits am anfang der woche abgezeichnet die eisdecke ist derzeit an den raendern so stark aufgebrochen dass die sonneneinstrahlung die oberste wasserschicht erwaermen kann und noch viele schollen schmelzen werden sagte ruediger gerdes meereisphysiker am bremerhavener alfred wegener institut am montag der rueckgang des sommerlichen eises betraegt seit 1972 bereits 50 prozent warnt der bremer umweltphysiker georg heygster dabei hat die packeisflaeche in diesem jahr offenbar eine andere form als in den vergangenen eisarmen perioden in diesem sommer gab es auffallend grosse eisfreie flaechen innerhalb der packeis zone zum beispiel in der laptev see im norden russlands dieses loch erweckt den eindruck als sei das eis hier von unten geschmolzen es tat sich anfang august auf und hat inzwischen die groesse hollands erreicht erklaerte der meereisforscher lars kaleschke vom klimacampus der universitaet hamburg vor wenigen tagen auch wissenschaftler des alfred wegener instituts die vor kurzem an bord des forschungseisbrechers polarstern bis zum nordpol vorgedrungen waren bestaetigten die geringe dicke des meereises messungen hatten einen durchschnittswert von 90 zentimetern ergeben im jahr 2001 war das meereis noch durchschnittlich zwei meter dick die arktis gilt unter klimaforschern als aeusserst sensible region die dortigen eisflaechen reagieren nicht nur empfindlich auf die erderwaermung sie bestimmen auch massgeblich deren voranschreiten so wie sich ein weisses auto unter sonnenstrahlung weniger aufheizt als ein dunkles fahrzeug reflektiert die eisflaeche der arktis mehr sonnenstrahlung zurueck in den weltraum als das vergleichsweise dunkle meerwasser schmilzt das packeis der arktis kurbelt das den klimawandel zusaetzlich an +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-weltall url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,792822,00 url-pagepartsplitname-0,1518,792822,00 url-lastpartpagename-html#ref=rss start des galileo satelliten es soll eine doppelpremiere werden erstmals hebt eine russische sojus rakete von europas weltraumbahnhof kourou ab und +Technik & Wissen de-DE url-pathpart-spiegel url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,791040,00 url-pagepartsplitname-0,1518,791040,00 url-lastpartpagename-html#ref=rss fliegen wie ein vogel kann der mensch bald fliegen wie ein vogel tueftler jagen dem menschheitstraum des schwingenflugs mit beweglichen fluegeln nach als die sonne blutrot ueber dem morgennebel in die hoehe steigt fliegt todd reichert davon emporgetragen wird er vom auf und ab maechtiger fluegel kein motor treibt sein vehikel an mit blosser kraft der beine die er in die pedale stemmt hebt er ab sein strampeln wird durch ein seilsystem auf die fluegel uebertragen monatelang hat der kanadische ingenieurstudent fuer diesen moment trainiert er nahm acht kilo ab und erhielt unterricht von einem kickboxer zusammen mit kommilitonen der university of toronto hatte er vier jahre lang das einzigartige superleichtflugzeug zusammengeschraubt der snowbird besteht grossenteils aus carbonstangen balsaholz und plastikfolie und wiegt nur 44 kilogramm hat aber eine spannweite von 32 metern fast so viel wie eine boeing 737 reicherts flug dauerte nur 19 3 sekunden nach 145 metern verliessen ihn die kraefte und er musste landen mit hilfe des kinderwagenrads das er unter den rumpf geschraubt hatte fuer den piloten war der huepfer ein triumph ein uralter traum vom fliegen ist wahr geworden sagt reichert die vision sich aus eigener kraft in die luefte zu erheben beschwor bereits der antike mythos von ikarus mit schwingen aus federn und wachs erhob dieser sich in die luft bis er der sonne zu nahe kam +Technik & Wissen de-DE url-pathpart-~r url-pathpart-rp url-pathpart-online url-pathpart-rss url-pathpart-wissen url-pathpart-~3 url-pathpart-ukOgqmbUdqU url-domainname-feeds.rp-online.de url-domainprefix-feeds url-domainprefix-feeds.rp-online url-domaintype-de url-domainsuffix-rp-online.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm bau gefaehrdet amazonas ureinwohner brasilianisches gericht stoppt riesenstaudamm sao paulo rpo ein brasilianisches gericht hat einen baustopp fuer den drittgroessten staudamm der welt im amazonas gebiet angeordnet der bau des umstrittenen belo monte staudamms gefaehrde den fischfang der ureinwohner hiess es am mittwoch zur begruendung das baukonsortium duerfe keine infrastrukturmassnahmen vornehmen welche den natuerlichen strom des xingu flusses und damit den fischbestand beeintraechtigten das bundesgericht des nordbrasilianischen staates para untersagte dem baukonsortium norte energia das flussbett des xingu eines zuflusses des amazonas durch den bau eines hafens oder von deichen durch sprengungen oder das graben von kanaelen zu veraendern bautaetigkeiten die keine auswirkungen auf die oertliche fischerei haben duerfen dem gerichtsurteil zufolge fortgesetzt werden wenn das baukonsortium gegen das urteil verstoesst muss es pro tag 200 000 real etwa 80 000 euro strafe zahlen gegen das elf milliarden dollar 8 1 milliarden euro teure projekt laufen indianische ureinwohner der region und umweltschuetzer seit langem sturm sie verweisen darauf dass den berechnungen zufolge eine flaeche von 500 quadratkilometern geflutet werden wird und 16 000 menschen umgesiedelt werden muessen in ihrem protest werden die ureinwohner von der katholischen kirche aber auch von prominenten wie dem kanadischen starregisseur james cameron avatar oder dem britischen rockmusiker sting unterstuetzt +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-technik url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,785831,00 url-pagepartsplitname-0,1518,785831,00 url-lastpartpagename-html#ref=rss atomunfall in suedfrankreich ein ofen fuer radioaktive abfaelle ist explodiert ein arbeiter gestorben doch die ursache fuer das unglueck in der atomanlage marcoule bleibt unklar trotzdem gaben die behoerden schnell entwarnung die franzoesischen medien berichten sehr gelassen nur die anwohner reagieren empoert paris die meldung schockierte die boersen und weckte erinnerungen an das unglueck in japan +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-weltall url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,783022,00 url-pagepartsplitname-0,1518,783022,00 url-lastpartpagename-html#ref=rss absturz eines raumtransporters der absturz eines russischen raumschiffes hat folgen fuer die internationale raumstation +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-technik url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,785765,00 url-pagepartsplitname-0,1518,785765,00 url-lastpartpagename-html#ref=rss kernenergie auf dem gelaende der atomanlage marcoule in suedfrankreich hat sich eine explosion ereignet ein mensch ist nach behoerdenangaben ums leben gekommen vier weitere wurden verletzt radioaktivitaet soll nicht in die umwelt gelangt sein paris wien in der suedfranzoesischen atomanlage marcoule gab es am montag eine explosion es habe einen toten gegeben teilte die franzoesische atomaufsicht asn mit vier weitere personen seien verletzt worden eine davon schwer strahlung ist laut asn und der oertlichen polizei nicht ausgetreten die behoerden richteten dennoch eine sicherheitszone ein falls noch radioaktivitaet entweichen sollte nach angaben der asn ist bei dem unfall ein verbrennungsofen fuer schwach radioaktive abfaelle explodiert dazu zaehlen unter anderem kleidung von arbeitern sowie metalle und beton die ursache des ungluecks war zunaechst unklar es handelt sich um einen industrieunfall nicht um einen atomunfall sagte ein sprecher des staatlichen stromkonzerns edf dessen tochterunternehmen socodei die anlage betreibt der bei dem unfall gestorbene arbeiter sei in sekundenschnelle verbrannt sagte ein edf sprecher zu spiegel online der mann habe in einem raum neben dem verbrennungsofen gearbeitet als dieser explodiert sei die asn hat den unfall am montagnachmittag offiziell fuer beendet erklaert dieser unfall bedeutet keine radioaktivitaet und keine massnahmen zum schutz der bevoelkerung teilte die asn mit die ihren krisenstab wieder aufloeste die explosion in einem verbrennungsofen habe ein feuer entfacht das gegen 13 uhr unter kontrolle gewesen sei das gebaeude in dem der ofen stand sei nicht beschaedigt worden die vier verletzten von denen einer schwere verbrennungen erlitt seien nicht verstrahlt worden auch ausserhalb des gebaeudes sei keine radioaktivitaet gemessen worden nun solle untersucht werden wie es zu dem unfall kam auch das unabhaengige franzoesische atomforschungsinstitut criirad hat entwarnung gegeben +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-article13595532 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Arktis-Eis-schmilzt-auf-Rekordminimum-zusammen url-pagepartsplitname-Arktis url-pagepartsplitname-Eis url-pagepartsplitname-schmilzt url-pagepartsplitname-auf url-pagepartsplitname-Rekordminimum url-pagepartsplitname-zusammen url-lastpartpagename-html klimawandel das eis im nordpolarmeer erreicht ein rekordminimum der tiefstand ist laut experten nicht mehr durch die natuerliche variabilitaet zu erklaeren das meereis ist in diesem sommer auf ein neues rekordminimum geschmolzen das selbst die bisher geringste eisausdehnung im nordpolarmeer aus dem jahr 2007 unterschreitet mit nur noch 4 24 millionen quadratkilometer ist das sommerliche eis seit 1971 um 50 prozent zurueckgegangen georg heygster vom institut fuer umweltphysik an der universitaet bremen zufolge ist diese negativmarke nicht mehr durch die natuerliche variabilitaet von jahr zu jahr zu erklaeren sondern zeigt nur umso deutlicher was fuer gravierende auswirkungen der klimawandel auf die arktis hat schon vor wochen hatten wissenschaftler diesen september mit dem tiefstand der eisbedeckung gerechnet jetzt wurden die zahlen von der universitaet in bremen vorgelegt die eisausdehnung schwankt nach heygsters angaben im jahresverlauf zwischen etwa 15 millionen quadratkilometern im maerz und 5 quadratkilometern im september der aktuelle wert laege allerdings diesen september um 0 6 prozent unter dem minimum von 2007 fuer kleinlebewesen die an der unterseite des eises leben und gleichzeitig ausgangspunkt der nahrungskette auch fuer uns menschen sind bleibt immer weniger lebensraum erlaeuterte der umweltphysiker der universitaet bremen weiter hinzu kommt dass auch in diesem jahr die nordost und nordwestpassagen wieder gleichzeitig eisfrei seien was erstmalig 2008 beobachtet wurde heygst aussagen zufolge zeigen mehrjaehrige beobachtungen dass die mittlere eisdecke abnimmt es bleibt abzuwarten wie sich die situation weiter entwickelt da der wert der eisausdehnung in den naechsten wochen weiter abnehmen kann +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-weltall url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,786411,00 url-pagepartsplitname-0,1518,786411,00 url-lastpartpagename-html#ref=rss space launch system die us raumfahrtbehoerde sucht den shuttle nachfolger nun ist die nasa fuendig geworden die neue riesenrakete space launch system soll astronauten kuenftig sogar bis zum mars bringen doch das kraftpaket kostet viel geld deswegen setzen die ingenieure auch auf technik von gestern berlin es soll ein kraftvoller befreiungsschlag werden +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-article13575103 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-9000-Saeuglinge-sterben-taeglich-Versorgung-fehlt url-pagepartsplitname-9000 url-pagepartsplitname-Saeuglinge url-pagepartsplitname-sterben url-pagepartsplitname-taeglich url-pagepartsplitname-Versorgung url-pagepartsplitname-fehlt url-lastpartpagename-html un schaetzungen rund 40 prozent aller todesfaelle von kindern unter fuenf jahren seien in den ersten 28 tagen nach der geburt zu verzeichnen erlaeuterte die who dabei ist die kritischste zeit die erste woche hauptursache fuer die saeuglingssterblichkeit sind unterernaehrung infektionen und sauerstoffmangel auch zu frueh geborene kinder haben in entwicklungslaendern geringere ueberlebenschancen weil es an medizinischer betreuung und geeigneten geraeten wie brutkaesten mangelt allerdings sank demnach die zahl der neugeborenen die in ihren ersten vier lebenswochen sterben zwischen 1990 und 2009 von schaetzungsweise 4 6 millionen auf 3 3 millionen als grund sieht die who die gestiegenen investitionen im gesundheitswesen grosse fortschritte gebe es in china in afrika sehe es dagegen schlecht aus in indien treten nach who angaben jaehrlich rund 900 000 todesfaelle bei neugeborenen auf das seien 28 prozent der gesamttodesfaelle in diesem alter weltweit es folgen nigeria und pakistan china liegt auf platz vier mit blick auf die gesamtzahl der todesfaelle bei neugeborenen dort ist der anteil der todesfaelle von 23 pro 1000 lebendgeborene im jahr 1990 auf 11 pro 1000 lebendgeborene im jahr 2009 zurueckgegangen tschechien und andere eu staaten haben sich deutlich verbessert da in afrika nur ein rueckgang von jaehrlich einem prozent zu verzeichnen sei duerfte es rein statistisch gesehen mehr als 150 jahre dauern bis es den level der usa oder grossbritanniens bei der neugeborenensterblichkeit erreicht habe heisst es in der mitteilung weiter von den zehn laendern die die sterberate bei neugeborenen um jeweils mindestens zwei drittel in zwei dekaden gesenkt haben gehoeren unter anderem zypern tschechien estland griechenland und luxemburg der kampf gegen die kindersterblichkeit gehoert zu den acht millenniumsentwicklungszielen der un verglichen mit 1990 soll die kindersterblichkeit bis 2015 um zwei drittel sinken die un millenniumsziele zu denen auch die halbierung der armut zaehlt wurden im jahr 2000 von den staats und regierungschefs beschlossen +Technik & Wissen de-DE url-pathpart-c url-pathpart-795 url-pathpart-f url-pathpart-448250 url-pathpart-s url-pathpart-143ff78b url-pathpart-l url-pathpart-0L0Ssueddeutsche0Bde0Cwissen0Carktis0Etauender0Epermafrostboden0Ewie0Eein0Eschweizer0Ekaese0E10B10A85930A url-domainname-rssfeed.sueddeutsche.de url-domainprefix-rssfeed url-domainprefix-rssfeed.sueddeutsche url-domaintype-de url-domainsuffix-sueddeutsche.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm arktis hans wolfgang hubberten ist leiter der aussenstelle potsdam des alfred wegener instituts fuer polar und meeresforschung awi seit fast 20 jahren erforscht er die dauerfrostboeden sibiriens hubberten +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-weltall url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,748765,00 url-pagepartsplitname-0,1518,748765,00 url-lastpartpagename-html#ref=rss letzter ausseneinsatz an der iss zwei astronauten der us raumfaehre discovery haben ihren zweiten ausseneinsatz an der iss erfolgreich abgeschlossen damit ging eine aera zu ende +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-weltall url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,764936,00 url-pagepartsplitname-0,1518,764936,00 url-lastpartpagename-html#ref=rss europas neuer astronautenchef strahlemann auf schwieriger mission +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-technik url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,656774,00 url-pagepartsplitname-0,1518,656774,00 url-lastpartpagename-html#ref=rss raketen fliegen mit eis und aluminium ein neuartiger raketen treibstoff koennte die raumfahrt revolutionieren das ueberraschend simple gemisch aus wasser und kleinsten aluminium partikeln soll umweltfreundlicher sicherer und ebenso leistungsstark wie herkoemmlicher sprit sein zudem koennte es den weg zum mars ebnen es ist jahrzehnte her seit die ersten raketen in den himmel gestiegen sind doch waehrend sich die flugkoerper selbst rasant weiterentwickelt haben sind die treibstoffe heute weitgehend dieselben wie noch vor mehr als 50 jahren jetzt aber koennte eine mixtur aus metall und eis einen entscheidenden fortschritt bringen er soll nach vorstellungen seiner entwickler raketenstarts nicht nur sauberer machen sondern koennte auch das nachtanken an weit entfernten zielen wie etwa dem mars ermoeglichen der treibstoff namens alice kurz fuer aluminium ice soll seine energie aus der chemischen reaktion zwischen wasser und aluminium erhalten zudem koennte der dabei entstehende wasserstoff auch noch fuer andere dinge gut sein etwa fuer den betrieb von brennstoffzellen auf langzeit raumfluegen forscher der purdue university in west lafayette us bundesstaat indiana haben im august bereits eine rund drei meter lange rakete mit hilfe des neuartigen treibstoffs in den himmel geschossen der flugkoerper erreichte nach angaben der universitaet eine hoehe von immerhin rund 400 metern damit haben wir bewiesen dass das konzept prinzipiell funktioniert sagte purdue professor steven son ihre ergebnisse haben die wissenschaftler unter anderem im fachblatt proceedings of the combustion institute veroeffentlicht der schluessel zur kraft von alice ist die geringe groesse der aluminium partikel solche teilchen werden bereits in treibstoffen eingesetzt etwa in den feststoff booster raketen des space shuttles oder in den neuen ares raketen der nasa doch die partikel sind meist wesentlich groesser als jene die in alice zum einsatz kommen die sind im durchmesser lediglich rund 80 nanometer klein verbrennen deshalb schneller und ermoeglichen eine bessere kontrolle ueber den rueckstoss so die purdue forscher die alu partikel werden dafuer mit wasser zu einer zaehen paste vermischt sie wird in einen zylinder mit einem stab in der mitte gefuellt und eingefroren ist die masse hart wird der stab entfernt so dass eine runde aushoehlung zurueckbleibt der feststoff wird dann mit hilfe eines kleinen raketentriebwerks an der spitze des zylinders gezuendet +Gesundheit de-DE url-pathpart-~r url-pathpart-rp url-pathpart-online url-pathpart-rss url-pathpart-gesundheit url-pathpart-~3 url-pathpart-SkdtvYgtg5c url-domainname-feeds.rp-online.de url-domainprefix-feeds url-domainprefix-feeds.rp-online url-domaintype-de url-domainsuffix-rp-online.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm brustschmerzen durch verspannten ruecken was haltungsschaeden ausloesen koennen frankfurt main rpo die sorge ist gross wenn es ploetzlich im brustkorb sticht viele betroffene denken sofort an einen herzinfarkt oder auch an brustkrebs mit haltungsschaeden und muskelverspannungen wird das stechen nicht in verbindung gebracht nicht selten aber ist das bruststechen die folge von haltungsschaeden durch zu vieles sitzen und zu wenig bewegung bei brustschmerzen muss natuerlich als erstes ein arzt andere ursachen wie herzinfarkt rippenbrueche oder erkrankungen der lunge ausschliessen sagt peter ivanits facharzt fuer orthopaedie aus frankfurt am main aber bei vielen patienten ruehre das stechen in der brust das meist im sitzen oder anderen ruhephasen auftrete von einer verspannten rueckenmuskulatur mit massagen und krankengymnastik bekommen wir die akuten beschwerden schnell in der griff sagt ivanits aber ohne vorbeugung koennten die brustschmerzen regelmaessig wiederkehren die beste praevention ist regelmaessiger sport sagt ivanits im alltag koennten aber auch ein paar einfache regeln schon helfen +Gesundheit de-DE url-pathpart-~r url-pathpart-rp url-pathpart-online url-pathpart-rss url-pathpart-gesundheit url-pathpart-~3 url-pathpart-nsxWjaU67aA url-domainname-feeds.rp-online.de url-domainprefix-feeds url-domainprefix-feeds.rp-online url-domaintype-de url-domainsuffix-rp-online.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm steve jobs seltene krebskrankheit sieben jahre ueberleben bedeuten einen sieg rp unter medizinern wurde der fall steve jobs seit langem kontrovers diskutiert auf der einen seite +Ausland de-DE url-pathpart-politik url-pathpart-article2055267 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Menschenjagd-auf-Kairos-Strassen-nach-Christen-Protesten url-pagepartsplitname-Menschenjagd url-pagepartsplitname-auf url-pagepartsplitname-Kairos url-pagepartsplitname-Strassen url-pagepartsplitname-nach url-pagepartsplitname-Christen url-pagepartsplitname-Protesten url-lastpartpagename-html menschenjagd auf kairos strassen nach christen protesten hamburg kairo als tausende christliche kopten gemeinsam mit vielen muslimen in kairo auf die strasse gingen um gegen die wachsende diskriminierung der kopten zu demonstrieren sollte dies ein zeichen friedlicher solidaritaet setzen doch das chaos das dann daraus erwuchs gefaehrdet die gesamte gesellschaftliche und politische entwicklung im bevoelkerungsreichsten arabischen staat ploetzlich flogen steine dann fielen schuesse schliesslich marschierte die armee auf ein militaerfahrzeug raste vor und zurueck durch die aufgebrachte menge und ueberrollte mehrere menschen am ende waren nach offiziellen angaben mindestens 26 menschen tot und weit mehr als 200 verletzt inoffizielle beobachter sprachen gar von 36 toten und mehr als 300 verletzten es waren die schlimmsten unruhen seit den wirren im zusammenhang mit dem sturz des langjaehrigen despoten husni mubarak im februar die bundesregierung in berlin forderte die fuehrung in kairo auf fuer ein klima religioeser toleranz zu sorgen und die vorgaenge so schnell wie moeglich aufzuklaeren wie regierungssprecher steffen seibert sagte bundesaussenminister guido westerwelle fdp verurteilte die gewalt am rande des eu ministerrats in luxemburg scharf wer als christ seinen glauben praktizieren moechte muss das frei tun koennen ohne dass er koerperlich bedroht wird oder um sein leben fuerchten muss sagte westerwelle die eu aussenbeauftragte catherine ashton sagte die europaeische union erwarte dass aegypten menschen jeder glaubensrichtung schuetze 26 tote sagte ashton entsetzt niemand auf der welt gibt menschen das recht einen religionskampf zu fuehren der in kairo herrschende militaerrat verstaerkte die sicherheitsmassnahmen verhaengte ueber teile kairos eine naechtliche ausgangssperre und zog zusaetzliche truppen vor dem parlamentsgebaeude und anderen zentralen einrichtungen zusammen die unruhen hatten am gebaeude des staatlichen fernsehens begonnen und sich dann rasch auf andere teile der hauptstadt inklusive des tahrir platzes ausgeweitet dort hatte die revolte gegen mubarak ihren ausgang genommen ausloeser der juengsten koptischen proteste waren ein angriff radikaler muslime auf die kirche des dorfes mari nab bei edfu die teilweise zerstoert wurde und der konflikt um eine schule in der provinz minia gewesen in der christliche maedchen gezwungen worden waren mit kopftuechern zu erscheinen die kopten werfen der neuen regierung in kairo vor sie nicht vor uebergriffen zu schuetzen und fordern den ruecktritt des gouverneurs der provinz assuan der die angriffe auf die kirche gerechtfertigt habe gouverneur mustafa al sajjid hatte behauptet das gotteshaus sei ohne genehmigung errichtet worden es war nicht die erste koptische kirche die in flammen aufging die radikalislamische salafistenbewegung wies jede verantwortung fuer die unruhen zurueck nach dem sturz mubaraks haben radikale islamisten in aegypten starken auftrieb erhalten rund 1000 soldaten und polizisten griffen in die sich rasch entwickelnden handfesten auseinandersetzungen zwischen kopten und militanten muslimen ein der staatliche fernsehsender nil tv wurde unter anderem von der internationalen gesellschaft fuer menschenrechte igfm beschuldigt sehr einseitig zulasten der kopten berichtet zu haben beobachter sprachen von hetze so meldete das staatliche programm channel 1 die kopten haetten zwei soldaten erschossen obwohl deren todesumstaende voellig ungeklaert waren und rief zur unterstuetzung der muslime auf diese stroemten dann herbei und attackierten die kopten ein rasender mob machte regelrecht jagd auf autos in denen koptische christen vermutet wurden die fahrzeuge und ihre insassen wurden angegriffen wie augenzeugen berichteten griffen armee und polizei nicht dagegen ein die groesste aegyptische zeitung al ahram berichtete anders als das fernsehen und schrieb der friedliche prokoptische protestzug sei von provokateuren radikalen muslimen und soldaten mit steinen und schuessen angegriffen worden ministerpraesident essam scharaf rief die aegypter zur ruhe auf es handle sich keineswegs um religionsunruhen sondern um eine verschwoerung der premier fuegte hinzu +Ausland de-DE url-pathpart-politik url-pathpart-article2006955 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-28-Menschen-sterben-bei-Attentat-auf-Moschee url-pagepartsplitname-28 url-pagepartsplitname-Menschen url-pagepartsplitname-sterben url-pagepartsplitname-bei url-pagepartsplitname-Attentat url-pagepartsplitname-auf url-pagepartsplitname-Moschee url-lastpartpagename-html 28 menschen sterben bei attentat auf moschee bagdad dubai bei einem selbstmordanschlag sind in der irakischen hauptstadt bagdad mindestens 28 menschen getoetet worden 37 weitere personen wurden verletzt wie der arabische fernsehsender al arabija am sonntag unter berufung auf das irakische innenministerium weiter mitteilte der attentaeter habe sich nach dem abendgebet in einer sunnitischen moschee im westen bagdads in die luft gesprengt unter den toten war den angaben zufolge auch ein parlamentsabgeordneter die um al kura moschee im stadtviertel al dschamiaah ist das groesste sunnitische gotteshaus in der irakischen hauptstadt die bluttat weckte erinnerungen an einen anschlag auf einen schiitischen schrein in der sunnitischen stadt samarra im jahr 2006 der eine welle sektiererisch motivierte gewalt im irak ausloeste dpa dapd +Ausland de-DE url-pathpart-politik url-pathpart-ausland url-pathpart-krise url-pathpart-in url-pathpart-der url-pathpart-arabischen url-pathpart-welt url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-libyen-rebellen-sind-gaddafi-auf-der-spur_aid_659357 url-pagepartsplitname-libyen url-pagepartsplitname-rebellen url-pagepartsplitname-sind url-pagepartsplitname-gaddafi url-pagepartsplitname-auf url-pagepartsplitname-der url-pagepartsplitname-spur url-pagepartsplitname-aid url-pagepartsplitname-659357 url-lastpartpagename-html libyen rebellen sind gaddafi auf der spur nach der eroberung von tripolis durch libysche rebellen stehen jetzt auch muammar el gaddafis letzte machtbastionen im land vor dem fall weiter unklar ist wo der diktator untergetaucht ist angeblich verfolgen die rebellen einen verdaechtigen lkw konvoi die kaempfe zwischen aufstaendischen und gaddafi treuen truppen konzentrierten sich am freitag auf die beiden verbliebenen hochburgen des alten regimes gaddafis heimatstadt sirte sowie die wuestenstadt sebha im zentrum des landes dagegen flauten die kaempfe in tripolis nach fernsehberichten deutlich ab weiter unklar ist wo der langjaehrige diktator untergetaucht ist nach einem medienbericht sollen die aufstaendischen einem lastwagen konvoi verfolgen in dem sie gaddafi vermuten sie hofften die fahrzeuge etwa 40 bis 50 kilometer vor tripolis abfangen zu koennen sagte sicherheitsberater abdul karim basama vom uebergangsrat der maltesischen zeitung the times of malta es solle verhindert werden dass gaddafi nach sirte oder sebha durchkomme derweil beklagte bundesverteidigungsminister thomas de maiziere cdu fehler der internationalen staatengemeinschaft bei der einschaetzung der lage in libyen wir haben uns mindestens dreimal geirrt nicht nur wir deutschen der ganze westen sagte er in der bundesakademie fuer sicherheitspolitik in berlin gaddafi sei erst massiv unterschaetzt und dann massiv ueberschaetzt worden dann haben wir gesagt es wird lange anhalten und es gibt ueberhaupt keine veraenderungen und in einer woche war tripolis erobert der chef der libyschen uebergangsregierung mahmud dschibril erklaerte die aufstaendischen haetten inzwischen fast im ganzen land die oberhand nur sebha sirte sowie das suedoestlich von tripolis gelegene bani walid seien noch nicht unter kontrolle sagte er nach angaben der tuerkischen nachrichtenagentur anadolu in ankara ziel sei es die staedte ohne blutvergiessen einzunehmen britische kampfflugzeuge feuerten in der nacht zum freitag raketen auf eine kommando und kontrollzentrale in sirte ab gaddafi gegner riefen die einwohner auf die stadt kampflos zu uebergeben im gegenzug sollten nur aus sirte stammende kaempfer in die kuestenstadt einruecken hiess es die aufstaendischen sammelten unterdessen ihre einheiten nahe sirte wo sich einheiten und anhaenger gaddafis verschanzt haben in der garnisonsstadt sebha lieferten sich anhaenger und gegner gaddafis heftige kaempfe dutzende rebellen seien getoetet worden als sie das hauptquartier des militaergeheimdienstes gestuermt haetten teilten die aufstaendischen mit sie haetten zwei stadtviertel eingenommen es gebe kein wasser und keinen strom in tripolis sagten die neuen machthaber ein auf dem zentralen gruenen platz geplantes freitagsgebet aus sicherheitsgruenden ab die glaeubigen versammelten sich in der nahe gelegenen el kabir moschee der prediger scheich ahmed milad gaddur rief die libyer auf keine rache zu ueben unterdessen kommen immer mehr grausamkeiten der vergangenen tage ans licht reporter der fernsehsender el dschasira und bbc berichteten von graeueltaten auf beiden seiten el dschasira zeigte bilder von leichen in gruenanalagen in dem noch am donnerstag besonders heftig umkaempften stadtteil von tripolis abu salim ein reporter beschrieb die lage in einem nahe gelegenen krankenhaus als katastrophal dort stapelten sich die leichen nach informationen der menschenrechtsorganisation amnesty international haben gaddafi anhaenger womoeglich mehr als 100 gefangene in militaercamps nahe tripolis brutal getoetet die gaddafi treuen truppen haetten granaten geworfen und mit schusswaffen auf die gefangenen gefeuert +Ausland de-DE url-pathpart-politik url-pathpart-ausland url-pathpart-krise url-pathpart-in url-pathpart-der url-pathpart-arabischen url-pathpart-welt url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-libyen-china-bot-gaddafi-grosse-mengen-waffen-an_aid_662179 url-pagepartsplitname-libyen url-pagepartsplitname-china url-pagepartsplitname-bot url-pagepartsplitname-gaddafi url-pagepartsplitname-grosse url-pagepartsplitname-mengen url-pagepartsplitname-waffen url-pagepartsplitname-an url-pagepartsplitname-aid url-pagepartsplitname-662179 url-lastpartpagename-html libyen china bot gaddafi grosse mengen waffen an china hat sich offenbar ueber un sanktionen hinweg gesetzt und dem gaddafi regime vor seinem zerfall grosse mengen an waffen und munition angeboten die chinesischen waffenhaendler wollten bei bedarf sogar auf bestellung liefern chinesische firmen haetten den truppen von libyens langjaehrigem machthaber muammar gaddafi im juli den verkauf von raketenwerfern panzerabwehrraketen und anderen waffen im wert von rund 200 millionen dollar angeboten berichtete die new york times am montag zuvor hatte auch die kanadische the globe and mail davon berichtet wir haben hinweise dass es geschaeftsbeziehungen zwischen china und gaddafi gegeben hat sagte rebellensprecher abdulrahman busin der new york times und wir haben alle dokumente die dies beweisen demnach reiste eine libysche delegation mitte juli nach china und sprach mit vertretern verschiedener ruestungskonzerne die konzerne haetten angeboten ihre gesamten lagerbestaende zu verkaufen und bei bedarf auf bestellung zu produzieren die lieferungen sollten demnach ueber die drittstaaten algerien und suedafrika erfolgen die chinesische seite habe darauf hingewiesen dass ein teil der waffen bereits in algerien gelagert sei und schnell ueber die grenze nach libyen gebracht werden koenne die gastgeber haetten sich bei den libyern fuer deren diskretion bedankt und auf die noetige vertraulichkeit hingewiesen ob es zu lieferungen gekommen sei gehe aus den dokumenten nicht hervor vertreter der neuen libyschen fuehrung in tripolis sagten die dokumente bestaetigten den verdacht dass es eine enge zusammenarbeit der gaddafi fuehrung mit china algerien und suedafrika gegeben habe der militaerbeauftragte des nationalen uebergangsrates omar hariri sagte er sei sich ziemlich sicher dass waffen in libyen eingetroffen und gegen das libysche volk verwendet worden seien die dokumente wurden auf einem muellhaufen in einem stadtteil von tripolis entdeckt in dem viele mitglieder der gaddafi fuehrung lebten china ist das einzige staendige mitglied im un sicherheitsrat das den uebergangsrat bislang nicht als legitimen vertreter libyens anerkannt hat eine bestaetigung fuer die berichte oder die echtheit der dokumente gab es nicht ein nato und ein un vertreter bezeichneten sie der new york times zufolge jedoch als hoechst unwahrscheinlich den vereinten nationen sei nichts von waffengeschaeften mit china bekannt sagte das mitglied einer un kommission zur ueberwachung des libyen embargos das chinesische aussenministerium raeumte ein dass mitglieder von gaddafis regierung auf chinesische ruestungsfirmen zugegangen seien dies sei aber ohne wissen der chinesischen regierung passiert sagte ministeriumssprecherin jian yu die chinesischen firmen haben keine entsprechenden vertraege unterschrieben noch haben sie militaergueter nach libyen ausgeliefert nachdem der un sicherheitsrat die resolution verabschiedet habe seien die entsprechenden regierungsstellen angewiesen worden sie strengstens einzuhalten +Ausland de-DE url-pathpart-politik url-pathpart-ausland url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-afghanistan-auswaertiges-amt-bestaetigt-tod-eines-deutschen-urlaubers_aid_668931 url-pagepartsplitname-afghanistan url-pagepartsplitname-auswaertiges url-pagepartsplitname-amt url-pagepartsplitname-bestaetigt url-pagepartsplitname-tod url-pagepartsplitname-eines url-pagepartsplitname-deutschen url-pagepartsplitname-urlaubers url-pagepartsplitname-aid url-pagepartsplitname-668931 url-lastpartpagename-html afghanistan auswaertiges amt bestaetigt tod eines deutschen urlaubers ein ministeriumssprecher sagte am sonntag in berlin die untersuchungen haetten ergeben dass es sich bei einer der beiden in der westafghanischen provinz ghor getoeteten personen um einen deutschen staatsangehoerigen handele nach angaben der afghanischen behoerden hatten bewaffnete angreifer den deutschen touristen sowie seinen afghanischen begleiter am samstag in der als relativ sicher geltenden region erschossen die provinz ghor gilt normalerweise als verhaeltnismaessig ruhig der tourist sei aber von den behoerden gewarnt worden dass seine sicherheit nicht gewaehrleistet werden koenne sagte vize polizeichef abdul raschid die leiche des deutschen sei in die hauptstadt kabul gebracht worden +Ausland de-DE url-pathpart-politik url-pathpart-ausland url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-somalia-kalaschnikows-fuer-gute-koranschueler_aid_667250 url-pagepartsplitname-somalia url-pagepartsplitname-kalaschnikows url-pagepartsplitname-fuer url-pagepartsplitname-gute url-pagepartsplitname-koranschueler url-pagepartsplitname-aid url-pagepartsplitname-667250 url-lastpartpagename-html somalia kalaschnikows fuer gute koranschueler ein von der radikalislamischen el schabaab miliz betriebener radiosender in somalia hat einen rezitierwettbewerb fuer kinder veranstaltet als hauptpreis gab es nicht nur geld zu gewinnen sondern auch jede menge schwere waffen der gewinner ging mit einem ak 47 kalaschnikow sturmgewehr und einem geldpreis in hoehe von umgerechnet 500 euro nach hause wie der britische sender bbc am dienstag berichtete der zweiplatzierte erhielt ebenfalls eine kalaschnikow und eine summe von 350 euro waehrend der drittplatzierte den wettstreit mit zwei handgranaten und etwa 300 euro verliess zudem erhielten die teilnehmer religioese buecher hiess es kinder sollten eine hand fuer ihre erziehung benutzen und in der anderen eine waffe halten um den islam zu beschuetzen sagte el schabaab sprecher mukhtar robow bei der preisverleihung auch raketenwerfer gab es schon als hautpgewinn der wettbewerb des radiosenders andulus wurde im fastenmonat ramadan in elasha 20 kilometer von der hauptstadt mogadischu entfernt ausgetragen zur teilnahme aufgerufen waren kinder und jugendliche zwischen zehn und 17 jahren in den vergangenen zwei jahren hatten kinder bei aehnlichen wettbewerben bereits um einen raketenwerfer als hauptgewinn gerungen die rebellen der el schabaab kontrollieren grosse teile des suedlichen und zentralen somalias wo derzeit eine verheerende duerre herrscht die miliz bekaempft die uebergangsregierung in mogadischu und will am horn von afrika einen islamischen gottesstaat einrichten der sich an einem weltweiten dschihad beteiligt +Ausland de-DE url-pathpart-politik url-pathpart-ausland url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-drohung-von-el-kaida-100-anschlaege-als-rache-fuer-bin-laden_aid_657300 url-pagepartsplitname-drohung url-pagepartsplitname-von url-pagepartsplitname-el url-pagepartsplitname-kaida url-pagepartsplitname-100 url-pagepartsplitname-anschlaege url-pagepartsplitname-als url-pagepartsplitname-rache url-pagepartsplitname-fuer url-pagepartsplitname-bin url-pagepartsplitname-laden url-pagepartsplitname-aid url-pagepartsplitname-657300 url-lastpartpagename-html drohung von el kaida 100 anschlaege als rache fuer bin laden dem irak droht eine neue welle der gewalt +Ausland de-DE url-pathpart-politik url-pathpart-ausland url-pathpart-article2014661 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Gaddafi-verhoerte-Terrorverdaechtige-fuer-die-CIA url-pagepartsplitname-Gaddafi url-pagepartsplitname-verhoerte url-pagepartsplitname-Terrorverdaechtige url-pagepartsplitname-fuer url-pagepartsplitname-die url-pagepartsplitname-CIA url-lastpartpagename-html gaddafi verhoerte terrorverdaechtige fuer die cia tripolis die zentrale des libyschen geheimdienstes lis liegt mitten in tripolis beiderseits der strasse sind rebellen postiert vor dem eingangstor stehen zwei gelaendefahrzeuge mit schweren geschuetzen auf der ladeflaeche schwere bewachung kein wunder +Unterhaltung de-DE url-pathpart-nachrichten url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-roland-emmerich-macht-actionfilme-liebe-1436652 url-pagepartsplitname-roland url-pagepartsplitname-emmerich url-pagepartsplitname-macht url-pagepartsplitname-actionfilme url-pagepartsplitname-liebe url-pagepartsplitname-1436652 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss roland emmerich macht actionfilme mit liebe nuernberg so hatte sich monika gruber ihren ersten auftritt bei wetten dass sicher nicht vorgestellt die kabarettistin wurde bei der samstagabend show opfer einer technsichen panne das war passiert +Unterhaltung de-DE url-pathpart-nachrichten url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-pete-doherty-kann-seine-strafe-nicht-bezahlen-1453565 url-pagepartsplitname-pete url-pagepartsplitname-doherty url-pagepartsplitname-kann url-pagepartsplitname-seine url-pagepartsplitname-strafe url-pagepartsplitname-nicht url-pagepartsplitname-bezahlen url-pagepartsplitname-1453565 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss pete doherty rocker pete doherty 32 will seine schulden bei der berliner justiz in raten abstottern der musiker habe ein entsprechendes gesuch gestellt teilte staatsanwaltschaftssprecher martin steltner am mittwoch mit das muss geprueft werden der musiker hatte sich einen strafbefehl von 30 000 euro eingehandelt weil er im dezember 2009 in kreuzberg bei einer kneipentour ein auto demoliert haben soll noch gebe es keinen haftbefehl aber doherty muesse damit rechnen wenn er seine strafe nicht zahle erklaerte steltner zu einem bericht der zeitung b z wenn der musiker die summe begleiche sei die angelegenheit erledigt und dem musiker bleibe eine ersatzfreiheitsstrafe von 30 tagen hinter gittern erspart nuernberg so hatte sich monika gruber ihren ersten auftritt bei wetten dass sicher nicht vorgestellt die kabarettistin wurde bei der samstagabend show opfer einer technsichen panne das war passiert +Unterhaltung de-DE url-pathpart-kultur url-pathpart-kino url-pathpart-tv url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-late-night-show-ohne-zuschauer-harald-schmidts-magere-quoten_aid_674601 url-pagepartsplitname-late url-pagepartsplitname-night url-pagepartsplitname-show url-pagepartsplitname-ohne url-pagepartsplitname-zuschauer url-pagepartsplitname-harald url-pagepartsplitname-schmidts url-pagepartsplitname-magere url-pagepartsplitname-quoten url-pagepartsplitname-aid url-pagepartsplitname-674601 url-lastpartpagename-html late night show ohne zuschauer harald schmidts magere quoten die harald schmidt show hat noch immer wenig zuschauer bei den 14 bis 49 jaehrigen schauen nur 9 1 prozent die late night show schmidts sender sat 1 betrachtet die quoten ganz entspannt harald schmidts quoten sind weiterhin schlecht nach angabens seines senders sat 1 erreicht der moderator mit seiner late night show durchschnittlich derzeit nur 9 1 prozent in der werberelevanten zielgruppe der 14 bis 49 jaehrigen die zahl der zuschauer liegt bei 510 000 beim gesamtpublikum sind es im schnitt 830 000 und damit 6 9 prozent der sender sat 1 sieht die bisher mageren quoten seines neuen late night talkers dennoch gelassen wir betrachten die quoten ganz entspannt sagte sat 1 sprecherin diana schardt auf anfrage uns ist bewusst dass es etwas zeit benoetigt bis sich die zuschauer an die regelmaessige sendezeit um 23 15 uhr an zwei aufeinanderfolgenden tagen gewoehnen die harald schmidt show war am 13 september gestartet schmidt der bereits zwischen 1995 bis 2003 fuer sat 1 gearbeitet hatte moderierte zuvor eine late night show in der ard sein neuer vertrag mit dem privatsender enthaelt nach aussagen des moderators explizit keine quotenvorgaben +Sport de-DE url-pathpart-c url-pathpart-32191 url-pathpart-f url-pathpart-443319 url-pathpart-s url-pathpart-17f65946 url-pathpart-l url-pathpart-0L0Sfocus0Bde0Csport0Cmehrsport0Cbasketball0Ewm0Ebasketball0Eem0Eerster0Esieg0Efuer0Eisrael0Iaid0I6620A570Bhtml url-domainname-rss2.focus.de url-domainprefix-rss2 url-domainprefix-rss2.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm basketball wm basketball em israel ist bei der basketball em der erste sieg gelungen der bisherige tabellenletzte der deutschen gruppe b setzte sich mit 91 +Sport de-DE url-pathpart-sport url-pathpart-fussball url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-junioren-u17-auswahl-startet-mit-sieg-in-em-qualifikation_aid_674504 url-pagepartsplitname-junioren url-pagepartsplitname-u17 url-pagepartsplitname-auswahl url-pagepartsplitname-startet url-pagepartsplitname-mit url-pagepartsplitname-sieg url-pagepartsplitname-in url-pagepartsplitname-em url-pagepartsplitname-qualifikation url-pagepartsplitname-aid url-pagepartsplitname-674504 url-lastpartpagename-html junioren u17 auswahl startet mit sieg in em qualifikation die u17 auswahl des deutschen fussball bundes ist mit einem klaren sieg in die erste qualifikationsrunde zur europameisterschaft 2012 gestartet die u17 auswahl des deutschen fussball bundes dfb ist mit einem klaren sieg in die erste qualifikationsrunde zur europameisterschaft 2012 gestartet die mannschaft von dfb trainer stefan boeger setzte sich in tallinn gegen gastgeber estland mit 5 +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-article13608441 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Pflanzen-legen-Wasservorrat-im-Boden-an url-pagepartsplitname-Pflanzen url-pagepartsplitname-legen url-pagepartsplitname-Wasservorrat url-pagepartsplitname-im url-pagepartsplitname-Boden url-pagepartsplitname-an url-lastpartpagename-html vorratswirtschaft pflanzen sondern im wurzelbereich eine wabbelige substanz ab die hilft ihnen wasser im boden speichern zu koennen so koennen sie trockenphasen ueberbruecken pflanzen koennen mit wasser im boden eine art vorratswirtschaft betreiben zumindest koennen sie nach neuen forschungsergebnissen in der naehe ihrer wurzeln so viel wasser speichern dass sie damit kuerzere trockenperioden ueberstehen koennen das haben wissenschaftler der universitaet goettingen zusammen mit kollegen aus potsdam leipzig und den usa herausgefunden foto +Technik & Wissen de-DE url-pathpart-wissenschaft url-pathpart-article13608359 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Bitte-wer-Das-ist-Albert-Szent-Gyoergyi url-pagepartsplitname-Bitte url-pagepartsplitname-wer url-pagepartsplitname-Das url-pagepartsplitname-ist url-pagepartsplitname-Albert url-pagepartsplitname-Szent url-pagepartsplitname-Gyoergyi url-lastpartpagename-html google doodle die suchmaschine ueberrascht wieder einmal auf ihrer startseite was mag sich hinter diesem etikett einer obstkiste verstecken es ist albert szent gyoergyi albert szent wer frisches obst auf der startseite von google das google doodle ein gekritzel aus besonderem anlass das das unternehmslogo von google verfremdet darstellt hatte zuletzt mit einer hommage an freddy mercury den 1991 verstorbenen saenger der rockband queen ueberrascht foto +Technik & Wissen de-DE url-pathpart-wissen url-domainname-www.stern.de url-domainprefix-www url-domainprefix-www.stern url-domaintype-de url-domainsuffix-stern.de url-firstpartpagename-qumran-rollen-museum-stellt-uralte-bibelschriften-online-1732537 url-pagepartsplitname-qumran url-pagepartsplitname-rollen url-pagepartsplitname-museum url-pagepartsplitname-stellt url-pagepartsplitname-uralte url-pagepartsplitname-bibelschriften url-pagepartsplitname-online url-pagepartsplitname-1732537 url-lastpartpagename-html#utm_source=standard&utm_medium=rssfeed&utm_campaign=wissen video die 2000 jahre alten qumran schriften sind jetzt online zugaenglich das israelische nationalmuseum hat die schriftrollen digitalisiert und im internet auf einer eigens von google entwickelten datenbank veroeffentlicht +Technik & Wissen de-DE url-pathpart-2011 url-pathpart-16 url-domainname-www.zeit.de url-domainprefix-www url-domainprefix-www.zeit url-domaintype-de url-domainsuffix-zeit.de url-firstpartpagename-Strahlung url-pagepartsplitname-Strahlung geschichte der radioaktivitaet frau roentgen ist verstimmt sie hat bereits dreimal nach ihrem mann geschickt um ihn zum abendessen zu holen erst kommt er gar nicht dann sitzt er schweigend am tisch isst nur ein paar bissen und verschwindet auch schon wieder im labor in jenen novembertagen 1895 arbeitet der wuerzburger physiker wilhelm conrad roentgen wie besessen an einer interessanten entdeckung am 28 dezember macht er sie mit seiner studie ueber eine neue art von strahlen oeffentlich und einen monat spaeter berichtet er in einer vorlesung erstmals ueber die geheimnisvollen x strahlen er belaesst es aber nicht bei worten sondern holt den schweizer anatomie professor rudolf albert von koelliker aus dem auditorium nach vorn koelliker muss seine hand auf eine belichtungsplatte legen dann jagt roentgen strom durch eine seltsam geschwaerzte roehre anschliessend haelt er den gebannten zuhoerern die belichtete aufnahme vor die nase sie zeigt deutlich erkennbar die handknochen des kollegen roentgens entdeckung ist ebenso spektakulaer wie leicht verstaendlich der blick durch die aeussere materie ins innenleben von menschen und dingen loest einen taumel der begeisterung aus und revolutioniert die medizin in rasendem tempo die new york sun spricht von einem triumph der wissenschaft +Technik & Wissen de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-174431 url-pagepartsplitname-174431 url-lastpartpagename-html viel zoff um einen stoff ein erbitterter streit geht in die naechste runde gegenstand des konflikts ist eine farblose kristalline chemikalie sie ist unverzichtbar fuer die herstellung von polycarbonat kunststoffen und einigen kunstharzen +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-news url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-illegaler-insider-handel-wall-street-mogul-muss-elf-jahre-hinter-gitter_aid_674503 url-pagepartsplitname-illegaler url-pagepartsplitname-insider url-pagepartsplitname-handel url-pagepartsplitname-wall url-pagepartsplitname-street url-pagepartsplitname-mogul url-pagepartsplitname-muss url-pagepartsplitname-elf url-pagepartsplitname-jahre url-pagepartsplitname-hinter url-pagepartsplitname-gitter url-pagepartsplitname-aid url-pagepartsplitname-674503 url-lastpartpagename-html illegaler insider handel wall street mogul muss elf jahre hinter gitter nach einem spektakulaeren prozess hat ein new yorker gericht den wall street mogul raj rajaratnam wegen insider handels zu elf jahren gefaengnis verurteilt weil der haendler krank ist und eifrig spendet fiel die strafe nicht noch haerter aus das gericht setzte damit am donnerstag ein geringeres strafmass gegen den 53 jaehrigen milliardaer fest als von der staatsanwaltschaft gefordert rajaratnam der den galleon hedgefonds gegruendet hatte muss ab ende november in haft und soll zuvor ein bussgeld in hoehe von zehn millionen dollar knapp 7 3 millionen euro zahlen er wurde am 11 mai schuldig gesprochen zwischen 2003 und 2009 millionenschwere insidergeschaefte verantwortet zu haben insgesamt soll er damit rund 72 millionen dollar etwa 52 5 millionen euro erwirtschaftet haben die staatsanwaltschaft hatte eine haftstrafe von mindestens neunzehneinhalb jahren gefordert richter richard holwell begruendete das mildere strafmass mit gesundheitlichen problemen rajaratnams der aus sri lanka stammende finanzmogul habe diabetes in fortgeschrittenem stadium was zu einer nierenstoerung fuehre sagte holwell als weiteren grund nannte der richter rajaratnams grosszuegige spendentaetigkeit die weit ueber das uebliche mass hinausreiche ueberdies seien insidergeschaefte weniger gefaehrlich als betrugsmodelle nach dem schneeballsystem wie sie zum beispiel von dem 2009 verurteilten milliardenbetrueger bernard madoff angewendet wurden das gegen rajaratnam festgesetzte strafmass ist laut wall street journal das hoechste das in den vergangenen 20 jahren in den usa wegen insidergeschaeften verhaengt wurde die verteidigung hatte auf maximal sechseinhalb jahre haft plaediert da der von rajaratnam mit den insidergeschaeften erwirtschaftete gewinn weniger als acht millionen dollar 5 8 millionen euro betrage +Gesundheit de-DE url-pathpart-ratgeber url-pathpart-gesundheit url-pathpart-article1971240 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Testosteron-schuetzt-vor-Entzuendungen-und-Allergien url-pagepartsplitname-Testosteron url-pagepartsplitname-schuetzt url-pagepartsplitname-vor url-pagepartsplitname-Entzuendungen url-pagepartsplitname-und url-pagepartsplitname-Allergien url-lastpartpagename-html testosteron schuetzt vor entzuendungen und allergien jena das maennliche erscheinungsbild wird in grossem masse vom geschlechtshormon testosteron gesteuert es laesst haare und muskeln wachsen hinzu kommt offenbar noch eine abwehrstaerkende wirkung des hormons deshalb leiden maenner seltener unter entzuendungen und allergien als frauen das teilte die universitaet jena am dienstag mit bestimmte zellen erzeugen demnach im weiblichen koerper fast doppelt so viele stoffe die eine entzuendung foerdern wie im maennlichen organismus daher wuerden vor allem frauen durch arthritis oder asthma geplagt doch der wirkung maennlicher hormone koennen sich auch die weiblichen immunzellen nicht entziehen im reagenzglas habe sich gezeigt dass testosteron in den zellen beider geschlechter die enzyme hemmt die fuer eine entzuendliche reaktion sorgen die jenaer wissenschaftler carlo pergola und oliver werz fordern deshalb massgeschneiderte therapien fuer maenner und frauen +Wirtschaft de-DE url-pathpart-wirtschaft url-pathpart-soziales url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,792948,00 url-pagepartsplitname-0,1518,792948,00 url-lastpartpagename-html#ref=rss konjunkturprognose die bundesregierung rechnet fuer 2012 mit einer spuerbar schwaecheren konjunktur doch die buerger sollen das nicht spueren im gegenteil +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-bundespraesident-in-tokio-wulff-reist-ins-japanische-katastrophengebiet_aid_677623 url-pagepartsplitname-bundespraesident url-pagepartsplitname-in url-pagepartsplitname-tokio url-pagepartsplitname-wulff url-pagepartsplitname-reist url-pagepartsplitname-ins url-pagepartsplitname-japanische url-pagepartsplitname-katastrophengebiet url-pagepartsplitname-aid url-pagepartsplitname-677623 url-lastpartpagename-html bundespraesident in tokio wulff reist ins japanische katastrophengebiet nach seiner ankunft in japan trifft bundespraesident wulff den kaiser japans regierung ergreift jetzt die initiative und fordert den betreiber tepco auf 24 milliarden euro einzusparen sonst gibt es kein geld vom staat am zweiten tag seines besuchs in japan ist bundespraesident christian wulff in tokio mit kaiser akihito und mit hochrangigen japanischen unternehmern zusammengetroffen akihito begruesste den deutschen staatsgast am montag im kaiserlichen palast in der innenstadt von tokio offizieller anlass des fuenftaegigen besuchs ist der 150 jahrestag der aufnahme diplomatischer beziehungen zwischen tokio und berlin bei dem treffen mit dem kaiser und einem anschliessenden mittagessen fuer die delegation duerfte es aber auch um die folgen der reaktorkatastrophe von fukushima gegangen sein bereits nach seiner ankunft am sonntag hatte wulff dem japanischen volk weiter solidaritaet und unterstuetzung aus deutschland zugesichert am montagabend trifft wulff auch mit regierungschef yoshihiko noda und anderen fuehrenden politikern des landes zusammen am dienstag will sich der bundespraesident im katastrophengebiet selbst ein bild von der lage machen und mit menschen sprechen die immer noch in behelfsunterkuenften leben auch sieben monate nach erdbeben tsunami und atomunfall sind noch zehntausende ohne obdach auch mit vorstandsvorsitzenden japanischer konzerne eroerterte wulff am montag konsequenzen aus dem atomunfall von fukushima ueber die zukunft der kernkraft gab es unterschiedliche positionen die nach angaben aus delegationskreisen vor dem bundespraesidenten offen diskutiert wurden wulff sprach mit den unternehmern auch ueber bestehende barrieren fuer deutsche unternehmen etwa bei investitionen in den bereichen energie und umwelttechnik in japan er hob die bedeutung des standortes hervor und sagte +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-boerse url-domainname-www.manager-magazin.de url-domainprefix-www url-domainprefix-www.manager-magazin url-domaintype-de url-domainsuffix-manager-magazin.de url-firstpartpagename-0,2828,792885,00 url-pagepartsplitname-0,2828,792885,00 url-lastpartpagename-html#ref=rss langfristige aktien investments guenstige bewertungen locken derzeit so genannte value investoren an die boerse gute voraussetzungen fuer erfolgreiches langfristiges investieren bringen wissenschaftlern zufolge gerade deutsche anleger mit aber bestehen sie damit auch den praxistest hamburg an der boerse schlaegt gegenwaertig die stunde der value investoren das sind jene anleger die per fundamentalanalyse also durch moeglichst praezise ermittlung des unternehmenswertes sowie vergleich dessen mit der boersenbewertung guenstige papiere identifizieren und dann kaufen getreu einem populaeren rat des einstigen boersengurus andre kostolany wonach sich anleger aktien ins depot legen und dann ein paar jahre schlafen sollen werden die papiere in der folge eisern gehalten damit sie langfristig die erhoffte rendite bringen so zumindest die theorie experten zufolge koennte der zeitpunkt fuer ein value investment zurzeit besser kaum sein das ist ganz offensichtlich sagt etwa hendrik leber chef des value spezialisten acatis zu manager magazin online momentan bekommt man am aktienmarkt viel gute qualitaet fuer wenig geld leber haelt vor allem viele firmen der oel gas und energiebranche fuer attraktiv wie etwa die deutschen versorger eon und rwe oder die tschechische cez gleiches gilt fuer den industriezweig medizintechnik beispielsweise mit der firma medtronic die unter anderem implantate wie herzschrittmacher herstellt als prominentester und wohl auch erfolgreichster value investor weltweit gilt der us amerikanische multimilliardaer warren buffett chef der anlagefirma berkshire hathaway und einst schueler von benjamin graham dem urvater dieser anlagestrategie beide wussten +Wirtschaft de-DE url-pathpart-wirtschaft url-pathpart-news url-domainname-www.stern.de url-domainprefix-www url-domainprefix-www.stern url-domaintype-de url-domainsuffix-stern.de url-firstpartpagename-herabstufung-der-kreditwuerdigkeit-moodys-droht-frankreich-1739890 url-pagepartsplitname-herabstufung url-pagepartsplitname-der url-pagepartsplitname-kreditwuerdigkeit url-pagepartsplitname-moodys url-pagepartsplitname-droht url-pagepartsplitname-frankreich url-pagepartsplitname-1739890 url-lastpartpagename-html#utm_source=standard&utm_medium=rssfeed&utm_campaign=wirtschaft herabstufung der kreditwuerdigkeit die ratingagentur moody s prueft die herabstufung von frankreichs kreditwuerdigkeit innerhalb der kommenden drei monate werde moody s bewerten inwieweit die franzoesische regierung die angekuendigten massnahmen zur reduzierung des staatsdefizits umsetze erklaerte die ratingagentur am montag anhand dessen solle entschieden werden ob frankreich das derzeit mit der bestnote aaa bewertet wird noch die bedingungen fuer die perspektive stabil erfuelle neben moody s bewerten derzeit auch die beiden anderen grossen ratingagenturen standard poor s und fitch frankreich mit der bestnote diese ermoeglicht es dem land auf den internationalen finanzmaerkten unter guenstigen bedingungen kredite aufzunehmen sollte moody s zu dem ergebnis kommen dass die note mit einer negativen perspektive einhergeht waere frankreich nach den usa das zweite grosse land dessen kreditwuerdigkeit herabgestuft wird moody s betonte dass es sich bei der studie um eine routinemaessig einmal jaehrlich stattfindene ueberpruefung der finanzlage frankreichs handle die agentur ist aber die erste der drei grossen konkurrenten die die hoechstbewertung fuer frankreich infrage stellt im zusammenhang mit den massiven finanzproblemen der franzoesisch belgischen grossbank dexia hatte die ratingagentur anfang des monats noch die stabilitaet frankreichs betont waehrend sie belgien vor einer herabstufung seiner kreditwuerdigkeit gewarnt hatte +Wirtschaft de-DE url-pathpart-print url-pathpart-die url-pathpart-welt url-pathpart-finanzen url-pathpart-article13668414 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Finanzen-Kompakt url-pagepartsplitname-Finanzen url-pagepartsplitname-Kompakt url-lastpartpagename-html kompakt millionen gesetzlich versicherte sparen im kommenden jahr geld +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-der url-pathpart-staat url-pathpart-spekuliert url-pathpart-gegen url-pathpart-seine url-pathpart-buerger url-pathpart-485903 url-domainname-www.wiwo.de url-domainprefix-www url-domainprefix-www.wiwo url-domaintype-de url-domainsuffix-wiwo.de der staat spekuliert gegen seine buerger jeden tag ein neuer vorschlag zur rettung der welt zumindest aber der eu und des euros brot und spiele im alten rom zur befriedung der massen eingesetzt funktioniert auch im neuen deutschland es gibt viel zu verteilen inzwischen vergeht kein tag ohne neue vorschlaege zur rettung der welt vor dem finanziellen kollaps danach bemuehen die medien sich ganz schnell sie zu interpretieren bevor politiker und banker wieder etwas neues vorschlagen erkenntniswert tendenz gegen null worum es wirklich geht hat der philosoph peter sloterdijk schon vor einem jahr so formuliert +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-article13666843 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Die-zweifelhaften-Klima-Bilanzen-deutscher-Firmen url-pagepartsplitname-Die url-pagepartsplitname-zweifelhaften url-pagepartsplitname-Klima url-pagepartsplitname-Bilanzen url-pagepartsplitname-deutscher url-pagepartsplitname-Firmen url-lastpartpagename-html co2 emissionen mehr als 100 deutsche konzerne berichten ueber ihre co 2 emissionen daraus wird ein index fuer investoren erstellt doch der sinn des ganzen ist fraglich es ist ein unglaublicher aufwand +Unterhaltung de-DE url-pathpart-nachrichten url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-carreys-tochter-reicht-scheidung-1463234 url-pagepartsplitname-carreys url-pagepartsplitname-tochter url-pagepartsplitname-reicht url-pagepartsplitname-scheidung url-pagepartsplitname-1463234 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss jim carreys tochter reicht die scheidung ein nuernberg so hatte sich monika gruber ihren ersten auftritt bei wetten dass sicher nicht vorgestellt die kabarettistin wurde bei der samstagabend show opfer einer technsichen panne das war passiert +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-pathpart-article2063264 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Weniger-Faelle-von-sexuellem-Kindesmissbrauch url-pagepartsplitname-Weniger url-pagepartsplitname-Faelle url-pagepartsplitname-von url-pagepartsplitname-sexuellem url-pagepartsplitname-Kindesmissbrauch url-lastpartpagename-html weniger faelle von sexuellem kindesmissbrauch trotz der juengsten skandale ist die zahl der opfer zurueckgegangen offensichtlich zeigen missbrauchsopfer ihre peiniger haeufiger an berlin anders als die juengsten skandale nahe legen sind faelle von sexuellem kindesmissbrauch in den vergangenen jahren weniger geworden in einer repraesentativen befragung des kriminologischen forschungsinstituts niedersachsen leitung +Gesundheit de-DE url-pathpart-gesundheit url-pathpart-ratgeber url-pathpart-zukunftsmedizin url-pathpart-therapie url-pathpart-tid url-pathpart-9595 url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-ips-der-durchbruch-von-yamanaka_aid_295044 url-pagepartsplitname-ips url-pagepartsplitname-der url-pagepartsplitname-durchbruch url-pagepartsplitname-von url-pagepartsplitname-yamanaka url-pagepartsplitname-aid url-pagepartsplitname-295044 url-lastpartpagename-html risiken nebenwirkung das menschliche erbgut ist wie eine bibliothek die jeder einzelnen koerperzelle zur verfuegung steht doch die meisten koerperzellen lesen nur einzelne kapitel aus dem buch das zu ihrem organ oder gewebe gehoert ihr entwicklungspotenzial ist daher begrenzt biologisch hat das einen sinn denn je laenger eine zelle lebt desto eher haeuft sich fehlerhafter buchstabensalat an damit steigt zum beispiel das risiko fuer krebs embryonale stammzellen hingegen haben noch keine festgelegten lesevorlieben +Gesundheit de-DE url-pathpart-ratgeber url-pathpart-gesundheit url-pathpart-article1977416 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Bio-Bandscheiben-sollen-Rueckenschmerzen-lindern url-pagepartsplitname-Bio url-pagepartsplitname-Bandscheiben url-pagepartsplitname-sollen url-pagepartsplitname-Rueckenschmerzen url-pagepartsplitname-lindern url-lastpartpagename-html bio bandscheiben sollen rueckenschmerzen lindern washington kaputte bandscheiben wollen us forscher in zukunft mit biologischen implantaten ersetzen erste tests mit bio bandscheiben die aus zellen von schafen aufgebaut worden waren seien in versuchen mit ratten erfolgreich verlaufen die implantate ermoeglichten den tieren volle beweglichkeit und hatten sich nach sechs monaten fast wie natuerliche bandscheiben in die wirbelsaeule integriert schreiben die experten in den proceedings der us akademie der wissenschaften probleme mit den bandscheiben sind die hauptursache fuer schmerzen im ruecken und nackenbereich und verursachen enorme kosten schreiben die forscher in den meisten faelle wuerden die beschwerden konservativ mit physiotherapie und medikamenten behandelt auch operationen seien moeglich bei denen kaputte bandscheiben unter anderem durch mechanische implantate ersetzt werden koennen der medizinische nutzen solcher implantate sei unter fachleuten umstritten unabhaengig davon versagten aber viele implantate ihren dienst weil sie sich lockerten verrutschten oder einfach im laufe der zeit abnutzten die forscher um robby bowles von der cornell university in ithaca us staat new york testeten nun rein biologische bandscheiben implantate dazu erstellten sie zunaechst auf grundlage von computertomographie bildern eine art gussmodell der zu ersetzenden bandscheibe dieses modell nutzten sie dann um mit hilfe von zellen aus der bandscheibe von schafen ein implantat aufzubauen bandscheiben bestehen aus einem inneren wasserreichen gallertkern und einem aeusseren faserring diesen aufbau bildeten die wissenschaftler mit hilfe der unterschiedlichen zelltypen nach sie verpflanzten die bio bandscheibe dann in die schwanzwirbelsaeule von ratten nachdem den nagern dort die betreffende bandscheibe entfernt worden war das implantat liess sich gut in die luecke zwischen den wirbeln einpassen berichten die forscher nach sechs monaten stellen sie fest dass die hoehe der bio bandscheibe erhalten gelieben war und diese sich in die umliegenden wirbelkoerper integriert hatte die zellen hatten eine so genannte extrazellulaere matrix gebildet die sich in der biochemischen zusammensetzung von der natuerlicher bandscheiben kaum unterschied schreiben die forscher weiter auch die mechanischen eigenschaften des implantats also etwa die reaktion auf druckbelastungen aehnelten denen natuerlicher bandscheiben bevor solche bio bandscheiben beim menschen getestet werden koennen muessten viele fragen geklaert werden menschliche bandscheiben seien sehr viel groesser und die mechanischen anforderungen an ein implantat anders als im rattenschwanz ausserdem sei unklar wie das ersatzgewebe reagiere wenn es in ein entzuendetes umfeld implantiert werde die bandscheiben der ratten seien vor der implantation gesund gewesen bei patienten die eine neue bandscheibe benoetigten sei das nicht der fall zudem eigneten sich fuer anwendungen beim menschen keine schafszellen zur herstellung des implantats dpa +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,794069,00 url-pagepartsplitname-0,1518,794069,00 url-lastpartpagename-html#ref=rss minutenprotokoll angela merkel reist mit voller rueckendeckung des bundestages zum eu gipfel nach bruessel bei der abstimmung ueber die staerkung des euro rettungsschirms erreichte sie 503 stimmen und die kanzlermehrheit lesen sie im minutenprotokoll nach wie der tag im bundestag lief fuer kanzlerin angela merkel war es ein erfolgreicher tag im bundestag die erste huerde vor ihrer reise zum eu gipfel nach bruessel schaffte sie mit bravour nach einer turbulenten debatte erhielt der entschliessungsantrag der fraktionen von union fdp spd und gruenen 503 stimmen darunter 311 aus der regierungskoalition die kanzlermehrheit alle fraktionen bis auf die linke gaben damit ihre zustimmung fuer verhandlungen der euro laender ueber eine hoehere schlagkraft des rettungsfonds efsf damit ist merkel in bruessel voll verhandlungsfaehig am mittag hatte merkel mit einer leidenschaftlichen rede um unterstuetzung geworben +Wirtschaft de-DE url-pathpart-print url-pathpart-die url-pathpart-welt url-pathpart-finanzen url-pathpart-article13674828 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Dax-mit-Kurssprung-ins-Wochenende url-pagepartsplitname-Dax url-pagepartsplitname-mit url-pagepartsplitname-Kurssprung url-pagepartsplitname-ins url-pagepartsplitname-Wochenende url-lastpartpagename-html dax mit kurssprung ins wochenende die juengsten aussagen der ratingagentur fitch haben dem dax am freitag noch einmal einen kraeftigen schub gegeben der deutsche leitindex stand zum handelsende mit einem plus von 3 6 prozent bei 5970 punkten den vormittag ueber hatte er noch eher moderate gewinne verzeichnet auch mdax und tecdax zogen an der index mittelgrosser werte gewann 2 9 prozent auf 8956 punkte der technologieindex tecdax drehte zurueck ins plus und arbeitete sich um 1 6 prozent auf 690 punkte vor haendler verwiesen auf aussagen der ratingagentur fitch wonach sie keine rating aenderungen wegen des eu gipfels erwartet zudem wuerde eine starke eu loesung italien und spanien vor einer herabstufung schuetzen deutsche staatsanleihen gaben trotz schwindender erwartungen an den eu gipfel zur schuldenkrise nach der richtungweisende bund future sank bis zum abend um 60 ticks auf 134 63 punkte die rendite der zehnjaehrigen bundesanleihe kletterte auf 2109 prozent der kurs des euro erholte sich nach der veroeffentlichung des besser als erwartet ausgefallenen ifo geschaeftsklimas von anfaenglichen verlusten die europaeische gemeinschaftswaehrung wurde am abend mit 1 3882 us dollar gehandelt zuvor war der euro noch bis auf 1 3773 dollar gefallen favoriten im dax waren nach den kraeftigen vortagsverlusten die banktitel an der dax spitze verteuerten sich commerzbank um 7 4 prozent deutsche bank gewannen 6 9 prozent sie hatten zuvor am staerksten unter der unsicherheit mit blick auf den eu gipfel gelitten man verteuerten sich um 3 7 prozent laut einem handelsblatt bericht sollen sich mit vw man und ipic die eigner der essener ferrostaal am wochenende in paris zu einem gespraech ueber die loesung des konflikts treffen man will sich restlos von ferrostaal trennen an dem es noch 30 prozent haelt schwaecher als der markt entwickelten sich merck die von dem verzicht auf eine weiterentwicklung des parkinson medikaments safinamid belastet wurden die aktie gewann 0 9 prozent eine etwas schlechter als erwartet ausgefallene quartalsbilanz des franzoesischen triebwerkbauers safran belastete den deutschen triebwerksherstellers mtu aero engines dessen papiere gaben um 1 1 prozent nach +Unterhaltung de-DE url-pathpart-aktuelles url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-marion-cotillard-oben-ohne-bad-meer-tz-1446425 url-pagepartsplitname-marion url-pagepartsplitname-cotillard url-pagepartsplitname-oben url-pagepartsplitname-ohne url-pagepartsplitname-bad url-pagepartsplitname-meer url-pagepartsplitname-tz url-pagepartsplitname-1446425 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss marion cotillard nuernberg so hatte sich monika gruber ihren ersten auftritt bei wetten dass sicher nicht vorgestellt die kabarettistin wurde bei der samstagabend show opfer einer technsichen panne das war passiert +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-geldanlage url-pathpart-article13666921 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Neue-Regeln-zur-Honorarberatung-ziehen-sich-hin url-pagepartsplitname-Neue url-pagepartsplitname-Regeln url-pagepartsplitname-zur url-pagepartsplitname-Honorarberatung url-pagepartsplitname-ziehen url-pagepartsplitname-sich url-pagepartsplitname-hin url-lastpartpagename-html verbraucherschutz fruehestens 2012 sollen neue regeln fuer die honorarberatung kommen derzeit wird das eckpunkte papier von ministerin ilse aigner heiss diskutiert seit rund drei jahren setzt sich verbraucherschutzministerin ilse aigner csu mit ihrer qualitaetsoffensive verbraucherfinanzen fuer bessere informationen fuer bank und versicherungskunden ein im zuge dieser nach der lehman pleite gestarteten initiative sind etwa beratungsprotokolle und informationsblaetter eingefuehrt worden dennoch gibt es im anlegerschutz nach wie vor baustellen und man kann sich des eindrucks nicht erwehren dass den kunden nicht immer die besten produkte empfohlen werden sagt gitta connemann cdu in den vom verbraucherministerium im spaetsommer vorgelegten eckpunkten zur honorarberatung sieht sie den fehlenden baustein in einem grossen mosaik connemann ist mitglied des zustaendigen ausschusses fuer verbraucherschutz mit den neuen regeln zur honorarberatung will das verbraucherministerium den interessenskonflikt zwischen der kostenpflichtigen beratung im interesse des kunden und der vermeintlich kostenlosen provisionsgetrieben beratung entschaerfen so soll zum beispiel die steuerliche behandlung von honoraren mit der von provisionen gleichgestellt werden heute koennen beispielsweise bei lebens policen eingerechnete provisionen steuerlich geltend gemacht werden honorare aber nicht zudem sollen sich nur solche fachleute finanzberater nennen duerfen die eine ausreichende qualifikation nachweisen koennen sie muessen darlegen dass sie einen umfassenden marktueberblick haben und somit ueber kredite policen und anlageprodukte gewissenhaft beraten koennen das eckpunkte papier ist laut verbraucherschutzministerium derzeit in den beratungen zum weiteren zeitplan will man nichts sagen ich gehe davon aus dass da in diesem jahr nichts mehr kommt sagt hingegen lars gatschke vom verbraucherzentrale bundesverband vzbv das papier werde derzeit noch heiss diskutiert fuer die branche koennte es grosse veraenderungen mit sich bringen so werden produktanbieter kuenftig gezwungen sein nettotarife anzubieten oder die im produkt enthaltenen abschlusskosten offen zu legen sagt professor hans peter schwintowski der versicherungsexperte lehrt an der berliner humboldt universitaet schwintowski rechnet damit dass die neuen regeln zur honorarberatung den wettbewerbsdruck enorm steigern und kunden von deutlich guenstigeren tarifen profitieren wuerden +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-banken url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-sundp-ratingagentur-knoepft-sich-italienische-banken-vor-wachstumsprognose-gekuerzt_aid_667781 url-pagepartsplitname-sundp url-pagepartsplitname-ratingagentur url-pagepartsplitname-knoepft url-pagepartsplitname-sich url-pagepartsplitname-italienische url-pagepartsplitname-banken url-pagepartsplitname-vor url-pagepartsplitname-wachstumsprognose url-pagepartsplitname-gekuerzt url-pagepartsplitname-aid url-pagepartsplitname-667781 url-lastpartpagename-html s p ratingagentur knoepft sich italienische banken vor wachstumsprognose gekuerzt die lage fuer die italienische wirtschaft wird immer verfahrener +Gesundheit de-DE url-pathpart-gesundheit url-pathpart-ratgeber url-pathpart-gehirn url-pathpart-news url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-psoriasis-und-multiple-sklerose-heilungschancen-fuer-autoimmunkrankheiten_aid_676425 url-pagepartsplitname-psoriasis url-pagepartsplitname-und url-pagepartsplitname-multiple url-pagepartsplitname-sklerose url-pagepartsplitname-heilungschancen url-pagepartsplitname-fuer url-pagepartsplitname-autoimmunkrankheiten url-pagepartsplitname-aid url-pagepartsplitname-676425 url-lastpartpagename-html psoriasis und multiple sklerose heilungschancen fuer autoimmunkrankheiten es war wie verhext +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,791359,00 url-pagepartsplitname-0,1518,791359,00 url-lastpartpagename-html#ref=rss slowakisches nein zum efsf das slowakische nein zum rettungsschirm efsf bringt bruessel in die bredouille die zukunft der euro zone liegt nun in den haenden der opposition in bratislava die europaeischen sozialisten wollen ihren parteifreunden ein ja fuer die zweite abstimmung abringen die zeit draengt berlin eigentlich haette laengst alles im lot sein sollen mit dem ja zum efsf waere die slowakei das 17 und letzte land der euro zone gewesen das gruenes licht fuer den erweiterten rettungsschirm efsf gegeben haette doch nun steckt sand im getriebe was die schwarz gelbe koalition in berlin vor zwei wochen im groessten und wirtschaftlich staerksten land der euro zone zustande brachte scheiterte in der kleinen slowakei in bratislava zerbrach in der nacht die christlich liberale koalition an der abstimmung ueber den efsf die euro kritische partei freiheit und liberalitaet sas verweigerte die zustimmung ministerpraesidentin iveta radicova muss wohl bald bei neuwahlen antreten selbst die vertrauensfrage hatte der resoluten politikerin nichts genuetzt nun blicken radicova und die anderen 16 regierungs und staatschefs der euro zone auf die opposition sie soll helfen die verfahrene lage doch noch zu loesen die gespraeche zwischen der amtierenden regierung und der sozialdemokratischen smer sollen noch am mittwoch beginnen am donnerstag koennte in bratislava die zustimmung zum efsf dann stehen dabei sollen so der plan drei der vier bisherigen regierungsparteien gemeinsam mit den sozialdemokraten fuer den efsf stimmen der fraktionschef der sozialisten im europaparlament martin schulz ist optimistisch er haelt kontakt zu robert fico dem vorsitzenden der slowakischen sozialdemokraten fico habe ihm zugesagt so schulz dem schirm bei der kommenden abstimmung sein ja zu geben die zeit draengt denn am 23 oktober ist der ohnehin schon einmal verschobene eu gipfel angesetzt auf dem die staats und regierungschefs eine reihe weiterer wichtiger entscheidungen zum euro treffen wollen bei dieser gelegenheit will man auch die zustimmung aller mitglieder der euro gruppe zum efsf vorweisen durchkreuzt bratislava den zeitplan steht die eu vor einer tiefen krise abwarten nur keine panik das ist die tonlage der bundeskanzlerin angela merkel gab sich auf ihrer asienreise optimistisch ich bin sehr gewiss dass wir bis zum 23 oktober alle unterschriften aller mitgliedsstaaten unter diesem efsf haben werden sagte die cdu politikerin in ho chi minh stadt ihr vizekanzler philipp roesler sagte +Gesundheit de-DE url-pathpart-~r url-pathpart-rp url-pathpart-online url-pathpart-rss url-pathpart-gesundheit url-pathpart-~3 url-pathpart-ZmonvsoEvHM url-domainname-feeds.rp-online.de url-domainprefix-feeds url-domainprefix-feeds.rp-online url-domaintype-de url-domainsuffix-rp-online.de url-firstpartpagename-story01 url-pagepartsplitname-story01 url-lastpartpagename-htm hormonelle verhuetungsmethoden im ueberblick langfristige verhuetung mit hormonen hormonelle verhuetungsmethoden enthalten das hormon gestagen das den eisprung hemmt und den schleimpfropf der sich am gebaermutterhals befindet verdickt durch diese verdickung ist es fuer die spermien fast unmoeglich in die gebaermutter zu gelangen und eine schwangerschaft auszuloesen fuer frauen die es leid sind taeglich die pille einzunehmen um zu verhueten sind hormonelle methoden deshalb praktisch +Wirtschaft de-DE url-pathpart-wirtschaft url-pathpart-versicherung url-domainname-www.stern.de url-domainprefix-www url-domainprefix-www.stern url-domaintype-de url-domainsuffix-stern.de url-firstpartpagename-gerichtsurteil-zu-provisionen-weg-frei-fuer-discount-versicherungen-1743503 url-pagepartsplitname-gerichtsurteil url-pagepartsplitname-zu url-pagepartsplitname-provisionen url-pagepartsplitname-weg url-pagepartsplitname-frei url-pagepartsplitname-fuer url-pagepartsplitname-discount url-pagepartsplitname-versicherungen url-pagepartsplitname-1743503 url-lastpartpagename-html#utm_source=standard&utm_medium=rssfeed&utm_campaign=wirtschaft gerichtsurteil zu provisionen dieses gerichtsurteil koennte das gaengige geschaeftsmodell fuer lebensversicherungen ins wanken bringen +Wirtschaft de-DE url-pathpart-wirtschaft url-pathpart-unternehmen url-domainname-www.spiegel.de url-domainprefix-www url-domainprefix-www.spiegel url-domaintype-de url-domainsuffix-spiegel.de url-firstpartpagename-0,1518,792387,00 url-pagepartsplitname-0,1518,792387,00 url-lastpartpagename-html#ref=rss rohstoffspekulation die verbraucherorganisation foodwatch attackiert die banken +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-pathpart-article13661288 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Machtkampf-um-den-braunen-Thron-der-NPD url-pagepartsplitname-Machtkampf url-pagepartsplitname-um url-pagepartsplitname-den url-pagepartsplitname-braunen url-pagepartsplitname-Thron url-pagepartsplitname-der url-pagepartsplitname-NPD url-lastpartpagename-html parteitag auf dem parteitag der npd wird es zu einer kampfkandidatur um den vorsitz kommen doch der richtungsstreit unter den rechtsextremen ist nur gezeter ueber die fassade frueher wollte er gefuerchtet werden als holger apfel sich 2004 erstmals anschickte bundesweit gehoer zu finden bellte er in die mikros der fraktionschef der gerade in den saechsischen landtag eingezogenen npd redete sich in rage seine stimme ueberschlug sich rasch und seine haut fleckte das war einmal heute will holger apfel ganz nach oben dafuer gibt er sich nun dezent zahlreiche parteifreunde aus vielen landesverbaenden haetten ihn zur kandidatur gedraengt liess er vor drei wochen verbreiten der 40 jaehrige will seinen politischen ziehvater udo voigt auf dem anstehenden bundesparteitag vom chefposten vertreiben wo und wann das halten die parteimanager geheim und der geborene hildesheimer macht auf laessig heute schuetzt er seine stimme leise vor den salti die rechte hand in der hosentasche laechelt er viel serioes will er wirken die npd hort der unverbesserlichen der nsdap juenger und hitler verehrer will er an den erfolg rechtsnationaler parteien rund um deutschland heranfuehren dafuer muesse sie sich als eine zukunftsgewandte nationale partei mit serioeser radikalitaet im politischen spektrum einordnen hat er formuliert serioese radikalitaet bedeutet konstruktiv gegenwartsbezogen und volksnah zu sein unpolitische nostalgiepflege und ziellosen verbalradikalismus will er von der agenda streichen die zukunft der npd sieht er als anti euro partei als magnet konservativer globalisierungsgegner auf dem bundesparteitag wird es daher eine echte kampfkandidatur geben udo voigt seit 15 jahren unangefochten im amt muss den fraktionschef apfel fuerchten zumal der mit udo pastoers fraktionschef der npd im schweriner landtag eine achse geschmiedet hat voigt seinerseits ist bei den westdeutschen landesverbaenden gut vernetzt der 59 jaehrige wird um seinen posten kaempfen pattex udo nennen sie ihn in der partei schon seit langem was es indes auf dem parteitag nicht geben wird ist ein machtkampf der programme apfels serioese radikalitaet ist der spagat eine neonazi partei fuer die oeffentlichkeit in freundlicheren farben zu zeichnen doch der braunton wird weiter durchschimmern inhaltlich trennt voigt und apfel kein blatt voneinander beide haben die partei fuer soziale themen und die neonazistischen kameradschaften geoeffnet beide sind seit ihrer jugend fuer die npd aktiv fuer beide war es nicht die frage ob sie parteichef werden sondern wann eine moderne rechtspartei wird die npd nie apfels buergerliches auftreten ist wunschdenken und kalkulierte fassade eine moderne rechtspartei wird die npd nie ihr fehlt die inhaltliche flexibilitaet populistischer parteien in den nachbarlaendern ihre dehnbarkeit dafuer hat die npd jede menge ideologie ein besuch in ihrer zentrale in berlin koepenick belegt dies mit jedem schritt duester ist es dort die waende haben seit jahren keine neue farbe gesehen die knarzende holztreppe hinauf laesst man die kapuzenpullitraeger hinter sich die im erdgeschoss verschlissene wahlplakate stapeln ab dem ersten stock traegt man hemd und stoffhose mit buegelfalte schliesslich sehen sich die leute von der npd im kampf um sein oder nichtsein des deutschen volkes wir stehen an der spitze dieser erneuerung schreiben sie im programm kein gespraech in der parteizentrale ohne ueberfremdung und verauslaenderung florian stein sitzt am computer in seinem buero gegenueber der kueche das frontfenster ist vergittert der 28 jaehrige ist fuer die mitgliederverwaltung zustaendig er sagt unvermittelt +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-news url-pathpart-konjunktur url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-deutsche-konjunktur-bundesregierung-erwartet-nur-noch-zwergen-wachstum_aid_676479 url-pagepartsplitname-deutsche url-pagepartsplitname-konjunktur url-pagepartsplitname-bundesregierung url-pagepartsplitname-erwartet url-pagepartsplitname-nur url-pagepartsplitname-noch url-pagepartsplitname-zwergen url-pagepartsplitname-wachstum url-pagepartsplitname-aid url-pagepartsplitname-676479 url-lastpartpagename-html deutsche konjunktur bundesregierung erwartet nur noch zwergen wachstum der boom der deutschen wirtschaft geht dem ende zu die regierung rechnet fuer kommendes jahr nur noch mit einem plus von 1 0 prozent bislang hatte sie fast doppelt so viel vorausgesagt doch es gibt auch eine gute nachricht die bundesregierung erwartet angesichts zunehmender weltweiter risiken einen daempfer fuer den aufschwung in deutschland fuer das kommende jahr wird statt bisher 1 8 prozent ein wachstum von 1 0 prozent prognostiziert wie bundeswirtschaftsminister philipp roesler fdp am donnerstag in berlin mitteilte fuer dieses jahr geht die regierung noch von einem staerkeren wachstum von 2 9 prozent aus auch wenn sich das expansionstempo nun wie erwartet verlangsamt habe bleibe deutschland stabilitaetsanker und wachstumsmotor fuer europa erklaerte roesler tragender pfeiler der entwicklung in deutschland werde zusehends die binnennachfrage der export schwaeche sich ab roesler sagte +Wirtschaft de-DE url-pathpart-wirtschaft url-pathpart-news url-domainname-www.stern.de url-domainprefix-www url-domainprefix-www.stern url-domaintype-de url-domainsuffix-stern.de url-firstpartpagename-eu-gipfel-zur-euro-krise-mittwoch-banken-solls-was-geben-1742231 url-pagepartsplitname-eu url-pagepartsplitname-gipfel url-pagepartsplitname-zur url-pagepartsplitname-euro url-pagepartsplitname-krise url-pagepartsplitname-mittwoch url-pagepartsplitname-banken url-pagepartsplitname-solls url-pagepartsplitname-was url-pagepartsplitname-geben url-pagepartsplitname-1742231 url-lastpartpagename-html#utm_source=standard&utm_medium=rssfeed&utm_campaign=wirtschaft eu gipfel zur euro krise es war eine demonstration angela merkel und nicolas sarkozy traten gemeinsam vor die journalisten in bruessel dicke luft herrschte dort schon deswegen weil die reporter fast zwei stunden lang in erwartung des deutsch franzoesischen duos zusammengepfercht waren die atemnot entlud sich in verbittertem beifall fuer den praesidenten und die kanzlerin die gemeinsam mit den anderen 25 eu regierenden erst um 16 28 das mittagessen beendeten fuer merkel und sarkozy ging es darum zu zeigen dass man keineswegs so zerstritten sei wie nun schon seit tagen berichtet wird ich werde ihnen nicht erlauben zu schreiben dass die sache gescheitert ist sagte sarkozy den journalisten angesichts eines akuten mangels an entscheidungen und auch merkel bat eher um nachsicht +Gesundheit de-DE url-pathpart-ratgeber url-pathpart-article2038045 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Ab-35-regelmaessig-zum-TUeV-eine-Bestandsaufnahme url-pagepartsplitname-Ab url-pagepartsplitname-35 url-pagepartsplitname-regelmaessig url-pagepartsplitname-zum url-pagepartsplitname-TUeV url-pagepartsplitname-eine url-pagepartsplitname-Bestandsaufnahme url-lastpartpagename-html ab 35 regelmaessig zum tuev eine bestandsaufnahme hamburg kerngesunde menschen mitte 30 denken nicht an den arzt sagt stephan hofmeister allgemeinmediziner und hausarzt aus hamburg dabei haben alle gesetzlich versicherten ab dem alter von 35 jahren anspruch zu einer frueherkennungsuntersuchung dem check up 35 und das bevor gesundheitliche beschwerden auftreten alle zwei jahre kann dieser gesundheits tuev wiederholt werden vergleichsweise junge leute kommen aber in der regel nur zu diesem check up wenn sie kinder bekommen oder einen hohen kredit fuer einen hausbau aufnehmen wollen und maenner kommen oft weil ihre partnerin sie schickt berichtet hofmeister aus der praxis zahlen aus niedersachsen zeigen dass nur 26 prozent der berechtigten frauen und 27 prozent der maenner das angebot nutzen in hamburg duerfte die zahl in etwa genauso liegen doch was verbirgt sich hinter diesem check up 35 der zu den sogenannten vorsorge oder frueherkennungsuntersuchungen gehoert die untersuchung ist genau definiert sagt hofmeister stellvertretender vorsitzender der vertreterversammlung der kassenaerztlichen vereinigung hamburg neben einem ausfuehrlichen gespraech ueber vorerkrankungen lebensfuehrung und krankheiten in der familie gehoert eine koerperliche untersuchung mit dem abhorchen von lunge und herz dazu der arzt tastet auch ob der patient vergroesserte lymphknoten eine zu grosse schilddruese oder vergroesserte organe im bauchraum hat auch das gewicht wird ermittelt und der blutdruck gemessen eine blutprobe gehoert ebenfalls dazu zwei werte werden bestimmt +Unterhaltung de-DE url-pathpart-nachrichten url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-lena-geschockt-ihrem-ersten-steuerbescheid-zr-1458344 url-pagepartsplitname-lena url-pagepartsplitname-geschockt url-pagepartsplitname-ihrem url-pagepartsplitname-ersten url-pagepartsplitname-steuerbescheid url-pagepartsplitname-zr url-pagepartsplitname-1458344 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss lena war geschockt von ihrem ersten steuerbescheid lena meyer landrut mag keine behoerdengaenge und beschaeftigt sich nicht gerne mit steuerbescheiden und versicherungen solche pflichtgaenge finde ich unfassbar anstrengend und belastend vor allem weil das sachen sind die konsequenzen haben wenn ich sie nicht erledige sagte die 20 jaehrige gewinnerin des eurovision song contest 2010 dem berliner tagesspiegel als sie ihren ersten steuerbescheid bekommen habe sei sie geschockt gewesen ich habe abzuege von etwa 43 prozent oh doch so viel habe ich gedacht und dann gleich die frist verpasst da musste ich mahngebuehren zahlen +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-news url-pathpart-unternehmen url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-bankbranche-citigroup-trotzt-der-schuldenkrise_aid_675473 url-pagepartsplitname-bankbranche url-pagepartsplitname-citigroup url-pagepartsplitname-trotzt url-pagepartsplitname-der url-pagepartsplitname-schuldenkrise url-pagepartsplitname-aid url-pagepartsplitname-675473 url-lastpartpagename-html bankbranche citigroup trotzt der schuldenkrise der umbau der us bank citigroup nach der beinahe pleite in der finanzkrise macht sich offenbar bezahlt +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-pathpart-tid url-pathpart-23842 url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-nach-brandanschlag-in-berlin-polizei-hat-angst-vor-einer-neuen-raf_aid_673445 url-pagepartsplitname-nach url-pagepartsplitname-brandanschlag url-pagepartsplitname-in url-pagepartsplitname-berlin url-pagepartsplitname-polizei url-pagepartsplitname-hat url-pagepartsplitname-angst url-pagepartsplitname-vor url-pagepartsplitname-einer url-pagepartsplitname-neuen url-pagepartsplitname-raf url-pagepartsplitname-aid url-pagepartsplitname-673445 url-lastpartpagename-html nach brandanschlag in berlin polizei hat angst vor einer neuen raf zu den anschlaegen auf die bahn bekennt sich eine gruppe von linksextremisten bisher ist die gruppe komplett unbekannt doch beide polizei gewerkschaften nehmen das bekennerschreiben zum anlass fuer drastische warnungen nach den brandanschlaegen in berlin waehlt der chef der polizeigewerkschaft rainer wendt einen drastischen historischen vergleich wir erleben eine renaissance der rote armee fraktion sagte er gegenueber bild de es wird neue strukturen geben dezentral sehr viel lockerer mit einzelnen kleine gruppen der linke terror wird sich noch steigern unterstuetzung erhaelt wendt von seinem kollegen der gewerkschaft der polizei bernhard witthaut er fordert mehr personal fuer verfassungsschutz und polizeilichen staatsschutz die politik muesse die warnungen des verfassungsschutzes ernst nehmen auch der raf terror hat mit der verharmlosenden sogenannten gewalt gegen sachen begonnen spaeter wurden menschen ermordet mit brandsaetzen in berlin und brandenburg hatten mutmasslich linksextreme am montag den zugverkehr rund um die hauptstadt stark beeintraechtigt am berliner hauptbahnhof waere es um ein haar zu einem womoeglich folgenschweren anschlag gekommen ein mitarbeiter entdeckte die sieben brandsaetze in einem tunnel bevor sie explodieren konnten auf freier strecke nordwestlich von berlin zuendete jedoch ein brandsatz in einem schacht fuer signalkabel und kappte so die wichtige verbindung nach hamburg tausende reisende und pendler werden deshalb auch am dienstag von verspaetungen und zugausfaellen betroffen sein in einem bekennerschreiben protestiert eine linksextreme gruppe im internet gegen den bundeswehreinsatz in afghanistan das landeskriminalamt lka brandenburg haelt das bekennerschreiben nach einer vorlaeufigen bewertung fuer authentisch bundesverkehrsminister peter ramsauer csu verurteilte die brandanschlaege das leben unbeteiligter pendler familien und kinder zu gefaehrden ist keine meinungsaeusserung sondern ein anschlag auf unsere gesellschaft sagte ramsauer der tageszeitung die welt vom dienstag die verantwortlichen wuerden mit aller haerte verfolgt und zur rechenschaft gezogen verletzt wurde bei den anschlaegen niemand moeglicherweise auch weil die bahn ihr personal nach dem anschlag in brandenburg am fruehen morgen auf zusaetzliche kontrollgaenge schickte an der noerdlichen tunneleinfahrt zum hauptbahnhof entdeckte ein mitarbeiter hinter einem trafo haus am mittag sieben brandsaetze in einem kabelschacht spezialisten machten die behaelter mit brennbaren fluessigkeiten rechtzeitig unschaedlich doch die haetten extrem gefaehrlich sein koennen die sprengsaetze haetten enormen schaden anrichten koennen die tunneleinfahrt am hauptbahnhof liegt gut 200 meter vom bahnhof selbst entfernt der nicht gesperrt wurde +Wirtschaft de-DE url-pathpart-artikel url-domainname-www.neues-deutschland.de url-domainprefix-www url-domainprefix-www.neues-deutschland url-domaintype-de url-domainsuffix-neues-deutschland.de url-firstpartpagename-208813 url-pagepartsplitname-208813 url-lastpartpagename-html freund freund wirtschaftsmacht russlands premier wladimir putin nannte den vorsitzenden der volksrepublik china einen teuren freund und der betonte dass sein gast ein grosser freund des chinesischen volkes sei doch nicht nur um artigkeiten geht es bei dem arbeitsbesuch des ersten mannes russlands in peking zwischen januar und august 2011 war china der wichtigste aussenhandelspartner russlands doch um den usa und europa auf wissenschaftlichem und wirtschaftlichen gebiet ein ernster konkurrent zu sein reicht das und beider reichtum an bodenschaetzen nicht aus man will die wirtschaftliche und wissenschaftliche zusammenarbeit auf eine neue ebene die der schluesseltechnologien heben die vorstellungen ueber gemeinsame projekte in der luft und raumfahrt sowie beim schiffbau sind weit gediehen bislang so putin habe man sich beim kauf neuer zivilflugzeuge immer an us amerikanische und westeuropaeische hersteller gehalten aber russland und china seien durchaus in der lage eigene produktionslinien aufzubauen angesprochen wurde der schon laenger anvisierte bau eines gemeinsamen transportflugzeuges die beiderseits geschaetzte russische il 76 ist dabei ein gutes ausgangsmodell putin hatte in den vergangenen jahren bereits eine neuordnung des russischen flugzeugbaus verlangt auch um aus diesem bereich impulse fuer die entwicklung anderer industriebereiche zu erhalten nun versucht er dieses vorhaben bilateral auszubauen und hat einen ueber russland und china hinausgehenden gigantischen absatzmarkt vor augen was moeglich ist zeigt die zusammenarbeit auf militaerischem gebiet der austausch in diesem jahr liegt derzeit geschaetzt bei rund einer milliarde us dollar als schluessel fuer gemeinsamen fortschritt wird auch der energiebereich betrachtet gestuetzt auf gemeinsame erfahrungen beim bau des chinesischen atomkraftwerks tianwan werde man eine engere kooperation bei der nukleartechnik ermoeglichen auf der grundlage modernster technologien und unter beruecksichtigung der eventuellen risiken die praktisch auf den nullpunkt gebracht werden muessen so putin gleichfalls im programm ist der ausbau von stromerzeugung aus wasserkraft und sogenannten alternativen quellen auch auf dem agrarsektor will man kuenftig enger kooperieren um bestehende handels und investitionshindernisse abzubauen verstaendigten sich beide seiten auf eine aktivere nutzung von yuan und rubel bei den bilateralen verrechnungen +Unterhaltung de-DE url-pathpart-nachrichten url-pathpart-stars url-portnumber-80 url-domainname-www.tz-online.de url-domainprefix-www url-domainprefix-www.tz-online url-domaintype-de url-domainsuffix-tz-online.de url-hasarguments- url-firstpartpagename-nicolas-cage-sachsen-anhalt-kamera-1452360 url-pagepartsplitname-nicolas url-pagepartsplitname-cage url-pagepartsplitname-sachsen url-pagepartsplitname-anhalt url-pagepartsplitname-kamera url-pagepartsplitname-1452360 url-lastpartpagename-html url-argname-cmp url-argvalue-defrss url-argvaluesplit-defrss nicolas cage in sachsen anhalt vor kamera nuernberg so hatte sich monika gruber ihren ersten auftritt bei wetten dass sicher nicht vorgestellt die kabarettistin wurde bei der samstagabend show opfer einer technsichen panne das war passiert +Gesundheit de-DE url-pathpart-allergie url-pathpart-aktuelles url-domainname-www.stern.de url-domainprefix-www url-domainprefix-www.stern url-domaintype-de url-domainsuffix-stern.de url-firstpartpagename-lebensmittelallergie-forscher-tricksen-immunsystem-aus-1738501 url-pagepartsplitname-lebensmittelallergie url-pagepartsplitname-forscher url-pagepartsplitname-tricksen url-pagepartsplitname-immunsystem url-pagepartsplitname-aus url-pagepartsplitname-1738501 url-lastpartpagename-html#utm_source=standard&utm_medium=rssfeed&utm_campaign=gesundheit lebensmittelallergie bei einer nahrungsmittelallergie loesen auch kleinste bestandteile bestimmter lebensmitteln heftige auch lebensgefaehrliche immunreaktionen aus jetzt konnten amerikanische mediziner in versuchen mit maeusen mithilfe eines neuartigen verfahrens solche allergischen reaktionen auf erdnuesse abschalten sie koppelten erdnussproteine an weisse blutkoerperchen die den tieren anschliessend injiziert wurden nach nur zweimaliger behandlung hatte das immunsystem der maeuse gelernt mit der nahrung aufgenommene erdnuesse zu tolerieren wie die forscher an einem anderen beispiel zeigen konnten eignet sich die technik auch zur therapie anderer allergieformen schreiben sie im fachblatt journal of immunology wir glauben dass wir einen weg gefunden haben um die allergischen reaktionen bei nahrungsmittelallergien sicher und schnell abzuschalten sagt paul bryce von der northwestern university feinberg school of medicine in chicago der zusammen mit stephen miller das forscherteam leitete fuer ihre experimente hatten die wissenschaftler maeuse mit einer starken erdnussallergie erzeugt der verzehr der nuesse loeste ueberschiessende immunreaktionen aus die einen oft toedlich verlaufenden anaphylaktischen schock zur folge hatten die forscher entnahmen dem blut der maeuse weisse blutkoerperchen sogenannte leukozyten und hefteten daran erdnussproteine die fuer die allergische reaktion verantwortlich sind die so veraenderten leukozyten wurden den maeusen dann wieder injiziert nach einer erneuten behandlung auf dieselbe weise erhielten die tiere erdnussextrakt mit der nahrung der anaphylaktische schock blieb nun aus das immunsystem tolerierte das erdnussprotein weil das protein zuvor bereits von den weissen blutkoerperchen praesentiert wurde sagt bryce er haelt es fuer moeglich mehr als nur eine art von proteinen an die leukozyten zu koppeln so dass auch therapien gegen mehrfache nahrungsmittelallergien denkbar waeren durch die behandlung so bryce wuerde das gestoerte gleichgewicht zwischen zwei typen von immunzellen den aggressiven th2 t zellen und den daempfenden regulatorischen t zellen wiederhergestellt das verfahren erwies sich auch bei einer anderen form der allergie als wirksam bei der ein protein aus eiern asthmaartige anfaelle ausloest in weiteren experimenten pruefen die forscher nun ob sich die leukozyten durch kuenstliche mikropartikel ersetzen lassen solche partikel als traeger von allergie ausloesenden proteinen liessen sich leichter auf standardisierte weise herstellen +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-pathpart-article2059094 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Medien-Fahnder-planen-Aktion-gegen-Steuerfluechtlinge url-pagepartsplitname-Medien url-pagepartsplitname-Fahnder url-pagepartsplitname-planen url-pagepartsplitname-Aktion url-pagepartsplitname-gegen url-pagepartsplitname-Steuerfluechtlinge url-lastpartpagename-html medien derzeit sollen die daten von 3000 steuersuendern ueberprueft werden es handelt sich dabei um eine cd die das land nrw 2010 gekauft hatte hamburg bochum deutschen steuerfluechtlingen mit schwarzgeld in luxemburg droht aerger denn steuerfahnder und staatsanwaltschaften aus dem gesamten bundesgebiet bereiten angebliche eine gross angelegte aktion gegen mutmassliche steuersuender vor der spiegel berichtete am donnerstag vorab die ermittler untersuchten daten von einer cd aus luxemburg die das land nrw vor einem jahr fuer vier millionen euro angekauft habe wuppertaler steuerfahnder und die schwerpunktstaatsanwaltschaft fuer wirtschaftskriminalitaet in bochum sollen derzeit daten von etwa 3 000 steuersuendern pruefen in den fokus der ermittler seien kunden einer tochter der britischen grossbank hsbc in luxemburg geraten die bochumer staatsanwaltschaft gab auf nachfrage keine stellungnahme ab die financial times deutschland bezifferte den kaufpreis fuer die cd auf knapp drei millionen euro dafuer enthalte der datentraeger genaue informationen ueber schwarzkonten in luxemburg die eindeutig deutschen hsbc kunden zuzuordnen seien dem bericht zufolge ist fuer november eine razzia geplant die zeitung berichtete unter berufung auf behoerdenkreise der datensatz sei ausserordentlich gross das material erstklassig dadurch dass die ermittlungen im gang seien haetten die steuersuender auch keine chance mehr der strafe durch eine selbstanzeige zu entgehen es wird erwartet dass die cd etliche millionen euro in die staatskasse spuelt dapd +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-news url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-anti-banken-proteste-polizei-raeumt-zeltlager-von-demonstranten_aid_678189 url-pagepartsplitname-anti url-pagepartsplitname-banken url-pagepartsplitname-proteste url-pagepartsplitname-polizei url-pagepartsplitname-raeumt url-pagepartsplitname-zeltlager url-pagepartsplitname-von url-pagepartsplitname-demonstranten url-pagepartsplitname-aid url-pagepartsplitname-678189 url-lastpartpagename-html anti banken proteste polizei raeumt zeltlager von demonstranten zeugen beklagen ein skandaloeses vorgehen der kalifornischen polizei in der innenstadt von oakland der bewegung occupy wall street zufolge sind bei der raeumung eines zeltlagers 70 menschen festgenommen worden bei den anti banken protesten im kalifornischen oakland sind am dienstag dutzende menschen festgenommen worden nach us medienberichten liess die polizei ein zeltlager in der innenstadt raeumen die demonstranten die mehr als zwei wochen vor dem rathaus campierten hatten ein ultimatum zur raeumung des platzes ignoriert die gruppe occupy oakland sprach in einer twitter mitteilung am dienstag von 70 festnahmen ich zelte nicht ich demonstriere was hier heute passiert ist skandaloes sagte die protestlerin mindy stone nach ihrer festnahme dem san francisco chronicle die stadtverwaltung hatte sich zuvor ueber sanitaere probleme angeblichen drogenmissbrauch und ausschreitungen in dem zeltlager beschwert die bewegung occupy wall street besetzt die wall street hatte im september in new york ihren ausgang genommen und sich auf andere staedte ausgeweitet die menschen wollen die macht der banken brechen verlangen hoehere steuern fuer reiche und verbesserungen im sozialsystem +Unterhaltung de-DE url-pathpart-kultur url-pathpart-kunst url-pathpart-2011 url-pathpart-10 url-domainname-www.zeit.de url-domainprefix-www url-domainprefix-www.zeit url-domaintype-de url-domainsuffix-zeit.de url-firstpartpagename-lehrjahre-eines-dissidenten url-pagepartsplitname-lehrjahre url-pagepartsplitname-eines url-pagepartsplitname-dissidenten ai weiwei ausstellung der berliner martin gropius bau zeigt fotografien des chinesischen kuenstlers ai weiwei aus dessen zeit in new york sie dokumentieren die anfaenge einer grossen karriere er ist frei und ist es nicht seit ai weiwei chinas bekanntester kuenstler am 22 juni aus 80 taegiger haft entlassen wurde darf er sich nicht politisch aeussern darf peking nicht verlassen und schon gar nicht ins ausland reisen der fall ai weiwei ist neben dem inhaftierten friedensnobelpreistraeger liu xiaobo das aktuell gravierendste beispiel der drangsalierung von chinesischen dissidenten museen koennen daran kaum etwas aendern aber sie koennen erinnern und mahnen indem sie ais werke zeigen die nach ihrer premiere in peking 2009 nun aus new york in den gropius bau wandernde ausstellung mit ueber 220 fotografien aus ai weiweis new yorker zeit von 1983 bis 1993 hat der kuenstler selbst kuratiert und aus 10 000 fotos eine auswahl getroffen der bei seiner ankunft 25 jaehrige bewohnte eine winzige bleibe im east village er wollte eigentlich studieren trieb sich aber auf der strasse und in der avantgarde szene herum er schrieb gleichsam tagebuch mit der kamera fing schnappschuesse vom aufbruch ein dokumentierte die eigenen kuenstlerischen anfaenge in echtzeit +Deutschland de-DE url-pathpart-politik url-pathpart-article2052122 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Buschkowsky-Halte-Entwicklung-fuer-komfortabler url-pagepartsplitname-Buschkowsky url-pagepartsplitname-Halte url-pagepartsplitname-Entwicklung url-pagepartsplitname-fuer url-pagepartsplitname-komfortabler url-lastpartpagename-html buschkowsky berlin der neukoellner bezirksbuergermeister heinz buschkowsky spd hat die angekuendigten koalitionsgespraeche seiner partei mit der cdu begruesst zur begruendung sagte der spd politiker am freitag im rbb sender radioeins mit der union gebe es nicht wie mit den gruenen von vornherein konfliktpunkte wie die verlaengerung der a 100 er mache keinen hehl daraus dass er die entwicklung jetzt fuer komfortabler halte auch mit blick auf die politische mehrheit ueber einen zeitraum von fuenf jahren mit der cdu sieht er in weiteren wesentlichen punkten wie der s bahn problematik und der erweiterung des flughafens berlin brandenburg uebereinstimmungen unterschiedliche sichtweisen koennte es nach buschkowskys einschaetzung in der schulpolitik beim rueckkauf der wasserbetriebe und bei der frage geben wie viele staedtische wohnungen berlin sich zulegen sollte um mietsteigerungen zu verhindern berlins spd und cdu beginnen kommenden mittwoch koalitionsgespraeche spd und cdu in berlin wollen naechsten mittwoch mit ihren verhandlungen zur bildung einer grossen koalition beginnen der cdu fraktions und landesparteivorsitzende frank henkel sagte am donnerstag in der rbb abendschau dies habe er mit seinem spd kollegen michael mueller und dem regierenden buergermeister klaus wowereit spd am abend bei einem treffen im abgeordnetenhaus vereinbart wowereit spd sieht in der grossen koalition kein hindernis fuer ein rot gruenes buendnis auf bundesebene nach der bundestagswahl 2013 die koalitionsverhandlungen zwischen spd und gruenen waren am mittwoch im streit ueber die verlaengerung der autobahn 100 gescheitert die cdu die das projekt mittraegt war aus der abgeordnetenhauswahl mitte september nach der spd als zweitstaerkste kraft vor den gruenen hervorgegangen am mittwochabend bot der spd vorstand der cdu koalitionsverhandlungen an henkel sagte das gespraech mit mueller und wowereit am donnerstag sei sehr angenehm und konstruktiv verlaufen es gibt ein klima der vertrauensvollen zusammenarbeit sagte er unter anderem haben man einen zeitplan fuer die koalitionsverhandlungen und die bildung von arbeitsgruppen vereinbart auf moegliche strittige punkte wollte henkel nicht eingehen er betonte lediglich +Wirtschaft de-DE url-pathpart-wirtschaft url-pathpart-news url-domainname-www.stern.de url-domainprefix-www url-domainprefix-www.stern url-domaintype-de url-domainsuffix-stern.de url-firstpartpagename-euro-treffen-in-bruessel-gipfel-erlaesst-griechenland-haelfte-der-schulden-1743959 url-pagepartsplitname-euro url-pagepartsplitname-treffen url-pagepartsplitname-in url-pagepartsplitname-bruessel url-pagepartsplitname-gipfel url-pagepartsplitname-erlaesst url-pagepartsplitname-griechenland url-pagepartsplitname-haelfte url-pagepartsplitname-der url-pagepartsplitname-schulden url-pagepartsplitname-1743959 url-lastpartpagename-html#utm_source=standard&utm_medium=rssfeed&utm_campaign=wirtschaft euro treffen in bruessel auf dem weg zum gipfel +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-pathpart-2011 url-pathpart-10 url-domainname-www.zeit.de url-domainprefix-www url-domainprefix-www.zeit url-domaintype-de url-domainsuffix-zeit.de url-firstpartpagename-trojaner-software-diskussion url-pagepartsplitname-trojaner url-pagepartsplitname-software url-pagepartsplitname-diskussion ueberwachungssoftware fuenf faelle aus bayern sind bisher bekannt das vorgehen war immer gleich die ermittler wollten skype gespraeche von verdaechtigen abhoeren sie setzten dafuer aber eine ueberwachungssoftware ein die deutlich mehr kann +Wirtschaft de-DE url-pathpart-finanzen url-pathpart-news url-pathpart-unternehmen url-domainname-www.focus.de url-domainprefix-www url-domainprefix-www.focus url-domaintype-de url-domainsuffix-focus.de url-firstpartpagename-finanzbranche-american-express-profitiert-vom-plastikgeld-boom_aid_676384 url-pagepartsplitname-finanzbranche url-pagepartsplitname-american url-pagepartsplitname-express url-pagepartsplitname-profitiert url-pagepartsplitname-vom url-pagepartsplitname-plastikgeld url-pagepartsplitname-boom url-pagepartsplitname-aid url-pagepartsplitname-676384 url-lastpartpagename-html finanzbranche american express profitiert vom plastikgeld boom die steigende beliebtheit der kreditkarte spuelt dem anbieter american express viel geld in die kasse im dritten quartal stieg der gewinn im vergleich zum vorjahr um 13 prozent auf mehr als eine milliarde dollar american express erzielte im dritten geschaeftsquartal einen gewinn von 1 2 milliarden dollar 873 millionen euro die nutzer haben in diesem quartal viel mit der kreditkarte gezahlt sagte firmenchef kenneth chenault am mittwochabend ortszeit in new york er sprach von einem rekordniveau zudem kam dem finanzkonzern zugute dass die nutzer ihre ausstehenden rechnungen zuverlaessiger bezahlen fuer ausfaelle musste american express noch 249 millionen dollar zuruecklegen nach 373 millionen dollar vor jahresfrist saeumige schuldner hatten sich waehrend der wirtschaftskrise zu einem riesenproblem fuer american express entwickelt anders als die wettbewerber visa und mastercard muss das unternehmen platzende rechnungen selbst verkraften bei den zwei rivalen liegt das risiko bei den partnern welche die karten ausgeben und kredit gewaehren das sind zumeist banken aber auch fluggesellschaften oder autoverleiher trotz der geschaeftszahlen die ueber den analystenerwartungen lagen fiel die aktie in den usa nachboerslich leicht unter den anlegern herrscht die sorge dass die zahlungsausfaelle mit fortschreiten der euro schuldenkrise wieder ansteigen koennten und sich die konsumenten mit einkaeufen wieder mehr zurueckhalten zuletzt waren die ertraege die einnahmen von american express um neun prozent auf 7 6 milliarden dollar gestiegen auch visa und mastercard hatten zuletzt ueber gute geschaefte berichtet ihre aktuellen zwischenbilanzen stehen noch aus alle drei anbieter stellen ihr geschaeft derzeit auf eine breitere basis american express hat fuer eine halbe milliarde euro das bonusprogramm payback uebernommen bei payback koennen verbraucher in teilnehmenden geschaeften und onlineshops punkte fuer jeden einkauf sammeln und diese dann in praemien eintauschen +Wirtschaft de-DE url-pathpart-print url-pathpart-wams url-pathpart-finanzen url-pathpart-article13675924 url-domainname-www.welt.de url-domainprefix-www url-domainprefix-www.welt url-domaintype-de url-domainsuffix-welt.de url-firstpartpagename-Wie-Frauen-wirklich-ticken url-pagepartsplitname-Wie url-pagepartsplitname-Frauen url-pagepartsplitname-wirklich url-pagepartsplitname-ticken url-lastpartpagename-html wie frauen wirklich ticken auch bei der geldanlage geht es zum betraechtlichen teil um psychologie die journalistin anja kuehner hat an einem finanzseminar fuer frauen teilgenommen und ihre beobachtungen in eine charakteristik weiblicher ratsuchender in sachen geldanlage umgesetzt muessen frauen sich bei der beratung zwischen mehreren produkten entscheiden verlaeuft dieser prozess eher schleifenartig sie sind in der lage neue erfahrungen in ihre ueberlegungen einzubauen und bereits getroffene entscheidungen auch wieder zu revidieren ganz anders die maenner +Deutschland de-DE url-pathpart-politik url-pathpart-deutschland url-pathpart-article2072382 url-domainname-www.abendblatt.de url-domainprefix-www url-domainprefix-www.abendblatt url-domaintype-de url-domainsuffix-abendblatt.de url-firstpartpagename-Klares-Ja-zum-Hebel-Merkel-erreicht-Kanzlermehrheit url-pagepartsplitname-Klares url-pagepartsplitname-Ja url-pagepartsplitname-zum url-pagepartsplitname-Hebel url-pagepartsplitname-Merkel url-pagepartsplitname-erreicht url-pagepartsplitname-Kanzlermehrheit url-lastpartpagename-html klares ja zum hebel merkel erreicht kanzlermehrheit 503 von 596 abgeordneten haben fuer den antrag von union fdp spd und gruenen zur ausweitung des euro rettungsschirms gestimmt berlin der bundestag hat sein einverstaendnis zu einer moeglichen ausweitung des euro rettungsschirms efsf gegeben die mehrheit der abgeordneten stimmte am mittwoch fuer einen gemeinsamen antrag von union fdp spd und gruenen der den hebel mechanismus grundsaetzlich freigibt das parlament gab kanzlerin angela merkel damit ein verhandlungsmandat fuer den eu gipfel am abend in bruessel merkel wertete die ausweitung der efsf kapazitaet in ihrer regierungserklaerung als alternativlos die opposition warf schwarz gelb einen chaotischen kurs in der euro politik vor fuer den fraktionsuebergreifenden antrag stimmten 503 von 596 anwesenden abgeordneten 89 parlamentarierer votierten dagegen vier enthielten sich regierungschefin angela merkel cdu hat sogar die kanzlermehrheit erreicht diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/ContractsCheckAnalyzer.cs b/tools-local/Microsoft.ML.CodeAnalyzer/ContractsCheckAnalyzer.cs new file mode 100644 index 0000000000..3ac1917e6f --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/ContractsCheckAnalyzer.cs @@ -0,0 +1,248 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.ML.CodeAnalyzer +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public sealed class ContractsCheckAnalyzer : DiagnosticAnalyzer + { + // Detecting that a syntax call is actually on a particular method is computationally + // intensive, so once we detect that we're on Contracts methods, we put all the methods + // here. + + private const string Category = "Contracts"; + + internal static class NameofDiagnostic + { + public const string Id = "MSML_ContractsNameUsesNameof"; + private const string Title = "Contracts argument for names is not a nameof"; + private const string Format = "Call to '{0}' should use nameof(...) for {1} argument, but instead used '{2}'"; + private const string Description = + "For Contracts.Checks or Excepts with some form of parameter name, unless that " + + "argument is a nameof(...) expression there's almost certainly something wrong."; + + internal static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + } + + internal static class ExceptionDiagnostic + { + public const string Id = "MSML_ContractsExceptAsExpression"; + private const string Title = "Contracts.Except used as expression"; + private const string Format = "Something should be done with the exception created by '{0}'"; + private const string Description = + "Contracts.Except and similar methods do not themselves throw, but provide an " + + "exception that can be thrown. This call did nothing with the exception."; + + internal static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + } + + internal static class SimpleMessageDiagnostic + { + public const string Id = "MSML_ContractsCheckMessageNotLiteralOrIdentifier"; + private const string Title = "Contracts.Check argument for message may involve formatting"; + private const string Format = "On call to '{0}' message '{1}' could not be identified as being either a string literal or variable"; + + internal static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, + description: Descriptions.ContractsCheckMessageNotLiteralOrIdentifier); + } + + internal static class DecodeMessageWithLoadContextDiagnostic + { + public const string Id = "MSML_NoMessagesForLoadContext"; + private const string Title = "Contracts.Check argument for message may involve formatting"; + private const string Format = "On call to '{0}' message '{1}' was provided, but this method had a ModelLoadContext"; + + internal static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, + description: Descriptions.NoMessagesForLoadContext); + } + + public override ImmutableArray SupportedDiagnostics => + ImmutableArray.Create( + NameofDiagnostic.Rule, ExceptionDiagnostic.Rule, SimpleMessageDiagnostic.Rule, + DecodeMessageWithLoadContextDiagnostic.Rule); + + private static HashSet _targetSet = new HashSet(new[] + { + "Check", "CheckUserArg", "CheckParam", "CheckParamValue", "CheckRef", "CheckValue", + "CheckNonEmpty", "CheckNonWhiteSpace", "CheckDecode", "CheckIO", "CheckAlive", "CheckValueOrNull", + "Except", "ExceptUserArg", "ExceptParam", "ExceptParamValue", "ExceptValue", "ExceptEmpty", + "ExceptWhiteSpace", "ExceptDecode", "ExceptIO", "ExceptNotImpl", "ExceptNotSupp", + }); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.InvocationExpression); + } + + /// + /// Returns an array parallel to that contains + /// the arguments in . If named parameters are used + /// then this is not necessarily the same. Note that in the event that there are + /// more arguments than parameters (e.g., via a params variable length + /// parameter) only the first match for the parameter is recorded. + /// + private static ArgumentSyntax[] ParallelArgs( + ImmutableArray parameters, + InvocationExpressionSyntax invocation) + { + ArgumentSyntax[] args = new ArgumentSyntax[parameters.Length]; + var syntaxArgs = invocation.ArgumentList.Arguments; + for (int i = 0; i < syntaxArgs.Count; ++i) + { + var arg = syntaxArgs[i]; + int index = -1; + if (arg.NameColon == null) + index = i; + else + { + string nameColonText = arg.NameColon.Name.ToString(); + for (int p = 0; p < parameters.Length; ++p) + { + if (parameters[p].Name == nameColonText) + { + index = p; + break; + } + } + } + if (0 <= index && index < args.Length && args[index] == null) + args[index] = arg; + } + return args; + } + + private static bool NameIsNameof(ExpressionSyntax exp) + { + var invokeExp = exp as InvocationExpressionSyntax; + return invokeExp != null && invokeExp.Expression.ToString() == "nameof"; + } + + private static bool IsGoodMessage(SyntaxNodeAnalysisContext context, ExpressionSyntax exp) + { + if (exp.IsKind(SyntaxKind.AddExpression)) + { + // These sorts of string concatenation things always wind up being compile + // time constants, from what I can tell from ildasm. + var binExp = (BinaryExpressionSyntax)exp; + return IsGoodMessage(context, binExp.Left) && IsGoodMessage(context, binExp.Right); + } + + if (exp.IsKind(SyntaxKind.SimpleMemberAccessExpression)) + { + var access = (MemberAccessExpressionSyntax)exp; + var field = context.SemanticModel.GetSymbolInfo(access).Symbol as IFieldSymbol; + return field?.IsConst ?? false; + } + + if (exp.IsKind(SyntaxKind.InvocationExpression)) + return ((InvocationExpressionSyntax)exp).Expression.ToString() == "nameof"; + + return exp.IsKind(SyntaxKind.StringLiteralExpression) || exp.IsKind(SyntaxKind.IdentifierName); + } + + private static bool HasModelLoadContext(SyntaxNode node) + { + while (node != null && !node.IsKind(SyntaxKind.MethodDeclaration) && !node.IsKind(SyntaxKind.ConstructorDeclaration)) + node = node.Parent; + if (node == null) + return false; + var enclosingParams = ((node as MethodDeclarationSyntax)?.ParameterList + ?? ((ConstructorDeclarationSyntax)node).ParameterList).Parameters; + foreach (var param in enclosingParams) + { + // It is possible that this may mislead us slightly, since there could be another + // unrelated type called ModelLoadContext, or someone could have type aliasing, or + // some other complicating factor that will defeat this simple check. With some + // additional computational load, we could access the semantic model for this. + if (param.Type.ToString() == "ModelLoadContext") + return true; + } + return false; + } + + private static void Analyze(SyntaxNodeAnalysisContext context) + { + var invocation = (InvocationExpressionSyntax)context.Node; + if (!(invocation.Expression is MemberAccessExpressionSyntax access)) + return; + var name = access.Name.ToString(); + // Do the quick checks first on the name. + bool isCheck = false; + bool isExcept = false; + if ((!(isCheck = name.StartsWith("Check")) && !(isExcept = name.StartsWith("Except"))) || !_targetSet.Contains(name)) + return; + // Now that we've verified we're approximately in the right neighborhood, do a more + // in depth semantic analysis to verify we're targetting the right sort of object. + var symbolInfo = context.SemanticModel.GetSymbolInfo(invocation); + if (!(symbolInfo.Symbol is IMethodSymbol methodSymbol)) + return; + var containingSymbolName = methodSymbol.ContainingSymbol.ToString(); + // The "internal" version is one used by some projects that want to benefit from Contracts, + // but for some reason cannot reference MLCore. + if (containingSymbolName != "Microsoft.ML.Runtime.Contracts" && + containingSymbolName != "Microsoft.ML.Runtime.Internal.Contracts") + { + return; + } + if (isExcept && invocation.Parent.IsKind(SyntaxKind.ExpressionStatement)) + { + context.ReportDiagnostic(Diagnostic.Create( + ExceptionDiagnostic.Rule, invocation.GetLocation(), name)); + } + + var parameters = methodSymbol.Parameters; + var args = ParallelArgs(parameters, invocation); + + for (int i = 0; i < parameters.Length; ++i) + { + if (args[i] == null) + continue; + var arg = args[i]; + var parameter = parameters[i]; + + switch (parameter.Name) + { + case "paramName": + case "name": + if (!NameIsNameof(arg.Expression)) + { + context.ReportDiagnostic(Diagnostic.Create( + NameofDiagnostic.Rule, arg.GetLocation(), name, parameter.Name, arg.Expression)); + } + break; + case "msg": + if (isCheck && !IsGoodMessage(context, arg.Expression)) + { + context.ReportDiagnostic(Diagnostic.Create( + SimpleMessageDiagnostic.Rule, arg.GetLocation(), name, arg.Expression)); + } + if ((name == "CheckDecode" || name == "ExceptDecode") && HasModelLoadContext(invocation)) + { + context.ReportDiagnostic(Diagnostic.Create( + DecodeMessageWithLoadContextDiagnostic.Rule, arg.GetLocation(), name, arg.Expression)); + } + break; + default: + break; + } + } + } + } +} diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/ContractsCheckNameofFixProvider.cs b/tools-local/Microsoft.ML.CodeAnalyzer/ContractsCheckNameofFixProvider.cs new file mode 100644 index 0000000000..d2f6a1a3ea --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/ContractsCheckNameofFixProvider.cs @@ -0,0 +1,187 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Microsoft.ML.CodeAnalyzer +{ + using Debug = System.Diagnostics.Debug; + + [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ContractsCheckNameofFixProvider)), Shared] + public sealed class ContractsCheckNameofFixProvider : CodeFixProvider + { + private const string Title = "Try to introduce nameof"; + /// + /// Id of the diagnostic, and equivalence id of the fix. + /// + private string Id => ContractsCheckAnalyzer.NameofDiagnostic.Id; + + public override ImmutableArray FixableDiagnosticIds => ImmutableArray.Create(Id); + + public override FixAllProvider GetFixAllProvider() + => WellKnownFixAllProviders.BatchFixer; + + public override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var diagnostic = context.Diagnostics.FirstOrDefault(d => d.Id == Id); + if (diagnostic == null) + return; + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); + + var diagnosticSpan = diagnostic.Location.SourceSpan; + + // Find the name/paramName argument identified by the diagnostic. + var nameArg = root.FindToken(diagnosticSpan.Start).Parent.FirstAncestorOrSelf(); + string nameArgValue = (nameArg.Expression as LiteralExpressionSyntax)?.Token.ValueText; + // If not a string literal, or not a valid identifier, there really is very little we can do. Suggest nothing. + if (nameArgValue == null || !SyntaxFacts.IsValidIdentifier(nameArgValue)) + return; + + Debug.Assert(nameArg.Parent.Parent.IsKind(SyntaxKind.InvocationExpression)); + var invokeExp = (InvocationExpressionSyntax)nameArg.Parent.Parent; + var member = invokeExp.Expression as MemberAccessExpressionSyntax; + var methodName = member.ToString(); // Something like CheckParam, ExceptUserArg... + + // Check whether this is a simple case, that is, this string has the same text as some token. + var argList = (ArgumentListSyntax)nameArg.Parent; + + // One of the most common checks are checks for value. Check whether this is the case. + // If it is, we don't even have to resort to extracting the semantic model. + argList.Arguments[0].Expression.GetText(); + if (nameArg.NameColon == null && argList.Arguments.Count >= 2 && + argList.Arguments[1] == nameArg && argList.Arguments[0].Expression.ToString() == nameArgValue) + { + context.RegisterCodeFix(CodeAction.Create(Title, + c => StringReplace(context.Document, nameArgValue, nameArg, c), Id), diagnostic); + return; + } + // Check all symbols used in the Check/Except argument. Let's see if there's a match. + // In the event of ambiguity, we choose the shortest one, figuring that the least complex + // might be the most likely. + int shortestSymbol = int.MaxValue; + ExpressionSyntax bestSymbol = null; + var sameNameNodes = argList.DescendantTokens().Where(tok => tok.Text == nameArgValue) + .Select(p => p.Parent).Where(n => n.IsKind(SyntaxKind.IdentifierName)); + foreach (var node in sameNameNodes) + { + SyntaxNode candidate = node; + var pk = node.Parent.Kind(); + if (pk == SyntaxKind.SimpleMemberAccessExpression) + { + var parentAccess = (MemberAccessExpressionSyntax)node.Parent; + candidate = parentAccess.Expression == node ? node : parentAccess; + } + else if (pk == SyntaxKind.QualifiedName) + { + // A little weird, but if you have class Z nested in Y, nested in X, then typeof(X.Y.Z) will + // be a series of qualified names, but nameof(X.Y.Z) will be a series of simple member accesses. + // nameof(X.Y.Z) if phrased as qualified names will not work. + candidate = SyntaxFactory.ParseExpression(node.Parent.ToString()); + } + + if (candidate.Span.Length < shortestSymbol) + { + bestSymbol = (ExpressionSyntax)candidate; + shortestSymbol = candidate.Span.Length; + } + } + + if (bestSymbol != null) + { + context.RegisterCodeFix(CodeAction.Create(Title, + c => ExpressionReplace(context.Document, bestSymbol, nameArg, c), Id), diagnostic); + return; + } + + // No luck within the check statement itself. Next check the parameter list of this method or constructor. + SyntaxNode temp = nameArg; + while (temp != null && !temp.IsKind(SyntaxKind.MethodDeclaration) && !temp.IsKind(SyntaxKind.ConstructorDeclaration)) + temp = temp.Parent; + + ParameterSyntax argParam = null; + if (temp != null) + { + var paramList = (temp as MethodDeclarationSyntax)?.ParameterList + ?? ((ConstructorDeclarationSyntax)temp).ParameterList; + foreach (var param in paramList.Parameters) + { + if (param.Identifier.ToString() == nameArgValue) + { + context.RegisterCodeFix(CodeAction.Create(Title, + c => StringReplace(context.Document, nameArgValue, nameArg, c), Id), diagnostic); + return; + } + // A hack, but whatever works. + string paramTypeString = param.Type.ToString(); + if (argParam == null && (paramTypeString == "Arguments" || paramTypeString == "Column")) + argParam = param; + } + } + // All else has failed. The last is to try to get information from any Arguments object, if present. + if (argParam != null) + { + var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken); + var type = semanticModel.GetTypeInfo(argParam.Type, context.CancellationToken).Type; + var argName = argParam.Identifier.ToString(); + if (type != null && !(type is IErrorTypeSymbol)) + { + //var m = type.GetMembers().Cast; + foreach (IFieldSymbol s in type.GetMembers().Where(p => p.Kind == SymbolKind.Field)) + { + if (!s.CanBeReferencedByName) + continue; + AttributeData attr = s.GetAttributes().FirstOrDefault(a => a.AttributeClass.Name == "ArgumentAttribute"); + if (attr == null) + continue; + if (s.Name == nameArgValue) + { + context.RegisterCodeFix(CodeAction.Create(Title, + c => StringReplace(context.Document, argName + "." + s.Name, nameArg, c), Id), diagnostic); + return; + } + var shortPair = attr.NamedArguments.FirstOrDefault(p => p.Key == "ShortName"); + var shortName = shortPair.Value.Value as string; + if (shortName == null) + continue; + if (shortName.Split(',').Contains(nameArgValue)) + { + context.RegisterCodeFix(CodeAction.Create(Title, + c => StringReplace(context.Document, argName + "." + s.Name, nameArg, c), Id), diagnostic); + return; + } + } + } + } + } + + private async Task StringReplace(Document document, string name, ArgumentSyntax nameArg, CancellationToken cancellationToken) + { + var nameofExp = SyntaxFactory.ParseExpression($"nameof({name})").WithTriviaFrom(nameArg); + var tree = await document.GetSyntaxTreeAsync(cancellationToken); + var root = await tree.GetRootAsync(cancellationToken); + var newRoot = root.ReplaceNode(nameArg.Expression, nameofExp); + return document.WithSyntaxRoot(newRoot); + } + + private async Task ExpressionReplace(Document document, SyntaxNode exp, ArgumentSyntax nameArg, CancellationToken cancellationToken) + { + var nameofExp = (InvocationExpressionSyntax)SyntaxFactory.ParseExpression($"nameof(a)").WithTriviaFrom(nameArg); + var newNameofExp = nameofExp.ReplaceNode(nameofExp.ArgumentList.Arguments[0].Expression, exp.WithoutTrivia()); + + var tree = await document.GetSyntaxTreeAsync(cancellationToken); + var root = await tree.GetRootAsync(cancellationToken); + var newRoot = root.ReplaceNode(nameArg.Expression, newNameofExp); + return document.WithSyntaxRoot(newRoot); + } + } +} diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/Descriptions.Designer.cs b/tools-local/Microsoft.ML.CodeAnalyzer/Descriptions.Designer.cs new file mode 100644 index 0000000000..730cfe6289 --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/Descriptions.Designer.cs @@ -0,0 +1,91 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.ML.CodeAnalyzer { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Descriptions { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Descriptions() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.ML.CodeAnalyzer.Descriptions", typeof(Descriptions).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Since C# has no concept of lazy evaluation of parameters, we prefer Contracts.Check's message arguments to not involve string formatting, or other complex operations, since such operations will happen always, whether the check fails or not. If you want to have detailed messages that's great, but use Contracts.Except instead. That is instead of something like 'Check(c, msg)', prefer 'if (!c) throw Except(msg)'.. + /// + internal static string ContractsCheckMessageNotLiteralOrIdentifier { + get { + return ResourceManager.GetString("ContractsCheckMessageNotLiteralOrIdentifier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All instance fields or properties should be initialized in a constructor, not in the field. C# allows yone to specify initializers on instance members in either the constructor, or just on the field itself. However, taking advantage of that capability means that to comprehend the post-constructor state of an object a reader will have to read at least two places. To help keep code more comprehensible we disallow using field initializers, and insist that everything be in the constructor. Obviously this does n [rest of string was truncated]";. + /// + internal static string InstanceInitializerInConstructor { + get { + return ResourceManager.GetString("InstanceInitializerInConstructor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CheckDecode and ExceptDecode are used to report badly formatted data. If a message is provided then users expect that to be something actionable. So: if it is data the user themselves formatted or provided, then messages here are really useful. However, if in the context of a ModelLoadContext, this is practically always data Microsoft.ML formatted itself, and users inevitably find the specifics here confusing because they suppose these details are something they can do something about. So: generally, we sho [rest of string was truncated]";. + /// + internal static string NoMessagesForLoadContext { + get { + return ResourceManager.GetString("NoMessagesForLoadContext", resourceCulture); + } + } + } +} diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/Descriptions.resx b/tools-local/Microsoft.ML.CodeAnalyzer/Descriptions.resx new file mode 100644 index 0000000000..5b616ee82a --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/Descriptions.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Since C# has no concept of lazy evaluation of parameters, we prefer Contracts.Check's message arguments to not involve string formatting, or other complex operations, since such operations will happen always, whether the check fails or not. If you want to have detailed messages that's great, but use Contracts.Except instead. That is instead of something like 'Check(c, msg)', prefer 'if (!c) throw Except(msg)'. + + + All instance fields or properties should be initialized in a constructor, not in the field. C# allows yone to specify initializers on instance members in either the constructor, or just on the field itself. However, taking advantage of that capability means that to comprehend the post-constructor state of an object a reader will have to read at least two places. To help keep code more comprehensible we disallow using field initializers, and insist that everything be in the constructor. Obviously this does not apply to `const` or `static` members. + + + CheckDecode and ExceptDecode are used to report badly formatted data. If a message is provided then users expect that to be something actionable. So: if it is data the user themselves formatted or provided, then messages here are really useful. However, if in the context of a ModelLoadContext, this is practically always data Microsoft.ML formatted itself, and users inevitably find the specifics here confusing because they suppose these details are something they can do something about. So: generally, we should refrain from specific messages, in this context. + + \ No newline at end of file diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/InstanceInitializerAnalyzer.cs b/tools-local/Microsoft.ML.CodeAnalyzer/InstanceInitializerAnalyzer.cs new file mode 100644 index 0000000000..f15d2c192e --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/InstanceInitializerAnalyzer.cs @@ -0,0 +1,77 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using System.Linq; +using System.Reflection; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.ML.CodeAnalyzer +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public sealed class InstanceInitializerAnalyzer : DiagnosticAnalyzer + { + private const string Category = "Declaration"; + internal const string DiagnosticId = "MSML_NoInstanceInitializers"; + + private const string Title = "No initializers on instance fields or properties"; + private const string Format = "Member {0} has a {1} initialier outside the constructor"; + + private static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(DiagnosticId, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, + description: Descriptions.InstanceInitializerInConstructor); + + public override ImmutableArray SupportedDiagnostics => + ImmutableArray.Create(Rule); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.RegisterSymbolAction(AnalyzeField, SymbolKind.Field); + context.RegisterSymbolAction(AnalyzeProperty, SymbolKind.Property); + } + + private static void AnalyzeField(SymbolAnalysisContext context) + { + var symbol = (IFieldSymbol)context.Symbol; + // Constant or static field initializers are desirable. If implicitly + // declared, then we can't very well ask the developer to fix. + if (symbol.IsConst || symbol.IsStatic || symbol.IsImplicitlyDeclared) + return; + // Exempt argument attributes from the test. Note that because we cannot + // depend on the Microsoft.ML source itself, we have to identify this class by name. + if (symbol.GetAttributes().Any(i => i.AttributeClass.Name == "ArgumentAttribute")) + return; + + var typeInfo = symbol.GetType().GetTypeInfo(); + var hasInitProp = typeInfo.GetDeclaredProperty("HasInitializer"); + if (hasInitProp?.PropertyType != typeof(bool)) + return; + bool hasInit = (bool)hasInitProp.GetValue(symbol); + if (!hasInit) + return; + var diagnostic = Diagnostic.Create(Rule, symbol.Locations[0], symbol.Name, "field"); + context.ReportDiagnostic(diagnostic); + } + + private static void AnalyzeProperty(SymbolAnalysisContext context) + { + var symbol = (IPropertySymbol)context.Symbol; + if (symbol.IsAbstract || symbol.IsImplicitlyDeclared || symbol.IsStatic) + return; + var syntaxRefs = symbol.DeclaringSyntaxReferences; + if (syntaxRefs.IsEmpty) + return; + var syntax = syntaxRefs[0].GetSyntax(); + if (!syntax.ChildNodes().Any(s => s.IsKind(SyntaxKind.EqualsValueClause))) + return; + + var diagnostic = Diagnostic.Create(Rule, symbol.Locations[0], symbol.Name, "property"); + context.ReportDiagnostic(diagnostic); + } + } +} diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/Microsoft.ML.CodeAnalyzer.csproj b/tools-local/Microsoft.ML.CodeAnalyzer/Microsoft.ML.CodeAnalyzer.csproj new file mode 100644 index 0000000000..46f8e8df15 --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/Microsoft.ML.CodeAnalyzer.csproj @@ -0,0 +1,28 @@ + + + + netstandard1.3 + + + + + + + + + + + True + True + Descriptions.resx + + + + + + ResXFileCodeGenerator + Descriptions.Designer.cs + + + + diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/NameAnalyzer.cs b/tools-local/Microsoft.ML.CodeAnalyzer/NameAnalyzer.cs new file mode 100644 index 0000000000..6e7c77100c --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/NameAnalyzer.cs @@ -0,0 +1,176 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Immutable; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.ML.CodeAnalyzer +{ + internal enum NameType + { + UnderScoreCamelCased, // E.g., _myPrivateField + CamelCased, // E.g., myAwesomeParameter + PascalCased, // E.g., AwesomeClass + IPascalCased, // E.g., IEnumerableStuff + TPascalCased, // E.g., TDictArg + } + + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public sealed class NameAnalyzer : DiagnosticAnalyzer + { + internal const string Category = "Naming"; + + internal const string NameProperty = "Original"; + internal const string DesiredNameProperty = "Desired"; + + internal static Diagnostic CreateDiagnostic(DiagnosticDescriptor rule, SyntaxToken identifier, NameType desired, params object[] args) + { + string text = identifier.Text; + var props = ImmutableDictionary.Empty + .Add(NameProperty, text).Add(DesiredNameProperty, desired.ToString()); + if (args == null || args.Length == 0) + return Diagnostic.Create(rule, identifier.GetLocation(), props, text); + var newArgs = new object[args.Length + 1]; + Array.Copy(args, 0, newArgs, 1, args.Length); + newArgs[0] = text; + return Diagnostic.Create(rule, identifier.GetLocation(), props, newArgs); + } + + internal static class PrivateFieldName + { + public const string Id = "MSML_PrivateFieldName"; + private const string Title = "Private field name not _camelCased"; + private const string Format = "Private field name '{0}' not _camelCased"; + private const string Description = + "Private fields should have an _ prefix and be _lowerCamelCased, unless they are const."; + + internal static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + } + + internal static class GeneralName + { + public const string Id = "MSML_GeneralName"; + private const string Title = "This name should be PascalCased"; + private const string Format = "Identifier '{0}' not PascalCased"; + private const string Description = + "Identifier names other than parameters, local variables, private non-const fields, interfaces, and type parameters should be PascalCased."; + + internal static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + } + + public override ImmutableArray SupportedDiagnostics => + ImmutableArray.Create(PrivateFieldName.Rule, GeneralName.Rule); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.RegisterSyntaxNodeAction(AnalyzeField, SyntaxKind.FieldDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeField, SyntaxKind.EventFieldDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeClass, SyntaxKind.ClassDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeEnum, SyntaxKind.EnumDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeEnumMember, SyntaxKind.EnumMemberDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeEvent, SyntaxKind.EventDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeMethod, SyntaxKind.MethodDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeNamespace, SyntaxKind.NamespaceDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeProperty, SyntaxKind.PropertyDeclaration); + context.RegisterSyntaxNodeAction(AnalyzeStruct, SyntaxKind.StructDeclaration); + } + + private static void AnalyzeClass(SyntaxNodeAnalysisContext context) + => CheckPascal(((ClassDeclarationSyntax)context.Node).Identifier, context); + + private static void AnalyzeEnum(SyntaxNodeAnalysisContext context) + => CheckPascal(((EnumDeclarationSyntax)context.Node).Identifier, context); + + private static void AnalyzeEnumMember(SyntaxNodeAnalysisContext context) + => CheckPascal(((EnumMemberDeclarationSyntax)context.Node).Identifier, context); + + private static void AnalyzeEvent(SyntaxNodeAnalysisContext context) + => CheckPascal(((EventDeclarationSyntax)context.Node).Identifier, context); + + private static void AnalyzeMethod(SyntaxNodeAnalysisContext context) + { + var node = (MethodDeclarationSyntax)context.Node; + if (ModifierContainsExtern(node.Modifiers)) + return; + CheckPascal(node.Identifier, context); + } + + private static void AnalyzeNamespace(SyntaxNodeAnalysisContext context) + { + var node = ((NamespaceDeclarationSyntax)context.Node); + var name = node.Name; + // This is annoying. I can't figure out how to do this. When I get a namespace, + // this seems to trigger for *every* part of a namespace name, not just once for one. + //foreach (var id in name.DescendantTokens().Where(tok => tok.IsKind(SyntaxKind.IdentifierToken))) + // CheckPascal(id, context); + } + + private static void AnalyzeProperty(SyntaxNodeAnalysisContext context) + => CheckPascal(((PropertyDeclarationSyntax)context.Node).Identifier, context); + + private static void AnalyzeStruct(SyntaxNodeAnalysisContext context) + { + CheckPascal(((StructDeclarationSyntax)context.Node).Identifier, context); + } + + private static bool ModifierContainsExtern(SyntaxTokenList modifiers) + { + return modifiers.Any(token => token.IsKind(SyntaxKind.ExternKeyword)); + } + + private static void CheckPascal(SyntaxToken token, SyntaxNodeAnalysisContext context) + { + if (!Utils.NameIsGood(token.Text, 0, true)) + context.ReportDiagnostic(CreateDiagnostic(GeneralName.Rule, token, NameType.PascalCased)); + } + + private static bool CheckUnderscore(string name) + => !string.IsNullOrEmpty(name) && name.StartsWith("_", StringComparison.OrdinalIgnoreCase) && Utils.NameIsGood(name, 1, false); + + private static void AnalyzeField(SyntaxNodeAnalysisContext context) + { + var node = (BaseFieldDeclarationSyntax)context.Node; + + bool isConst = false; + bool isPrivate = true; // Fields are private by default. + foreach (var mod in node.Modifiers) + { + if (mod.IsKind(SyntaxKind.ConstKeyword)) + isConst = true; + else if (mod.IsKind(SyntaxKind.PublicKeyword) || mod.IsKind(SyntaxKind.ProtectedKeyword) || mod.IsKind(SyntaxKind.InternalKeyword)) + isPrivate = false; + } + foreach (var variable in node.Declaration.Variables) + { + var identifier = variable.Identifier; + var name = identifier.Text; + if (!isPrivate) + { + CheckPascal(identifier, context); + continue; + } + + // Private consts are a little bit funny. Sometimes it makes sense to have them + // be _camelCased, but often it's good to have them be PascalCased. We have decided + // that going forward they will be standardized as PascalCased, but *at the moment* + // we do not diagnose it as an error if they are _camelCased. At some point we will. + if (CheckUnderscore(name) || (isConst && Utils.NameIsGood(name, 0, true))) + continue; + var diagnostic = Diagnostic.Create(PrivateFieldName.Rule, identifier.GetLocation(), name); + context.ReportDiagnostic(CreateDiagnostic(PrivateFieldName.Rule, identifier, + isConst ? NameType.PascalCased : NameType.UnderScoreCamelCased)); + } + } + } +} diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/NameFixProvider.cs b/tools-local/Microsoft.ML.CodeAnalyzer/NameFixProvider.cs new file mode 100644 index 0000000000..22ff9c383e --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/NameFixProvider.cs @@ -0,0 +1,183 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Rename; + +namespace Microsoft.ML.CodeAnalyzer +{ + // This is somewhat difficult. The trouble is, if a name is in a bad state, it is + // actually rather difficult to come up with a general procedure to "fix" it. We + // instead focus on the common case where a name is right according to *some* sort + // of regular scheme, and focus on that. + + using Debug = System.Diagnostics.Debug; + + [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(NameFixProvider)), Shared] + public sealed class NameFixProvider : CodeFixProvider + { + private const string PrivateTitle = "Fix name"; + + private static ImmutableArray _fixable = ImmutableArray.Create( + NameAnalyzer.PrivateFieldName.Id, NameAnalyzer.GeneralName.Id, + ParameterVariableNameAnalyzer.Id, TypeParamNameAnalyzer.Id); + private static ImmutableHashSet _fixableSet = ImmutableHashSet.Empty.Union(_fixable); + + private static Regex _sections = new Regex( + @"(?:\p{Nd}\p{Ll}*)|" + // Numbers we consider a separate token. + @"(?:\p{Lu}+(?!\p{Ll}))|" + // Completely upper case sections. + @"(?:\p{Lu}\p{Ll}+)|" + // Title cased word. + @"(?:\p{Ll}+)"); // Lower case word. + + public override ImmutableArray FixableDiagnosticIds => _fixable; + + public override FixAllProvider GetFixAllProvider() + => WellKnownFixAllProviders.BatchFixer; + + public override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var diagnostic = context.Diagnostics.FirstOrDefault(d => _fixableSet.Contains(d.Id)); + if (diagnostic == null) + return; + + string originalName = diagnostic.Properties[NameAnalyzer.NameProperty]; + string desiredNameStr = diagnostic.Properties[NameAnalyzer.DesiredNameProperty]; + NameType desiredName; + if (!Enum.TryParse(desiredNameStr, out desiredName)) + return; + + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken); + var token = root.FindToken(diagnostic.Location.SourceSpan.Start); + if (token.Text != originalName) + return; + + string docName = context.Document.Name; + if (docName.Length - 3 == originalName.Length && docName.EndsWith(".cs", StringComparison.OrdinalIgnoreCase) + && context.Document.Name.StartsWith(originalName, StringComparison.OrdinalIgnoreCase)) + { + // So this is an entity like "FooBarBiz" in a file named "FooBarBiz.cs". + // We can continue to warn on these, but registering a *fix* for them would + // be inappropriate, since while the Roslyn API allows us to rename items like, + // these, we cannot change the file name. + return; + } + + Func renamer = null; + switch (desiredName) + { + case NameType.UnderScoreCamelCased: + renamer = RenameUnderscore; + break; + case NameType.CamelCased: + renamer = RenameCamelCase; + break; + case NameType.PascalCased: + renamer = RenamePascal; + break; + case NameType.IPascalCased: + renamer = RenameInterface; + break; + case NameType.TPascalCased: + renamer = RenameTypeParam; + break; + default: + Debug.Assert(!Enum.IsDefined(typeof(NameType), desiredName)); + break; + } + + context.RegisterCodeFix(CodeAction.Create(PrivateTitle, + c => RenameAsync(context.Document, token.Parent, originalName, renamer, c), diagnostic.Id), diagnostic); + } + + private async Task RenameAsync(Document document, + SyntaxNode identifier, string name, Func renamer, CancellationToken cancellationToken) + { + // Get the symbol representing the type to be renamed. + var semanticModel = await document.GetSemanticModelAsync(cancellationToken); + ISymbol typeSymbol = semanticModel.GetDeclaredSymbol(identifier, cancellationToken); + + string newName = renamer(name); + + // Produce a new solution that has all references to that type renamed, including the declaration. + var originalSolution = document.Project.Solution; + var optionSet = originalSolution.Workspace.Options; + var newSolution = await Renamer.RenameSymbolAsync(document.Project.Solution, typeSymbol, newName, optionSet, cancellationToken).ConfigureAwait(false); + + // Return the new solution with the now-uppercase type name. + return newSolution; + } + + private IEnumerable ExtractSections(string name) + { + foreach (Match match in _sections.Matches(name)) + yield return match.Value; + } + + private string RenameUnderscore(string name) => RenameCamelCore(name, "_"); + private string RenameCamelCase(string name) => RenameCamelCore(name, ""); + private string RenameTypeParam(string name) => RenamePascalPrefixCore(name, "T"); + private string RenameInterface(string name) => RenamePascalPrefixCore(name, "I"); + private string RenamePascal(string name) => RenamePascalPrefixCore(name, ""); + + private string RenameCamelCore(string name, string prefix) + { + if (string.IsNullOrEmpty(name)) + return prefix; + StringBuilder sb = new StringBuilder(prefix); + foreach (var section in ExtractSections(name)) + { + if (sb.Length == prefix.Length) + sb.Append(section.ToLowerInvariant()); + else + AppendTitleCase(sb, section); + } + return sb.ToString(); + } + + private string RenamePascalPrefixCore(string name, string prefix) + { + if (string.IsNullOrEmpty(name)) + return prefix; + StringBuilder sb = new StringBuilder(prefix); + bool first = true; + foreach (var section in ExtractSections(name)) + { + if (first) + { + first = false; + if (prefix == section) + continue; + } + AppendTitleCase(sb, section); + } + return sb.ToString(); + } + + private void AppendTitleCase(StringBuilder builder, string token) + { + if (string.IsNullOrEmpty(token)) + return; + if (token.Length == 2 && char.IsUpper(token[0]) && char.IsUpper(token[1])) + { + builder.Append(token); + return; + } + // Further special casing for things like: IO, UI? + builder.Append(char.ToUpperInvariant(token[0])); + builder.Append(token.Substring(1).ToLowerInvariant()); + } + } +} diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/ParameterVariableNameAnalyzer.cs b/tools-local/Microsoft.ML.CodeAnalyzer/ParameterVariableNameAnalyzer.cs new file mode 100644 index 0000000000..7496609778 --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/ParameterVariableNameAnalyzer.cs @@ -0,0 +1,60 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.ML.CodeAnalyzer +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public sealed class ParameterVariableNameAnalyzer : DiagnosticAnalyzer + { + private const string Category = "Naming"; + + internal const string Id = "MSML_ParameterLocalVarName"; + private const string Title = "Parameter or local variable name not standard"; + private const string Format = "{1} name '{0}' not standard"; + private const string Description = + "Parameter and local variable names should be lowerCamelCased."; + + private static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + + public override ImmutableArray SupportedDiagnostics => + ImmutableArray.Create(Rule); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.RegisterSyntaxNodeAction(AnalyzeParameter, SyntaxKind.Parameter); + context.RegisterSyntaxNodeAction(AnalyzeLocal, SyntaxKind.LocalDeclarationStatement); + } + + private static void AnalyzeParameter(SyntaxNodeAnalysisContext context) + { + var node = (ParameterSyntax)context.Node; + AnalyzeCore(context, node.Identifier, "parameter"); + } + + private static void AnalyzeLocal(SyntaxNodeAnalysisContext context) + { + var node = (LocalDeclarationStatementSyntax)context.Node; + foreach (var dec in node.DescendantNodesAndSelf().Where(s => s.IsKind(SyntaxKind.VariableDeclarator))) + AnalyzeCore(context, ((VariableDeclaratorSyntax)dec).Identifier, "local variable"); + } + + private static void AnalyzeCore(SyntaxNodeAnalysisContext context, SyntaxToken identifier, string type) + { + var name = identifier.Text; + if (name == null || Utils.NameIsGood(name, 0, false)) + return; + context.ReportDiagnostic(NameAnalyzer.CreateDiagnostic(Rule, identifier, NameType.CamelCased, type)); + } + } +} \ No newline at end of file diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/SingleVariableDeclarationAnalyzer.cs b/tools-local/Microsoft.ML.CodeAnalyzer/SingleVariableDeclarationAnalyzer.cs new file mode 100644 index 0000000000..eceb2b3f0d --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/SingleVariableDeclarationAnalyzer.cs @@ -0,0 +1,49 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.ML.CodeAnalyzer +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public sealed class SingleVariableDeclarationAnalyzer : DiagnosticAnalyzer + { + private const string Category = "Declaration"; + internal const string DiagnosticId = "MSML_SingleVariableDeclaration"; + + private const string Title = "Have only a single variable present per declaration"; + private const string Format = "Variables '{0}' were all part of a single declaration, and should be broken up"; + private const string Description = + "We prefer to have one variable per declaration."; + + private static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(DiagnosticId, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + + public override ImmutableArray SupportedDiagnostics => + ImmutableArray.Create(Rule); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.VariableDeclaration); + } + + private static void Analyze(SyntaxNodeAnalysisContext context) + { + var node = (VariableDeclarationSyntax)context.Node; + var vars = node.Variables; + if (vars.Count <= 1 || node.Parent.IsKind(SyntaxKind.ForStatement)) + return; + string jointVariableNames = string.Join("', '", vars.Select(v => v.Identifier.Text)); + var diagnostic = Diagnostic.Create(Rule, context.Node.GetLocation(), jointVariableNames); + context.ReportDiagnostic(diagnostic); + } + } +} \ No newline at end of file diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/TypeParamNameAnalyzer.cs b/tools-local/Microsoft.ML.CodeAnalyzer/TypeParamNameAnalyzer.cs new file mode 100644 index 0000000000..973c9a7b0b --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/TypeParamNameAnalyzer.cs @@ -0,0 +1,47 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.ML.CodeAnalyzer +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public sealed class TypeParamNameAnalyzer : DiagnosticAnalyzer + { + private const string Category = "Naming"; + + internal const string Id = "MSML_TypeParamName"; + private const string Title = "Type parameter name not standard"; + private const string Format = "Type parameter name '{0}' not standard"; + private const string Description = + "Type parameter names should start with 'T' and the remainder PascalCased."; + + private static DiagnosticDescriptor Rule = + new DiagnosticDescriptor(Id, Title, Format, Category, + DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + + public override ImmutableArray SupportedDiagnostics => + ImmutableArray.Create(Rule); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.TypeParameter); + } + + private static void Analyze(SyntaxNodeAnalysisContext context) + { + var node = (TypeParameterSyntax)context.Node; + var identifier = node.Identifier; + var name = identifier.Text; + if (name == null || (name.StartsWith("T") && Utils.NameIsGood(name, 1, true))) + return; + context.ReportDiagnostic(NameAnalyzer.CreateDiagnostic(Rule, identifier, NameType.TPascalCased)); + } + } +} \ No newline at end of file diff --git a/tools-local/Microsoft.ML.CodeAnalyzer/Utils.cs b/tools-local/Microsoft.ML.CodeAnalyzer/Utils.cs new file mode 100644 index 0000000000..0bc941906f --- /dev/null +++ b/tools-local/Microsoft.ML.CodeAnalyzer/Utils.cs @@ -0,0 +1,58 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace Microsoft.ML.CodeAnalyzer +{ + internal static class Utils + { + /// + /// Checks whether a name is properly camelCased or PascalCased. + /// Also disallows things like HTMLStream while preferring IOStream. + /// + /// The symbol name to analyze + /// The position in the name to start + /// Whether it should be PascalCased + /// Whether this name is good + public static bool NameIsGood(string name, int min, bool upper) + { + // C# naming guidelines say, any initialism greater than two characters should not + // be all upper cased. So: _readIOStream is good, and _readHttpStream is good. You + // could imagine having two two-letter initialisms, like: _readIOUI, where you use + // two two character initialism, but I'm going to suppose that never happens since + // if someone is doing that, that's pretty odd. The upshot is: + const int maxConsecutive = 3; + // Force the first after the _ to be lower case. + int consecutive = upper ? 0 : maxConsecutive; + // Specific to numbers. You could imagine counterexamples, like, say, d3js. Should + // we be even more strict, and say that the numbers should only appear potentially + // in suffixes? + for (int i = min; i < name.Length; ++i) + { + char c = name[i]; + // Only letters and digits. + if (!char.IsLetterOrDigit(c)) + return false; + if (char.IsDigit(c)) + { + // Consider digits as being effectively upper case letters, where they appear. + upper = false; + consecutive = 0; + continue; + } + if (char.IsUpper(c)) + { + upper = false; + if (++consecutive > maxConsecutive) + return false; + continue; + } + if (upper) + return false; + consecutive = 0; + } + // Don't allow maxConsecutive on the end. So: IOStream is fine, but IOS is not. + return consecutive < maxConsecutive; + } + } +}